import { mapProp, Update } from "@/hooks/useStore"; import { getMediaTypeForFile } from "common/MediaType"; export function FileReducer(prev: FileReducer.State, action: FileReducer.Action): FileReducer.State { switch (action.type) { case "reset": return FileReducer.initial; case "file": if (prev.file !== null) { if (action.file !== null) { if (prev.file.name === prev.filename && getMediaTypeForFile(prev.file) === prev.mediaType) { return Object.freeze({ filename: action.file.name, mediaType: getMediaTypeForFile(action.file), file: action.file, }); } else { return mapProp("file", action.file as File | null)(prev); } } else { if (prev.file.name === prev.filename && prev.file.type === prev.mediaType) { return FileReducer.initial; } else { return mapProp("file", action.file as File | null)(prev); } } } else { if (action.file !== null) { if (prev.filename === "" && prev.mediaType === "") { return Object.freeze({ filename: action.file.name, mediaType: getMediaTypeForFile(action.file), file: action.file, }); } else { return mapProp("file", action.file as File | null)(prev); } } else { return prev; } } case "filename": return mapProp("filename", action.filename)(prev); case "mediaType": return mapProp("mediaType", action.mediaType)(prev); } } export namespace FileReducer { export interface ResetAction { readonly type: "reset"; } export const reset: ResetAction = Object.freeze({ type: "reset", }); export interface SetFileAction { readonly type: "file"; readonly file: File | null; } export function setFile(file: File | null): SetFileAction { return Object.freeze({ type: "file", file, }); } export interface SetFilenameAction { readonly type: "filename"; readonly filename: Update; } export function setFilename(filename: Update): SetFilenameAction { return Object.freeze({ type: "filename", filename, }); } export interface SetMediaTypeAction { readonly type: "mediaType"; readonly mediaType: Update; } export function setMediaType(mediaType: Update): SetMediaTypeAction { return Object.freeze({ type: "mediaType", mediaType, }); } export type Action = ResetAction | SetFileAction | SetFilenameAction | SetMediaTypeAction; export interface State { readonly filename: string; readonly mediaType: string; readonly file: File | null; } export const initial: State = Object.freeze({ filename: "", mediaType: "", file: null, }); }