{"version":3,"file":"uploadManager.mjs","names":["c","_c","createContext","use","useState","useCallback","useEffect","useRef","Button","useMediaCloudEmitter","useErrorHandler","MediaCloudErrors","jsx","_jsx","jsxs","_jsxs","UploadManagerContext","showUploadManager","activeUploads","addUpload","updateUpload","UploadManagerProvider","args","$","children","setShowUploadManager","t0","Symbol","for","setActiveUploads","activeTab","setActiveTab","emitter","activeTabRef","activeUploadsRef","logError","t1","t2","current","t3","t4","t5","uploads","hasActiveUploads","some","_temp","hasProcessingUploads","_temp2","hasCompletedUploads","_temp3","checkAutoSwitchToCompleted","t6","t7","pollingUploads","filter","_temp4","length","pollAssets","pollingUpload","response","fetch","pollingUrl","uploadId","method","credentials","ok","data","json","ready","prev","updatedUploads","map","upload_3","upload","polling","progress","status","setTimeout","t8","UPLOAD_POLLING_ERROR","message","intervalId","setInterval","clearInterval","event","filename","error","TUS_UPLOAD_ERROR","prev_0","upload_4","onUploadError","t9","event_0","upload_5","prev_1","onAddUpload","t10","event_1","filename_0","prev_2","upload_6","undefined","onUpdateUpload","t11","event_2","prev_3","upload_7","onRemoveUpload","t12","event_3","upload_9","find","upload_8","prev_4","upload_10","prev_5","updatedUploads_0","upload_11","onUploadComplete","t13","t14","on","off","t15","args_0","filename_1","t16","polling_0","upload_12","prev_6","args_1","filename_2","progress_0","polling_1","prev_7","upload_13","T0","t17","t18","uploadingFiles","_temp5","processingFiles","_temp6","completedFiles","_temp7","t19","renderUploadList","args_2","uploads_0","_temp8","t20","closeUploadManager","hasPollingUploads","_temp9","t21","value","Provider","className","buttonStyle","icon","margin","onClick","size","_temp0","window","location","reload","upload_18","upload_17","index","Math","ceil","style","upload_16","upload_15","upload_14","upload_2","upload_1","upload_0","useUploadManagerContext"],"sources":["../../../src/components/uploadManager/uploadManager.tsx"],"sourcesContent":["'use client'\n\nimport {\n  createContext,\n  use,\n  useState,\n  useCallback,\n  useEffect,\n  useRef,\n} from 'react'\nimport { Button } from '@payloadcms/ui'\n\nimport { useMediaCloudEmitter } from '../../hooks/useMediaCloudEmitter'\nimport { useErrorHandler } from '../../hooks/useErrorHandler'\nimport { MediaCloudErrors } from '../../types/errors'\n\nimport type { MediaCloudEmitterEvents } from '../../types'\nimport type React from 'react'\n\nimport './uploadManager.css'\n\ninterface Upload {\n  filename: string\n  progress: number\n  uploadId?: string\n  error?: string\n  polling?: boolean\n  pollingUrl?: string\n  status?: 'uploading' | 'processing' | 'completed'\n}\n\ninterface UploadManagerContextType {\n  showUploadManager?: boolean\n  activeUploads: Upload[]\n  addUpload: (args: MediaCloudEmitterEvents['addUpload']) => void\n  updateUpload: (args: MediaCloudEmitterEvents['updateUpload']) => void\n}\n\ninterface UploadManagerProviderArgs {\n  children: React.ReactNode\n}\n\ninterface RenderUploadListArgs {\n  uploads: Upload[]\n}\n\nconst UploadManagerContext = createContext<UploadManagerContextType>({\n  showUploadManager: false,\n  activeUploads: [],\n  addUpload: () => {},\n  updateUpload: () => {},\n})\n\n/**\n * Provider component for upload management context\n * @param args - Arguments including children to wrap\n * @returns JSX element providing upload management context\n */\nexport function UploadManagerProvider(args: UploadManagerProviderArgs) {\n  const { children } = args\n  const [showUploadManager, setShowUploadManager] = useState(false)\n  const [activeUploads, setActiveUploads] = useState<Upload[]>([])\n  const [activeTab, setActiveTab] = useState<\n    'uploading' | 'processing' | 'completed'\n  >('uploading')\n\n  const emitter = useMediaCloudEmitter()\n  const activeTabRef = useRef(activeTab)\n  const activeUploadsRef = useRef(activeUploads)\n\n  const { logError } = useErrorHandler()\n\n  // Keep refs in sync with state\n  useEffect(() => {\n    activeTabRef.current = activeTab\n  }, [activeTab])\n\n  useEffect(() => {\n    activeUploadsRef.current = activeUploads\n  }, [activeUploads])\n\n  // Helper function to check if we should auto-switch to completed tab\n  const checkAutoSwitchToCompleted = useCallback((uploads: Upload[]) => {\n    const hasActiveUploads = uploads.some(\n      (upload) => upload.status === 'uploading'\n    )\n    const hasProcessingUploads = uploads.some(\n      (upload) => upload.status === 'processing'\n    )\n    const hasCompletedUploads = uploads.some(\n      (upload) => upload.status === 'completed'\n    )\n\n    // Auto-switch to completed tab if no uploading/processing uploads remain\n    if (\n      !hasActiveUploads &&\n      !hasProcessingUploads &&\n      hasCompletedUploads &&\n      activeTabRef.current !== 'completed'\n    ) {\n      setActiveTab('completed')\n    }\n  }, [])\n\n  // Polling logic\n  useEffect(() => {\n    const pollingUploads = activeUploads.filter(\n      (upload) => upload.polling && upload.pollingUrl\n    )\n\n    if (pollingUploads.length === 0) {\n      return\n    }\n\n    const pollAssets = async () => {\n      for (const pollingUpload of pollingUploads) {\n        try {\n          const response = await fetch(\n            `${pollingUpload.pollingUrl}?upload_id=${pollingUpload.uploadId}`,\n            {\n              method: 'GET',\n              credentials: 'include',\n            }\n          )\n\n          if (response.ok) {\n            const data = await response.json()\n\n            if (data.ready) {\n              // Asset is ready, stop polling for this upload\n              setActiveUploads((prev) => {\n                const updatedUploads = prev.map((upload) =>\n                  upload.uploadId === pollingUpload.uploadId\n                    ? {\n                        ...upload,\n                        polling: false,\n                        progress: 100,\n                        status: 'completed' as const,\n                      }\n                    : upload\n                )\n\n                // Check if we should auto-switch to completed tab\n                setTimeout(() => checkAutoSwitchToCompleted(updatedUploads), 0)\n\n                return updatedUploads\n              })\n            }\n          }\n        } catch (_error) {\n          logError(MediaCloudErrors.UPLOAD_POLLING_ERROR.message)\n        }\n      }\n    }\n\n    const intervalId = setInterval(pollAssets, 2000) // Poll every 2 seconds\n\n    return () => clearInterval(intervalId)\n  }, [activeUploads, checkAutoSwitchToCompleted, logError])\n\n  /**\n   * Handles the 'uploadError' event\n   * @param event - The upload error event\n   */\n  const onUploadError = useCallback(\n    (event: MediaCloudEmitterEvents['uploadError']) => {\n      const { filename, error } = event\n\n      logError(MediaCloudErrors.TUS_UPLOAD_ERROR.message)\n\n      setActiveUploads((prev) =>\n        prev.map((upload) =>\n          upload.filename === filename\n            ? { ...upload, error: error, status: 'completed' }\n            : upload\n        )\n      )\n    },\n    [logError]\n  )\n\n  /**\n   * Handles the 'addUpload' event\n   * @param event - The add upload event\n   */\n  const onAddUpload = useCallback(\n    (event: MediaCloudEmitterEvents['addUpload']) => {\n      const upload: Upload = {\n        filename: event.filename,\n        uploadId: event.uploadId,\n        progress: 0,\n        polling: event.polling,\n        pollingUrl: event.pollingUrl,\n        status: 'uploading',\n      }\n\n      setActiveUploads((prev) => [...prev, upload])\n\n      // Show the upload manager when new upload starts\n      setShowUploadManager(true)\n\n      // Auto-switch to uploading tab when new upload starts\n      if (activeTabRef.current !== 'uploading') {\n        setActiveTab('uploading')\n      }\n    },\n    []\n  )\n\n  /**\n   * Handles the 'updateUpload' event\n   * @param event - The update upload event\n   */\n  const onUpdateUpload = useCallback(\n    (event: MediaCloudEmitterEvents['updateUpload']) => {\n      const { filename, progress, polling } = event\n      setActiveUploads((prev) =>\n        prev.map((upload) =>\n          upload.filename === filename\n            ? {\n                ...upload,\n                progress,\n                ...(polling !== undefined && { polling }),\n                status: polling\n                  ? 'processing'\n                  : progress >= 100\n                    ? 'completed'\n                    : 'uploading',\n              }\n            : upload\n        )\n      )\n    },\n    []\n  )\n\n  /**\n   * Handles the 'removeUpload' event\n   * @param event - The remove upload event\n   */\n  const onRemoveUpload = useCallback(\n    (event: MediaCloudEmitterEvents['removeUpload']) => {\n      setActiveUploads((prev) =>\n        prev.filter((upload) => upload.filename !== event.filename)\n      )\n    },\n    []\n  )\n\n  /**\n   * Handles the 'uploadComplete' event\n   * @param event - The upload completed event\n   */\n  const onUploadComplete = useCallback(\n    (event: MediaCloudEmitterEvents['uploadComplete']) => {\n      // Check if this upload has a polling URL (Mux upload)\n      const upload = activeUploadsRef.current.find(\n        (upload) => upload.filename === event.filename\n      )\n      if (upload?.pollingUrl) {\n        setActiveUploads((prev) =>\n          prev.map((upload) =>\n            upload.filename === event.filename\n              ? {\n                  ...upload,\n                  polling: true,\n                  progress: 100,\n                  status: 'processing' as const,\n                }\n              : upload\n          )\n        )\n      } else {\n        // Regular upload completion\n        setActiveUploads((prev) => {\n          const updatedUploads = prev.map((upload) =>\n            upload.filename === event.filename\n              ? { ...upload, progress: 100, status: 'completed' as const }\n              : upload\n          )\n\n          // Check if we should auto-switch to completed tab\n          setTimeout(() => checkAutoSwitchToCompleted(updatedUploads), 0)\n\n          return updatedUploads\n        })\n      }\n    },\n    [checkAutoSwitchToCompleted]\n  )\n\n  useEffect(() => {\n    emitter.on('addUpload', onAddUpload)\n    emitter.on('updateUpload', onUpdateUpload)\n    emitter.on('removeUpload', onRemoveUpload)\n    emitter.on('uploadError', onUploadError)\n    emitter.on('uploadComplete', onUploadComplete)\n\n    return () => {\n      emitter.off('addUpload', onAddUpload)\n      emitter.off('updateUpload', onUpdateUpload)\n      emitter.off('removeUpload', onRemoveUpload)\n      emitter.off('uploadError', onUploadError)\n      emitter.off('uploadComplete', onUploadComplete)\n    }\n  }, [\n    emitter,\n    onAddUpload,\n    onUpdateUpload,\n    onRemoveUpload,\n    onUploadError,\n    onUploadComplete,\n  ])\n\n  /**\n   * Adds a new upload to the manager\n   * @param args - The upload arguments\n   */\n  const addUpload = useCallback(\n    (args: MediaCloudEmitterEvents['addUpload']) => {\n      const { filename, polling = false, pollingUrl } = args\n      const upload: Upload = {\n        filename,\n        progress: 0,\n        polling,\n        pollingUrl,\n        status: 'uploading',\n      }\n\n      setActiveUploads((prev) => [...prev, upload])\n    },\n    []\n  )\n\n  /**\n   * Updates an existing upload in the manager\n   * @param args - The update arguments\n   */\n  const updateUpload = useCallback(\n    (args: MediaCloudEmitterEvents['updateUpload']) => {\n      const { filename, progress, polling } = args\n      setActiveUploads((prev) =>\n        prev.map((upload) =>\n          upload.filename === filename\n            ? {\n                ...upload,\n                progress,\n                ...(polling !== undefined && { polling }),\n                status: polling\n                  ? 'processing'\n                  : progress >= 100\n                    ? 'completed'\n                    : 'uploading',\n              }\n            : upload\n        )\n      )\n    },\n    []\n  )\n\n  // Filter uploads by status\n  const uploadingFiles = activeUploads.filter(\n    (upload) => upload.status === 'uploading'\n  )\n  const processingFiles = activeUploads.filter(\n    (upload) => upload.status === 'processing'\n  )\n  const completedFiles = activeUploads.filter(\n    (upload) => upload.status === 'completed'\n  )\n\n  /**\n   * Renders the upload list\n   * @param args - The render arguments\n   * @returns JSX element representing the upload list\n   */\n  function renderUploadList(args: RenderUploadListArgs) {\n    const { uploads } = args\n    return (\n      <ul>\n        {uploads.map((upload, index) => (\n          <li key={`${upload.filename}-${index}`} data-status={upload.status}>\n            <div className=\"upload-info\">\n              <span className=\"upload-filename\">{upload.filename}</span>\n              <span className=\"upload-meta\">\n                {upload.status === 'processing'\n                  ? 'Processing...'\n                  : upload.progress < 100\n                    ? `${Math.ceil(upload.progress)}%`\n                    : 'Completed'}\n              </span>\n            </div>\n            <div\n              className=\"upload-progress-bar\"\n              style={\n                {\n                  ['--progress']:\n                    upload.status === 'processing'\n                      ? '1'\n                      : `${upload.progress / 100}`,\n                } as React.CSSProperties\n              }\n            >\n              <div\n                data-active={upload.status === 'processing'}\n                className=\"upload-progress\"\n              />\n            </div>\n          </li>\n        ))}\n      </ul>\n    )\n  }\n\n  /**\n   * Closes the upload manager\n   */\n  function closeUploadManager() {\n    // Only allow closing if no uploads are actively polling\n    const hasPollingUploads = activeUploads.some((upload) => upload.polling)\n    if (!hasPollingUploads) {\n      setActiveUploads([])\n      setShowUploadManager(false)\n    }\n  }\n\n  const value: UploadManagerContextType = {\n    activeUploads,\n    addUpload,\n    updateUpload,\n  }\n\n  return (\n    <UploadManagerContext.Provider value={value}>\n      {showUploadManager && (\n        <div className=\"upload-manager\">\n          <div className=\"upload-manager__header\">\n            <h4>Uploads</h4>\n            <Button\n              buttonStyle=\"icon-label\"\n              icon=\"x\"\n              margin={false}\n              onClick={closeUploadManager}\n            />\n          </div>\n\n          <div className=\"upload-manager__tabs\">\n            <button\n              data-active={activeTab === 'uploading'}\n              className=\"upload-tab\"\n              onClick={() => setActiveTab('uploading')}\n            >\n              Uploading ({uploadingFiles.length})\n            </button>\n            <button\n              data-active={activeTab === 'processing'}\n              className=\"upload-tab\"\n              onClick={() => setActiveTab('processing')}\n            >\n              Processing ({processingFiles.length})\n            </button>\n            <button\n              data-active={activeTab === 'completed'}\n              className=\"upload-tab\"\n              onClick={() => setActiveTab('completed')}\n            >\n              Completed ({completedFiles.length})\n            </button>\n          </div>\n\n          <div className=\"upload-manager__content\">\n            {activeTab === 'uploading' && uploadingFiles.length > 0 && (\n              <div>{renderUploadList({ uploads: uploadingFiles })}</div>\n            )}\n            {activeTab === 'processing' && processingFiles.length > 0 && (\n              <div>{renderUploadList({ uploads: processingFiles })}</div>\n            )}\n            {activeTab === 'completed' && completedFiles.length > 0 && (\n              <div>\n                {renderUploadList({ uploads: completedFiles })}\n                <div className=\"upload-manager__footer\">\n                  <Button\n                    buttonStyle=\"subtle\"\n                    size=\"small\"\n                    margin={false}\n                    onClick={() => window?.location?.reload()}\n                  >\n                    Refresh\n                  </Button>\n                </div>\n              </div>\n            )}\n            {((activeTab === 'uploading' && uploadingFiles.length === 0) ||\n              (activeTab === 'processing' && processingFiles.length === 0) ||\n              (activeTab === 'completed' && completedFiles.length === 0)) && (\n              <p className=\"upload-empty-state\">No {activeTab} files</p>\n            )}\n          </div>\n        </div>\n      )}\n      {children}\n    </UploadManagerContext.Provider>\n  )\n}\n\nexport const useUploadManagerContext = () => use(UploadManagerContext)\n"],"mappings":"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"}