// 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 type { UpdatesStateType } from '../../state/ducks/updates';
import {
InstallScreenStep,
InstallScreenBackupStep,
InstallScreenBackupError,
} 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';
import { SYNCING_MESSAGES_SECURITY_URL } from '../../types/support';
import { I18n } from '../I18n';
import { InstallScreenUpdateDialog } from './InstallScreenUpdateDialog';
// 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;
error?: InstallScreenBackupError;
onCancel: () => void;
onRetry: () => void;
// Updater UI
updates: UpdatesStateType;
currentVersion: string;
OS: string;
startUpdate: () => void;
forceUpdate: () => void;
}>;
export function InstallScreenBackupImportStep({
i18n,
backupStep,
currentBytes,
totalBytes,
error,
onCancel,
onRetry,
updates,
currentVersion,
OS,
startUpdate,
forceUpdate,
}: 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 = (
<>