import { CloudUpload, Save, Trash2 } from 'lucide-preact';
import type {
BackupDestinationRecord,
RemoteBackupBrowserResponse,
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')}
3. {t('txt_backup_recommend_koofr_step_3')}
4. {t('txt_backup_recommend_koofr_step_4')}
{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}
{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}
>
)}
);
}