{"version":3,"file":"FileService.mock.jsx","sourceRoot":"","sources":["../../../src/core/File/FileService.mock.tsx"],"names":[],"mappings":"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","sourcesContent":["import { createContext, useState, useCallback, useMemo } from 'react';\nimport type { ReactNode, FunctionComponent, Dispatch, SetStateAction } from 'react';\n\nimport { createUID, hasProp, useAfterInitialEffect } from '@pega/cosmos-react-core';\nimport type { FileUploadItemProps, FileItemProps, OmitStrict } from '@pega/cosmos-react-core';\n\n// -----------------------------------------------------------------------------\n// MockFileResourceObject\n// -----------------------------------------------------------------------------\nexport interface MockFileAttachmentResource {\n  id: string;\n  name: string;\n  category: string;\n  thumbnail?: string;\n  createDate?: number;\n  modifiedDate?: number;\n}\n\n// -----------------------------------------------------------------------------\n// MockFileSelectionObject\n// -----------------------------------------------------------------------------\nexport interface MockFileUploadItem\n  extends Pick<MockFileAttachmentResource, 'id' | 'category'>,\n    OmitStrict<FileUploadItemProps, 'id'> {\n  File: File;\n}\n\nexport interface MockFileItem\n  extends OmitStrict<FileItemProps, 'id'>,\n    Pick<MockFileAttachmentResource, 'id' | 'category'> {\n  File: File;\n}\n\n// -----------------------------------------------------------------------------\n// FileServiceContextValue\n// -----------------------------------------------------------------------------\nexport interface FileServiceContextValue {\n  files: (MockFileAttachmentResource | MockFileUploadItem | MockFileItem)[];\n  setFiles: Dispatch<SetStateAction<FileServiceContextValue['files']>>;\n  attachFile: (file: MockFileItem) => void;\n  cancelFile: (id: MockFileAttachmentResource['id']) => void;\n  deleteFile: (id: MockFileAttachmentResource['id']) => void;\n}\n\n// -----------------------------------------------------------------------------\n// FileServiceContext\n// -----------------------------------------------------------------------------\nexport const FileServiceContext = createContext<FileServiceContextValue>({\n  files: [],\n  setFiles: () => {},\n  attachFile: () => {},\n  cancelFile: () => {},\n  deleteFile: () => {}\n});\n\n// -----------------------------------------------------------------------------\n// FilePostArg\n// -----------------------------------------------------------------------------\ninterface FilePostArg {\n  file: MockFileUploadItem | MockFileItem;\n  onProgress: (file: MockFileUploadItem | MockFileItem, progress: number) => void;\n  onLoad: (file: MockFileUploadItem | MockFileItem) => void;\n  currentProgress: number;\n}\n\n// -----------------------------------------------------------------------------\n// postFile\n// -----------------------------------------------------------------------------\nconst postFile = ({ file, onProgress, onLoad, currentProgress }: FilePostArg) => {\n  onProgress(file, currentProgress);\n  setTimeout(() => {\n    const progress = currentProgress + 5;\n    if (progress <= 100) postFile({ file, onProgress, onLoad, currentProgress: progress });\n    else onLoad(file);\n  }, 100);\n};\n\n// Mock date generator\nconst getMockPriorDate = (h: number) => {\n  const d = new Date();\n  return d.setHours(d.getHours() - h);\n};\n\nexport const mockCategories: ('HR' | 'Marketing' | 'Sales' | 'Accounting' | 'Engineering')[] = [\n  'HR',\n  'Marketing',\n  'Sales',\n  'Accounting',\n  'Engineering'\n];\n\nexport const mockAttachmentListRequest = (): Promise<MockFileAttachmentResource[]> => {\n  return new Promise(resolve => {\n    setTimeout(() => {\n      resolve([\n        {\n          id: createUID(),\n          name: 'File.doc',\n          category: mockCategories[0],\n          createDate: getMockPriorDate(1)\n        },\n        {\n          id: createUID(),\n          name: 'File.ppt',\n          category: mockCategories[1],\n          createDate: getMockPriorDate(4)\n        },\n        {\n          id: createUID(),\n          name: 'File.xls',\n          category: mockCategories[2],\n          createDate: getMockPriorDate(30)\n        },\n        {\n          id: createUID(),\n          name: 'emptyFile',\n          category: '',\n          createDate: getMockPriorDate(144)\n        }\n      ]);\n    }, 1000);\n  });\n};\n\n// -----------------------------------------------------------------------------\n// Provider\n// -----------------------------------------------------------------------------\nconst Provider: FunctionComponent<{ children: ReactNode }> = ({ children }) => {\n  const [files, setFiles] = useState<FileServiceContextValue['files']>([]);\n\n  const attachFile = useCallback(\n    (file: MockFileUploadItem | MockFileItem) => {\n      if (files.some(f => f.id === file.id)) return;\n      setFiles(current => [file, ...current]);\n    },\n    [files]\n  );\n\n  // Remove a file from the state array\n  const cancelFile = (id: MockFileUploadItem['id'] | MockFileItem['id']) => {\n    setFiles(current => current.filter(f => f.id !== id));\n  };\n\n  // Mock an api request and remove a file from the state array\n  const deleteFile = useCallback(\n    async (id: MockFileUploadItem['id']) => {\n      const file = files.find(f => f.id === id) as MockFileAttachmentResource;\n      setFiles(current => current.filter(f => f.id !== file.id));\n    },\n    [files]\n  );\n\n  const setProgress = useCallback((file: MockFileUploadItem | MockFileItem, progress?: number) => {\n    setFiles(current =>\n      current.map(f => {\n        if (file.id === f.id) {\n          (f as MockFileUploadItem | MockFileItem).progress = progress;\n        }\n        return f;\n      })\n    );\n  }, []);\n\n  useAfterInitialEffect(() => {\n    files.forEach(file => {\n      // Return if we have a mock attachment resource object or a File object that is currently uploading.\n      if (!hasProp(file, 'File') || typeof file.progress === 'number') return;\n\n      // For each File in the array, not uploaded yet, mock the upload progress.\n      postFile({\n        file,\n        onProgress: setProgress,\n        currentProgress: 0,\n        onLoad(loadedFile) {\n          setFiles(cur => {\n            return cur.map(f => {\n              if (f.id === loadedFile.id) {\n                return {\n                  ...loadedFile,\n                  createDate: Date.now()\n                };\n              }\n\n              return f;\n            });\n          });\n        }\n      });\n    });\n  }, [files.length, setProgress]);\n\n  const value: FileServiceContextValue = useMemo(\n    () => ({\n      files,\n      setFiles,\n      attachFile,\n      cancelFile,\n      deleteFile\n    }),\n    [files, attachFile, cancelFile, deleteFile]\n  );\n\n  return <FileServiceContext.Provider value={value}>{children}</FileServiceContext.Provider>;\n};\n\nexport default Provider;\n"]}