{"version":3,"file":"uploadProgress.mjs","sources":["../../../../admin/src/future/store/uploadProgress.ts"],"sourcesContent":["import { createSlice, type PayloadAction } from '@reduxjs/toolkit';\n\nimport type { File } from '../../../../shared/contracts/files';\n\nexport interface FileUploadError {\n  name: string;\n  message: string;\n}\n\nexport type FileProgressStatus = 'pending' | 'uploading' | 'complete' | 'error' | 'cancelled';\n\nexport interface FileProgress {\n  name: string;\n  index: number;\n  status: FileProgressStatus;\n  size: number;\n  file?: File;\n  error?: string;\n}\n\nexport interface UploadProgressState {\n  isVisible: boolean;\n  isMinimized: boolean;\n  progress: number;\n  totalFiles: number;\n  files: FileProgress[];\n  errors: FileUploadError[];\n  uploadId: number;\n}\n\nexport interface RootState {\n  uploadProgress: UploadProgressState;\n}\n\nconst initialState: UploadProgressState = {\n  isVisible: false,\n  isMinimized: false,\n  progress: 0,\n  totalFiles: 0,\n  files: [],\n  errors: [],\n  uploadId: 0,\n};\n\nconst computeProgress = (files: FileProgress[]): number => {\n  if (files.length === 0) return 0;\n  const totalSize = files.reduce((sum, f) => sum + f.size, 0);\n  if (totalSize === 0) {\n    // Fallback to count-based if sizes are unknown\n    const completed = files.filter(\n      (f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled'\n    ).length;\n    return Math.round((completed / files.length) * 100);\n  }\n  const completedSize = files\n    .filter((f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled')\n    .reduce((sum, f) => sum + f.size, 0);\n  return Math.round((completedSize / totalSize) * 100);\n};\n\nconst uploadProgressSlice = createSlice({\n  name: 'uploadProgress',\n  initialState,\n  reducers: {\n    openUploadProgress(\n      state,\n      action: PayloadAction<{\n        totalFiles: number;\n        fileNames: string[];\n        fileSizes?: number[];\n      }>\n    ) {\n      state.isVisible = true;\n      state.isMinimized = false;\n      state.progress = 0;\n\n      // Create pending files for upload\n      const pendingFiles: FileProgress[] = action.payload.fileNames.map((name, index) => ({\n        name,\n        index,\n        status: 'pending' as FileProgressStatus,\n        size: action.payload.fileSizes?.[index] ?? 0,\n      }));\n\n      state.files = pendingFiles;\n      state.totalFiles = action.payload.totalFiles;\n      state.errors = [];\n      state.uploadId += 1;\n    },\n    setFileUploading(\n      state,\n      action: PayloadAction<{ name: string; index: number; total: number; size: number }>\n    ) {\n      const { index, size } = action.payload;\n      if (state.files[index]) {\n        state.files[index].status = 'uploading';\n        state.files[index].size = size;\n      }\n    },\n    setFileComplete(state, action: PayloadAction<{ index: number; file: File }>) {\n      const { index, file } = action.payload;\n      if (state.files[index]) {\n        state.files[index].status = 'complete';\n        state.files[index].file = file;\n      }\n      state.progress = computeProgress(state.files);\n    },\n    setFileError(state, action: PayloadAction<{ index: number; name: string; message: string }>) {\n      const { index, name, message } = action.payload;\n      if (state.files[index]) {\n        state.files[index].status = 'error';\n        state.files[index].error = message;\n      }\n      state.errors = [...state.errors, { name, message }];\n      state.progress = computeProgress(state.files);\n    },\n    updateProgress(state, action: PayloadAction<number>) {\n      state.progress = action.payload;\n    },\n    addUploadErrors(state, action: PayloadAction<FileUploadError[]>) {\n      state.errors = [...state.errors, ...action.payload];\n    },\n    closeUploadProgress(state) {\n      state.isVisible = false;\n      state.isMinimized = false;\n      state.progress = 0;\n      state.totalFiles = 0;\n      state.files = [];\n      state.errors = [];\n    },\n    toggleMinimize(state) {\n      state.isMinimized = !state.isMinimized;\n    },\n    cancelUpload(state) {\n      // Mark all pending and uploading files as cancelled\n      state.files = state.files.map((file) => {\n        if (file.status === 'pending' || file.status === 'uploading') {\n          return { ...file, status: 'cancelled' as FileProgressStatus };\n        }\n        return file;\n      });\n      state.progress = computeProgress(state.files);\n    },\n    setUploadFailed(state, action: PayloadAction<{ message: string }>) {\n      // Mark all pending and uploading files as errored when a catastrophic failure occurs\n      state.files = state.files.map((file) => {\n        if (file.status === 'pending' || file.status === 'uploading') {\n          return {\n            ...file,\n            status: 'error' as FileProgressStatus,\n            error: action.payload.message,\n          };\n        }\n        return file;\n      });\n      state.progress = 100;\n      state.errors = [...state.errors, { name: 'Upload Error', message: action.payload.message }];\n    },\n    retryCancelledFiles(state) {\n      // Reset all cancelled files back to pending for retry\n      state.files = state.files.map((file) => {\n        if (file.status === 'cancelled') {\n          return {\n            ...file,\n            status: 'pending' as FileProgressStatus,\n          };\n        }\n        return file;\n      });\n      state.progress = computeProgress(state.files);\n    },\n  },\n});\n\nexport const {\n  openUploadProgress,\n  setFileUploading,\n  setFileComplete,\n  setFileError,\n  updateProgress,\n  addUploadErrors,\n  closeUploadProgress,\n  toggleMinimize,\n  cancelUpload,\n  setUploadFailed,\n  retryCancelledFiles,\n} = uploadProgressSlice.actions;\n\nexport const uploadProgressReducer = uploadProgressSlice.reducer;\n"],"names":["initialState","isVisible","isMinimized","progress","totalFiles","files","errors","uploadId","computeProgress","length","totalSize","reduce","sum","f","size","completed","filter","status","Math","round","completedSize","uploadProgressSlice","createSlice","name","reducers","openUploadProgress","state","action","pendingFiles","payload","fileNames","map","index","fileSizes","setFileUploading","setFileComplete","file","setFileError","message","error","updateProgress","addUploadErrors","closeUploadProgress","toggleMinimize","cancelUpload","setUploadFailed","retryCancelledFiles","actions","uploadProgressReducer","reducer"],"mappings":"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"}