mirror of
https://github.com/cinnyapp/cinny.git
synced 2025-09-13 22:32:26 +03:00
Add Desktop notifications (#252)
* Add notifications * Abide push actions * Handle browsers not having notification support * Ask for notification permission after loading * Make usePermission work without live permission support * Focus message when clicking the notification * make const all caps * Fix usePermission error in Safari * Fix live permissions * Remove userActivity and use document.visibilityState instead * Change setting label to "desktop notifications" * Check for notification permissions in the settings.js
This commit is contained in:
parent
d0b4e092b3
commit
c828dfd596
7 changed files with 174 additions and 15 deletions
|
@ -5,8 +5,12 @@ import './Settings.scss';
|
|||
import initMatrix from '../../../client/initMatrix';
|
||||
import cons from '../../../client/state/cons';
|
||||
import settings from '../../../client/state/settings';
|
||||
import { toggleSystemTheme, toggleMarkdown, toggleMembershipEvents, toggleNickAvatarEvents } from '../../../client/action/settings';
|
||||
import {
|
||||
toggleSystemTheme, toggleMarkdown, toggleMembershipEvents, toggleNickAvatarEvents,
|
||||
toggleNotifications,
|
||||
} from '../../../client/action/settings';
|
||||
import logout from '../../../client/action/logout';
|
||||
import { usePermission } from '../../hooks/usePermission';
|
||||
|
||||
import Text from '../../atoms/text/Text';
|
||||
import IconButton from '../../atoms/button/IconButton';
|
||||
|
@ -24,6 +28,7 @@ import ProfileEditor from '../profile-editor/ProfileEditor';
|
|||
import SettingsIC from '../../../../public/res/ic/outlined/settings.svg';
|
||||
import SunIC from '../../../../public/res/ic/outlined/sun.svg';
|
||||
import LockIC from '../../../../public/res/ic/outlined/lock.svg';
|
||||
import BellIC from '../../../../public/res/ic/outlined/bell.svg';
|
||||
import InfoIC from '../../../../public/res/ic/outlined/info.svg';
|
||||
import PowerIC from '../../../../public/res/ic/outlined/power.svg';
|
||||
import CrossIC from '../../../../public/res/ic/outlined/cross.svg';
|
||||
|
@ -60,21 +65,23 @@ function AppearanceSection() {
|
|||
/>
|
||||
{(() => {
|
||||
if (!settings.useSystemTheme) {
|
||||
return <SettingTile
|
||||
title="Theme"
|
||||
content={(
|
||||
<SegmentedControls
|
||||
selected={settings.getThemeIndex()}
|
||||
segments={[
|
||||
{ text: 'Light' },
|
||||
{ text: 'Silver' },
|
||||
{ text: 'Dark' },
|
||||
{ text: 'Butter' },
|
||||
]}
|
||||
onSelect={(index) => settings.setTheme(index)}
|
||||
/>
|
||||
return (
|
||||
<SettingTile
|
||||
title="Theme"
|
||||
content={(
|
||||
<SegmentedControls
|
||||
selected={settings.getThemeIndex()}
|
||||
segments={[
|
||||
{ text: 'Light' },
|
||||
{ text: 'Silver' },
|
||||
{ text: 'Dark' },
|
||||
{ text: 'Butter' },
|
||||
]}
|
||||
onSelect={(index) => settings.setTheme(index)}
|
||||
/>
|
||||
)}
|
||||
/>
|
||||
/>
|
||||
);
|
||||
}
|
||||
})()}
|
||||
<SettingTile
|
||||
|
@ -111,6 +118,50 @@ function AppearanceSection() {
|
|||
);
|
||||
}
|
||||
|
||||
function NotificationsSection() {
|
||||
const [permission, setPermission] = usePermission('notifications', window.Notification?.permission);
|
||||
|
||||
const [, updateState] = useState({});
|
||||
|
||||
const renderOptions = () => {
|
||||
if (window.Notification === undefined) {
|
||||
return <Text className="set-notifications__not-supported">Not supported in this browser.</Text>;
|
||||
}
|
||||
|
||||
if (permission === 'granted') {
|
||||
return (
|
||||
<Toggle
|
||||
isActive={settings._showNotifications}
|
||||
onToggle={() => {
|
||||
toggleNotifications();
|
||||
setPermission(window.Notification?.permission);
|
||||
updateState({});
|
||||
}}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Button
|
||||
variant="primary"
|
||||
onClick={() => window.Notification.requestPermission().then(setPermission)}
|
||||
>
|
||||
Request permission
|
||||
</Button>
|
||||
);
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="set-notifications settings-content">
|
||||
<SettingTile
|
||||
title="Show desktop notifications"
|
||||
options={renderOptions()}
|
||||
content={<Text variant="b3">Show notifications when new messages arrive.</Text>}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function SecuritySection() {
|
||||
return (
|
||||
<div className="set-security settings-content">
|
||||
|
@ -178,6 +229,12 @@ function Settings({ isOpen, onRequestClose }) {
|
|||
render() {
|
||||
return <AppearanceSection />;
|
||||
},
|
||||
}, {
|
||||
name: 'Notifications',
|
||||
iconSrc: BellIC,
|
||||
render() {
|
||||
return <NotificationsSection />;
|
||||
},
|
||||
}, {
|
||||
name: 'Security & Privacy',
|
||||
iconSrc: LockIC,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue