import { CloudUpload, Save, Trash2 } from 'lucide-preact'; import type { BackupDestinationRecord, RemoteBackupBrowserResponse, S3BackupAddressingStyle, S3BackupDestination, WebDavBackupDestination, } from '@/lib/api/backup'; import { COMMON_TIME_ZONES, getDestinationTypeLabel } from '@/lib/backup-center'; import type { RecommendedProvider } from '@/lib/backup-recommendations'; import { RemoteBackupBrowser } from './RemoteBackupBrowser'; import { t } from '@/lib/i18n'; import { BackupIncludeAttachmentsField } from './BackupIncludeAttachmentsField'; const INTERVAL_HOUR_PRESETS = [1, 6, 12, 24]; interface BackupDestinationDetailProps { selectedRecommendedProvider: RecommendedProvider | null; selectedDestination: BackupDestinationRecord | null; selectedDestinationIsSaved: boolean; canRunSelectedDestination: boolean; canBrowseSelectedDestination: boolean; disableWhileBusy: boolean; loadingSettings: boolean; savingSettings: boolean; runningRemoteBackup: boolean; availableTimeZones: string[]; remoteBrowser: RemoteBackupBrowserResponse | null; remoteBrowserVisibleItems: RemoteBackupBrowserResponse['items']; remoteBrowserCurrentPage: number; remoteBrowserTotalPages: number; loadingRemoteBrowser: boolean; downloadingRemotePath: string; downloadingRemotePercent: number | null; restoringRemotePath: string; deletingRemotePath: string; onSaveSettings: () => void; onToggleSchedule: () => void; onRunRemoteBackup: () => void; onPromptDeleteDestination: () => void; onUpdateDestination: (mutator: (destination: BackupDestinationRecord) => BackupDestinationRecord) => void; onRefreshRemoteBrowser: () => void; onShowRemoteBrowserPath: (path: string) => void; onDownloadRemoteBackup: (path: string) => void; onRestoreRemoteBackup: (path: string) => void; onPromptDeleteRemoteBackup: (path: string) => void; onChangeRemoteBrowserPage: (page: number) => void; } function renderRecommendedProviderDetails(provider: RecommendedProvider) { switch (provider.id) { case 'koofr': return ( <>
1. {t('txt_backup_recommend_koofr_step_1')}
2. {t('txt_backup_recommend_koofr_step_2_prefix')}{' '} {t('txt_backup_recommend_koofr_password_link')} {t('txt_backup_recommend_koofr_step_2_suffix')}
3. {t('txt_backup_recommend_koofr_step_3')}
4. {t('txt_backup_recommend_koofr_step_4')}
5. {t('txt_backup_recommend_koofr_step_5_prefix')}{' '} {t('txt_backup_recommend_koofr_storage_link')} {t('txt_backup_recommend_koofr_step_5_suffix')}
{t('txt_backup_recommend_koofr_dav_intro')}
{t('txt_backup_recommend_koofr_dav_self')} https://app.koofr.net/dav/Koofr
Google Drive https://app.koofr.net/dav/Google Drive
OneDrive https://app.koofr.net/dav/OneDrive
Dropbox https://app.koofr.net/dav/Dropbox
); case 'pcloud': return (
1. {t('txt_backup_recommend_pcloud_step_1')}
2. {t('txt_backup_recommend_pcloud_step_2')}
3. {t('txt_backup_recommend_pcloud_step_3')}
); case 'infinicloud': return (
1. {t('txt_backup_recommend_infinicloud_step_1')}
2. {t('txt_backup_recommend_infinicloud_step_2_prefix')}{' '} My Page {t('txt_backup_recommend_infinicloud_step_2_suffix')}
3. {t('txt_backup_recommend_infinicloud_step_3')}
4. {t('txt_backup_recommend_infinicloud_step_4')}
); } } export function BackupDestinationDetail(props: BackupDestinationDetailProps) { const timeZones = Array.from(new Set([ ...COMMON_TIME_ZONES, ...props.availableTimeZones, ])); const selectedIntervalHours = props.selectedDestination?.schedule.intervalHours ?? 24; if (props.selectedRecommendedProvider) { return (
{props.selectedRecommendedProvider.name}
{props.selectedRecommendedProvider.id === 'infinicloud' ? t('txt_backup_recommend_infinicloud_summary') : props.selectedRecommendedProvider.id === 'koofr' ? t('txt_backup_recommend_koofr_summary') : t('txt_backup_recommend_pcloud_summary')}
{props.selectedRecommendedProvider.capacity}
{props.selectedRecommendedProvider.hasAffiliateLink ? t('txt_backup_recommend_open_signup_aff') : t('txt_backup_recommend_open_signup')}
{renderRecommendedProviderDetails(props.selectedRecommendedProvider)}
); } return (

{t('txt_backup_destination_detail_title')}

{props.selectedDestination ? (
) : null}
{!props.selectedDestination ? (
{t('txt_backup_select_destination')}
) : ( <>
props.onUpdateDestination((destination) => ({ ...destination, includeAttachments: checked, }))} />
{props.selectedDestination.type === 'webdav' ? (
) : null} {props.selectedDestination.type === 's3' ? (
) : null} )}
); }