import Spinner from '../Spinner/Spinner' import { useApplication } from '../ApplicationProvider' import { useCallback, useEffect, useState } from 'react' export const PreprocessingStep = ({ onContinue, setContinueEnabled, }: { onContinue: () => void setContinueEnabled: (disabled: boolean) => void }) => { const application = useApplication() const [isProcessingSync, setIsProcessingSync] = useState(true) const [isProcessingMessages, setIsProcessingMessages] = useState(true) const [isProcessingInvites, setIsProcessingInvites] = useState(true) const [needsUserConfirmation, setNeedsUserConfirmation] = useState<'yes' | 'no'>() const continueIfPossible = useCallback(() => { if (isProcessingMessages || isProcessingInvites || isProcessingSync) { setContinueEnabled(false) return } if (needsUserConfirmation === 'yes') { setContinueEnabled(true) return } onContinue() }, [ isProcessingInvites, isProcessingMessages, isProcessingSync, needsUserConfirmation, onContinue, setContinueEnabled, ]) useEffect(() => { continueIfPossible() }, [isProcessingInvites, isProcessingMessages, isProcessingSync, continueIfPossible]) useEffect(() => { const processPendingSync = async () => { await application.sync.sync() setIsProcessingSync(false) } void processPendingSync() }, [application.sync]) useEffect(() => { const processPendingMessages = async () => { await application.asymmetric.downloadAndProcessInboundMessages() setIsProcessingMessages(false) } void processPendingMessages() }, [application.asymmetric]) useEffect(() => { const processPendingInvites = async () => { await application.sharedVaults.downloadInboundInvites() const hasPendingInvites = application.sharedVaults.getCachedPendingInviteRecords().length > 0 setNeedsUserConfirmation(hasPendingInvites ? 'yes' : 'no') setIsProcessingInvites(false) } void processPendingInvites() }, [application.sharedVaults]) const isProcessing = isProcessingSync || isProcessingMessages || isProcessingInvites if (isProcessing) { return (

Checking for data conflicts...

) } if (needsUserConfirmation === 'no') { return null } return (

You have pending vault invites. Changing your password will delete these invites. It is recommended you accept or decline these invites before changing your password. If you choose to continue, these invites will be deleted.

) }