type NativeDialogBridge = { electronAPI?: { stats?: { confirmNativeDialog?: (message: string) => boolean; beginNativeDialog?: () => void; endNativeDialog?: () => void; }; }; }; type DeleteConfirmPresenter = (message: string) => boolean | Promise; let deleteConfirmPresenter: DeleteConfirmPresenter | null = null; export function setDeleteConfirmPresenter(presenter: DeleteConfirmPresenter): () => void { deleteConfirmPresenter = presenter; return () => { if (deleteConfirmPresenter === presenter) { deleteConfirmPresenter = null; } }; } async function confirmWithStatsNativeDialogLayer(message: string): Promise { if (deleteConfirmPresenter) { return deleteConfirmPresenter(message); } const statsApi = (globalThis as typeof globalThis & NativeDialogBridge).electronAPI?.stats; if (statsApi?.confirmNativeDialog) { return statsApi.confirmNativeDialog(message); } statsApi?.beginNativeDialog?.(); try { return globalThis.confirm(message); } finally { statsApi?.endNativeDialog?.(); } } export function confirmSessionDelete(): Promise { return confirmWithStatsNativeDialogLayer('Delete this session and all associated data?'); } export function confirmDayGroupDelete(dayLabel: string, count: number): Promise { if (count === 1) { return confirmWithStatsNativeDialogLayer( `Delete this session from ${dayLabel} and all associated data?`, ); } return confirmWithStatsNativeDialogLayer( `Delete all ${count} sessions from ${dayLabel} and all associated data?`, ); } export function confirmAnimeGroupDelete(title: string, count: number): Promise { return confirmWithStatsNativeDialogLayer( `Delete all ${count} session${count === 1 ? '' : 's'} for "${title}" and all associated data?`, ); } export function confirmAnimeDelete(title: string, episodeCount: number): Promise { const episodes = `${episodeCount} episode${episodeCount === 1 ? '' : 's'}`; return confirmWithStatsNativeDialogLayer( `Delete "${title}" from your library? This removes ${episodes} plus every session and stat recorded for them.`, ); } export function confirmEpisodeDelete(title: string): Promise { return confirmWithStatsNativeDialogLayer(`Delete "${title}" and all its sessions?`); } export function confirmBucketDelete(title: string, count: number): Promise { if (count === 1) { return confirmWithStatsNativeDialogLayer( `Delete this session of "${title}" from this day and all associated data?`, ); } return confirmWithStatsNativeDialogLayer( `Delete all ${count} sessions of "${title}" from this day and all associated data?`, ); }