Skip to content

Commit

Permalink
fix notification crash for ios
Browse files Browse the repository at this point in the history
  • Loading branch information
ajbura committed Feb 10, 2025
1 parent 56b7541 commit d2cf1e1
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 14 deletions.
12 changes: 5 additions & 7 deletions src/app/features/settings/notifications/Notifications.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,14 @@ import { SequenceCardStyle } from '../styles.css';
import { SettingTile } from '../../../components/setting-tile';
import { useSetting } from '../../../state/hooks/settings';
import { settingsAtom } from '../../../state/settings';
import { usePermissionState } from '../../../hooks/usePermission';
import { getNotificationState, usePermissionState } from '../../../hooks/usePermission';
import { AllMessagesNotifications } from './AllMessages';
import { SpecialMessagesNotifications } from './SpecialMessages';
import { KeywordMessagesNotifications } from './KeywordMessages';
import { IgnoredUserList } from './IgnoredUserList';

function SystemNotification() {
const notifPermission = usePermissionState(
'notifications',
window.Notification.permission === 'default' ? 'prompt' : window.Notification.permission
);
const notifPermission = usePermissionState('notifications', getNotificationState());
const [showNotifications, setShowNotifications] = useSetting(settingsAtom, 'showNotifications');
const [isNotificationSounds, setIsNotificationSounds] = useSetting(
settingsAtom,
Expand All @@ -41,8 +38,9 @@ function SystemNotification() {
description={
notifPermission === 'denied' ? (
<Text as="span" style={{ color: color.Critical.Main }} size="T200">
Notification permission is blocked. Please allow notification permission from
browser address bar.
{!Notification
? 'Notifications are not supported by the system.'
: 'Notification permission is blocked. Please allow notification permission from browser address bar.'}
</Text>
) : (
<span>Show desktop notifications when message arrive.</span>
Expand Down
20 changes: 16 additions & 4 deletions src/app/hooks/usePermission.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,16 @@
import { useEffect, useState } from "react";
import { useEffect, useState } from 'react';

export const getNotificationState = (): PermissionState => {
if (!Notification) {
return 'denied';
}

if (Notification.permission === 'default') {
return 'prompt';
}

return Notification.permission;
};

export function usePermissionState(name: PermissionName, initialValue: PermissionState = 'prompt') {
const [permissionState, setPermissionState] = useState<PermissionState>(initialValue);
Expand All @@ -15,16 +27,16 @@ export function usePermissionState(name: PermissionName, initialValue: Permissio
.then((permStatus: PermissionStatus) => {
permissionStatus = permStatus;
handlePermissionChange.apply(permStatus);
permStatus.addEventListener("change", handlePermissionChange);
permStatus.addEventListener('change', handlePermissionChange);
})
.catch(() => {
// Silence error since FF doesn't support microphone permission
});

return () => {
permissionStatus?.removeEventListener("change", handlePermissionChange);
permissionStatus?.removeEventListener('change', handlePermissionChange);
};
}, [name]);

return permissionState;
}
}
6 changes: 3 additions & 3 deletions src/app/pages/client/ClientNonUIFeatures.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import LogoUnreadSVG from '../../../../public/res/svg/cinny-unread.svg';
import LogoHighlightSVG from '../../../../public/res/svg/cinny-highlight.svg';
import NotificationSound from '../../../../public/sound/notification.ogg';
import InviteSound from '../../../../public/sound/invite.ogg';
import { setFavicon } from '../../utils/dom';
import { notificationPermission, setFavicon } from '../../utils/dom';
import { useSetting } from '../../state/hooks/settings';
import { settingsAtom } from '../../state/settings';
import { allInvitesAtom } from '../../state/room-list/inviteList';
Expand Down Expand Up @@ -110,7 +110,7 @@ function InviteNotifications() {

useEffect(() => {
if (invites.length > perviousInviteLen && mx.getSyncState() === 'SYNCING') {
if (showNotifications && Notification.permission === 'granted') {
if (showNotifications && notificationPermission('granted')) {
notify(invites.length - perviousInviteLen);
}

Expand Down Expand Up @@ -212,7 +212,7 @@ function MessageNotifications() {
return;
}

if (showNotifications && Notification.permission === 'granted') {
if (showNotifications && notificationPermission('granted')) {
const avatarMxc =
room.getAvatarFallbackMember()?.getMxcAvatarUrl() ?? room.getMxcAvatarUrl();
notify({
Expand Down
7 changes: 7 additions & 0 deletions src/app/utils/dom.ts
Original file line number Diff line number Diff line change
Expand Up @@ -217,3 +217,10 @@ export const syntaxErrorPosition = (error: SyntaxError): number | undefined => {
if (Number.isNaN(position)) return undefined;
return position;
};

export const notificationPermission = (permission: NotificationPermission) => {
if (Notification) {
return Notification.permission === permission;
}
return false;
};

0 comments on commit d2cf1e1

Please sign in to comment.