Skip to content

Commit ed3012a

Browse files
authored
Merge pull request #370 from WalletConnect/fix/dismiss-notifs-desktop
chore: dismiss modal
2 parents 3d2548c + c7d0997 commit ed3012a

File tree

10 files changed

+93
-47
lines changed

10 files changed

+93
-47
lines changed

src/Modals.tsx

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@ import W3iContext from '@/contexts/W3iContext/context'
1111
import { SignatureModal } from '@/pages/Login/SignatureModal'
1212
import { useModals } from '@/utils/hooks'
1313
import { useNotificationPermissionState } from '@/utils/hooks/notificationHooks'
14-
import { notificationsEnabledInBrowser } from '@/utils/notifications'
15-
import { isMobileButNotInstalledOnHomescreen } from '@/utils/pwa'
14+
import {
15+
checkIfNotificationModalClosed,
16+
notificationsEnabledInBrowser
17+
} from '@/utils/notifications'
18+
import { isMobileButNotInstalledOnHomeScreen } from '@/utils/pwa'
1619
import { notificationPwaModalService, signatureModalService } from '@/utils/store'
1720
import { isMobile } from '@/utils/ui'
1821

@@ -29,18 +32,17 @@ export const Modals = () => {
2932

3033
const notificationsEnabled = useNotificationPermissionState()
3134

35+
const notificationModalClosed = checkIfNotificationModalClosed()
3236
const explicitlyDeniedOnDesktop = !isMobile() && window.Notification?.permission === 'denied'
3337

34-
const shouldShowNotificationModal = useMemo(
35-
() =>
36-
notificationsEnabledInBrowser() &&
37-
!explicitlyDeniedOnDesktop &&
38-
!isMobileButNotInstalledOnHomescreen() &&
39-
!notificationsEnabled &&
40-
Boolean(notifyRegisteredKey) &&
41-
!isSignatureModalOpen,
42-
[explicitlyDeniedOnDesktop, notificationsEnabled, notifyRegisteredKey, isSignatureModalOpen]
43-
)
38+
const shouldShowNotificationModal =
39+
notificationsEnabledInBrowser() &&
40+
!explicitlyDeniedOnDesktop &&
41+
!isMobileButNotInstalledOnHomeScreen() &&
42+
!notificationsEnabled &&
43+
Boolean(notifyRegisteredKey) &&
44+
!isSignatureModalOpen &&
45+
!notificationModalClosed
4446

4547
useEffect(() => {
4648
const notifySignatureRequired = Boolean(notifyRegisterMessage) && !notifyRegisteredKey
@@ -64,20 +66,18 @@ export const Modals = () => {
6466
}, [shouldShowNotificationModal])
6567

6668
return (
67-
<>
68-
<AnimatePresence mode="popLayout">
69-
{isUnsubscribeModalOpen && <UnsubscribeModal />}
69+
<AnimatePresence mode="popLayout">
70+
{isUnsubscribeModalOpen && <UnsubscribeModal />}
7071

71-
{isPreferencesModalOpen && <PreferencesModal />}
72+
{isPreferencesModalOpen && <PreferencesModal />}
7273

73-
{isSignatureModalOpen && (
74-
<SignatureModal message={notifyRegisterMessage ?? ''} sender={'notify'} />
75-
)}
74+
{isSignatureModalOpen && (
75+
<SignatureModal message={notifyRegisterMessage ?? ''} sender={'notify'} />
76+
)}
7677

77-
{isMobileButNotInstalledOnHomescreen() && <PwaModal />}
78+
{isMobileButNotInstalledOnHomeScreen() && <PwaModal />}
7879

79-
{isNotificationPwaModalOpen && <NotificationPwaModal />}
80-
</AnimatePresence>
81-
</>
80+
{isNotificationPwaModalOpen && <NotificationPwaModal />}
81+
</AnimatePresence>
8282
)
8383
}

src/components/general/Icon/CrossIcon.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const CrossIcon: React.FC = () => {
55
<svg fill="none" viewBox="0 0 16 16">
66
<path
77
fill="currentColor"
8-
fill-rule="evenodd"
8+
fillRule="evenodd"
99
d="M2.54 2.54a1 1 0 0 1 1.42 0L8 6.6l4.04-4.05a1 1 0 1 1 1.42 1.42L9.4 8l4.05 4.04a1 1 0 0 1-1.42 1.42L8 9.4l-4.04 4.05a1 1 0 0 1-1.42-1.42L6.6 8 2.54 3.96a1 1 0 0 1 0-1.42Z"
1010
clipRule="evenodd"
1111
></path>

src/components/general/Icon/SignatureIcon.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ const SignatureIcon: React.FC = () => {
1919
fill="#3ABDF2"
2020
d="M39.83 62.83a20.35 20.35 0 0 1 28.34 0l.95.92c.39.39.39 1 0 1.4l-3.23 3.15a.5.5 0 0 1-.7 0l-1.3-1.27a14.2 14.2 0 0 0-19.78 0l-1.39 1.36a.5.5 0 0 1-.7 0l-3.23-3.16c-.39-.38-.39-1 0-1.39l1.04-1Zm35 6.53 2.88 2.8c.39.39.39 1 0 1.4L64.77 86.21c-.39.38-1.02.38-1.41 0l-9.18-9a.25.25 0 0 0-.36 0l-9.18 9c-.39.38-1.02.38-1.41 0L30.29 73.55c-.39-.38-.39-1 0-1.39l2.87-2.8c.4-.39 1.03-.39 1.42 0l9.18 8.98c.1.1.26.1.35 0l9.18-8.98c.4-.39 1.03-.39 1.42 0l9.18 8.98c.1.1.25.1.35 0l9.18-8.98c.4-.39 1.03-.39 1.42 0Z"
2121
/>
22-
<circle cx="53.9" cy="72" r="39.5" stroke="#062B2B" stroke-opacity=".02" />
22+
<circle cx="53.9" cy="72" r="39.5" stroke="#062B2B" strokeOpacity=".02" />
2323
<defs>
2424
<clipPath id="a">
2525
<path fill="#fff" d="M85.9 33.9h76.2v76.2H85.9z" />

src/components/general/Modal/Modal.scss

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
align-items: center;
2424
border-radius: 30px;
2525
background: var(--bg-color-1);
26-
border: 1px solid var(--border-color-2);
2726
box-shadow:
2827
0px 8px 22px -6px rgba(0, 0, 0, 0.12),
2928
0px 14px 64px -4px rgba(0, 0, 0, 0.12);

src/components/utils/NotificationPwaModal/NotificationPwaModal.scss

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,19 @@
77
gap: 2em;
88
position: relative;
99

10+
&__close-button {
11+
svg {
12+
color: var(--fg-color-3);
13+
}
14+
}
15+
16+
&__header {
17+
display: flex;
18+
justify-content: flex-end;
19+
width: 100%;
20+
align-items: center;
21+
}
22+
1023
&__background {
1124
position: absolute;
1225
z-index: -999;

src/components/utils/NotificationPwaModal/index.tsx

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,20 @@ import React, { Fragment, useContext } from 'react'
22

33
import BackgroundImage from '@/assets/IntroBackground.png'
44
import Button from '@/components/general/Button'
5-
import WalletConnectIcon from '@/components/general/Icon/WalletConnectIcon'
5+
import CrossIcon from '@/components/general/Icon/CrossIcon'
66
import { Modal } from '@/components/general/Modal/Modal'
77
import Text from '@/components/general/Text'
88
import W3iContext from '@/contexts/W3iContext/context'
9-
import { requireNotifyPermission } from '@/utils/notifications'
9+
import { closeNotificationModal, requireNotifyPermission } from '@/utils/notifications'
1010
import { pwaModalService } from '@/utils/store'
1111

1212
import './NotificationPwaModal.scss'
1313

1414
export const NotificationPwaModal: React.FC = () => {
1515
const { notifyClientProxy } = useContext(W3iContext)
1616

17+
const explicitlyDeniedPermissionForNotifications = window.Notification?.permission === 'denied'
18+
1719
const handleEnableNotifications = async () => {
1820
const notificationPermissionGranted = await requireNotifyPermission()
1921

@@ -26,37 +28,38 @@ export const NotificationPwaModal: React.FC = () => {
2628
}
2729
}
2830

29-
const explicitlyDeniedPermissionForNotifications = window.Notification?.permission === 'denied'
30-
3131
return (
3232
<Modal onCloseModal={pwaModalService.closeModal}>
3333
<div className="NotificationPwaModal">
34+
<div className="NotificationPwaModal__header">
35+
<Button
36+
className="NotificationPwaModal__close-button"
37+
customType="action-icon"
38+
onClick={closeNotificationModal}
39+
>
40+
<CrossIcon />
41+
</Button>
42+
</div>
3443
<div className="NotificationPwaModal__background">
3544
<img src={BackgroundImage} />
3645
</div>
3746
<div className="NotificationPwaModal__icon">
3847
<img alt="Web3Inbox icon" className="wc-icon" src="/icon.png" />
3948
</div>
40-
<div className="NotificationPwaModal__header">
41-
<Text variant={'large-500'}>Enable Notifications</Text>
42-
</div>
43-
<div className="NotificationPwaModal__description">
44-
<Text variant="small-500">
45-
To use Web3Inbox and receive notifications from your subscribed apps, please enable push
46-
notifications.
47-
</Text>
48-
</div>
49+
<Text variant={'large-500'}>Enable Notifications</Text>
50+
<Text variant="small-500">
51+
To use Web3Inbox and receive notifications from your subscribed apps, please enable push
52+
notifications.
53+
</Text>
4954
{explicitlyDeniedPermissionForNotifications ? (
5055
<Text variant="small-700" className="NotificationPwaModal__warning">
5156
You have explicitly denied notification permissions. Please adjust in OS settings.
5257
</Text>
5358
) : (
5459
<Fragment>
55-
<div className="NotificationPwaModal_subtitle">
56-
<Text variant="small-500">
57-
You can always adjust your permissions in your OS settings.
58-
</Text>
59-
</div>
60+
<Text variant="small-500">
61+
You can always adjust your permissions in your OS settings.
62+
</Text>
6063
<Button onClick={handleEnableNotifications} size="small">
6164
Enable Notifications
6265
</Button>

src/constants/localStorage.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export const localStorageKeys = {
2+
notificationModalClosed: 'w3i:notification_modal_closed'
3+
}

src/utils/localStorage.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
export class LocalStorage {
2+
static get(key: string) {
3+
if (typeof localStorage === 'undefined') {
4+
return undefined
5+
}
6+
7+
return localStorage.getItem(key)
8+
}
9+
static set(key: string, value: string) {
10+
if (typeof localStorage === 'undefined') {
11+
return undefined
12+
}
13+
14+
return localStorage.setItem(key, value)
15+
}
16+
}

src/utils/notifications.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
import { useEffect, useState } from 'react'
2-
31
import { NotifyClient } from '@walletconnect/notify-client'
42

3+
import { localStorageKeys } from '@/constants/localStorage'
4+
import { LocalStorage } from '@/utils/localStorage'
5+
import { notificationPwaModalService } from '@/utils/store'
6+
57
import { getFirebaseToken } from './firebase'
68
import { getDbEchoRegistrations, getDbSymkeyStore } from './idb'
79

@@ -61,6 +63,16 @@ export const setupSubscriptionsSymkeys = async (topicSymkeyEntries: [string, str
6163
}
6264
}
6365

66+
export const closeNotificationModal = () => {
67+
LocalStorage.set(localStorageKeys.notificationModalClosed, 'true')
68+
notificationPwaModalService.closeModal()
69+
}
70+
71+
export const checkIfNotificationModalClosed = () => {
72+
const storageValue = LocalStorage.get(localStorageKeys.notificationModalClosed)
73+
return storageValue === 'true'
74+
}
75+
6476
export const notificationsEnabledInBrowser = () => {
6577
return 'Notification' in window
6678
}

src/utils/pwa.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ export const isInstalledOnHomescreen = () => {
88

99
export const isMobileBrowser = () => /iPhone|iPad|iPod|Android/i.test(navigator.userAgent)
1010

11-
export const isMobileButNotInstalledOnHomescreen = () =>
11+
export const isMobileButNotInstalledOnHomeScreen = () =>
1212
isMobileBrowser() && !isInstalledOnHomescreen()

0 commit comments

Comments
 (0)