// Copyright 2024 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import React, { useState, useCallback } from 'react'; import type { LocalizerType } from '../../types/Util'; import { InstallScreenBackupStep } from '../../types/InstallScreen'; import { formatFileSize } from '../../util/formatFileSize'; import { TitlebarDragArea } from '../TitlebarDragArea'; import { ProgressBar } from '../ProgressBar'; import { ConfirmationDialog } from '../ConfirmationDialog'; import { InstallScreenSignalLogo } from './InstallScreenSignalLogo'; import { roundFractionForProgressBar } from '../../util/numbers'; import { missingCaseError } from '../../util/missingCaseError'; // We can't always use destructuring assignment because of the complexity of this props // type. export type PropsType = Readonly<{ i18n: LocalizerType; backupStep: InstallScreenBackupStep; currentBytes?: number; totalBytes?: number; hasError?: boolean; onCancel: () => void; onRetry: () => void; }>; export function InstallScreenBackupImportStep({ i18n, backupStep, currentBytes, totalBytes, hasError, onCancel, onRetry, }: PropsType): JSX.Element { const [isConfirmingCancel, setIsConfirmingCancel] = useState(false); const [isConfirmingSkip, setIsConfirmingSkip] = useState(false); const confirmCancel = useCallback(() => { setIsConfirmingCancel(true); }, []); const abortCancel = useCallback(() => { setIsConfirmingCancel(false); }, []); const onCancelWrap = useCallback(() => { onCancel(); setIsConfirmingCancel(false); }, [onCancel]); const confirmSkip = useCallback(() => { setIsConfirmingSkip(true); }, []); const abortSkip = useCallback(() => { setIsConfirmingSkip(false); }, []); const onSkipWrap = useCallback(() => { onCancel(); setIsConfirmingSkip(false); }, [onCancel]); const onRetryWrap = useCallback(() => { onRetry(); setIsConfirmingSkip(false); }, [onRetry]); let progress: JSX.Element; if (currentBytes != null && totalBytes != null) { const fractionComplete = roundFractionForProgressBar( currentBytes / totalBytes ); let hint: string; if (backupStep === InstallScreenBackupStep.Download) { hint = i18n('icu:BackupImportScreen__progressbar-hint', { currentSize: formatFileSize(currentBytes), totalSize: formatFileSize(totalBytes), fractionComplete, }); } else if (backupStep === InstallScreenBackupStep.Process) { hint = i18n('icu:BackupImportScreen__progressbar-hint--processing'); } else { throw missingCaseError(backupStep); } progress = ( <>
{hint}
); } else { progress = ( <>
{i18n('icu:BackupImportScreen__progressbar-hint--preparing')}
); } return (

{i18n('icu:BackupImportScreen__title')}

{progress}
{i18n('icu:BackupImportScreen__description')}
{backupStep === InstallScreenBackupStep.Download && ( )} {isConfirmingCancel && ( {i18n('icu:BackupImportScreen__cancel-confirmation__body')} )} {isConfirmingSkip && ( {i18n('icu:BackupImportScreen__skip-confirmation__body')} )} {hasError && !isConfirmingSkip && ( {i18n('icu:BackupImportScreen__error__body')} )}
); }