// Copyright 2025 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import React, { useState, useCallback } from 'react'; import type { LocalizerType } from '../types/I18N'; import { toLogFormat } from '../types/errors'; import { formatFileSize } from '../util/formatFileSize'; import { SECOND } from '../util/durations'; import type { ValidationResultType as BackupValidationResultType } from '../services/backups'; import { SettingsRow, SettingsControl } from './PreferencesUtil'; import { Button, ButtonVariant } from './Button'; import { Spinner } from './Spinner'; export function PreferencesInternal({ i18n, validateBackup: doValidateBackup, }: { i18n: LocalizerType; validateBackup: () => Promise; }): JSX.Element { const [isValidationPending, setIsValidationPending] = useState(false); const [validationResult, setValidationResult] = useState< BackupValidationResultType | undefined >(); const validateBackup = useCallback(async () => { setIsValidationPending(true); setValidationResult(undefined); try { setValidationResult(await doValidateBackup()); } catch (error) { setValidationResult({ error: toLogFormat(error) }); } finally { setIsValidationPending(false); } }, [doValidateBackup]); let validationElem: JSX.Element | undefined; if (validationResult != null) { if ('result' in validationResult) { const { result: { totalBytes, stats, duration }, } = validationResult; validationElem = (

File size: {formatFileSize(totalBytes)}

Duration: {Math.round(duration / SECOND)}s

            {JSON.stringify(stats, null, 2)}
          
); } else { const { error } = validationResult; validationElem = (
            {error}
          
); } } return ( <>
{i18n('icu:Preferences__button--internal')}
{isValidationPending ? ( ) : ( i18n('icu:Preferences__internal__validate-backup') )} } /> {validationElem} ); }