(undefined);
-function reduceDisplay(display: string) {
- const words = display.split(" ");
- if (words.length === 1) {
- return display.slice(0, 2).toUpperCase();
- } else {
- return words[0].charAt(0).toUpperCase() + words[1].charAt(0).toUpperCase();
- }
+async function requestNotificationPermission() {
+ if (!("Notification" in window)) return false;
+
+ if (Notification.permission === "granted") return true;
+
+ const permission = await Notification.requestPermission();
+ return permission === "granted";
}
export default function Provider(props: { children: React.ReactNode }) {
@@ -29,6 +30,7 @@ export default function Provider(props: { children: React.ReactNode }) {
const { decryptText, getSharedSecret } = useCrypto();
const { addLiveMessage, userId } = useChat();
const { moveUserIdToTop } = useSession();
+ const navigate = useNavigate();
useEffect(() => {
return subscribePush(async (ttpMessage) => {
@@ -54,7 +56,7 @@ export default function Provider(props: { children: React.ReactNode }) {
(await load("settings.read_confirmations")) &&
userId === sender_id
) {
- await send(
+ void send(
"message_state",
{
message_state: "read",
@@ -64,7 +66,7 @@ export default function Provider(props: { children: React.ReactNode }) {
},
);
} else {
- await send(
+ void send(
"message_state",
{
message_state: "received",
@@ -92,18 +94,41 @@ export default function Provider(props: { children: React.ReactNode }) {
if (isTauri()) {
console.log("weewoo");
} else {
- sonnerToast(user.display, {
- classNames: {
- content: "pl-4",
- },
- description: decryptedContent,
- icon: (
-
-
- {reduceDisplay(user.display)}
-
- ),
- });
+ const hasPermissions = await requestNotificationPermission();
+
+ if (hasPermissions) {
+ const notification = new Notification(user.display, {
+ body: decryptedContent,
+ icon: user.avatar || user.display.slice(0, 2).toUpperCase(),
+ badge: user.avatar || user.display.slice(0, 2).toUpperCase(),
+ tag: `message-${user.user_id}`,
+ silent: true,
+ });
+
+ notification.onclick = () => {
+ window.focus();
+ navigate({
+ to: `/chat?id=${user.user_id}`,
+ });
+
+ notification.close();
+ };
+ } else {
+ sonnerToast(user.display, {
+ classNames: {
+ content: "pl-4",
+ },
+ description: decryptedContent,
+ icon: (
+
+
+
+ {user.display.slice(0, 2).toUpperCase()}
+
+
+ ),
+ });
+ }
}
}
});
@@ -117,6 +142,7 @@ export default function Provider(props: { children: React.ReactNode }) {
userId,
moveUserIdToTop,
send,
+ navigate,
]);
return (
diff --git a/packages/ttp/src/context.tsx b/packages/ttp/src/context.tsx
index 2f8fc40..d33313d 100644
--- a/packages/ttp/src/context.tsx
+++ b/packages/ttp/src/context.tsx
@@ -257,7 +257,7 @@ export function Provider(props: {
setErrorDescription(
"You could try to restart your Iota, check for updates or check your network connection.",
);
- })
+ });
}, [connected, subscribePush]);
useEffect(() => {