fix(settings): show latest update feedback

This commit is contained in:
Tommaso Casaburi
2026-05-13 23:55:38 +07:00
parent 29f5e67c72
commit c8640a8010
38 changed files with 144 additions and 36 deletions
+31
View File
@@ -1,19 +1,50 @@
import { create } from 'zustand';
import { applyAvailableAppUpdate, resolveAvailableAppUpdate, type AvailableAppUpdate } from '../lib/app-update';
type AppUpdateCheckStatus = 'idle' | 'upToDate';
interface AppUpdateState {
availableUpdate: AvailableAppUpdate | null;
appUpdateCheckStatus: AppUpdateCheckStatus;
isApplyingUpdate: boolean;
isCheckingForUpdate: boolean;
clearAppUpdateCheckStatus: () => void;
showAppUpdateUpToDateStatus: () => void;
refreshAvailableUpdate: () => Promise<AvailableAppUpdate | null>;
applyAppUpdate: () => Promise<void>;
}
const UP_TO_DATE_STATUS_TIMEOUT_MS = 4000;
let appUpdateCheckStatusTimeout: ReturnType<typeof setTimeout> | null = null;
const clearAppUpdateCheckStatusTimeout = () => {
if (appUpdateCheckStatusTimeout !== null) {
clearTimeout(appUpdateCheckStatusTimeout);
appUpdateCheckStatusTimeout = null;
}
};
const scheduleAppUpdateCheckStatusClear = (clearStatus: () => void) => {
clearAppUpdateCheckStatusTimeout();
appUpdateCheckStatusTimeout = setTimeout(clearStatus, UP_TO_DATE_STATUS_TIMEOUT_MS);
};
const useAppUpdateStore = create<AppUpdateState>((set, get) => ({
availableUpdate: null,
appUpdateCheckStatus: 'idle',
isApplyingUpdate: false,
isCheckingForUpdate: false,
clearAppUpdateCheckStatus: () => {
clearAppUpdateCheckStatusTimeout();
set({ appUpdateCheckStatus: 'idle' });
},
showAppUpdateUpToDateStatus: () => {
set({ appUpdateCheckStatus: 'upToDate' });
scheduleAppUpdateCheckStatusClear(get().clearAppUpdateCheckStatus);
},
refreshAvailableUpdate: async () => {
get().clearAppUpdateCheckStatus();
set({ isCheckingForUpdate: true });
try {
const availableUpdate = await resolveAvailableAppUpdate();