Files
cinny/src/app/state/backupRestore.ts
T

71 lines
1.6 KiB
TypeScript
Raw Normal View History

import { atom } from 'jotai';
2025-05-18 10:53:56 +05:30
import { ImportRoomKeyProgressData, ImportRoomKeyStage } from 'matrix-js-sdk/lib/crypto-api';
export enum BackupProgressStatus {
Idle,
Fetching,
Loading,
Done,
}
export type ProgressData = {
downloaded: number;
successes: number;
failures: number;
total: number;
};
export type IBackupProgress =
| {
status: BackupProgressStatus.Idle;
}
| {
status: BackupProgressStatus.Fetching;
}
| {
status: BackupProgressStatus.Loading;
data: ProgressData;
}
| {
status: BackupProgressStatus.Done;
};
const baseBackupRestoreProgressAtom = atom<IBackupProgress>({
status: BackupProgressStatus.Idle,
});
export const backupRestoreProgressAtom = atom<
IBackupProgress,
[ImportRoomKeyProgressData],
undefined
>(
(get) => get(baseBackupRestoreProgressAtom),
(get, set, progress) => {
2025-05-18 10:53:56 +05:30
if (progress.stage === ImportRoomKeyStage.Fetch) {
set(baseBackupRestoreProgressAtom, {
status: BackupProgressStatus.Fetching,
});
return;
}
2025-05-18 10:53:56 +05:30
if (progress.stage === ImportRoomKeyStage.LoadKeys) {
const { total, successes, failures } = progress;
2025-05-18 10:53:56 +05:30
const downloaded = successes + failures;
if (downloaded === total) {
set(baseBackupRestoreProgressAtom, {
status: BackupProgressStatus.Done,
});
return;
}
set(baseBackupRestoreProgressAtom, {
status: BackupProgressStatus.Loading,
data: {
downloaded,
successes,
failures,
total,
},
});
}
},
);