| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- import { useState, useCallback, useEffect } from 'react'
- import customLocalStorage from '@/infrastructure/local-storage'
- import usePersistedState from '@/shared/hooks/use-persisted-state'
- /**
- * @typedef {Object} RemindMeLater
- * @property {boolean} stillDissmissed - whether the user has dismissed the notification, or if the notification is still withing the 1 day reminder period
- * @property {function} remindThemLater - saves that the user has dismissed the notification for 1 day in local storage
- * @property {function} saveDismissed - saves that the user has dismissed the notification in local storage
- */
- /**
- *
- * @param {string} key the unique key used to keep track of what popup is currently being shown (usually the component name)
- * @param {string} notificationLocation what page the notification originates from (eg, the editor page, project page, etc)
- * @returns {RemindMeLater} an object containing whether the notification is still dismissed, and functions to remind the user later or save that they have dismissed the notification
- */
- export default function useRemindMeLater(
- key: string,
- notificationLocation: string = 'editor'
- ) {
- const [dismissedUntil, setDismissedUntil] = usePersistedState<
- Date | undefined
- >(`${notificationLocation}.has_dismissed_${key}_until`)
- const [stillDissmissed, setStillDismissed] = useState(true)
- useEffect(() => {
- const alertDismissed = customLocalStorage.getItem(
- `${notificationLocation}.has_dismissed_${key}`
- )
- const isStillDismissed = Boolean(
- dismissedUntil && new Date(dismissedUntil) > new Date()
- )
- setStillDismissed(alertDismissed || isStillDismissed)
- }, [setStillDismissed, dismissedUntil, key, notificationLocation])
- const remindThemLater = useCallback(() => {
- const until = new Date()
- until.setDate(until.getDate() + 1) // 1 day
- setDismissedUntil(until)
- }, [setDismissedUntil])
- const saveDismissed = useCallback(() => {
- customLocalStorage.setItem(
- `${notificationLocation}.has_dismissed_${key}`,
- true
- )
- }, [key, notificationLocation])
- return { stillDissmissed, remindThemLater, saveDismissed }
- }
|