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<DesktopUpdateReleaseNote> = [],): 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, };}
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<DesktopUpdateReleaseNote> = [],
): 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,
};
}