refactor: updated how expiry dates are handled.
This commit is contained in:
@@ -5,7 +5,6 @@ export const KeyBackupReminder = () => {
|
|||||||
const { setDialogOpen } = useDevice();
|
const { setDialogOpen } = useDevice();
|
||||||
|
|
||||||
useBackupReminder({
|
useBackupReminder({
|
||||||
reminderInDays: 7,
|
|
||||||
message:
|
message:
|
||||||
"We recommend backing up your key data regularly. Would you like to back up now?",
|
"We recommend backing up your key data regularly. Would you like to back up now?",
|
||||||
onAccept: () => setDialogOpen("pkiBackup", true),
|
onAccept: () => setDialogOpen("pkiBackup", true),
|
||||||
|
|||||||
@@ -11,27 +11,27 @@ interface UseBackupReminderOptions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface ReminderState {
|
interface ReminderState {
|
||||||
suppressed: boolean;
|
expires: string;
|
||||||
lastShown: string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const TOAST_APPEAR_DELAY = 10_000; // 10 seconds
|
const TOAST_APPEAR_DELAY = 10_000; // 10 seconds
|
||||||
const TOAST_DURATION = 30_000; // 30 seconds
|
const TOAST_DURATION = 30_000; // 30 seconds
|
||||||
const ON_ACCEPT_REMINDER_DAYS = 365;
|
const REMINDER_DAYS_ONE_WEEK = 7;
|
||||||
|
const REMINDER_DAYS_ONE_YEAR = 365;
|
||||||
|
const REMINDER_DAYS_FOREVER = 3650;
|
||||||
const STORAGE_KEY = "key_backup_reminder";
|
const STORAGE_KEY = "key_backup_reminder";
|
||||||
|
|
||||||
function isReminderExpired(lastShown: string): boolean {
|
function isReminderExpired(expires?: string): boolean {
|
||||||
const lastShownDate = new Date(lastShown);
|
if (!expires) return true;
|
||||||
const now = new Date();
|
const expiryDate = new Date(expires);
|
||||||
const daysSinceLastShown = (now.getTime() - lastShownDate.getTime()) / (1000 * 60 * 60 * 24);
|
return isNaN(expiryDate.getTime()) || new Date() >= expiryDate;
|
||||||
return daysSinceLastShown >= 7;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useBackupReminder({
|
export function useBackupReminder({
|
||||||
reminderInDays = 7,
|
|
||||||
enabled,
|
enabled,
|
||||||
message,
|
message,
|
||||||
onAccept = () => { },
|
onAccept = () => { },
|
||||||
|
reminderInDays = REMINDER_DAYS_ONE_WEEK,
|
||||||
}: UseBackupReminderOptions) {
|
}: UseBackupReminderOptions) {
|
||||||
const { toast } = useToast();
|
const { toast } = useToast();
|
||||||
const toastShownRef = useRef(false);
|
const toastShownRef = useRef(false);
|
||||||
@@ -40,24 +40,16 @@ export function useBackupReminder({
|
|||||||
null
|
null
|
||||||
);
|
);
|
||||||
|
|
||||||
// Suppress reminder for 10 years if not specified
|
const setReminderExpiry = useCallback((days: number) => {
|
||||||
const suppressReminder = useCallback((days: number = 3563) => {
|
|
||||||
const expiryDate = new Date();
|
const expiryDate = new Date();
|
||||||
expiryDate.setDate(expiryDate.getDate() + days);
|
expiryDate.setDate(expiryDate.getDate() + days);
|
||||||
|
setReminderState({ expires: expiryDate.toISOString() });
|
||||||
setReminderState({
|
|
||||||
suppressed: true,
|
|
||||||
lastShown: new Date().toISOString(),
|
|
||||||
});
|
|
||||||
}, [setReminderState]);
|
}, [setReminderState]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!enabled || toastShownRef.current) return;
|
if (!enabled || toastShownRef.current) return;
|
||||||
|
|
||||||
const shouldShowReminder =
|
if (!isReminderExpired(reminderState?.expires)) return;
|
||||||
!reminderState?.suppressed || isReminderExpired(reminderState.lastShown);
|
|
||||||
|
|
||||||
if (!shouldShowReminder) return;
|
|
||||||
|
|
||||||
toastShownRef.current = true;
|
toastShownRef.current = true;
|
||||||
|
|
||||||
@@ -69,14 +61,13 @@ export function useBackupReminder({
|
|||||||
action: (
|
action: (
|
||||||
<div className="flex flex-col gap-2">
|
<div className="flex flex-col gap-2">
|
||||||
<div className="flex gap-2">
|
<div className="flex gap-2">
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
type="button"
|
type="button"
|
||||||
variant="outline"
|
variant="outline"
|
||||||
className="p-1"
|
className="p-1"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
dismiss();
|
dismiss();
|
||||||
suppressReminder(reminderInDays);
|
setReminderExpiry(reminderInDays);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Remind me in {reminderInDays} days
|
Remind me in {reminderInDays} days
|
||||||
@@ -87,42 +78,33 @@ export function useBackupReminder({
|
|||||||
className="p-1"
|
className="p-1"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
dismiss();
|
dismiss();
|
||||||
suppressReminder();
|
setReminderExpiry(REMINDER_DAYS_FOREVER);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Never remind me
|
Never remind me
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex">
|
<Button
|
||||||
<Button
|
type="button"
|
||||||
type="button"
|
variant="default"
|
||||||
variant="default"
|
className="w-full"
|
||||||
className="w-full"
|
onClick={() => {
|
||||||
onClick={() => {
|
onAccept();
|
||||||
onAccept();
|
dismiss();
|
||||||
dismiss();
|
setReminderExpiry(REMINDER_DAYS_ONE_YEAR);
|
||||||
suppressReminder(ON_ACCEPT_REMINDER_DAYS);
|
}}
|
||||||
}}
|
>
|
||||||
>
|
Back up now
|
||||||
Back up now
|
</Button>
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
),
|
),
|
||||||
});
|
});
|
||||||
|
|
||||||
return () => {
|
return () => dismiss();
|
||||||
if (!toastShownRef.current) {
|
|
||||||
dismiss();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}, [
|
}, [
|
||||||
enabled,
|
enabled,
|
||||||
message,
|
message,
|
||||||
onAccept,
|
onAccept,
|
||||||
reminderInDays,
|
|
||||||
suppressReminder,
|
|
||||||
toast,
|
|
||||||
reminderState,
|
|
||||||
]);
|
]);
|
||||||
}
|
};
|
||||||
Reference in New Issue
Block a user