180 lines · 3.9 KB · TypeScript
RawDownload
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,  };}