import { WebApplication } from '@/ui_models/application'; import { FunctionalComponent } from 'preact'; import { useCallback, useState } from 'preact/hooks'; import { useEffect } from 'preact/hooks'; import { ApplicationEvent } from '@standardnotes/snjs'; import { isSameDay } from '@/utils'; type Props = { application: WebApplication; }; const Protections: FunctionalComponent = ({ application }) => { const enableProtections = () => { application.clearProtectionSession(); }; const [hasProtections, setHasProtections] = useState(() => application.hasProtectionSources()); const getProtectionsDisabledUntil = useCallback((): string | null => { const protectionExpiry = application.getProtectionSessionExpiryDate(); const now = new Date(); if (protectionExpiry > now) { let f: Intl.DateTimeFormat; if (isSameDay(protectionExpiry, now)) { f = new Intl.DateTimeFormat(undefined, { hour: 'numeric', minute: 'numeric' }); } else { f = new Intl.DateTimeFormat(undefined, { weekday: 'long', day: 'numeric', month: 'short', hour: 'numeric', minute: 'numeric' }); } return f.format(protectionExpiry); } return null; }, [application]); const [protectionsDisabledUntil, setProtectionsDisabledUntil] = useState(getProtectionsDisabledUntil()); useEffect(() => { const removeProtectionSessionExpiryDateChangedObserver = application.addEventObserver( async () => { setProtectionsDisabledUntil(getProtectionsDisabledUntil()); }, ApplicationEvent.ProtectionSessionExpiryDateChanged ); const removeKeyStatusChangedObserver = application.addEventObserver( async () => { setHasProtections(application.hasProtectionSources()); }, ApplicationEvent.KeyStatusChanged ); return () => { removeProtectionSessionExpiryDateChangedObserver(); removeKeyStatusChangedObserver(); }; }, [application, getProtectionsDisabledUntil]); if (!hasProtections) { return null; } return (
Protections
{protectionsDisabledUntil && (
Protections are disabled until {protectionsDisabledUntil}
)} {!protectionsDisabledUntil && (
Protections are enabled
)}

Actions like viewing protected notes, exporting decrypted backups, or revoking an active session, require additional authentication like entering your account password or application passcode.

{protectionsDisabledUntil && (
)}
); }; export default Protections;