import type { DesktopRuntimeInfo, DesktopUpdateChannel, DesktopUpdateReleaseNote, DesktopUpdateState, } from "@t3tools/contracts"; export function nextStatusAfterDownloadFailure( currentState: DesktopUpdateState, ): DesktopUpdateState["status"] { return currentState.availableVersion ? "available" : "error"; } export function getCanRetryAfterDownloadFailure(currentState: DesktopUpdateState): boolean { return currentState.availableVersion !== null; } export function createInitialDesktopUpdateState( currentVersion: string, runtimeInfo: DesktopRuntimeInfo, channel: DesktopUpdateChannel, ): DesktopUpdateState { return { enabled: false, status: "disabled", channel, currentVersion, hostArch: runtimeInfo.hostArch, appArch: runtimeInfo.appArch, runningUnderArm64Translation: runtimeInfo.runningUnderArm64Translation, availableVersion: null, downloadedVersion: null, releaseNotes: [], downloadPercent: null, checkedAt: null, message: null, errorContext: null, canRetry: false, }; } export function reduceDesktopUpdateStateOnCheckStart( state: DesktopUpdateState, checkedAt: string, ): DesktopUpdateState { return { ...state, status: "checking", checkedAt, releaseNotes: [], message: null, downloadPercent: null, errorContext: null, canRetry: false, }; } export function reduceDesktopUpdateStateOnCheckFailure( state: DesktopUpdateState, message: string, checkedAt: string, ): DesktopUpdateState { return { ...state, status: "error", message, checkedAt, downloadPercent: null, errorContext: "check", canRetry: true, }; } export function reduceDesktopUpdateStateOnUpdateAvailable( state: DesktopUpdateState, version: string, checkedAt: string, releaseNotes: ReadonlyArray = [], ): DesktopUpdateState { return { ...state, status: "available", availableVersion: version, downloadedVersion: null, releaseNotes, downloadPercent: null, checkedAt, message: null, errorContext: null, canRetry: false, }; } export function reduceDesktopUpdateStateOnNoUpdate( state: DesktopUpdateState, checkedAt: string, ): DesktopUpdateState { return { ...state, status: "up-to-date", availableVersion: null, downloadedVersion: null, releaseNotes: [], downloadPercent: null, checkedAt, message: null, errorContext: null, canRetry: false, }; } export function reduceDesktopUpdateStateOnDownloadStart( state: DesktopUpdateState, ): DesktopUpdateState { return { ...state, status: "downloading", downloadPercent: 0, message: null, errorContext: null, canRetry: false, }; } export function reduceDesktopUpdateStateOnDownloadFailure( state: DesktopUpdateState, message: string, ): DesktopUpdateState { return { ...state, status: nextStatusAfterDownloadFailure(state), message, downloadPercent: null, errorContext: "download", canRetry: getCanRetryAfterDownloadFailure(state), }; } export function reduceDesktopUpdateStateOnDownloadProgress( state: DesktopUpdateState, percent: number, ): DesktopUpdateState { return { ...state, status: "downloading", downloadPercent: percent, message: null, errorContext: null, canRetry: false, }; } export function reduceDesktopUpdateStateOnDownloadComplete( state: DesktopUpdateState, version: string, ): DesktopUpdateState { return { ...state, status: "downloaded", availableVersion: version, downloadedVersion: version, downloadPercent: 100, message: null, errorContext: null, canRetry: true, }; } export function reduceDesktopUpdateStateOnInstallFailure( state: DesktopUpdateState, message: string, ): DesktopUpdateState { return { ...state, status: "downloaded", message, errorContext: "install", canRetry: true, }; }