{"version":3,"sources":["component/Placeholder/TextLoading.js","middleware/Api.ts","component/Dial/AutoHidden.js","redux/explorer/reducer.ts","services/navigate.ts","services/file.ts","redux/explorer/async.ts","utils/page.ts","middleware/Auth.ts","redux/explorer/index.ts","component/Uploader/core/utils/pool.ts","component/Uploader/core/utils/validator.ts","component/Uploader/core/utils/request.ts","i18n.ts","component/Navbar/DarkModeSwitcher.js","component/FileManager/Navigator/SubActions.js","component/Modals/OptionSelector.js","component/Dial/Save.js","component/Modals/Loading.js","component/Modals/Copy.js","component/Modals/DirectoryDownload.js","component/Modals/CreateShare.js","component/Modals/Decompress.js","component/Modals/Compress.js","component/FileManager/Modals.js","component/Viewer/Text.js","component/Viewer/Code.js","utils/index.js","component/Uploader/core/errors/index.ts","component/Common/Snackbar.js","component/Navbar/UserAvatarPopover.js","component/Navbar/UserAvatar.js","component/Navbar/Navbar.js","component/Navbar/SearchBar.js","component/Uploader/core/utils/helper.ts","component/Uploader/core/utils/index.ts","component/Navbar/StorageBar.js","component/Navbar/UserInfo.js","component/Navbar/FileTags.js","utils/zip.js","utils/api.ts","utils/filesystem.ts","redux/explorer/action.ts","component/FileManager/ImgPreview.js","component/Uploader/core/types.ts","component/Uploader/core/uploader/base.ts","component/Uploader/core/logger.ts","component/Uploader/core/api/index.ts","component/Uploader/core/index.ts","component/Uploader/core/uploader/chunk.ts","component/Uploader/core/uploader/local.ts","component/Uploader/core/uploader/remote.ts","component/Uploader/core/uploader/onedrive.ts","component/Uploader/core/uploader/oss.ts","component/Uploader/core/uploader/qiniu.ts","component/Uploader/core/uploader/cos.ts","component/Uploader/core/uploader/upyun.ts","component/Uploader/core/uploader/s3.ts","component/Uploader/core/uploader/placeholder.ts","component/Dial/Create.js","component/Uploader/Popup/TaskDetail.js","component/Uploader/Popup/UploadTask.js","component/Uploader/UseUpload.js","component/Modals/ConcurrentOption.js","component/Uploader/Popup/MoreActions.js","component/Uploader/Popup/TaskList.js","component/Placeholder/DropFile.js","component/Uploader/Uploader.js","config.ts","redux/viewUpdate/action.ts","utils/datetime.js","component/FileManager/TypeIcon.js","serviceWorker.js","middleware/AuthRoute.js","middleware/NoAuthRoute.js","component/Share/NotFound.js","component/Placeholder/Captcha.js","hooks/normal.js","component/Login/ReCaptchaWrapper.js","component/Login/ReCaptcha.js","hooks/recaptcha.js","hooks/tcaptcha.js","hooks/useCaptcha.js","component/Login/LoginForm.js","component/FileManager/FileName.js","component/FileManager/SmallIcon.js","component/FileManager/FileIcon.js","component/FileManager/Folder.js","component/FileManager/DnD/Preview.js","component/FileManager/DnD/DragLayer.js","component/FileManager/ContextMenu.js","component/FileManager/TableRow.js","component/FileManager/DnD/DropWarpper.js","component/FileManager/DnD/Scrolling.js","component/FileManager/ObjectIcon.js","component/FileManager/Explorer.js","hooks/pagination.js","component/FileManager/Navigator/PathButton.js","component/FileManager/Navigator/DropDownItem.js","component/FileManager/Navigator/DropDown.js","component/FileManager/Navigator/Navigator.js","component/Placeholder/ListLoading.js","component/FileManager/Sidebar/SideDrawer.js","component/FileManager/PaginationItem.js","component/FileManager/Pagination.js","component/FileManager/FileManager.js","component/Viewer/SelectMenu.js","component/Viewer/Video.js","component/Share/SearchResult.js","component/Share/MyShare.js","component/Modals/SelectFile.js","component/Download/DownloadingCard.js","component/Download/FinishedCard.js","component/Dial/Aria2.js","component/Download/Download.js","component/Placeholder/PageLoading.js","component/Share/LockedFile.js","component/Share/Creator.js","component/Share/SharedFile.js","component/Share/SharedFolder.js","component/Share/SharePreload.js","component/Viewer/Doc.js","component/Modals/CreateWebDAVAccount.js","component/Setting/WebDAV.js","component/Setting/Tasks.js","component/Setting/Profile.js","component/Setting/Authn.js","component/Modals/TimeZone.js","component/Setting/UserSetting.js","component/Login/Register.js","component/Login/Activication.js","component/Login/ResetForm.js","component/Login/Reset.js","component/FileManager/MusicPlayer.js","component/Viewer/Epub.js","App.js","middleware/Init.js","redux/viewUpdate/reducer.ts","reducers/index.js","component/Placeholder/ErrorBoundary.js","index.js","redux/combineReducers.ts","component/Placeholder/Nothing.js","component/FileManager/PathSelector.js","hooks/fileSubtitle.js"],"names":["useStyles","makeStyles","theme","loader","width","padding","breakpoints","down","MyLoader","props","backgroundColor","dark","foregroundColor","className","TextLoading","useTheme","classes","palette","type","baseURL","getBaseURL","getPreviewURL","isShare","shareID","fileID","path","encodeURIComponent","instance","axios","create","withCredentials","AppError","message","code","error","i18next","exists","ns","t","includes","stack","Error","interceptors","response","use","rawData","data","undefined","Auth","signout","window","location","href","msg","Promise","reject","AutoHidden","children","enable","hide","element","useState","hidden","setHidden","prev","scrollY","lastUpdate","useEffect","addEventListener","e","currentTarget","current","scrollTop","handleNavigation","in","initState","dndSignal","dndTarget","dndSource","fileList","dirList","selected","selectProps","isMultiple","withFolder","withFile","withSourceEnabled","lastSelect","file","id","name","size","date","create_date","index","shiftSelectedIds","imgPreview","first","other","audioPreview","playingName","paused","isOpen","fileSave","sideBarOpen","checkSelectedProps","length","forEach","value","source_enabled","explorer","state","action","Object","assign","target","source","list","addedSelected","targets","newSelected","fileIds","filteredSelected","filter","search","keywords","searchPath","open","currentPolicy","policy","share","a","apiURL","key","API","get","getDownloadURL","reqURL","downloadPath","put","askForOption","options","title","dispatch","getState","resolve","dialog","setOptionModal","onClose","callback","option","statusHelper","isHomePage","isSharePage","startsWith","isAdminPage","isLoginPage","isMobile","innerWidth","getValueWithDefault","defaultValue","JSON","parse","localStorage","getItem","isAuthenticated","_user","anonymous","group","tags","_preference","authenticate","cb","SetUser","GetUser","newUser","setItem","stringify","Check","oldUser","SetPreference","GetPreference","GetPreferenceWithDefault","defaultVal","actions","reducers","setNavigator","navigatorLoading","navigateTo","navigator","setPagination","viewUpdate","pagination","page","navigateUp","pathSplit","split","pop","newPath","join","drawerToggleAction","dragAndDrop","changeViewMethod","method","toggleDaylightMode","changeContextMenu","menuType","setNavigatorLoadingStatus","status","setNavigatorError","openCreateFolderDialog","openCreateFileDialog","setUserPopover","anchor","setShareUserPopover","openRenameDialog","openResaveDialog","openMoveDialog","openRemoveDialog","openShareDialog","applyThemes","setSessionStatus","openMusicDialog","openRemoteDownloadDialog","openTorrentDownloadDialog","openDecompressDialog","openCompressDialog","openGetSourceDialog","openCopyDialog","openLoadingDialog","text","closeAllModals","toggleSnackbar","vertical","horizontal","color","setModalsLoading","refreshFileList","searchMyFile","showImgPreivew","showAudioPreview","audioPreviewSetIsOpen","audioPreviewSetPlaying","refreshStorage","saveFile","setSiteConfig","config","openDirectoryDownloadDialog","downloading","log","done","Pool","limit","queue","processing","uploader","push","check","item","this","v","findIndex","task","dst","ProcessingTaskDuplicatedError","release","run","then","err","processingNum","availableNum","Math","max","slice","checkers","allowedSuffix","ext","FileValidateError","maxSize","validate","c","CancelToken","baseConfig","transformResponse","TransformResponseError","cdBackendConfig","request","url","catch","isCancel","RequestCanceledError","HTTPError","requestAPI","i18n","Backend","LanguageDetector","initReactI18next","init","fallbackLng","debug","load","defaultNS","interpolation","escapeValue","on","lng","document","documentElement","setAttribute","languages","displayName","icon","opacity","DarkModeSwitcher","position","useTranslation","ThemeType","useSelector","siteConfig","useDispatch","ToggleThemeMode","useCallback","isDayLight","isDark","placement","classNames","onClick","sideButton","marginRight","sortOptions","paginationOption","SubActions","isSmall","inherit","keyPrefix","viewMethod","explorerViewMethod","shareInfo","pageSize","OpenLoadingDialog","ChangeSortMethod","changeSortMethod","SetShareUserPopover","ChangePageSize","changePageSize","anchorSort","setAnchorSort","anchorPagination","setAnchorPagination","selectedIndex","setSelectedIndex","handlePaginationChange","s","toggleViewMethod","newMethod","pathHelper","fontSize","anchorEl","Boolean","map","toString","parseInt","event","0","1","2","3","4","5","6","7","handleMenuItemClick","nick","creator","style","height","src","content","minWidth","OptionSelector","modals","aria-labelledby","dividers","component","aria-label","o","button","primary","secondary","description","fab","margin","top","right","bottom","left","zIndex","badge","fabProgress","green","wrapper","spacing","buttonSuccess","SaveButton","buttonClassname","clsx","disabled","avatar","blue","loadingContainer","display","loading","marginTop","marginLeft","LoadingDialog","loadingText","Dialog","DialogContent","DialogContentText","CircularProgress","contentFix","buttonProgress","light","CopyDialog","selectedPath","setSelectedPath","selectedPathName","setSelectedPathName","ToggleSnackbar","SetModalsLoading","RefreshFileList","DialogTitle","PathSelector","presentPath","onSelect","folder","Trans","i18nKey","values","components","DialogActions","Button","preventDefault","dirs","items","post","src_dir","modalsLoading","background","default","DirectoryDownloadDialog","logRef","useRef","autoScroll","setAutoScroll","previousLog","usePrevious","next","timer","setTimer","useInterval","scrollIntoView","behavior","block","fullWidth","TextField","ref","multiline","FormControlLabel","control","Checkbox","checked","onChange","previous","label","cancelDirectoryDownload","widthAnimation","shareUrl","flexCenter","alignItems","noFlex","scoreCalc","ExpansionPanel","withStyles","root","border","boxShadow","borderBottom","expanded","MuiExpansionPanel","ExpansionPanelSummary","MuiExpansionPanelSummary","ExpansionPanelDetails","MuiExpansionPanelDetails","CreatShare","lastSubmit","React","setExpanded","shareURL","setShareURL","password","downloads","expires","showPassword","setValues","expire","preview","shareOption","setShareOption","handleChange","prop","handleExpand","panel","isExpanded","handleCheck","setTimeout","maxWidth","Divider","List","aria-controls","ListItem","ListItemIcon","ListItemText","ListItemSecondaryAction","FormControl","variant","InputLabel","htmlFor","OutlinedInput","endAdornment","InputAdornment","Tooltip","IconButton","random","substr","edge","onMouseDown","onIcon","Visibility","offIcon","VisibilityOff","labelWidth","Select","labelId","MenuItem","num","Typography","onFocus","select","autoFocus","inputProps","readonly","link","clipboard","writeText","submitFormBody","is_dir","DecompressDialog","SubmitDecompressTask","submitDecompressTask","CompressDialog","fileName","setFileName","SubmitCompressTask","submitCompressTask","ModalsCompoment","newFolderName","newFileName","newName","secretShare","sharePwd","downloadURL","remoteDownloadPathSelect","purchaseCallback","handleInputChange","setState","newNameSuffix","UNSAFE_componentWillReceiveProps","nextProps","dndSignale","modalsStatus","rename","dragMove","scoreHandler","Download","downloaded","submitRemove","delete","submitMove","patch","DragSelectedPath","doMove","submitRename","new_name","submitCreateNewFolder","submitCreateNewFile","submitTorrentDownload","submitDownload","failed","r","details","setMoveTarget","remoteDownloadNext","copySource","getSource","createNewFolder","onSubmit","createNewFile","copy","move","remove","remoteDownload","placeholder","torrentDownload","decompress","compress","directoryDownloading","directoryDownloadDone","directoryDownloadLog","Component","Modals","connect","withRouter","withTranslation","layout","up","player","borderRadius","overflowX","TextViewer","setContent","setStatus","setLoading","math","useRouteMatch","$vm","createRef","useLocation","query","URLSearchParams","useParams","UseFileSubTitle","requestURL","pathname","responseType","textdata","Buffer","params","toBase64","reader","FileReader","readAsDataURL","onload","result","onerror","save","addImg","$file","$img2Url","console","elevation","language","onSave","toolbar","h1","h2","h3","h4","img","expand","undo","redo","subfield","MonacoEditor","lazy","editor","formControl","toobar","textAlign","CodeViewer","suffix","setSuffix","wordWrap","setWordWrap","extension","codePreviewSuffix","Array","from","Set","keys","k","fallback","readOnly","extraEditorClassName","sizeToString","bytes","i","floor","pow","toFixed","fixUrlHash","setGetParameter","paramName","paramValue","indexOf","prefix","substring","history","pushState","changeThemeColor","querySelector","bufferDecode","Uint8Array","atob","charCodeAt","bufferEncode","btoa","String","fromCharCode","apply","replace","pathBack","folders","filePath","hex2bin","hex","padStart","basename","pathList","filename","fileNameNoExt","lastIndexOf","randomStr","characters","charactersLength","charAt","getNumber","base","conditions","isMac","platform","toUpperCase","isMobileSafari","ua","userAgent","iOS","match","webkit","vhCheck","vh","innerHeight","setProperty","UploaderErrorName","RETRY_ERROR_LIST","FailedCreateUploadSession","HTTPRequestFailed","LocalChunkUploadFailed","SlaveChunkUploadFailed","RequestCanceled","ProcessingTaskDuplicated","FailedTransformResponse","RETRY_CODE_LIST","UploaderError","field","InvalidFile","supported","UnknownPolicyError","UnknownPolicyType","APIError","appError","CreateUploadSessionError","DeleteUploadSessionError","FailedDeleteUploadSession","axiosErr","LocalChunkUploadError","chunkIndex","SlaveChunkUploadError","OneDriveChunkError","OneDriveChunkUploadFailed","OneDriveEmptyFileSelected","OneDriveEmptyFile","OneDriveFinishUploadError","FailedFinishOneDriveUpload","S3LikeChunkError","S3LikeChunkUploadFailed","getElementsByTagName","innerHTML","S3LikeFinishUploadError","QiniuChunkError","QiniuChunkUploadFailed","QiniuFinishUploadError","FailedFinishQiniuUpload","COSUploadError","COSPostUploadFailed","COSUploadCallbackError","COSUploadCallbackFailed","UpyunUploadError","UpyunPostUploadFailed","S3LikeUploadCallbackError","S3LikeUploadCallbackFailed","parseError","variantIcon","success","CheckCircleIcon","warning","WarningIcon","ErrorIcon","info","InfoIcon","MySnackbarContentWrapper","main","iconVariant","Icon","aria-describedby","close","SnackbarCompoment","snackbar","toggle","handleClose","anchorOrigin","autoHideDuration","AlertBar","UserAvatarPopoverCompoment","openURL","sigOut","reload","user","Popover","transformOrigin","visitorMenu","registerEnabled","header","largeAvatarContainer","Avatar","largeAvatar","noWrap","nickname","user_name","Chip","UserAvatarPopover","userPopoverAnchorEl","UserAvatarCompoment","showUserInfo","returnHome","loginCheck","isLogin","mobileHidden","Grow","Home","UserAvatar","NavbarCompoment","handleDrawerToggle","mobileOpen","openDownload","startDownload","openDirectoryDownload","startDirectoryDownload","archiveDownload","startBatchDownload","signOut","finally","UploaderRef","unlisten","listen","drawer","upDrawer","minStickDrawer","iconFix","allowRemoteDownload","webdav","process","browser","test","appBar","menuButton","handleDesktopToggle","desktopOpen","menuButtonDesktop","menuIcon","setSelectedTarget","subTitle","grow","sectionForFile","isPreviewable","openPreview","showDirectoryPicker","isSecureContext","disableClickAway","audioPreviewPlayingName","audioPreviewOpen","smUp","implementation","container","paper","drawerPaper","onOpen","disableDiscovery","ModalProps","keepMounted","xsDown","drawerPaperDesktop","drawerOpen","drawerClose","Navbar","loadUploader","audioPreviewIsOpen","withTheme","flexShrink","drawerDesktop","mixins","flexDirection","justifyContent","transition","transitions","easing","sharp","duration","enteringScreen","leavingScreen","flexGrow","nested","paddingLeft","extendedIcon","addButton","marginBottom","fabButton","badgeFix","dividerFix","folderShareIcon","verticalAlign","shareInfoContainer","textDecoration","shareAvatar","stickFooter","ownerInfo","overflowY","configure","ignoreTags","keyMap","SEARCH","SearchBarCompoment","handlers","searchShare","blur","input","cancelSuggest","searchIcon","inputRoot","inputInput","onBlur","suggestBox","TransitionProps","timeout","square","SearchBar","shape","fade","common","white","pointerEvents","paddingTop","paddingRight","paddingBottom","getChunks","chunkByteSize","chunks","count","ceil","chunk","sumChunk","reduce","loaded","getResumeCtxKey","setResumeCtx","logger","ctxKey","warn","WriteCtxFailed","removeResumeCtx","removeItem","RemoveCtxFailed","cleanupResumeCtx","getResumeCtx","localInfoString","ReadCtxFailed","localInfo","InvalidCtxData","session","Date","now","CtxExpired","listResumeCtx","res","len","OBJtoXML","obj","xml","isArray","array","getFileInput","isFolder","createElement","multiple","body","appendChild","pathJoin","parts","sep","part","RegExp","trimPrefix","getDirectoryUploadDst","relPath","webkitRelativePath","fsPath","readEntriesPromise","directoryReader","readEntries","readFilePromise","fileReader","readAllDirectoryEntries","entries","getAllFileEntries","dataTransferItemList","fileEntries","webkitGetAsEntry","getAsFile","entry","shift","isFile","fullPath","isDirectory","createReader","isFileDrop","dataTransfer","types","StorageBarCompoment","percent","used","total","showExpand","firstLoad","componentDidMount","updateStatus","refresh","onMouseEnter","onMouseLeave","storageContainer","detail","bar","StorageBar","storageRefresh","textFix","overflow","textOverflow","UserInfoCompoment","userNav","flexAvatar","avatarImg","storageCircle","nickName","groupName","UserInfo","backgroundImage","backgroundSize","minHeight","transform","hiddenButton","subMenu","overFlow","whiteSpace","icons","Circle","CircleOutline","Heart","HeartOutline","Hexagon","HexagonOutline","Hexagram","HexagramOutline","Rhombus","RhombusOutline","Square","SquareOutline","Triangle","TriangleOutline","FolderHeartOutline","AddTag","FileTag","useHistory","tagOpen","setTagOpen","addTagModal","setAddTagModal","tagHover","setTagHover","setTags","SearchMyFile","p","NavigateTo","onSuccess","tag","newTags","iconVideo","iconImg","iconAudio","iconDoc","expression","IconComponent","getIcon","Crc32","crc","table","offset","prototype","j","getDataHelper","byteLength","uint8","view","DataView","buffer","ZIP","underlyingSource","ctrl","activeZipObject","closed","files","filenames","encoder","TextEncoder","activeZipIndex","processNextChunk","closeZip","zipWriter","enqueue","fileLike","TypeError","trim","lastModified","directory","endsWith","nameBuf","encode","zipObject","level","comment","compressedLength","uncompressedLength","writeHeader","setUint16","setUint32","getHours","getMinutes","getSeconds","getFullYear","getMonth","getDate","set","writeFooter","footer","indexFilename","setUint8","zipObj","read","outputData","append","stream","getReader","ReadableStream","start","pull","getPreviewPath","walk","f","objects","subs","getFileSystemDirectoryPaths","handle","parent","paths","fileSystemHandle","FileSystemFileHandle","createFileSystemDirectory","cur","getDirectoryHandle","saveFileToFileSystemDirectory","dir","getFileHandle","createWritable","writable","write","verifyFileSystemRWPermission","fileHandle","opts","mode","queryPermission","requestPermission","directoryDownloadAbortController","setFileList","setDirList","setSortMethod","setSideBar","setCurrentPolicy","removeSelectedTargets","addSelectedTargets","setLastSelect","setShiftSelectedIds","sortMethodFuncs","sizePos","b","sizeRes","namePos","localeCompare","numeric","ignorePunctuation","nameRev","timePos","timeRev","modifyTimePos","modifyTimeRev","selectAll","updateFileList","sortMethod","x","sortFunc","sort","toggleObjectInfoSidebar","closeContextMenu","serverSideBatchDownload","router","postBody","shareDownload","allowArchiveDownload","fileStream","streamSaver","createWriteStream","readableZipStream","previewPath","fetch","cache","WritableStream","pipeTo","abort","AbortController","startIn","fsPaths","duplicates","updateLog","signal","blob","getViewerURL","viewer","openViewer","selectFile","fileIndex","ctrlKey","metaKey","shiftKey","isMacbook","all","begin","min","end","newShiftSelected","encodings","encoding","encodingRequired","allOptions","batchGetSource","sourceBatch","ImagPreviewComponent","photoIndex","firstOne","newImg","intro","fileType","toLowerCase","imgPreviewSuffix","images","visible","onIndexChange","n","ImgPreivew","PolicyType","TaskType","Status","Logger","allowLevel","args","getPrintPrefix","createUploadSession","req","cancel","cancelToken","localUploadChunk","sessionID","onProgress","headers","onUploadProgress","progressEvent","slaveUploadChunk","credential","Authorization","oneDriveUploadChunk","range","finishOneDriveUpload","s3LikeUploadChunk","etag","s3LikeFinishUpload","isOss","PartNumber","ETag","validateStatus","qiniuDriveUploadChunk","upToken","authorization","qiniuFinishUpload","partNumber","cosFormUploadChunk","keyTime","ak","bodyFormData","FormData","cosUploadCallback","upyunFormUploadChunk","s3LikeUploadCallback","resumePolicy","local","remote","qiniu","oss","onedrive","s3","Base","manager","child","added","subscriber","progress","lastTime","startTime","subscribe","transit","initialized","setError","queued","pool","preparing","cachedInfo","utils","policy_id","last_modified","token","resumed","chunkProgress","upload","afterUpload","finished","cancelUploadSession","canceled","reset","deleteUploadSession","onTransition","newStatus","onError","onMsg","Retryable","fromCache","SelectType","Chunk","initBeforeUploadChunks","updateLocalCache","uploadChunk","chunkSize","notifyResumeProgress","getProgressInfoItem","Local","chunkInfo","updateChunkProgress","Remote","uploadURLs","OneDrive","rangeEnd","sendRange","innererror","alignChunkOffset","chunkOffset","rangeStatus","expectedStart","nextExpectedRanges","newChunkOffset","finishing","OSS","completeURL","Qiniu","chunkRes","COS","Upyun","ResumeHint","resumable","UploadManager","fileInput","directoryInput","currentPath","changeConcurrentLimit","newLimit","File","NoPolicySelected","onchange","ev","fileSelectCallback","click","resumeTasks","tasks","dispatchUploader","resumeHint","cleanupSessions","Event","onFileDroppedIn","onDropLeave","uploaders","onDropFileAdded","logLevel","concurrentLimit","dropZone","onDropOver","cos","upyun","S3","acceptVal","removeAttribute","UploadButton","setOpen","setQueued","OpenNewFolderDialog","OpenNewFileDialog","Queued","uploadClicked","openFileList","circularProgress","useMemo","totalSize","processedSize","taskListOpen","Badge","badgeContent","invisible","Backdrop","SpeedDial","tooltipTitle","SpeedDialIcon","openIcon","FabProps","ariaLabel","SpeedDialAction","tooltipOpen","Directory","infoTitle","fontWeight","infoValue","wordBreak","TaskDetail","navigateToDst","Link","datetime","locale","Grid","xs","progressContent","progressContainer","listAction","successStatus","errorStatus","disabledBadge","dstLink","fileNameContainer","getSpeedText","speed","speedAvg","useSpeedAvg","displayedSpeed","getErrMsg","errMsg","Message","UploadTask","useAvgSpeed","onCancel","onRefresh","taskHover","setTaskHover","startLoadedRef","setProgress","durationTotal","resAvg","retry","useUpload","fullScreen","useMediaQuery","statusText","uploaded","percentage","resumeLabel","continueLabel","progressBar","lighten","darken","taskDetail","u","stopRipple","stopPropagation","secondaryAction","show","onTouchStart","fileIcon","TypeIcon","isUpload","newExpanded","onMouseOver","ConcurrentOptionDialog","setCount","Input","step","MoreActions","uploadManager","deleteTask","setUseAvgSpeed","setFilter","sorter","setSorter","cleanFinished","concurrentDialog","setConcurrentDialog","RefreshStorage","listItems","tooltip","divider","ClearAll","Menu","enterNextDelay","dense","val","Transition","forwardRef","Slide","direction","rootOverwrite","flex","popup","inset","paddingZero","dialogContent","maxHeight","virtualList","expandIcon","shortest","expandIconExpanded","sorters","reverse","filters","ongoing","TaskList","taskList","setUploaders","setAnchorEl","refreshList","setRefreshList","reason","Fade","currentList","Nothing","increaseViewportBy","itemContent","classnames","TransitionComponent","disableEnforceFocus","hideBackdrop","disableBackdropClick","disableScrollLock","Accordion","AppBar","Toolbar","disableGutters","MoreHoriz","AccordionDetails","createStyles","backdrop","DropFileBackground","totalProgressCollector","lastProgressStart","Uploader","setTaskListOpen","dropBgOpen","setDropBgOpen","processed","totalProgress","setTotalProgress","fileSelectCounter","openFileSelector","folderSelectCounter","openFolderSelector","enableUploader","taskAdded","original","onToast","setPolicy","unfinished","setInterval","msDocPreviewSuffix","subtitleSuffix","audioPreviewSuffix","videoPreviewSuffix","pdfPreviewSuffix","editSuffix","epubSuffix","json","php","py","bat","cpp","h","cs","css","dockerfile","go","html","ini","java","js","jsx","less","lua","sh","sql","yaml","mediaType","audio","video","image","pdf","word","ppt","excel","torrent","zip","excute","android","python","epub","isTorrent","isCompressFile","taskStatus","taskType","taskProgress","getTaskStatus","getTaskType","getTaskProgress","changeSubTitle","setSubtitle","setShareInfo","selectLanguage","changeLanguage","dayjs","extend","utc","timezone","userTimezone","Intl","DateTimeFormat","resolvedOptions","timeZone","preferTimeZone","refreshTimeZone","formatLocalTime","time","tz","toDate","formatParams","year","month","day","hour","minute","second","validateTimeZone","format","AudioIcon","VideoIcon","ImageIcon","PdfIcon","FileWordBox","FilePowerpointBox","FileExcelBox","ScriptText","MagnetOn","ZipBox","WindowRestore","Android","FileShowIcon","LanguagePhp","LanguageGo","LanguagePython","LanguageC","LanguageCpp","LanguageJavascript","MenuBook","fileSuffix","getColor","getColorValue","iconClassName","registerValidSW","swUrl","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","onUpdate","isLocalhost","hostname","AuthRoute","rest","render","to","NoAuthRoute","emptyContainer","emptyInfoBig","Notice","primaryColor","secondaryColor","y","rx","ry","captchaPlacholder","NormalCaptcha","captchaRef","useStyle","captcha","setCaptcha","captchaData","setCaptchaData","refreshCaptcha","captchaCode","captchaContainer","required","autoComplete","captchaImageContainer","captchaImage","alt","ReCAPTCHA","handleExpired","bind","handleErrored","handleRecaptchaRef","grecaptcha","_widgetId","getResponse","execute","_executeRequested","onExpired","onErrored","sitekey","tabindex","stoken","hl","explicitRender","delayOfCaptchaIframeRemoving","temporaryNode","firstChild","removeChild","elem","childProps","defaultProps","makeAsyncScriptLoader","callbackName","globalName","Recaptcha","reCaptchaKey","captcha_ReCaptchaKey","ReCaptcha","TCaptcha","isValidateRef","submitRef","appid","tcaptcha_captcha_app_id","onLoad","TencentCaptcha","ret","ticket","randstr","isValidate","submit","cursor","defaultValidate","useCaptcha","captchaType","captcha_type","captchaLoading","setCaptchaLoading","captchaRefreshRef","normal","captchaParamsRef","CaptchaRender","useNormalCaptcha","recaptcha","useRecaptcha","tcaptcha","useTCaptcha","form","buttonContainer","authnLink","LoginForm","email","setEmail","pwd","setPwd","useAuthn","setUseAuthn","twoFA","setTwoFA","faCode","setFACode","loginCaptcha","authn","ApplyThemes","SetSessionStatus","afterLogin","Paper","login","userName","Password","credentials","credentialRequestOptions","publicKey","challenge","allowCredentials","listItem","assertion","authData","authenticatorData","clientDataJSON","rawId","sig","signature","userHandle","RouterLink","Fingerprint","VpnKey","highlight","FileName","highlightClassName","searchWords","autoEscape","textToHighlight","SmallIconCompoment","nextState","nextContext","isSelectedCurrent","isSelectedNext","isSelected","ButtonBase","focusRipple","notSelected","onIconClick","iconSelected","iconNotSelected","Folder","checkIcon","folderName","folderNameSelected","folderNameNotSelected","SmallIcon","boxSizing","FileIconCompoment","showPicIcon","pic","picPreview","noDrag","afterLoad","beforeLoad","loadingAnimation","previewIcon","iconBig","fileInfo","shareFix","FileIcon","objectFit","userDrag","active","isActive","dragging","cardDragged","diliverIcon","object","Preview","card","layerStyles","getItemStyles","initialOffset","currentOffset","pointerOffset","WebkitTransform","CustomDragLayer","useDragLayer","monitor","itemType","getItemType","getInitialSourceClientOffset","getSourceClientOffset","getInitialClientOffset","isDragging","StyledListItemIcon","ContextMenuCompoment","X","Y","setPoint","clientY","clientX","openArchiveDownload","enterFolder","renderMenuItems","visibleCount","condition","menuOpen","anchorReference","anchorPosition","Unarchive","Archive","InfoOutlined","propover","ContextMenu","contextType","contextOpen","TableRowCompoment","tableIcon","pref","onContextMenu","contextMenu","handleClick","onDoubleClick","handleDoubleClick","selectedShared","TableCell","dref","scope","tableRow","hideAuto","TableItem","hover","userSelect","FolderDropWarpper","isListView","useDrop","accept","drop","collect","isOver","canDrop","useDragScrolling","isScrolling","goDown","isScrollEnd","offsetHeight","scrollHeight","requestAnimationFrame","goUp","throttleOnDragOver","throttle","isMouseOnTop","isMouseOnDown","addEventListenerForWindow","removeEventListenerForWindow","removeEventListener","fixFlex","ObjectIcon","navigatorPath","SetSelectedTarget","NavitateTo","DragAndDrop","OpenPreview","StartDownload","SelectFile","handleIconClick","useDrag","dropResult","getDropResult","canDrag","drag","getEmptyImage","captureDraggingState","rootTable","typeHeader","errorBox","errorMsg","flexFix","upButton","clickAway","rootShare","visuallyHidden","clip","gridContainer","gridTemplateColumns","gridItem","DELETE_FILE","SELECT_ALL_SHOWED","SELECT_ALL","DESELECT_ALL","Explorer","navigatorErrorMsg","navigatorError","OpenRemoveDialog","ChangeContextMenu","SelectAll","page_size","page_number","startIndex","usePagination","showView","listView","TableHead","TableSortLabel","TableBody","normalView","data-clickAway","dataset","clickaway","allowChanges","expandMore","textTransform","PathButton","inputRef","more","last","DropDownItem","setActiveStatus","DropDown","clearTimeout","shouldClose","NavigatorComponent","currentID","hiddenFolders","hiddenMode","anchorHidden","URL","searchParams","renderPath","onpopstate","navigateToPath","max_size","file_type","checkOverFlow","redresh","componentDidUpdate","prevProps","prevStates","ms","drawerDesktopOpen","force","overflowInitLock","hasOverflowingChildren","offsetWidth","scrollWidth","showHiddenPath","performAction","newTarget","presentFolderMenu","disableAutoFocusItem","roundBorder","navigatorContainer","nav","rightIcon","optionContainer","Navigator","ListLoading","drawerContainer","placeContent","fileIconSVG","folderIcon","closeIcon","placeSelf","propsContainer","propsLabel","propsTime","propsValue","SideDrawer","SetSideBar","setTarget","setDetails","propsItem","d","toLocaleString","child_folder_num","child_file_num","updated_at","created_at","query_date","Hidden","Clear","Drawer","gutterBottom","CustomPaginationItem","PaginationItem","PaginationFooter","SetPagination","Pagination","renderItem","FileManager","DndProvider","backend","HTML5Backend","DragLayer","SelectMenu","showIcon","Artplayer","externalPlayers","actionButton","VideoViewer","art","setArt","setFiles","subtitles","setSubtitles","playlist","setPlaylist","subtitleOpen","setSubtitleOpen","subtitleSelected","setSubtitleSelected","playlistOpen","setPlaylistOpen","externalPlayerOpen","setExternalPlayerOpen","autoHeight","pictureInPictureEnabled","playing","pip","pause","newURL","subtitle","switchUrl","switchSubtitle","switch","fileNameMatch","flip","setting","playbackRate","aspectRatio","hotkey","fullscreen","fullscreenWeb","whitelist","moreVideoAttr","playsInline","lang","getInstance","startIcon","Subtitles","PlaylistPlay","Launch","sub","cardContainer","shareTitle","avatarFile","avatarFolder","gird","loadMore","orderSelect","cardAction","SearchResult","tGlobal","setPage","setTotal","shareList","setShareList","orderBy","setOrderBy","order","sm","Card","CardHeader","subheader","MyShareCompoment","showPwd","loadList","removeShare","oldList","changePermission","newPwd","shareIndex","changePreviewOption","handlePageChange","handleOrderChange","isExpired","remain_downloads","md","CardActions","disableActionSpacing","MyShare","scroll","SelectFileDialog","filesCopy","FormGroup","row","iconContainer","borderInlineStart","contentSide","iconMultiple","subFile","subFileName","subFileIcon","subFileSize","subFilePercent","bitmap","DownloadingCard","canvasRef","setTask","selectDialogOpen","setSelectDialogOpen","selectFileOption","setSelectFileOption","bitfield","str","canvas","context","getContext","clearRect","strokeStyle","bit","round","numPieces","beginPath","moveTo","lineTo","stroke","getPercent","completed","activeFiles","getDownloadName","bittorrent","subFileList","processStyle","completedLength","subFileCell","newIndex","newFiles","gid","indexes","deleteFile","HighlightOff","Table","TableRow","CardContent","LinearProgress","update","uploadLength","uploadSpeed","infoHash","numSeeders","seeder","pieceLength","FinishedCard","task_status","getTaskError","task_error","RemoteDownloadButton","OpenRemoteDownloadDialog","Fab","Add","DownloadComponent","interval","previousDownloading","finishedList","continue","loadDownloading","PageLoading","LockedFileCompoment","setPassowrd","LockedFile","marginRottom","boxHeader","shareDes","Creator","userProfile","views","ImgPreview","SharedFileCompoment","scoreHandle","download","box","boxContent","fileSize","boxFooter","actionLeft","downloadButton","SharedFile","openResave","fileCotainer","buttonCotainer","ReadMe","SharedFolderComponent","handleClickAway","ignore","readmeShowed","ClickAwayListener","onClickAway","managerContainer","SharedFolder","shareUserPopoverAnchorEl","SharePreload","setShare","setPassword","SetSubTitle","locked","withPassword","DocViewer","setURL","formGroup","formIcon","CreateWebDAVAccount","setValue","pathSelectDialog","setPathSelectDialog","formContainer","LabelOutlined","FolderOpenOutlined","cardContent","tableContainer","WebDAV","tab","setTab","setCreate","accounts","setAccounts","account","ID","CreatedAt","Name","Root","Tabs","indicatorColor","textColor","newValue","Tab","Alert","severity","origin","TableContainer","align","accountCopy","deleteAccount","Tasks","setTasks","nowrap","getError","ProfileCompoment","listType","loadNext","loadPrev","avatarContainer","centered","infoContainer","infoItem","mobileHide","th","tableLink","Profile","backgroundPosition","borderRaidus","pageInfo","sectionTitle","desenList","flexContainer","Authn","setSelected","confirm","setConfirm","deleteCredential","fingerprint","credentialCreationOptions","excludeCredentials","attestationObject","add","TimeZoneDialog","timeZoneValue","setTimeZoneValue","UserSettingCompoment","avatarModal","nickModal","changePassword","oldPwd","webdavPwd","newPwdRepeat","twoFactor","authCode","changeTheme","chosenTheme","showWebDavUrl","showWebDavUserName","changeWebDavPwd","groupBackModal","changePolicy","changeTimeZone","settings","uid","group_expires","qq","homepage","two_factor","two_fa_secret","prefer_theme","themes","changeView","loadSetting","useGravatar","changeNick","uploadAvatar","formData","handleToggle","changhePwd","old","new","changheWebdavPwd","init2FA","handleAlignment","toggleThemeMode","newMode","ListItemAvatar","infoTextWithIcon","rightIconWithText","infoText","Switch","firstColor","secondColor","Brightness3","ListAlt","Schedule","GitHub","Translate","uploadFromFile","userGravatar","paddingText","textField","flexContainerResponse","qrcode","desText","ToggleButtonGroup","exclusive","ToggleButton","themeBlock","UserSetting","yellow","policySelected","avatarSuccess","Register","password_repeat","setInput","emailActive","setEmailActive","regCaptcha","Activation","setSuccess","ResetForm","secret","Reset","forgetCaptcha","MusicPlayerComponent","currentIndex","currentTime","progressText","looptype","myAudioRef","newItem","handleItemClick","backgroundPlay","bindEvents","ele","readyPlay","loopnext","timeUpdate","unbindEvents","play","formatTime","isNaN","playOrPaues","isPlay","changeLoopType","lt","handleProgress","idx","Slider","slider_root","justify","Repeat","RepeatOne","Shuffle","MusicPlayer","ReactReader","m","EpubViewer","currentLocation","setLocation","fileUrl","locationChanged","epubcifi","epubInitOptions","openAs","showToc","PDFViewer","App","themeConfig","prefersDarkMode","prefer","createMuiTheme","overrides","MuiButton","MuiTab","Fragment","ThemeProvider","CssBaseline","exact","Text","Code","initUserConfig","store","defaultTheme","preferListMethod","share_view_method","home_view_method","music","resave","doNavigate","currntPath","defaultStatus","rawStore","configCache","InitSiteConfig","siteICPId","QQLogin","black","contrastText","hint","bgSelected","emptyIcon","ErrorBoundary","hasError","errorInfo","componentStack","Admin","hash","contentType","ready","unregister","checkValidServiceWorker","alert","waiting","postMessage","createBrowserHistory","reduxEnhance","applyMiddleware","routerMiddleware","thunk","createStore","viewUpdateState","explorerState","appState","cloudreveApp","combinedState","combinedReducer","combine","namespace","reducer","invariant","combineReducers","connectRouter","UpdateSiteConfig","ReactDOM","getElementById","emptyInfoSmall","PathSelectorCompoment","selectedTarget","toBeLoad","back","api","unshift","handleSelect","selector","primaryTypographyProps","buttonIcon","iconWhite","setTitle","setPath"],"mappings":"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","file":"static/js/main.31369a2d.chunk.js","sourcesContent":["import React from \"react\";\r\nimport { Code } from \"react-content-loader\";\r\nimport { makeStyles, useTheme } from \"@material-ui/core/styles\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    loader: {\r\n        width: \"70%\",\r\n        padding: 40,\r\n        [theme.breakpoints.down(\"md\")]: {\r\n            width: \"100%\",\r\n            padding: 10,\r\n        },\r\n    },\r\n}));\r\n\r\nconst MyLoader = (props) => (\r\n    <Code\r\n        backgroundColor={props.dark ? \"#333\" : \"#f5f6f7\"}\r\n        foregroundColor={props.dark ? \"#636363\" : \"#eee\"}\r\n        className={props.className}\r\n    />\r\n);\r\n\r\nfunction TextLoading() {\r\n    const theme = useTheme();\r\n    const classes = useStyles();\r\n\r\n    return (\r\n        <div>\r\n            <MyLoader\r\n                dark={theme.palette.type === \"dark\"}\r\n                className={classes.loader}\r\n            />\r\n        </div>\r\n    );\r\n}\r\n\r\nexport default TextLoading;\r\n","import axios from \"axios\";\r\nimport Auth from \"./Auth\";\r\nimport i18next from \"../i18n\";\r\n\r\nexport const baseURL = \"/api/v3\";\r\n\r\nexport const getBaseURL = () => {\r\n    return baseURL;\r\n};\r\n\r\nexport const getPreviewURL = (\r\n    isShare: boolean,\r\n    shareID: any,\r\n    fileID: any,\r\n    path: any\r\n): string => {\r\n    return (\r\n        getBaseURL() +\r\n        (isShare\r\n            ? \"/share/preview/\" +\r\n              shareID +\r\n              (path !== \"\" ? \"?path=\" + encodeURIComponent(path) : \"\")\r\n            : \"/file/preview/\" + fileID)\r\n    );\r\n};\r\n\r\n// eslint-disable-next-line @typescript-eslint/ban-ts-ignore\r\n// @ts-ignore\r\nconst instance = axios.create({\r\n    baseURL: getBaseURL(),\r\n    withCredentials: true,\r\n});\r\n\r\nexport class AppError extends Error {\r\n    constructor(message: string | undefined, public code: any, error: any) {\r\n        super(message);\r\n        this.code = code;\r\n        if (i18next.exists(`errors.${code}`, { ns: \"common\" })) {\r\n            this.message = i18next.t(`errors.${code}`, {\r\n                ns: \"common\",\r\n                message,\r\n            });\r\n        } else if (i18next.exists(`errors.${code}`, { ns: \"dashboard\" })) {\r\n            this.message = i18next.t(`errors.${code}`, {\r\n                ns: \"dashboard\",\r\n                message,\r\n            });\r\n        } else {\r\n            this.message =\r\n                message || i18next.t(\"unknownError\", { ns: \"common\" });\r\n        }\r\n\r\n        this.message +=\r\n            error && !this.message.includes(error) ? ` (${error})` : \"\";\r\n        this.stack = new Error().stack;\r\n    }\r\n}\r\n\r\ninstance.interceptors.response.use(\r\n    function (response: any) {\r\n        response.rawData = response.data;\r\n        response.data = response.data.data;\r\n        if (\r\n            response.rawData.code !== undefined &&\r\n            response.rawData.code !== 0 &&\r\n            response.rawData.code !== 203\r\n        ) {\r\n            // Login expired\r\n            if (response.rawData.code === 401) {\r\n                Auth.signout();\r\n                window.location.href = \"/login\";\r\n            }\r\n\r\n            // Non-admin\r\n            if (response.rawData.code === 40008) {\r\n                window.location.href = \"/home\";\r\n            }\r\n            throw new AppError(\r\n                response.rawData.msg,\r\n                response.rawData.code,\r\n                response.rawData.error\r\n            );\r\n        }\r\n        return response;\r\n    },\r\n    function (error) {\r\n        return Promise.reject(error);\r\n    }\r\n);\r\n\r\nexport default instance;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport Zoom from \"@material-ui/core/Zoom\";\r\n\r\nfunction AutoHidden({ children, enable, hide = false, element = null }) {\r\n    const [hidden, setHidden] = useState(false);\r\n    let prev = window.scrollY;\r\n    let lastUpdate = window.scrollY;\r\n    const show = 50;\r\n\r\n    useEffect(() => {\r\n        const handleNavigation = (e) => {\r\n            const window = e.currentTarget;\r\n            const current = element ? element.scrollTop : window.scrollY;\r\n\r\n            if (prev > current) {\r\n                if (lastUpdate - current > show) {\r\n                    lastUpdate = current;\r\n                    setHidden(false);\r\n                }\r\n            } else if (prev < current) {\r\n                if (current - lastUpdate > show) {\r\n                    lastUpdate = current;\r\n                    setHidden(true);\r\n                }\r\n            }\r\n            prev = current;\r\n        };\r\n        if (enable) {\r\n            const target = element ? element : window;\r\n            target.addEventListener(\"scroll\", (e) => handleNavigation(e));\r\n        }\r\n        // eslint-disable-next-line\r\n    }, [enable]);\r\n\r\n    return <Zoom in={!hidden && !hide}>{children}</Zoom>;\r\n}\r\n\r\nexport default AutoHidden;\r\n","/* eslint-disable no-case-declarations */\r\nimport { AnyAction } from \"redux\";\r\nimport { CloudreveFile } from \"../../types\";\r\nimport { Policy } from \"../../component/Uploader/core/types\";\r\n\r\ninterface SelectProps {\r\n    isMultiple: boolean;\r\n    withFolder: boolean;\r\n    withFile: boolean;\r\n    withSourceEnabled: boolean;\r\n}\r\n\r\nexport interface ExplorerState {\r\n    dndSignal: boolean;\r\n    dndTarget: any;\r\n    dndSource: any;\r\n    fileList: CloudreveFile[];\r\n    dirList: CloudreveFile[];\r\n    selected: CloudreveFile[];\r\n    selectProps: SelectProps;\r\n    lastSelect: {\r\n        file: CloudreveFile;\r\n        index: number;\r\n    };\r\n    shiftSelectedIds: string[];\r\n    imgPreview: {\r\n        first: CloudreveFile;\r\n        other: [];\r\n    };\r\n    audioPreview: {\r\n        first: CloudreveFile;\r\n        other: [];\r\n        playingName: any;\r\n        paused: boolean;\r\n        isOpen: boolean;\r\n    };\r\n    search?: {\r\n        keywords: string;\r\n        searchPath: string;\r\n    };\r\n    fileSave: boolean;\r\n    sideBarOpen: boolean;\r\n    currentPolicy?: Policy;\r\n}\r\n\r\nexport const initState: ExplorerState = {\r\n    dndSignal: false,\r\n    dndTarget: null,\r\n    dndSource: null,\r\n    fileList: [],\r\n    dirList: [],\r\n    selected: [],\r\n    selectProps: {\r\n        isMultiple: false,\r\n        withFolder: false,\r\n        withFile: false,\r\n        withSourceEnabled: false,\r\n    },\r\n    lastSelect: {\r\n        file: {\r\n            id: \"\",\r\n            name: \"\",\r\n            size: 0,\r\n            type: \"file\",\r\n            date: \"\",\r\n            path: \"\",\r\n            create_date: \"\",\r\n        },\r\n        index: -1,\r\n    },\r\n    shiftSelectedIds: [],\r\n    imgPreview: {\r\n        first: {\r\n            id: \"\",\r\n            name: \"\",\r\n            size: 0,\r\n            type: \"file\",\r\n            date: \"\",\r\n            path: \"\",\r\n            create_date: \"\",\r\n        },\r\n        other: [],\r\n    },\r\n    audioPreview: {\r\n        first: {\r\n            id: \"\",\r\n            name: \"\",\r\n            size: 0,\r\n            type: \"file\",\r\n            date: \"\",\r\n            path: \"\",\r\n            create_date: \"\",\r\n        },\r\n        other: [],\r\n        playingName: null,\r\n        paused: false,\r\n        isOpen: false,\r\n    },\r\n    fileSave: false,\r\n    sideBarOpen: false,\r\n};\r\n\r\nconst checkSelectedProps = (selected: CloudreveFile[]): SelectProps => {\r\n    const isMultiple = selected.length > 1;\r\n    let withFolder = false;\r\n    let withFile = false;\r\n    let withSourceEnabled = false;\r\n    selected.forEach((value) => {\r\n        if (value.type === \"dir\") {\r\n            withFolder = true;\r\n            withSourceEnabled = true;\r\n        } else if (value.type === \"file\") {\r\n            withFile = true;\r\n            if (value.source_enabled) {\r\n                withSourceEnabled = true;\r\n            }\r\n        }\r\n    });\r\n    return {\r\n        isMultiple,\r\n        withFolder,\r\n        withFile,\r\n        withSourceEnabled,\r\n    };\r\n};\r\n\r\nconst explorer = (\r\n    state: ExplorerState = initState,\r\n    action: AnyAction\r\n): ExplorerState => {\r\n    switch (action.type) {\r\n        case \"DRAG_AND_DROP\":\r\n            return Object.assign({}, state, {\r\n                dndSignal: !state.dndSignal,\r\n                dndTarget: action.target,\r\n                dndSource: action.source,\r\n            });\r\n        case \"SET_FILE_LIST\":\r\n            return Object.assign({}, state, {\r\n                fileList: action.list,\r\n            });\r\n        case \"SET_DIR_LIST\":\r\n            return Object.assign({}, state, {\r\n                dirList: action.list,\r\n            });\r\n        case \"ADD_SELECTED_TARGETS\":\r\n            const addedSelected = [...state.selected, ...action.targets];\r\n            return Object.assign({}, state, {\r\n                selected: addedSelected,\r\n                selectProps: checkSelectedProps(addedSelected),\r\n            });\r\n        case \"SET_SELECTED_TARGET\":\r\n            const newSelected = action.targets;\r\n            return Object.assign({}, state, {\r\n                selected: newSelected,\r\n                selectProps: checkSelectedProps(newSelected),\r\n            });\r\n        case \"RMOVE_SELECTED_TARGETS\":\r\n            const { fileIds } = action;\r\n            const filteredSelected = state.selected.filter((file) => {\r\n                return !fileIds.includes(file.id);\r\n            });\r\n            return Object.assign({}, state, {\r\n                selected: filteredSelected,\r\n                selectProps: checkSelectedProps(filteredSelected),\r\n            });\r\n        case \"REFRESH_FILE_LIST\":\r\n            return Object.assign({}, state, {\r\n                selected: [],\r\n                selectProps: {\r\n                    isMultiple: false,\r\n                    withFolder: false,\r\n                    withFile: false,\r\n                    withSourceEnabled: false,\r\n                },\r\n            });\r\n        case \"SEARCH_MY_FILE\":\r\n            return Object.assign({}, state, {\r\n                selected: [],\r\n                selectProps: {\r\n                    isMultiple: false,\r\n                    withFolder: false,\r\n                    withFile: false,\r\n                    withSourceEnabled: false,\r\n                },\r\n                search: {\r\n                    keywords: action.keywords,\r\n                    searchPath: action.path,\r\n                },\r\n            });\r\n        case \"SHOW_IMG_PREIVEW\":\r\n            return Object.assign({}, state, {\r\n                imgPreview: {\r\n                    first: action.first,\r\n                    other: state.fileList,\r\n                },\r\n            });\r\n        case \"SHOW_AUDIO_PREVIEW\":\r\n            return Object.assign({}, state, {\r\n                audioPreview: {\r\n                    ...state.audioPreview,\r\n                    first: action.first,\r\n                    other: state.fileList,\r\n                },\r\n            });\r\n        case \"AUDIO_PREVIEW_SET_IS_OPEN\":\r\n            return Object.assign({}, state, {\r\n                audioPreview: {\r\n                    ...state.audioPreview,\r\n                    isOpen: action.isOpen,\r\n                },\r\n            });\r\n        case \"AUDIO_PREVIEW_SET_PLAYING\":\r\n            return Object.assign({}, state, {\r\n                audioPreview: {\r\n                    ...state.audioPreview,\r\n                    playingName: action.playingName,\r\n                    paused: action.paused,\r\n                },\r\n            });\r\n        case \"SAVE_FILE\":\r\n            return {\r\n                ...state,\r\n                fileSave: !state.fileSave,\r\n            };\r\n        case \"SET_LAST_SELECT\":\r\n            const { file, index } = action;\r\n            return {\r\n                ...state,\r\n                lastSelect: {\r\n                    file,\r\n                    index,\r\n                },\r\n            };\r\n        case \"SET_SHIFT_SELECTED_IDS\":\r\n            const { shiftSelectedIds } = action;\r\n            return {\r\n                ...state,\r\n                shiftSelectedIds,\r\n            };\r\n        case \"SET_NAVIGATOR\":\r\n            return {\r\n                ...state,\r\n                selected: [],\r\n                selectProps: {\r\n                    isMultiple: false,\r\n                    withFolder: false,\r\n                    withFile: false,\r\n                    withSourceEnabled: false,\r\n                },\r\n                search: undefined,\r\n            };\r\n        case \"SET_SIDE_BAR\":\r\n            return {\r\n                ...state,\r\n                sideBarOpen: action.open,\r\n            };\r\n        case \"SET_CURRENT_POLICY\":\r\n            return {\r\n                ...state,\r\n                currentPolicy: action.policy,\r\n            };\r\n        default:\r\n            return state;\r\n    }\r\n};\r\n\r\nexport default explorer;\r\n","import API from \"../middleware/Api\";\r\n\r\nexport async function list(\r\n    path: string,\r\n    share: any,\r\n    keywords: string,\r\n    searchPath: string\r\n): Promise<any> {\r\n    let apiURL = \"\";\r\n    if (share) {\r\n        if (keywords === \"\") {\r\n            apiURL = \"/share/list/\" + share.key;\r\n        } else {\r\n            apiURL = `/share/search/${share.key}/`;\r\n        }\r\n    } else {\r\n        if (keywords === \"\") {\r\n            apiURL = \"/directory\";\r\n        } else {\r\n            apiURL = \"/file/search/\";\r\n        }\r\n    }\r\n\r\n    path = keywords === \"\" ? path : keywords;\r\n    apiURL = apiURL + encodeURIComponent(path);\r\n    if (searchPath) {\r\n        apiURL = `${apiURL}?path=${encodeURIComponent(searchPath)}`;\r\n    }\r\n    return API.get(apiURL);\r\n}\r\n","import API from \"../middleware/Api\";\r\n\r\nexport async function getDownloadURL(file: any): Promise<any> {\r\n    let reqURL = \"\";\r\n    if (file.key) {\r\n        const downloadPath =\r\n            file.path === \"/\"\r\n                ? file.path + file.name\r\n                : file.path + \"/\" + file.name;\r\n        reqURL =\r\n            \"/share/download/\" +\r\n            file.key +\r\n            \"?path=\" +\r\n            encodeURIComponent(downloadPath);\r\n    } else {\r\n        reqURL = \"/file/download/\" + file.id;\r\n    }\r\n\r\n    return API.put(reqURL);\r\n}\r\n","import { ThunkAction } from \"redux-thunk\";\r\nimport { setOptionModal } from \"../viewUpdate/action\";\r\nimport i18next from \"../../i18n\";\r\n\r\nexport const askForOption = (\r\n    options: any,\r\n    title: string\r\n): ThunkAction<any, any, any, any> => {\r\n    return async (dispatch, getState): Promise<any> => {\r\n        return new Promise<void>((resolve, reject) => {\r\n            const dialog = {\r\n                open: true,\r\n                title: title,\r\n                options: options,\r\n            };\r\n            dispatch(\r\n                setOptionModal({\r\n                    ...dialog,\r\n                    onClose: () => {\r\n                        dispatch(setOptionModal({ ...dialog, open: false }));\r\n                        reject(i18next.t(\"fileManager.userDenied\"));\r\n                    },\r\n                    callback: (option: any) => {\r\n                        resolve(option);\r\n                        dispatch(setOptionModal({ ...dialog, open: false }));\r\n                    },\r\n                })\r\n            );\r\n        });\r\n    };\r\n};\r\n","const statusHelper = {\r\n    isHomePage(path: string) {\r\n        return path === \"/home\";\r\n    },\r\n    isSharePage(path: string) {\r\n        return path && path.startsWith(\"/s/\");\r\n    },\r\n    isAdminPage(path: string) {\r\n        return path && path.startsWith(\"/admin\");\r\n    },\r\n    isLoginPage(path: string) {\r\n        return path && path.startsWith(\"/login\");\r\n    },\r\n    isMobile() {\r\n        return window.innerWidth < 600;\r\n    },\r\n};\r\nexport default statusHelper;\r\n","function getValueWithDefault(key, defaultValue) {\r\n    try {\r\n        return JSON.parse(localStorage.getItem(key) as string) || defaultValue;\r\n    } catch (e) {\r\n        return defaultValue;\r\n    }\r\n}\r\nconst Auth = {\r\n    isAuthenticated: false,\r\n    _user: getValueWithDefault(\"user\", { anonymous: true, group: {}, tags: [] }),\r\n    _preference: getValueWithDefault(\"preference\", {}),\r\n    authenticate(cb: any) {\r\n        Auth.SetUser(cb);\r\n        Auth.isAuthenticated = true;\r\n    },\r\n    GetUser() {\r\n        return Auth._user;\r\n    },\r\n    SetUser(newUser: any) {\r\n        Auth._user = newUser;\r\n        localStorage.setItem(\"user\", JSON.stringify(newUser));\r\n    },\r\n    Check(): boolean {\r\n        return Auth.isAuthenticated || !Auth.GetUser().anonymous;\r\n    },\r\n    signout() {\r\n        Auth.isAuthenticated = false;\r\n        const oldUser = Auth.GetUser();\r\n        oldUser.id = 0;\r\n        Auth.SetUser(oldUser);\r\n    },\r\n    SetPreference(key: string, value: any) {\r\n        Auth._preference[key] = value;\r\n        localStorage.setItem(\"user_preference\", JSON.stringify(Auth._preference));\r\n    },\r\n    GetPreference(key: string): any | null {\r\n        return Auth._preference[key] ?? null;\r\n    },\r\n    GetPreferenceWithDefault(key: string, defaultVal: any): any {\r\n        return Auth.GetPreference(key) ?? defaultVal;\r\n    },\r\n};\r\n\r\nexport default Auth;\r\n","import * as actions from \"./action\";\r\nimport * as reducers from \"./reducer\";\r\nimport { setPagination } from \"../viewUpdate/action\";\r\n\r\nexport default {\r\n    actions,\r\n    reducers,\r\n};\r\nexport { selectFile } from \"./action\";\r\nexport { openPreview } from \"./action\";\r\nexport { setShiftSelectedIds } from \"./action\";\r\nexport { setLastSelect } from \"./action\";\r\nexport { setSelectedTarget } from \"./action\";\r\nexport { addSelectedTargets } from \"./action\";\r\nexport { removeSelectedTargets } from \"./action\";\r\nexport const setNavigator = (path: any, navigatorLoading: any) => {\r\n    return {\r\n        type: \"SET_NAVIGATOR\",\r\n        path,\r\n        navigatorLoading,\r\n    };\r\n};\r\nexport const navigateTo = (path: any) => {\r\n    return (dispatch: any, getState: any) => {\r\n        const state = getState();\r\n        const navigatorLoading = path !== state.navigator.path;\r\n        if (navigatorLoading) {\r\n            dispatch(\r\n                setPagination({\r\n                    ...state.viewUpdate.pagination,\r\n                    page: 1,\r\n                })\r\n            );\r\n        }\r\n        dispatch(setNavigator(path, navigatorLoading));\r\n    };\r\n};\r\nexport const navigateUp = () => {\r\n    return (dispatch, getState) => {\r\n        const state = getState();\r\n        const pathSplit = state.navigator.path.split(\"/\");\r\n        pathSplit.pop();\r\n        const newPath = pathSplit.length === 1 ? \"/\" : pathSplit.join(\"/\");\r\n        const navigatorLoading = newPath !== state.navigator.path;\r\n        if (navigatorLoading) {\r\n            dispatch(\r\n                setPagination({\r\n                    ...state.viewUpdate.pagination,\r\n                    page: 1,\r\n                })\r\n            );\r\n        }\r\n        dispatch(setNavigator(newPath, navigatorLoading));\r\n    };\r\n};\r\nexport const drawerToggleAction = (open) => {\r\n    return {\r\n        type: \"DRAWER_TOGGLE\",\r\n        open: open,\r\n    };\r\n};\r\nexport const dragAndDrop = (source, target) => {\r\n    return {\r\n        type: \"DRAG_AND_DROP\",\r\n        source: source,\r\n        target: target,\r\n    };\r\n};\r\nexport const changeViewMethod = (method) => {\r\n    return {\r\n        type: \"CHANGE_VIEW_METHOD\",\r\n        method: method,\r\n    };\r\n};\r\nexport const toggleDaylightMode = () => {\r\n    return {\r\n        type: \"TOGGLE_DAYLIGHT_MODE\",\r\n    };\r\n};\r\n// Deprecated\r\nexport const changeContextMenu = (type, open) => {\r\n    return {\r\n        type: \"CHANGE_CONTEXT_MENU\",\r\n        menuType: type,\r\n        open: open,\r\n    };\r\n};\r\nexport const setNavigatorLoadingStatus = (status) => {\r\n    return {\r\n        type: \"SET_NAVIGATOR_LOADING_STATUE\",\r\n        status: status,\r\n    };\r\n};\r\nexport const setNavigatorError = (status, msg) => {\r\n    return {\r\n        type: \"SET_NAVIGATOR_ERROR\",\r\n        status: status,\r\n        msg: msg,\r\n    };\r\n};\r\nexport const openCreateFolderDialog = () => {\r\n    return {\r\n        type: \"OPEN_CREATE_FOLDER_DIALOG\",\r\n    };\r\n};\r\nexport const openCreateFileDialog = () => {\r\n    return {\r\n        type: \"OPEN_CREATE_FILE_DIALOG\",\r\n    };\r\n};\r\nexport const setUserPopover = (anchor) => {\r\n    return {\r\n        type: \"SET_USER_POPOVER\",\r\n        anchor: anchor,\r\n    };\r\n};\r\nexport const setShareUserPopover = (anchor) => {\r\n    return {\r\n        type: \"SET_SHARE_USER_POPOVER\",\r\n        anchor: anchor,\r\n    };\r\n};\r\nexport const openRenameDialog = () => {\r\n    return {\r\n        type: \"OPEN_RENAME_DIALOG\",\r\n    };\r\n};\r\nexport const openResaveDialog = (key) => {\r\n    return {\r\n        type: \"OPEN_RESAVE_DIALOG\",\r\n        key: key,\r\n    };\r\n};\r\nexport const openMoveDialog = () => {\r\n    return {\r\n        type: \"OPEN_MOVE_DIALOG\",\r\n    };\r\n};\r\nexport const openRemoveDialog = () => {\r\n    return {\r\n        type: \"OPEN_REMOVE_DIALOG\",\r\n    };\r\n};\r\nexport const openShareDialog = () => {\r\n    return {\r\n        type: \"OPEN_SHARE_DIALOG\",\r\n    };\r\n};\r\nexport const applyThemes = (theme) => {\r\n    return {\r\n        type: \"APPLY_THEME\",\r\n        theme: theme,\r\n    };\r\n};\r\nexport const setSessionStatus = (status) => {\r\n    return {\r\n        type: \"SET_SESSION_STATUS\",\r\n        status: status,\r\n    };\r\n};\r\nexport const openMusicDialog = () => {\r\n    return {\r\n        type: \"OPEN_MUSIC_DIALOG\",\r\n    };\r\n};\r\nexport const openRemoteDownloadDialog = () => {\r\n    return {\r\n        type: \"OPEN_REMOTE_DOWNLOAD_DIALOG\",\r\n    };\r\n};\r\nexport const openTorrentDownloadDialog = () => {\r\n    return {\r\n        type: \"OPEN_TORRENT_DOWNLOAD_DIALOG\",\r\n    };\r\n};\r\nexport const openDecompressDialog = () => {\r\n    return {\r\n        type: \"OPEN_DECOMPRESS_DIALOG\",\r\n    };\r\n};\r\nexport const openCompressDialog = () => {\r\n    return {\r\n        type: \"OPEN_COMPRESS_DIALOG\",\r\n    };\r\n};\r\nexport const openRelocateDialog = () => {\r\n    return {\r\n        type: \"OPEN_RELOCATE_DIALOG\",\r\n    };\r\n};\r\nexport const openGetSourceDialog = (source) => {\r\n    return {\r\n        type: \"OPEN_GET_SOURCE_DIALOG\",\r\n        source,\r\n    };\r\n};\r\nexport const openCopyDialog = () => {\r\n    return {\r\n        type: \"OPEN_COPY_DIALOG\",\r\n    };\r\n};\r\n// Deprecated\r\nexport const openLoadingDialog = (text) => {\r\n    return {\r\n        type: \"OPEN_LOADING_DIALOG\",\r\n        text: text,\r\n    };\r\n};\r\n// Deprecated\r\nexport const closeAllModals = () => {\r\n    return {\r\n        type: \"CLOSE_ALL_MODALS\",\r\n    };\r\n};\r\nexport const toggleSnackbar = (vertical, horizontal, msg, color) => {\r\n    return {\r\n        type: \"TOGGLE_SNACKBAR\",\r\n        vertical: vertical,\r\n        horizontal: horizontal,\r\n        msg: msg,\r\n        color: color,\r\n    };\r\n};\r\nexport const setModalsLoading = (status) => {\r\n    return {\r\n        type: \"SET_MODALS_LOADING\",\r\n        status: status,\r\n    };\r\n};\r\nexport const refreshFileList = () => {\r\n    return {\r\n        type: \"REFRESH_FILE_LIST\",\r\n    };\r\n};\r\nexport const searchMyFile = (keywords, path) => {\r\n    return {\r\n        type: \"SEARCH_MY_FILE\",\r\n        keywords: keywords,\r\n        path: path,\r\n    };\r\n};\r\nexport const showImgPreivew = (first) => {\r\n    return {\r\n        type: \"SHOW_IMG_PREIVEW\",\r\n        first: first,\r\n    };\r\n};\r\nexport const showAudioPreview = (first) => {\r\n    return {\r\n        type: \"SHOW_AUDIO_PREVIEW\",\r\n        first: first,\r\n    };\r\n};\r\nexport const audioPreviewSetIsOpen = (isOpen) => {\r\n    return {\r\n        type: \"AUDIO_PREVIEW_SET_IS_OPEN\",\r\n        isOpen,\r\n    };\r\n};\r\nexport const audioPreviewSetPlaying = (playingName, paused) => {\r\n    return {\r\n        type: \"AUDIO_PREVIEW_SET_PLAYING\",\r\n        playingName, //the playing content name\r\n        paused,\r\n    };\r\n};\r\nexport const refreshStorage = () => {\r\n    return {\r\n        type: \"REFRESH_STORAGE\",\r\n    };\r\n};\r\nexport const saveFile = () => {\r\n    return {\r\n        type: \"SAVE_FILE\",\r\n    };\r\n};\r\n\r\nexport const setSiteConfig = (config) => {\r\n    return {\r\n        type: \"SET_SITE_CONFIG\",\r\n        config: config,\r\n    };\r\n};\r\n\r\nexport const openDirectoryDownloadDialog = (downloading, log, done) => {\r\n    return {\r\n        type: \"OPEN_DIRECTORY_DOWNLOAD_DIALOG\",\r\n        downloading,\r\n        log,\r\n        done,\r\n    };\r\n};\r\n","import Base from \"../uploader/base\";\r\nimport { ProcessingTaskDuplicatedError } from \"../errors\";\r\n\r\nexport interface QueueContent {\r\n    uploader: Base;\r\n    resolve: () => void;\r\n    reject: (err?: any) => void;\r\n}\r\n\r\nexport class Pool {\r\n    queue: Array<QueueContent> = [];\r\n    processing: Array<QueueContent> = [];\r\n\r\n    constructor(public limit: number) {}\r\n\r\n    enqueue(uploader: Base) {\r\n        return new Promise<void>((resolve, reject) => {\r\n            this.queue.push({\r\n                uploader,\r\n                resolve,\r\n                reject,\r\n            });\r\n            this.check();\r\n        });\r\n    }\r\n\r\n    release(item: QueueContent) {\r\n        this.processing = this.processing.filter((v) => v !== item);\r\n        this.check();\r\n    }\r\n\r\n    run(item: QueueContent) {\r\n        this.queue = this.queue.filter((v) => v !== item);\r\n        if (\r\n            this.processing.findIndex(\r\n                (v) =>\r\n                    v.uploader.task.dst == item.uploader.task.dst &&\r\n                    v.uploader.task.file.name == item.uploader.task.name\r\n            ) > -1\r\n        ) {\r\n            // 找到重名任务\r\n            item.reject(new ProcessingTaskDuplicatedError());\r\n            this.release(item);\r\n            return;\r\n        }\r\n\r\n        this.processing.push(item);\r\n        item.uploader.run().then(\r\n            () => {\r\n                item.resolve();\r\n                this.release(item);\r\n            },\r\n            (err) => {\r\n                item.reject(err);\r\n                this.release(item);\r\n            }\r\n        );\r\n    }\r\n\r\n    check() {\r\n        const processingNum = this.processing.length;\r\n        const availableNum = Math.max(0, this.limit - processingNum);\r\n        this.queue.slice(0, availableNum).forEach((item) => {\r\n            this.run(item);\r\n        });\r\n    }\r\n}\r\n","import { Policy } from \"../types\";\r\nimport { FileValidateError } from \"../errors\";\r\n\r\ninterface Validator {\r\n    (file: File, policy: Policy): void;\r\n}\r\n\r\n// validators\r\nconst checkers: Array<Validator> = [\r\n    function checkExt(file: File, policy: Policy) {\r\n        if (\r\n            policy.allowedSuffix != undefined &&\r\n            policy.allowedSuffix.length > 0\r\n        ) {\r\n            const ext = file?.name.split(\".\").pop();\r\n            if (ext === null || !ext || !policy.allowedSuffix.includes(ext))\r\n                throw new FileValidateError(\r\n                    \"File suffix not allowed in policy.\",\r\n                    \"suffix\",\r\n                    policy\r\n                );\r\n        }\r\n    },\r\n\r\n    function checkSize(file: File, policy: Policy) {\r\n        if (policy.maxSize > 0) {\r\n            if (file.size > policy.maxSize) {\r\n                throw new FileValidateError(\r\n                    \"File size exceeds maximum limit.\",\r\n                    \"size\",\r\n                    policy\r\n                );\r\n            }\r\n        }\r\n    },\r\n];\r\n\r\n/* 将每个 Validator 执行\r\n   失败返回 Error\r\n */\r\nexport function validate(file: File, policy: Policy) {\r\n    checkers.forEach((c) => c(file, policy));\r\n}\r\n","import axios, { AxiosRequestConfig } from \"axios\";\r\nimport { Response } from \"../types\";\r\nimport {\r\n    HTTPError,\r\n    RequestCanceledError,\r\n    TransformResponseError,\r\n} from \"../errors\";\r\n\r\nexport const { CancelToken } = axios;\r\nexport { CancelTokenSource } from \"axios\";\r\n\r\nconst baseConfig = {\r\n    transformResponse: [\r\n        (response: any) => {\r\n            try {\r\n                return JSON.parse(response);\r\n            } catch (e) {\r\n                throw new TransformResponseError(response, e);\r\n            }\r\n        },\r\n    ],\r\n};\r\n\r\nconst cdBackendConfig = {\r\n    ...baseConfig,\r\n    baseURL: \"/api/v3\",\r\n    withCredentials: true,\r\n};\r\n\r\nexport function request<T = any>(url: string, config?: AxiosRequestConfig) {\r\n    return axios\r\n        .request<T>({ ...baseConfig, ...config, url })\r\n        .catch((err) => {\r\n            if (axios.isCancel(err)) {\r\n                throw new RequestCanceledError();\r\n            }\r\n\r\n            if (err instanceof TransformResponseError) {\r\n                throw err;\r\n            }\r\n\r\n            throw new HTTPError(err, url);\r\n        });\r\n}\r\n\r\nexport function requestAPI<T = any>(url: string, config?: AxiosRequestConfig) {\r\n    return request<Response<T>>(url, { ...cdBackendConfig, ...config });\r\n}\r\n","import i18n from \"i18next\";\r\nimport { initReactI18next } from \"react-i18next\";\r\n\r\nimport Backend from \"i18next-http-backend\";\r\nimport LanguageDetector from \"i18next-browser-languagedetector\";\r\n\r\ni18n.use(Backend)\r\n    .use(LanguageDetector)\r\n    .use(initReactI18next)\r\n    .init({\r\n        fallbackLng: \"zh-CN\",\r\n        debug: true,\r\n        ns: [\"common\", \"application\"],\r\n        load: \"currentOnly\",\r\n        defaultNS: \"application\",\r\n        interpolation: {\r\n            escapeValue: false,\r\n        },\r\n    });\r\n\r\ni18n.on(\"languageChanged\", (lng) => {\r\n    document.documentElement.setAttribute(\"lang\", lng);\r\n});\r\n\r\nexport const languages = [\r\n    {\r\n        code: \"en-US\",\r\n        displayName: \"English\",\r\n    },\r\n    {\r\n        code: \"zh-CN\",\r\n        displayName: \"简体中文\",\r\n    },\r\n];\r\n\r\nexport default i18n;\r\n","import React, { useCallback } from \"react\";\r\nimport { IconButton, makeStyles } from \"@material-ui/core\";\r\nimport DayIcon from \"@material-ui/icons/Brightness7\";\r\nimport NightIcon from \"@material-ui/icons/Brightness4\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport Tooltip from \"@material-ui/core/Tooltip\";\r\nimport Auth from \"../../middleware/Auth\";\r\nimport classNames from \"classnames\";\r\nimport { toggleDaylightMode } from \"../../redux/explorer\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n    icon: {\r\n        color: \"rgb(255, 255, 255)\",\r\n        opacity: \"0.54\",\r\n    },\r\n}));\r\n\r\nconst DarkModeSwitcher = ({ position }) => {\r\n    const { t } = useTranslation();\r\n    const ThemeType = useSelector(\r\n        (state) => state.siteConfig.theme.palette.type\r\n    );\r\n    const dispatch = useDispatch();\r\n    const ToggleThemeMode = useCallback(() => dispatch(toggleDaylightMode()), [\r\n        dispatch,\r\n    ]);\r\n    const isDayLight = (ThemeType && ThemeType === \"light\") || !ThemeType;\r\n    const isDark = ThemeType && ThemeType === \"dark\";\r\n    const toggleMode = () => {\r\n        Auth.SetPreference(\"theme_mode\", isDayLight ? \"dark\" : \"light\");\r\n        ToggleThemeMode();\r\n    };\r\n    const classes = useStyles();\r\n    return (\r\n        <Tooltip\r\n            title={\r\n                isDayLight ? t(\"navbar.toDarkMode\") : t(\"navbar.toLightMode\")\r\n            }\r\n            placement=\"bottom\"\r\n        >\r\n            <IconButton\r\n                className={classNames({\r\n                    [classes.icon]: \"left\" === position,\r\n                })}\r\n                onClick={toggleMode}\r\n                color=\"inherit\"\r\n            >\r\n                {isDayLight && <NightIcon />}\r\n                {isDark && <DayIcon />}\r\n            </IconButton>\r\n        </Tooltip>\r\n    );\r\n};\r\n\r\nexport default DarkModeSwitcher;\r\n","import React, { useCallback, useState } from \"react\";\r\nimport { IconButton, makeStyles, Menu, MenuItem } from \"@material-ui/core\";\r\nimport ViewListIcon from \"@material-ui/icons/ViewList\";\r\nimport ViewSmallIcon from \"@material-ui/icons/ViewComfy\";\r\nimport ViewModuleIcon from \"@material-ui/icons/ViewModule\";\r\nimport TextTotateVerticalIcon from \"@material-ui/icons/TextRotateVertical\";\r\nimport Avatar from \"@material-ui/core/Avatar\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport Auth from \"../../../middleware/Auth\";\r\nimport { changeViewMethod, setShareUserPopover } from \"../../../redux/explorer\";\r\nimport { changeSortMethod } from \"../../../redux/explorer/action\";\r\nimport { FormatPageBreak } from \"mdi-material-ui\";\r\nimport pathHelper from \"../../../utils/page\";\r\nimport { changePageSize } from \"../../../redux/viewUpdate/action\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    sideButton: {\r\n        padding: \"8px\",\r\n        marginRight: \"5px\",\r\n    },\r\n}));\r\n\r\nconst sortOptions = [\r\n    \"A-Z\",\r\n    \"Z-A\",\r\n    \"oldestUploaded\",\r\n    \"newestUploaded\",\r\n    \"oldestModified\",\r\n    \"newestModified\",\r\n    \"smallest\",\r\n    \"largest\",\r\n];\r\n\r\nconst paginationOption = [\"50\", \"100\", \"200\", \"500\", \"1000\"];\r\n\r\nexport default function SubActions({ isSmall, inherit }) {\r\n    const { t } = useTranslation(\"application\", { keyPrefix: \"fileManager\" });\r\n    const { t: vasT } = useTranslation(\"application\", { keyPrefix: \"vas\" });\r\n    const dispatch = useDispatch();\r\n    const viewMethod = useSelector(\r\n        (state) => state.viewUpdate.explorerViewMethod\r\n    );\r\n    const share = useSelector((state) => state.viewUpdate.shareInfo);\r\n    const pageSize = useSelector((state) => state.viewUpdate.pagination.size);\r\n    const OpenLoadingDialog = useCallback(\r\n        (method) => dispatch(changeViewMethod(method)),\r\n        [dispatch]\r\n    );\r\n    const ChangeSortMethod = useCallback(\r\n        (method) => dispatch(changeSortMethod(method)),\r\n        [dispatch]\r\n    );\r\n    const SetShareUserPopover = useCallback(\r\n        (e) => dispatch(setShareUserPopover(e)),\r\n        [dispatch]\r\n    );\r\n    const ChangePageSize = useCallback((e) => dispatch(changePageSize(e)), [\r\n        dispatch,\r\n    ]);\r\n    const [anchorSort, setAnchorSort] = useState(null);\r\n    const [anchorPagination, setAnchorPagination] = useState(null);\r\n    const [selectedIndex, setSelectedIndex] = useState(0);\r\n    const showSortOptions = (e) => {\r\n        setAnchorSort(e.currentTarget);\r\n    };\r\n    const showPaginationOptions = (e) => {\r\n        setAnchorPagination(e.currentTarget);\r\n    };\r\n    const handleMenuItemClick = (e, index) => {\r\n        setSelectedIndex(index);\r\n        const optionsTable = {\r\n            0: \"namePos\",\r\n            1: \"nameRev\",\r\n            2: \"timePos\",\r\n            3: \"timeRev\",\r\n            4: \"modifyTimePos\",\r\n            5: \"modifyTimeRev\",\r\n            6: \"sizePos\",\r\n            7: \"sizeRes\",\r\n        };\r\n        ChangeSortMethod(optionsTable[index]);\r\n        setAnchorSort(null);\r\n    };\r\n    const handlePaginationChange = (s) => {\r\n        ChangePageSize(s);\r\n        setAnchorPagination(null);\r\n    };\r\n\r\n    const toggleViewMethod = () => {\r\n        const newMethod =\r\n            viewMethod === \"icon\"\r\n                ? \"list\"\r\n                : viewMethod === \"list\"\r\n                ? \"smallIcon\"\r\n                : \"icon\";\r\n        Auth.SetPreference(\"view_method\", newMethod);\r\n        OpenLoadingDialog(newMethod);\r\n    };\r\n    const isMobile = pathHelper.isMobile();\r\n\r\n    const classes = useStyles();\r\n    return (\r\n        <>\r\n            {viewMethod === \"icon\" && (\r\n                <IconButton\r\n                    title={t(\"listView\")}\r\n                    className={classes.sideButton}\r\n                    onClick={toggleViewMethod}\r\n                    color={inherit ? \"inherit\" : \"default\"}\r\n                >\r\n                    <ViewListIcon fontSize={isSmall ? \"small\" : \"default\"} />\r\n                </IconButton>\r\n            )}\r\n            {viewMethod === \"list\" && (\r\n                <IconButton\r\n                    title={t(\"gridViewSmall\")}\r\n                    className={classes.sideButton}\r\n                    onClick={toggleViewMethod}\r\n                    color={inherit ? \"inherit\" : \"default\"}\r\n                >\r\n                    <ViewSmallIcon fontSize={isSmall ? \"small\" : \"default\"} />\r\n                </IconButton>\r\n            )}\r\n\r\n            {viewMethod === \"smallIcon\" && (\r\n                <IconButton\r\n                    title={t(\"gridViewLarge\")}\r\n                    className={classes.sideButton}\r\n                    onClick={toggleViewMethod}\r\n                    color={inherit ? \"inherit\" : \"default\"}\r\n                >\r\n                    <ViewModuleIcon fontSize={isSmall ? \"small\" : \"default\"} />\r\n                </IconButton>\r\n            )}\r\n\r\n            {!isMobile && (\r\n                <IconButton\r\n                    title={t(\"paginationSize\")}\r\n                    className={classes.sideButton}\r\n                    onClick={showPaginationOptions}\r\n                    color={inherit ? \"inherit\" : \"default\"}\r\n                >\r\n                    <FormatPageBreak fontSize={isSmall ? \"small\" : \"default\"} />\r\n                </IconButton>\r\n            )}\r\n            <Menu\r\n                id=\"sort-menu\"\r\n                anchorEl={anchorPagination}\r\n                open={Boolean(anchorPagination)}\r\n                onClose={() => setAnchorPagination(null)}\r\n            >\r\n                {paginationOption.map((option, index) => (\r\n                    <MenuItem\r\n                        key={option}\r\n                        selected={option === pageSize.toString()}\r\n                        onClick={() => handlePaginationChange(parseInt(option))}\r\n                    >\r\n                        {t(\"paginationOption\", { option })}\r\n                    </MenuItem>\r\n                ))}\r\n                <MenuItem\r\n                    selected={pageSize === -1}\r\n                    onClick={() => handlePaginationChange(-1)}\r\n                >\r\n                    {t(\"noPagination\")}\r\n                </MenuItem>\r\n            </Menu>\r\n\r\n            <IconButton\r\n                title={t(\"sortMethod\")}\r\n                className={classes.sideButton}\r\n                onClick={showSortOptions}\r\n                color={inherit ? \"inherit\" : \"default\"}\r\n            >\r\n                <TextTotateVerticalIcon\r\n                    fontSize={isSmall ? \"small\" : \"default\"}\r\n                />\r\n            </IconButton>\r\n            <Menu\r\n                id=\"sort-menu\"\r\n                anchorEl={anchorSort}\r\n                open={Boolean(anchorSort)}\r\n                onClose={() => setAnchorSort(null)}\r\n            >\r\n                {sortOptions.map((option, index) => (\r\n                    <MenuItem\r\n                        key={option}\r\n                        selected={index === selectedIndex}\r\n                        onClick={(event) => handleMenuItemClick(event, index)}\r\n                    >\r\n                        {t(\"sortMethods.\" + option)}\r\n                    </MenuItem>\r\n                ))}\r\n            </Menu>\r\n            {share && (\r\n                <IconButton\r\n                    title={t(\"shareCreateBy\", { nick: share.creator.nick })}\r\n                    className={classes.sideButton}\r\n                    onClick={(e) => SetShareUserPopover(e.currentTarget)}\r\n                    style={{ padding: 5 }}\r\n                >\r\n                    <Avatar\r\n                        style={{ height: 23, width: 23 }}\r\n                        src={\"/api/v3/user/avatar/\" + share.creator.key + \"/s\"}\r\n                    />\r\n                </IconButton>\r\n            )}\r\n        </>\r\n    );\r\n}\r\n","import React from \"react\";\r\nimport {\r\n    Button,\r\n    Dialog,\r\n    DialogActions,\r\n    DialogContent,\r\n    DialogTitle,\r\n    List,\r\n    ListItem,\r\n    ListItemText,\r\n    makeStyles,\r\n} from \"@material-ui/core\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    content: {\r\n        minWidth: 250,\r\n    },\r\n}));\r\n\r\nexport default function OptionSelector() {\r\n    const { t } = useTranslation(\"common\");\r\n    const classes = useStyles();\r\n    const option = useSelector((state) => state.viewUpdate.modals.option);\r\n\r\n    return (\r\n        <Dialog\r\n            open={option && option.open}\r\n            onClose={option && option.onClose}\r\n            aria-labelledby=\"form-dialog-title\"\r\n        >\r\n            <DialogTitle id=\"form-dialog-title\">\r\n                {option && option.title}\r\n            </DialogTitle>\r\n            <DialogContent dividers={\"paper\"} className={classes.content}>\r\n                <List component=\"nav\" aria-label=\"main mailbox folders\">\r\n                    {option &&\r\n                        option.options.map((o) => (\r\n                            <ListItem\r\n                                key={o.key}\r\n                                onClick={() => option && option.callback(o)}\r\n                                button\r\n                            >\r\n                                <ListItemText\r\n                                    primary={o.name}\r\n                                    secondary={o.description}\r\n                                />\r\n                            </ListItem>\r\n                        ))}\r\n                </List>\r\n            </DialogContent>\r\n            <DialogActions>\r\n                <Button onClick={option && option.onClose}>\r\n                    {t(\"cancel\")}\r\n                </Button>\r\n            </DialogActions>\r\n        </Dialog>\r\n    );\r\n}\r\n","import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/core\";\r\nimport SaveIcon from \"@material-ui/icons/Save\";\r\nimport CheckIcon from \"@material-ui/icons/Check\";\r\nimport AutoHidden from \"./AutoHidden\";\r\nimport statusHelper from \"../../utils/page\";\r\nimport Fab from \"@material-ui/core/Fab\";\r\nimport Tooltip from \"@material-ui/core/Tooltip\";\r\nimport CircularProgress from \"@material-ui/core/CircularProgress\";\r\nimport { green } from \"@material-ui/core/colors\";\r\nimport clsx from \"clsx\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    fab: {\r\n        margin: 0,\r\n        top: \"auto\",\r\n        right: 20,\r\n        bottom: 20,\r\n        left: \"auto\",\r\n        zIndex: 5,\r\n        position: \"fixed\",\r\n    },\r\n    badge: {\r\n        position: \"absolute\",\r\n        bottom: 26,\r\n        top: \"auto\",\r\n        zIndex: 9999,\r\n        right: 7,\r\n    },\r\n    fabProgress: {\r\n        color: green[500],\r\n        position: \"absolute\",\r\n        top: -6,\r\n        left: -6,\r\n        zIndex: 1,\r\n    },\r\n    wrapper: {\r\n        margin: theme.spacing(1),\r\n        position: \"relative\",\r\n    },\r\n    buttonSuccess: {\r\n        backgroundColor: green[500],\r\n        \"&:hover\": {\r\n            backgroundColor: green[700],\r\n        },\r\n    },\r\n}));\r\n\r\nexport default function SaveButton(props) {\r\n    const classes = useStyles();\r\n    const buttonClassname = clsx({\r\n        [classes.buttonSuccess]: props.status === \"success\",\r\n    });\r\n\r\n    return (\r\n        <AutoHidden enable={statusHelper.isMobile()}>\r\n            <div className={classes.fab}>\r\n                <div className={classes.wrapper}>\r\n                    <Tooltip title={\"保存\"} placement={\"left\"}>\r\n                        <Fab\r\n                            onClick={props.onClick}\r\n                            color=\"primary\"\r\n                            className={buttonClassname}\r\n                            disabled={props.status === \"loading\"}\r\n                            aria-label=\"add\"\r\n                        >\r\n                            {props.status === \"success\" ? (\r\n                                <CheckIcon />\r\n                            ) : (\r\n                                <SaveIcon />\r\n                            )}\r\n                        </Fab>\r\n                    </Tooltip>\r\n                    {props.status === \"loading\" && (\r\n                        <CircularProgress\r\n                            size={68}\r\n                            className={classes.fabProgress}\r\n                        />\r\n                    )}\r\n                </div>\r\n            </div>\r\n        </AutoHidden>\r\n    );\r\n}\r\n","import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport CircularProgress from \"@material-ui/core/CircularProgress\";\r\nimport DialogContent from \"@material-ui/core/DialogContent\";\r\nimport Dialog from \"@material-ui/core/Dialog\";\r\nimport DialogContentText from \"@material-ui/core/DialogContentText\";\r\nimport { blue } from \"@material-ui/core/colors\";\r\nimport { useSelector } from \"react-redux\";\r\n\r\nconst useStyles = makeStyles({\r\n    avatar: {\r\n        backgroundColor: blue[100],\r\n        color: blue[600],\r\n    },\r\n    loadingContainer: {\r\n        display: \"flex\",\r\n    },\r\n    loading: {\r\n        marginTop: 10,\r\n        marginLeft: 20,\r\n    },\r\n});\r\n\r\nexport default function LoadingDialog() {\r\n    const classes = useStyles();\r\n    const open = useSelector((state) => state.viewUpdate.modals.loading);\r\n    const text = useSelector((state) => state.viewUpdate.modals.loadingText);\r\n\r\n    return (\r\n        <Dialog aria-labelledby=\"simple-dialog-title\" open={open}>\r\n            <DialogContent>\r\n                <DialogContentText className={classes.loadingContainer}>\r\n                    <CircularProgress color=\"secondary\" />\r\n                    <div className={classes.loading}>{text}</div>\r\n                </DialogContentText>\r\n            </DialogContent>\r\n        </Dialog>\r\n    );\r\n}\r\n","import React, { useCallback, useState } from \"react\";\r\nimport {\r\n    Button,\r\n    CircularProgress,\r\n    Dialog,\r\n    DialogActions,\r\n    DialogContent,\r\n    DialogContentText,\r\n    DialogTitle,\r\n    makeStyles,\r\n} from \"@material-ui/core\";\r\nimport PathSelector from \"../FileManager/PathSelector\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport API from \"../../middleware/Api\";\r\nimport {\r\n    refreshFileList,\r\n    setModalsLoading,\r\n    toggleSnackbar,\r\n} from \"../../redux/explorer\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    contentFix: {\r\n        padding: \"10px 24px 0px 24px\",\r\n    },\r\n    wrapper: {\r\n        margin: theme.spacing(1),\r\n        position: \"relative\",\r\n    },\r\n    buttonProgress: {\r\n        color: theme.palette.secondary.light,\r\n        position: \"absolute\",\r\n        top: \"50%\",\r\n        left: \"50%\",\r\n        marginTop: -12,\r\n        marginLeft: -12,\r\n    },\r\n}));\r\n\r\nexport default function CopyDialog(props) {\r\n    const { t } = useTranslation();\r\n    const [selectedPath, setSelectedPath] = useState(\"\");\r\n    const [selectedPathName, setSelectedPathName] = useState(\"\");\r\n\r\n    const dispatch = useDispatch();\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n    const SetModalsLoading = useCallback(\r\n        (status) => {\r\n            dispatch(setModalsLoading(status));\r\n        },\r\n        [dispatch]\r\n    );\r\n    const RefreshFileList = useCallback(() => {\r\n        dispatch(refreshFileList());\r\n    }, [dispatch]);\r\n\r\n    const setMoveTarget = (folder) => {\r\n        const path =\r\n            folder.path === \"/\"\r\n                ? folder.path + folder.name\r\n                : folder.path + \"/\" + folder.name;\r\n        setSelectedPath(path);\r\n        setSelectedPathName(folder.name);\r\n    };\r\n\r\n    const submitMove = (e) => {\r\n        if (e != null) {\r\n            e.preventDefault();\r\n        }\r\n        SetModalsLoading(true);\r\n        const dirs = [],\r\n            items = [];\r\n        // eslint-disable-next-line\r\n\r\n        if (props.selected[0].type === \"dir\") {\r\n            dirs.push(props.selected[0].id);\r\n        } else {\r\n            items.push(props.selected[0].id);\r\n        }\r\n\r\n        API.post(\"/object/copy\", {\r\n            src_dir: props.selected[0].path,\r\n            src: {\r\n                dirs: dirs,\r\n                items: items,\r\n            },\r\n            dst: selectedPath === \"//\" ? \"/\" : selectedPath,\r\n        })\r\n            .then(() => {\r\n                props.onClose();\r\n                RefreshFileList();\r\n                SetModalsLoading(false);\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n                SetModalsLoading(false);\r\n            });\r\n    };\r\n\r\n    const classes = useStyles();\r\n\r\n    return (\r\n        <Dialog\r\n            open={props.open}\r\n            onClose={props.onClose}\r\n            aria-labelledby=\"form-dialog-title\"\r\n        >\r\n            <DialogTitle id=\"form-dialog-title\">\r\n                {t(\"fileManager.copyTo\")}\r\n            </DialogTitle>\r\n            <PathSelector\r\n                presentPath={props.presentPath}\r\n                selected={props.selected}\r\n                onSelect={setMoveTarget}\r\n            />\r\n\r\n            {selectedPath !== \"\" && (\r\n                <DialogContent className={classes.contentFix}>\r\n                    <DialogContentText>\r\n                        <Trans\r\n                            i18nKey={\"fileManager.copyToDst\"}\r\n                            values={{\r\n                                dst: selectedPathName,\r\n                            }}\r\n                            components={[<strong key={0} />]}\r\n                        />\r\n                    </DialogContentText>\r\n                </DialogContent>\r\n            )}\r\n            <DialogActions>\r\n                <Button onClick={props.onClose}>\r\n                    {t(\"cancel\", { ns: \"common\" })}\r\n                </Button>\r\n                <div className={classes.wrapper}>\r\n                    <Button\r\n                        onClick={submitMove}\r\n                        color=\"primary\"\r\n                        disabled={selectedPath === \"\" || props.modalsLoading}\r\n                    >\r\n                        {t(\"ok\", { ns: \"common\" })}\r\n                        {props.modalsLoading && (\r\n                            <CircularProgress\r\n                                size={24}\r\n                                className={classes.buttonProgress}\r\n                            />\r\n                        )}\r\n                    </Button>\r\n                </div>\r\n            </DialogActions>\r\n        </Dialog>\r\n    );\r\n}\r\n","import React, { useState, useEffect, useRef } from \"react\";\r\nimport {\r\n    Button,\r\n    CircularProgress,\r\n    Dialog,\r\n    DialogActions,\r\n    DialogContent,\r\n    DialogTitle,\r\n    makeStyles,\r\n    FormControlLabel,\r\n    Checkbox,\r\n} from \"@material-ui/core\";\r\nimport TextField from \"@material-ui/core/TextField\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useInterval, usePrevious, useGetState } from \"ahooks\";\r\nimport { cancelDirectoryDownload } from \"../../redux/explorer/action\";\r\nimport Auth from \"../../middleware/Auth\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    contentFix: {\r\n        padding: \"10px 24px 0px 24px\",\r\n        backgroundColor: theme.palette.background.default,\r\n    },\r\n    buttonProgress: {\r\n        color: theme.palette.secondary.light,\r\n        position: \"absolute\",\r\n        top: \"50%\",\r\n        left: \"50%\",\r\n        marginTop: -12,\r\n        marginLeft: -12,\r\n    },\r\n}));\r\n\r\nexport default function DirectoryDownloadDialog(props) {\r\n    const { t } = useTranslation();\r\n\r\n    const classes = useStyles();\r\n\r\n    const logRef = useRef();\r\n    const [autoScroll, setAutoScroll] = useState(\r\n        Auth.GetPreferenceWithDefault(\"autoScroll\", true)\r\n    );\r\n    const previousLog = usePrevious(props.log, (prev, next) => true);\r\n    const [timer, setTimer] = useState(-1);\r\n\r\n    useInterval(() => {\r\n        if (autoScroll && logRef.current && previousLog !== props.log) {\r\n            logRef.current.scrollIntoView({ behavior: \"smooth\", block: \"end\" });\r\n        }\r\n    }, timer);\r\n\r\n    useEffect(() => {\r\n        if (props.done) {\r\n            setTimer(-1);\r\n        } else if (props.open) {\r\n            setTimer(1000);\r\n        }\r\n    }, [props.done, props.open]);\r\n\r\n    return (\r\n        <Dialog\r\n            open={props.open}\r\n            // open\r\n            onClose={props.onClose}\r\n            aria-labelledby=\"form-dialog-title\"\r\n            fullWidth\r\n        >\r\n            <DialogTitle id=\"form-dialog-title\">\r\n                {t(\"modals.directoryDownloadTitle\")}\r\n            </DialogTitle>\r\n\r\n            <DialogContent className={classes.contentFix}>\r\n                <TextField\r\n                    value={props.log}\r\n                    ref={logRef}\r\n                    multiline\r\n                    fullWidth\r\n                    id=\"standard-basic\"\r\n                />\r\n            </DialogContent>\r\n            <DialogActions>\r\n                <FormControlLabel\r\n                    control={<Checkbox />}\r\n                    checked={autoScroll}\r\n                    onChange={() =>\r\n                        setAutoScroll((previous) => {\r\n                            Auth.SetPreference(\"autoScroll\", !previous);\r\n                            return !previous;\r\n                        })\r\n                    }\r\n                    label={t(\"modals.directoryDownloadAutoscroll\")}\r\n                />\r\n                <Button\r\n                    onClick={\r\n                        props.done ? props.onClose : cancelDirectoryDownload\r\n                    }\r\n                >\r\n                    {t(\"cancel\", { ns: \"common\" })}\r\n                </Button>\r\n                <div className={classes.wrapper}>\r\n                    <Button\r\n                        color=\"primary\"\r\n                        disabled={!props.done}\r\n                        onClick={props.onClose}\r\n                    >\r\n                        {t(\"ok\", { ns: \"common\" })}\r\n                        {!props.done && (\r\n                            <CircularProgress\r\n                                size={24}\r\n                                className={classes.buttonProgress}\r\n                            />\r\n                        )}\r\n                    </Button>\r\n                </div>\r\n            </DialogActions>\r\n        </Dialog>\r\n    );\r\n}\r\n","import React, { useCallback, useRef } from \"react\";\r\nimport {\r\n    Button,\r\n    Checkbox,\r\n    CircularProgress,\r\n    Dialog,\r\n    DialogActions,\r\n    DialogContent,\r\n    DialogTitle,\r\n    FormControl,\r\n    makeStyles,\r\n    TextField,\r\n} from \"@material-ui/core\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport API from \"../../middleware/Api\";\r\nimport List from \"@material-ui/core/List\";\r\nimport ListItemText from \"@material-ui/core/ListItemText\";\r\nimport ListItem from \"@material-ui/core/ListItem\";\r\nimport ListItemIcon from \"@material-ui/core/ListItemIcon\";\r\nimport LockIcon from \"@material-ui/icons/Lock\";\r\nimport TimerIcon from \"@material-ui/icons/Timer\";\r\nimport CasinoIcon from \"@material-ui/icons/Casino\";\r\nimport ListItemSecondaryAction from \"@material-ui/core/ListItemSecondaryAction\";\r\nimport Divider from \"@material-ui/core/Divider\";\r\nimport MuiExpansionPanel from \"@material-ui/core/ExpansionPanel\";\r\nimport MuiExpansionPanelSummary from \"@material-ui/core/ExpansionPanelSummary\";\r\nimport MuiExpansionPanelDetails from \"@material-ui/core/ExpansionPanelDetails\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport withStyles from \"@material-ui/core/styles/withStyles\";\r\nimport InputLabel from \"@material-ui/core/InputLabel\";\r\nimport { Visibility, VisibilityOff } from \"@material-ui/icons\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport InputAdornment from \"@material-ui/core/InputAdornment\";\r\nimport OutlinedInput from \"@material-ui/core/OutlinedInput\";\r\nimport Tooltip from \"@material-ui/core/Tooltip\";\r\nimport MenuItem from \"@material-ui/core/MenuItem\";\r\nimport Select from \"@material-ui/core/Select\";\r\nimport ToggleIcon from \"material-ui-toggle-icon\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    widthAnimation: {},\r\n    shareUrl: {\r\n        minWidth: \"400px\",\r\n    },\r\n    wrapper: {\r\n        margin: theme.spacing(1),\r\n        position: \"relative\",\r\n    },\r\n    buttonProgress: {\r\n        color: theme.palette.secondary.light,\r\n        position: \"absolute\",\r\n        top: \"50%\",\r\n        left: \"50%\",\r\n    },\r\n    flexCenter: {\r\n        alignItems: \"center\",\r\n    },\r\n    noFlex: {\r\n        display: \"block\",\r\n    },\r\n    scoreCalc: {\r\n        marginTop: 10,\r\n    },\r\n}));\r\n\r\nconst ExpansionPanel = withStyles({\r\n    root: {\r\n        border: \"0px solid rgba(0, 0, 0, .125)\",\r\n        boxShadow: \"none\",\r\n        \"&:not(:last-child)\": {\r\n            borderBottom: 0,\r\n        },\r\n        \"&:before\": {\r\n            display: \"none\",\r\n        },\r\n        \"&$expanded\": {\r\n            margin: \"auto\",\r\n        },\r\n    },\r\n    expanded: {},\r\n})(MuiExpansionPanel);\r\n\r\nconst ExpansionPanelSummary = withStyles({\r\n    root: {\r\n        padding: 0,\r\n        \"&$expanded\": {},\r\n    },\r\n    content: {\r\n        margin: 0,\r\n        display: \"initial\",\r\n        \"&$expanded\": {\r\n            margin: \"0 0\",\r\n        },\r\n    },\r\n    expanded: {},\r\n})(MuiExpansionPanelSummary);\r\n\r\nconst ExpansionPanelDetails = withStyles((theme) => ({\r\n    root: {\r\n        padding: 24,\r\n        backgroundColor: theme.palette.background.default,\r\n    },\r\n}))(MuiExpansionPanelDetails);\r\n\r\nexport default function CreatShare(props) {\r\n    const { t } = useTranslation();\r\n    const dispatch = useDispatch();\r\n    const classes = useStyles();\r\n\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n\r\n    const lastSubmit = useRef(null);\r\n    const [expanded, setExpanded] = React.useState(false);\r\n    const [shareURL, setShareURL] = React.useState(\"\");\r\n    const [values, setValues] = React.useState({\r\n        password: \"\",\r\n        downloads: 1,\r\n        expires: 24 * 3600,\r\n        showPassword: false,\r\n    });\r\n    const [shareOption, setShareOption] = React.useState({\r\n        password: false,\r\n        expire: false,\r\n        preview: true,\r\n    });\r\n\r\n    const handleChange = (prop) => (event) => {\r\n        // 输入密码\r\n        if (prop === \"password\") {\r\n            if (event.target.value === \"\") {\r\n                setShareOption({ ...shareOption, password: false });\r\n            } else {\r\n                setShareOption({ ...shareOption, password: true });\r\n            }\r\n        }\r\n\r\n        setValues({ ...values, [prop]: event.target.value });\r\n    };\r\n\r\n    const handleClickShowPassword = () => {\r\n        setValues({ ...values, showPassword: !values.showPassword });\r\n    };\r\n\r\n    const handleMouseDownPassword = (event) => {\r\n        event.preventDefault();\r\n    };\r\n\r\n    const randomPassword = () => {\r\n        setShareOption({ ...shareOption, password: true });\r\n        setValues({\r\n            ...values,\r\n            password: Math.random().toString(36).substr(2).slice(2, 8),\r\n            showPassword: true,\r\n        });\r\n    };\r\n\r\n    const handleExpand = (panel) => (event, isExpanded) => {\r\n        setExpanded(isExpanded ? panel : false);\r\n    };\r\n\r\n    const handleCheck = (prop) => () => {\r\n        if (!shareOption[prop]) {\r\n            handleExpand(prop)(null, true);\r\n        }\r\n        if (prop === \"password\" && shareOption[prop]) {\r\n            setValues({\r\n                ...values,\r\n                password: \"\",\r\n            });\r\n        }\r\n        setShareOption({ ...shareOption, [prop]: !shareOption[prop] });\r\n    };\r\n\r\n    const onClose = () => {\r\n        props.onClose();\r\n        setTimeout(() => {\r\n            setShareURL(\"\");\r\n        }, 500);\r\n    };\r\n\r\n    const senLink = () => {\r\n        if (navigator.share) {\r\n            let text = t(\"modals.shareLinkShareContent\", {\r\n                name: props.selected[0].name,\r\n                link: shareURL,\r\n            });\r\n            if (lastSubmit.current && lastSubmit.current.password) {\r\n                text += t(\"modals.shareLinkPasswordInfo\", {\r\n                    password: lastSubmit.current.password,\r\n                });\r\n            }\r\n            navigator.share({ text });\r\n        } else if (navigator.clipboard) {\r\n            navigator.clipboard.writeText(shareURL);\r\n            ToggleSnackbar(\"top\", \"right\", t(\"modals.linkCopied\"), \"info\");\r\n        }\r\n    };\r\n\r\n    const submitShare = (e) => {\r\n        e.preventDefault();\r\n        props.setModalsLoading(true);\r\n        const submitFormBody = {\r\n            id: props.selected[0].id,\r\n            is_dir: props.selected[0].type === \"dir\",\r\n            password: values.password,\r\n            downloads: shareOption.expire ? values.downloads : -1,\r\n            expire: values.expires,\r\n            preview: shareOption.preview,\r\n        };\r\n        lastSubmit.current = submitFormBody;\r\n\r\n        API.post(\"/share\", submitFormBody)\r\n            .then((response) => {\r\n                setShareURL(response.data);\r\n                setValues({\r\n                    password: \"\",\r\n                    downloads: 1,\r\n                    expires: 24 * 3600,\r\n                    showPassword: false,\r\n                });\r\n                setShareOption({\r\n                    password: false,\r\n                    expire: false,\r\n                });\r\n                props.setModalsLoading(false);\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n                props.setModalsLoading(false);\r\n            });\r\n    };\r\n\r\n    const handleFocus = (event) => event.target.select();\r\n\r\n    return (\r\n        <Dialog\r\n            open={props.open}\r\n            onClose={onClose}\r\n            aria-labelledby=\"form-dialog-title\"\r\n            className={classes.widthAnimation}\r\n            maxWidth=\"xs\"\r\n            fullWidth\r\n        >\r\n            <DialogTitle id=\"form-dialog-title\">\r\n                {t(\"modals.createShareLink\")}\r\n            </DialogTitle>\r\n\r\n            {shareURL === \"\" && (\r\n                <>\r\n                    <Divider />\r\n                    <List>\r\n                        <ExpansionPanel\r\n                            expanded={expanded === \"password\"}\r\n                            onChange={handleExpand(\"password\")}\r\n                        >\r\n                            <ExpansionPanelSummary\r\n                                aria-controls=\"panel1a-content\"\r\n                                id=\"panel1a-header\"\r\n                            >\r\n                                <ListItem button>\r\n                                    <ListItemIcon>\r\n                                        <LockIcon />\r\n                                    </ListItemIcon>\r\n                                    <ListItemText\r\n                                        primary={t(\r\n                                            \"modals.usePasswordProtection\"\r\n                                        )}\r\n                                    />\r\n                                    <ListItemSecondaryAction>\r\n                                        <Checkbox\r\n                                            checked={shareOption.password}\r\n                                            onChange={handleCheck(\"password\")}\r\n                                        />\r\n                                    </ListItemSecondaryAction>\r\n                                </ListItem>\r\n                            </ExpansionPanelSummary>\r\n                            <ExpansionPanelDetails>\r\n                                <FormControl\r\n                                    variant=\"outlined\"\r\n                                    color=\"secondary\"\r\n                                    fullWidth\r\n                                >\r\n                                    <InputLabel htmlFor=\"filled-adornment-password\">\r\n                                        {t(\"modals.sharePassword\")}\r\n                                    </InputLabel>\r\n                                    <OutlinedInput\r\n                                        fullWidth\r\n                                        id=\"outlined-adornment-password\"\r\n                                        type={\r\n                                            values.showPassword\r\n                                                ? \"text\"\r\n                                                : \"password\"\r\n                                        }\r\n                                        value={values.password}\r\n                                        onChange={handleChange(\"password\")}\r\n                                        endAdornment={\r\n                                            <InputAdornment position=\"end\">\r\n                                                <Tooltip\r\n                                                    title={t(\r\n                                                        \"modals.randomlyGenerate\"\r\n                                                    )}\r\n                                                >\r\n                                                    <IconButton\r\n                                                        aria-label=\"toggle password visibility\"\r\n                                                        onClick={randomPassword}\r\n                                                        edge=\"end\"\r\n                                                    >\r\n                                                        <CasinoIcon />\r\n                                                    </IconButton>\r\n                                                </Tooltip>\r\n                                                <IconButton\r\n                                                    aria-label=\"toggle password visibility\"\r\n                                                    onClick={\r\n                                                        handleClickShowPassword\r\n                                                    }\r\n                                                    onMouseDown={\r\n                                                        handleMouseDownPassword\r\n                                                    }\r\n                                                    edge=\"end\"\r\n                                                >\r\n                                                    <ToggleIcon\r\n                                                        on={values.showPassword}\r\n                                                        onIcon={<Visibility />}\r\n                                                        offIcon={\r\n                                                            <VisibilityOff />\r\n                                                        }\r\n                                                    />\r\n                                                </IconButton>\r\n                                            </InputAdornment>\r\n                                        }\r\n                                        labelWidth={70}\r\n                                    />\r\n                                </FormControl>\r\n                            </ExpansionPanelDetails>\r\n                        </ExpansionPanel>\r\n                        <ExpansionPanel\r\n                            expanded={expanded === \"expire\"}\r\n                            onChange={handleExpand(\"expire\")}\r\n                        >\r\n                            <ExpansionPanelSummary\r\n                                aria-controls=\"panel1a-content\"\r\n                                id=\"panel1a-header\"\r\n                            >\r\n                                <ListItem button>\r\n                                    <ListItemIcon>\r\n                                        <TimerIcon />\r\n                                    </ListItemIcon>\r\n                                    <ListItemText\r\n                                        primary={t(\r\n                                            \"modals.expireAutomatically\"\r\n                                        )}\r\n                                    />\r\n                                    <ListItemSecondaryAction>\r\n                                        <Checkbox\r\n                                            checked={shareOption.expire}\r\n                                            onChange={handleCheck(\"expire\")}\r\n                                        />\r\n                                    </ListItemSecondaryAction>\r\n                                </ListItem>\r\n                            </ExpansionPanelSummary>\r\n                            <ExpansionPanelDetails\r\n                                className={classes.flexCenter}\r\n                            >\r\n                                <FormControl\r\n                                    style={{\r\n                                        marginRight: 10,\r\n                                    }}\r\n                                >\r\n                                    <Select\r\n                                        labelId=\"demo-simple-select-label\"\r\n                                        id=\"demo-simple-select\"\r\n                                        value={values.downloads}\r\n                                        onChange={handleChange(\"downloads\")}\r\n                                    >\r\n                                        {[1, 2, 3, 4, 5, 20, 50, 100].map(\r\n                                            (v) => (\r\n                                                <MenuItem value={v} key={v}>\r\n                                                    {t(\r\n                                                        \"modals.downloadLimitOptions\",\r\n                                                        { num: v }\r\n                                                    )}\r\n                                                </MenuItem>\r\n                                            )\r\n                                        )}\r\n                                    </Select>\r\n                                </FormControl>\r\n                                <Typography>{t(\"modals.or\")}</Typography>\r\n                                <FormControl\r\n                                    style={{\r\n                                        marginRight: 10,\r\n                                        marginLeft: 10,\r\n                                    }}\r\n                                >\r\n                                    <Select\r\n                                        labelId=\"demo-simple-select-label\"\r\n                                        id=\"demo-simple-select\"\r\n                                        value={values.expires}\r\n                                        onChange={handleChange(\"expires\")}\r\n                                    >\r\n                                        <MenuItem value={300}>\r\n                                            {t(\"modals.5minutes\")}\r\n                                        </MenuItem>\r\n                                        <MenuItem value={3600}>\r\n                                            {t(\"modals.1hour\")}\r\n                                        </MenuItem>\r\n                                        <MenuItem value={24 * 3600}>\r\n                                            {t(\"modals.1day\")}\r\n                                        </MenuItem>\r\n                                        <MenuItem value={7 * 24 * 3600}>\r\n                                            {t(\"modals.7days\")}\r\n                                        </MenuItem>\r\n                                        <MenuItem value={30 * 24 * 3600}>\r\n                                            {t(\"modals.30days\")}\r\n                                        </MenuItem>\r\n                                    </Select>\r\n                                </FormControl>\r\n                                <Typography>\r\n                                    {t(\"modals.downloadSuffix\")}\r\n                                </Typography>\r\n                            </ExpansionPanelDetails>\r\n                        </ExpansionPanel>\r\n                        <ExpansionPanel\r\n                            expanded={expanded === \"preview\"}\r\n                            onChange={handleExpand(\"preview\")}\r\n                        >\r\n                            <ExpansionPanelSummary\r\n                                aria-controls=\"panel1a-content\"\r\n                                id=\"panel1a-header\"\r\n                            >\r\n                                <ListItem button>\r\n                                    <ListItemIcon>\r\n                                        <LockIcon />\r\n                                    </ListItemIcon>\r\n                                    <ListItemText\r\n                                        primary={t(\"modals.allowPreview\")}\r\n                                    />\r\n                                    <ListItemSecondaryAction>\r\n                                        <Checkbox\r\n                                            checked={shareOption.preview}\r\n                                            onChange={handleCheck(\"preview\")}\r\n                                        />\r\n                                    </ListItemSecondaryAction>\r\n                                </ListItem>\r\n                            </ExpansionPanelSummary>\r\n                            <ExpansionPanelDetails>\r\n                                <Typography>\r\n                                    {t(\"modals.allowPreviewDescription\")}\r\n                                </Typography>\r\n                            </ExpansionPanelDetails>\r\n                        </ExpansionPanel>\r\n                    </List>\r\n                    <Divider />\r\n                </>\r\n            )}\r\n            {shareURL !== \"\" && (\r\n                <DialogContent>\r\n                    <TextField\r\n                        onFocus={handleFocus}\r\n                        autoFocus\r\n                        inputProps={{ readonly: true }}\r\n                        label={t(\"modals.shareLink\")}\r\n                        value={shareURL}\r\n                        variant=\"outlined\"\r\n                        fullWidth\r\n                    />\r\n                </DialogContent>\r\n            )}\r\n\r\n            <DialogActions>\r\n                {shareURL !== \"\" && (\r\n                    <div className={classes.wrapper}>\r\n                        <Button onClick={senLink} color=\"secondary\">\r\n                            {t(\"modals.sendLink\")}\r\n                        </Button>\r\n                    </div>\r\n                )}\r\n                <Button onClick={onClose}>\r\n                    {t(\"close\", { ns: \"common\" })}\r\n                </Button>\r\n\r\n                {shareURL === \"\" && (\r\n                    <div className={classes.wrapper}>\r\n                        <Button\r\n                            onClick={submitShare}\r\n                            color=\"secondary\"\r\n                            disabled={props.modalsLoading}\r\n                        >\r\n                            {t(\"modals.createShareLink\")}\r\n                            {props.modalsLoading && (\r\n                                <CircularProgress\r\n                                    size={24}\r\n                                    className={classes.buttonProgress}\r\n                                />\r\n                            )}\r\n                        </Button>\r\n                    </div>\r\n                )}\r\n            </DialogActions>\r\n        </Dialog>\r\n    );\r\n}\r\n","import React, { useCallback, useState } from \"react\";\r\nimport {\r\n    Button,\r\n    CircularProgress,\r\n    Dialog,\r\n    DialogActions,\r\n    DialogContent,\r\n    DialogContentText,\r\n    DialogTitle,\r\n    makeStyles,\r\n} from \"@material-ui/core\";\r\nimport PathSelector from \"../FileManager/PathSelector\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport { setModalsLoading, toggleSnackbar } from \"../../redux/explorer\";\r\nimport { submitDecompressTask } from \"../../redux/explorer/action\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    contentFix: {\r\n        padding: \"10px 24px 0px 24px\",\r\n    },\r\n    wrapper: {\r\n        margin: theme.spacing(1),\r\n        position: \"relative\",\r\n    },\r\n    buttonProgress: {\r\n        color: theme.palette.secondary.light,\r\n        position: \"absolute\",\r\n        top: \"50%\",\r\n        left: \"50%\",\r\n        marginTop: -12,\r\n        marginLeft: -12,\r\n    },\r\n}));\r\n\r\nexport default function DecompressDialog(props) {\r\n    const { t } = useTranslation();\r\n    const [selectedPath, setSelectedPath] = useState(\"\");\r\n    const [selectedPathName, setSelectedPathName] = useState(\"\");\r\n\r\n    const dispatch = useDispatch();\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n    const SetModalsLoading = useCallback(\r\n        (status) => {\r\n            dispatch(setModalsLoading(status));\r\n        },\r\n        [dispatch]\r\n    );\r\n    const SubmitDecompressTask = useCallback(\r\n        (path) => dispatch(submitDecompressTask(path)),\r\n        [dispatch]\r\n    );\r\n\r\n    const setMoveTarget = (folder) => {\r\n        const path =\r\n            folder.path === \"/\"\r\n                ? folder.path + folder.name\r\n                : folder.path + \"/\" + folder.name;\r\n        setSelectedPath(path);\r\n        setSelectedPathName(folder.name);\r\n    };\r\n\r\n    const submitMove = (e) => {\r\n        if (e != null) {\r\n            e.preventDefault();\r\n        }\r\n        SetModalsLoading(true);\r\n        SubmitDecompressTask(selectedPath)\r\n            .then(() => {\r\n                props.onClose();\r\n                ToggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    t(\"modals.taskCreated\"),\r\n                    \"success\"\r\n                );\r\n                SetModalsLoading(false);\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n                SetModalsLoading(false);\r\n            });\r\n    };\r\n\r\n    const classes = useStyles();\r\n\r\n    return (\r\n        <Dialog\r\n            open={props.open}\r\n            onClose={props.onClose}\r\n            aria-labelledby=\"form-dialog-title\"\r\n        >\r\n            <DialogTitle id=\"form-dialog-title\">\r\n                {t(\"modals.decompressTo\")}\r\n            </DialogTitle>\r\n            <PathSelector\r\n                presentPath={props.presentPath}\r\n                selected={props.selected}\r\n                onSelect={setMoveTarget}\r\n            />\r\n\r\n            {selectedPath !== \"\" && (\r\n                <DialogContent className={classes.contentFix}>\r\n                    <DialogContentText>\r\n                        <Trans\r\n                            i18nKey=\"modals.decompressToDst\"\r\n                            values={{\r\n                                name: selectedPathName,\r\n                            }}\r\n                            components={[<strong key={0} />]}\r\n                        />\r\n                    </DialogContentText>\r\n                </DialogContent>\r\n            )}\r\n            <DialogActions>\r\n                <Button onClick={props.onClose}>\r\n                    {t(\"cancel\", { ns: \"common\" })}\r\n                </Button>\r\n                <div className={classes.wrapper}>\r\n                    <Button\r\n                        onClick={submitMove}\r\n                        color=\"primary\"\r\n                        disabled={selectedPath === \"\" || props.modalsLoading}\r\n                    >\r\n                        {t(\"ok\", { ns: \"common\" })}\r\n                        {props.modalsLoading && (\r\n                            <CircularProgress\r\n                                size={24}\r\n                                className={classes.buttonProgress}\r\n                            />\r\n                        )}\r\n                    </Button>\r\n                </div>\r\n            </DialogActions>\r\n        </Dialog>\r\n    );\r\n}\r\n","import React, { useCallback, useState } from \"react\";\r\nimport {\r\n    Button,\r\n    CircularProgress,\r\n    Dialog,\r\n    DialogActions,\r\n    DialogContent,\r\n    DialogContentText,\r\n    DialogTitle,\r\n    makeStyles,\r\n} from \"@material-ui/core\";\r\nimport PathSelector from \"../FileManager/PathSelector\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport TextField from \"@material-ui/core/TextField\";\r\nimport { setModalsLoading, toggleSnackbar } from \"../../redux/explorer\";\r\nimport { submitCompressTask } from \"../../redux/explorer/action\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    contentFix: {\r\n        padding: \"10px 24px 0px 24px\",\r\n        backgroundColor: theme.palette.background.default,\r\n    },\r\n    wrapper: {\r\n        margin: theme.spacing(1),\r\n        position: \"relative\",\r\n    },\r\n    buttonProgress: {\r\n        color: theme.palette.secondary.light,\r\n        position: \"absolute\",\r\n        top: \"50%\",\r\n        left: \"50%\",\r\n        marginTop: -12,\r\n        marginLeft: -12,\r\n    },\r\n}));\r\n\r\nexport default function CompressDialog(props) {\r\n    const { t } = useTranslation();\r\n    const [selectedPath, setSelectedPath] = useState(\"\");\r\n    const [fileName, setFileName] = useState(\"\");\r\n    // eslint-disable-next-line\r\n    const [selectedPathName, setSelectedPathName] = useState(\"\");\r\n\r\n    const dispatch = useDispatch();\r\n\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n\r\n    const SetModalsLoading = useCallback(\r\n        (status) => {\r\n            dispatch(setModalsLoading(status));\r\n        },\r\n        [dispatch]\r\n    );\r\n\r\n    const SubmitCompressTask = useCallback(\r\n        (name, path) => dispatch(submitCompressTask(name, path)),\r\n        [dispatch]\r\n    );\r\n\r\n    const setMoveTarget = (folder) => {\r\n        const path =\r\n            folder.path === \"/\"\r\n                ? folder.path + folder.name\r\n                : folder.path + \"/\" + folder.name;\r\n        setSelectedPath(path);\r\n        setSelectedPathName(folder.name);\r\n    };\r\n\r\n    const submitMove = (e) => {\r\n        if (e != null) {\r\n            e.preventDefault();\r\n        }\r\n        SetModalsLoading(true);\r\n\r\n        SubmitCompressTask(fileName, selectedPath)\r\n            .then(() => {\r\n                props.onClose();\r\n                ToggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    t(\"modals.taskCreated\"),\r\n                    \"success\"\r\n                );\r\n                SetModalsLoading(false);\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n                SetModalsLoading(false);\r\n            });\r\n    };\r\n\r\n    const classes = useStyles();\r\n\r\n    return (\r\n        <Dialog\r\n            open={props.open}\r\n            onClose={props.onClose}\r\n            aria-labelledby=\"form-dialog-title\"\r\n        >\r\n            <DialogTitle id=\"form-dialog-title\">\r\n                {t(\"modals.saveToTitle\")}\r\n            </DialogTitle>\r\n            <PathSelector\r\n                presentPath={props.presentPath}\r\n                selected={props.selected}\r\n                onSelect={setMoveTarget}\r\n            />\r\n\r\n            {selectedPath !== \"\" && (\r\n                <DialogContent className={classes.contentFix}>\r\n                    <DialogContentText>\r\n                        <TextField\r\n                            onChange={(e) => setFileName(e.target.value)}\r\n                            value={fileName}\r\n                            fullWidth\r\n                            autoFocus\r\n                            id=\"standard-basic\"\r\n                            label={t(\"modals.zipFileName\")}\r\n                        />\r\n                    </DialogContentText>\r\n                </DialogContent>\r\n            )}\r\n            <DialogActions>\r\n                <Button onClick={props.onClose}>\r\n                    {t(\"cancel\", { ns: \"common\" })}\r\n                </Button>\r\n                <div className={classes.wrapper}>\r\n                    <Button\r\n                        onClick={submitMove}\r\n                        color=\"primary\"\r\n                        disabled={\r\n                            selectedPath === \"\" ||\r\n                            fileName === \"\" ||\r\n                            props.modalsLoading\r\n                        }\r\n                    >\r\n                        {t(\"ok\", { ns: \"common\" })}\r\n                        {props.modalsLoading && (\r\n                            <CircularProgress\r\n                                size={24}\r\n                                className={classes.buttonProgress}\r\n                            />\r\n                        )}\r\n                    </Button>\r\n                </div>\r\n            </DialogActions>\r\n        </Dialog>\r\n    );\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { connect } from \"react-redux\";\r\nimport PathSelector from \"./PathSelector\";\r\nimport API, { AppError } from \"../../middleware/Api\";\r\nimport {\r\n    Button,\r\n    CircularProgress,\r\n    Dialog,\r\n    DialogActions,\r\n    DialogContent,\r\n    DialogContentText,\r\n    DialogTitle,\r\n    TextField,\r\n    withStyles,\r\n} from \"@material-ui/core\";\r\nimport Loading from \"../Modals/Loading\";\r\nimport CopyDialog from \"../Modals/Copy\";\r\nimport DirectoryDownloadDialog from \"../Modals/DirectoryDownload\";\r\nimport CreatShare from \"../Modals/CreateShare\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport DecompressDialog from \"../Modals/Decompress\";\r\nimport CompressDialog from \"../Modals/Compress\";\r\nimport {\r\n    closeAllModals,\r\n    openLoadingDialog,\r\n    refreshFileList,\r\n    refreshStorage,\r\n    setModalsLoading,\r\n    toggleSnackbar,\r\n} from \"../../redux/explorer\";\r\nimport OptionSelector from \"../Modals/OptionSelector\";\r\nimport { getDownloadURL } from \"../../services/file\";\r\nimport { Trans, withTranslation } from \"react-i18next\";\r\n\r\nconst styles = (theme) => ({\r\n    wrapper: {\r\n        margin: theme.spacing(1),\r\n        position: \"relative\",\r\n    },\r\n    buttonProgress: {\r\n        color: theme.palette.secondary.light,\r\n        position: \"absolute\",\r\n        top: \"50%\",\r\n        left: \"50%\",\r\n        marginTop: -12,\r\n        marginLeft: -12,\r\n    },\r\n    contentFix: {\r\n        padding: \"10px 24px 0px 24px\",\r\n    },\r\n});\r\n\r\nconst mapStateToProps = (state) => {\r\n    return {\r\n        path: state.navigator.path,\r\n        selected: state.explorer.selected,\r\n        modalsStatus: state.viewUpdate.modals,\r\n        modalsLoading: state.viewUpdate.modalsLoading,\r\n        dirList: state.explorer.dirList,\r\n        fileList: state.explorer.fileList,\r\n        dndSignale: state.explorer.dndSignal,\r\n        dndTarget: state.explorer.dndTarget,\r\n        dndSource: state.explorer.dndSource,\r\n        loading: state.viewUpdate.modals.loading,\r\n        loadingText: state.viewUpdate.modals.loadingText,\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n    return {\r\n        closeAllModals: () => {\r\n            dispatch(closeAllModals());\r\n        },\r\n        toggleSnackbar: (vertical, horizontal, msg, color) => {\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color));\r\n        },\r\n        setModalsLoading: (status) => {\r\n            dispatch(setModalsLoading(status));\r\n        },\r\n        refreshFileList: () => {\r\n            dispatch(refreshFileList());\r\n        },\r\n        refreshStorage: () => {\r\n            dispatch(refreshStorage());\r\n        },\r\n        openLoadingDialog: (text) => {\r\n            dispatch(openLoadingDialog(text));\r\n        },\r\n    };\r\n};\r\n\r\nclass ModalsCompoment extends Component {\r\n    state = {\r\n        newFolderName: \"\",\r\n        newFileName: \"\",\r\n        newName: \"\",\r\n        selectedPath: \"\",\r\n        selectedPathName: \"\",\r\n        secretShare: false,\r\n        sharePwd: \"\",\r\n        shareUrl: \"\",\r\n        downloadURL: \"\",\r\n        remoteDownloadPathSelect: false,\r\n        purchaseCallback: null,\r\n    };\r\n\r\n    handleInputChange = (e) => {\r\n        this.setState({\r\n            [e.target.id]: e.target.value,\r\n        });\r\n    };\r\n\r\n    newNameSuffix = \"\";\r\n\r\n    UNSAFE_componentWillReceiveProps = (nextProps) => {\r\n        if (this.props.dndSignale !== nextProps.dndSignale) {\r\n            this.dragMove(nextProps.dndSource, nextProps.dndTarget);\r\n            return;\r\n        }\r\n\r\n        if (this.props.modalsStatus.rename !== nextProps.modalsStatus.rename) {\r\n            const name = nextProps.selected[0].name;\r\n            this.setState({\r\n                newName: name,\r\n            });\r\n            return;\r\n        }\r\n    };\r\n\r\n    scoreHandler = (callback) => {\r\n        callback();\r\n    };\r\n\r\n    Download = () => {\r\n        getDownloadURL(this.props.selected[0])\r\n            .then((response) => {\r\n                window.location.assign(response.data);\r\n                this.onClose();\r\n                this.downloaded = true;\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n                this.onClose();\r\n            });\r\n    };\r\n\r\n    submitRemove = (e) => {\r\n        e.preventDefault();\r\n        this.props.setModalsLoading(true);\r\n        const dirs = [],\r\n            items = [];\r\n        // eslint-disable-next-line\r\n        this.props.selected.map((value) => {\r\n            if (value.type === \"dir\") {\r\n                dirs.push(value.id);\r\n            } else {\r\n                items.push(value.id);\r\n            }\r\n        });\r\n        API.delete(\"/object\", {\r\n            data: {\r\n                items: items,\r\n                dirs: dirs,\r\n            },\r\n        })\r\n            .then((response) => {\r\n                if (response.rawData.code === 0) {\r\n                    this.onClose();\r\n                    setTimeout(this.props.refreshFileList, 500);\r\n                } else {\r\n                    this.props.toggleSnackbar(\r\n                        \"top\",\r\n                        \"right\",\r\n                        response.rawData.msg,\r\n                        \"warning\"\r\n                    );\r\n                }\r\n                this.props.setModalsLoading(false);\r\n                this.props.refreshStorage();\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n                this.props.setModalsLoading(false);\r\n            });\r\n    };\r\n\r\n    submitMove = (e) => {\r\n        if (e != null) {\r\n            e.preventDefault();\r\n        }\r\n        this.props.setModalsLoading(true);\r\n        const dirs = [],\r\n            items = [];\r\n        // eslint-disable-next-line\r\n        this.props.selected.map((value) => {\r\n            if (value.type === \"dir\") {\r\n                dirs.push(value.id);\r\n            } else {\r\n                items.push(value.id);\r\n            }\r\n        });\r\n        API.patch(\"/object\", {\r\n            action: \"move\",\r\n            src_dir: this.props.selected[0].path,\r\n            src: {\r\n                dirs: dirs,\r\n                items: items,\r\n            },\r\n            dst: this.DragSelectedPath\r\n                ? this.DragSelectedPath\r\n                : this.state.selectedPath === \"//\"\r\n                ? \"/\"\r\n                : this.state.selectedPath,\r\n        })\r\n            .then(() => {\r\n                this.onClose();\r\n                this.props.refreshFileList();\r\n                this.props.setModalsLoading(false);\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n                this.props.setModalsLoading(false);\r\n            })\r\n            .then(() => {\r\n                this.props.closeAllModals();\r\n            });\r\n    };\r\n\r\n    dragMove = (source, target) => {\r\n        if (this.props.selected.length === 0) {\r\n            this.props.selected[0] = source;\r\n        }\r\n        let doMove = true;\r\n\r\n        // eslint-disable-next-line\r\n        this.props.selected.map((value) => {\r\n            // 根据ID过滤\r\n            if (value.id === target.id && value.type === target.type) {\r\n                doMove = false;\r\n                // eslint-disable-next-line\r\n                return;\r\n            }\r\n            // 根据路径过滤\r\n            if (\r\n                value.path ===\r\n                target.path + (target.path === \"/\" ? \"\" : \"/\") + target.name\r\n            ) {\r\n                doMove = false;\r\n                // eslint-disable-next-line\r\n                return;\r\n            }\r\n        });\r\n        if (doMove) {\r\n            this.DragSelectedPath =\r\n                target.path === \"/\"\r\n                    ? target.path + target.name\r\n                    : target.path + \"/\" + target.name;\r\n            this.props.openLoadingDialog(this.props.t(\"modals.processing\"));\r\n            this.submitMove();\r\n        }\r\n    };\r\n\r\n    submitRename = (e) => {\r\n        e.preventDefault();\r\n        this.props.setModalsLoading(true);\r\n        const newName = this.state.newName;\r\n\r\n        const src = {\r\n            dirs: [],\r\n            items: [],\r\n        };\r\n\r\n        if (this.props.selected[0].type === \"dir\") {\r\n            src.dirs[0] = this.props.selected[0].id;\r\n        } else {\r\n            src.items[0] = this.props.selected[0].id;\r\n        }\r\n\r\n        // 检查重名\r\n        if (\r\n            this.props.dirList.findIndex((value) => {\r\n                return value.name === newName;\r\n            }) !== -1 ||\r\n            this.props.fileList.findIndex((value) => {\r\n                return value.name === newName;\r\n            }) !== -1\r\n        ) {\r\n            this.props.toggleSnackbar(\r\n                \"top\",\r\n                \"right\",\r\n                this.props.t(\"modals.duplicatedObjectName\"),\r\n                \"warning\"\r\n            );\r\n            this.props.setModalsLoading(false);\r\n        } else {\r\n            API.post(\"/object/rename\", {\r\n                action: \"rename\",\r\n                src: src,\r\n                new_name: newName,\r\n            })\r\n                .then(() => {\r\n                    this.onClose();\r\n                    this.props.refreshFileList();\r\n                    this.props.setModalsLoading(false);\r\n                })\r\n                .catch((error) => {\r\n                    this.props.toggleSnackbar(\r\n                        \"top\",\r\n                        \"right\",\r\n                        error.message,\r\n                        \"error\"\r\n                    );\r\n                    this.props.setModalsLoading(false);\r\n                });\r\n        }\r\n    };\r\n\r\n    submitCreateNewFolder = (e) => {\r\n        e.preventDefault();\r\n        this.props.setModalsLoading(true);\r\n        if (\r\n            this.props.dirList.findIndex((value) => {\r\n                return value.name === this.state.newFolderName;\r\n            }) !== -1\r\n        ) {\r\n            this.props.toggleSnackbar(\r\n                \"top\",\r\n                \"right\",\r\n                this.props.t(\"modals.duplicatedFolderName\"),\r\n                \"warning\"\r\n            );\r\n            this.props.setModalsLoading(false);\r\n        } else {\r\n            API.put(\"/directory\", {\r\n                path:\r\n                    (this.props.path === \"/\" ? \"\" : this.props.path) +\r\n                    \"/\" +\r\n                    this.state.newFolderName,\r\n            })\r\n                .then(() => {\r\n                    this.onClose();\r\n                    this.props.refreshFileList();\r\n                    this.props.setModalsLoading(false);\r\n                })\r\n                .catch((error) => {\r\n                    this.props.setModalsLoading(false);\r\n\r\n                    this.props.toggleSnackbar(\r\n                        \"top\",\r\n                        \"right\",\r\n                        error.message,\r\n                        \"error\"\r\n                    );\r\n                });\r\n        }\r\n        //this.props.toggleSnackbar();\r\n    };\r\n\r\n    submitCreateNewFile = (e) => {\r\n        e.preventDefault();\r\n        this.props.setModalsLoading(true);\r\n        if (\r\n            this.props.dirList.findIndex((value) => {\r\n                return value.name === this.state.newFileName;\r\n            }) !== -1\r\n        ) {\r\n            this.props.toggleSnackbar(\r\n                \"top\",\r\n                \"right\",\r\n                this.props.t(\"modals.duplicatedFolderName\"),\r\n                \"warning\"\r\n            );\r\n            this.props.setModalsLoading(false);\r\n        } else {\r\n            API.post(\"/file/create\", {\r\n                path:\r\n                    (this.props.path === \"/\" ? \"\" : this.props.path) +\r\n                    \"/\" +\r\n                    this.state.newFileName,\r\n            })\r\n                .then(() => {\r\n                    this.onClose();\r\n                    this.props.refreshFileList();\r\n                    this.props.setModalsLoading(false);\r\n                })\r\n                .catch((error) => {\r\n                    this.props.setModalsLoading(false);\r\n\r\n                    this.props.toggleSnackbar(\r\n                        \"top\",\r\n                        \"right\",\r\n                        error.message,\r\n                        \"error\"\r\n                    );\r\n                });\r\n        }\r\n        //this.props.toggleSnackbar();\r\n    };\r\n\r\n    submitTorrentDownload = (e) => {\r\n        e.preventDefault();\r\n        this.props.setModalsLoading(true);\r\n        API.post(\"/aria2/torrent/\" + this.props.selected[0].id, {\r\n            dst:\r\n                this.state.selectedPath === \"//\"\r\n                    ? \"/\"\r\n                    : this.state.selectedPath,\r\n        })\r\n            .then(() => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    this.props.t(\"modals.taskCreated\"),\r\n                    \"success\"\r\n                );\r\n                this.onClose();\r\n                this.props.setModalsLoading(false);\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n                this.props.setModalsLoading(false);\r\n            });\r\n    };\r\n\r\n    submitDownload = (e) => {\r\n        e.preventDefault();\r\n        this.props.setModalsLoading(true);\r\n        API.post(\"/aria2/url\", {\r\n            url: this.state.downloadURL.split(\"\\n\"),\r\n            dst:\r\n                this.state.selectedPath === \"//\"\r\n                    ? \"/\"\r\n                    : this.state.selectedPath,\r\n        })\r\n            .then((response) => {\r\n                const failed = response.data\r\n                    .filter((r) => r.code !== 0)\r\n                    .map((r) => new AppError(r.msg, r.code, r.error).message);\r\n                if (failed.length > 0) {\r\n                    this.props.toggleSnackbar(\r\n                        \"top\",\r\n                        \"right\",\r\n                        this.props.t(\"modals.taskCreateFailed\", {\r\n                            failed: failed.length,\r\n                            details: failed.join(\",\"),\r\n                        }),\r\n                        \"warning\"\r\n                    );\r\n                } else {\r\n                    this.props.toggleSnackbar(\r\n                        \"top\",\r\n                        \"right\",\r\n                        this.props.t(\"modals.taskCreated\"),\r\n                        \"success\"\r\n                    );\r\n                }\r\n\r\n                this.onClose();\r\n                this.props.setModalsLoading(false);\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n                this.props.setModalsLoading(false);\r\n            });\r\n    };\r\n\r\n    setMoveTarget = (folder) => {\r\n        const path =\r\n            folder.path === \"/\"\r\n                ? folder.path + folder.name\r\n                : folder.path + \"/\" + folder.name;\r\n        this.setState({\r\n            selectedPath: path,\r\n            selectedPathName: folder.name,\r\n        });\r\n    };\r\n\r\n    remoteDownloadNext = () => {\r\n        this.props.closeAllModals();\r\n        this.setState({\r\n            remoteDownloadPathSelect: true,\r\n        });\r\n    };\r\n\r\n    onClose = () => {\r\n        this.setState({\r\n            newFolderName: \"\",\r\n            newFileName: \"\",\r\n            newName: \"\",\r\n            selectedPath: \"\",\r\n            selectedPathName: \"\",\r\n            secretShare: false,\r\n            sharePwd: \"\",\r\n            downloadURL: \"\",\r\n            shareUrl: \"\",\r\n            remoteDownloadPathSelect: false,\r\n        });\r\n        this.newNameSuffix = \"\";\r\n        this.props.closeAllModals();\r\n    };\r\n\r\n    handleChange = (name) => (event) => {\r\n        this.setState({ [name]: event.target.checked });\r\n    };\r\n\r\n    copySource = () => {\r\n        if (navigator.clipboard) {\r\n            navigator.clipboard.writeText(this.props.modalsStatus.getSource);\r\n            this.props.toggleSnackbar(\r\n                \"top\",\r\n                \"right\",\r\n                this.props.t(\"modals.linkCopied\"),\r\n                \"info\"\r\n            );\r\n        }\r\n    };\r\n\r\n    render() {\r\n        const { classes, t } = this.props;\r\n\r\n        return (\r\n            <div>\r\n                <Loading />\r\n                <OptionSelector />\r\n                <Dialog\r\n                    open={this.props.modalsStatus.getSource}\r\n                    onClose={this.onClose}\r\n                    aria-labelledby=\"form-dialog-title\"\r\n                    fullWidth\r\n                >\r\n                    <DialogTitle id=\"form-dialog-title\">\r\n                        {t(\"modals.getSourceLinkTitle\")}\r\n                    </DialogTitle>\r\n\r\n                    <DialogContent>\r\n                        <TextField\r\n                            autoFocus\r\n                            inputProps={{ readonly: true }}\r\n                            label={t(\"modals.sourceLink\")}\r\n                            multiline\r\n                            value={this.props.modalsStatus.getSource}\r\n                            variant=\"outlined\"\r\n                            fullWidth\r\n                        />\r\n                    </DialogContent>\r\n                    <DialogActions>\r\n                        <Button onClick={this.copySource} color=\"secondary\">\r\n                            {t(\"copyToClipboard\", { ns: \"common\" })}\r\n                        </Button>\r\n                        <Button onClick={this.onClose}>\r\n                            {t(\"close\", { ns: \"common\" })}\r\n                        </Button>\r\n                    </DialogActions>\r\n                </Dialog>\r\n                <Dialog\r\n                    open={this.props.modalsStatus.createNewFolder}\r\n                    onClose={this.onClose}\r\n                    aria-labelledby=\"form-dialog-title\"\r\n                >\r\n                    <DialogTitle id=\"form-dialog-title\">\r\n                        {t(\"fileManager.newFolder\")}\r\n                    </DialogTitle>\r\n\r\n                    <DialogContent>\r\n                        <form onSubmit={this.submitCreateNewFolder}>\r\n                            <TextField\r\n                                autoFocus\r\n                                margin=\"dense\"\r\n                                id=\"newFolderName\"\r\n                                label={t(\"modals.folderName\")}\r\n                                type=\"text\"\r\n                                value={this.state.newFolderName}\r\n                                onChange={(e) => this.handleInputChange(e)}\r\n                                fullWidth\r\n                            />\r\n                        </form>\r\n                    </DialogContent>\r\n                    <DialogActions>\r\n                        <Button onClick={this.onClose}>\r\n                            {t(\"cancel\", { ns: \"common\" })}\r\n                        </Button>\r\n                        <div className={classes.wrapper}>\r\n                            <Button\r\n                                onClick={this.submitCreateNewFolder}\r\n                                color=\"primary\"\r\n                                disabled={\r\n                                    this.state.newFolderName === \"\" ||\r\n                                    this.props.modalsLoading\r\n                                }\r\n                            >\r\n                                {t(\"modals.create\")}\r\n                                {this.props.modalsLoading && (\r\n                                    <CircularProgress\r\n                                        size={24}\r\n                                        className={classes.buttonProgress}\r\n                                    />\r\n                                )}\r\n                            </Button>\r\n                        </div>\r\n                    </DialogActions>\r\n                </Dialog>\r\n\r\n                <Dialog\r\n                    open={this.props.modalsStatus.createNewFile}\r\n                    onClose={this.onClose}\r\n                    aria-labelledby=\"form-dialog-title\"\r\n                >\r\n                    <DialogTitle id=\"form-dialog-title\">\r\n                        {t(\"fileManager.newFile\")}\r\n                    </DialogTitle>\r\n\r\n                    <DialogContent>\r\n                        <form onSubmit={this.submitCreateNewFile}>\r\n                            <TextField\r\n                                autoFocus\r\n                                margin=\"dense\"\r\n                                id=\"newFileName\"\r\n                                label={t(\"modals.fileName\")}\r\n                                type=\"text\"\r\n                                value={this.state.newFileName}\r\n                                onChange={(e) => this.handleInputChange(e)}\r\n                                fullWidth\r\n                            />\r\n                        </form>\r\n                    </DialogContent>\r\n                    <DialogActions>\r\n                        <Button onClick={this.onClose}>\r\n                            {t(\"cancel\", { ns: \"common\" })}\r\n                        </Button>\r\n                        <div className={classes.wrapper}>\r\n                            <Button\r\n                                onClick={this.submitCreateNewFile}\r\n                                color=\"primary\"\r\n                                disabled={\r\n                                    this.state.newFileName === \"\" ||\r\n                                    this.props.modalsLoading\r\n                                }\r\n                            >\r\n                                {t(\"modals.create\")}\r\n                                {this.props.modalsLoading && (\r\n                                    <CircularProgress\r\n                                        size={24}\r\n                                        className={classes.buttonProgress}\r\n                                    />\r\n                                )}\r\n                            </Button>\r\n                        </div>\r\n                    </DialogActions>\r\n                </Dialog>\r\n\r\n                <Dialog\r\n                    open={this.props.modalsStatus.rename}\r\n                    onClose={this.onClose}\r\n                    aria-labelledby=\"form-dialog-title\"\r\n                    maxWidth=\"sm\"\r\n                    fullWidth={true}\r\n                >\r\n                    <DialogTitle id=\"form-dialog-title\">\r\n                        {t(\"fileManager.rename\")}\r\n                    </DialogTitle>\r\n                    <DialogContent>\r\n                        <DialogContentText>\r\n                            <Trans\r\n                                i18nKey=\"modals.renameDescription\"\r\n                                values={{\r\n                                    name:\r\n                                        this.props.selected.length === 1\r\n                                            ? this.props.selected[0].name\r\n                                            : \"\",\r\n                                }}\r\n                                components={[<strong key={0} />]}\r\n                            />\r\n                        </DialogContentText>\r\n                        <form onSubmit={this.submitRename}>\r\n                            <TextField\r\n                                autoFocus\r\n                                margin=\"dense\"\r\n                                id=\"newName\"\r\n                                label={t(\"modals.newName\")}\r\n                                type=\"text\"\r\n                                value={this.state.newName}\r\n                                onChange={(e) => this.handleInputChange(e)}\r\n                                fullWidth\r\n                            />\r\n                        </form>\r\n                    </DialogContent>\r\n                    <DialogActions>\r\n                        <Button onClick={this.onClose}>\r\n                            {t(\"cancel\", { ns: \"common\" })}\r\n                        </Button>\r\n                        <div className={classes.wrapper}>\r\n                            <Button\r\n                                onClick={this.submitRename}\r\n                                color=\"primary\"\r\n                                disabled={\r\n                                    this.state.newName === \"\" ||\r\n                                    this.props.modalsLoading\r\n                                }\r\n                            >\r\n                                {t(\"ok\", { ns: \"common\" })}\r\n                                {this.props.modalsLoading && (\r\n                                    <CircularProgress\r\n                                        size={24}\r\n                                        className={classes.buttonProgress}\r\n                                    />\r\n                                )}\r\n                            </Button>\r\n                        </div>\r\n                    </DialogActions>\r\n                </Dialog>\r\n                <CopyDialog\r\n                    open={this.props.modalsStatus.copy}\r\n                    onClose={this.onClose}\r\n                    presentPath={this.props.path}\r\n                    selected={this.props.selected}\r\n                    modalsLoading={this.props.modalsLoading}\r\n                />\r\n\r\n                <Dialog\r\n                    open={this.props.modalsStatus.move}\r\n                    onClose={this.onClose}\r\n                    aria-labelledby=\"form-dialog-title\"\r\n                >\r\n                    <DialogTitle id=\"form-dialog-title\">\r\n                        {t(\"modals.moveToTitle\")}\r\n                    </DialogTitle>\r\n                    <PathSelector\r\n                        presentPath={this.props.path}\r\n                        selected={this.props.selected}\r\n                        onSelect={this.setMoveTarget}\r\n                    />\r\n\r\n                    {this.state.selectedPath !== \"\" && (\r\n                        <DialogContent className={classes.contentFix}>\r\n                            <DialogContentText>\r\n                                <Trans\r\n                                    i18nKey=\"modals.moveToDescription\"\r\n                                    values={{\r\n                                        name: this.state.selectedPathName,\r\n                                    }}\r\n                                    components={[<strong key={0} />]}\r\n                                />\r\n                            </DialogContentText>\r\n                        </DialogContent>\r\n                    )}\r\n                    <DialogActions>\r\n                        <Button onClick={this.onClose}>\r\n                            {t(\"cancel\", { ns: \"common\" })}\r\n                        </Button>\r\n                        <div className={classes.wrapper}>\r\n                            <Button\r\n                                onClick={this.submitMove}\r\n                                color=\"primary\"\r\n                                disabled={\r\n                                    this.state.selectedPath === \"\" ||\r\n                                    this.props.modalsLoading\r\n                                }\r\n                            >\r\n                                {t(\"ok\", { ns: \"common\" })}\r\n                                {this.props.modalsLoading && (\r\n                                    <CircularProgress\r\n                                        size={24}\r\n                                        className={classes.buttonProgress}\r\n                                    />\r\n                                )}\r\n                            </Button>\r\n                        </div>\r\n                    </DialogActions>\r\n                </Dialog>\r\n                <Dialog\r\n                    open={this.props.modalsStatus.remove}\r\n                    onClose={this.onClose}\r\n                    aria-labelledby=\"form-dialog-title\"\r\n                >\r\n                    <DialogTitle id=\"form-dialog-title\">\r\n                        {t(\"modals.deleteTitle\")}\r\n                    </DialogTitle>\r\n\r\n                    <DialogContent>\r\n                        <DialogContentText>\r\n                            {this.props.selected.length === 1 && (\r\n                                <Trans\r\n                                    i18nKey=\"modals.deleteOneDescription\"\r\n                                    values={{\r\n                                        name: this.props.selected[0].name,\r\n                                    }}\r\n                                    components={[<strong key={0} />]}\r\n                                />\r\n                            )}\r\n                            {this.props.selected.length > 1 &&\r\n                                t(\"modals.deleteMultipleDescription\", {\r\n                                    num: this.props.selected.length,\r\n                                })}\r\n                        </DialogContentText>\r\n                    </DialogContent>\r\n                    <DialogActions>\r\n                        <Button onClick={this.onClose}>\r\n                            {t(\"cancel\", { ns: \"common\" })}\r\n                        </Button>\r\n                        <div className={classes.wrapper}>\r\n                            <Button\r\n                                onClick={this.submitRemove}\r\n                                color=\"primary\"\r\n                                disabled={this.props.modalsLoading}\r\n                            >\r\n                                {t(\"ok\", { ns: \"common\" })}\r\n                                {this.props.modalsLoading && (\r\n                                    <CircularProgress\r\n                                        size={24}\r\n                                        className={classes.buttonProgress}\r\n                                    />\r\n                                )}\r\n                            </Button>\r\n                        </div>\r\n                    </DialogActions>\r\n                </Dialog>\r\n\r\n                <CreatShare\r\n                    open={this.props.modalsStatus.share}\r\n                    onClose={this.onClose}\r\n                    modalsLoading={this.props.modalsLoading}\r\n                    setModalsLoading={this.props.setModalsLoading}\r\n                    selected={this.props.selected}\r\n                />\r\n                <Dialog\r\n                    open={this.props.modalsStatus.remoteDownload}\r\n                    onClose={this.onClose}\r\n                    aria-labelledby=\"form-dialog-title\"\r\n                    fullWidth\r\n                >\r\n                    <DialogTitle id=\"form-dialog-title\">\r\n                        {t(\"modals.newRemoteDownloadTitle\")}\r\n                    </DialogTitle>\r\n\r\n                    <DialogContent>\r\n                        <DialogContentText>\r\n                            <TextField\r\n                                label={t(\"modals.remoteDownloadURL\")}\r\n                                autoFocus\r\n                                fullWidth\r\n                                multiline\r\n                                id=\"downloadURL\"\r\n                                onChange={this.handleInputChange}\r\n                                placeholder={t(\r\n                                    \"modals.remoteDownloadURLDescription\"\r\n                                )}\r\n                            />\r\n                        </DialogContentText>\r\n                    </DialogContent>\r\n                    <DialogActions>\r\n                        <Button onClick={this.onClose}>\r\n                            {t(\"cancel\", { ns: \"common\" })}\r\n                        </Button>\r\n                        <Button\r\n                            onClick={this.remoteDownloadNext}\r\n                            color=\"primary\"\r\n                            disabled={\r\n                                this.props.modalsLoading ||\r\n                                this.state.downloadURL === \"\"\r\n                            }\r\n                        >\r\n                            {t(\"ok\", { ns: \"common\" })}\r\n                        </Button>\r\n                    </DialogActions>\r\n                </Dialog>\r\n                <Dialog\r\n                    open={this.state.remoteDownloadPathSelect}\r\n                    onClose={this.onClose}\r\n                    aria-labelledby=\"form-dialog-title\"\r\n                >\r\n                    <DialogTitle id=\"form-dialog-title\">\r\n                        {t(\"modals.remoteDownloadDst\")}\r\n                    </DialogTitle>\r\n                    <PathSelector\r\n                        presentPath={this.props.path}\r\n                        selected={this.props.selected}\r\n                        onSelect={this.setMoveTarget}\r\n                    />\r\n\r\n                    {this.state.selectedPath !== \"\" && (\r\n                        <DialogContent className={classes.contentFix}>\r\n                            <DialogContentText>\r\n                                <Trans\r\n                                    i18nKey=\"modals.downloadTo\"\r\n                                    values={{\r\n                                        name: this.state.selectedPathName,\r\n                                    }}\r\n                                    components={[<strong key={0} />]}\r\n                                />\r\n                            </DialogContentText>\r\n                        </DialogContent>\r\n                    )}\r\n                    <DialogActions>\r\n                        <Button onClick={this.onClose}>\r\n                            {t(\"cancel\", { ns: \"common\" })}\r\n                        </Button>\r\n                        <div className={classes.wrapper}>\r\n                            <Button\r\n                                onClick={this.submitDownload}\r\n                                color=\"primary\"\r\n                                disabled={\r\n                                    this.state.selectedPath === \"\" ||\r\n                                    this.props.modalsLoading\r\n                                }\r\n                            >\r\n                                {t(\"modals.createTask\")}\r\n                                {this.props.modalsLoading && (\r\n                                    <CircularProgress\r\n                                        size={24}\r\n                                        className={classes.buttonProgress}\r\n                                    />\r\n                                )}\r\n                            </Button>\r\n                        </div>\r\n                    </DialogActions>\r\n                </Dialog>\r\n                <Dialog\r\n                    open={this.props.modalsStatus.torrentDownload}\r\n                    onClose={this.onClose}\r\n                    aria-labelledby=\"form-dialog-title\"\r\n                >\r\n                    <DialogTitle id=\"form-dialog-title\">\r\n                        {t(\"modals.remoteDownloadDst\")}\r\n                    </DialogTitle>\r\n                    <PathSelector\r\n                        presentPath={this.props.path}\r\n                        selected={this.props.selected}\r\n                        onSelect={this.setMoveTarget}\r\n                    />\r\n\r\n                    {this.state.selectedPath !== \"\" && (\r\n                        <DialogContent className={classes.contentFix}>\r\n                            <DialogContentText>\r\n                                <Trans\r\n                                    i18nKey=\"modals.downloadTo\"\r\n                                    values={{\r\n                                        name: this.state.selectedPathName,\r\n                                    }}\r\n                                    components={[<strong key={0} />]}\r\n                                />\r\n                            </DialogContentText>\r\n                        </DialogContent>\r\n                    )}\r\n                    <DialogActions>\r\n                        <Button onClick={this.onClose}>\r\n                            {t(\"cancel\", { ns: \"common\" })}\r\n                        </Button>\r\n                        <div className={classes.wrapper}>\r\n                            <Button\r\n                                onClick={this.submitTorrentDownload}\r\n                                color=\"primary\"\r\n                                disabled={\r\n                                    this.state.selectedPath === \"\" ||\r\n                                    this.props.modalsLoading\r\n                                }\r\n                            >\r\n                                {t(\"modals.createTask\")}\r\n                                {this.props.modalsLoading && (\r\n                                    <CircularProgress\r\n                                        size={24}\r\n                                        className={classes.buttonProgress}\r\n                                    />\r\n                                )}\r\n                            </Button>\r\n                        </div>\r\n                    </DialogActions>\r\n                </Dialog>\r\n\r\n                <DecompressDialog\r\n                    open={this.props.modalsStatus.decompress}\r\n                    onClose={this.onClose}\r\n                    presentPath={this.props.path}\r\n                    selected={this.props.selected}\r\n                    modalsLoading={this.props.modalsLoading}\r\n                />\r\n                <CompressDialog\r\n                    open={this.props.modalsStatus.compress}\r\n                    onClose={this.onClose}\r\n                    presentPath={this.props.path}\r\n                    selected={this.props.selected}\r\n                    modalsLoading={this.props.modalsLoading}\r\n                />\r\n                <DirectoryDownloadDialog\r\n                    open={this.props.modalsStatus.directoryDownloading}\r\n                    onClose={this.onClose}\r\n                    done={this.props.modalsStatus.directoryDownloadDone}\r\n                    log={this.props.modalsStatus.directoryDownloadLog}\r\n                />\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nModalsCompoment.propTypes = {\r\n    classes: PropTypes.object.isRequired,\r\n};\r\n\r\nconst Modals = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(withRouter(withTranslation()(ModalsCompoment))));\r\n\r\nexport default Modals;\r\n","import React, { useCallback, useEffect, useState } from \"react\";\r\nimport { Paper } from \"@material-ui/core\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { useLocation, useParams, useRouteMatch } from \"react-router\";\r\nimport API from \"../../middleware/Api\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport Editor from \"for-editor\";\r\nimport SaveButton from \"../Dial/Save\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport TextLoading from \"../Placeholder/TextLoading\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport UseFileSubTitle from \"../../hooks/fileSubtitle\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    layout: {\r\n        width: \"auto\",\r\n        marginTop: \"30px\",\r\n        marginLeft: theme.spacing(3),\r\n        marginRight: theme.spacing(3),\r\n        [theme.breakpoints.up(1100 + theme.spacing(3) * 2)]: {\r\n            marginLeft: theme.spacing(12),\r\n            marginRight: theme.spacing(12),\r\n        },\r\n        marginBottom: 50,\r\n    },\r\n    player: {\r\n        borderRadius: \"4px\",\r\n    },\r\n    root: {\r\n        backgroundColor: \"white\",\r\n        borderRadius: \"8px\",\r\n    },\r\n    \"@global\": {\r\n        \".for-toolbar\": {\r\n            overflowX: \"auto!important\",\r\n        },\r\n    },\r\n}));\r\n\r\nfunction useQuery() {\r\n    return new URLSearchParams(useLocation().search);\r\n}\r\n\r\nexport default function TextViewer() {\r\n    const { t } = useTranslation();\r\n    const [content, setContent] = useState(\"\");\r\n    const [status, setStatus] = useState(\"\");\r\n    const [loading, setLoading] = useState(true);\r\n    const math = useRouteMatch();\r\n    const $vm = React.createRef();\r\n    const location = useLocation();\r\n    const query = useQuery();\r\n    const { id } = useParams();\r\n    UseFileSubTitle(query, math, location);\r\n\r\n    const dispatch = useDispatch();\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n\r\n    useEffect(() => {\r\n        let requestURL = \"/file/content/\" + query.get(\"id\");\r\n        if (pathHelper.isSharePage(location.pathname)) {\r\n            requestURL = \"/share/content/\" + id;\r\n            if (query.get(\"share_path\") !== \"\") {\r\n                requestURL +=\r\n                    \"?path=\" + encodeURIComponent(query.get(\"share_path\"));\r\n            }\r\n        }\r\n\r\n        setLoading(true);\r\n        API.get(requestURL, { responseType: \"arraybuffer\" })\r\n            .then((response) => {\r\n                const buffer = new Buffer(response.rawData, \"binary\");\r\n                const textdata = buffer.toString(); // for string\r\n                setContent(textdata);\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    t(\"fileManager.errorReadFileContent\", {\r\n                        msg: error.message,\r\n                    }),\r\n                    \"error\"\r\n                );\r\n            })\r\n            .then(() => {\r\n                setLoading(false);\r\n            });\r\n        // eslint-disable-next-line\r\n    }, [math.params[0]]);\r\n\r\n    const toBase64 = (file) =>\r\n        new Promise((resolve, reject) => {\r\n            const reader = new FileReader();\r\n            reader.readAsDataURL(file);\r\n            reader.onload = () => resolve(reader.result);\r\n            reader.onerror = (error) => reject(error);\r\n        });\r\n\r\n    const save = () => {\r\n        setStatus(\"loading\");\r\n        API.put(\"/file/update/\" + query.get(\"id\"), content)\r\n            .then(() => {\r\n                setStatus(\"success\");\r\n                setTimeout(() => setStatus(\"\"), 2000);\r\n            })\r\n            .catch((error) => {\r\n                setStatus(\"\");\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n            });\r\n    };\r\n\r\n    const addImg = async ($file) => {\r\n        $vm.current.$img2Url($file.name, await toBase64($file));\r\n        console.log($file);\r\n    };\r\n\r\n    const classes = useStyles();\r\n    return (\r\n        <div className={classes.layout}>\r\n            <Paper className={classes.root} elevation={1}>\r\n                {loading && <TextLoading />}\r\n                {!loading && (\r\n                    <Editor\r\n                        language={t(\"forEditorLocaleCode\", { ns: \"common\" })}\r\n                        ref={$vm}\r\n                        value={content}\r\n                        onSave={() => save()}\r\n                        addImg={($file) => addImg($file)}\r\n                        onChange={(value) => setContent(value)}\r\n                        toolbar={{\r\n                            h1: true, // h1\r\n                            h2: true, // h2\r\n                            h3: true, // h3\r\n                            h4: true, // h4\r\n                            img: true, // 图片\r\n                            link: true, // 链接\r\n                            code: true, // 代码块\r\n                            preview: true, // 预览\r\n                            expand: true, // 全屏\r\n                            /* v0.0.9 */\r\n                            undo: true, // 撤销\r\n                            redo: true, // 重做\r\n                            save: false, // 保存\r\n                            /* v0.2.3 */\r\n                            subfield: true, // 单双栏模式\r\n                        }}\r\n                    />\r\n                )}\r\n            </Paper>\r\n            {!pathHelper.isSharePage(location.pathname) && (\r\n                <SaveButton onClick={save} status={status} />\r\n            )}\r\n        </div>\r\n    );\r\n}\r\n","import React, { Suspense, useCallback, useEffect, useState } from \"react\";\r\nimport { Paper, useTheme } from \"@material-ui/core\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { useLocation, useParams, useRouteMatch } from \"react-router\";\r\nimport API from \"../../middleware/Api\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport SaveButton from \"../Dial/Save\";\r\nimport { codePreviewSuffix } from \"../../config\";\r\nimport TextLoading from \"../Placeholder/TextLoading\";\r\nimport FormControl from \"@material-ui/core/FormControl\";\r\nimport FormControlLabel from \"@material-ui/core/FormControlLabel\";\r\nimport Select from \"@material-ui/core/Select\";\r\nimport Switch from \"@material-ui/core/Switch\";\r\nimport MenuItem from \"@material-ui/core/MenuItem\";\r\nimport Divider from \"@material-ui/core/Divider\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport UseFileSubTitle from \"../../hooks/fileSubtitle\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst MonacoEditor = React.lazy(() =>\r\n    import(/* webpackChunkName: \"codeEditor\" */ \"react-monaco-editor\")\r\n);\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    layout: {\r\n        width: \"auto\",\r\n        marginTop: \"30px\",\r\n        marginLeft: theme.spacing(3),\r\n        marginRight: theme.spacing(3),\r\n        [theme.breakpoints.up(1100 + theme.spacing(3) * 2)]: {\r\n            width: 1100,\r\n            marginLeft: \"auto\",\r\n            marginRight: \"auto\",\r\n        },\r\n        marginBottom: 40,\r\n    },\r\n    editor: {\r\n        borderRadius: \"4px\",\r\n    },\r\n    \"@global\": {\r\n        \".overflow-guard\": {\r\n            borderRadius: \"4px!important\",\r\n        },\r\n    },\r\n    formControl: {\r\n        margin: \"8px 16px 8px 16px\",\r\n    },\r\n    toobar: {\r\n        textAlign: \"right\",\r\n    },\r\n}));\r\n\r\nfunction useQuery() {\r\n    return new URLSearchParams(useLocation().search);\r\n}\r\n\r\nexport default function CodeViewer() {\r\n    const { t } = useTranslation();\r\n    const [content, setContent] = useState(\"\");\r\n    const [status, setStatus] = useState(\"\");\r\n    const [loading, setLoading] = useState(true);\r\n    const [suffix, setSuffix] = useState(\"javascript\");\r\n    const [wordWrap, setWordWrap] = useState(\"off\");\r\n\r\n    const math = useRouteMatch();\r\n    const location = useLocation();\r\n    const query = useQuery();\r\n    const { id } = useParams();\r\n    const theme = useTheme();\r\n    const { title } = UseFileSubTitle(query, math, location);\r\n\r\n    const dispatch = useDispatch();\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n\r\n    useEffect(() => {\r\n        const extension = title.split(\".\");\r\n        setSuffix(codePreviewSuffix[extension.pop()]);\r\n        // eslint-disable-next-line\r\n    }, [title]);\r\n\r\n    useEffect(() => {\r\n        let requestURL = \"/file/content/\" + query.get(\"id\");\r\n        if (pathHelper.isSharePage(location.pathname)) {\r\n            requestURL = \"/share/content/\" + id;\r\n            if (query.get(\"share_path\") !== \"\") {\r\n                requestURL +=\r\n                    \"?path=\" + encodeURIComponent(query.get(\"share_path\"));\r\n            }\r\n        }\r\n\r\n        setLoading(true);\r\n        API.get(requestURL, { responseType: \"arraybuffer\" })\r\n            .then((response) => {\r\n                const buffer = new Buffer(response.rawData, \"binary\");\r\n                const textdata = buffer.toString(); // for string\r\n                setContent(textdata);\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    t(\"fileManager.errorReadFileContent\", {\r\n                        msg: error.message,\r\n                    }),\r\n                    \"error\"\r\n                );\r\n            })\r\n            .then(() => {\r\n                setLoading(false);\r\n            });\r\n        // eslint-disable-next-line\r\n    }, [math.params[0]]);\r\n\r\n    const save = () => {\r\n        setStatus(\"loading\");\r\n        API.put(\"/file/update/\" + query.get(\"id\"), content)\r\n            .then(() => {\r\n                setStatus(\"success\");\r\n                setTimeout(() => setStatus(\"\"), 2000);\r\n            })\r\n            .catch((error) => {\r\n                setStatus(\"\");\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n            });\r\n    };\r\n\r\n    const classes = useStyles();\r\n    const isSharePage = pathHelper.isSharePage(location.pathname);\r\n    return (\r\n        <div className={classes.layout}>\r\n            <Paper className={classes.root} elevation={1}>\r\n                <div className={classes.toobar}>\r\n                    <FormControl className={classes.formControl}>\r\n                        <FormControlLabel\r\n                            control={\r\n                                <Switch\r\n                                    onChange={(e) =>\r\n                                        setWordWrap(\r\n                                            e.target.checked ? \"on\" : \"off\"\r\n                                        )\r\n                                    }\r\n                                />\r\n                            }\r\n                            label={t(\"fileManager.wordWrap\")}\r\n                        />\r\n                    </FormControl>\r\n                    <FormControl className={classes.formControl}>\r\n                        <Select\r\n                            labelId=\"demo-simple-select-label\"\r\n                            id=\"demo-simple-select\"\r\n                            value={suffix}\r\n                            onChange={(e) => setSuffix(e.target.value)}\r\n                        >\r\n                            {Array.from(\r\n                                new Set(\r\n                                    Object.keys(codePreviewSuffix).map((k) => {\r\n                                        return codePreviewSuffix[k];\r\n                                    })\r\n                                )\r\n                            ).map((extension, index) => (\r\n                                <MenuItem value={extension} key={index}>\r\n                                    {extension}\r\n                                </MenuItem>\r\n                            ))}\r\n                        </Select>\r\n                    </FormControl>\r\n                </div>\r\n                <Divider />\r\n                {loading && <TextLoading />}\r\n                {!loading && (\r\n                    <Suspense fallback={<TextLoading />}>\r\n                        <MonacoEditor\r\n                            height=\"calc(100vh - 198px)\"\r\n                            language={suffix}\r\n                            theme={\r\n                                theme.palette.type === \"dark\" ? \"vs-dark\" : \"vs\"\r\n                            }\r\n                            value={content}\r\n                            options={{\r\n                                readOnly: isSharePage,\r\n                                extraEditorClassName: classes.editor,\r\n                                wordWrap: wordWrap,\r\n                            }}\r\n                            onChange={(value) => setContent(value)}\r\n                        />\r\n                    </Suspense>\r\n                )}\r\n            </Paper>\r\n            {!isSharePage && <SaveButton onClick={save} status={status} />}\r\n        </div>\r\n    );\r\n}\r\n","export const sizeToString = (bytes) => {\r\n    if (bytes === 0 || bytes === \"0\") return \"0 B\";\r\n    const k = 1024;\r\n    const sizes = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"];\r\n    const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n    return (bytes / Math.pow(k, i)).toFixed(1) + \" \" + sizes[i];\r\n};\r\n\r\nexport const fixUrlHash = (path) => {\r\n    return path;\r\n};\r\n\r\nexport const setCookie = (name, value, days) => {\r\n    if (days) {\r\n        const date = new Date();\r\n        date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\r\n    }\r\n    document.cookie = name + \"=\" + (value || \"\") + \"; path=/\";\r\n};\r\n\r\nexport const setGetParameter = (paramName, paramValue) => {\r\n    let url = window.location.href;\r\n\r\n    if (url.indexOf(paramName + \"=\") >= 0) {\r\n        const prefix = url.substring(0, url.indexOf(paramName));\r\n        let suffix = url.substring(url.indexOf(paramName));\r\n        suffix = suffix.substring(suffix.indexOf(\"=\") + 1);\r\n        suffix =\r\n            suffix.indexOf(\"&\") >= 0\r\n                ? suffix.substring(suffix.indexOf(\"&\"))\r\n                : \"\";\r\n        url = prefix + paramName + \"=\" + paramValue + suffix;\r\n    } else {\r\n        if (url.indexOf(\"?\") < 0) url += \"?\" + paramName + \"=\" + paramValue;\r\n        else url += \"&\" + paramName + \"=\" + paramValue;\r\n    }\r\n    if (url === window.location.href) {\r\n        return;\r\n    }\r\n    window.history.pushState(null, null, url);\r\n};\r\n\r\nexport const checkGetParameters = (field) => {\r\n    const url = window.location.href;\r\n    if (url.indexOf(\"?\" + field + \"=\") !== -1) return true;\r\n    else if (url.indexOf(\"&\" + field + \"=\") !== -1) return true;\r\n    return false;\r\n};\r\n\r\nexport const changeThemeColor = (color) => {\r\n    const metaThemeColor = window.document.querySelector(\r\n        \"meta[name=theme-color]\"\r\n    );\r\n    metaThemeColor.setAttribute(\"content\", color);\r\n};\r\n\r\nexport function bufferDecode(value) {\r\n    return Uint8Array.from(atob(value), (c) => c.charCodeAt(0));\r\n}\r\n\r\n// ArrayBuffer to URLBase64\r\nexport function bufferEncode(value) {\r\n    return btoa(String.fromCharCode.apply(null, new Uint8Array(value)))\r\n        .replace(/\\+/g, \"-\")\r\n        .replace(/\\//g, \"_\")\r\n        .replace(/=/g, \"\");\r\n}\r\n\r\nexport function pathBack(path) {\r\n    const folders =\r\n        path !== null\r\n            ? path.substr(1).split(\"/\")\r\n            : this.props.path.substr(1).split(\"/\");\r\n    return \"/\" + folders.slice(0, folders.length - 1).join(\"/\");\r\n}\r\n\r\nexport function filePath(file) {\r\n    return file.path === \"/\"\r\n        ? file.path + file.name\r\n        : file.path + \"/\" + file.name;\r\n}\r\n\r\nexport function hex2bin(hex) {\r\n    return parseInt(hex, 16).toString(2).padStart(8, \"0\");\r\n}\r\n\r\nexport function pathJoin(parts, sep) {\r\n    const separator = sep || \"/\";\r\n    parts = parts.map((part, index) => {\r\n        if (index) {\r\n            part = part.replace(new RegExp(\"^\" + separator), \"\");\r\n        }\r\n        if (index !== parts.length - 1) {\r\n            part = part.replace(new RegExp(separator + \"$\"), \"\");\r\n        }\r\n        return part;\r\n    });\r\n    return parts.join(separator);\r\n}\r\n\r\nexport function basename(path) {\r\n    if (!path) {\r\n        return \"\";\r\n    }\r\n    const pathList = path.split(\"/\");\r\n    pathList.pop();\r\n    return pathList.join(\"/\") === \"\" ? \"/\" : pathList.join(\"/\");\r\n}\r\n\r\nexport function filename(path) {\r\n    const pathList = path.split(\"/\");\r\n    return pathList.pop();\r\n}\r\n\r\nexport function fileNameNoExt(filename) {\r\n    return filename.substring(0, filename.lastIndexOf(\".\")) || filename;\r\n}\r\n\r\nexport function randomStr(length) {\r\n    let result = \"\";\r\n    const characters =\r\n        \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\r\n    const charactersLength = characters.length;\r\n    for (let i = 0; i < length; i++) {\r\n        result += characters.charAt(\r\n            Math.floor(Math.random() * charactersLength)\r\n        );\r\n    }\r\n    return result;\r\n}\r\n\r\nexport function getNumber(base, conditions) {\r\n    conditions.forEach((v) => {\r\n        if (v) {\r\n            base++;\r\n        }\r\n    });\r\n    return base;\r\n}\r\n\r\nexport const isMac = () => {\r\n    return navigator.platform.toUpperCase().indexOf(\"MAC\") >= 0;\r\n};\r\n\r\nexport const isMobileSafari = () => {\r\n    const ua = window.navigator.userAgent;\r\n    const iOS = !!ua.match(/iPad/i) || !!ua.match(/iPhone/i);\r\n    const webkit = !!ua.match(/WebKit/i);\r\n    return iOS && webkit && !ua.match(/CriOS/i);\r\n};\r\n\r\nexport function vhCheck() {\r\n    const vh = window.innerHeight;\r\n    document.documentElement.style.setProperty(\"--vh\", `${vh}px`);\r\n}\r\n","import {\r\n    OneDriveError,\r\n    Policy,\r\n    QiniuError,\r\n    Response,\r\n    UpyunError,\r\n} from \"../types\";\r\nimport { sizeToString } from \"../utils\";\r\nimport i18next from \"../../../../i18n\";\r\nimport { AppError } from \"../../../../middleware/Api\";\r\n\r\nexport enum UploaderErrorName {\r\n    InvalidFile = \"InvalidFile\",\r\n    NoPolicySelected = \"NoPolicySelected\",\r\n    UnknownPolicyType = \"UnknownPolicyType\",\r\n    FailedCreateUploadSession = \"FailedCreateUploadSession\",\r\n    FailedDeleteUploadSession = \"FailedDeleteUploadSession\",\r\n    HTTPRequestFailed = \"HTTPRequestFailed\",\r\n    LocalChunkUploadFailed = \"LocalChunkUploadFailed\",\r\n    SlaveChunkUploadFailed = \"SlaveChunkUploadFailed\",\r\n    WriteCtxFailed = \"WriteCtxFailed\",\r\n    RemoveCtxFailed = \"RemoveCtxFailed\",\r\n    ReadCtxFailed = \"ReadCtxFailed\",\r\n    InvalidCtxData = \"InvalidCtxData\",\r\n    CtxExpired = \"CtxExpired\",\r\n    RequestCanceled = \"RequestCanceled\",\r\n    ProcessingTaskDuplicated = \"ProcessingTaskDuplicated\",\r\n    OneDriveChunkUploadFailed = \"OneDriveChunkUploadFailed\",\r\n    OneDriveEmptyFile = \"OneDriveEmptyFile\",\r\n    FailedFinishOneDriveUpload = \"FailedFinishOneDriveUpload\",\r\n    S3LikeChunkUploadFailed = \"S3LikeChunkUploadFailed\",\r\n    S3LikeUploadCallbackFailed = \"S3LikeUploadCallbackFailed\",\r\n    COSUploadCallbackFailed = \"COSUploadCallbackFailed\",\r\n    COSPostUploadFailed = \"COSPostUploadFailed\",\r\n    UpyunPostUploadFailed = \"UpyunPostUploadFailed\",\r\n    QiniuChunkUploadFailed = \"QiniuChunkUploadFailed\",\r\n    FailedFinishOSSUpload = \"FailedFinishOSSUpload\",\r\n    FailedFinishQiniuUpload = \"FailedFinishQiniuUpload\",\r\n    FailedTransformResponse = \"FailedTransformResponse\",\r\n}\r\n\r\nconst RETRY_ERROR_LIST = [\r\n    UploaderErrorName.FailedCreateUploadSession,\r\n    UploaderErrorName.HTTPRequestFailed,\r\n    UploaderErrorName.LocalChunkUploadFailed,\r\n    UploaderErrorName.SlaveChunkUploadFailed,\r\n    UploaderErrorName.RequestCanceled,\r\n    UploaderErrorName.ProcessingTaskDuplicated,\r\n    UploaderErrorName.FailedTransformResponse,\r\n];\r\n\r\nconst RETRY_CODE_LIST = [-1];\r\n\r\nexport class UploaderError implements Error {\r\n    public stack: string | undefined;\r\n    constructor(public name: UploaderErrorName, public message: string) {\r\n        this.stack = new Error().stack;\r\n    }\r\n\r\n    public Message(): string {\r\n        return this.message;\r\n    }\r\n\r\n    public Retryable(): boolean {\r\n        return RETRY_ERROR_LIST.includes(this.name);\r\n    }\r\n}\r\n\r\n// 文件未通过存储策略验证\r\nexport class FileValidateError extends UploaderError {\r\n    // 未通过验证的文件属性\r\n    public field: \"size\" | \"suffix\";\r\n\r\n    // 对应的存储策略\r\n    public policy: Policy;\r\n\r\n    constructor(message: string, field: \"size\" | \"suffix\", policy: Policy) {\r\n        super(UploaderErrorName.InvalidFile, message);\r\n        this.field = field;\r\n        this.policy = policy;\r\n    }\r\n\r\n    public Message(): string {\r\n        if (this.field == \"size\") {\r\n            return i18next.t(`uploader.sizeExceedLimitError`, {\r\n                max: sizeToString(this.policy.maxSize),\r\n            });\r\n        }\r\n\r\n        return i18next.t(`uploader.suffixNotAllowedError`, {\r\n            supported: this.policy.allowedSuffix\r\n                ? this.policy.allowedSuffix.join(\",\")\r\n                : \"*\",\r\n        });\r\n    }\r\n}\r\n\r\n// 未知存储策略\r\nexport class UnknownPolicyError extends UploaderError {\r\n    // 对应的存储策略\r\n    public policy: Policy;\r\n\r\n    constructor(message: string, policy: Policy) {\r\n        super(UploaderErrorName.UnknownPolicyType, message);\r\n        this.policy = policy;\r\n    }\r\n}\r\n\r\n// 后端 API 出错\r\nexport class APIError extends UploaderError {\r\n    private appError: AppError;\r\n    constructor(\r\n        name: UploaderErrorName,\r\n        message: string,\r\n        protected response: Response<any>\r\n    ) {\r\n        super(name, message);\r\n        this.appError = new AppError(response.msg, response.code, response.msg);\r\n    }\r\n\r\n    public Message(): string {\r\n        return `${this.message}: ${this.appError.message}`;\r\n    }\r\n\r\n    public Retryable(): boolean {\r\n        return (\r\n            super.Retryable() && RETRY_CODE_LIST.includes(this.response.code)\r\n        );\r\n    }\r\n}\r\n\r\n// 无法创建上传会话\r\nexport class CreateUploadSessionError extends APIError {\r\n    constructor(response: Response<any>) {\r\n        super(UploaderErrorName.FailedCreateUploadSession, \"\", response);\r\n    }\r\n\r\n    public Message(): string {\r\n        this.message = i18next.t(`uploader.createUploadSessionError`);\r\n        return super.Message();\r\n    }\r\n}\r\n\r\n// 无法删除上传会话\r\nexport class DeleteUploadSessionError extends APIError {\r\n    constructor(response: Response<any>) {\r\n        super(UploaderErrorName.FailedDeleteUploadSession, \"\", response);\r\n    }\r\n\r\n    public Message(): string {\r\n        this.message = i18next.t(`uploader.deleteUploadSessionError`);\r\n        return super.Message();\r\n    }\r\n}\r\n\r\n// HTTP 请求出错\r\nexport class HTTPError extends UploaderError {\r\n    public response?: any;\r\n    constructor(public axiosErr: any, protected url: string) {\r\n        super(UploaderErrorName.HTTPRequestFailed, axiosErr.message);\r\n        this.response = axiosErr.response;\r\n    }\r\n\r\n    public Message(): string {\r\n        return i18next.t(`uploader.requestError`, {\r\n            msg: this.axiosErr,\r\n            url: this.url,\r\n        });\r\n    }\r\n}\r\n\r\n// 本地分块上传失败\r\nexport class LocalChunkUploadError extends APIError {\r\n    constructor(response: Response<any>, protected chunkIndex: number) {\r\n        super(UploaderErrorName.LocalChunkUploadFailed, \"\", response);\r\n    }\r\n\r\n    public Message(): string {\r\n        this.message = i18next.t(`uploader.chunkUploadError`, {\r\n            index: this.chunkIndex,\r\n        });\r\n        return super.Message();\r\n    }\r\n}\r\n\r\n// 无法创建上传会话\r\nexport class RequestCanceledError extends UploaderError {\r\n    constructor() {\r\n        super(UploaderErrorName.RequestCanceled, \"Request canceled\");\r\n    }\r\n}\r\n\r\n// 从机分块上传失败\r\nexport class SlaveChunkUploadError extends APIError {\r\n    constructor(response: Response<any>, protected chunkIndex: number) {\r\n        super(UploaderErrorName.SlaveChunkUploadFailed, \"\", response);\r\n    }\r\n\r\n    public Message(): string {\r\n        this.message = i18next.t(`uploader.chunkUploadError`, {\r\n            index: this.chunkIndex,\r\n        });\r\n        return super.Message();\r\n    }\r\n}\r\n\r\n// 上传任务冲突\r\nexport class ProcessingTaskDuplicatedError extends UploaderError {\r\n    constructor() {\r\n        super(\r\n            UploaderErrorName.ProcessingTaskDuplicated,\r\n            \"Processing task duplicated\"\r\n        );\r\n    }\r\n\r\n    public Message(): string {\r\n        return i18next.t(`uploader.conflictError`);\r\n    }\r\n}\r\n\r\n// OneDrive 分块上传失败\r\nexport class OneDriveChunkError extends UploaderError {\r\n    constructor(public response: OneDriveError) {\r\n        super(\r\n            UploaderErrorName.OneDriveChunkUploadFailed,\r\n            response.error.message\r\n        );\r\n    }\r\n\r\n    public Message(): string {\r\n        return i18next.t(`uploader.chunkUploadErrorWithMsg`, {\r\n            msg: this.message,\r\n        });\r\n    }\r\n}\r\n\r\n// OneDrive 选择了空文件上传\r\nexport class OneDriveEmptyFileSelected extends UploaderError {\r\n    constructor() {\r\n        super(UploaderErrorName.OneDriveEmptyFile, \"empty file not supported\");\r\n    }\r\n\r\n    public Message(): string {\r\n        return i18next.t(\"uploader.emptyFileError\");\r\n    }\r\n}\r\n\r\n// OneDrive 无法完成文件上传\r\nexport class OneDriveFinishUploadError extends APIError {\r\n    constructor(response: Response<any>) {\r\n        super(UploaderErrorName.FailedFinishOneDriveUpload, \"\", response);\r\n    }\r\n\r\n    public Message(): string {\r\n        this.message = i18next.t(\"uploader.finishUploadError\");\r\n        return super.Message();\r\n    }\r\n}\r\n\r\n// S3 类策略分块上传失败\r\nexport class S3LikeChunkError extends UploaderError {\r\n    constructor(public response: Document) {\r\n        super(\r\n            UploaderErrorName.S3LikeChunkUploadFailed,\r\n            response.getElementsByTagName(\"Message\")[0].innerHTML\r\n        );\r\n    }\r\n\r\n    public Message(): string {\r\n        return i18next.t(`uploader.chunkUploadErrorWithMsg`, {\r\n            msg: this.message,\r\n        });\r\n    }\r\n}\r\n\r\n// OSS 完成传失败\r\nexport class S3LikeFinishUploadError extends UploaderError {\r\n    constructor(public response: Document) {\r\n        super(\r\n            UploaderErrorName.S3LikeChunkUploadFailed,\r\n            response.getElementsByTagName(\"Message\")[0].innerHTML\r\n        );\r\n    }\r\n\r\n    public Message(): string {\r\n        return i18next.t(`uploader.ossFinishUploadError`, {\r\n            msg: this.message,\r\n            code: this.response.getElementsByTagName(\"Code\")[0].innerHTML,\r\n        });\r\n    }\r\n}\r\n\r\n// qiniu 分块上传失败\r\nexport class QiniuChunkError extends UploaderError {\r\n    constructor(public response: QiniuError) {\r\n        super(UploaderErrorName.QiniuChunkUploadFailed, response.error);\r\n    }\r\n\r\n    public Message(): string {\r\n        return i18next.t(`uploader.chunkUploadErrorWithMsg`, {\r\n            msg: this.message,\r\n        });\r\n    }\r\n}\r\n\r\n// qiniu 完成传失败\r\nexport class QiniuFinishUploadError extends UploaderError {\r\n    constructor(public response: QiniuError) {\r\n        super(UploaderErrorName.FailedFinishQiniuUpload, response.error);\r\n    }\r\n\r\n    public Message(): string {\r\n        return i18next.t(`uploader.finishUploadErrorWithMsg`, {\r\n            msg: this.message,\r\n        });\r\n    }\r\n}\r\n\r\n// COS 上传失败\r\nexport class COSUploadError extends UploaderError {\r\n    constructor(public response: Document) {\r\n        super(\r\n            UploaderErrorName.COSPostUploadFailed,\r\n            response.getElementsByTagName(\"Message\")[0].innerHTML\r\n        );\r\n    }\r\n\r\n    public Message(): string {\r\n        return i18next.t(`uploader.cosUploadFailed`, {\r\n            msg: this.message,\r\n            code: this.response.getElementsByTagName(\"Code\")[0].innerHTML,\r\n        });\r\n    }\r\n}\r\n\r\n// COS 无法完成上传回调\r\nexport class COSUploadCallbackError extends APIError {\r\n    constructor(response: Response<any>) {\r\n        super(UploaderErrorName.COSUploadCallbackFailed, \"\", response);\r\n    }\r\n\r\n    public Message(): string {\r\n        this.message = i18next.t(\"uploader.finishUploadError\");\r\n        return super.Message();\r\n    }\r\n}\r\n\r\n// Upyun 上传失败\r\nexport class UpyunUploadError extends UploaderError {\r\n    constructor(public response: UpyunError) {\r\n        super(UploaderErrorName.UpyunPostUploadFailed, response.message);\r\n    }\r\n\r\n    public Message(): string {\r\n        return i18next.t(\"uploader.upyunUploadFailed\", {\r\n            msg: this.message,\r\n        });\r\n    }\r\n}\r\n\r\n// S3 无法完成上传回调\r\nexport class S3LikeUploadCallbackError extends APIError {\r\n    constructor(response: Response<any>) {\r\n        super(UploaderErrorName.S3LikeUploadCallbackFailed, \"\", response);\r\n    }\r\n\r\n    public Message(): string {\r\n        this.message = i18next.t(\"uploader.finishUploadError\");\r\n        return super.Message();\r\n    }\r\n}\r\n\r\n// 无法解析响应\r\nexport class TransformResponseError extends UploaderError {\r\n    constructor(private response: string, parseError: Error) {\r\n        super(UploaderErrorName.FailedTransformResponse, parseError.message);\r\n    }\r\n\r\n    public Message(): string {\r\n        return i18next.t(\"uploader.parseResponseError\", {\r\n            msg: this.message,\r\n            content: this.response,\r\n        });\r\n    }\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { connect } from \"react-redux\";\r\nimport classNames from \"classnames\";\r\nimport ErrorIcon from \"@material-ui/icons/Error\";\r\nimport InfoIcon from \"@material-ui/icons/Info\";\r\nimport CloseIcon from \"@material-ui/icons/Close\";\r\nimport CheckCircleIcon from \"@material-ui/icons/CheckCircle\";\r\nimport WarningIcon from \"@material-ui/icons/Warning\";\r\n\r\nimport {\r\n    IconButton,\r\n    Snackbar,\r\n    SnackbarContent,\r\n    withStyles,\r\n} from \"@material-ui/core\";\r\n\r\nconst mapStateToProps = (state) => {\r\n    return {\r\n        snackbar: state.viewUpdate.snackbar,\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = () => {\r\n    return {};\r\n};\r\n\r\nconst variantIcon = {\r\n    success: CheckCircleIcon,\r\n    warning: WarningIcon,\r\n    error: ErrorIcon,\r\n    info: InfoIcon,\r\n};\r\n\r\nconst styles1 = (theme) => ({\r\n    success: {\r\n        backgroundColor: theme.palette.success.main,\r\n    },\r\n    error: {\r\n        backgroundColor: theme.palette.error.dark,\r\n    },\r\n    info: {\r\n        backgroundColor: theme.palette.info.main,\r\n    },\r\n    warning: {\r\n        backgroundColor: theme.palette.warning.main,\r\n    },\r\n    icon: {\r\n        fontSize: 20,\r\n    },\r\n    iconVariant: {\r\n        opacity: 0.9,\r\n        marginRight: theme.spacing(1),\r\n    },\r\n    message: {\r\n        display: \"flex\",\r\n        alignItems: \"center\",\r\n    },\r\n});\r\n\r\nfunction MySnackbarContent(props) {\r\n    const { classes, className, message, onClose, variant, ...other } = props;\r\n    const Icon = variantIcon[variant];\r\n\r\n    return (\r\n        <SnackbarContent\r\n            className={classNames(classes[variant], className)}\r\n            aria-describedby=\"client-snackbar\"\r\n            message={\r\n                <span id=\"client-snackbar\" className={classes.message}>\r\n                    <Icon\r\n                        className={classNames(\r\n                            classes.icon,\r\n                            classes.iconVariant\r\n                        )}\r\n                    />\r\n                    {message}\r\n                </span>\r\n            }\r\n            action={[\r\n                <IconButton\r\n                    key=\"close\"\r\n                    aria-label=\"Close\"\r\n                    color=\"inherit\"\r\n                    className={classes.close}\r\n                    onClick={onClose}\r\n                >\r\n                    <CloseIcon className={classes.icon} />\r\n                </IconButton>,\r\n            ]}\r\n            {...other}\r\n        />\r\n    );\r\n}\r\nMySnackbarContent.propTypes = {\r\n    classes: PropTypes.object.isRequired,\r\n    className: PropTypes.string,\r\n    message: PropTypes.node,\r\n    onClose: PropTypes.func,\r\n    variant: PropTypes.oneOf([\"alert\", \"success\", \"warning\", \"error\", \"info\"])\r\n        .isRequired,\r\n};\r\n\r\nconst MySnackbarContentWrapper = withStyles(styles1)(MySnackbarContent);\r\nconst styles = (theme) => ({\r\n    margin: {\r\n        margin: theme.spacing(1),\r\n    },\r\n});\r\nclass SnackbarCompoment extends Component {\r\n    state = {\r\n        open: false,\r\n    };\r\n\r\n    UNSAFE_componentWillReceiveProps = (nextProps) => {\r\n        if (nextProps.snackbar.toggle !== this.props.snackbar.toggle) {\r\n            this.setState({ open: true });\r\n        }\r\n    };\r\n\r\n    handleClose = () => {\r\n        this.setState({ open: false });\r\n    };\r\n\r\n    render() {\r\n        return (\r\n            <Snackbar\r\n                anchorOrigin={{\r\n                    vertical: this.props.snackbar.vertical,\r\n                    horizontal: this.props.snackbar.horizontal,\r\n                }}\r\n                open={this.state.open}\r\n                autoHideDuration={6000}\r\n                onClose={this.handleClose}\r\n            >\r\n                <MySnackbarContentWrapper\r\n                    onClose={this.handleClose}\r\n                    variant={this.props.snackbar.color}\r\n                    message={this.props.snackbar.msg}\r\n                />\r\n            </Snackbar>\r\n        );\r\n    }\r\n}\r\n\r\nconst AlertBar = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(SnackbarCompoment));\r\n\r\nexport default AlertBar;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { connect } from \"react-redux\";\r\nimport {\r\n    AccountArrowRight,\r\n    AccountPlus,\r\n    DesktopMacDashboard,\r\n    HomeAccount,\r\n    LogoutVariant,\r\n} from \"mdi-material-ui\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport Auth from \"../../middleware/Auth\";\r\nimport {\r\n    Avatar,\r\n    Chip,\r\n    Divider,\r\n    ListItemIcon,\r\n    MenuItem,\r\n    Popover,\r\n    Typography,\r\n    withStyles,\r\n} from \"@material-ui/core\";\r\nimport API from \"../../middleware/Api\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport {\r\n    setSessionStatus,\r\n    setUserPopover,\r\n    toggleSnackbar,\r\n} from \"../../redux/explorer\";\r\nimport { withTranslation } from \"react-i18next\";\r\n\r\nconst mapStateToProps = (state) => {\r\n    return {\r\n        anchorEl: state.viewUpdate.userPopoverAnchorEl,\r\n        registerEnabled: state.siteConfig.registerEnabled,\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n    return {\r\n        setUserPopover: (anchor) => {\r\n            dispatch(setUserPopover(anchor));\r\n        },\r\n        toggleSnackbar: (vertical, horizontal, msg, color) => {\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color));\r\n        },\r\n        setSessionStatus: (status) => {\r\n            dispatch(setSessionStatus(status));\r\n        },\r\n    };\r\n};\r\nconst styles = () => ({\r\n    avatar: {\r\n        width: \"30px\",\r\n        height: \"30px\",\r\n    },\r\n    header: {\r\n        display: \"flex\",\r\n        padding: \"20px 20px 20px 20px\",\r\n    },\r\n    largeAvatar: {\r\n        height: \"90px\",\r\n        width: \"90px\",\r\n    },\r\n    info: {\r\n        marginLeft: \"10px\",\r\n        width: \"139px\",\r\n    },\r\n    badge: {\r\n        marginTop: \"10px\",\r\n    },\r\n    visitorMenu: {\r\n        width: 200,\r\n    },\r\n});\r\n\r\nclass UserAvatarPopoverCompoment extends Component {\r\n    handleClose = () => {\r\n        this.props.setUserPopover(null);\r\n    };\r\n\r\n    openURL = (url) => {\r\n        window.location.href = url;\r\n    };\r\n\r\n    sigOut = () => {\r\n        API.delete(\"/user/session/\")\r\n            .then(() => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    \"您已退出登录\",\r\n                    \"success\"\r\n                );\r\n                Auth.signout();\r\n                window.location.reload();\r\n                this.props.setSessionStatus(false);\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"warning\"\r\n                );\r\n            })\r\n            .then(() => {\r\n                this.handleClose();\r\n            });\r\n    };\r\n\r\n    render() {\r\n        const { classes, t } = this.props;\r\n        const user = Auth.GetUser();\r\n        const isAdminPage = pathHelper.isAdminPage(\r\n            this.props.location.pathname\r\n        );\r\n\r\n        return (\r\n            <Popover\r\n                open={this.props.anchorEl !== null}\r\n                onClose={this.handleClose}\r\n                anchorEl={this.props.anchorEl}\r\n                anchorOrigin={{\r\n                    vertical: \"bottom\",\r\n                    horizontal: \"right\",\r\n                }}\r\n                transformOrigin={{\r\n                    vertical: \"top\",\r\n                    horizontal: \"right\",\r\n                }}\r\n            >\r\n                {!Auth.Check() && (\r\n                    <div className={classes.visitorMenu}>\r\n                        <Divider />\r\n                        <MenuItem\r\n                            onClick={() => this.props.history.push(\"/login\")}\r\n                        >\r\n                            <ListItemIcon>\r\n                                <AccountArrowRight />\r\n                            </ListItemIcon>\r\n                            {t(\"login.signIn\")}\r\n                        </MenuItem>\r\n                        {this.props.registerEnabled && (\r\n                            <MenuItem\r\n                                onClick={() =>\r\n                                    this.props.history.push(\"/signup\")\r\n                                }\r\n                            >\r\n                                <ListItemIcon>\r\n                                    <AccountPlus />\r\n                                </ListItemIcon>\r\n                                {t(\"login.signUp\")}\r\n                            </MenuItem>\r\n                        )}\r\n                    </div>\r\n                )}\r\n                {Auth.Check() && (\r\n                    <div>\r\n                        <div className={classes.header}>\r\n                            <div className={classes.largeAvatarContainer}>\r\n                                <Avatar\r\n                                    className={classes.largeAvatar}\r\n                                    src={\r\n                                        \"/api/v3/user/avatar/\" + user.id + \"/l\"\r\n                                    }\r\n                                />\r\n                            </div>\r\n                            <div className={classes.info}>\r\n                                <Typography noWrap>{user.nickname}</Typography>\r\n                                <Typography\r\n                                    color=\"textSecondary\"\r\n                                    style={{\r\n                                        fontSize: \"0.875rem\",\r\n                                    }}\r\n                                    noWrap\r\n                                >\r\n                                    {user.user_name}\r\n                                </Typography>\r\n                                <Chip\r\n                                    className={classes.badge}\r\n                                    color={\r\n                                        user.group.id === 1\r\n                                            ? \"secondary\"\r\n                                            : \"default\"\r\n                                    }\r\n                                    label={user.group.name}\r\n                                />\r\n                            </div>\r\n                        </div>\r\n                        <div>\r\n                            <Divider />\r\n                            {!isAdminPage && (\r\n                                <MenuItem\r\n                                    style={{\r\n                                        padding: \" 11px 16px 11px 16px\",\r\n                                    }}\r\n                                    onClick={() => {\r\n                                        this.handleClose();\r\n                                        this.props.history.push(\r\n                                            \"/profile/\" + user.id\r\n                                        );\r\n                                    }}\r\n                                >\r\n                                    <ListItemIcon>\r\n                                        <HomeAccount />\r\n                                    </ListItemIcon>\r\n                                    {t(\"navbar.myProfile\")}\r\n                                </MenuItem>\r\n                            )}\r\n                            {user.group.id === 1 && (\r\n                                <MenuItem\r\n                                    style={{\r\n                                        padding: \" 11px 16px 11px 16px\",\r\n                                    }}\r\n                                    onClick={() => {\r\n                                        this.handleClose();\r\n                                        this.props.history.push(\"/admin/home\");\r\n                                    }}\r\n                                >\r\n                                    <ListItemIcon>\r\n                                        <DesktopMacDashboard />\r\n                                    </ListItemIcon>\r\n                                    {t(\"navbar.dashboard\")}\r\n                                </MenuItem>\r\n                            )}\r\n\r\n                            <MenuItem\r\n                                style={{\r\n                                    padding: \" 11px 16px 11px 16px\",\r\n                                }}\r\n                                onClick={this.sigOut}\r\n                            >\r\n                                <ListItemIcon>\r\n                                    <LogoutVariant />\r\n                                </ListItemIcon>\r\n                                {t(\"login.logout\")}\r\n                            </MenuItem>\r\n                        </div>\r\n                    </div>\r\n                )}\r\n            </Popover>\r\n        );\r\n    }\r\n}\r\n\r\nUserAvatarPopoverCompoment.propTypes = {\r\n    classes: PropTypes.object.isRequired,\r\n};\r\n\r\nconst UserAvatarPopover = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(\r\n    withStyles(styles)(\r\n        withRouter(withTranslation()(UserAvatarPopoverCompoment))\r\n    )\r\n);\r\n\r\nexport default UserAvatarPopover;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { connect } from \"react-redux\";\r\nimport SettingIcon from \"@material-ui/icons/Settings\";\r\nimport UserAvatarPopover from \"./UserAvatarPopover\";\r\nimport { AccountCircle } from \"mdi-material-ui\";\r\nimport Auth from \"../../middleware/Auth\";\r\nimport {\r\n    Avatar,\r\n    Grow,\r\n    IconButton,\r\n    Tooltip,\r\n    withStyles,\r\n} from \"@material-ui/core\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport DarkModeSwitcher from \"./DarkModeSwitcher\";\r\nimport { Home } from \"@material-ui/icons\";\r\nimport { setUserPopover } from \"../../redux/explorer\";\r\nimport { withTranslation } from \"react-i18next\";\r\n\r\nconst mapStateToProps = (state) => {\r\n    return {\r\n        selected: state.explorer.selected,\r\n        isMultiple: state.explorer.selectProps.isMultiple,\r\n        withFolder: state.explorer.selectProps.withFolder,\r\n        withFile: state.explorer.selectProps.withFile,\r\n        isLogin: state.viewUpdate.isLogin,\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n    return {\r\n        setUserPopover: (anchor) => {\r\n            dispatch(setUserPopover(anchor));\r\n        },\r\n    };\r\n};\r\n\r\nconst styles = (theme) => ({\r\n    mobileHidden: {\r\n        [theme.breakpoints.down(\"xs\")]: {\r\n            display: \"none\",\r\n        },\r\n        whiteSpace: \"nowrap\",\r\n    },\r\n    avatar: {\r\n        width: \"30px\",\r\n        height: \"30px\",\r\n    },\r\n    header: {\r\n        display: \"flex\",\r\n        padding: \"20px 20px 20px 20px\",\r\n    },\r\n    largeAvatar: {\r\n        height: \"90px\",\r\n        width: \"90px\",\r\n    },\r\n    info: {\r\n        marginLeft: \"10px\",\r\n        width: \"139px\",\r\n    },\r\n    badge: {\r\n        marginTop: \"10px\",\r\n    },\r\n    visitorMenu: {\r\n        width: 200,\r\n    },\r\n});\r\n\r\nclass UserAvatarCompoment extends Component {\r\n    state = {\r\n        anchorEl: null,\r\n    };\r\n\r\n    showUserInfo = (e) => {\r\n        this.props.setUserPopover(e.currentTarget);\r\n    };\r\n\r\n    handleClose = () => {\r\n        this.setState({\r\n            anchorEl: null,\r\n        });\r\n    };\r\n\r\n    openURL = (url) => {\r\n        window.location.href = url;\r\n    };\r\n\r\n    returnHome = () => {\r\n        window.location.href = \"/home\";\r\n    };\r\n\r\n    render() {\r\n        const { classes, t } = this.props;\r\n        const loginCheck = Auth.Check(this.props.isLogin);\r\n        const user = Auth.GetUser(this.props.isLogin);\r\n        const isAdminPage = pathHelper.isAdminPage(\r\n            this.props.location.pathname\r\n        );\r\n\r\n        return (\r\n            <div className={classes.mobileHidden}>\r\n                <Grow\r\n                    in={\r\n                        this.props.selected.length <= 1 &&\r\n                        !(!this.props.isMultiple && this.props.withFile)\r\n                    }\r\n                >\r\n                    <div>\r\n                        {!isAdminPage && (\r\n                            <>\r\n                                <DarkModeSwitcher position=\"top\" />\r\n                                {loginCheck && (\r\n                                    <>\r\n                                        <Tooltip\r\n                                            title={t(\"navbar.setting\")}\r\n                                            placement=\"bottom\"\r\n                                        >\r\n                                            <IconButton\r\n                                                onClick={() =>\r\n                                                    this.props.history.push(\r\n                                                        \"/setting?\"\r\n                                                    )\r\n                                                }\r\n                                                color=\"inherit\"\r\n                                            >\r\n                                                <SettingIcon />\r\n                                            </IconButton>\r\n                                        </Tooltip>\r\n                                    </>\r\n                                )}\r\n                            </>\r\n                        )}\r\n                        {isAdminPage && (\r\n                            <Tooltip\r\n                                title={t(\"navbar.backToHomepage\")}\r\n                                placement=\"bottom\"\r\n                            >\r\n                                <IconButton\r\n                                    color=\"inherit\"\r\n                                    onClick={this.returnHome}\r\n                                >\r\n                                    <Home />\r\n                                </IconButton>\r\n                            </Tooltip>\r\n                        )}\r\n                        <IconButton color=\"inherit\" onClick={this.showUserInfo}>\r\n                            {!loginCheck && <AccountCircle />}\r\n                            {loginCheck && (\r\n                                <Avatar\r\n                                    src={\r\n                                        \"/api/v3/user/avatar/\" + user.id + \"/s\"\r\n                                    }\r\n                                    className={classes.avatar}\r\n                                />\r\n                            )}\r\n                        </IconButton>{\" \"}\r\n                    </div>\r\n                </Grow>\r\n                <UserAvatarPopover />\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nUserAvatarCompoment.propTypes = {\r\n    classes: PropTypes.object.isRequired,\r\n};\r\n\r\nconst UserAvatar = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(withRouter(withTranslation()(UserAvatarCompoment))));\r\n\r\nexport default UserAvatar;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport classNames from \"classnames\";\r\nimport { connect } from \"react-redux\";\r\nimport ShareIcon from \"@material-ui/icons/Share\";\r\nimport MusicNote from \"@material-ui/icons/MusicNote\";\r\nimport BackIcon from \"@material-ui/icons/ArrowBack\";\r\nimport OpenIcon from \"@material-ui/icons/OpenInNew\";\r\nimport DownloadIcon from \"@material-ui/icons/CloudDownload\";\r\nimport RenameIcon from \"@material-ui/icons/BorderColor\";\r\nimport MoveIcon from \"@material-ui/icons/Input\";\r\nimport DeleteIcon from \"@material-ui/icons/Delete\";\r\nimport MenuIcon from \"@material-ui/icons/Menu\";\r\nimport { isPreviewable } from \"../../config\";\r\nimport { changeThemeColor, sizeToString, vhCheck } from \"../../utils\";\r\nimport Uploader from \"../Uploader/Uploader.js\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport SezrchBar from \"./SearchBar\";\r\nimport StorageBar from \"./StorageBar\";\r\nimport UserAvatar from \"./UserAvatar\";\r\nimport UserInfo from \"./UserInfo\";\r\nimport {\r\n    FolderDownload,\r\n    AccountArrowRight,\r\n    AccountPlus,\r\n    LogoutVariant,\r\n} from \"mdi-material-ui\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport {\r\n    AppBar,\r\n    Drawer,\r\n    Grow,\r\n    Hidden,\r\n    IconButton,\r\n    List,\r\n    ListItem,\r\n    ListItemIcon,\r\n    ListItemText,\r\n    SwipeableDrawer,\r\n    Toolbar,\r\n    Tooltip,\r\n    Typography,\r\n    withStyles,\r\n    withTheme,\r\n} from \"@material-ui/core\";\r\nimport Auth from \"../../middleware/Auth\";\r\nimport API from \"../../middleware/Api\";\r\nimport FileTag from \"./FileTags\";\r\nimport { Assignment, Devices, MoreHoriz, Settings } from \"@material-ui/icons\";\r\nimport Divider from \"@material-ui/core/Divider\";\r\nimport SubActions from \"../FileManager/Navigator/SubActions\";\r\nimport {\r\n    audioPreviewSetIsOpen,\r\n    changeContextMenu,\r\n    drawerToggleAction,\r\n    navigateTo,\r\n    openCreateFolderDialog,\r\n    openLoadingDialog,\r\n    openMoveDialog,\r\n    openMusicDialog,\r\n    openPreview,\r\n    openRemoveDialog,\r\n    openRenameDialog,\r\n    openShareDialog,\r\n    saveFile,\r\n    setSelectedTarget,\r\n    setSessionStatus,\r\n    showImgPreivew,\r\n    toggleSnackbar,\r\n} from \"../../redux/explorer\";\r\nimport {\r\n    startBatchDownload,\r\n    startDirectoryDownload,\r\n    startDownload,\r\n} from \"../../redux/explorer/action\";\r\nimport { withTranslation } from \"react-i18next\";\r\n\r\nvhCheck();\r\nconst drawerWidth = 240;\r\nconst drawerWidthMobile = 270;\r\n\r\nconst mapStateToProps = (state) => {\r\n    return {\r\n        desktopOpen: state.viewUpdate.open,\r\n        selected: state.explorer.selected,\r\n        isMultiple: state.explorer.selectProps.isMultiple,\r\n        withFolder: state.explorer.selectProps.withFolder,\r\n        withFile: state.explorer.selectProps.withFile,\r\n        path: state.navigator.path,\r\n        title: state.siteConfig.title,\r\n        subTitle: state.viewUpdate.subTitle,\r\n        loadUploader: state.viewUpdate.loadUploader,\r\n        isLogin: state.viewUpdate.isLogin,\r\n        shareInfo: state.viewUpdate.shareInfo,\r\n        registerEnabled: state.siteConfig.registerEnabled,\r\n        audioPreviewPlayingName: state.explorer.audioPreview.playingName,\r\n        audioPreviewIsOpen: state.explorer.audioPreview.isOpen,\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n    return {\r\n        handleDesktopToggle: (open) => {\r\n            dispatch(drawerToggleAction(open));\r\n        },\r\n        setSelectedTarget: (targets) => {\r\n            dispatch(setSelectedTarget(targets));\r\n        },\r\n        navigateTo: (path) => {\r\n            dispatch(navigateTo(path));\r\n        },\r\n        openCreateFolderDialog: () => {\r\n            dispatch(openCreateFolderDialog());\r\n        },\r\n        changeContextMenu: (type, open) => {\r\n            dispatch(changeContextMenu(type, open));\r\n        },\r\n        saveFile: () => {\r\n            dispatch(saveFile());\r\n        },\r\n        openMusicDialog: () => {\r\n            dispatch(openMusicDialog());\r\n        },\r\n        showImgPreivew: (first) => {\r\n            dispatch(showImgPreivew(first));\r\n        },\r\n        toggleSnackbar: (vertical, horizontal, msg, color) => {\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color));\r\n        },\r\n        openRenameDialog: () => {\r\n            dispatch(openRenameDialog());\r\n        },\r\n        openMoveDialog: () => {\r\n            dispatch(openMoveDialog());\r\n        },\r\n        openRemoveDialog: () => {\r\n            dispatch(openRemoveDialog());\r\n        },\r\n        openShareDialog: () => {\r\n            dispatch(openShareDialog());\r\n        },\r\n        openLoadingDialog: (text) => {\r\n            dispatch(openLoadingDialog(text));\r\n        },\r\n        setSessionStatus: () => {\r\n            dispatch(setSessionStatus());\r\n        },\r\n        openPreview: (share) => {\r\n            dispatch(openPreview(share));\r\n        },\r\n        audioPreviewOpen: () => {\r\n            dispatch(audioPreviewSetIsOpen(true));\r\n        },\r\n        startBatchDownload: (share) => {\r\n            dispatch(startBatchDownload(share));\r\n        },\r\n        startDirectoryDownload: (share) => {\r\n            dispatch(startDirectoryDownload(share));\r\n        },\r\n        startDownload: (share, file) => {\r\n            dispatch(startDownload(share, file));\r\n        },\r\n    };\r\n};\r\n\r\nconst styles = (theme) => ({\r\n    appBar: {\r\n        marginLeft: drawerWidth,\r\n        [theme.breakpoints.down(\"xs\")]: {\r\n            marginLeft: drawerWidthMobile,\r\n        },\r\n        zIndex: theme.zIndex.drawer + 1,\r\n        transition: \" background-color 250ms\",\r\n    },\r\n\r\n    drawer: {\r\n        width: 0,\r\n        flexShrink: 0,\r\n    },\r\n    drawerDesktop: {\r\n        width: drawerWidth,\r\n        flexShrink: 0,\r\n    },\r\n    icon: {\r\n        marginRight: theme.spacing(2),\r\n    },\r\n    menuButton: {\r\n        marginRight: 20,\r\n        [theme.breakpoints.up(\"sm\")]: {\r\n            display: \"none\",\r\n        },\r\n    },\r\n    menuButtonDesktop: {\r\n        marginRight: 20,\r\n        [theme.breakpoints.down(\"xs\")]: {\r\n            display: \"none\",\r\n        },\r\n    },\r\n    menuIcon: {\r\n        marginRight: 20,\r\n    },\r\n    toolbar: theme.mixins.toolbar,\r\n    drawerPaper: {\r\n        width: drawerWidthMobile,\r\n    },\r\n    drawerPaperDesktop: {\r\n        width: drawerWidth,\r\n    },\r\n    upDrawer: {\r\n        overflowX: \"hidden\",\r\n        [theme.breakpoints.up(\"sm\")]: {\r\n            display: \"flex\",\r\n            flexDirection: \"column\",\r\n            height: \"100%\",\r\n            justifyContent: \"space-between\",\r\n        },\r\n    },\r\n    drawerOpen: {\r\n        width: drawerWidth,\r\n        transition: theme.transitions.create(\"width\", {\r\n            easing: theme.transitions.easing.sharp,\r\n            duration: theme.transitions.duration.enteringScreen,\r\n        }),\r\n    },\r\n    drawerClose: {\r\n        transition: theme.transitions.create(\"width\", {\r\n            easing: theme.transitions.easing.sharp,\r\n            duration: theme.transitions.duration.leavingScreen,\r\n        }),\r\n        overflowX: \"hidden\",\r\n        width: 0,\r\n    },\r\n    content: {\r\n        flexGrow: 1,\r\n        padding: theme.spacing(3),\r\n    },\r\n    grow: {\r\n        flexGrow: 1,\r\n    },\r\n    badge: {\r\n        top: 1,\r\n        right: -15,\r\n    },\r\n    nested: {\r\n        paddingLeft: theme.spacing(4),\r\n    },\r\n    sectionForFile: {\r\n        display: \"flex\",\r\n    },\r\n    extendedIcon: {\r\n        marginRight: theme.spacing(1),\r\n    },\r\n    addButton: {\r\n        marginLeft: \"40px\",\r\n        marginTop: \"25px\",\r\n        marginBottom: \"15px\",\r\n    },\r\n    fabButton: {\r\n        borderRadius: \"100px\",\r\n    },\r\n    badgeFix: {\r\n        right: \"10px\",\r\n    },\r\n    iconFix: {\r\n        marginLeft: \"16px\",\r\n    },\r\n    dividerFix: {\r\n        marginTop: \"8px\",\r\n    },\r\n    folderShareIcon: {\r\n        verticalAlign: \"sub\",\r\n        marginRight: \"5px\",\r\n    },\r\n    shareInfoContainer: {\r\n        display: \"flex\",\r\n        marginTop: \"15px\",\r\n        marginBottom: \"20px\",\r\n        marginLeft: \"28px\",\r\n        textDecoration: \"none\",\r\n    },\r\n    shareAvatar: {\r\n        width: \"40px\",\r\n        height: \"40px\",\r\n    },\r\n    stickFooter: {\r\n        bottom: \"0px\",\r\n        position: \"absolute\",\r\n        backgroundColor: theme.palette.background.paper,\r\n        width: \"100%\",\r\n    },\r\n    ownerInfo: {\r\n        marginLeft: \"10px\",\r\n        width: \"150px\",\r\n    },\r\n    minStickDrawer: {\r\n        overflowY: \"auto\",\r\n    },\r\n});\r\nclass NavbarCompoment extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n        this.state = {\r\n            mobileOpen: false,\r\n        };\r\n        this.UploaderRef = React.createRef();\r\n    }\r\n\r\n    UNSAFE_componentWillMount() {\r\n        this.unlisten = this.props.history.listen(() => {\r\n            this.setState(() => ({ mobileOpen: false }));\r\n        });\r\n    }\r\n    componentWillUnmount() {\r\n        this.unlisten();\r\n    }\r\n\r\n    componentDidMount() {\r\n        changeThemeColor(\r\n            this.props.selected.length <= 1 &&\r\n                !(!this.props.isMultiple && this.props.withFile)\r\n                ? this.props.theme.palette.primary.main\r\n                : this.props.theme.palette.background.default\r\n        );\r\n    }\r\n\r\n    UNSAFE_componentWillReceiveProps = (nextProps) => {\r\n        if (\r\n            (this.props.selected.length === 0) !==\r\n            (nextProps.selected.length === 0)\r\n        ) {\r\n            changeThemeColor(\r\n                !(this.props.selected.length === 0)\r\n                    ? this.props.theme.palette.type === \"dark\"\r\n                        ? this.props.theme.palette.background.default\r\n                        : this.props.theme.palette.primary.main\r\n                    : this.props.theme.palette.background.default\r\n            );\r\n        }\r\n    };\r\n\r\n    handleDrawerToggle = () => {\r\n        this.setState((state) => ({ mobileOpen: !state.mobileOpen }));\r\n    };\r\n\r\n    openDownload = () => {\r\n        this.props.startDownload(this.props.shareInfo, this.props.selected[0]);\r\n    };\r\n\r\n    openDirectoryDownload = (e) => {\r\n        this.props.startDirectoryDownload(this.props.shareInfo);\r\n    };\r\n\r\n    archiveDownload = (e) => {\r\n        this.props.startBatchDownload(this.props.shareInfo);\r\n    };\r\n\r\n    signOut = () => {\r\n        API.delete(\"/user/session/\")\r\n            .then(() => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    this.props.t(\"login.loggedOut\"),\r\n                    \"success\"\r\n                );\r\n                Auth.signout();\r\n                window.location.reload();\r\n                this.props.setSessionStatus(false);\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"warning\"\r\n                );\r\n            })\r\n            .finally(() => {\r\n                this.handleClose();\r\n            });\r\n    };\r\n\r\n    render() {\r\n        const { classes, t } = this.props;\r\n        const user = Auth.GetUser(this.props.isLogin);\r\n        const isHomePage = pathHelper.isHomePage(this.props.location.pathname);\r\n        const isSharePage = pathHelper.isSharePage(\r\n            this.props.location.pathname\r\n        );\r\n\r\n        const drawer = (\r\n            <div id=\"container\" className={classes.upDrawer}>\r\n                {pathHelper.isMobile() && <UserInfo />}\r\n\r\n                {Auth.Check(this.props.isLogin) && (\r\n                    <>\r\n                        <div className={classes.minStickDrawer}>\r\n                            <FileTag />\r\n                            <List>\r\n                                <ListItem\r\n                                    button\r\n                                    key=\"我的分享\"\r\n                                    onClick={() =>\r\n                                        this.props.history.push(\"/shares?\")\r\n                                    }\r\n                                >\r\n                                    <ListItemIcon>\r\n                                        <ShareIcon\r\n                                            className={classes.iconFix}\r\n                                        />\r\n                                    </ListItemIcon>\r\n                                    <ListItemText\r\n                                        primary={t(\"navbar.myShare\")}\r\n                                    />\r\n                                </ListItem>\r\n                                {user.group.allowRemoteDownload && (\r\n                                    <ListItem\r\n                                        button\r\n                                        key=\"离线下载\"\r\n                                        onClick={() =>\r\n                                            this.props.history.push(\"/aria2?\")\r\n                                        }\r\n                                    >\r\n                                        <ListItemIcon>\r\n                                            <DownloadIcon\r\n                                                className={classes.iconFix}\r\n                                            />\r\n                                        </ListItemIcon>\r\n                                        <ListItemText\r\n                                            primary={t(\"navbar.remoteDownload\")}\r\n                                        />\r\n                                    </ListItem>\r\n                                )}\r\n                                {user.group.webdav && (\r\n                                    <ListItem\r\n                                        button\r\n                                        key=\"WebDAV\"\r\n                                        onClick={() =>\r\n                                            this.props.history.push(\"/webdav?\")\r\n                                        }\r\n                                    >\r\n                                        <ListItemIcon>\r\n                                            <Devices\r\n                                                className={classes.iconFix}\r\n                                            />\r\n                                        </ListItemIcon>\r\n                                        <ListItemText\r\n                                            primary={t(\"navbar.connect\")}\r\n                                        />\r\n                                    </ListItem>\r\n                                )}\r\n\r\n                                <ListItem\r\n                                    button\r\n                                    key=\"任务队列\"\r\n                                    onClick={() =>\r\n                                        this.props.history.push(\"/tasks?\")\r\n                                    }\r\n                                >\r\n                                    <ListItemIcon>\r\n                                        <Assignment\r\n                                            className={classes.iconFix}\r\n                                        />\r\n                                    </ListItemIcon>\r\n                                    <ListItemText\r\n                                        primary={t(\"navbar.taskQueue\")}\r\n                                    />\r\n                                </ListItem>\r\n                                {pathHelper.isMobile() && (\r\n                                    <>\r\n                                        <Divider />\r\n                                        <ListItem\r\n                                            button\r\n                                            key=\"个人设置\"\r\n                                            onClick={() =>\r\n                                                this.props.history.push(\r\n                                                    \"/setting?\"\r\n                                                )\r\n                                            }\r\n                                        >\r\n                                            <ListItemIcon>\r\n                                                <Settings\r\n                                                    className={classes.iconFix}\r\n                                                />\r\n                                            </ListItemIcon>\r\n                                            <ListItemText\r\n                                                primary={t(\"navbar.setting\")}\r\n                                            />\r\n                                        </ListItem>\r\n\r\n                                        <ListItem\r\n                                            button\r\n                                            key=\"退出登录\"\r\n                                            onClick={this.signOut}\r\n                                        >\r\n                                            <ListItemIcon>\r\n                                                <LogoutVariant\r\n                                                    className={classes.iconFix}\r\n                                                />\r\n                                            </ListItemIcon>\r\n                                            <ListItemText\r\n                                                primary={t(\"login.logout\")}\r\n                                            />\r\n                                        </ListItem>\r\n                                    </>\r\n                                )}\r\n                            </List>\r\n                        </div>\r\n                        <div>\r\n                            <StorageBar></StorageBar>\r\n                        </div>\r\n                    </>\r\n                )}\r\n\r\n                {!Auth.Check(this.props.isLogin) && (\r\n                    <div>\r\n                        <ListItem\r\n                            button\r\n                            key=\"登录\"\r\n                            onClick={() => this.props.history.push(\"/login\")}\r\n                        >\r\n                            <ListItemIcon>\r\n                                <AccountArrowRight\r\n                                    className={classes.iconFix}\r\n                                />\r\n                            </ListItemIcon>\r\n                            <ListItemText primary={t(\"login.signIn\")} />\r\n                        </ListItem>\r\n                        {this.props.registerEnabled && (\r\n                            <ListItem\r\n                                button\r\n                                key=\"注册\"\r\n                                onClick={() =>\r\n                                    this.props.history.push(\"/signup\")\r\n                                }\r\n                            >\r\n                                <ListItemIcon>\r\n                                    <AccountPlus className={classes.iconFix} />\r\n                                </ListItemIcon>\r\n                                <ListItemText primary={t(\"login.signUp\")} />\r\n                            </ListItem>\r\n                        )}\r\n                    </div>\r\n                )}\r\n            </div>\r\n        );\r\n        const iOS =\r\n            process.browser && /iPad|iPhone|iPod/.test(navigator.userAgent);\r\n        return (\r\n            <div>\r\n                <AppBar\r\n                    position=\"fixed\"\r\n                    className={classes.appBar}\r\n                    color={\r\n                        this.props.theme.palette.type !== \"dark\" &&\r\n                        this.props.selected.length === 0\r\n                            ? \"primary\"\r\n                            : \"default\"\r\n                    }\r\n                >\r\n                    <Toolbar>\r\n                        {this.props.selected.length === 0 && (\r\n                            <IconButton\r\n                                color=\"inherit\"\r\n                                aria-label=\"Open drawer\"\r\n                                onClick={this.handleDrawerToggle}\r\n                                className={classes.menuButton}\r\n                            >\r\n                                <MenuIcon />\r\n                            </IconButton>\r\n                        )}\r\n                        {this.props.selected.length === 0 && (\r\n                            <IconButton\r\n                                color=\"inherit\"\r\n                                aria-label=\"Open drawer\"\r\n                                onClick={() =>\r\n                                    this.props.handleDesktopToggle(\r\n                                        !this.props.desktopOpen\r\n                                    )\r\n                                }\r\n                                className={classes.menuButtonDesktop}\r\n                            >\r\n                                <MenuIcon />\r\n                            </IconButton>\r\n                        )}\r\n                        {this.props.selected.length > 0 &&\r\n                            (isHomePage ||\r\n                                pathHelper.isSharePage(\r\n                                    this.props.location.pathname\r\n                                )) && (\r\n                                <Grow in={this.props.selected.length > 0}>\r\n                                    <IconButton\r\n                                        color=\"inherit\"\r\n                                        className={classes.menuIcon}\r\n                                        onClick={() =>\r\n                                            this.props.setSelectedTarget([])\r\n                                        }\r\n                                    >\r\n                                        <BackIcon />\r\n                                    </IconButton>\r\n                                </Grow>\r\n                            )}\r\n                        {this.props.selected.length === 0 && (\r\n                            <Typography\r\n                                variant=\"h6\"\r\n                                color=\"inherit\"\r\n                                noWrap\r\n                                onClick={() => {\r\n                                    this.props.history.push(\"/\");\r\n                                }}\r\n                            >\r\n                                {this.props.subTitle\r\n                                    ? this.props.subTitle\r\n                                    : this.props.title}\r\n                            </Typography>\r\n                        )}\r\n\r\n                        {!this.props.isMultiple &&\r\n                            (this.props.withFile || this.props.withFolder) &&\r\n                            !pathHelper.isMobile() && (\r\n                                <Typography variant=\"h6\" color=\"inherit\" noWrap>\r\n                                    {this.props.selected[0].name}{\" \"}\r\n                                    {this.props.withFile &&\r\n                                        (isHomePage ||\r\n                                            pathHelper.isSharePage(\r\n                                                this.props.location.pathname\r\n                                            )) &&\r\n                                        \"(\" +\r\n                                            sizeToString(\r\n                                                this.props.selected[0].size\r\n                                            ) +\r\n                                            \")\"}\r\n                                </Typography>\r\n                            )}\r\n\r\n                        {this.props.selected.length > 1 &&\r\n                            !pathHelper.isMobile() && (\r\n                                <Typography variant=\"h6\" color=\"inherit\" noWrap>\r\n                                    {t(\"navbar.objectsSelected\", {\r\n                                        num: this.props.selected.length,\r\n                                    })}\r\n                                </Typography>\r\n                            )}\r\n                        {this.props.selected.length === 0 && <SezrchBar />}\r\n                        <div className={classes.grow} />\r\n                        {this.props.selected.length > 0 &&\r\n                            (isHomePage || isSharePage) && (\r\n                                <div className={classes.sectionForFile}>\r\n                                    {!this.props.isMultiple &&\r\n                                        this.props.withFile &&\r\n                                        isPreviewable(\r\n                                            this.props.selected[0].name\r\n                                        ) && (\r\n                                            <Grow\r\n                                                in={\r\n                                                    !this.props.isMultiple &&\r\n                                                    this.props.withFile &&\r\n                                                    isPreviewable(\r\n                                                        this.props.selected[0]\r\n                                                            .name\r\n                                                    )\r\n                                                }\r\n                                            >\r\n                                                <Tooltip\r\n                                                    title={t(\r\n                                                        \"fileManager.open\"\r\n                                                    )}\r\n                                                >\r\n                                                    <IconButton\r\n                                                        color=\"inherit\"\r\n                                                        onClick={() =>\r\n                                                            this.props.openPreview(\r\n                                                                this.props\r\n                                                                    .shareInfo\r\n                                                            )\r\n                                                        }\r\n                                                    >\r\n                                                        <OpenIcon />\r\n                                                    </IconButton>\r\n                                                </Tooltip>\r\n                                            </Grow>\r\n                                        )}\r\n                                    {!this.props.isMultiple &&\r\n                                        this.props.withFile && (\r\n                                            <Grow\r\n                                                in={\r\n                                                    !this.props.isMultiple &&\r\n                                                    this.props.withFile\r\n                                                }\r\n                                            >\r\n                                                <Tooltip\r\n                                                    title={t(\r\n                                                        \"fileManager.download\"\r\n                                                    )}\r\n                                                >\r\n                                                    <IconButton\r\n                                                        color=\"inherit\"\r\n                                                        onClick={() =>\r\n                                                            this.openDownload()\r\n                                                        }\r\n                                                    >\r\n                                                        <DownloadIcon />\r\n                                                    </IconButton>\r\n                                                </Tooltip>\r\n                                            </Grow>\r\n                                        )}\r\n                                    {(this.props.isMultiple ||\r\n                                        this.props.withFolder) &&\r\n                                        window.showDirectoryPicker &&\r\n                                        window.isSecureContext && (\r\n                                            <Grow\r\n                                                in={\r\n                                                    (this.props.isMultiple ||\r\n                                                        this.props\r\n                                                            .withFolder) &&\r\n                                                    window.showDirectoryPicker &&\r\n                                                    window.isSecureContext\r\n                                                }\r\n                                            >\r\n                                                <Tooltip\r\n                                                    title={t(\r\n                                                        \"fileManager.download\"\r\n                                                    )}\r\n                                                >\r\n                                                    <IconButton\r\n                                                        color=\"inherit\"\r\n                                                        onClick={() =>\r\n                                                            this.openDirectoryDownload()\r\n                                                        }\r\n                                                    >\r\n                                                        <FolderDownload />\r\n                                                    </IconButton>\r\n                                                </Tooltip>\r\n                                            </Grow>\r\n                                        )}\r\n                                    {(this.props.isMultiple ||\r\n                                        this.props.withFolder) && (\r\n                                        <Grow\r\n                                            in={\r\n                                                this.props.isMultiple ||\r\n                                                this.props.withFolder\r\n                                            }\r\n                                        >\r\n                                            <Tooltip\r\n                                                title={t(\r\n                                                    \"fileManager.batchDownload\"\r\n                                                )}\r\n                                            >\r\n                                                <IconButton\r\n                                                    color=\"inherit\"\r\n                                                    disableClickAway\r\n                                                    onClick={() =>\r\n                                                        this.archiveDownload()\r\n                                                    }\r\n                                                >\r\n                                                    <DownloadIcon />\r\n                                                </IconButton>\r\n                                            </Tooltip>\r\n                                        </Grow>\r\n                                    )}\r\n                                    {!this.props.isMultiple &&\r\n                                        !pathHelper.isMobile() &&\r\n                                        !isSharePage && (\r\n                                            <Grow in={!this.props.isMultiple}>\r\n                                                <Tooltip\r\n                                                    title={t(\r\n                                                        \"fileManager.share\"\r\n                                                    )}\r\n                                                >\r\n                                                    <IconButton\r\n                                                        color=\"inherit\"\r\n                                                        onClick={() =>\r\n                                                            this.props.openShareDialog()\r\n                                                        }\r\n                                                    >\r\n                                                        <ShareIcon />\r\n                                                    </IconButton>\r\n                                                </Tooltip>\r\n                                            </Grow>\r\n                                        )}\r\n                                    {!this.props.isMultiple && !isSharePage && (\r\n                                        <Grow in={!this.props.isMultiple}>\r\n                                            <Tooltip\r\n                                                title={t(\"fileManager.rename\")}\r\n                                            >\r\n                                                <IconButton\r\n                                                    color=\"inherit\"\r\n                                                    onClick={() =>\r\n                                                        this.props.openRenameDialog()\r\n                                                    }\r\n                                                >\r\n                                                    <RenameIcon />\r\n                                                </IconButton>\r\n                                            </Tooltip>\r\n                                        </Grow>\r\n                                    )}\r\n                                    {!isSharePage && (\r\n                                        <div style={{ display: \"flex\" }}>\r\n                                            {!pathHelper.isMobile() && (\r\n                                                <Grow\r\n                                                    in={\r\n                                                        this.props.selected\r\n                                                            .length !== 0 &&\r\n                                                        !pathHelper.isMobile()\r\n                                                    }\r\n                                                >\r\n                                                    <Tooltip\r\n                                                        title={t(\r\n                                                            \"fileManager.move\"\r\n                                                        )}\r\n                                                    >\r\n                                                        <IconButton\r\n                                                            color=\"inherit\"\r\n                                                            onClick={() =>\r\n                                                                this.props.openMoveDialog()\r\n                                                            }\r\n                                                        >\r\n                                                            <MoveIcon />\r\n                                                        </IconButton>\r\n                                                    </Tooltip>\r\n                                                </Grow>\r\n                                            )}\r\n\r\n                                            <Grow\r\n                                                in={\r\n                                                    this.props.selected\r\n                                                        .length !== 0\r\n                                                }\r\n                                            >\r\n                                                <Tooltip\r\n                                                    title={t(\r\n                                                        \"fileManager.delete\"\r\n                                                    )}\r\n                                                >\r\n                                                    <IconButton\r\n                                                        color=\"inherit\"\r\n                                                        onClick={() =>\r\n                                                            this.props.openRemoveDialog()\r\n                                                        }\r\n                                                    >\r\n                                                        <DeleteIcon />\r\n                                                    </IconButton>\r\n                                                </Tooltip>\r\n                                            </Grow>\r\n\r\n                                            {pathHelper.isMobile() && (\r\n                                                <Grow\r\n                                                    in={\r\n                                                        this.props.selected\r\n                                                            .length !== 0 &&\r\n                                                        pathHelper.isMobile()\r\n                                                    }\r\n                                                >\r\n                                                    <Tooltip\r\n                                                        title={t(\r\n                                                            \"fileManager.moreActions\"\r\n                                                        )}\r\n                                                    >\r\n                                                        <IconButton\r\n                                                            color=\"inherit\"\r\n                                                            onClick={() =>\r\n                                                                this.props.changeContextMenu(\r\n                                                                    \"file\",\r\n                                                                    true\r\n                                                                )\r\n                                                            }\r\n                                                        >\r\n                                                            <MoreHoriz />\r\n                                                        </IconButton>\r\n                                                    </Tooltip>\r\n                                                </Grow>\r\n                                            )}\r\n                                        </div>\r\n                                    )}\r\n                                </div>\r\n                            )}\r\n                        {this.props.selected.length <= 1 &&\r\n                            !(!this.props.isMultiple && this.props.withFile) &&\r\n                            this.props.audioPreviewPlayingName != null && (\r\n                                <IconButton\r\n                                    title={t(\"navbar.music\")}\r\n                                    className={classes.sideButton}\r\n                                    onClick={this.props.audioPreviewOpen}\r\n                                    color={\"inherit\"}\r\n                                >\r\n                                    <MusicNote fontSize={\"default\"} />\r\n                                </IconButton>\r\n                            )}\r\n\r\n                        {this.props.selected.length === 0 && <UserAvatar />}\r\n                        {this.props.selected.length === 0 &&\r\n                            pathHelper.isMobile() &&\r\n                            (isHomePage || this.props.shareInfo) && (\r\n                                <SubActions inherit />\r\n                            )}\r\n                    </Toolbar>\r\n                </AppBar>\r\n                <Uploader />\r\n\r\n                <Hidden smUp implementation=\"css\">\r\n                    <SwipeableDrawer\r\n                        container={this.props.container}\r\n                        variant=\"temporary\"\r\n                        classes={{\r\n                            paper: classes.drawerPaper,\r\n                        }}\r\n                        anchor=\"left\"\r\n                        open={this.state.mobileOpen}\r\n                        onClose={this.handleDrawerToggle}\r\n                        onOpen={() =>\r\n                            this.setState(() => ({ mobileOpen: true }))\r\n                        }\r\n                        disableDiscovery={iOS}\r\n                        ModalProps={{\r\n                            keepMounted: true, // Better open performance on mobile.\r\n                        }}\r\n                    >\r\n                        {drawer}\r\n                    </SwipeableDrawer>\r\n                </Hidden>\r\n                <Hidden xsDown implementation=\"css\">\r\n                    <Drawer\r\n                        classes={{\r\n                            paper: classes.drawerPaperDesktop,\r\n                        }}\r\n                        className={classNames(classes.drawer, {\r\n                            [classes.drawerOpen]: this.props.desktopOpen,\r\n                            [classes.drawerClose]: !this.props.desktopOpen,\r\n                        })}\r\n                        variant=\"persistent\"\r\n                        anchor=\"left\"\r\n                        open={this.props.desktopOpen}\r\n                    >\r\n                        <div className={classes.toolbar} />\r\n                        {drawer}\r\n                    </Drawer>\r\n                </Hidden>\r\n            </div>\r\n        );\r\n    }\r\n}\r\nNavbarCompoment.propTypes = {\r\n    classes: PropTypes.object.isRequired,\r\n    theme: PropTypes.object.isRequired,\r\n};\r\n\r\nconst Navbar = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(\r\n    withTheme(\r\n        withStyles(styles)(withRouter(withTranslation()(NavbarCompoment)))\r\n    )\r\n);\r\n\r\nexport default Navbar;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport SearchIcon from \"@material-ui/icons/Search\";\r\nimport { fade } from \"@material-ui/core/styles/colorManipulator\";\r\nimport FileIcon from \"@material-ui/icons/InsertDriveFile\";\r\nimport ShareIcon from \"@material-ui/icons/Share\";\r\nimport { connect } from \"react-redux\";\r\n\r\nimport {\r\n    Fade,\r\n    InputBase,\r\n    ListItemIcon,\r\n    ListItemText,\r\n    MenuItem,\r\n    Paper,\r\n    Popper,\r\n    Typography,\r\n    withStyles,\r\n} from \"@material-ui/core\";\r\nimport Auth from \"../../middleware/Auth\";\r\nimport { withRouter } from \"react-router\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport { configure, HotKeys } from \"react-hotkeys\";\r\nimport { searchMyFile } from \"../../redux/explorer\";\r\nimport FolderIcon from \"@material-ui/icons/Folder\";\r\nimport { Trans, withTranslation } from \"react-i18next\";\r\n\r\nconfigure({\r\n    ignoreTags: [],\r\n});\r\n\r\nconst mapStateToProps = (state) => {\r\n    return {\r\n        path: state.navigator.path,\r\n        search: state.explorer.search,\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n    return {\r\n        searchMyFile: (keywords, path) => {\r\n            dispatch(searchMyFile(keywords, path));\r\n        },\r\n    };\r\n};\r\n\r\nconst styles = (theme) => ({\r\n    search: {\r\n        [theme.breakpoints.down(\"sm\")]: {\r\n            display: \"none\",\r\n        },\r\n        position: \"relative\",\r\n        borderRadius: theme.shape.borderRadius,\r\n        backgroundColor: fade(theme.palette.common.white, 0.15),\r\n        \"&:hover\": {\r\n            backgroundColor: fade(theme.palette.common.white, 0.25),\r\n        },\r\n        marginRight: theme.spacing(2),\r\n        marginLeft: 0,\r\n        width: \"100%\",\r\n        [theme.breakpoints.up(\"sm\")]: {\r\n            marginLeft: theme.spacing(7.2),\r\n            width: \"auto\",\r\n        },\r\n    },\r\n    searchIcon: {\r\n        width: theme.spacing(9),\r\n        height: \"100%\",\r\n        position: \"absolute\",\r\n        pointerEvents: \"none\",\r\n        display: \"flex\",\r\n        alignItems: \"center\",\r\n        justifyContent: \"center\",\r\n    },\r\n    inputRoot: {\r\n        color: \"inherit\",\r\n        width: \"100%\",\r\n    },\r\n    inputInput: {\r\n        paddingTop: theme.spacing(1),\r\n        paddingRight: theme.spacing(1),\r\n        paddingBottom: theme.spacing(1),\r\n        paddingLeft: theme.spacing(7),\r\n        transition: theme.transitions.create(\"width\"),\r\n        width: \"100%\",\r\n        [theme.breakpoints.up(\"md\")]: {\r\n            width: 200,\r\n            \"&:focus\": {\r\n                width: 300,\r\n            },\r\n        },\r\n    },\r\n    suggestBox: {\r\n        zIndex: \"9999\",\r\n        width: 364,\r\n    },\r\n});\r\n\r\nconst keyMap = {\r\n    SEARCH: \"enter\",\r\n};\r\n\r\nclass SearchBarCompoment extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n        this.state = {\r\n            anchorEl: null,\r\n            input: \"\",\r\n        };\r\n    }\r\n\r\n    handlers = {\r\n        SEARCH: (e) => {\r\n            if (pathHelper.isHomePage(this.props.location.pathname)) {\r\n                this.searchMyFile(\"\")();\r\n            } else {\r\n                this.searchShare();\r\n            }\r\n            e.target.blur();\r\n        },\r\n    };\r\n\r\n    handleChange = (event) => {\r\n        const { currentTarget } = event;\r\n        this.input = event.target.value;\r\n        this.setState({\r\n            anchorEl: currentTarget,\r\n            input: event.target.value,\r\n        });\r\n    };\r\n\r\n    cancelSuggest = () => {\r\n        this.setState({\r\n            input: \"\",\r\n        });\r\n    };\r\n\r\n    searchMyFile = (path) => () => {\r\n        this.props.searchMyFile(\"keywords/\" + this.input, path);\r\n    };\r\n\r\n    searchShare = () => {\r\n        this.props.history.push(\r\n            \"/search?keywords=\" + encodeURIComponent(this.input)\r\n        );\r\n    };\r\n\r\n    render() {\r\n        const { classes, t } = this.props;\r\n        const { anchorEl } = this.state;\r\n        const id = this.state.input !== \"\" ? \"simple-popper\" : null;\r\n        const isHomePage = pathHelper.isHomePage(this.props.location.pathname);\r\n        const isLogin = Auth.Check(this.props.isLogin);\r\n\r\n        return (\r\n            <div className={classes.search}>\r\n                {isLogin && (\r\n                <><div className={classes.searchIcon}>\r\n                        <SearchIcon />\r\n                    </div>\r\n                    <HotKeys keyMap={keyMap} handlers={this.handlers}>\r\n                        <InputBase\r\n                            placeholder={t(\"navbar.searchPlaceholder\")}\r\n                            classes={{\r\n                                root: classes.inputRoot,\r\n                                input: classes.inputInput,\r\n                            }}\r\n                            onChange={this.handleChange}\r\n                            onBlur={this.cancelSuggest}\r\n                            value={this.state.input} />\r\n                    </HotKeys></>\r\n                )}\r\n                <Popper\r\n                    id={id}\r\n                    open={this.state.input !== \"\"}\r\n                    anchorEl={anchorEl}\r\n                    className={classes.suggestBox}\r\n                    transition\r\n                >\r\n                    {({ TransitionProps }) => (\r\n                        <Fade {...TransitionProps} timeout={350}>\r\n                            <Paper square={true}>\r\n                                {isHomePage && (\r\n                                    <MenuItem onClick={this.searchMyFile(\"\")}>\r\n                                        <ListItemIcon className={classes.icon}>\r\n                                            <FileIcon />\r\n                                        </ListItemIcon>\r\n                                        <ListItemText\r\n                                            classes={{\r\n                                                primary: classes.primary,\r\n                                            }}\r\n                                            primary={\r\n                                                <Typography noWrap>\r\n                                                    <Trans\r\n                                                        i18nKey=\"navbar.searchInFiles\"\r\n                                                        values={{\r\n                                                            name: this.state\r\n                                                                .input,\r\n                                                        }}\r\n                                                        components={[\r\n                                                            <strong key={0} />,\r\n                                                        ]}\r\n                                                    />\r\n                                                </Typography>\r\n                                            }\r\n                                        />\r\n                                    </MenuItem>\r\n                                )}\r\n\r\n                                {isHomePage &&\r\n                                    this.props.path !== \"/\" &&\r\n                                    !this.props.search && (\r\n                                        <MenuItem\r\n                                            onClick={this.searchMyFile(\r\n                                                this.props.path\r\n                                            )}\r\n                                        >\r\n                                            <ListItemIcon\r\n                                                className={classes.icon}\r\n                                            >\r\n                                                <FolderIcon />\r\n                                            </ListItemIcon>\r\n                                            <ListItemText\r\n                                                classes={{\r\n                                                    primary: classes.primary,\r\n                                                }}\r\n                                                primary={\r\n                                                    <Typography noWrap>\r\n                                                        <Trans\r\n                                                            i18nKey=\"navbar.searchInFolders\"\r\n                                                            values={{\r\n                                                                name: this.state\r\n                                                                    .input,\r\n                                                            }}\r\n                                                            components={[\r\n                                                                <strong\r\n                                                                    key={0}\r\n                                                                />,\r\n                                                            ]}\r\n                                                        />\r\n                                                    </Typography>\r\n                                                }\r\n                                            />\r\n                                        </MenuItem>\r\n                                    )}\r\n\r\n                                <MenuItem onClick={this.searchShare}>\r\n                                    <ListItemIcon className={classes.icon}>\r\n                                        <ShareIcon />\r\n                                    </ListItemIcon>\r\n                                    <ListItemText\r\n                                        classes={{ primary: classes.primary }}\r\n                                        primary={\r\n                                            <Typography noWrap>\r\n                                                <Trans\r\n                                                    i18nKey=\"navbar.searchInShares\"\r\n                                                    values={{\r\n                                                        name: this.state.input,\r\n                                                    }}\r\n                                                    components={[\r\n                                                        <strong key={0} />,\r\n                                                    ]}\r\n                                                />\r\n                                            </Typography>\r\n                                        }\r\n                                    />\r\n                                </MenuItem>\r\n                            </Paper>\r\n                        </Fade>\r\n                    )}\r\n                </Popper>\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nSearchBarCompoment.propTypes = {\r\n    classes: PropTypes.object.isRequired,\r\n};\r\n\r\nconst SearchBar = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(withRouter(withTranslation()(SearchBarCompoment))));\r\n\r\nexport default SearchBar;\r\n","import { Task } from \"../types\";\r\nimport Logger from \"../logger\";\r\nimport { UploaderError, UploaderErrorName } from \"../errors\";\r\nimport { ChunkProgress } from \"../uploader/chunk\";\r\n\r\nexport const sizeToString = (bytes: number): string => {\r\n    if (bytes === 0) return \"0 B\";\r\n    const k = 1024;\r\n    const sizes = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"];\r\n    const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n    return (bytes / Math.pow(k, i)).toFixed(1) + \" \" + sizes[i];\r\n};\r\n\r\n// 文件分块\r\nexport function getChunks(\r\n    file: File,\r\n    chunkByteSize: number | undefined\r\n): Blob[] {\r\n    // 如果 chunkByteSize 比文件大或为0,则直接取文件的大小\r\n    if (!chunkByteSize || chunkByteSize > file.size || chunkByteSize == 0) {\r\n        chunkByteSize = file.size;\r\n    }\r\n\r\n    const chunks: Blob[] = [];\r\n    const count = Math.ceil(file.size / chunkByteSize);\r\n    for (let i = 0; i < count; i++) {\r\n        const chunk = file.slice(\r\n            chunkByteSize * i,\r\n            i === count - 1 ? file.size : chunkByteSize * (i + 1)\r\n        );\r\n        chunks.push(chunk);\r\n    }\r\n\r\n    if (chunks.length == 0) {\r\n        chunks.push(file.slice(0));\r\n    }\r\n    return chunks;\r\n}\r\n\r\nexport function sumChunk(list: ChunkProgress[]) {\r\n    return list.reduce((data, loaded) => data + loaded.loaded, 0);\r\n}\r\n\r\nconst resumeKeyPrefix = \"cd_upload_ctx_\";\r\n\r\nfunction isTask(toBeDetermined: Task | string): toBeDetermined is Task {\r\n    return !!(toBeDetermined as Task).name;\r\n}\r\n\r\nexport function getResumeCtxKey(task: Task | string): string {\r\n    if (isTask(task)) {\r\n        return `${resumeKeyPrefix}name_${task.name}_dst_${task.dst}_size_${task.size}_policy_${task.policy.id}`;\r\n    }\r\n\r\n    return task;\r\n}\r\n\r\nexport function setResumeCtx(task: Task, logger: Logger) {\r\n    const ctxKey = getResumeCtxKey(task);\r\n    try {\r\n        localStorage.setItem(ctxKey, JSON.stringify(task));\r\n    } catch (err) {\r\n        logger.warn(\r\n            new UploaderError(\r\n                UploaderErrorName.WriteCtxFailed,\r\n                `setResumeCtx failed: ${ctxKey}`\r\n            )\r\n        );\r\n    }\r\n}\r\n\r\nexport function removeResumeCtx(task: Task | string, logger: Logger) {\r\n    const ctxKey = getResumeCtxKey(task);\r\n    try {\r\n        localStorage.removeItem(ctxKey);\r\n    } catch (err) {\r\n        logger.warn(\r\n            new UploaderError(\r\n                UploaderErrorName.RemoveCtxFailed,\r\n                `removeResumeCtx failed. key: ${ctxKey}`\r\n            )\r\n        );\r\n    }\r\n}\r\n\r\nexport function cleanupResumeCtx(logger: Logger) {\r\n    for (let i = 0; i < localStorage.length; i++) {\r\n        const key = localStorage.key(i);\r\n        if (key && key.startsWith(resumeKeyPrefix)) {\r\n            try {\r\n                localStorage.removeItem(key);\r\n            } catch (err) {\r\n                logger.warn(\r\n                    new UploaderError(\r\n                        UploaderErrorName.RemoveCtxFailed,\r\n                        `removeResumeCtx failed. key: ${key}`\r\n                    )\r\n                );\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nexport function getResumeCtx(task: Task | string, logger: Logger): Task | null {\r\n    const ctxKey = getResumeCtxKey(task);\r\n    let localInfoString: string | null = null;\r\n    try {\r\n        localInfoString = localStorage.getItem(ctxKey);\r\n    } catch {\r\n        logger.warn(\r\n            new UploaderError(\r\n                UploaderErrorName.ReadCtxFailed,\r\n                `getResumeCtx failed. key: ${ctxKey}`\r\n            )\r\n        );\r\n    }\r\n\r\n    if (localInfoString == null) {\r\n        return null;\r\n    }\r\n\r\n    let localInfo: Task | null = null;\r\n    try {\r\n        localInfo = JSON.parse(localInfoString);\r\n    } catch {\r\n        // 本地信息已被破坏,直接删除\r\n        removeResumeCtx(task, logger);\r\n        logger.warn(\r\n            new UploaderError(\r\n                UploaderErrorName.InvalidCtxData,\r\n                `getResumeCtx failed to parse. key: ${ctxKey}`\r\n            )\r\n        );\r\n    }\r\n\r\n    if (\r\n        localInfo &&\r\n        localInfo.session &&\r\n        localInfo.session.expires < Math.floor(Date.now() / 1000)\r\n    ) {\r\n        removeResumeCtx(task, logger);\r\n        logger.warn(\r\n            new UploaderError(\r\n                UploaderErrorName.CtxExpired,\r\n                `upload session already expired at ${localInfo.session.expires}. key: ${ctxKey}`\r\n            )\r\n        );\r\n        return null;\r\n    }\r\n\r\n    return localInfo;\r\n}\r\n\r\nexport function listResumeCtx(logger: Logger): Task[] {\r\n    const res: Task[] = [];\r\n    for (let i = 0, len = localStorage.length; i < len; i++) {\r\n        const key = localStorage.key(i);\r\n        if (key && key.startsWith(resumeKeyPrefix)) {\r\n            const value = getResumeCtx(key, logger);\r\n            if (value) {\r\n                res.push(value);\r\n            }\r\n        }\r\n    }\r\n\r\n    return res;\r\n}\r\n\r\nexport function OBJtoXML(obj: any): string {\r\n    let xml = \"\";\r\n    for (const prop in obj) {\r\n        xml += \"<\" + prop + \">\";\r\n        if (Array.isArray(obj[prop])) {\r\n            for (const array of obj[prop]) {\r\n                // A real botch fix here\r\n                xml += \"</\" + prop + \">\";\r\n                xml += \"<\" + prop + \">\";\r\n\r\n                xml += OBJtoXML(new Object(array));\r\n            }\r\n        } else if (typeof obj[prop] == \"object\") {\r\n            xml += OBJtoXML(new Object(obj[prop]));\r\n        } else {\r\n            xml += obj[prop];\r\n        }\r\n        xml += \"</\" + prop + \">\";\r\n    }\r\n    return xml.replace(/<\\/?[0-9]{1,}>/g, \"\");\r\n}\r\n\r\nexport function getFileInput(id: number, isFolder: boolean): HTMLInputElement {\r\n    const input = document.createElement(\"input\");\r\n    input.type = \"file\";\r\n    input.id = `upload-file-input-${id}`;\r\n    if (isFolder) {\r\n        input.id = `upload-folder-input-${id}`;\r\n        input.setAttribute(\"webkitdirectory\", \"true\");\r\n        input.setAttribute(\"mozdirectory\", \"true\");\r\n    } else {\r\n        input.id = `upload-file-input-${id}`;\r\n        input.multiple = true;\r\n    }\r\n    input.hidden = true;\r\n    document.body.appendChild(input);\r\n    return input;\r\n}\r\n\r\nexport function pathJoin(parts: string[], sep = \"/\"): string {\r\n    parts = parts.map((part, index) => {\r\n        if (index) {\r\n            part = part.replace(new RegExp(\"^\" + sep), \"\");\r\n        }\r\n        if (index !== parts.length - 1) {\r\n            part = part.replace(new RegExp(sep + \"$\"), \"\");\r\n        }\r\n        return part;\r\n    });\r\n    return parts.join(sep);\r\n}\r\n\r\nfunction basename(path: string): string {\r\n    const pathList = path.split(\"/\");\r\n    pathList.pop();\r\n    return pathList.join(\"/\") === \"\" ? \"/\" : pathList.join(\"/\");\r\n}\r\n\r\nexport function trimPrefix(src: string, prefix: string): string {\r\n    if (src.startsWith(prefix)) {\r\n        return src.slice(prefix.length);\r\n    }\r\n    return src;\r\n}\r\n\r\nexport function getDirectoryUploadDst(dst: string, file: any): string {\r\n    let relPath = file.webkitRelativePath;\r\n    if (!relPath || relPath == \"\") {\r\n        relPath = file.fsPath;\r\n        if (!relPath || relPath == \"\") {\r\n            return dst;\r\n        }\r\n    }\r\n\r\n    relPath = trimPrefix(relPath, \"/\");\r\n\r\n    return basename(pathJoin([dst, relPath]));\r\n}\r\n\r\n// Wrap readEntries in a promise to make working with readEntries easier\r\nasync function readEntriesPromise(directoryReader: any): Promise<any> {\r\n    try {\r\n        return await new Promise((resolve, reject) => {\r\n            directoryReader.readEntries(resolve, reject);\r\n        });\r\n    } catch (err) {\r\n        console.log(err);\r\n    }\r\n}\r\n\r\nasync function readFilePromise(fileReader: any, path: string): Promise<any> {\r\n    try {\r\n        return await new Promise((resolve, reject) => {\r\n            fileReader.file((file: any) => {\r\n                file.fsPath = path;\r\n                resolve(file);\r\n            });\r\n        });\r\n    } catch (err) {\r\n        console.log(err);\r\n    }\r\n}\r\n\r\n// Get all the entries (files or sub-directories) in a directory by calling readEntries until it returns empty array\r\nasync function readAllDirectoryEntries(directoryReader: any): Promise<any> {\r\n    const entries: any[] = [];\r\n    let readEntries = await readEntriesPromise(directoryReader);\r\n    while (readEntries.length > 0) {\r\n        entries.push(...readEntries);\r\n        readEntries = await readEntriesPromise(directoryReader);\r\n    }\r\n    return entries;\r\n}\r\n\r\n// Drop handler function to get all files\r\nexport async function getAllFileEntries(\r\n    dataTransferItemList: DataTransferItemList\r\n): Promise<File[]> {\r\n    const fileEntries: any[] = [];\r\n    // Use BFS to traverse entire directory/file structure\r\n    const queue: any[] = [];\r\n    // Unfortunately dataTransferItemList is not iterable i.e. no forEach\r\n    for (let i = 0; i < dataTransferItemList.length; i++) {\r\n        const fileEntry = dataTransferItemList[i].webkitGetAsEntry();\r\n        if (!fileEntry) {\r\n            const file = dataTransferItemList[i].getAsFile();\r\n            if (file) {\r\n                fileEntries.push(file);\r\n            }\r\n        }\r\n\r\n        queue.push(dataTransferItemList[i].webkitGetAsEntry());\r\n    }\r\n    while (queue.length > 0) {\r\n        const entry = queue.shift();\r\n        if (!entry) {\r\n            continue;\r\n        }\r\n        if (entry.isFile) {\r\n            fileEntries.push(await readFilePromise(entry, entry.fullPath));\r\n        } else if (entry.isDirectory) {\r\n            const reader = entry.createReader();\r\n            const entries: any = await readAllDirectoryEntries(reader);\r\n            queue.push(...entries);\r\n        }\r\n    }\r\n    return fileEntries;\r\n}\r\n\r\nexport function isFileDrop(e: DragEvent): boolean {\r\n    return !!e.dataTransfer && e.dataTransfer.types.includes(\"Files\");\r\n}\r\n","export * from \"./pool\";\r\nexport * from \"./helper\";\r\nexport * from \"./validator\";\r\nexport * from \"./request\";\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport StorageIcon from \"@material-ui/icons/Storage\";\r\nimport { connect } from \"react-redux\";\r\nimport API from \"../../middleware/Api\";\r\nimport { sizeToString } from \"../../utils\";\r\n\r\nimport {\r\n    Divider,\r\n    LinearProgress,\r\n    Tooltip,\r\n    Typography,\r\n    withStyles,\r\n} from \"@material-ui/core\";\r\nimport ButtonBase from \"@material-ui/core/ButtonBase\";\r\nimport { withRouter } from \"react-router\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport { Link as RouterLink } from \"react-router-dom\";\r\nimport { withTranslation } from \"react-i18next\";\r\n\r\nconst mapStateToProps = (state) => {\r\n    return {\r\n        refresh: state.viewUpdate.storageRefresh,\r\n        isLogin: state.viewUpdate.isLogin,\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n    return {\r\n        toggleSnackbar: (vertical, horizontal, msg, color) => {\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color));\r\n        },\r\n    };\r\n};\r\n\r\nconst styles = (theme) => ({\r\n    iconFix: {\r\n        marginLeft: \"32px\",\r\n        marginRight: \"17px\",\r\n        color: theme.palette.text.secondary,\r\n        marginTop: \"2px\",\r\n    },\r\n    textFix: {\r\n        padding: \" 0 0 0 16px\",\r\n    },\r\n    storageContainer: {\r\n        display: \"flex\",\r\n        marginTop: \"15px\",\r\n        textAlign: \"left\",\r\n        marginBottom: \"11px\",\r\n    },\r\n    detail: {\r\n        width: \"100%\",\r\n        marginRight: \"35px\",\r\n    },\r\n    info: {\r\n        width: \"131px\",\r\n        overflow: \"hidden\",\r\n        textOverflow: \"ellipsis\",\r\n        [theme.breakpoints.down(\"xs\")]: {\r\n            width: \"162px\",\r\n        },\r\n        marginTop: \"5px\",\r\n    },\r\n    bar: {\r\n        marginTop: \"5px\",\r\n    },\r\n    stickFooter: {\r\n        backgroundColor: theme.palette.background.paper,\r\n    },\r\n});\r\n\r\n// TODO 使用 hooks 重构\r\nclass StorageBarCompoment extends Component {\r\n    state = {\r\n        percent: 0,\r\n        used: null,\r\n        total: null,\r\n        showExpand: false,\r\n    };\r\n\r\n    firstLoad = true;\r\n\r\n    componentDidMount = () => {\r\n        if (this.firstLoad && this.props.isLogin) {\r\n            this.firstLoad = !this.firstLoad;\r\n            this.updateStatus();\r\n        }\r\n    };\r\n\r\n    componentWillUnmount() {\r\n        this.firstLoad = false;\r\n    }\r\n\r\n    UNSAFE_componentWillReceiveProps = (nextProps) => {\r\n        if (\r\n            (this.props.isLogin && this.props.refresh !== nextProps.refresh) ||\r\n            (this.props.isLogin !== nextProps.isLogin && nextProps.isLogin)\r\n        ) {\r\n            this.updateStatus();\r\n        }\r\n    };\r\n\r\n    updateStatus = () => {\r\n        let percent = 0;\r\n        API.get(\"/user/storage\")\r\n            .then((response) => {\r\n                if (response.data.used / response.data.total >= 1) {\r\n                    percent = 100;\r\n                    this.props.toggleSnackbar(\r\n                        \"top\",\r\n                        \"right\",\r\n                        this.props.t(\"navbar.exceedQuota\"),\r\n                        \"warning\"\r\n                    );\r\n                } else {\r\n                    percent = (response.data.used / response.data.total) * 100;\r\n                }\r\n                this.setState({\r\n                    percent: percent,\r\n                    used: sizeToString(response.data.used),\r\n                    total: sizeToString(response.data.total),\r\n                });\r\n            })\r\n            // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n            .catch(() => {});\r\n    };\r\n\r\n    render() {\r\n        const { classes, t } = this.props;\r\n        return (\r\n            <div\r\n                onMouseEnter={() => this.setState({ showExpand: true })}\r\n                onMouseLeave={() => this.setState({ showExpand: false })}\r\n                className={classes.stickFooter}\r\n            >\r\n                <Divider />\r\n                <ButtonBase>\r\n                    <div className={classes.storageContainer}>\r\n                        <StorageIcon className={classes.iconFix} />\r\n                        <div className={classes.detail}>\r\n                            <Typography variant={\"subtitle2\"}>\r\n                                {t(\"navbar.storage\")}\r\n                            </Typography>\r\n                            <LinearProgress\r\n                                className={classes.bar}\r\n                                color=\"secondary\"\r\n                                variant=\"determinate\"\r\n                                value={this.state.percent}\r\n                            />\r\n                            <div className={classes.info}>\r\n                                <Tooltip\r\n                                    title={t(\"navbar.storageDetail\", {\r\n                                        used:\r\n                                            this.state.used === null\r\n                                                ? \" -- \"\r\n                                                : this.state.used,\r\n                                        total:\r\n                                            this.state.total === null\r\n                                                ? \" -- \"\r\n                                                : this.state.total,\r\n                                    })}\r\n                                    placement=\"top\"\r\n                                >\r\n                                    <Typography\r\n                                        variant=\"caption\"\r\n                                        noWrap\r\n                                        color=\"textSecondary\"\r\n                                    >\r\n                                        {this.state.used === null\r\n                                            ? \" -- \"\r\n                                            : this.state.used}\r\n                                        {\" / \"}\r\n                                        {this.state.total === null\r\n                                            ? \" -- \"\r\n                                            : this.state.total}\r\n                                    </Typography>\r\n                                </Tooltip>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </ButtonBase>\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nStorageBarCompoment.propTypes = {\r\n    classes: PropTypes.object.isRequired,\r\n};\r\n\r\nconst StorageBar = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(withRouter(withTranslation()(StorageBarCompoment))));\r\n\r\nexport default StorageBar;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { connect } from \"react-redux\";\r\nimport { Typography, withStyles } from \"@material-ui/core\";\r\nimport Auth from \"../../middleware/Auth\";\r\nimport DarkModeSwitcher from \"./DarkModeSwitcher\";\r\nimport Avatar from \"@material-ui/core/Avatar\";\r\nimport { setUserPopover } from \"../../redux/explorer\";\r\nimport { withTranslation } from \"react-i18next\";\r\n\r\nconst mapStateToProps = (state) => {\r\n    return {\r\n        isLogin: state.viewUpdate.isLogin,\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n    return {\r\n        setUserPopover: (anchor) => {\r\n            dispatch(setUserPopover(anchor));\r\n        },\r\n    };\r\n};\r\n\r\nconst styles = (theme) => ({\r\n    userNav: {\r\n        height: \"170px\",\r\n        backgroundColor: theme.palette.primary.main,\r\n        padding: \"20px 20px 2em\",\r\n        backgroundImage:\r\n            \"url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 900'%3E%3Cpolygon fill='\" +\r\n            theme.palette.primary.light.replace(\"#\", \"%23\") +\r\n            \"' points='957 450 539 900 1396 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.primary.dark.replace(\"#\", \"%23\") +\r\n            \"' points='957 450 872.9 900 1396 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.secondary.main.replace(\"#\", \"%23\") +\r\n            \"' points='-60 900 398 662 816 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.secondary.dark.replace(\"#\", \"%23\") +\r\n            \"' points='337 900 398 662 816 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.secondary.light.replace(\"#\", \"%23\") +\r\n            \"' points='1203 546 1552 900 876 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.secondary.main.replace(\"#\", \"%23\") +\r\n            \"' points='1203 546 1552 900 1162 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.primary.dark.replace(\"#\", \"%23\") +\r\n            \"' points='641 695 886 900 367 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.primary.main.replace(\"#\", \"%23\") +\r\n            \"' points='587 900 641 695 886 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.secondary.light.replace(\"#\", \"%23\") +\r\n            \"' points='1710 900 1401 632 1096 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.secondary.dark.replace(\"#\", \"%23\") +\r\n            \"' points='1710 900 1401 632 1365 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.secondary.main.replace(\"#\", \"%23\") +\r\n            \"' points='1210 900 971 687 725 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.secondary.dark.replace(\"#\", \"%23\") +\r\n            \"' points='943 900 1210 900 971 687'/%3E%3C/svg%3E\\\")\",\r\n        backgroundSize: \"cover\",\r\n    },\r\n    avatar: {\r\n        display: \"block\",\r\n        width: \"70px\",\r\n        height: \"70px\",\r\n        border: \" 2px solid #fff\",\r\n        borderRadius: \"50%\",\r\n        overflow: \"hidden\",\r\n        boxShadow:\r\n            \"0 2px 5px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12)\",\r\n    },\r\n    avatarImg: {\r\n        width: \"66px\",\r\n        height: \"66px\",\r\n    },\r\n    nickName: {\r\n        color: \"#fff\",\r\n        marginTop: \"15px\",\r\n        fontSize: \"17px\",\r\n    },\r\n    flexAvatar: {\r\n        display: \"flex\",\r\n        justifyContent: \"space-between\",\r\n        alignItems: \"flex-start\",\r\n    },\r\n    groupName: {\r\n        color: \"#ffffff\",\r\n        opacity: \"0.54\",\r\n    },\r\n    storageCircle: {\r\n        width: \"200px\",\r\n    },\r\n});\r\n\r\nclass UserInfoCompoment extends Component {\r\n    showUserInfo = (e) => {\r\n        this.props.setUserPopover(e.currentTarget);\r\n    };\r\n\r\n    render() {\r\n        const { classes, t } = this.props;\r\n        const isLogin = Auth.Check(this.props.isLogin);\r\n        const user = Auth.GetUser(this.props.isLogin);\r\n\r\n        return (\r\n            <div className={classes.userNav}>\r\n                <div className={classes.flexAvatar}>\r\n                    {/* eslint-disable-next-line */}\r\n                    <a onClick={this.showUserInfo} className={classes.avatar}>\r\n                        {isLogin && (\r\n                            <Avatar\r\n                                src={\"/api/v3/user/avatar/\" + user.id + \"/l\"}\r\n                                className={classes.avatarImg}\r\n                            />\r\n                        )}\r\n                        {!isLogin && (\r\n                            <Avatar\r\n                                src={\"/api/v3/user/avatar/0/l\"}\r\n                                className={classes.avatarImg}\r\n                            />\r\n                        )}\r\n                    </a>\r\n                    <DarkModeSwitcher position=\"left\" />\r\n                </div>\r\n                <div className={classes.storageCircle}>\r\n                    <Typography\r\n                        className={classes.nickName}\r\n                        component=\"h2\"\r\n                        noWrap\r\n                    >\r\n                        {isLogin ? user.nickname : t(\"navbar.notLoginIn\")}\r\n                    </Typography>\r\n                    <Typography\r\n                        className={classes.groupName}\r\n                        component=\"h2\"\r\n                        color=\"textSecondary\"\r\n                        noWrap\r\n                    >\r\n                        {isLogin ? user.group.name : t(\"navbar.visitor\")}\r\n                    </Typography>\r\n                </div>\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nUserInfoCompoment.propTypes = {\r\n    classes: PropTypes.object.isRequired,\r\n};\r\n\r\nconst UserInfo = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(withTranslation()(UserInfoCompoment)));\r\n\r\nexport default UserInfo;\r\n","import React, { Suspense, useCallback, useState } from \"react\";\r\nimport {\r\n    Divider,\r\n    List,\r\n    ListItem,\r\n    ListItemIcon,\r\n    ListItemText,\r\n    makeStyles,\r\n    withStyles,\r\n} from \"@material-ui/core\";\r\nimport { Clear, KeyboardArrowRight } from \"@material-ui/icons\";\r\nimport classNames from \"classnames\";\r\nimport FolderShared from \"@material-ui/icons/FolderShared\";\r\nimport UploadIcon from \"@material-ui/icons/CloudUpload\";\r\nimport VideoIcon from \"@material-ui/icons/VideoLibraryOutlined\";\r\nimport ImageIcon from \"@material-ui/icons/CollectionsOutlined\";\r\nimport MusicIcon from \"@material-ui/icons/LibraryMusicOutlined\";\r\nimport DocIcon from \"@material-ui/icons/FileCopyOutlined\";\r\nimport { useHistory, useLocation } from \"react-router\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport MuiExpansionPanel from \"@material-ui/core/ExpansionPanel\";\r\nimport MuiExpansionPanelSummary from \"@material-ui/core/ExpansionPanelSummary\";\r\nimport MuiExpansionPanelDetails from \"@material-ui/core/ExpansionPanelDetails\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport Auth from \"../../middleware/Auth\";\r\nimport {\r\n    Circle,\r\n    CircleOutline,\r\n    FolderHeartOutline,\r\n    Heart,\r\n    HeartOutline,\r\n    Hexagon,\r\n    HexagonOutline,\r\n    Hexagram,\r\n    HexagramOutline,\r\n    Rhombus,\r\n    RhombusOutline,\r\n    Square,\r\n    SquareOutline,\r\n    TagPlus,\r\n    Triangle,\r\n    TriangleOutline,\r\n} from \"mdi-material-ui\";\r\nimport ListItemSecondaryAction from \"@material-ui/core/ListItemSecondaryAction\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport API from \"../../middleware/Api\";\r\nimport { navigateTo, searchMyFile, toggleSnackbar } from \"../../redux/explorer\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst ExpansionPanel = withStyles({\r\n    root: {\r\n        maxWidth: \"100%\",\r\n        boxShadow: \"none\",\r\n        \"&:not(:last-child)\": {\r\n            borderBottom: 0,\r\n        },\r\n        \"&:before\": {\r\n            display: \"none\",\r\n        },\r\n        \"&$expanded\": { margin: 0 },\r\n    },\r\n    expanded: {},\r\n})(MuiExpansionPanel);\r\n\r\nconst ExpansionPanelSummary = withStyles({\r\n    root: {\r\n        minHeight: 0,\r\n        padding: 0,\r\n\r\n        \"&$expanded\": {\r\n            minHeight: 0,\r\n        },\r\n    },\r\n    content: {\r\n        maxWidth: \"100%\",\r\n        margin: 0,\r\n        display: \"block\",\r\n        \"&$expanded\": {\r\n            margin: \"0\",\r\n        },\r\n    },\r\n    expanded: {},\r\n})(MuiExpansionPanelSummary);\r\n\r\nconst ExpansionPanelDetails = withStyles((theme) => ({\r\n    root: {\r\n        display: \"block\",\r\n        padding: theme.spacing(0),\r\n    },\r\n}))(MuiExpansionPanelDetails);\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    expand: {\r\n        display: \"none\",\r\n        transition: \".15s all ease-in-out\",\r\n    },\r\n    expanded: {\r\n        display: \"block\",\r\n        transform: \"rotate(90deg)\",\r\n    },\r\n    iconFix: {\r\n        marginLeft: \"16px\",\r\n    },\r\n    hiddenButton: {\r\n        display: \"none\",\r\n    },\r\n    subMenu: {\r\n        marginLeft: theme.spacing(2),\r\n    },\r\n    overFlow: {\r\n        whiteSpace: \"nowrap\",\r\n        overflow: \"hidden\",\r\n        textOverflow: \"ellipsis\",\r\n    },\r\n}));\r\n\r\nconst icons = {\r\n    Circle: Circle,\r\n    CircleOutline: CircleOutline,\r\n    Heart: Heart,\r\n    HeartOutline: HeartOutline,\r\n    Hexagon: Hexagon,\r\n    HexagonOutline: HexagonOutline,\r\n    Hexagram: Hexagram,\r\n    HexagramOutline: HexagramOutline,\r\n    Rhombus: Rhombus,\r\n    RhombusOutline: RhombusOutline,\r\n    Square: Square,\r\n    SquareOutline: SquareOutline,\r\n    Triangle: Triangle,\r\n    TriangleOutline: TriangleOutline,\r\n    FolderHeartOutline: FolderHeartOutline,\r\n};\r\n\r\nconst AddTag = React.lazy(() => import(\"../Modals/AddTag\"));\r\n\r\nexport default function FileTag() {\r\n    const classes = useStyles();\r\n    const { t } = useTranslation();\r\n\r\n    const location = useLocation();\r\n    const history = useHistory();\r\n\r\n    const isHomePage = pathHelper.isHomePage(location.pathname);\r\n\r\n    const [tagOpen, setTagOpen] = useState(true);\r\n    const [addTagModal, setAddTagModal] = useState(false);\r\n    const [tagHover, setTagHover] = useState(null);\r\n    const [tags, setTags] = useState(\r\n        Auth.GetUser().tags ? Auth.GetUser().tags : []\r\n    );\r\n\r\n    const dispatch = useDispatch();\r\n    const SearchMyFile = useCallback((k, p) => dispatch(searchMyFile(k, p)), [\r\n        dispatch,\r\n    ]);\r\n    const NavigateTo = useCallback((k) => dispatch(navigateTo(k)), [dispatch]);\r\n\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n\r\n    const getIcon = (icon, color) => {\r\n        if (icons[icon]) {\r\n            const IconComponent = icons[icon];\r\n            return (\r\n                <IconComponent\r\n                    className={[classes.iconFix]}\r\n                    style={\r\n                        color\r\n                            ? {\r\n                                  color: color,\r\n                              }\r\n                            : {}\r\n                    }\r\n                />\r\n            );\r\n        }\r\n        return <Circle className={[classes.iconFix]} />;\r\n    };\r\n\r\n    const submitSuccess = (tag) => {\r\n        const newTags = [...tags, tag];\r\n        setTags(newTags);\r\n        const user = Auth.GetUser();\r\n        user.tags = newTags;\r\n        Auth.SetUser(user);\r\n    };\r\n\r\n    const submitDelete = (id) => {\r\n        API.delete(\"/tag/\" + id)\r\n            .then(() => {\r\n                const newTags = tags.filter((v) => {\r\n                    return v.id !== id;\r\n                });\r\n                setTags(newTags);\r\n                const user = Auth.GetUser();\r\n                user.tags = newTags;\r\n                Auth.SetUser(user);\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n            });\r\n    };\r\n\r\n    return (\r\n        <>\r\n            <Suspense fallback={\"\"}>\r\n                <AddTag\r\n                    onSuccess={submitSuccess}\r\n                    open={addTagModal}\r\n                    onClose={() => setAddTagModal(false)}\r\n                />\r\n            </Suspense>\r\n            <ExpansionPanel\r\n                square\r\n                expanded={tagOpen && isHomePage}\r\n                onChange={() => isHomePage && setTagOpen(!tagOpen)}\r\n            >\r\n                <ExpansionPanelSummary\r\n                    aria-controls=\"panel1d-content\"\r\n                    id=\"panel1d-header\"\r\n                >\r\n                    <ListItem\r\n                        button\r\n                        key=\"我的文件\"\r\n                        onClick={() =>\r\n                            !isHomePage && history.push(\"/home?path=%2F\")\r\n                        }\r\n                    >\r\n                        <ListItemIcon>\r\n                            <KeyboardArrowRight\r\n                                className={classNames(\r\n                                    {\r\n                                        [classes.expanded]:\r\n                                            tagOpen && isHomePage,\r\n                                        [classes.iconFix]: true,\r\n                                    },\r\n                                    classes.expand\r\n                                )}\r\n                            />\r\n                            {!(tagOpen && isHomePage) && (\r\n                                <FolderShared className={classes.iconFix} />\r\n                            )}\r\n                        </ListItemIcon>\r\n                        <ListItemText primary={t(\"navbar.myFiles\")} />\r\n                    </ListItem>\r\n                    <Divider />\r\n                </ExpansionPanelSummary>\r\n\r\n                <ExpansionPanelDetails>\r\n                    <List onMouseLeave={() => setTagHover(null)}>\r\n                        <ListItem\r\n                            button\r\n                            id=\"pickfiles\"\r\n                            className={classes.hiddenButton}\r\n                        >\r\n                            <ListItemIcon>\r\n                                <UploadIcon />\r\n                            </ListItemIcon>\r\n                            <ListItemText />\r\n                        </ListItem>\r\n                        <ListItem\r\n                            button\r\n                            id=\"pickfolder\"\r\n                            className={classes.hiddenButton}\r\n                        >\r\n                            <ListItemIcon>\r\n                                <UploadIcon />\r\n                            </ListItemIcon>\r\n                            <ListItemText />\r\n                        </ListItem>\r\n                        {[\r\n                            {\r\n                                key: t(\"navbar.videos\"),\r\n                                id: \"video\",\r\n                                icon: (\r\n                                    <VideoIcon\r\n                                        className={[\r\n                                            classes.iconFix,\r\n                                            classes.iconVideo,\r\n                                        ]}\r\n                                    />\r\n                                ),\r\n                            },\r\n                            {\r\n                                key: t(\"navbar.photos\"),\r\n                                id: \"image\",\r\n                                icon: (\r\n                                    <ImageIcon\r\n                                        className={[\r\n                                            classes.iconFix,\r\n                                            classes.iconImg,\r\n                                        ]}\r\n                                    />\r\n                                ),\r\n                            },\r\n                            {\r\n                                key: t(\"navbar.music\"),\r\n                                id: \"audio\",\r\n                                icon: (\r\n                                    <MusicIcon\r\n                                        className={[\r\n                                            classes.iconFix,\r\n                                            classes.iconAudio,\r\n                                        ]}\r\n                                    />\r\n                                ),\r\n                            },\r\n                            {\r\n                                key: t(\"navbar.documents\"),\r\n                                id: \"doc\",\r\n                                icon: (\r\n                                    <DocIcon\r\n                                        className={[\r\n                                            classes.iconFix,\r\n                                            classes.iconDoc,\r\n                                        ]}\r\n                                    />\r\n                                ),\r\n                            },\r\n                        ].map((v) => (\r\n                            <ListItem\r\n                                button\r\n                                key={v.key}\r\n                                onClick={() =>\r\n                                    SearchMyFile(v.id + \"/internal\", \"\")\r\n                                }\r\n                            >\r\n                                <ListItemIcon className={classes.subMenu}>\r\n                                    {v.icon}\r\n                                </ListItemIcon>\r\n                                <ListItemText primary={v.key} />\r\n                            </ListItem>\r\n                        ))}\r\n                        {tags.map((v) => (\r\n                            <ListItem\r\n                                button\r\n                                key={v.id}\r\n                                onMouseEnter={() => setTagHover(v.id)}\r\n                                onClick={() => {\r\n                                    if (v.type === 0) {\r\n                                        SearchMyFile(\"tag/\" + v.id, \"\");\r\n                                    } else {\r\n                                        NavigateTo(v.expression);\r\n                                    }\r\n                                }}\r\n                            >\r\n                                <ListItemIcon className={classes.subMenu}>\r\n                                    {getIcon(\r\n                                        v.type === 0\r\n                                            ? v.icon\r\n                                            : \"FolderHeartOutline\",\r\n                                        v.type === 0 ? v.color : null\r\n                                    )}\r\n                                </ListItemIcon>\r\n                                <ListItemText\r\n                                    className={classes.overFlow}\r\n                                    primary={v.name}\r\n                                />\r\n\r\n                                {tagHover === v.id && (\r\n                                    <ListItemSecondaryAction\r\n                                        onClick={() => submitDelete(v.id)}\r\n                                    >\r\n                                        <IconButton\r\n                                            size={\"small\"}\r\n                                            edge=\"end\"\r\n                                            aria-label=\"delete\"\r\n                                        >\r\n                                            <Clear />\r\n                                        </IconButton>\r\n                                    </ListItemSecondaryAction>\r\n                                )}\r\n                            </ListItem>\r\n                        ))}\r\n\r\n                        <ListItem button onClick={() => setAddTagModal(true)}>\r\n                            <ListItemIcon className={classes.subMenu}>\r\n                                <TagPlus className={classes.iconFix} />\r\n                            </ListItemIcon>\r\n                            <ListItemText primary={t(\"navbar.addATag\")} />\r\n                        </ListItem>\r\n                    </List>{\" \"}\r\n                    <Divider />\r\n                </ExpansionPanelDetails>\r\n            </ExpansionPanel>\r\n        </>\r\n    );\r\n}\r\n","/* eslint-disable */\r\nclass Crc32 {\r\n    constructor() {\r\n        this.crc = -1;\r\n    }\r\n\r\n    append(data) {\r\n        let crc = this.crc | 0;\r\n        const table = this.table;\r\n        for (let offset = 0, len = data.length | 0; offset < len; offset++) {\r\n            crc = (crc >>> 8) ^ table[(crc ^ data[offset]) & 0xff];\r\n        }\r\n        this.crc = crc;\r\n    }\r\n\r\n    get() {\r\n        return ~this.crc;\r\n    }\r\n}\r\nCrc32.prototype.table = (() => {\r\n    let i;\r\n    let j;\r\n    let t;\r\n    const table = [];\r\n    for (i = 0; i < 256; i++) {\r\n        t = i;\r\n        for (j = 0; j < 8; j++) {\r\n            t = t & 1 ? (t >>> 1) ^ 0xedb88320 : t >>> 1;\r\n        }\r\n        table[i] = t;\r\n    }\r\n    return table;\r\n})();\r\n\r\nconst getDataHelper = (byteLength) => {\r\n    const uint8 = new Uint8Array(byteLength);\r\n    return {\r\n        array: uint8,\r\n        view: new DataView(uint8.buffer),\r\n    };\r\n};\r\n\r\nconst pump = (zipObj) =>\r\n    zipObj.reader.read().then((chunk) => {\r\n        if (chunk.done) return zipObj.writeFooter();\r\n        const outputData = chunk.value;\r\n        zipObj.crc.append(outputData);\r\n        zipObj.uncompressedLength += outputData.length;\r\n        zipObj.compressedLength += outputData.length;\r\n        zipObj.ctrl.enqueue(outputData);\r\n    });\r\n\r\n/**\r\n * [createWriter description]\r\n * @param  {Object} underlyingSource [description]\r\n * @return {Boolean}                  [description]\r\n */\r\nfunction createWriter(underlyingSource) {\r\n    const files = Object.create(null);\r\n    const filenames = [];\r\n    const encoder = new TextEncoder();\r\n    let offset = 0;\r\n    let activeZipIndex = 0;\r\n    let ctrl;\r\n    let activeZipObject, closed;\r\n\r\n    function next() {\r\n        activeZipIndex++;\r\n        activeZipObject = files[filenames[activeZipIndex]];\r\n        if (activeZipObject) processNextChunk();\r\n        else if (closed) closeZip();\r\n    }\r\n\r\n    const zipWriter = {\r\n        enqueue(fileLike) {\r\n            if (closed)\r\n                throw new TypeError(\r\n                    \"Cannot enqueue a chunk into a readable stream that is closed or has been requested to be closed\"\r\n                );\r\n\r\n            let name = fileLike.name.trim();\r\n            const date = new Date(\r\n                typeof fileLike.lastModified === \"undefined\"\r\n                    ? Date.now()\r\n                    : fileLike.lastModified\r\n            );\r\n\r\n            if (fileLike.directory && !name.endsWith(\"/\")) name += \"/\";\r\n            if (files[name]) throw new Error(\"File already exists.\");\r\n\r\n            const nameBuf = encoder.encode(name);\r\n            filenames.push(name);\r\n\r\n            const zipObject = (files[name] = {\r\n                level: 0,\r\n                ctrl,\r\n                directory: !!fileLike.directory,\r\n                nameBuf,\r\n                comment: encoder.encode(fileLike.comment || \"\"),\r\n                compressedLength: 0,\r\n                uncompressedLength: 0,\r\n                writeHeader() {\r\n                    const header = getDataHelper(26);\r\n                    const data = getDataHelper(30 + nameBuf.length);\r\n\r\n                    zipObject.offset = offset;\r\n                    zipObject.header = header;\r\n                    if (zipObject.level !== 0 && !zipObject.directory) {\r\n                        header.view.setUint16(4, 0x0800);\r\n                    }\r\n                    header.view.setUint32(0, 0x14000808);\r\n                    header.view.setUint16(\r\n                        6,\r\n                        (((date.getHours() << 6) | date.getMinutes()) << 5) |\r\n                            (date.getSeconds() / 2),\r\n                        true\r\n                    );\r\n                    header.view.setUint16(\r\n                        8,\r\n                        ((((date.getFullYear() - 1980) << 4) |\r\n                            (date.getMonth() + 1)) <<\r\n                            5) |\r\n                            date.getDate(),\r\n                        true\r\n                    );\r\n                    header.view.setUint16(22, nameBuf.length, true);\r\n                    data.view.setUint32(0, 0x504b0304);\r\n                    data.array.set(header.array, 4);\r\n                    data.array.set(nameBuf, 30);\r\n                    offset += data.array.length;\r\n                    ctrl.enqueue(data.array);\r\n                },\r\n                writeFooter() {\r\n                    const footer = getDataHelper(16);\r\n                    footer.view.setUint32(0, 0x504b0708);\r\n\r\n                    if (zipObject.crc) {\r\n                        zipObject.header.view.setUint32(\r\n                            10,\r\n                            zipObject.crc.get(),\r\n                            true\r\n                        );\r\n                        zipObject.header.view.setUint32(\r\n                            14,\r\n                            zipObject.compressedLength,\r\n                            true\r\n                        );\r\n                        zipObject.header.view.setUint32(\r\n                            18,\r\n                            zipObject.uncompressedLength,\r\n                            true\r\n                        );\r\n                        footer.view.setUint32(4, zipObject.crc.get(), true);\r\n                        footer.view.setUint32(\r\n                            8,\r\n                            zipObject.compressedLength,\r\n                            true\r\n                        );\r\n                        footer.view.setUint32(\r\n                            12,\r\n                            zipObject.uncompressedLength,\r\n                            true\r\n                        );\r\n                    }\r\n\r\n                    ctrl.enqueue(footer.array);\r\n                    offset += zipObject.compressedLength + 16;\r\n                    next();\r\n                },\r\n                fileLike,\r\n            });\r\n\r\n            if (!activeZipObject) {\r\n                activeZipObject = zipObject;\r\n                processNextChunk();\r\n            }\r\n        },\r\n        close() {\r\n            if (closed)\r\n                throw new TypeError(\r\n                    \"Cannot close a readable stream that has already been requested to be closed\"\r\n                );\r\n            if (!activeZipObject) closeZip();\r\n            closed = true;\r\n        },\r\n    };\r\n\r\n    function closeZip() {\r\n        let length = 0;\r\n        let index = 0;\r\n        let indexFilename, file;\r\n        for (\r\n            indexFilename = 0;\r\n            indexFilename < filenames.length;\r\n            indexFilename++\r\n        ) {\r\n            file = files[filenames[indexFilename]];\r\n            length += 46 + file.nameBuf.length + file.comment.length;\r\n        }\r\n        const data = getDataHelper(length + 22);\r\n        for (\r\n            indexFilename = 0;\r\n            indexFilename < filenames.length;\r\n            indexFilename++\r\n        ) {\r\n            file = files[filenames[indexFilename]];\r\n            data.view.setUint32(index, 0x504b0102);\r\n            data.view.setUint16(index + 4, 0x1400);\r\n            data.array.set(file.header.array, index + 6);\r\n            data.view.setUint16(index + 32, file.comment.length, true);\r\n            if (file.directory) {\r\n                data.view.setUint8(index + 38, 0x10);\r\n            }\r\n            data.view.setUint32(index + 42, file.offset, true);\r\n            data.array.set(file.nameBuf, index + 46);\r\n            data.array.set(file.comment, index + 46 + file.nameBuf.length);\r\n            index += 46 + file.nameBuf.length + file.comment.length;\r\n        }\r\n        data.view.setUint32(index, 0x504b0506);\r\n        data.view.setUint16(index + 8, filenames.length, true);\r\n        data.view.setUint16(index + 10, filenames.length, true);\r\n        data.view.setUint32(index + 12, length, true);\r\n        data.view.setUint32(index + 16, offset, true);\r\n        ctrl.enqueue(data.array);\r\n        ctrl.close();\r\n    }\r\n\r\n    function processNextChunk() {\r\n        if (!activeZipObject) return;\r\n        if (activeZipObject.directory)\r\n            return activeZipObject.writeFooter(activeZipObject.writeHeader());\r\n        if (activeZipObject.reader) return pump(activeZipObject);\r\n        if (activeZipObject.fileLike.stream) {\r\n            activeZipObject.crc = new Crc32();\r\n            activeZipObject.reader = activeZipObject.fileLike\r\n                .stream()\r\n                .getReader();\r\n            activeZipObject.writeHeader();\r\n        } else next();\r\n    }\r\n    return new ReadableStream({\r\n        start: (c) => {\r\n            ctrl = c;\r\n            underlyingSource.start &&\r\n                Promise.resolve(underlyingSource.start(zipWriter));\r\n        },\r\n        pull() {\r\n            return (\r\n                processNextChunk() ||\r\n                (underlyingSource.pull &&\r\n                    Promise.resolve(underlyingSource.pull(zipWriter)))\r\n            );\r\n        },\r\n    });\r\n}\r\n\r\nwindow.ZIP = createWriter;\r\n","import { CloudreveFile } from \"../types\";\r\nimport { list } from \"../services/navigate\";\r\nimport { pathJoin } from \"../component/Uploader/core/utils\";\r\n\r\nexport function getPreviewPath(selected: any): string {\r\n    return encodeURIComponent(\r\n        selected.path === \"/\"\r\n            ? selected.path + selected.name\r\n            : selected.path + \"/\" + selected.name\r\n    );\r\n}\r\n\r\nexport async function walk(\r\n    file: CloudreveFile[],\r\n    share: any\r\n): Promise<CloudreveFile[]> {\r\n    let res: CloudreveFile[] = [];\r\n    for (const f of file) {\r\n        if (f.type === \"file\") {\r\n            res.push(f);\r\n            continue;\r\n        }\r\n\r\n        if (f.type === \"dir\") {\r\n            const response = await list(\r\n                pathJoin([f.path, f.name]),\r\n                share,\r\n                \"\",\r\n                \"\"\r\n            );\r\n            const subs = await walk(response.data.objects, share);\r\n            res = [...res, ...subs];\r\n        }\r\n    }\r\n\r\n    return res;\r\n}\r\n","// get the paths of files (no directories) in the directory\r\n// parent: \"\" or \"/\"\r\nexport const getFileSystemDirectoryPaths = async (\r\n    handle: FileSystemDirectoryHandle,\r\n    parent = \"\"\r\n): Promise<string[]> => {\r\n    const paths: Array<string> = [];\r\n\r\n    for await (const [path, fileSystemHandle] of handle.entries()) {\r\n        if (fileSystemHandle instanceof window.FileSystemFileHandle) {\r\n            paths.push(`${parent}${path}`);\r\n        } else {\r\n            paths.push(\r\n                ...(await getFileSystemDirectoryPaths(\r\n                    fileSystemHandle,\r\n                    `${parent}${path}/`\r\n                ))\r\n            );\r\n        }\r\n    }\r\n\r\n    return paths;\r\n};\r\n\r\n// create the dst directory if it doesn't exist\r\n// return the dst directory handle\r\n// paths: \"/dir1/dir2\" => [\"dir1\",\"dir2\"]\r\nexport const createFileSystemDirectory = async (\r\n    handle: FileSystemDirectoryHandle,\r\n    paths: string[]\r\n) => {\r\n    let cur = handle;\r\n    while (paths.length > 0) {\r\n        const path = paths.shift();\r\n        if (!path) {\r\n            break;\r\n        }\r\n        cur = await cur.getDirectoryHandle(path, { create: true });\r\n    }\r\n    return cur;\r\n};\r\n\r\n// save file into the dst directory\r\n// create the dst file if it doesn't exist by default\r\n// path: a/b/c.jpg\r\nexport const saveFileToFileSystemDirectory = async (\r\n    handle: FileSystemDirectoryHandle,\r\n    stream: FileSystemWriteChunkType,\r\n    path: string,\r\n    create = true\r\n) => {\r\n    const paths = path.split(\"/\");\r\n    const fileName = paths.pop();\r\n    if (!fileName) return;\r\n\r\n    const dir = await createFileSystemDirectory(handle, paths);\r\n    const file = await dir.getFileHandle(fileName, { create });\r\n    const writable = await file.createWritable();\r\n    await writable.write(stream);\r\n    await writable.close();\r\n};\r\n\r\n// verify or request the permission of the readwrite permission\r\nexport async function verifyFileSystemRWPermission(\r\n    fileHandle: FileSystemDirectoryHandle\r\n) {\r\n    const opts = { mode: \"readwrite\" as FileSystemPermissionMode };\r\n\r\n    // Check if we already have permission, if so, return true.\r\n    if ((await fileHandle.queryPermission(opts)) === \"granted\") {\r\n        return true;\r\n    }\r\n\r\n    // Request permission to the file, if the user grants permission, return true.\r\n    if ((await fileHandle.requestPermission(opts)) === \"granted\") {\r\n        return true;\r\n    }\r\n\r\n    // The user did not grant permission, return false.\r\n    return false;\r\n}\r\n","import { AnyAction } from \"redux\";\r\nimport { ThunkAction } from \"redux-thunk\";\r\nimport { CloudreveFile, SortMethod } from \"./../../types/index\";\r\nimport { closeContextMenu, setPagination } from \"../viewUpdate/action\";\r\nimport { Policy } from \"../../component/Uploader/core/types\";\r\nimport streamSaver from \"streamsaver\";\r\nimport \"../../utils/zip\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport { filePath, isMac } from \"../../utils\";\r\nimport API, { getBaseURL } from \"../../middleware/Api\";\r\nimport { pathJoin, trimPrefix } from \"../../component/Uploader/core/utils\";\r\nimport { getPreviewPath, walk } from \"../../utils/api\";\r\nimport { askForOption } from \"./async\";\r\nimport Auth from \"../../middleware/Auth\";\r\nimport { encodingRequired, isPreviewable } from \"../../config\";\r\nimport { push } from \"connected-react-router\";\r\nimport {\r\n    changeContextMenu,\r\n    closeAllModals,\r\n    openDirectoryDownloadDialog,\r\n    openGetSourceDialog,\r\n    openLoadingDialog,\r\n    showAudioPreview,\r\n    showImgPreivew,\r\n    toggleSnackbar,\r\n} from \"./index\";\r\nimport { getDownloadURL } from \"../../services/file\";\r\nimport i18next from \"../../i18n\";\r\nimport {\r\n    getFileSystemDirectoryPaths,\r\n    saveFileToFileSystemDirectory,\r\n    verifyFileSystemRWPermission,\r\n} from \"../../utils/filesystem\";\r\n\r\nexport interface ActionSetFileList extends AnyAction {\r\n    type: \"SET_FILE_LIST\";\r\n    list: CloudreveFile[];\r\n}\r\nexport const setFileList = (list: CloudreveFile[]): ActionSetFileList => {\r\n    return {\r\n        type: \"SET_FILE_LIST\",\r\n        list,\r\n    };\r\n};\r\n\r\nexport interface ActionSetDirList extends AnyAction {\r\n    type: \"SET_DIR_LIST\";\r\n    list: CloudreveFile[];\r\n}\r\nexport const setDirList = (list: CloudreveFile[]): ActionSetDirList => {\r\n    return {\r\n        type: \"SET_DIR_LIST\",\r\n        list,\r\n    };\r\n};\r\n\r\nexport interface ActionSetSortMethod extends AnyAction {\r\n    type: \"SET_SORT_METHOD\";\r\n    method: SortMethod;\r\n}\r\nexport const setSortMethod = (method: SortMethod): ActionSetSortMethod => {\r\n    return {\r\n        type: \"SET_SORT_METHOD\",\r\n        method,\r\n    };\r\n};\r\n\r\nexport const setSideBar = (open: boolean) => {\r\n    return {\r\n        type: \"SET_SIDE_BAR\",\r\n        open,\r\n    };\r\n};\r\n\r\nexport const setCurrentPolicy = (policy: Policy) => {\r\n    return {\r\n        type: \"SET_CURRENT_POLICY\",\r\n        policy,\r\n    };\r\n};\r\n\r\nexport const removeSelectedTargets = (fileIds: any) => {\r\n    return {\r\n        type: \"RMOVE_SELECTED_TARGETS\",\r\n        fileIds,\r\n    };\r\n};\r\nexport const addSelectedTargets = (targets: any) => {\r\n    return {\r\n        type: \"ADD_SELECTED_TARGETS\",\r\n        targets,\r\n    };\r\n};\r\nexport const setSelectedTarget = (targets: any) => {\r\n    return {\r\n        type: \"SET_SELECTED_TARGET\",\r\n        targets,\r\n    };\r\n};\r\nexport const setLastSelect = (file: any, index: any) => {\r\n    return {\r\n        type: \"SET_LAST_SELECT\",\r\n        file,\r\n        index,\r\n    };\r\n};\r\nexport const setShiftSelectedIds = (shiftSelectedIds: any) => {\r\n    return {\r\n        type: \"SET_SHIFT_SELECTED_IDS\",\r\n        shiftSelectedIds,\r\n    };\r\n};\r\n\r\ntype SortFunc = (a: CloudreveFile, b: CloudreveFile) => number;\r\nexport const sortMethodFuncs: Record<SortMethod, SortFunc> = {\r\n    sizePos: (a: CloudreveFile, b: CloudreveFile) => {\r\n        return a.size - b.size;\r\n    },\r\n    sizeRes: (a: CloudreveFile, b: CloudreveFile) => {\r\n        return b.size - a.size;\r\n    },\r\n    namePos: (a: CloudreveFile, b: CloudreveFile) => {\r\n        return a.name.localeCompare(\r\n            b.name,\r\n            navigator.languages[0] || navigator.language,\r\n            { numeric: true, ignorePunctuation: true }\r\n        );\r\n    },\r\n    nameRev: (a: CloudreveFile, b: CloudreveFile) => {\r\n        return b.name.localeCompare(\r\n            a.name,\r\n            navigator.languages[0] || navigator.language,\r\n            { numeric: true, ignorePunctuation: true }\r\n        );\r\n    },\r\n    timePos: (a: CloudreveFile, b: CloudreveFile) => {\r\n        return Date.parse(a.create_date) - Date.parse(b.create_date);\r\n    },\r\n    timeRev: (a: CloudreveFile, b: CloudreveFile) => {\r\n        return Date.parse(b.create_date) - Date.parse(a.create_date);\r\n    },\r\n    modifyTimePos: (a: CloudreveFile, b: CloudreveFile) => {\r\n        return Date.parse(a.date) - Date.parse(b.date);\r\n    },\r\n    modifyTimeRev: (a: CloudreveFile, b: CloudreveFile) => {\r\n        return Date.parse(b.date) - Date.parse(a.date);\r\n    },\r\n};\r\n\r\nexport const selectAll = (): ThunkAction<any, any, any, any> => {\r\n    return (dispatch, getState): void => {\r\n        const state = getState();\r\n        const { selected, fileList, dirList } = state.explorer;\r\n        if (selected.length >= dirList.length + fileList.length) {\r\n            dispatch(setSelectedTarget([]));\r\n        } else {\r\n            dispatch(setSelectedTarget([...dirList, ...fileList]));\r\n        }\r\n    };\r\n};\r\n\r\nexport const updateFileList = (\r\n    list: CloudreveFile[]\r\n): ThunkAction<any, any, any, any> => {\r\n    return (dispatch, getState): void => {\r\n        const state = getState();\r\n        // TODO: define state type\r\n        const { sortMethod, pagination } = state.viewUpdate;\r\n        const dirList = list.filter((x) => {\r\n            return x.type === \"dir\";\r\n        });\r\n        const fileList = list.filter((x) => {\r\n            return x.type === \"file\";\r\n        });\r\n        const sortFunc = sortMethodFuncs[sortMethod as SortMethod];\r\n        dispatch(setDirList(dirList.sort(sortFunc)));\r\n        dispatch(setFileList(fileList.sort(sortFunc)));\r\n        const total = dirList.length + fileList.length;\r\n        if (pagination.page * pagination.size > total) {\r\n            dispatch(\r\n                setPagination({\r\n                    ...pagination,\r\n                    page: Math.max(Math.ceil(total / pagination.size), 1),\r\n                })\r\n            );\r\n        }\r\n    };\r\n};\r\n\r\nexport const changeSortMethod = (\r\n    method: SortMethod\r\n): ThunkAction<any, any, any, any> => {\r\n    return (dispatch, getState): void => {\r\n        const state = getState();\r\n        const { fileList, dirList } = state.explorer;\r\n        const sortFunc = sortMethodFuncs[method];\r\n        Auth.SetPreference(\"sort\", method);\r\n        dispatch(setSortMethod(method));\r\n        dispatch(setDirList(dirList.slice().sort(sortFunc)));\r\n        dispatch(setFileList(fileList.slice().sort(sortFunc)));\r\n    };\r\n};\r\n\r\nexport const toggleObjectInfoSidebar = (\r\n    open: boolean\r\n): ThunkAction<any, any, any, any> => {\r\n    return (dispatch, getState): void => {\r\n        const state = getState();\r\n        if (open) {\r\n            dispatch(closeContextMenu());\r\n        }\r\n        dispatch(setSideBar(true));\r\n    };\r\n};\r\n\r\nexport const serverSideBatchDownload = (\r\n    share: any\r\n): ThunkAction<any, any, any, any> => {\r\n    return (dispatch, getState): void => {\r\n        dispatch(\r\n            openLoadingDialog(i18next.t(\"fileManager.preparingBathDownload\"))\r\n        );\r\n        const {\r\n            explorer: { selected },\r\n            router: {\r\n                location: { pathname },\r\n            },\r\n        } = getState();\r\n        const dirs: any[] = [],\r\n            items: any[] = [];\r\n        selected.map((value) => {\r\n            if (value.type === \"dir\") {\r\n                dirs.push(value.id);\r\n            } else {\r\n                items.push(value.id);\r\n            }\r\n            return null;\r\n        });\r\n\r\n        let reqURL = \"/file/archive\";\r\n        const postBody = {\r\n            items: items,\r\n            dirs: dirs,\r\n        };\r\n        if (pathHelper.isSharePage(pathname)) {\r\n            reqURL = \"/share/archive/\" + share.key;\r\n            postBody[\"path\"] = selected[0].path;\r\n        }\r\n\r\n        API.post(reqURL, postBody)\r\n            .then((response: any) => {\r\n                if (response.rawData.code === 0) {\r\n                    dispatch(closeAllModals());\r\n                    window.location.assign(response.data);\r\n                } else {\r\n                    dispatch(\r\n                        toggleSnackbar(\r\n                            \"top\",\r\n                            \"right\",\r\n                            response.rawData.msg,\r\n                            \"warning\"\r\n                        )\r\n                    );\r\n                }\r\n                dispatch(closeAllModals());\r\n            })\r\n            .catch((error) => {\r\n                dispatch(\r\n                    toggleSnackbar(\"top\", \"right\", error.message, \"error\")\r\n                );\r\n                dispatch(closeAllModals());\r\n            });\r\n    };\r\n};\r\n\r\nexport const startDownload = (\r\n    share: any,\r\n    file: CloudreveFile\r\n): ThunkAction<any, any, any, any> => {\r\n    return async (dispatch, getState): Promise<void> => {\r\n        const {\r\n            router: {\r\n                location: { pathname },\r\n            },\r\n        } = getState();\r\n        const user = Auth.GetUser();\r\n        if (\r\n            pathHelper.isSharePage(pathname) &&\r\n            !Auth.Check() &&\r\n            user &&\r\n            !user.group.shareDownload\r\n        ) {\r\n            dispatch(\r\n                toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    i18next.t(\"share.pleaseLogin\"),\r\n                    \"warning\"\r\n                )\r\n            );\r\n            return;\r\n        }\r\n\r\n        dispatch(changeContextMenu(\"file\", false));\r\n        dispatch(openLoadingDialog(i18next.t(\"fileManager.preparingDownload\")));\r\n        try {\r\n            const res = await getDownloadURL(file ? file : share);\r\n            window.location.assign(res.data);\r\n            dispatch(closeAllModals());\r\n        } catch (e) {\r\n            dispatch(toggleSnackbar(\"top\", \"right\", e.message, \"warning\"));\r\n            dispatch(closeAllModals());\r\n        }\r\n    };\r\n};\r\n\r\nexport const startBatchDownload = (\r\n    share: any\r\n): ThunkAction<any, any, any, any> => {\r\n    return async (dispatch, getState): Promise<void> => {\r\n        dispatch(changeContextMenu(\"file\", false));\r\n        const {\r\n            explorer: { selected },\r\n        } = getState();\r\n\r\n        const user = Auth.GetUser();\r\n        if (user.group.allowArchiveDownload) {\r\n            let option: any;\r\n            try {\r\n                option = await dispatch(\r\n                    askForOption(\r\n                        [\r\n                            {\r\n                                key: \"client\",\r\n                                name: i18next.t(\r\n                                    \"fileManager.browserBatchDownload\"\r\n                                ),\r\n                                description: i18next.t(\r\n                                    \"fileManager.browserBatchDownloadDescription\"\r\n                                ),\r\n                            },\r\n                            {\r\n                                key: \"server\",\r\n                                name: i18next.t(\r\n                                    \"fileManager.serverBatchDownload\"\r\n                                ),\r\n                                description: i18next.t(\r\n                                    \"fileManager.serverBatchDownloadDescription\"\r\n                                ),\r\n                            },\r\n                        ],\r\n                        i18next.t(\"fileManager.selectArchiveMethod\")\r\n                    )\r\n                );\r\n            } catch (e) {\r\n                return;\r\n            }\r\n\r\n            if (option.key === \"server\") {\r\n                dispatch(serverSideBatchDownload(share));\r\n                return;\r\n            }\r\n        }\r\n\r\n        dispatch(openLoadingDialog(i18next.t(\"modals.listingFiles\")));\r\n\r\n        let queue: CloudreveFile[] = [];\r\n        try {\r\n            queue = await walk(selected, share);\r\n        } catch (e) {\r\n            dispatch(\r\n                toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    i18next.t(\"modals.listingFileError\", {\r\n                        message: e.message,\r\n                    }),\r\n                    \"warning\"\r\n                )\r\n            );\r\n            dispatch(closeAllModals());\r\n            return;\r\n        }\r\n\r\n        dispatch(closeAllModals());\r\n        dispatch(\r\n            toggleSnackbar(\r\n                \"top\",\r\n                \"center\",\r\n                i18next.t(\"fileManager.batchDownloadStarted\"),\r\n                \"info\"\r\n            )\r\n        );\r\n        const fileStream = streamSaver.createWriteStream(\"archive.zip\");\r\n        let failed = 0;\r\n        const readableZipStream = new (window as any).ZIP({\r\n            start(ctrl: any) {\r\n                // ctrl.close()\r\n            },\r\n            async pull(ctrl: any) {\r\n                while (queue.length > 0) {\r\n                    const next = queue.pop();\r\n                    if (next && next.type === \"file\") {\r\n                        const previewPath = getPreviewPath(next);\r\n                        const url =\r\n                            getBaseURL() +\r\n                            (pathHelper.isSharePage(location.pathname)\r\n                                ? \"/share/preview/\" +\r\n                                  share.key +\r\n                                  (previewPath !== \"\"\r\n                                      ? \"?path=\" + previewPath\r\n                                      : \"\")\r\n                                : \"/file/preview/\" + next.id);\r\n                        try {\r\n                            const res = await fetch(url, { cache: \"no-cache\" });\r\n                            const stream = () => res.body;\r\n                            const name = trimPrefix(\r\n                                pathJoin([next.path, next.name]),\r\n                                \"/\"\r\n                            );\r\n                            ctrl.enqueue({ name, stream });\r\n                            return;\r\n                        } catch (e) {\r\n                            failed++;\r\n                        }\r\n                    }\r\n                }\r\n                ctrl.close();\r\n            },\r\n        });\r\n\r\n        // more optimized\r\n        if (window.WritableStream && readableZipStream.pipeTo) {\r\n            return readableZipStream\r\n                .pipeTo(fileStream)\r\n                .then(() => dispatch(closeAllModals()))\r\n                .catch((e) => {\r\n                    console.log(e);\r\n                    toggleSnackbar(\r\n                        \"top\",\r\n                        \"right\",\r\n                        i18next.t(\"modals.batchDownloadError\", {\r\n                            message: e && e.message,\r\n                        }),\r\n                        \"warning\"\r\n                    );\r\n                    dispatch(closeAllModals());\r\n                });\r\n        }\r\n    };\r\n};\r\n\r\nlet directoryDownloadAbortController: AbortController;\r\nexport const cancelDirectoryDownload = () =>\r\n    directoryDownloadAbortController.abort();\r\n\r\nexport const startDirectoryDownload = (\r\n    share: any\r\n): ThunkAction<any, any, any, any> => {\r\n    return async (dispatch, getState): Promise<void> => {\r\n        dispatch(changeContextMenu(\"file\", false));\r\n\r\n        directoryDownloadAbortController = new AbortController();\r\n        if (!window.showDirectoryPicker || !window.isSecureContext) {\r\n            return;\r\n        }\r\n        let handle: FileSystemDirectoryHandle;\r\n        // we should show directory picker at first\r\n        // https://web.dev/file-system-access/#:~:text=handle%3B%0A%7D-,Gotchas,-Sometimes%20processing%20the\r\n        try {\r\n            // can't use suggestedName for showDirectoryPicker (only available showSaveFilePicker)\r\n            handle = await window.showDirectoryPicker({\r\n                startIn: \"downloads\",\r\n                mode: \"readwrite\",\r\n            });\r\n            // we should obtain the readwrite permission for the directory at first\r\n            if (!(await verifyFileSystemRWPermission(handle))) {\r\n                throw new Error(\r\n                    i18next.t(\"fileManager.directoryDownloadPermissionError\")\r\n                );\r\n            }\r\n            dispatch(closeAllModals());\r\n        } catch (e) {\r\n            dispatch(\r\n                toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    i18next.t(\"modals.directoryDownloadError\", {\r\n                        msg: e && e.message,\r\n                    }),\r\n                    \"error\"\r\n                )\r\n            );\r\n            dispatch(closeAllModals());\r\n            return;\r\n        }\r\n\r\n        const {\r\n            explorer: { selected },\r\n            navigator: { path },\r\n        } = getState();\r\n\r\n        // list files to download\r\n        dispatch(openLoadingDialog(i18next.t(\"modals.listingFiles\")));\r\n\r\n        let queue: CloudreveFile[] = [];\r\n        try {\r\n            queue = await walk(selected, share);\r\n        } catch (e) {\r\n            dispatch(\r\n                toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    i18next.t(\"modals.listingFileError\", {\r\n                        message: e.message,\r\n                    }),\r\n                    \"warning\"\r\n                )\r\n            );\r\n            dispatch(closeAllModals());\r\n            return;\r\n        }\r\n\r\n        dispatch(closeAllModals());\r\n\r\n        let failed = 0;\r\n        let option: any;\r\n        // preparation for downloading\r\n        // get the files in the directory to compare with queue files\r\n        // parent: \"\"\r\n        const fsPaths = await getFileSystemDirectoryPaths(handle, \"\");\r\n\r\n        // path: / or /abc (no sep suffix)\r\n        // file.path: /abc/d (no sep suffix)\r\n        // fsPaths: [\"abc/d/e.bin\",]\r\n        const duplicates = queue\r\n            .map((file) =>\r\n                trimPrefix(\r\n                    `${file.path}/${file.name}`,\r\n                    path === \"/\" ? \"/\" : path + \"/\"\r\n                )\r\n            )\r\n            .filter((path) => fsPaths.includes(path));\r\n\r\n        // we should ask users for the duplication handle method\r\n        if (duplicates.length > 0) {\r\n            try {\r\n                option = await dispatch(\r\n                    askForOption(\r\n                        [\r\n                            {\r\n                                key: \"replace\",\r\n                                name: i18next.t(\r\n                                    \"fileManager.directoryDownloadReplace\"\r\n                                ),\r\n                                description: i18next.t(\r\n                                    \"fileManager.directoryDownloadReplaceDescription\",\r\n                                    {\r\n                                        // display the first three duplications\r\n                                        duplicates: duplicates\r\n                                            .slice(\r\n                                                0,\r\n                                                duplicates.length >= 3\r\n                                                    ? 3\r\n                                                    : duplicates.length\r\n                                            )\r\n                                            .join(\", \"),\r\n                                        num: duplicates.length,\r\n                                    }\r\n                                ),\r\n                            },\r\n                            {\r\n                                key: \"skip\",\r\n                                name: i18next.t(\r\n                                    \"fileManager.directoryDownloadSkip\"\r\n                                ),\r\n                                description: i18next.t(\r\n                                    \"fileManager.directoryDownloadSkipDescription\",\r\n                                    {\r\n                                        duplicates: duplicates\r\n                                            .slice(\r\n                                                0,\r\n                                                duplicates.length >= 3\r\n                                                    ? 3\r\n                                                    : duplicates.length\r\n                                            )\r\n                                            .join(\", \"),\r\n                                        num: duplicates.length,\r\n                                    }\r\n                                ),\r\n                            },\r\n                        ],\r\n                        i18next.t(\r\n                            \"fileManager.selectDirectoryDuplicationMethod\"\r\n                        )\r\n                    )\r\n                );\r\n            } catch (e) {\r\n                return;\r\n            }\r\n        }\r\n        dispatch(closeAllModals());\r\n\r\n        // start the download\r\n        dispatch(\r\n            toggleSnackbar(\r\n                \"top\",\r\n                \"center\",\r\n                i18next.t(\"fileManager.directoryDownloadStarted\"),\r\n                \"info\"\r\n            )\r\n        );\r\n\r\n        const updateLog = (log, done) => {\r\n            dispatch(openDirectoryDownloadDialog(true, log, done));\r\n        };\r\n        let log = \"\";\r\n\r\n        while (queue.length > 0) {\r\n            const next = queue.pop();\r\n            if (next && next.type === \"file\") {\r\n                // donload url\r\n                const previewPath = getPreviewPath(next);\r\n                const url =\r\n                    getBaseURL() +\r\n                    (pathHelper.isSharePage(location.pathname)\r\n                        ? \"/share/preview/\" +\r\n                          share.key +\r\n                          (previewPath !== \"\" ? \"?path=\" + previewPath : \"\")\r\n                        : \"/file/preview/\" + next.id);\r\n\r\n                // path to save this file\r\n                // path: / or /abc (no sep suffix)\r\n                // next.path: /abc/d (no sep suffix)\r\n                // name: d/e.bin\r\n                const name = trimPrefix(\r\n                    pathJoin([next.path, next.name]),\r\n                    path === \"/\" ? \"/\" : path + \"/\"\r\n                );\r\n                // TODO: improve the display of log\r\n                // can we turn the upload queue component to the transition queue?\r\n                // then we can easily cancel or retry the download\r\n                // and the batch download queue can show as well.\r\n                log =\r\n                    (log === \"\" ? \"\" : log + \"\\n\\n\") +\r\n                    i18next.t(\"modals.directoryDownloadStarted\", { name });\r\n                updateLog(log, false);\r\n                try {\r\n                    if (duplicates.includes(name)) {\r\n                        if (option.key === \"skip\") {\r\n                            log +=\r\n                                \"\\n\" +\r\n                                i18next.t(\r\n                                    \"modals.directoryDownloadSkipNotifiction\",\r\n                                    {\r\n                                        name,\r\n                                    }\r\n                                );\r\n                            updateLog(log, false);\r\n                            continue;\r\n                        } else {\r\n                            log +=\r\n                                \"\\n\" +\r\n                                i18next.t(\r\n                                    \"modals.directoryDownloadReplaceNotifiction\",\r\n                                    {\r\n                                        name,\r\n                                    }\r\n                                );\r\n                            updateLog(log, false);\r\n                        }\r\n                    }\r\n\r\n                    // TODO: need concurrent task queue?\r\n                    const res = await fetch(url, {\r\n                        cache: \"no-cache\",\r\n                        signal: directoryDownloadAbortController.signal,\r\n                    });\r\n                    await saveFileToFileSystemDirectory(\r\n                        handle,\r\n                        await res.blob(),\r\n                        name\r\n                    );\r\n                    log += \"\\n\" + i18next.t(\"modals.directoryDownloadFinished\");\r\n                    updateLog(log, false);\r\n                } catch (e) {\r\n                    if (e.name === \"AbortError\") {\r\n                        dispatch(\r\n                            toggleSnackbar(\r\n                                \"top\",\r\n                                \"right\",\r\n                                i18next.t(\"modals.directoryDownloadCancelled\"),\r\n                                \"warning\"\r\n                            )\r\n                        );\r\n                        log +=\r\n                            \"\\n\\n\" +\r\n                            i18next.t(\"modals.directoryDownloadCancelled\");\r\n                        updateLog(log, true);\r\n                        return;\r\n                    }\r\n\r\n                    failed++;\r\n                    dispatch(\r\n                        toggleSnackbar(\r\n                            \"top\",\r\n                            \"right\",\r\n                            i18next.t(\r\n                                \"modals.directoryDownloadErrorNotification\",\r\n                                {\r\n                                    name,\r\n                                    msg: e && e.message,\r\n                                }\r\n                            ),\r\n                            \"warning\"\r\n                        )\r\n                    );\r\n                    log +=\r\n                        \"\\n\" +\r\n                        i18next.t(\"modals.directoryDownloadError\", {\r\n                            msg: e.message,\r\n                        });\r\n                    updateLog(log, false);\r\n                }\r\n            }\r\n        }\r\n        log +=\r\n            \"\\n\" +\r\n            (failed === 0\r\n                ? i18next.t(\"fileManager.directoryDownloadFinished\")\r\n                : i18next.t(\"fileManager.directoryDownloadFinishedWithError\", {\r\n                      failed,\r\n                  }));\r\n        updateLog(log, true);\r\n\r\n        dispatch(\r\n            toggleSnackbar(\r\n                \"top\",\r\n                \"center\",\r\n                failed === 0\r\n                    ? i18next.t(\"fileManager.directoryDownloadFinished\")\r\n                    : i18next.t(\r\n                          \"fileManager.directoryDownloadFinishedWithError\",\r\n                          {\r\n                              failed,\r\n                          }\r\n                      ),\r\n                \"success\"\r\n            )\r\n        );\r\n    };\r\n};\r\n\r\nexport const getViewerURL = (\r\n    viewer: string,\r\n    file: any,\r\n    isShare: boolean | \"\"\r\n): string => {\r\n    const previewPath = getPreviewPath(file);\r\n    if (isShare) {\r\n        return (\r\n            \"/s/\" +\r\n            file.key +\r\n            `/${viewer}?name=` +\r\n            encodeURIComponent(file.name) +\r\n            \"&share_path=\" +\r\n            previewPath\r\n        );\r\n    }\r\n\r\n    return `/${viewer}?p=` + previewPath + \"&id=\" + file.id;\r\n};\r\n\r\nexport const openViewer = (\r\n    viewer: string,\r\n    file: any,\r\n    isShare: boolean | \"\"\r\n) => {\r\n    return (dispatch: any, getState: any) => {\r\n        dispatch(push(getViewerURL(viewer, file, isShare)));\r\n    };\r\n};\r\n\r\nexport const openPreview = (share: any) => {\r\n    return (dispatch: any, getState: any) => {\r\n        const {\r\n            explorer: { selected },\r\n            router: {\r\n                location: { pathname },\r\n            },\r\n        } = getState();\r\n        const isShare = pathHelper.isSharePage(pathname);\r\n        if (isShare) {\r\n            const user = Auth.GetUser();\r\n            if (!Auth.Check() && user && !user.group.shareDownload) {\r\n                dispatch(\r\n                    toggleSnackbar(\r\n                        \"top\",\r\n                        \"right\",\r\n                        i18next.t(\"share.pleaseLogin\"),\r\n                        \"warning\"\r\n                    )\r\n                );\r\n                dispatch(changeContextMenu(\"file\", false));\r\n                return;\r\n            }\r\n        }\r\n\r\n        dispatch(changeContextMenu(\"file\", false));\r\n        switch (isPreviewable(selected[0].name)) {\r\n            case \"img\":\r\n                dispatch(showImgPreivew(selected[0]));\r\n                return;\r\n            case \"msDoc\":\r\n                dispatch(openViewer(\"doc\", selected[0], isShare));\r\n                return;\r\n            case \"audio\":\r\n                dispatch(showAudioPreview(selected[0]));\r\n                return;\r\n            case \"video\":\r\n                dispatch(openViewer(\"video\", selected[0], isShare));\r\n                return;\r\n            case \"pdf\":\r\n                dispatch(openViewer(\"pdf\", selected[0], isShare));\r\n                return;\r\n            case \"edit\":\r\n                dispatch(openViewer(\"text\", selected[0], isShare));\r\n                return;\r\n            case \"code\":\r\n                dispatch(openViewer(\"code\", selected[0], isShare));\r\n                return;\r\n            case \"epub\":\r\n                dispatch(openViewer(\"epub\", selected[0], isShare));\r\n                return;\r\n            default:\r\n                dispatch(startDownload(share, selected[0]));\r\n                return;\r\n        }\r\n    };\r\n};\r\nexport const selectFile = (file: any, event: any, fileIndex: any) => {\r\n    const { ctrlKey, metaKey, shiftKey } = event;\r\n    return (dispatch: any, getState: any) => {\r\n        // 多种组合操作忽略\r\n        if (\r\n            [ctrlKey, shiftKey].filter(Boolean).length > 1 ||\r\n            [metaKey, shiftKey].filter(Boolean).length > 1\r\n        ) {\r\n            return;\r\n        }\r\n        const isMacbook = isMac();\r\n        const { explorer } = getState();\r\n        const { selected, lastSelect, dirList, fileList, shiftSelectedIds } =\r\n            explorer;\r\n        if (shiftKey && !ctrlKey && !metaKey && selected.length !== 0) {\r\n            // shift 多选\r\n            // 取消原有选择\r\n            dispatch(removeSelectedTargets(selected.map((v: any) => v.id)));\r\n            const all = [...dirList, ...fileList];\r\n            // 添加新选择\r\n            const begin = Math.min(lastSelect.index, fileIndex);\r\n            const end = Math.max(lastSelect.index, fileIndex);\r\n            const list = file.type === \"dir\" ? dirList : fileList;\r\n            const newShiftSelected = all.slice(begin, end + 1);\r\n            return dispatch(addSelectedTargets(newShiftSelected));\r\n        }\r\n        dispatch(setLastSelect(file, fileIndex));\r\n        dispatch(setShiftSelectedIds([]));\r\n        if ((ctrlKey && !isMacbook) || (metaKey && isMacbook)) {\r\n            // Ctrl/Command 单击添加/删除\r\n            const presentIndex = selected.findIndex((value: any) => {\r\n                return value.id === file.id;\r\n            });\r\n            if (presentIndex !== -1) {\r\n                return dispatch(removeSelectedTargets([file.id]));\r\n            }\r\n            return dispatch(addSelectedTargets([file]));\r\n        }\r\n        // 单选\r\n        return dispatch(setSelectedTarget([file]));\r\n    };\r\n};\r\n\r\nexport const submitCompressTask = (fileName: string, path: string) => {\r\n    return async (dispatch: any, getState: any) => {\r\n        const {\r\n            explorer: { selected },\r\n        } = getState();\r\n        const dirs: string[] = [],\r\n            items: string[] = [];\r\n        // eslint-disable-next-line\r\n        selected.map((value) => {\r\n            if (value.type === \"dir\") {\r\n                dirs.push(value.id);\r\n            } else {\r\n                items.push(value.id);\r\n            }\r\n        });\r\n\r\n        return await API.post(\"/file/compress\", {\r\n            src: {\r\n                dirs: dirs,\r\n                items: items,\r\n            },\r\n            name: fileName,\r\n            dst: path === \"//\" ? \"/\" : path,\r\n        });\r\n    };\r\n};\r\n\r\nconst encodings = [\r\n    \"ibm866\",\r\n    \"iso8859_2\",\r\n    \"iso8859_3\",\r\n    \"iso8859_4\",\r\n    \"iso8859_5\",\r\n    \"iso8859_6\",\r\n    \"iso8859_7\",\r\n    \"iso8859_8\",\r\n    \"iso8859_8I\",\r\n    \"iso8859_10\",\r\n    \"iso8859_13\",\r\n    \"iso8859_14\",\r\n    \"iso8859_15\",\r\n    \"iso8859_16\",\r\n    \"koi8r\",\r\n    \"koi8u\",\r\n    \"macintosh\",\r\n    \"windows874\",\r\n    \"windows1250\",\r\n    \"windows1251\",\r\n    \"windows1252\",\r\n    \"windows1253\",\r\n    \"windows1254\",\r\n    \"windows1255\",\r\n    \"windows1256\",\r\n    \"windows1257\",\r\n    \"windows1258\",\r\n    \"macintoshcyrillic\",\r\n    \"gbk\",\r\n    \"big5\",\r\n    \"eucjp\",\r\n    \"iso2022jp\",\r\n    \"shiftjis\",\r\n    \"euckr\",\r\n    \"utf16be\",\r\n    \"utf16le\",\r\n];\r\n\r\nexport const submitDecompressTask = (path: string) => {\r\n    return async (dispatch: any, getState: any) => {\r\n        const {\r\n            explorer: { selected },\r\n        } = getState();\r\n\r\n        let encoding = \"\";\r\n        if (selected.length > 0 && encodingRequired(selected[0].name)) {\r\n            let option: any;\r\n            try {\r\n                const allOptions = encodings.map((e) => {\r\n                    return {\r\n                        key: e,\r\n                        name: e.toUpperCase(),\r\n                    };\r\n                });\r\n                option = await dispatch(\r\n                    askForOption(\r\n                        [\r\n                            {\r\n                                key: \"\",\r\n                                name: i18next.t(\"modals.defaultEncoding\"),\r\n                            },\r\n                            {\r\n                                key: \"gb18030\",\r\n                                name: \"GB18030\",\r\n                                description: i18next.t(\r\n                                    \"modals.chineseMajorEncoding\"\r\n                                ),\r\n                            },\r\n                            ...allOptions,\r\n                        ],\r\n                        i18next.t(\"modals.selectEncoding\")\r\n                    )\r\n                );\r\n            } catch (e) {\r\n                throw new Error(i18next.t(\"modals.noEncodingSelected\"));\r\n            }\r\n\r\n            encoding = option.key;\r\n        }\r\n\r\n        return await API.post(\"/file/decompress\", {\r\n            src: filePath(selected[0]),\r\n            dst: path === \"//\" ? \"/\" : path,\r\n            encoding: encoding,\r\n        });\r\n    };\r\n};\r\n\r\nexport const batchGetSource = (): ThunkAction<any, any, any, any> => {\r\n    return async (dispatch, getState): Promise<any> => {\r\n        const {\r\n            explorer: { selected },\r\n            router: {\r\n                location: { pathname },\r\n            },\r\n        } = getState();\r\n\r\n        if (selected.findIndex((f) => f.type === \"dir\") >= 0) {\r\n            dispatch(openLoadingDialog(i18next.t(\"modals.listingFiles\")));\r\n        }\r\n\r\n        let queue: CloudreveFile[] = [];\r\n        try {\r\n            queue = await walk(selected, null);\r\n        } catch (e) {\r\n            dispatch(\r\n                toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    i18next.t(\"modals.listingFileError\", {\r\n                        message: e.message,\r\n                    }),\r\n                    \"warning\"\r\n                )\r\n            );\r\n            dispatch(closeAllModals());\r\n            return;\r\n        }\r\n\r\n        dispatch(openLoadingDialog(i18next.t(\"modals.generatingSourceLinks\")));\r\n\r\n        const items = queue\r\n            .filter((value) => value.source_enabled && value.type === \"file\")\r\n            .map((v) => v.id);\r\n\r\n        if (items.length === 0) {\r\n            dispatch(\r\n                toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    i18next.t(\"modals.noFileCanGenerateSourceLink\"),\r\n                    \"warning\"\r\n                )\r\n            );\r\n            dispatch(closeAllModals());\r\n            return;\r\n        }\r\n\r\n        const user = Auth.GetUser();\r\n        if (items.length > user.group.sourceBatch) {\r\n            dispatch(\r\n                toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    i18next.t(\"modals.sourceBatchSizeExceeded\", {\r\n                        limit: user.group.sourceBatch,\r\n                    }),\r\n                    \"warning\"\r\n                )\r\n            );\r\n            dispatch(closeAllModals());\r\n            return;\r\n        }\r\n\r\n        API.post(\"/file/source\", { items: items })\r\n            .then((response) => {\r\n                console.log(response);\r\n                dispatch(closeAllModals());\r\n                dispatch(\r\n                    openGetSourceDialog(\r\n                        response.data.length == 1\r\n                            ? response.data[0].url\r\n                            : response.data\r\n                                  .map(\r\n                                      (res) =>\r\n                                          `${res.name}: ${res.url}${\r\n                                              res.error ? res.error : \"\"\r\n                                          }`\r\n                                  )\r\n                                  .join(\"\\n\")\r\n                    )\r\n                );\r\n            })\r\n            .catch((error) => {\r\n                dispatch(\r\n                    toggleSnackbar(\"top\", \"right\", error.message, \"warning\")\r\n                );\r\n                dispatch(closeAllModals());\r\n            });\r\n    };\r\n};\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { connect } from \"react-redux\";\r\nimport { baseURL } from \"../../middleware/Api\";\r\nimport { imgPreviewSuffix } from \"../../config\";\r\nimport { withStyles } from \"@material-ui/core\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport { withRouter } from \"react-router\";\r\nimport { PhotoSlider } from \"react-photo-view\";\r\nimport \"react-photo-view/dist/index.css\";\r\nimport * as explorer from \"../../redux/explorer/reducer\";\r\nimport { showImgPreivew } from \"../../redux/explorer\";\r\n\r\nconst styles = () => ({});\r\n\r\nconst mapStateToProps = (state) => {\r\n    return {\r\n        first: state.explorer.imgPreview.first,\r\n        other: state.explorer.imgPreview.other,\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n    return {\r\n        showImgPreivew: (first) => {\r\n            dispatch(showImgPreivew(first));\r\n        },\r\n    };\r\n};\r\n\r\nclass ImagPreviewComponent extends Component {\r\n    state = {\r\n        items: [],\r\n        photoIndex: 0,\r\n        isOpen: false,\r\n    };\r\n\r\n    UNSAFE_componentWillReceiveProps = (nextProps) => {\r\n        const items = [];\r\n        let firstOne = 0;\r\n        if (nextProps.first.id !== \"\") {\r\n            if (\r\n                pathHelper.isSharePage(this.props.location.pathname) &&\r\n                !nextProps.first.path\r\n            ) {\r\n                const newImg = {\r\n                    intro: nextProps.first.name,\r\n                    src: baseURL + \"/share/preview/\" + nextProps.first.key,\r\n                };\r\n                firstOne = 0;\r\n                items.push(newImg);\r\n                this.setState({\r\n                    photoIndex: firstOne,\r\n                    items: items,\r\n                    isOpen: true,\r\n                });\r\n                return;\r\n            }\r\n            // eslint-disable-next-line\r\n            nextProps.other.map((value) => {\r\n                const fileType = value.name.split(\".\").pop().toLowerCase();\r\n                if (imgPreviewSuffix.indexOf(fileType) !== -1) {\r\n                    let src = \"\";\r\n                    if (pathHelper.isSharePage(this.props.location.pathname)) {\r\n                        src = baseURL + \"/share/preview/\" + value.key;\r\n                        src =\r\n                            src +\r\n                            \"?path=\" +\r\n                            encodeURIComponent(\r\n                                value.path === \"/\"\r\n                                    ? value.path + value.name\r\n                                    : value.path + \"/\" + value.name\r\n                            );\r\n                    } else {\r\n                        src = baseURL + \"/file/preview/\" + value.id;\r\n                    }\r\n                    const newImg = {\r\n                        intro: value.name,\r\n                        src: src,\r\n                    };\r\n                    if (\r\n                        value.path === nextProps.first.path &&\r\n                        value.name === nextProps.first.name\r\n                    ) {\r\n                        firstOne = items.length;\r\n                    }\r\n                    items.push(newImg);\r\n                }\r\n            });\r\n            this.setState({\r\n                photoIndex: firstOne,\r\n                items: items,\r\n                isOpen: true,\r\n            });\r\n        }\r\n    };\r\n\r\n    handleClose = () => {\r\n        this.props.showImgPreivew(explorer.initState.imgPreview.first);\r\n        this.setState({\r\n            isOpen: false,\r\n        });\r\n    };\r\n\r\n    render() {\r\n        const { photoIndex, isOpen, items } = this.state;\r\n\r\n        return (\r\n            <div>\r\n                {isOpen && (\r\n                    <PhotoSlider\r\n                        images={items}\r\n                        visible={isOpen}\r\n                        onClose={() => this.handleClose()}\r\n                        index={photoIndex}\r\n                        onIndexChange={(n) =>\r\n                            this.setState({\r\n                                photoIndex: n,\r\n                            })\r\n                        }\r\n                    />\r\n                )}\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nImagPreviewComponent.propTypes = {\r\n    classes: PropTypes.object.isRequired,\r\n};\r\n\r\nconst ImgPreivew = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(withRouter(ImagPreviewComponent)));\r\n\r\nexport default ImgPreivew;\r\n","import { ChunkProgress } from \"./uploader/chunk\";\r\n\r\nexport enum PolicyType {\r\n    local = \"local\",\r\n    remote = \"remote\",\r\n    oss = \"oss\",\r\n    qiniu = \"qiniu\",\r\n    onedrive = \"onedrive\",\r\n    cos = \"cos\",\r\n    upyun = \"upyun\",\r\n    s3 = \"s3\",\r\n}\r\n\r\nexport interface Policy {\r\n    id: number;\r\n    name: string;\r\n    allowedSuffix: Nullable<string[]>;\r\n    maxSize: number;\r\n    type: PolicyType;\r\n}\r\n\r\nexport enum TaskType {\r\n    file,\r\n    resumeHint,\r\n}\r\n\r\nexport interface Task {\r\n    type: TaskType;\r\n    name: string;\r\n    size: number;\r\n    policy: Policy;\r\n    dst: string;\r\n    file: File;\r\n    child?: Task[];\r\n    session?: UploadCredential;\r\n    chunkProgress: ChunkProgress[];\r\n    resumed: boolean;\r\n}\r\n\r\ntype Nullable<T> = T | null;\r\n\r\nexport interface Response<T> {\r\n    code: number;\r\n    data: T;\r\n    msg: string;\r\n    error: string;\r\n}\r\n\r\nexport interface UploadSessionRequest {\r\n    path: string;\r\n    size: number;\r\n    name: string;\r\n    policy_id: number;\r\n    last_modified?: number;\r\n}\r\n\r\nexport interface UploadCredential {\r\n    sessionID: string;\r\n    expires: number;\r\n    chunkSize: number;\r\n    uploadURLs: string[];\r\n    credential: string;\r\n    uploadID: string;\r\n    callback: string;\r\n    policy: string;\r\n    ak: string;\r\n    keyTime: string;\r\n    path: string;\r\n    completeURL: string;\r\n}\r\n\r\nexport interface OneDriveError {\r\n    error: {\r\n        code: string;\r\n        message: string;\r\n        innererror?: {\r\n            code: string;\r\n        };\r\n    };\r\n}\r\n\r\nexport interface OneDriveChunkResponse {\r\n    expirationDateTime: string;\r\n    nextExpectedRanges: string[];\r\n}\r\n\r\nexport interface QiniuChunkResponse {\r\n    etag: string;\r\n    md5: string;\r\n}\r\n\r\nexport interface QiniuError {\r\n    error: string;\r\n}\r\n\r\nexport interface QiniuPartsInfo {\r\n    etag: string;\r\n    partNumber: number;\r\n}\r\n\r\nexport interface QiniuFinishUploadRequest {\r\n    parts: QiniuPartsInfo[];\r\n}\r\n\r\nexport interface UpyunError {\r\n    message: string;\r\n    code: number;\r\n}\r\n\r\nexport interface S3Part {\r\n    ETag: string;\r\n    PartNumber: number;\r\n}\r\n","// 所有 Uploader 的基类\r\nimport { PolicyType, Task } from \"../types\";\r\nimport UploadManager from \"../index\";\r\nimport Logger from \"../logger\";\r\nimport { validate } from \"../utils/validator\";\r\nimport { CancelToken } from \"../utils/request\";\r\nimport axios, { CancelTokenSource } from \"axios\";\r\nimport { createUploadSession, deleteUploadSession } from \"../api\";\r\nimport * as utils from \"../utils\";\r\nimport { RequestCanceledError, UploaderError } from \"../errors\";\r\n\r\nexport enum Status {\r\n    added,\r\n    resumable,\r\n    initialized,\r\n    queued,\r\n    preparing,\r\n    processing,\r\n    finishing,\r\n    finished,\r\n    error,\r\n    canceled,\r\n}\r\n\r\nexport interface UploadHandlers {\r\n    onTransition: (newStatus: Status) => void;\r\n    onError: (err: Error) => void;\r\n    onProgress: (data: UploadProgress) => void;\r\n    onMsg: (msg: string, color: string) => void;\r\n}\r\n\r\nexport interface UploadProgress {\r\n    total: ProgressCompose;\r\n    chunks?: ProgressCompose[];\r\n}\r\n\r\nexport interface ProgressCompose {\r\n    size: number;\r\n    loaded: number;\r\n    percent: number;\r\n    fromCache?: boolean;\r\n}\r\n\r\nexport interface Progress {\r\n    total: number;\r\n    loaded: number;\r\n}\r\n\r\nconst resumePolicy = [\r\n    PolicyType.local,\r\n    PolicyType.remote,\r\n    PolicyType.qiniu,\r\n    PolicyType.oss,\r\n    PolicyType.onedrive,\r\n    PolicyType.s3,\r\n];\r\nconst deleteUploadSessionDelay = 500;\r\n\r\nexport default abstract class Base {\r\n    public child?: Base[];\r\n    public status: Status = Status.added;\r\n    public error?: Error;\r\n\r\n    public id = ++Base.id;\r\n    private static id = 0;\r\n\r\n    protected logger: Logger;\r\n    protected subscriber: UploadHandlers;\r\n    // 用于取消请求\r\n    protected cancelToken: CancelTokenSource = CancelToken.source();\r\n    protected progress: UploadProgress;\r\n\r\n    public lastTime = Date.now();\r\n    public startTime = Date.now();\r\n\r\n    constructor(public task: Task, protected manager: UploadManager) {\r\n        this.logger = new Logger(\r\n            this.manager.logger.level,\r\n            \"UPLOADER\",\r\n            this.id\r\n        );\r\n        this.logger.info(\"Initialize new uploader for task: \", task);\r\n        this.subscriber = {\r\n            /* eslint-disable @typescript-eslint/no-empty-function */\r\n            onTransition: (newStatus: Status) => {},\r\n            onError: (err: Error) => {},\r\n            onProgress: (data: UploadProgress) => {},\r\n            onMsg: (msg, color: string) => {},\r\n            /* eslint-enable @typescript-eslint/no-empty-function */\r\n        };\r\n    }\r\n\r\n    public subscribe = (handlers: UploadHandlers) => {\r\n        this.subscriber = handlers;\r\n    };\r\n\r\n    public start = async () => {\r\n        this.logger.info(\"Activate uploading task\");\r\n        this.transit(Status.initialized);\r\n        this.lastTime = this.startTime = Date.now();\r\n\r\n        try {\r\n            validate(this.task.file, this.task.policy);\r\n        } catch (e) {\r\n            this.logger.error(\"File validate failed with error:\", e);\r\n            this.setError(e);\r\n            return;\r\n        }\r\n\r\n        this.logger.info(\"Enqueued in manager pool\");\r\n        this.transit(Status.queued);\r\n        this.manager.pool.enqueue(this).catch((e) => {\r\n            this.logger.info(\"Upload task failed with error:\", e);\r\n            this.setError(e);\r\n        });\r\n    };\r\n\r\n    public run = async () => {\r\n        this.logger.info(\"Start upload task, create upload session...\");\r\n        this.transit(Status.preparing);\r\n        const cachedInfo = utils.getResumeCtx(this.task, this.logger);\r\n        if (cachedInfo == null) {\r\n            this.task.session = await createUploadSession(\r\n                {\r\n                    path: this.task.dst,\r\n                    size: this.task.file.size,\r\n                    name: this.task.file.name,\r\n                    policy_id: this.task.policy.id,\r\n                    last_modified: this.task.file.lastModified,\r\n                },\r\n                this.cancelToken.token\r\n            );\r\n            this.logger.info(\"Upload session created:\", this.task.session);\r\n        } else {\r\n            this.task.session = cachedInfo.session;\r\n            this.task.resumed = true;\r\n            this.task.chunkProgress = cachedInfo.chunkProgress;\r\n            this.logger.info(\"Resume upload from cached ctx:\", cachedInfo);\r\n        }\r\n\r\n        this.transit(Status.processing);\r\n        await this.upload();\r\n        await this.afterUpload();\r\n        utils.removeResumeCtx(this.task, this.logger);\r\n        this.transit(Status.finished);\r\n        this.logger.info(\"Upload task completed\");\r\n    };\r\n\r\n    public abstract async upload(): Promise<any>;\r\n    protected async afterUpload(): Promise<any> {\r\n        return;\r\n    }\r\n\r\n    public cancel = async () => {\r\n        if (this.status === Status.finished) {\r\n            return;\r\n        }\r\n\r\n        this.cancelToken.cancel();\r\n        await this.cancelUploadSession();\r\n        this.transit(Status.canceled);\r\n    };\r\n\r\n    public reset = () => {\r\n        this.cancelToken = axios.CancelToken.source();\r\n        this.progress = {\r\n            total: {\r\n                size: 0,\r\n                loaded: 0,\r\n                percent: 0,\r\n            },\r\n        };\r\n    };\r\n\r\n    protected setError(e: Error) {\r\n        if (\r\n            !(e instanceof UploaderError && e.Retryable()) ||\r\n            !resumePolicy.includes(this.task.policy.type)\r\n        ) {\r\n            this.logger.warn(\"Non-resume error occurs, clean resume ctx cache\");\r\n            this.cancelUploadSession();\r\n        }\r\n\r\n        if (!(e instanceof RequestCanceledError)) {\r\n            this.status = Status.error;\r\n            this.error = e;\r\n            this.subscriber.onError(e);\r\n        }\r\n    }\r\n\r\n    protected cancelUploadSession = (): Promise<void> => {\r\n        return new Promise<void>((resolve) => {\r\n            utils.removeResumeCtx(this.task, this.logger);\r\n            if (this.task.session) {\r\n                setTimeout(() => {\r\n                    deleteUploadSession(this.task.session!?.sessionID)\r\n                        .catch((e) => {\r\n                            this.logger.warn(\r\n                                \"Failed to cancel upload session: \",\r\n                                e\r\n                            );\r\n                        })\r\n                        .finally(() => {\r\n                            resolve();\r\n                        });\r\n                }, deleteUploadSessionDelay);\r\n            } else {\r\n                resolve();\r\n            }\r\n        });\r\n    };\r\n\r\n    protected transit(status: Status) {\r\n        this.status = status;\r\n        this.subscriber.onTransition(status);\r\n    }\r\n\r\n    public getProgressInfoItem(\r\n        loaded: number,\r\n        size: number,\r\n        fromCache?: boolean\r\n    ): ProgressCompose {\r\n        return {\r\n            size,\r\n            loaded,\r\n            percent: (loaded / size) * 100,\r\n            ...(fromCache == null ? {} : { fromCache }),\r\n        };\r\n    }\r\n\r\n    public key(): string {\r\n        return utils.getResumeCtxKey(this.task);\r\n    }\r\n}\r\n","export type LogLevel = \"INFO\" | \"WARN\" | \"ERROR\" | \"OFF\";\r\n\r\nexport default class Logger {\r\n    constructor(\r\n        public level: LogLevel = \"OFF\",\r\n        private prefix = \"UPLOAD\",\r\n        private id: number = 1\r\n    ) {}\r\n\r\n    private getPrintPrefix(level: LogLevel) {\r\n        return `Cloudreve-Uploader [${level}][${this.prefix}#${this.id}]:`;\r\n    }\r\n\r\n    info(...args: unknown[]) {\r\n        const allowLevel: LogLevel[] = [\"INFO\"];\r\n        if (allowLevel.includes(this.level)) {\r\n            // eslint-disable-next-line no-console\r\n            console.log(this.getPrintPrefix(\"INFO\"), ...args);\r\n        }\r\n    }\r\n\r\n    warn(...args: unknown[]) {\r\n        const allowLevel: LogLevel[] = [\"INFO\", \"WARN\"];\r\n        if (allowLevel.includes(this.level)) {\r\n            // eslint-disable-next-line no-console\r\n            console.warn(this.getPrintPrefix(\"WARN\"), ...args);\r\n        }\r\n    }\r\n\r\n    error(...args: unknown[]) {\r\n        const allowLevel: LogLevel[] = [\"INFO\", \"WARN\", \"ERROR\"];\r\n        if (allowLevel.includes(this.level)) {\r\n            // eslint-disable-next-line no-console\r\n            console.error(this.getPrintPrefix(\"ERROR\"), ...args);\r\n        }\r\n    }\r\n}\r\n","import {\r\n    OneDriveChunkResponse,\r\n    QiniuChunkResponse,\r\n    QiniuFinishUploadRequest,\r\n    QiniuPartsInfo,\r\n    S3Part,\r\n    UploadCredential,\r\n    UploadSessionRequest,\r\n} from \"../types\";\r\nimport { OBJtoXML, request, requestAPI } from \"../utils\";\r\nimport {\r\n    COSUploadCallbackError,\r\n    COSUploadError,\r\n    CreateUploadSessionError,\r\n    DeleteUploadSessionError,\r\n    HTTPError,\r\n    LocalChunkUploadError,\r\n    OneDriveChunkError,\r\n    OneDriveFinishUploadError,\r\n    QiniuChunkError,\r\n    QiniuFinishUploadError,\r\n    S3LikeChunkError,\r\n    S3LikeFinishUploadError,\r\n    S3LikeUploadCallbackError,\r\n    SlaveChunkUploadError,\r\n    UpyunUploadError,\r\n} from \"../errors\";\r\nimport { ChunkInfo, ChunkProgress } from \"../uploader/chunk\";\r\nimport { Progress } from \"../uploader/base\";\r\nimport { CancelToken } from \"axios\";\r\n\r\nexport async function createUploadSession(\r\n    req: UploadSessionRequest,\r\n    cancel: CancelToken\r\n): Promise<UploadCredential> {\r\n    const res = await requestAPI<UploadCredential>(\"file/upload\", {\r\n        method: \"put\",\r\n        data: req,\r\n        cancelToken: cancel,\r\n    });\r\n\r\n    if (res.data.code != 0) {\r\n        throw new CreateUploadSessionError(res.data);\r\n    }\r\n\r\n    return res.data.data;\r\n}\r\n\r\nexport async function deleteUploadSession(id: string): Promise<any> {\r\n    const res = await requestAPI<UploadCredential>(`file/upload/${id}`, {\r\n        method: \"delete\",\r\n    });\r\n\r\n    if (res.data.code != 0) {\r\n        throw new DeleteUploadSessionError(res.data);\r\n    }\r\n\r\n    return res.data.data;\r\n}\r\n\r\nexport async function localUploadChunk(\r\n    sessionID: string,\r\n    chunk: ChunkInfo,\r\n    onProgress: (p: Progress) => void,\r\n    cancel: CancelToken\r\n): Promise<any> {\r\n    const res = await requestAPI<any>(\r\n        `file/upload/${sessionID}/${chunk.index}`,\r\n        {\r\n            method: \"post\",\r\n            headers: { \"content-type\": \"application/octet-stream\" },\r\n            data: chunk.chunk,\r\n            onUploadProgress: (progressEvent) => {\r\n                onProgress({\r\n                    loaded: progressEvent.loaded,\r\n                    total: progressEvent.total,\r\n                });\r\n            },\r\n            cancelToken: cancel,\r\n        }\r\n    );\r\n\r\n    if (res.data.code != 0) {\r\n        throw new LocalChunkUploadError(res.data, chunk.index);\r\n    }\r\n\r\n    return res.data.data;\r\n}\r\n\r\nexport async function slaveUploadChunk(\r\n    url: string,\r\n    credential: string,\r\n    chunk: ChunkInfo,\r\n    onProgress: (p: Progress) => void,\r\n    cancel: CancelToken\r\n): Promise<any> {\r\n    const res = await request<any>(`${url}?chunk=${chunk.index}`, {\r\n        method: \"post\",\r\n        headers: {\r\n            \"content-type\": \"application/octet-stream\",\r\n            Authorization: credential,\r\n        },\r\n        data: chunk.chunk,\r\n        onUploadProgress: (progressEvent) => {\r\n            onProgress({\r\n                loaded: progressEvent.loaded,\r\n                total: progressEvent.total,\r\n            });\r\n        },\r\n        cancelToken: cancel,\r\n    });\r\n\r\n    if (res.data.code != 0) {\r\n        throw new SlaveChunkUploadError(res.data, chunk.index);\r\n    }\r\n\r\n    return res.data.data;\r\n}\r\n\r\nexport async function oneDriveUploadChunk(\r\n    url: string,\r\n    range: string, // if range is empty, this will be an request to query the session status\r\n    chunk: ChunkInfo,\r\n    onProgress: (p: Progress) => void,\r\n    cancel: CancelToken\r\n): Promise<OneDriveChunkResponse> {\r\n    const res = await request<OneDriveChunkResponse>(url, {\r\n        method: range === \"\" ? \"get\" : \"put\",\r\n        headers: {\r\n            \"content-type\": \"application/octet-stream\",\r\n            ...(range !== \"\" && { \"content-range\": range }),\r\n        },\r\n        data: chunk.chunk,\r\n        onUploadProgress: (progressEvent) => {\r\n            onProgress({\r\n                loaded: progressEvent.loaded,\r\n                total: progressEvent.total,\r\n            });\r\n        },\r\n        cancelToken: cancel,\r\n    }).catch((e) => {\r\n        if (e instanceof HTTPError && e.response) {\r\n            throw new OneDriveChunkError(e.response.data);\r\n        }\r\n\r\n        throw e;\r\n    });\r\n\r\n    return res.data;\r\n}\r\n\r\nexport async function finishOneDriveUpload(\r\n    sessionID: string,\r\n    cancel: CancelToken\r\n): Promise<UploadCredential> {\r\n    const res = await requestAPI<UploadCredential>(\r\n        `callback/onedrive/finish/${sessionID}`,\r\n        {\r\n            method: \"post\",\r\n            data: \"{}\",\r\n            cancelToken: cancel,\r\n        }\r\n    );\r\n\r\n    if (res.data.code != 0) {\r\n        throw new OneDriveFinishUploadError(res.data);\r\n    }\r\n\r\n    return res.data.data;\r\n}\r\n\r\nexport async function s3LikeUploadChunk(\r\n    url: string,\r\n    chunk: ChunkInfo,\r\n    onProgress: (p: Progress) => void,\r\n    cancel: CancelToken\r\n): Promise<string> {\r\n    const res = await request<string>(url, {\r\n        method: \"put\",\r\n        headers: {\r\n            \"content-type\": \"application/octet-stream\",\r\n        },\r\n        data: chunk.chunk,\r\n        onUploadProgress: (progressEvent) => {\r\n            onProgress({\r\n                loaded: progressEvent.loaded,\r\n                total: progressEvent.total,\r\n            });\r\n        },\r\n        cancelToken: cancel,\r\n        responseType: \"document\",\r\n        transformResponse: undefined,\r\n    }).catch((e) => {\r\n        if (e instanceof HTTPError && e.response) {\r\n            throw new S3LikeChunkError(e.response.data);\r\n        }\r\n\r\n        throw e;\r\n    });\r\n\r\n    return res.headers.etag;\r\n}\r\n\r\nexport async function s3LikeFinishUpload(\r\n    url: string,\r\n    isOss: boolean,\r\n    chunks: ChunkProgress[],\r\n    cancel: CancelToken\r\n): Promise<any> {\r\n    let body = \"\";\r\n    if (!isOss) {\r\n        body += \"<CompleteMultipartUpload>\";\r\n        chunks.forEach((chunk) => {\r\n            body += \"<Part>\";\r\n            const part: S3Part = {\r\n                PartNumber: chunk.index + 1,\r\n                ETag: chunk.etag!,\r\n            };\r\n            body += OBJtoXML(part);\r\n            body += \"</Part>\";\r\n        });\r\n        body += \"</CompleteMultipartUpload>\";\r\n    }\r\n\r\n    const res = await request<any>(url, {\r\n        method: \"post\",\r\n        cancelToken: cancel,\r\n        responseType: \"document\",\r\n        transformResponse: undefined,\r\n        data: body,\r\n        headers: isOss\r\n            ? {\r\n                  \"content-type\": \"application/octet-stream\",\r\n                  \"x-oss-forbid-overwrite\": \"true\",\r\n                  \"x-oss-complete-all\": \"yes\",\r\n              }\r\n            : {\r\n                  \"content-type\": \"application/xhtml+xml\",\r\n              },\r\n        validateStatus: function (status) {\r\n            return status == 200;\r\n        },\r\n    }).catch((e) => {\r\n        if (e instanceof HTTPError && e.response) {\r\n            throw new S3LikeFinishUploadError(e.response.data);\r\n        }\r\n\r\n        throw e;\r\n    });\r\n\r\n    return res.data;\r\n}\r\n\r\nexport async function qiniuDriveUploadChunk(\r\n    url: string,\r\n    upToken: string,\r\n    chunk: ChunkInfo,\r\n    onProgress: (p: Progress) => void,\r\n    cancel: CancelToken\r\n): Promise<QiniuChunkResponse> {\r\n    const res = await request<QiniuChunkResponse>(`${url}/${chunk.index + 1}`, {\r\n        method: \"put\",\r\n        headers: {\r\n            \"content-type\": \"application/octet-stream\",\r\n            authorization: \"UpToken \" + upToken,\r\n        },\r\n        data: chunk.chunk,\r\n        onUploadProgress: (progressEvent) => {\r\n            onProgress({\r\n                loaded: progressEvent.loaded,\r\n                total: progressEvent.total,\r\n            });\r\n        },\r\n        cancelToken: cancel,\r\n    }).catch((e) => {\r\n        if (e instanceof HTTPError && e.response) {\r\n            throw new QiniuChunkError(e.response.data);\r\n        }\r\n\r\n        throw e;\r\n    });\r\n\r\n    return res.data;\r\n}\r\n\r\nexport async function qiniuFinishUpload(\r\n    url: string,\r\n    upToken: string,\r\n    chunks: ChunkProgress[],\r\n    cancel: CancelToken\r\n): Promise<any> {\r\n    const content: QiniuFinishUploadRequest = {\r\n        parts: chunks.map(\r\n            (chunk): QiniuPartsInfo => {\r\n                return {\r\n                    etag: chunk.etag!,\r\n                    partNumber: chunk.index + 1,\r\n                };\r\n            }\r\n        ),\r\n    };\r\n\r\n    const res = await request<any>(`${url}`, {\r\n        method: \"post\",\r\n        headers: {\r\n            \"content-type\": \"application/json\",\r\n            authorization: \"UpToken \" + upToken,\r\n        },\r\n        data: content,\r\n        cancelToken: cancel,\r\n    }).catch((e) => {\r\n        if (e instanceof HTTPError && e.response) {\r\n            throw new QiniuFinishUploadError(e.response.data);\r\n        }\r\n\r\n        throw e;\r\n    });\r\n\r\n    return res.data;\r\n}\r\n\r\nexport async function cosFormUploadChunk(\r\n    url: string,\r\n    file: File,\r\n    policy: string,\r\n    path: string,\r\n    callback: string,\r\n    sessionID: string,\r\n    keyTime: string,\r\n    credential: string,\r\n    ak: string,\r\n    onProgress: (p: Progress) => void,\r\n    cancel: CancelToken\r\n): Promise<any> {\r\n    const bodyFormData = new FormData();\r\n    bodyFormData.append(\"policy\", policy);\r\n    bodyFormData.append(\"key\", path);\r\n    bodyFormData.append(\"x-cos-meta-callback\", callback);\r\n    bodyFormData.append(\"x-cos-meta-key\", sessionID);\r\n    bodyFormData.append(\"q-sign-algorithm\", \"sha1\");\r\n    bodyFormData.append(\"q-key-time\", keyTime);\r\n    bodyFormData.append(\"q-ak\", ak);\r\n    bodyFormData.append(\"q-signature\", credential);\r\n    bodyFormData.append(\"name\", file.name);\r\n    // File must be the last element in the form\r\n    bodyFormData.append(\"file\", file);\r\n\r\n    const res = await request<any>(`${url}`, {\r\n        method: \"post\",\r\n        headers: {\r\n            \"content-type\": \"multipart/form-data\",\r\n        },\r\n        data: bodyFormData,\r\n        onUploadProgress: (progressEvent) => {\r\n            onProgress({\r\n                loaded: progressEvent.loaded,\r\n                total: progressEvent.total,\r\n            });\r\n        },\r\n        cancelToken: cancel,\r\n        responseType: \"document\",\r\n        transformResponse: undefined,\r\n    }).catch((e) => {\r\n        if (e instanceof HTTPError && e.response) {\r\n            throw new COSUploadError(e.response.data);\r\n        }\r\n\r\n        throw e;\r\n    });\r\n\r\n    return res.data;\r\n}\r\n\r\nexport async function cosUploadCallback(\r\n    sessionID: string,\r\n    cancel: CancelToken\r\n): Promise<any> {\r\n    const res = await requestAPI<any>(`callback/cos/${sessionID}`, {\r\n        method: \"get\",\r\n        data: \"{}\",\r\n        cancelToken: cancel,\r\n    });\r\n\r\n    if (res.data.code != 0) {\r\n        throw new COSUploadCallbackError(res.data);\r\n    }\r\n\r\n    return res.data.data;\r\n}\r\n\r\nexport async function upyunFormUploadChunk(\r\n    url: string,\r\n    file: File,\r\n    policy: string,\r\n    credential: string,\r\n    onProgress: (p: Progress) => void,\r\n    cancel: CancelToken\r\n): Promise<any> {\r\n    const bodyFormData = new FormData();\r\n    bodyFormData.append(\"policy\", policy);\r\n    bodyFormData.append(\"authorization\", credential);\r\n    // File must be the last element in the form\r\n    bodyFormData.append(\"file\", file);\r\n\r\n    const res = await request<any>(`${url}`, {\r\n        method: \"post\",\r\n        headers: {\r\n            \"content-type\": \"multipart/form-data\",\r\n        },\r\n        data: bodyFormData,\r\n        onUploadProgress: (progressEvent) => {\r\n            onProgress({\r\n                loaded: progressEvent.loaded,\r\n                total: progressEvent.total,\r\n            });\r\n        },\r\n        cancelToken: cancel,\r\n    }).catch((e) => {\r\n        if (e instanceof HTTPError && e.response) {\r\n            throw new UpyunUploadError(e.response.data);\r\n        }\r\n\r\n        throw e;\r\n    });\r\n\r\n    return res.data;\r\n}\r\n\r\nexport async function s3LikeUploadCallback(\r\n    sessionID: string,\r\n    cancel: CancelToken\r\n): Promise<any> {\r\n    const res = await requestAPI<any>(`callback/s3/${sessionID}`, {\r\n        method: \"get\",\r\n        data: \"{}\",\r\n        cancelToken: cancel,\r\n    });\r\n\r\n    if (res.data.code != 0) {\r\n        throw new S3LikeUploadCallbackError(res.data);\r\n    }\r\n\r\n    return res.data.data;\r\n}\r\n","import { Policy, PolicyType, Task, TaskType } from \"./types\";\r\nimport Logger, { LogLevel } from \"./logger\";\r\nimport { UnknownPolicyError, UploaderError, UploaderErrorName } from \"./errors\";\r\nimport Base from \"./uploader/base\";\r\nimport Local from \"./uploader/local\";\r\nimport { Pool } from \"./utils/pool\";\r\nimport {\r\n    cleanupResumeCtx,\r\n    getAllFileEntries,\r\n    getDirectoryUploadDst,\r\n    getFileInput,\r\n    isFileDrop,\r\n    listResumeCtx,\r\n} from \"./utils\";\r\nimport Remote from \"./uploader/remote\";\r\nimport OneDrive from \"./uploader/onedrive\";\r\nimport OSS from \"./uploader/oss\";\r\nimport Qiniu from \"./uploader/qiniu\";\r\nimport COS from \"./uploader/cos\";\r\nimport Upyun from \"./uploader/upyun\";\r\nimport S3 from \"./uploader/s3\";\r\nimport ResumeHint from \"./uploader/placeholder\";\r\n\r\nexport interface Option {\r\n    logLevel: LogLevel;\r\n    concurrentLimit: number;\r\n    dropZone?: HTMLElement;\r\n    onDropOver?: (e: DragEvent) => void;\r\n    onDropLeave?: (e: DragEvent) => void;\r\n    onToast: (type: string, msg: string) => void;\r\n    onDropFileAdded?: (uploaders: Base[]) => void;\r\n}\r\n\r\nexport enum SelectType {\r\n    File,\r\n    Directory,\r\n}\r\n\r\nexport default class UploadManager {\r\n    public logger: Logger;\r\n    public pool: Pool;\r\n    private static id = 0;\r\n    private policy?: Policy;\r\n    private fileInput: HTMLInputElement;\r\n    private directoryInput: HTMLInputElement;\r\n    private id = ++UploadManager.id;\r\n    // used for proactive upload (drop, paste)\r\n    private currentPath = \"/\";\r\n\r\n    constructor(private o: Option) {\r\n        this.logger = new Logger(o.logLevel, \"MANAGER\");\r\n        this.logger.info(`Initialized with log level: ${o.logLevel}`);\r\n\r\n        this.pool = new Pool(o.concurrentLimit);\r\n        this.fileInput = getFileInput(this.id, false);\r\n        this.directoryInput = getFileInput(this.id, true);\r\n\r\n        if (o.dropZone) {\r\n            this.logger.info(`Drag and drop container set to:`, o.dropZone);\r\n            o.dropZone.addEventListener(\"dragenter\", (e) => {\r\n                if (isFileDrop(e)) {\r\n                    e.preventDefault();\r\n                    if (o.onDropOver) {\r\n                        o.onDropOver(e);\r\n                    }\r\n                }\r\n            });\r\n\r\n            o.dropZone.addEventListener(\"dragleave\", (e) => {\r\n                if (isFileDrop(e)) {\r\n                    e.preventDefault();\r\n                    if (o.onDropLeave) {\r\n                        o.onDropLeave(e);\r\n                    }\r\n                }\r\n            });\r\n\r\n            o.dropZone.addEventListener(\"drop\", this.onFileDroppedIn);\r\n        }\r\n    }\r\n\r\n    changeConcurrentLimit = (newLimit: number) => {\r\n        this.pool.limit = newLimit;\r\n    };\r\n\r\n    dispatchUploader(task: Task): Base {\r\n        if (task.type == TaskType.resumeHint) {\r\n            return new ResumeHint(task, this);\r\n        }\r\n\r\n        switch (task.policy.type) {\r\n            case PolicyType.local:\r\n                return new Local(task, this);\r\n            case PolicyType.remote:\r\n                return new Remote(task, this);\r\n            case PolicyType.onedrive:\r\n                return new OneDrive(task, this);\r\n            case PolicyType.oss:\r\n                return new OSS(task, this);\r\n            case PolicyType.qiniu:\r\n                return new Qiniu(task, this);\r\n            case PolicyType.cos:\r\n                return new COS(task, this);\r\n            case PolicyType.upyun:\r\n                return new Upyun(task, this);\r\n            case PolicyType.s3:\r\n                return new S3(task, this);\r\n            default:\r\n                throw new UnknownPolicyError(\r\n                    \"Unknown policy type.\",\r\n                    task.policy\r\n                );\r\n        }\r\n    }\r\n\r\n    // 设定当前存储策略\r\n    public setPolicy(p: Policy, path: string) {\r\n        this.policy = p;\r\n        this.currentPath = path;\r\n        if (p == undefined) {\r\n            this.logger.info(`Currently no policy selected`);\r\n            return;\r\n        }\r\n\r\n        this.logger.info(`Switching policy to:`, p);\r\n\r\n        if (p.allowedSuffix != undefined && p.allowedSuffix.length > 0) {\r\n            const acceptVal = p.allowedSuffix\r\n                .map((v) => {\r\n                    return \".\" + v;\r\n                })\r\n                .join(\",\");\r\n            this.logger.info(`Set allowed file suffix to ${acceptVal}`);\r\n            this.fileInput.setAttribute(\"accept\", acceptVal);\r\n        } else {\r\n            this.logger.info(`Set allowed file suffix to *`);\r\n            this.fileInput.removeAttribute(\"accept\");\r\n        }\r\n    }\r\n\r\n    // 选择文件\r\n    public select = (dst: string, type = SelectType.File): Promise<Base[]> => {\r\n        return new Promise<Base[]>((resolve) => {\r\n            if (this.policy == undefined) {\r\n                this.logger.warn(\r\n                    `Calling file selector while no policy is set`\r\n                );\r\n                throw new UploaderError(\r\n                    UploaderErrorName.NoPolicySelected,\r\n                    \"No policy selected.\"\r\n                );\r\n            }\r\n\r\n            this.fileInput.onchange = (ev: Event) =>\r\n                this.fileSelectCallback(ev, dst, resolve);\r\n            this.directoryInput.onchange = (ev: Event) =>\r\n                this.fileSelectCallback(ev, dst, resolve);\r\n            this.fileInput.value = \"\";\r\n            this.directoryInput.value = \"\";\r\n            type == SelectType.File\r\n                ? this.fileInput.click()\r\n                : this.directoryInput.click();\r\n        });\r\n    };\r\n\r\n    public resumeTasks = (): Base[] => {\r\n        const tasks = listResumeCtx(this.logger);\r\n        if (tasks.length > 0) {\r\n            this.logger.info(\r\n                `Resumed ${tasks.length} unfinished task(s) from local storage:`,\r\n                tasks\r\n            );\r\n        }\r\n        return tasks\r\n            .filter(\r\n                (t) =>\r\n                    t.chunkProgress.length > 0 && t.chunkProgress[0].loaded > 0\r\n            )\r\n            .map((t) =>\r\n                this.dispatchUploader({ ...t, type: TaskType.resumeHint })\r\n            );\r\n    };\r\n\r\n    public cleanupSessions = () => {\r\n        cleanupResumeCtx(this.logger);\r\n    };\r\n\r\n    private fileSelectCallback = (\r\n        ev: Event | File[],\r\n        dst: string,\r\n        resolve: (value?: Base[] | PromiseLike<Base[]> | undefined) => void\r\n    ) => {\r\n        let files: File[] = [];\r\n        if (ev instanceof Event) {\r\n            const target = ev.target as HTMLInputElement;\r\n            if (!ev || !target || !target.files) return;\r\n            if (target.files.length > 0) {\r\n                files = Array.from(target.files);\r\n            }\r\n        } else {\r\n            files = ev as File[];\r\n        }\r\n\r\n        if (files.length > 0) {\r\n            resolve(\r\n                files.map(\r\n                    (file): Base =>\r\n                        this.dispatchUploader({\r\n                            type: TaskType.file,\r\n                            policy: this.policy as Policy,\r\n                            dst: getDirectoryUploadDst(dst, file),\r\n                            file: file,\r\n                            size: file.size,\r\n                            name: file.name,\r\n                            chunkProgress: [],\r\n                            resumed: false,\r\n                        })\r\n                )\r\n            );\r\n        }\r\n    };\r\n\r\n    private onFileDroppedIn = async (e: DragEvent) => {\r\n        const containFile =\r\n            e.dataTransfer && e.dataTransfer.types.includes(\"Files\");\r\n        if (containFile) {\r\n            this.o.onDropLeave && this.o.onDropLeave(e);\r\n            const items = await getAllFileEntries(e.dataTransfer!.items);\r\n            console.log(items);\r\n            const uploaders = await new Promise<Base[]>((resolve) =>\r\n                this.fileSelectCallback(items, this.currentPath, resolve)\r\n            );\r\n            this.o.onDropFileAdded && this.o.onDropFileAdded(uploaders);\r\n        }\r\n    };\r\n}\r\n","import Base, { Status, UploadProgress } from \"./base\";\r\nimport * as utils from \"../utils\";\r\nimport { Task, TaskType } from \"../types\";\r\nimport UploadManager from \"../index\";\r\nimport Logger from \"../logger\";\r\n\r\nexport interface ChunkProgress {\r\n    loaded: number;\r\n    index: number;\r\n    etag?: string;\r\n}\r\n\r\nexport interface ChunkInfo {\r\n    chunk: Blob;\r\n    index: number;\r\n}\r\n\r\nexport default abstract class Chunk extends Base {\r\n    protected chunks: Blob[];\r\n\r\n    public upload = async () => {\r\n        this.logger.info(\"Preparing uploading file chunks.\");\r\n        this.initBeforeUploadChunks();\r\n\r\n        this.logger.info(\"Starting uploading file chunks:\", this.chunks);\r\n        this.updateLocalCache();\r\n        for (let i = 0; i < this.chunks.length; i++) {\r\n            if (\r\n                this.task.chunkProgress[i].loaded < this.chunks[i].size ||\r\n                this.chunks[i].size == 0\r\n            ) {\r\n                await this.uploadChunk({ chunk: this.chunks[i], index: i });\r\n                this.logger.info(`Chunk [${i}] uploaded.`);\r\n                this.updateLocalCache();\r\n            }\r\n        }\r\n    };\r\n\r\n    private initBeforeUploadChunks() {\r\n        this.chunks = utils.getChunks(\r\n            this.task.file,\r\n            this.task.session?.chunkSize\r\n        );\r\n        const cachedInfo = utils.getResumeCtx(this.task, this.logger);\r\n        if (cachedInfo == null) {\r\n            this.task.chunkProgress = this.chunks.map(\r\n                (value, index): ChunkProgress => ({\r\n                    loaded: 0,\r\n                    index,\r\n                })\r\n            );\r\n        }\r\n\r\n        this.notifyResumeProgress();\r\n    }\r\n\r\n    protected abstract async uploadChunk(chunkInfo: ChunkInfo): Promise<any>;\r\n\r\n    protected updateChunkProgress(loaded: number, index: number) {\r\n        this.task.chunkProgress[index].loaded = loaded;\r\n        this.notifyResumeProgress();\r\n    }\r\n\r\n    private notifyResumeProgress() {\r\n        this.progress = {\r\n            total: this.getProgressInfoItem(\r\n                utils.sumChunk(this.task.chunkProgress),\r\n                this.task.file.size + 1\r\n            ),\r\n            chunks: this.chunks.map((chunk, index) => {\r\n                return this.getProgressInfoItem(\r\n                    this.task.chunkProgress[index].loaded,\r\n                    chunk.size,\r\n                    false\r\n                );\r\n            }),\r\n        };\r\n        this.subscriber.onProgress(this.progress);\r\n    }\r\n\r\n    private updateLocalCache() {\r\n        utils.setResumeCtx(this.task, this.logger);\r\n    }\r\n}\r\n","import Chunk, { ChunkInfo } from \"./chunk\";\r\nimport { localUploadChunk } from \"../api\";\r\n\r\nexport default class Local extends Chunk {\r\n    protected async uploadChunk(chunkInfo: ChunkInfo) {\r\n        return localUploadChunk(\r\n            this.task.session?.sessionID!,\r\n            chunkInfo,\r\n            (p) => {\r\n                this.updateChunkProgress(p.loaded, chunkInfo.index);\r\n            },\r\n            this.cancelToken.token\r\n        );\r\n    }\r\n}\r\n","import Chunk, { ChunkInfo } from \"./chunk\";\r\nimport { slaveUploadChunk } from \"../api\";\r\n\r\nexport default class Remote extends Chunk {\r\n    protected async uploadChunk(chunkInfo: ChunkInfo) {\r\n        return slaveUploadChunk(\r\n            `${this.task.session?.uploadURLs[0]!}`,\r\n            this.task.session?.credential!,\r\n            chunkInfo,\r\n            (p) => {\r\n                this.updateChunkProgress(p.loaded, chunkInfo.index);\r\n            },\r\n            this.cancelToken.token\r\n        );\r\n    }\r\n}\r\n","import Chunk, { ChunkInfo } from \"./chunk\";\r\nimport { finishOneDriveUpload, oneDriveUploadChunk } from \"../api\";\r\nimport { OneDriveChunkError, OneDriveEmptyFileSelected } from \"../errors\";\r\nimport { Status } from \"./base\";\r\n\r\nexport default class OneDrive extends Chunk {\r\n    protected async uploadChunk(chunkInfo: ChunkInfo) {\r\n        if (chunkInfo.chunk.size === 0) {\r\n            throw new OneDriveEmptyFileSelected();\r\n        }\r\n\r\n        const rangeEnd = this.progress.total.loaded + chunkInfo.chunk.size - 1;\r\n        return this.sendRange(\r\n            chunkInfo,\r\n            this.progress.total.loaded,\r\n            rangeEnd,\r\n            0\r\n        ).catch((e) => {\r\n            if (\r\n                e instanceof OneDriveChunkError &&\r\n                e.response.error.innererror &&\r\n                e.response.error.innererror.code == \"fragmentOverlap\"\r\n            ) {\r\n                return this.alignChunkOffset(chunkInfo);\r\n            }\r\n\r\n            throw e;\r\n        });\r\n    }\r\n\r\n    private async sendRange(\r\n        chunkInfo: ChunkInfo,\r\n        start: number,\r\n        end: number,\r\n        chunkOffset: number\r\n    ) {\r\n        const range = `bytes ${start}-${end}/${this.task.file.size}`;\r\n        return oneDriveUploadChunk(\r\n            `${this.task.session?.uploadURLs[0]!}`,\r\n            range,\r\n            chunkInfo,\r\n            (p) => {\r\n                this.updateChunkProgress(\r\n                    chunkOffset + p.loaded,\r\n                    chunkInfo.index\r\n                );\r\n            },\r\n            this.cancelToken.token\r\n        );\r\n    }\r\n\r\n    private async alignChunkOffset(chunkInfo: ChunkInfo) {\r\n        this.logger.info(\r\n            `Chunk [${chunkInfo.index}] overlapped, checking next expected range...`\r\n        );\r\n        const rangeStatus = await oneDriveUploadChunk(\r\n            `${this.task.session?.uploadURLs[0]!}`,\r\n            \"\",\r\n            chunkInfo,\r\n            (p) => {\r\n                return null;\r\n            },\r\n            this.cancelToken.token\r\n        );\r\n        const expectedStart = parseInt(\r\n            rangeStatus.nextExpectedRanges[0].split(\"-\")[0]\r\n        );\r\n        this.logger.info(\r\n            `Next expected range start from OneDrive is ${expectedStart}.`\r\n        );\r\n\r\n        if (expectedStart >= this.progress.total.loaded) {\r\n            this.logger.info(`This whole chunk is overlapped, skipping...`);\r\n            this.updateChunkProgress(chunkInfo.chunk.size, chunkInfo.index);\r\n            return;\r\n        } else {\r\n            this.updateChunkProgress(0, chunkInfo.index);\r\n            const rangeEnd =\r\n                this.progress.total.loaded + chunkInfo.chunk.size - 1;\r\n            const newChunkOffset = expectedStart - this.progress.total.loaded;\r\n            chunkInfo.chunk = chunkInfo.chunk.slice(newChunkOffset);\r\n            this.updateChunkProgress(newChunkOffset, chunkInfo.index);\r\n            return this.sendRange(\r\n                chunkInfo,\r\n                expectedStart,\r\n                rangeEnd,\r\n                newChunkOffset\r\n            );\r\n        }\r\n    }\r\n\r\n    protected async afterUpload(): Promise<any> {\r\n        this.logger.info(`Finishing upload...`);\r\n        this.transit(Status.finishing);\r\n        return finishOneDriveUpload(\r\n            this.task.session!.sessionID,\r\n            this.cancelToken.token\r\n        );\r\n    }\r\n}\r\n","import Chunk, { ChunkInfo } from \"./chunk\";\r\nimport { s3LikeFinishUpload, s3LikeUploadChunk } from \"../api\";\r\nimport { Status } from \"./base\";\r\n\r\nexport default class OSS extends Chunk {\r\n    protected async uploadChunk(chunkInfo: ChunkInfo) {\r\n        return s3LikeUploadChunk(\r\n            this.task.session?.uploadURLs[chunkInfo.index]!,\r\n            chunkInfo,\r\n            (p) => {\r\n                this.updateChunkProgress(p.loaded, chunkInfo.index);\r\n            },\r\n            this.cancelToken.token\r\n        );\r\n    }\r\n\r\n    protected async afterUpload(): Promise<any> {\r\n        this.logger.info(`Finishing multipart upload...`);\r\n        this.transit(Status.finishing);\r\n        return s3LikeFinishUpload(\r\n            this.task.session!.completeURL,\r\n            true,\r\n            this.task.chunkProgress,\r\n            this.cancelToken.token\r\n        );\r\n    }\r\n}\r\n","import Chunk, { ChunkInfo } from \"./chunk\";\r\nimport { qiniuDriveUploadChunk, qiniuFinishUpload } from \"../api\";\r\nimport { Status } from \"./base\";\r\n\r\nexport default class Qiniu extends Chunk {\r\n    protected async uploadChunk(chunkInfo: ChunkInfo) {\r\n        const chunkRes = await qiniuDriveUploadChunk(\r\n            this.task.session?.uploadURLs[0]!,\r\n            this.task.session?.credential!,\r\n            chunkInfo,\r\n            (p) => {\r\n                this.updateChunkProgress(p.loaded, chunkInfo.index);\r\n            },\r\n            this.cancelToken.token\r\n        );\r\n\r\n        this.task.chunkProgress[chunkInfo.index].etag = chunkRes.etag;\r\n    }\r\n\r\n    protected async afterUpload(): Promise<any> {\r\n        this.logger.info(`Finishing multipart upload...`);\r\n        this.transit(Status.finishing);\r\n        return qiniuFinishUpload(\r\n            this.task.session?.uploadURLs[0]!,\r\n            this.task.session?.credential!,\r\n            this.task.chunkProgress,\r\n            this.cancelToken.token\r\n        );\r\n    }\r\n}\r\n","import Base, { Status } from \"./base\";\r\nimport { cosFormUploadChunk, cosUploadCallback } from \"../api\";\r\n\r\nexport default class COS extends Base {\r\n    public upload = async () => {\r\n        this.logger.info(\"Starting uploading file stream:\", this.task.file);\r\n        await cosFormUploadChunk(\r\n            this.task.session?.uploadURLs[0]!,\r\n            this.task.file,\r\n            this.task.session?.policy!,\r\n            this.task.session?.path!,\r\n            this.task.session?.callback!,\r\n            this.task.session?.sessionID!,\r\n            this.task.session?.keyTime!,\r\n            this.task.session?.credential!,\r\n            this.task.session?.ak!,\r\n            (p) => {\r\n                this.subscriber.onProgress({\r\n                    total: this.getProgressInfoItem(p.loaded, p.total),\r\n                });\r\n            },\r\n            this.cancelToken.token\r\n        );\r\n    };\r\n\r\n    protected async afterUpload(): Promise<any> {\r\n        this.transit(Status.finishing);\r\n        this.logger.info(`Sending COS upload callback...`);\r\n        try {\r\n            await cosUploadCallback(\r\n                this.task.session!.sessionID,\r\n                this.cancelToken.token\r\n            );\r\n        } catch (e) {\r\n            this.logger.warn(`Failed to finish COS upload:`, e);\r\n        }\r\n    }\r\n}\r\n","import Base from \"./base\";\r\nimport { upyunFormUploadChunk } from \"../api\";\r\n\r\nexport default class Upyun extends Base {\r\n    public upload = async () => {\r\n        this.logger.info(\"Starting uploading file stream:\", this.task.file);\r\n        await upyunFormUploadChunk(\r\n            this.task.session?.uploadURLs[0]!,\r\n            this.task.file,\r\n            this.task.session?.policy!,\r\n            this.task.session?.credential!,\r\n            (p) => {\r\n                this.subscriber.onProgress({\r\n                    total: this.getProgressInfoItem(p.loaded, p.total),\r\n                });\r\n            },\r\n            this.cancelToken.token\r\n        );\r\n    };\r\n}\r\n","import Chunk, { ChunkInfo } from \"./chunk\";\r\nimport {\r\n    s3LikeFinishUpload,\r\n    s3LikeUploadCallback,\r\n    s3LikeUploadChunk,\r\n} from \"../api\";\r\nimport { Status } from \"./base\";\r\n\r\nexport default class OSS extends Chunk {\r\n    protected async uploadChunk(chunkInfo: ChunkInfo) {\r\n        const etag = await s3LikeUploadChunk(\r\n            this.task.session?.uploadURLs[chunkInfo.index]!,\r\n            chunkInfo,\r\n            (p) => {\r\n                this.updateChunkProgress(p.loaded, chunkInfo.index);\r\n            },\r\n            this.cancelToken.token\r\n        );\r\n\r\n        this.task.chunkProgress[chunkInfo.index].etag = etag;\r\n    }\r\n\r\n    protected async afterUpload(): Promise<any> {\r\n        this.logger.info(`Finishing multipart upload...`);\r\n        this.transit(Status.finishing);\r\n        await s3LikeFinishUpload(\r\n            this.task.session!.completeURL,\r\n            false,\r\n            this.task.chunkProgress,\r\n            this.cancelToken.token\r\n        );\r\n\r\n        this.logger.info(`Sending S3-like upload callback...`);\r\n        return s3LikeUploadCallback(\r\n            this.task.session!.sessionID,\r\n            this.cancelToken.token\r\n        );\r\n    }\r\n}\r\n","import Chunk, { ChunkInfo } from \"./chunk\";\r\nimport { qiniuDriveUploadChunk, qiniuFinishUpload } from \"../api\";\r\nimport { Status } from \"./base\";\r\nimport { Task } from \"../types\";\r\nimport UploadManager from \"../index\";\r\nimport * as utils from \"../utils\";\r\n\r\nexport default class ResumeHint extends Chunk {\r\n    constructor(task: Task, manager: UploadManager) {\r\n        super(task, manager);\r\n        this.status = Status.resumable;\r\n        this.progress = {\r\n            total: this.getProgressInfoItem(\r\n                utils.sumChunk(this.task.chunkProgress),\r\n                this.task.size + 1\r\n            ),\r\n        };\r\n        this.subscriber.onProgress(this.progress);\r\n    }\r\n\r\n    protected async uploadChunk(chunkInfo: ChunkInfo) {\r\n        return null;\r\n    }\r\n}\r\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\r\nimport { Badge, CircularProgress, makeStyles } from \"@material-ui/core\";\r\nimport SpeedDial from \"@material-ui/lab/SpeedDial\";\r\nimport SpeedDialIcon from \"@material-ui/lab/SpeedDialIcon\";\r\nimport SpeedDialAction from \"@material-ui/lab/SpeedDialAction\";\r\nimport CreateNewFolderIcon from \"@material-ui/icons/CreateNewFolder\";\r\nimport PublishIcon from \"@material-ui/icons/Publish\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport AutoHidden from \"./AutoHidden\";\r\nimport statusHelper from \"../../utils/page\";\r\nimport Backdrop from \"@material-ui/core/Backdrop\";\r\nimport { FilePlus, FolderUpload } from \"mdi-material-ui\";\r\nimport { green } from \"@material-ui/core/colors\";\r\nimport { SelectType } from \"../Uploader/core\";\r\nimport {\r\n    openCreateFileDialog,\r\n    openCreateFolderDialog,\r\n    toggleSnackbar,\r\n} from \"../../redux/explorer\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n    fab: {\r\n        margin: 0,\r\n        top: \"auto\",\r\n        right: 20,\r\n        bottom: 20,\r\n        left: \"auto\",\r\n        zIndex: 5,\r\n        position: \"fixed\",\r\n    },\r\n    badge: {\r\n        position: \"absolute\",\r\n        bottom: 26,\r\n        top: \"auto\",\r\n        zIndex: 9999,\r\n        right: 7,\r\n    },\r\n    \"@global\": {\r\n        \".MuiSpeedDialAction-staticTooltipLabel\": {\r\n            whiteSpace: \"nowrap\",\r\n        },\r\n    },\r\n    fabProgress: {\r\n        color: green[500],\r\n        position: \"absolute\",\r\n        bottom: -6,\r\n        left: -6,\r\n        zIndex: 1,\r\n    },\r\n    buttonSuccess: {\r\n        backgroundColor: green[500],\r\n        \"&:hover\": {\r\n            backgroundColor: green[700],\r\n        },\r\n    },\r\n}));\r\n\r\nexport default function UploadButton(props) {\r\n    const { t } = useTranslation(\"application\", { keyPrefix: \"fileManager\" });\r\n    const [open, setOpen] = useState(false);\r\n    const [queued, setQueued] = useState(5);\r\n    const path = useSelector((state) => state.navigator.path);\r\n    const classes = useStyles();\r\n    const dispatch = useDispatch();\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n    const OpenNewFolderDialog = useCallback(\r\n        () => dispatch(openCreateFolderDialog()),\r\n        [dispatch]\r\n    );\r\n    const OpenNewFileDialog = useCallback(\r\n        () => dispatch(openCreateFileDialog()),\r\n        [dispatch]\r\n    );\r\n\r\n    useEffect(() => {\r\n        setQueued(props.Queued);\r\n    }, [props.Queued]);\r\n\r\n    const uploadClicked = () => {\r\n        if (open) {\r\n            if (queued !== 0) {\r\n                props.openFileList();\r\n            } else {\r\n                props.selectFile(path);\r\n            }\r\n        }\r\n    };\r\n\r\n    const handleOpen = () => {\r\n        setOpen(true);\r\n    };\r\n\r\n    const handleClose = () => {\r\n        setOpen(false);\r\n    };\r\n\r\n    const circularProgress = useMemo(() => {\r\n        if (props.progress.totalSize > 0) {\r\n            return (\r\n                <CircularProgress\r\n                    key={1}\r\n                    size={68}\r\n                    variant=\"determinate\"\r\n                    value={\r\n                        (props.progress.processedSize /\r\n                            props.progress.totalSize) *\r\n                        100\r\n                    }\r\n                    className={classes.fabProgress}\r\n                />\r\n            );\r\n        }\r\n    }, [classes, props.progress]);\r\n\r\n    return (\r\n        <AutoHidden enable hide={props.taskListOpen}>\r\n            <Badge\r\n                badgeContent={queued}\r\n                classes={{\r\n                    badge: classes.badge, // class name, e.g. `root-x`\r\n                }}\r\n                className={classes.fab}\r\n                invisible={queued === 0}\r\n                color=\"primary\"\r\n            >\r\n                <Backdrop open={open && statusHelper.isMobile()} />\r\n                <SpeedDial\r\n                    hidden={false}\r\n                    tooltipTitle={t(\"uploadFiles\")}\r\n                    icon={\r\n                        <SpeedDialIcon\r\n                            openIcon={\r\n                                !statusHelper.isMobile() && <PublishIcon />\r\n                            }\r\n                        />\r\n                    }\r\n                    onClose={handleClose}\r\n                    FabProps={{\r\n                        onClick: () =>\r\n                            !statusHelper.isMobile() && uploadClicked(),\r\n                        color: \"secondary\",\r\n                    }}\r\n                    onOpen={handleOpen}\r\n                    open={open}\r\n                    ariaLabel={\"\"}\r\n                >\r\n                    {statusHelper.isMobile() && (\r\n                        <SpeedDialAction\r\n                            key=\"UploadFile\"\r\n                            icon={<PublishIcon />}\r\n                            tooltipOpen\r\n                            tooltipTitle={t(\"uploadFiles\")}\r\n                            onClick={() => uploadClicked()}\r\n                            title={t(\"uploadFiles\")}\r\n                        />\r\n                    )}\r\n                    {!statusHelper.isMobile() && (\r\n                        <SpeedDialAction\r\n                            key=\"UploadFolder\"\r\n                            icon={<FolderUpload />}\r\n                            tooltipOpen\r\n                            tooltipTitle={t(\"uploadFolder\")}\r\n                            onClick={() =>\r\n                                props.selectFile(path, SelectType.Directory)\r\n                            }\r\n                            title={t(\"uploadFolder\")}\r\n                        />\r\n                    )}\r\n                    <SpeedDialAction\r\n                        key=\"NewFolder\"\r\n                        icon={<CreateNewFolderIcon />}\r\n                        tooltipOpen\r\n                        tooltipTitle={t(\"newFolder\")}\r\n                        onClick={() => OpenNewFolderDialog()}\r\n                        title={t(\"newFolder\")}\r\n                    />\r\n                    <SpeedDialAction\r\n                        key=\"NewFile\"\r\n                        icon={<FilePlus />}\r\n                        tooltipOpen\r\n                        tooltipTitle={t(\"newFile\")}\r\n                        onClick={() => OpenNewFileDialog()}\r\n                        title={t(\"newFile\")}\r\n                    />\r\n                </SpeedDial>\r\n                {circularProgress}\r\n            </Badge>\r\n        </AutoHidden>\r\n    );\r\n}\r\n","import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/core\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport { sizeToString } from \"../../../utils\";\r\nimport Link from \"@material-ui/core/Link\";\r\nimport TimeAgo from \"timeago-react\";\r\nimport { Status } from \"../core/uploader/base\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    infoTitle: {\r\n        fontWeight: 700,\r\n    },\r\n    infoValue: {\r\n        color: theme.palette.text.secondary,\r\n        wordBreak: \"break-all\",\r\n    },\r\n}));\r\n\r\nexport default function TaskDetail({ uploader, navigateToDst, error }) {\r\n    const { t } = useTranslation();\r\n    const classes = useStyles();\r\n    const items = [\r\n        {\r\n            name: t(\"uploader.fileName\"),\r\n            value: uploader.task.name,\r\n        },\r\n        {\r\n            name: t(\"uploader.fileSize\"),\r\n            value: `${sizeToString(uploader.task.size)} ${\r\n                uploader.task.session && uploader.task.session.chunkSize > 0\r\n                    ? t(\"uploader.chunkDescription\", {\r\n                          total: uploader.task.chunkProgress.length,\r\n                          size: sizeToString(uploader.task.session.chunkSize),\r\n                      })\r\n                    : t(\"uploader.noChunks\")\r\n            }`,\r\n        },\r\n        {\r\n            name: t(\"fileManager.storagePolicy\"),\r\n            value: uploader.task.policy.name,\r\n        },\r\n        {\r\n            name: t(\"uploader.destination\"),\r\n            value: (\r\n                <Link\r\n                    href={\"javascript:void\"}\r\n                    onClick={() => navigateToDst(uploader.task.dst)}\r\n                >\r\n                    {uploader.task.dst === \"/\"\r\n                        ? t(\"uploader.rootFolder\")\r\n                        : uploader.task.dst}\r\n                </Link>\r\n            ),\r\n        },\r\n        uploader.task.session\r\n            ? {\r\n                  name: t(\"uploader.uploadSession\"),\r\n                  value: (\r\n                      <>\r\n                          <Trans\r\n                              i18nKey=\"uploader.sessionExpiredIn\"\r\n                              components={[\r\n                                  <TimeAgo\r\n                                      key={0}\r\n                                      datetime={\r\n                                          uploader.task.session\r\n                                              ? uploader.task.session.expires *\r\n                                                1000\r\n                                              : 0\r\n                                      }\r\n                                      locale={t(\"timeAgoLocaleCode\", {\r\n                                          ns: \"common\",\r\n                                      })}\r\n                                  />,\r\n                              ]}\r\n                          />\r\n                      </>\r\n                  ),\r\n              }\r\n            : null,\r\n        uploader.status === Status.error\r\n            ? {\r\n                  name: t(\"uploader.errorDetails\"),\r\n                  value: error,\r\n              }\r\n            : null,\r\n    ];\r\n    return (\r\n        <Grid container>\r\n            {items.map((i) => (\r\n                <>\r\n                    {i && (\r\n                        <Grid key={i.name} container xs={12}>\r\n                            <Grid item xs={3} className={classes.infoTitle}>\r\n                                {i.name}\r\n                            </Grid>\r\n                            <Grid item xs={9} className={classes.infoValue}>\r\n                                {i.value}\r\n                            </Grid>\r\n                        </Grid>\r\n                    )}\r\n                </>\r\n            ))}\r\n        </Grid>\r\n    );\r\n}\r\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\r\nimport {\r\n    Divider,\r\n    Grow,\r\n    IconButton,\r\n    ListItem,\r\n    ListItemText,\r\n    makeStyles,\r\n    Tooltip,\r\n} from \"@material-ui/core\";\r\nimport TypeIcon from \"../../FileManager/TypeIcon\";\r\nimport { useUpload } from \"../UseUpload\";\r\nimport { Status } from \"../core/uploader/base\";\r\nimport { UploaderError } from \"../core/errors\";\r\nimport { filename, sizeToString } from \"../../../utils\";\r\nimport { darken, lighten } from \"@material-ui/core/styles/colorManipulator\";\r\nimport { useTheme } from \"@material-ui/core/styles\";\r\nimport Chip from \"@material-ui/core/Chip\";\r\nimport DeleteIcon from \"@material-ui/icons/Delete\";\r\nimport RefreshIcon from \"@material-ui/icons/Refresh\";\r\nimport useMediaQuery from \"@material-ui/core/useMediaQuery\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport Link from \"@material-ui/core/Link\";\r\nimport PlayArrow from \"@material-ui/icons/PlayArrow\";\r\nimport withStyles from \"@material-ui/core/styles/withStyles\";\r\nimport MuiExpansionPanel from \"@material-ui/core/ExpansionPanel\";\r\nimport MuiExpansionPanelSummary from \"@material-ui/core/ExpansionPanelSummary\";\r\nimport MuiExpansionPanelDetails from \"@material-ui/core/ExpansionPanelDetails\";\r\nimport TaskDetail from \"./TaskDetail\";\r\nimport { SelectType } from \"../core\";\r\nimport { navigateTo } from \"../../../redux/explorer\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    progressContent: {\r\n        position: \"relative\",\r\n        zIndex: 9,\r\n    },\r\n    progress: {\r\n        transition: \"width .4s linear\",\r\n        zIndex: 1,\r\n        height: \"100%\",\r\n        position: \"absolute\",\r\n        left: 0,\r\n        top: 0,\r\n    },\r\n    progressContainer: {\r\n        position: \"relative\",\r\n    },\r\n    listAction: {\r\n        marginLeft: 20,\r\n        marginRight: 20,\r\n    },\r\n    wordBreak: {\r\n        wordBreak: \"break-all\",\r\n        whiteSpace: \"nowrap\",\r\n        overflow: \"hidden\",\r\n        textOverflow: \"ellipsis\",\r\n    },\r\n    successStatus: {\r\n        color: theme.palette.success.main,\r\n    },\r\n    errorStatus: {\r\n        color: theme.palette.warning.main,\r\n        wordBreak: \"break-all\",\r\n        [theme.breakpoints.up(\"sm\")]: {\r\n            whiteSpace: \"nowrap\",\r\n            overflow: \"hidden\",\r\n            textOverflow: \"ellipsis\",\r\n        },\r\n    },\r\n    disabledBadge: {\r\n        marginLeft: theme.spacing(1),\r\n        height: 18,\r\n    },\r\n    delete: {\r\n        zIndex: 9,\r\n    },\r\n    dstLink: {\r\n        color: theme.palette.success.main,\r\n        fontWeight: 600,\r\n    },\r\n    fileNameContainer: {\r\n        display: \"flex\",\r\n        alignItems: \"center\",\r\n    },\r\n}));\r\n\r\nconst ExpansionPanel = withStyles({\r\n    root: {\r\n        maxWidth: \"100%\",\r\n        boxShadow: \"none\",\r\n        \"&:not(:last-child)\": {\r\n            borderBottom: 0,\r\n        },\r\n        \"&:before\": {\r\n            display: \"none\",\r\n        },\r\n        \"&$expanded\": {\r\n            margin: 0,\r\n        },\r\n    },\r\n    expanded: {},\r\n})(MuiExpansionPanel);\r\n\r\nconst ExpansionPanelSummary = withStyles({\r\n    root: {\r\n        minHeight: 0,\r\n        padding: 0,\r\n        display: \"block\",\r\n        \"&$expanded\": {},\r\n    },\r\n    content: {\r\n        margin: 0,\r\n        display: \"block\",\r\n        \"&$expanded\": {\r\n            margin: \"0\",\r\n        },\r\n    },\r\n    expanded: {},\r\n})(MuiExpansionPanelSummary);\r\n\r\nconst ExpansionPanelDetails = withStyles((theme) => ({\r\n    root: {\r\n        paddingLeft: 16,\r\n        paddingRight: 16,\r\n        paddingTop: 8,\r\n        paddingBottom: 8,\r\n        display: \"block\",\r\n        backgroundColor: theme.palette.background.default,\r\n    },\r\n}))(MuiExpansionPanelDetails);\r\n\r\nconst getSpeedText = (speed, speedAvg, useSpeedAvg) => {\r\n    let displayedSpeed = speedAvg;\r\n    if (!useSpeedAvg) {\r\n        displayedSpeed = speed;\r\n    }\r\n\r\n    return `${sizeToString(displayedSpeed ? displayedSpeed : 0)} /s`;\r\n};\r\n\r\nconst getErrMsg = (error) => {\r\n    let errMsg = error.message;\r\n    if (error instanceof UploaderError) {\r\n        errMsg = error.Message(\"\");\r\n    }\r\n\r\n    return errMsg;\r\n};\r\n\r\nexport default function UploadTask({\r\n    uploader,\r\n    useAvgSpeed,\r\n    onCancel,\r\n    onClose,\r\n    selectFile,\r\n    onRefresh,\r\n}) {\r\n    const { t } = useTranslation(\"application\", { keyPrefix: \"uploader\" });\r\n    const classes = useStyles();\r\n    const theme = useTheme();\r\n    const [taskHover, setTaskHover] = useState(false);\r\n    const [expanded, setExpanded] = useState(false);\r\n    const { status, error, progress, speed, speedAvg, retry } = useUpload(\r\n        uploader\r\n    );\r\n    const fullScreen = useMediaQuery(theme.breakpoints.down(\"sm\"));\r\n    const [loading, setLoading] = useState(false);\r\n    const dispatch = useDispatch();\r\n    const NavigateTo = useCallback((k) => dispatch(navigateTo(k)), [dispatch]);\r\n    const navigateToDst = (path) => {\r\n        onClose(null, \"backdropClick\");\r\n        NavigateTo(path);\r\n    };\r\n\r\n    const toggleDetail = (event, newExpanded) => {\r\n        setExpanded(!!newExpanded);\r\n    };\r\n\r\n    useEffect(() => {\r\n        if (status >= Status.finished) {\r\n            onRefresh();\r\n        }\r\n    }, [status]);\r\n\r\n    const statusText = useMemo(() => {\r\n        const parent = filename(uploader.task.dst);\r\n        switch (status) {\r\n            case Status.added:\r\n            case Status.initialized:\r\n            case Status.queued:\r\n                return <div>{t(\"pendingInQueue\")}</div>;\r\n            case Status.preparing:\r\n                return <div>{t(\"preparing\")}</div>;\r\n            case Status.error:\r\n                return (\r\n                    <div className={classes.errorStatus}>\r\n                        {getErrMsg(error)}\r\n                        <br />\r\n                    </div>\r\n                );\r\n            case Status.finishing:\r\n                return <div>{t(\"processing\")}</div>;\r\n            case Status.resumable:\r\n                return (\r\n                    <div>\r\n                        {t(\"progressDescription\", {\r\n                            uploaded: sizeToString(progress.total.loaded),\r\n                            total: sizeToString(progress.total.size),\r\n                            percentage: progress.total.percent.toFixed(2),\r\n                        })}\r\n                    </div>\r\n                );\r\n            case Status.processing:\r\n                if (progress) {\r\n                    return (\r\n                        <div>\r\n                            {t(\"progressDescriptionFull\", {\r\n                                speed: getSpeedText(\r\n                                    speed,\r\n                                    speedAvg,\r\n                                    useAvgSpeed\r\n                                ),\r\n                                uploaded: sizeToString(progress.total.loaded),\r\n                                total: sizeToString(progress.total.size),\r\n                                percentage: progress.total.percent.toFixed(2),\r\n                            })}\r\n                        </div>\r\n                    );\r\n                }\r\n                return <div>{t(\"progressDescriptionPlaceHolder\")}</div>;\r\n            case Status.finished:\r\n                return (\r\n                    <div className={classes.successStatus}>\r\n                        {t(\"uploadedTo\")}\r\n                        <Tooltip title={uploader.task.dst}>\r\n                            <Link\r\n                                className={classes.dstLink}\r\n                                href={\"javascript:void\"}\r\n                                onClick={() => navigateToDst(uploader.task.dst)}\r\n                            >\r\n                                {parent === \"\" ? t(\"rootFolder\") : parent}\r\n                            </Link>\r\n                        </Tooltip>\r\n                        <br />\r\n                    </div>\r\n                );\r\n            default:\r\n                return <div>{t(\"unknownStatus\")}</div>;\r\n        }\r\n    }, [status, error, progress, speed, speedAvg, useAvgSpeed]);\r\n\r\n    const resumeLabel = useMemo(\r\n        () =>\r\n            uploader.task.resumed && !fullScreen ? (\r\n                <Chip\r\n                    className={classes.disabledBadge}\r\n                    size=\"small\"\r\n                    label={t(\"resumed\")}\r\n                />\r\n            ) : null,\r\n        [status, fullScreen]\r\n    );\r\n\r\n    const continueLabel = useMemo(\r\n        () =>\r\n            status === Status.resumable && !fullScreen ? (\r\n                <Chip\r\n                    className={classes.disabledBadge}\r\n                    size=\"small\"\r\n                    color={\"secondary\"}\r\n                    label={t(\"resumable\")}\r\n                />\r\n            ) : null,\r\n        [status, fullScreen]\r\n    );\r\n\r\n    const progressBar = useMemo(\r\n        () =>\r\n            (status === Status.processing ||\r\n                status === Status.finishing ||\r\n                status === Status.resumable) &&\r\n            progress ? (\r\n                <div\r\n                    style={{\r\n                        backgroundColor:\r\n                            theme.palette.type === \"light\"\r\n                                ? lighten(theme.palette.primary.main, 0.8)\r\n                                : darken(theme.palette.background.paper, 0.2),\r\n                        width: progress.total.percent + \"%\",\r\n                    }}\r\n                    className={classes.progress}\r\n                />\r\n            ) : null,\r\n        [status, progress, theme]\r\n    );\r\n\r\n    const taskDetail = useMemo(() => {\r\n        return (\r\n            <TaskDetail\r\n                error={error && getErrMsg(error)}\r\n                navigateToDst={navigateToDst}\r\n                uploader={uploader}\r\n            />\r\n        );\r\n    }, [uploader, expanded]);\r\n\r\n    const cancel = () => {\r\n        setLoading(true);\r\n        uploader.cancel().then(() => {\r\n            setLoading(false);\r\n            onCancel((u) => u.id != uploader.id);\r\n        });\r\n    };\r\n\r\n    const stopRipple = (e) => {\r\n        e.stopPropagation();\r\n    };\r\n\r\n    const secondaryAction = useMemo(() => {\r\n        if (!taskHover && !fullScreen) {\r\n            return <></>;\r\n        }\r\n\r\n        const actions = [\r\n            {\r\n                show: status === Status.error,\r\n                title: t(\"retry\"),\r\n                click: retry,\r\n                icon: <RefreshIcon />,\r\n                loading: false,\r\n            },\r\n            {\r\n                show: true,\r\n                title:\r\n                    status === Status.finished\r\n                        ? t(\"deleteTask\")\r\n                        : t(\"cancelAndDelete\"),\r\n                click: cancel,\r\n                icon: <DeleteIcon />,\r\n                loading: loading,\r\n            },\r\n            {\r\n                show: status === Status.resumable,\r\n                title: t(\"selectAndResume\"),\r\n                click: () =>\r\n                    selectFile(uploader.task.dst, SelectType.File, uploader),\r\n                icon: <PlayArrow />,\r\n                loading: false,\r\n            },\r\n        ];\r\n\r\n        return (\r\n            <>\r\n                {actions.map((a) => (\r\n                    <>\r\n                        {a.show && (\r\n                            <Grow in={a.show}>\r\n                                <Tooltip title={a.title}>\r\n                                    <IconButton\r\n                                        onMouseDown={stopRipple}\r\n                                        onTouchStart={stopRipple}\r\n                                        disabled={a.loading}\r\n                                        onClick={(e) => {\r\n                                            e.stopPropagation();\r\n                                            a.click();\r\n                                        }}\r\n                                    >\r\n                                        {a.icon}\r\n                                    </IconButton>\r\n                                </Tooltip>\r\n                            </Grow>\r\n                        )}\r\n                    </>\r\n                ))}\r\n            </>\r\n        );\r\n    }, [status, loading, taskHover, fullScreen, uploader]);\r\n\r\n    const fileIcon = useMemo(() => {\r\n        if (!fullScreen) {\r\n            return <TypeIcon fileName={uploader.task.name} isUpload />;\r\n        }\r\n    }, [uploader, fullScreen]);\r\n\r\n    return (\r\n        <>\r\n            <ExpansionPanel square expanded={expanded} onChange={toggleDetail}>\r\n                <ExpansionPanelSummary\r\n                    aria-controls=\"panel1d-content\"\r\n                    id=\"panel1d-header\"\r\n                >\r\n                    <div\r\n                        className={classes.progressContainer}\r\n                        onMouseLeave={() => setTaskHover(false)}\r\n                        onMouseOver={() => setTaskHover(true)}\r\n                    >\r\n                        {progressBar}\r\n                        <ListItem className={classes.progressContent} button>\r\n                            {fileIcon}\r\n                            <ListItemText\r\n                                className={classes.listAction}\r\n                                primary={\r\n                                    <div className={classes.fileNameContainer}>\r\n                                        <div className={classes.wordBreak}>\r\n                                            {uploader.task.name}\r\n                                        </div>\r\n                                        <div>{resumeLabel}</div>\r\n                                        <div>{continueLabel}</div>\r\n                                    </div>\r\n                                }\r\n                                secondary={\r\n                                    <div className={classes.wordBreak}>\r\n                                        {statusText}\r\n                                    </div>\r\n                                }\r\n                            />\r\n                            {secondaryAction}\r\n                        </ListItem>\r\n                    </div>\r\n                </ExpansionPanelSummary>\r\n                <ExpansionPanelDetails>{taskDetail}</ExpansionPanelDetails>\r\n            </ExpansionPanel>\r\n            <Divider />\r\n        </>\r\n    );\r\n}\r\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\n\r\nexport function useUpload(uploader) {\r\n    const startLoadedRef = useRef(0);\r\n    const [status, setStatus] = useState(uploader.status);\r\n    const [error, setError] = useState(uploader.error);\r\n    const [progress, setProgress] = useState(uploader.progress);\r\n    const dispatch = useDispatch();\r\n\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n\r\n    useEffect(() => {\r\n        /* eslint-disable @typescript-eslint/no-empty-function */\r\n        uploader.subscribe({\r\n            onTransition: (newStatus) => {\r\n                setStatus(newStatus);\r\n            },\r\n            onError: (err) => {\r\n                setError(err);\r\n                setStatus(uploader.status);\r\n            },\r\n            onProgress: (data) => {\r\n                setProgress(data);\r\n            },\r\n            onMsg: (msg, color) => {\r\n                ToggleSnackbar(\"top\", \"right\", msg, color);\r\n            },\r\n        });\r\n    }, []);\r\n\r\n    // 获取上传速度\r\n    const [speed, speedAvg] = React.useMemo(() => {\r\n        if (\r\n            progress == null ||\r\n            progress.total == null ||\r\n            progress.total.loaded == null\r\n        )\r\n            return [0, 0];\r\n        const duration = (Date.now() - (uploader.lastTime || 0)) / 1000;\r\n        const durationTotal = (Date.now() - (uploader.startTime || 0)) / 1000;\r\n        const res =\r\n            progress.total.loaded > startLoadedRef.current\r\n                ? Math.floor(\r\n                      (progress.total.loaded - startLoadedRef.current) /\r\n                          duration\r\n                  )\r\n                : 0;\r\n        const resAvg =\r\n            progress.total.loaded > 0\r\n                ? Math.floor(progress.total.loaded / durationTotal)\r\n                : 0;\r\n\r\n        startLoadedRef.current = progress.total.loaded;\r\n        uploader.lastTime = Date.now();\r\n        return [res, resAvg];\r\n    }, [progress]);\r\n\r\n    const retry = () => {\r\n        uploader.reset();\r\n        uploader.start();\r\n    };\r\n\r\n    return { status, error, progress, speed, speedAvg, retry };\r\n}\r\n","import React, { useState } from \"react\";\r\nimport {\r\n    Button,\r\n    Dialog,\r\n    DialogActions,\r\n    DialogContent,\r\n    DialogTitle,\r\n    Input,\r\n    InputLabel,\r\n    makeStyles,\r\n} from \"@material-ui/core\";\r\nimport FormControl from \"@material-ui/core/FormControl\";\r\nimport Auth from \"../../middleware/Auth\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({}));\r\n\r\nexport default function ConcurrentOptionDialog({ open, onClose, onSave }) {\r\n    const { t } = useTranslation();\r\n    const [count, setCount] = useState(\r\n        Auth.GetPreferenceWithDefault(\"concurrent_limit\", \"5\")\r\n    );\r\n    const classes = useStyles();\r\n\r\n    return (\r\n        <Dialog\r\n            fullWidth\r\n            maxWidth={\"xs\"}\r\n            open={open}\r\n            onClose={onClose}\r\n            aria-labelledby=\"form-dialog-title\"\r\n        >\r\n            <DialogTitle id=\"form-dialog-title\">\r\n                {t(\"uploader.setConcurrent\")}\r\n            </DialogTitle>\r\n\r\n            <DialogContent>\r\n                <FormControl fullWidth>\r\n                    <InputLabel htmlFor=\"component-helper\">\r\n                        {t(\"uploader.concurrentTaskNumber\")}\r\n                    </InputLabel>\r\n                    <Input\r\n                        type={\"number\"}\r\n                        inputProps={{\r\n                            min: 1,\r\n                            step: 1,\r\n                            max: 20,\r\n                        }}\r\n                        value={count}\r\n                        onChange={(e) => setCount(e.target.value)}\r\n                    />\r\n                </FormControl>\r\n            </DialogContent>\r\n\r\n            <DialogActions>\r\n                <Button onClick={onClose}>\r\n                    {t(\"cancel\", { ns: \"common\" })}\r\n                </Button>\r\n                <div className={classes.wrapper}>\r\n                    <Button\r\n                        color=\"primary\"\r\n                        disabled={count === \"\"}\r\n                        onClick={() => onSave(count)}\r\n                    >\r\n                        {t(\"ok\", { ns: \"common\" })}\r\n                    </Button>\r\n                </div>\r\n            </DialogActions>\r\n        </Dialog>\r\n    );\r\n}\r\n","import {\r\n    Icon,\r\n    ListItemIcon,\r\n    makeStyles,\r\n    Menu,\r\n    MenuItem,\r\n    Tooltip,\r\n} from \"@material-ui/core\";\r\nimport React, { useCallback, useMemo, useState } from \"react\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport API from \"../../../middleware/Api\";\r\nimport { TaskType } from \"../core/types\";\r\nimport { refreshStorage, toggleSnackbar } from \"../../../redux/explorer\";\r\nimport Divider from \"@material-ui/core/Divider\";\r\nimport CheckIcon from \"@material-ui/icons/Check\";\r\nimport { DeleteEmpty } from \"mdi-material-ui\";\r\nimport DeleteIcon from \"@material-ui/icons/Delete\";\r\nimport ConcurrentOptionDialog from \"../../Modals/ConcurrentOption\";\r\nimport Auth from \"../../../middleware/Auth\";\r\nimport { ClearAll } from \"@material-ui/icons\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    icon: {\r\n        minWidth: 38,\r\n    },\r\n}));\r\n\r\nexport default function MoreActions({\r\n    anchorEl,\r\n    onClose,\r\n    uploadManager,\r\n    deleteTask,\r\n    useAvgSpeed,\r\n    setUseAvgSpeed,\r\n    filter,\r\n    setFilter,\r\n    sorter,\r\n    setSorter,\r\n    cleanFinished,\r\n}) {\r\n    const { t } = useTranslation(\"application\", { keyPrefix: \"uploader\" });\r\n    const classes = useStyles();\r\n    const dispatch = useDispatch();\r\n    const [concurrentDialog, setConcurrentDialog] = useState(false);\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n    const RefreshStorage = useCallback(() => dispatch(refreshStorage()), [\r\n        dispatch,\r\n    ]);\r\n\r\n    const actionClicked = (next) => () => {\r\n        onClose();\r\n        next();\r\n    };\r\n\r\n    const cleanupSessions = () => {\r\n        uploadManager.cleanupSessions();\r\n        API.delete(\"/file/upload\")\r\n            .then((response) => {\r\n                if (response.rawData.code === 0) {\r\n                    ToggleSnackbar(\r\n                        \"top\",\r\n                        \"right\",\r\n                        t(\"uploadSessionCleaned\"),\r\n                        \"success\"\r\n                    );\r\n                } else {\r\n                    ToggleSnackbar(\r\n                        \"top\",\r\n                        \"right\",\r\n                        response.rawData.msg,\r\n                        \"warning\"\r\n                    );\r\n                }\r\n                deleteTask((u) => u.task.type !== TaskType.resumeHint);\r\n                RefreshStorage();\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n            });\r\n    };\r\n\r\n    const open = Boolean(anchorEl);\r\n    const id = open ? \"uploader-action-popover\" : undefined;\r\n\r\n    const listItems = useMemo(\r\n        () => [\r\n            {\r\n                tooltip: t(\"hideCompletedTooltip\"),\r\n                onClick: () =>\r\n                    setFilter(filter === \"default\" ? \"ongoing\" : \"default\"),\r\n                icon: filter !== \"default\" ? <CheckIcon /> : <Icon />,\r\n                text: t(\"hideCompleted\"),\r\n                divider: true,\r\n            },\r\n            {\r\n                tooltip: t(\"addTimeAscTooltip\"),\r\n                onClick: () => setSorter(\"default\"),\r\n                icon: sorter === \"default\" ? <CheckIcon /> : <Icon />,\r\n                text: t(\"addTimeAsc\"),\r\n                divider: false,\r\n            },\r\n            {\r\n                tooltip: t(\"addTimeDescTooltip\"),\r\n                onClick: () => setSorter(\"reverse\"),\r\n                icon: sorter === \"reverse\" ? <CheckIcon /> : <Icon />,\r\n                text: t(\"addTimeDesc\"),\r\n                divider: true,\r\n            },\r\n            {\r\n                tooltip: t(\"showInstantSpeedTooltip\"),\r\n                onClick: () => setUseAvgSpeed(false),\r\n                icon: useAvgSpeed ? <Icon /> : <CheckIcon />,\r\n                text: t(\"showInstantSpeed\"),\r\n                divider: false,\r\n            },\r\n            {\r\n                tooltip: t(\"showAvgSpeedTooltip\"),\r\n                onClick: () => setUseAvgSpeed(true),\r\n                icon: !useAvgSpeed ? <Icon /> : <CheckIcon />,\r\n                text: t(\"showAvgSpeed\"),\r\n                divider: true,\r\n            },\r\n            {\r\n                tooltip: t(\"cleanAllSessionTooltip\"),\r\n                onClick: () => cleanupSessions(),\r\n                icon: <DeleteEmpty />,\r\n                text: t(\"cleanAllSession\"),\r\n                divider: false,\r\n            },\r\n            {\r\n                tooltip: t(\"cleanCompletedTooltip\"),\r\n                onClick: () => cleanFinished(),\r\n                icon: <DeleteIcon />,\r\n                text: t(\"cleanCompleted\"),\r\n                divider: true,\r\n            },\r\n            {\r\n                tooltip: t(\"setConcurrentTooltip\"),\r\n                onClick: () => setConcurrentDialog(true),\r\n                icon: <ClearAll />,\r\n                text: t(\"setConcurrent\"),\r\n                divider: false,\r\n            },\r\n        ],\r\n        [\r\n            useAvgSpeed,\r\n            setUseAvgSpeed,\r\n            sorter,\r\n            setSorter,\r\n            filter,\r\n            setFilter,\r\n            cleanFinished,\r\n        ]\r\n    );\r\n\r\n    const onConcurrentLimitSave = (val) => {\r\n        val = parseInt(val);\r\n        if (val > 0) {\r\n            Auth.SetPreference(\"concurrent_limit\", val);\r\n            uploadManager.changeConcurrentLimit(parseInt(val));\r\n        }\r\n        setConcurrentDialog(false);\r\n    };\r\n\r\n    return (\r\n        <>\r\n            <Menu id={id} open={open} anchorEl={anchorEl} onClose={onClose}>\r\n                {listItems.map((item) => (\r\n                    <>\r\n                        <Tooltip\r\n                            enterNextDelay={500}\r\n                            key={item.text}\r\n                            title={item.tooltip}\r\n                        >\r\n                            <MenuItem\r\n                                dense\r\n                                onClick={actionClicked(item.onClick)}\r\n                            >\r\n                                <ListItemIcon className={classes.icon}>\r\n                                    {item.icon}\r\n                                </ListItemIcon>\r\n                                {item.text}\r\n                            </MenuItem>\r\n                        </Tooltip>\r\n                        {item.divider && <Divider />}\r\n                    </>\r\n                ))}\r\n            </Menu>\r\n            <ConcurrentOptionDialog\r\n                open={concurrentDialog}\r\n                onClose={() => setConcurrentDialog(false)}\r\n                onSave={onConcurrentLimitSave}\r\n            />\r\n        </>\r\n    );\r\n}\r\n","import React, { useMemo, useState } from \"react\";\r\nimport {\r\n    Accordion,\r\n    AccordionDetails,\r\n    AppBar,\r\n    Dialog,\r\n    DialogContent,\r\n    Fade,\r\n    IconButton,\r\n    makeStyles,\r\n    Slide,\r\n    Toolbar,\r\n    Tooltip,\r\n    Typography,\r\n} from \"@material-ui/core\";\r\nimport { useTheme } from \"@material-ui/core/styles\";\r\nimport useMediaQuery from \"@material-ui/core/useMediaQuery\";\r\nimport CloseIcon from \"@material-ui/icons/Close\";\r\nimport ExpandMoreIcon from \"@material-ui/icons/ExpandLess\";\r\nimport AddIcon from \"@material-ui/icons/Add\";\r\nimport classnames from \"classnames\";\r\nimport UploadTask from \"./UploadTask\";\r\nimport { MoreHoriz } from \"@material-ui/icons\";\r\nimport MoreActions from \"./MoreActions\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { Virtuoso } from \"react-virtuoso\";\r\nimport Nothing from \"../../Placeholder/Nothing\";\r\nimport { lighten } from \"@material-ui/core/styles/colorManipulator\";\r\nimport { Status } from \"../core/uploader/base\";\r\nimport Auth from \"../../../middleware/Auth\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst Transition = React.forwardRef(function Transition(props, ref) {\r\n    return <Slide direction=\"up\" ref={ref} {...props} />;\r\n});\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    rootOverwrite: {\r\n        top: \"auto!important\",\r\n        left: \"auto!important\",\r\n    },\r\n    appBar: {\r\n        position: \"relative\",\r\n    },\r\n    flex: {\r\n        flex: 1,\r\n    },\r\n    popup: {\r\n        alignItems: \"flex-end\",\r\n        justifyContent: \"flex-end\",\r\n    },\r\n    dialog: {\r\n        margin: 0,\r\n        right: 10,\r\n        bottom: 10,\r\n        zIndex: 9999,\r\n        position: \"fixed\",\r\n        inset: \"-1!important\",\r\n    },\r\n    paddingZero: {\r\n        padding: 0,\r\n    },\r\n    dialogContent: {\r\n        [theme.breakpoints.up(\"md\")]: {\r\n            width: 500,\r\n            minHeight: 300,\r\n            maxHeight: \"calc(100vh - 140px)\",\r\n        },\r\n        padding: 0,\r\n        paddingTop: \"0!important\",\r\n    },\r\n    virtualList: {\r\n        height: \"100%\",\r\n        maxHeight: \"calc(100vh - 56px)\",\r\n        [theme.breakpoints.up(\"md\")]: {\r\n            minHeight: 300,\r\n            maxHeight: \"calc(100vh - 140px)\",\r\n        },\r\n    },\r\n    expandIcon: {\r\n        transform: \"rotate(0deg)\",\r\n        transition: theme.transitions.create(\"transform\", {\r\n            duration: theme.transitions.duration.shortest,\r\n        }),\r\n    },\r\n    expandIconExpanded: {\r\n        transform: \"rotate(180deg)\",\r\n    },\r\n    toolbar: {\r\n        paddingLeft: theme.spacing(1),\r\n        paddingRight: theme.spacing(1),\r\n    },\r\n    progress: {\r\n        transition: \"width .4s linear\",\r\n        zIndex: -1,\r\n        height: \"100%\",\r\n        position: \"absolute\",\r\n        left: 0,\r\n        top: 0,\r\n    },\r\n}));\r\n\r\nconst sorters = {\r\n    default: (a, b) => a.id - b.id,\r\n    reverse: (a, b) => b.id - a.id,\r\n};\r\n\r\nconst filters = {\r\n    default: (u) => true,\r\n    ongoing: (u) => u.status < Status.finished,\r\n};\r\n\r\nexport default function TaskList({\r\n    open,\r\n    onClose,\r\n    selectFile,\r\n    taskList,\r\n    onCancel,\r\n    uploadManager,\r\n    progress,\r\n    setUploaders,\r\n}) {\r\n    const { t } = useTranslation(\"application\", { keyPrefix: \"uploader\" });\r\n    const classes = useStyles();\r\n    const theme = useTheme();\r\n    const fullScreen = useMediaQuery(theme.breakpoints.down(\"sm\"));\r\n    const path = useSelector((state) => state.navigator.path);\r\n    const [expanded, setExpanded] = useState(true);\r\n    const [useAvgSpeed, setUseAvgSpeed] = useState(\r\n        Auth.GetPreferenceWithDefault(\"use_avg_speed\", true)\r\n    );\r\n    const [anchorEl, setAnchorEl] = useState(null);\r\n    const [filter, setFilter] = useState(\r\n        Auth.GetPreferenceWithDefault(\"task_filter\", \"default\")\r\n    );\r\n    const [sorter, setSorter] = useState(\r\n        Auth.GetPreferenceWithDefault(\"task_sorter\", \"default\")\r\n    );\r\n    const [refreshList, setRefreshList] = useState(false);\r\n\r\n    const handleActionClick = (event) => {\r\n        setAnchorEl(event.currentTarget);\r\n    };\r\n\r\n    const handleActionClose = () => {\r\n        setAnchorEl(null);\r\n    };\r\n\r\n    const close = (e, reason) => {\r\n        if (reason !== \"backdropClick\") {\r\n            onClose();\r\n        } else {\r\n            setExpanded(false);\r\n        }\r\n    };\r\n    const handlePanelChange = (event, isExpanded) => {\r\n        setExpanded(isExpanded);\r\n    };\r\n\r\n    useMemo(() => {\r\n        if (open) {\r\n            setExpanded(true);\r\n        }\r\n    }, [taskList]);\r\n\r\n    const progressBar = useMemo(\r\n        () =>\r\n            progress.totalSize > 0 ? (\r\n                <Fade in={progress.totalSize > 0 && !expanded}>\r\n                    <div>\r\n                        <div\r\n                            style={{\r\n                                backgroundColor:\r\n                                    theme.palette.type === \"light\"\r\n                                        ? lighten(\r\n                                              theme.palette.primary.main,\r\n                                              0.2\r\n                                          )\r\n                                        : lighten(\r\n                                              theme.palette.primary.main,\r\n                                              0.2\r\n                                          ),\r\n                                width:\r\n                                    (progress.processedSize /\r\n                                        progress.totalSize) *\r\n                                        100 +\r\n                                    \"%\",\r\n                            }}\r\n                            className={classes.progress}\r\n                        />\r\n                    </div>\r\n                </Fade>\r\n            ) : null,\r\n        [progress, expanded, classes, theme]\r\n    );\r\n\r\n    const list = useMemo(() => {\r\n        const currentList = taskList\r\n            .filter(filters[filter])\r\n            .sort(sorters[sorter]);\r\n        if (currentList.length === 0) {\r\n            return <Nothing size={0.5} top={63} primary={t(\"taskListEmpty\")} />;\r\n        }\r\n\r\n        return (\r\n            <Virtuoso\r\n                style={{\r\n                    height: (fullScreen ? 500 : 73) * currentList.length,\r\n                }}\r\n                className={classes.virtualList}\r\n                increaseViewportBy={180}\r\n                data={currentList}\r\n                itemContent={(index, uploader) => (\r\n                    <UploadTask\r\n                        selectFile={selectFile}\r\n                        onClose={close}\r\n                        onCancel={onCancel}\r\n                        key={uploader.id}\r\n                        useAvgSpeed={useAvgSpeed}\r\n                        uploader={uploader}\r\n                        filter={filters[filter]}\r\n                        onRefresh={() => setRefreshList((r) => !r)}\r\n                    />\r\n                )}\r\n            />\r\n        );\r\n    }, [\r\n        classes,\r\n        taskList,\r\n        useAvgSpeed,\r\n        fullScreen,\r\n        filter,\r\n        sorter,\r\n        refreshList,\r\n    ]);\r\n\r\n    return (\r\n        <>\r\n            <MoreActions\r\n                deleteTask={onCancel}\r\n                onClose={handleActionClose}\r\n                uploadManager={uploadManager}\r\n                anchorEl={anchorEl}\r\n                useAvgSpeed={useAvgSpeed}\r\n                setUseAvgSpeed={(v) => {\r\n                    Auth.SetPreference(\"use_avg_speed\", v);\r\n                    setUseAvgSpeed(v);\r\n                }}\r\n                filter={filter}\r\n                sorter={sorter}\r\n                setFilter={(v) => {\r\n                    Auth.SetPreference(\"task_filter\", v);\r\n                    setFilter(v);\r\n                }}\r\n                setSorter={(v) => {\r\n                    Auth.SetPreference(\"task_sorter\", v);\r\n                    setSorter(v);\r\n                }}\r\n                cleanFinished={() =>\r\n                    setUploaders((u) => u.filter(filters[\"ongoing\"]))\r\n                }\r\n            />\r\n            <Dialog\r\n                classes={{\r\n                    container: classes.popup, // class name, e.g. `classes-nesting-root-x`\r\n                    root: classnames({\r\n                        [classes.rootOverwrite]: !fullScreen,\r\n                    }),\r\n                }}\r\n                className={classnames({\r\n                    [classes.dialog]: !fullScreen,\r\n                })}\r\n                fullScreen={fullScreen}\r\n                open={open}\r\n                onClose={close}\r\n                TransitionComponent={Transition}\r\n                disableEnforceFocus={!expanded}\r\n                hideBackdrop={!expanded}\r\n                disableBackdropClick={!expanded}\r\n                disableScrollLock={!expanded}\r\n            >\r\n                <Accordion\r\n                    expanded={expanded || fullScreen}\r\n                    onChange={handlePanelChange}\r\n                >\r\n                    <AppBar className={classes.appBar}>\r\n                        {progressBar}\r\n                        <Toolbar disableGutters className={classes.toolbar}>\r\n                            <Tooltip title={t(\"hideTaskList\")}>\r\n                                <IconButton\r\n                                    color=\"inherit\"\r\n                                    onClick={close}\r\n                                    aria-label=\"Close\"\r\n                                >\r\n                                    <CloseIcon />\r\n                                </IconButton>\r\n                            </Tooltip>\r\n                            <Typography\r\n                                variant=\"h6\"\r\n                                color=\"inherit\"\r\n                                className={classes.flex}\r\n                            >\r\n                                {t(\"uploadTasks\")}\r\n                            </Typography>\r\n                            <Tooltip title={t(\"moreActions\")}>\r\n                                <IconButton\r\n                                    color=\"inherit\"\r\n                                    onClick={handleActionClick}\r\n                                >\r\n                                    <MoreHoriz />\r\n                                </IconButton>\r\n                            </Tooltip>\r\n                            <Tooltip title={t(\"addNewFiles\")}>\r\n                                <IconButton\r\n                                    color=\"inherit\"\r\n                                    onClick={() => selectFile(path)}\r\n                                >\r\n                                    <AddIcon />\r\n                                </IconButton>\r\n                            </Tooltip>\r\n                            {!fullScreen && (\r\n                                <Tooltip title={t(\"toggleTaskList\")}>\r\n                                    <IconButton\r\n                                        color=\"inherit\"\r\n                                        onClick={() => setExpanded(!expanded)}\r\n                                    >\r\n                                        <ExpandMoreIcon\r\n                                            className={classnames({\r\n                                                [classes.expandIconExpanded]: expanded,\r\n                                                [classes.expandIcon]: true,\r\n                                            })}\r\n                                        />\r\n                                    </IconButton>\r\n                                </Tooltip>\r\n                            )}\r\n                        </Toolbar>\r\n                    </AppBar>\r\n                    <AccordionDetails className={classes.paddingZero}>\r\n                        <DialogContent className={classes.dialogContent}>\r\n                            {list}\r\n                        </DialogContent>\r\n                    </AccordionDetails>\r\n                </Accordion>\r\n            </Dialog>\r\n        </>\r\n    );\r\n}\r\n","import React from \"react\";\r\nimport Backdrop from \"@material-ui/core/Backdrop\";\r\nimport { createStyles, makeStyles } from \"@material-ui/core/styles\";\r\nimport UploadIcon from \"@material-ui/icons/CloudUpload\";\r\nimport { Typography } from \"@material-ui/core\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) =>\r\n    createStyles({\r\n        backdrop: {\r\n            zIndex: theme.zIndex.drawer + 1,\r\n            color: \"#fff\",\r\n            flexDirection: \"column\",\r\n        },\r\n    })\r\n);\r\n\r\nexport function DropFileBackground({ open }) {\r\n    const classes = useStyles();\r\n    const { t } = useTranslation();\r\n    return (\r\n        <Backdrop className={classes.backdrop} open={open}>\r\n            <div>\r\n                <UploadIcon style={{ fontSize: 80 }} />\r\n            </div>\r\n            <div>\r\n                <Typography variant={\"h4\"}>\r\n                    {t(\"uploader.dropFileHere\")}\r\n                </Typography>\r\n            </div>\r\n        </Backdrop>\r\n    );\r\n}\r\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\r\nimport UploadManager, { SelectType } from \"./core\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport UploadButton from \"../Dial/Create\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport { useLocation } from \"react-router-dom\";\r\nimport { UploaderError } from \"./core/errors\";\r\nimport TaskList from \"./Popup/TaskList\";\r\nimport { Status } from \"./core/uploader/base\";\r\nimport { DropFileBackground } from \"../Placeholder/DropFile\";\r\nimport {\r\n    refreshFileList,\r\n    refreshStorage,\r\n    toggleSnackbar,\r\n} from \"../../redux/explorer\";\r\nimport Auth from \"../../middleware/Auth\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nlet totalProgressCollector = null;\r\nlet lastProgressStart = -1;\r\nlet dragCounter = 0;\r\n\r\nexport default function Uploader() {\r\n    const { t } = useTranslation(\"application\", { keyPrefix: \"uploader\" });\r\n    const [uploaders, setUploaders] = useState([]);\r\n    const [taskListOpen, setTaskListOpen] = useState(false);\r\n    const [dropBgOpen, setDropBgOpen] = useState(0);\r\n    const [totalProgress, setTotalProgress] = useState({\r\n        totalSize: 0,\r\n        processedSize: 0,\r\n        total: 0,\r\n        processed: 0,\r\n    });\r\n    const search = useSelector((state) => state.explorer.search);\r\n    const policy = useSelector((state) => state.explorer.currentPolicy);\r\n    const isLogin = useSelector((state) => state.viewUpdate.isLogin);\r\n    const path = useSelector((state) => state.navigator.path);\r\n    const fileSelectCounter = useSelector(\r\n        (state) => state.viewUpdate.openFileSelector\r\n    );\r\n    const folderSelectCounter = useSelector(\r\n        (state) => state.viewUpdate.openFolderSelector\r\n    );\r\n    const location = useLocation();\r\n    const dispatch = useDispatch();\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n    const RefreshFileList = useCallback(() => dispatch(refreshFileList()), [\r\n        dispatch,\r\n    ]);\r\n    const RefreshStorage = useCallback(() => dispatch(refreshStorage()), [\r\n        dispatch,\r\n    ]);\r\n\r\n    const enableUploader = useMemo(\r\n        () => pathHelper.isHomePage(location.pathname) && isLogin && !search,\r\n        [location.pathname, isLogin, search]\r\n    );\r\n\r\n    const taskAdded = (original = null) => (tasks) => {\r\n        if (original !== null) {\r\n            if (tasks.length !== 1 || tasks[0].key() !== original.key()) {\r\n                ToggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    t(\"fileNotMatchError\"),\r\n                    \"warning\"\r\n                );\r\n                return;\r\n            }\r\n        }\r\n\r\n        tasks.forEach((t) => t.start());\r\n\r\n        setTaskListOpen(true);\r\n        setUploaders((uploaders) => {\r\n            if (original !== null) {\r\n                uploaders = uploaders.filter((u) => u.key() !== original.key());\r\n            }\r\n\r\n            return [...uploaders, ...tasks];\r\n        });\r\n    };\r\n\r\n    const uploadManager = useMemo(() => {\r\n        return new UploadManager({\r\n            logLevel: \"INFO\",\r\n            concurrentLimit: parseInt(\r\n                Auth.GetPreferenceWithDefault(\"concurrent_limit\", \"5\")\r\n            ),\r\n            dropZone: document.querySelector(\"body\"),\r\n            onToast: (type, msg) => {\r\n                ToggleSnackbar(\"top\", \"right\", msg, type);\r\n            },\r\n            onDropOver: (e) => {\r\n                dragCounter++;\r\n                setDropBgOpen((value) => !value);\r\n            },\r\n            onDropLeave: (e) => {\r\n                dragCounter--;\r\n                setDropBgOpen((value) => !value);\r\n            },\r\n            onDropFileAdded: taskAdded(),\r\n        });\r\n    }, []);\r\n\r\n    useEffect(() => {\r\n        uploadManager.setPolicy(policy, path);\r\n    }, [policy]);\r\n\r\n    useEffect(() => {\r\n        const unfinished = uploadManager.resumeTasks();\r\n        setUploaders((uploaders) => [...uploaders, ...unfinished]);\r\n        if (!totalProgressCollector) {\r\n            totalProgressCollector = setInterval(() => {\r\n                const progress = {\r\n                    totalSize: 0,\r\n                    processedSize: 0,\r\n                    total: 0,\r\n                    processed: 0,\r\n                };\r\n                setUploaders((uploaders) => {\r\n                    uploaders.forEach((u) => {\r\n                        if (u.id <= lastProgressStart) {\r\n                            return;\r\n                        }\r\n\r\n                        progress.totalSize += u.task.size;\r\n                        progress.total += 1;\r\n\r\n                        if (\r\n                            u.status === Status.finished ||\r\n                            u.status === Status.canceled ||\r\n                            u.status === Status.error\r\n                        ) {\r\n                            progress.processedSize += u.task.size;\r\n                            progress.processed += 1;\r\n                        }\r\n\r\n                        if (\r\n                            u.status === Status.added ||\r\n                            u.status === Status.initialized ||\r\n                            u.status === Status.queued ||\r\n                            u.status === Status.preparing ||\r\n                            u.status === Status.processing ||\r\n                            u.status === Status.finishing\r\n                        ) {\r\n                            progress.processedSize += u.progress\r\n                                ? u.progress.total.loaded\r\n                                : 0;\r\n                        }\r\n                    });\r\n\r\n                    if (\r\n                        progress.total > 0 &&\r\n                        progress.processed === progress.total\r\n                    ) {\r\n                        lastProgressStart = uploaders[uploaders.length - 1].id;\r\n                    }\r\n                    return uploaders;\r\n                });\r\n\r\n                if (\r\n                    progress.total > 0 &&\r\n                    progress.total === progress.processed\r\n                ) {\r\n                    RefreshFileList();\r\n                    RefreshStorage();\r\n                }\r\n\r\n                setTotalProgress(progress);\r\n            }, 2000);\r\n        }\r\n    }, []);\r\n\r\n    const selectFile = (path, type = SelectType.File, original = null) => {\r\n        setTaskListOpen(true);\r\n\r\n        // eslint-disable-next-line no-unreachable\r\n        uploadManager\r\n            .select(path, type)\r\n            .then(taskAdded(original))\r\n            .catch((e) => {\r\n                if (e instanceof UploaderError) {\r\n                    ToggleSnackbar(\"top\", \"right\", e.Message(), \"warning\");\r\n                } else {\r\n                    ToggleSnackbar(\r\n                        \"top\",\r\n                        \"right\",\r\n                        t(\"unknownError\", { msg: e.message }),\r\n                        \"error\"\r\n                    );\r\n                }\r\n            });\r\n    };\r\n\r\n    useEffect(() => {\r\n        if (fileSelectCounter > 0) {\r\n            selectFile(path);\r\n        }\r\n    }, [fileSelectCounter]);\r\n\r\n    useEffect(() => {\r\n        if (folderSelectCounter > 0) {\r\n            selectFile(path, SelectType.Directory);\r\n        }\r\n    }, [folderSelectCounter]);\r\n\r\n    const deleteTask = (filter) => {\r\n        setUploaders((uploaders) => uploaders.filter(filter));\r\n    };\r\n\r\n    return (\r\n        <>\r\n            {enableUploader && (\r\n                <>\r\n                    <DropFileBackground open={dropBgOpen > 0} />\r\n                    <UploadButton\r\n                        progress={totalProgress}\r\n                        taskListOpen={taskListOpen}\r\n                        selectFile={selectFile}\r\n                        Queued={uploaders.length}\r\n                        openFileList={() => setTaskListOpen(true)}\r\n                    />\r\n                    <TaskList\r\n                        progress={totalProgress}\r\n                        uploadManager={uploadManager}\r\n                        taskList={uploaders}\r\n                        open={taskListOpen}\r\n                        onCancel={deleteTask}\r\n                        selectFile={selectFile}\r\n                        onClose={() => setTaskListOpen(false)}\r\n                        setUploaders={setUploaders}\r\n                    />\r\n                </>\r\n            )}\r\n        </>\r\n    );\r\n}\r\n","import i18next from \"./i18n\";\r\n\r\nexport const imgPreviewSuffix = [\r\n    \"bmp\",\r\n    \"png\",\r\n    \"gif\",\r\n    \"jpg\",\r\n    \"jpeg\",\r\n    \"svg\",\r\n    \"webp\",\r\n];\r\nexport const msDocPreviewSuffix = [\r\n    \"ppt\",\r\n    \"pptx\",\r\n    \"pps\",\r\n    \"doc\",\r\n    \"docx\",\r\n    \"xlsx\",\r\n    \"xls\",\r\n];\r\nexport const subtitleSuffix = [\"ass\", \"srt\", \"vrr\"];\r\nexport const audioPreviewSuffix = [\"mp3\", \"ogg\", \"wav\", \"flac\", \"m4a\"];\r\nexport const videoPreviewSuffix = [\"mp4\", \"mkv\", \"webm\", \"avi\", \"m3u8\", \"mov\"];\r\nexport const pdfPreviewSuffix = [\"pdf\"];\r\nexport const editSuffix = [\"md\", \"txt\"];\r\nexport const epubSuffix = [\"epub\"];\r\nexport const codePreviewSuffix = {\r\n    json: \"json\",\r\n    php: \"php\",\r\n    py: \"python\",\r\n    bat: \"bat\",\r\n    cpp: \"cpp\",\r\n    c: \"cpp\",\r\n    h: \"cpp\",\r\n    cs: \"csharp\",\r\n    css: \"css\",\r\n    dockerfile: \"dockerfile\",\r\n    go: \"go\",\r\n    html: \"html\",\r\n    ini: \"ini\",\r\n    java: \"java\",\r\n    js: \"javascript\",\r\n    jsx: \"javascript\",\r\n    less: \"less\",\r\n    lua: \"lua\",\r\n    sh: \"shell\",\r\n    sql: \"sql\",\r\n    xml: \"xml\",\r\n    yaml: \"yaml\",\r\n};\r\nexport const mediaType = {\r\n    audio: [\"mp3\", \"flac\", \"ape\", \"wav\", \"acc\", \"ogg\", \"m4a\"],\r\n    video: [\"mp4\", \"flv\", \"avi\", \"wmv\", \"mkv\", \"rm\", \"rmvb\", \"mov\", \"ogv\"],\r\n    image: [\"bmp\", \"iff\", \"png\", \"gif\", \"jpg\", \"jpeg\", \"psd\", \"svg\", \"webp\"],\r\n    pdf: [\"pdf\"],\r\n    word: [\"doc\", \"docx\"],\r\n    ppt: [\"ppt\", \"pptx\"],\r\n    excel: [\"xls\", \"xlsx\", \"csv\"],\r\n    text: [\"txt\", \"md\", \"html\"],\r\n    torrent: [\"torrent\"],\r\n    zip: [\"zip\", \"gz\", \"xz\", \"tar\", \"rar\", \"7z\"],\r\n    excute: [\"exe\"],\r\n    android: [\"apk\"],\r\n    php: [\"php\"],\r\n    go: [\"go\"],\r\n    python: [\"py\"],\r\n    cpp: [\"cpp\"],\r\n    c: [\"c\"],\r\n    js: [\"js\", \"jsx\"],\r\n    epub: epubSuffix,\r\n};\r\nexport const isPreviewable = (name: any) => {\r\n    const suffix = name.split(\".\").pop().toLowerCase();\r\n    if (imgPreviewSuffix.indexOf(suffix) !== -1) {\r\n        return \"img\";\r\n    } else if (msDocPreviewSuffix.indexOf(suffix) !== -1) {\r\n        return \"msDoc\";\r\n    } else if (audioPreviewSuffix.indexOf(suffix) !== -1) {\r\n        return \"audio\";\r\n    } else if (videoPreviewSuffix.indexOf(suffix) !== -1) {\r\n        return \"video\";\r\n    } else if (editSuffix.indexOf(suffix) !== -1) {\r\n        return \"edit\";\r\n    } else if (pdfPreviewSuffix.indexOf(suffix) !== -1) {\r\n        return \"pdf\";\r\n    } else if (Object.keys(codePreviewSuffix).indexOf(suffix) !== -1) {\r\n        return \"code\";\r\n    } else if (epubSuffix.indexOf(suffix) !== -1) {\r\n        return \"epub\";\r\n    }\r\n    return false;\r\n};\r\nexport const isTorrent = (name: any) => {\r\n    const suffix = name.split(\".\").pop().toLowerCase();\r\n    if (mediaType.torrent.indexOf(suffix) !== -1) {\r\n        return true;\r\n    }\r\n    return false;\r\n};\r\n\r\nexport const isCompressFile = (name: any) => {\r\n    const suffix = name.split(\".\").pop().toLowerCase();\r\n    return suffix !== \"7z\" && mediaType[\"zip\"].indexOf(suffix) !== -1;\r\n};\r\n\r\nexport const encodingRequired = (name: any) => {\r\n    const suffix = name.split(\".\").pop().toLowerCase();\r\n    return suffix === \"zip\";\r\n};\r\n\r\nconst taskStatus = [\r\n    \"setting.queueing\",\r\n    \"setting.processing\",\r\n    \"setting.failed\",\r\n    \"setting.canceled\",\r\n    \"setting.finished\",\r\n];\r\nconst taskType = [\r\n    \"fileManager.compress\",\r\n    \"fileManager.decompress\",\r\n    \"setting.fileTransfer\",\r\n    \"setting.importFiles\",\r\n];\r\nconst taskProgress = [\r\n    \"setting.waiting\",\r\n    \"setting.compressing\",\r\n    \"setting.decompressing\",\r\n    \"setting.downloading\",\r\n    \"setting.transferring\",\r\n    \"setting.indexing\",\r\n    \"setting.listing\",\r\n];\r\n\r\nexport const getTaskStatus = (status: any) => {\r\n    return i18next.t(taskStatus[status]);\r\n};\r\n\r\nexport const getTaskType = (status: any) => {\r\n    return i18next.t(taskType[status]);\r\n};\r\n\r\nexport const getTaskProgress = (type: any, status: any) => {\r\n    if (type === 2) {\r\n        return i18next.t(\"setting.transferProgress\", {\r\n            num: status,\r\n        });\r\n    }\r\n    return i18next.t(taskProgress[status]);\r\n};\r\n","import { ThunkAction } from \"redux-thunk\";\r\nimport { AnyAction } from \"redux\";\r\nimport Auth from \"../../middleware/Auth\";\r\nimport { askForOption } from \"../explorer/async\";\r\nimport i18next, { languages } from \"../../i18n\";\r\n\r\nexport interface ActionSetSubtitle extends AnyAction {\r\n    type: \"SET_SUBTITLE\";\r\n    title: string;\r\n}\r\n\r\nexport const setSubtitle = (title: string): ActionSetSubtitle => {\r\n    return {\r\n        type: \"SET_SUBTITLE\",\r\n        title,\r\n    };\r\n};\r\n\r\nexport const closeContextMenu = () => {\r\n    return {\r\n        type: \"CLOSE_CONTEXT_MENU\",\r\n    };\r\n};\r\n\r\nexport const changeContextMenu = (type: string, open: boolean) => {\r\n    return {\r\n        type: \"CHANGE_CONTEXT_MENU\",\r\n        menuType: type,\r\n        open: open,\r\n    };\r\n};\r\n\r\nexport const changeSubTitle = (\r\n    title: string\r\n): ThunkAction<any, any, any, any> => {\r\n    return (dispatch, getState) => {\r\n        const state = getState();\r\n        document.title =\r\n            title === null || title === undefined\r\n                ? state.siteConfig.title\r\n                : title + \" - \" + state.siteConfig.title;\r\n        dispatch(setSubtitle(title));\r\n    };\r\n};\r\n\r\nexport const setOptionModal = (option: any) => {\r\n    return {\r\n        type: \"SET_OPTION_MODAL\",\r\n        option: option,\r\n    };\r\n};\r\n\r\nexport const openFileSelector = () => {\r\n    return {\r\n        type: \"OPEN_FILE_SELECTOR\",\r\n    };\r\n};\r\n\r\nexport const openFolderSelector = () => {\r\n    return {\r\n        type: \"OPEN_FOLDER_SELECTOR\",\r\n    };\r\n};\r\n\r\nexport const setPagination = (pagination) => {\r\n    return {\r\n        type: \"SET_PAGINATION\",\r\n        pagination: pagination,\r\n    };\r\n};\r\n\r\nexport const setShareInfo = (shareInfo) => {\r\n    return {\r\n        type: \"SET_SHARE_INFO\",\r\n        shareInfo: shareInfo,\r\n    };\r\n};\r\n\r\nexport const changePageSize = (\r\n    size: number\r\n): ThunkAction<any, any, any, any> => {\r\n    return (dispatch, getState) => {\r\n        const {\r\n            explorer: { dirList, fileList },\r\n            viewUpdate: { pagination },\r\n        } = getState();\r\n        const total = dirList.length + fileList.length;\r\n        let page = pagination.page;\r\n        if (pagination.page * size > total) {\r\n            page = Math.max(Math.ceil(total / size), 1);\r\n        } else if (size === -1) {\r\n            page = 1;\r\n        }\r\n        Auth.SetPreference(\"pagination\", size);\r\n        dispatch(\r\n            setPagination({\r\n                ...pagination,\r\n                size: size,\r\n                page: page,\r\n            })\r\n        );\r\n    };\r\n};\r\n\r\nexport const selectLanguage = (): ThunkAction<any, any, any, any> => {\r\n    return async (dispatch, getState) => {\r\n        let option: any;\r\n        let lng = \"\";\r\n        try {\r\n            const allOptions = languages.map((e) => {\r\n                return {\r\n                    key: e.code,\r\n                    name: e.displayName,\r\n                };\r\n            });\r\n            option = await dispatch(\r\n                askForOption(allOptions, i18next.t(\"setting.language\"))\r\n            );\r\n        } catch (e) {\r\n            console.log(e);\r\n            return;\r\n        }\r\n\r\n        lng = option.key;\r\n        await i18next.changeLanguage(lng);\r\n    };\r\n};\r\n","import dayjs from \"dayjs\";\r\nimport timezone from \"dayjs/plugin/timezone\";\r\nimport utc from \"dayjs/plugin/utc\";\r\nimport Auth from \"../middleware/Auth\";\r\nimport i18next from \"../i18n\";\r\n\r\ndayjs.extend(utc);\r\ndayjs.extend(timezone);\r\n\r\nlet userTimezone = \"\";\r\ntry {\r\n    userTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n} catch (e) {\r\n    console.log(e);\r\n}\r\n\r\nif (!userTimezone) {\r\n    userTimezone = \"Asia/Shanghai\";\r\n}\r\n\r\nconst preferTimeZone = Auth.GetPreference(\"timeZone\");\r\nexport let timeZone = preferTimeZone ? preferTimeZone : userTimezone;\r\n\r\nexport function refreshTimeZone() {\r\n    timeZone = Auth.GetPreference(\"timeZone\");\r\n    timeZone = timeZone ? timeZone : userTimezone;\r\n}\r\n\r\nexport function formatLocalTime(time) {\r\n    return i18next.t(\"intlDateTime\", {\r\n        ns: \"common\",\r\n        val: dayjs(time).tz(timeZone).toDate(),\r\n        formatParams: {\r\n            val: {\r\n                year: \"numeric\",\r\n                month: \"numeric\",\r\n                day: \"numeric\",\r\n                hour: \"numeric\",\r\n                minute: \"numeric\",\r\n                second: \"numeric\",\r\n            },\r\n        },\r\n    });\r\n}\r\n\r\nexport function validateTimeZone(name) {\r\n    try {\r\n        dayjs().tz(name).format();\r\n    } catch (e) {\r\n        return false;\r\n    }\r\n    return true;\r\n}\r\n","import React from \"react\";\r\nimport { mediaType } from \"../../config\";\r\nimport ImageIcon from \"@material-ui/icons/PhotoSizeSelectActual\";\r\nimport VideoIcon from \"@material-ui/icons/Videocam\";\r\nimport AudioIcon from \"@material-ui/icons/Audiotrack\";\r\nimport PdfIcon from \"@material-ui/icons/PictureAsPdf\";\r\nimport {\r\n    Android,\r\n    FileExcelBox,\r\n    FilePowerpointBox,\r\n    FileWordBox,\r\n    LanguageC,\r\n    LanguageCpp,\r\n    LanguageGo,\r\n    LanguageJavascript,\r\n    LanguagePhp,\r\n    LanguagePython,\r\n    MagnetOn,\r\n    ScriptText,\r\n    WindowRestore,\r\n    ZipBox,\r\n} from \"mdi-material-ui\";\r\nimport FileShowIcon from \"@material-ui/icons/InsertDriveFile\";\r\nimport { lighten } from \"@material-ui/core/styles\";\r\nimport useTheme from \"@material-ui/core/styles/useTheme\";\r\nimport { Avatar } from \"@material-ui/core\";\r\nimport { MenuBook } from \"@material-ui/icons\";\r\n\r\nconst icons = {\r\n    audio: {\r\n        color: \"#651fff\",\r\n        icon: AudioIcon,\r\n    },\r\n    video: {\r\n        color: \"#d50000\",\r\n        icon: VideoIcon,\r\n    },\r\n    image: {\r\n        color: \"#d32f2f\",\r\n        icon: ImageIcon,\r\n    },\r\n    pdf: {\r\n        color: \"#f44336\",\r\n        icon: PdfIcon,\r\n    },\r\n    word: {\r\n        color: \"#538ce5\",\r\n        icon: FileWordBox,\r\n    },\r\n    ppt: {\r\n        color: \"rgb(239, 99, 63)\",\r\n        icon: FilePowerpointBox,\r\n    },\r\n    excel: {\r\n        color: \"#4caf50\",\r\n        icon: FileExcelBox,\r\n    },\r\n    text: {\r\n        color: \"#607d8b\",\r\n        icon: ScriptText,\r\n    },\r\n    torrent: {\r\n        color: \"#5c6bc0\",\r\n        icon: MagnetOn,\r\n    },\r\n    zip: {\r\n        color: \"#f9a825\",\r\n        icon: ZipBox,\r\n    },\r\n    excute: {\r\n        color: \"#1a237e\",\r\n        icon: WindowRestore,\r\n    },\r\n    android: {\r\n        color: \"#8bc34a\",\r\n        icon: Android,\r\n    },\r\n    file: {\r\n        color: \"#607d8b\",\r\n        icon: FileShowIcon,\r\n    },\r\n    php: {\r\n        color: \"#777bb3\",\r\n        icon: LanguagePhp,\r\n    },\r\n    go: {\r\n        color: \"#16b3da\",\r\n        icon: LanguageGo,\r\n    },\r\n    python: {\r\n        color: \"#3776ab\",\r\n        icon: LanguagePython,\r\n    },\r\n    c: {\r\n        color: \"#a8b9cc\",\r\n        icon: LanguageC,\r\n    },\r\n    cpp: {\r\n        color: \"#004482\",\r\n        icon: LanguageCpp,\r\n    },\r\n    js: {\r\n        color: \"#f4d003\",\r\n        icon: LanguageJavascript,\r\n    },\r\n    epub: {\r\n        color: \"#81b315\",\r\n        icon: MenuBook,\r\n    },\r\n};\r\n\r\nconst getColor = (theme, color) =>\r\n    theme.palette.type === \"light\" ? color : lighten(color, 0.2);\r\n\r\nlet color;\r\n\r\nconst TypeIcon = (props) => {\r\n    const theme = useTheme();\r\n\r\n    const fileSuffix = props.fileName.split(\".\").pop().toLowerCase();\r\n    let fileType = \"file\";\r\n    Object.keys(mediaType).forEach((k) => {\r\n        if (mediaType[k].indexOf(fileSuffix) !== -1) {\r\n            fileType = k;\r\n        }\r\n    });\r\n    const IconComponent = icons[fileType].icon;\r\n    color = getColor(theme, icons[fileType].color);\r\n    if (props.getColorValue) {\r\n        props.getColorValue(color);\r\n    }\r\n\r\n    return (\r\n        <>\r\n            {props.isUpload && (\r\n                <Avatar\r\n                    className={props.className}\r\n                    style={{\r\n                        backgroundColor: color,\r\n                    }}\r\n                >\r\n                    <IconComponent\r\n                        className={props.iconClassName}\r\n                        style={{\r\n                            color: theme.palette.background.paper,\r\n                        }}\r\n                    />\r\n                </Avatar>\r\n            )}\r\n            {!props.isUpload && (\r\n                <IconComponent\r\n                    className={props.className}\r\n                    style={{\r\n                        color: color,\r\n                    }}\r\n                />\r\n            )}\r\n        </>\r\n    );\r\n};\r\n\r\nexport default TypeIcon;\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\nfunction registerValidSW(swUrl, config) {\r\n    navigator.serviceWorker\r\n        .register(swUrl)\r\n        .then((registration) => {\r\n            registration.onupdatefound = () => {\r\n                const installingWorker = registration.installing;\r\n                if (installingWorker == null) {\r\n                    return;\r\n                }\r\n                installingWorker.onstatechange = () => {\r\n                    if (installingWorker.state === \"installed\") {\r\n                        if (navigator.serviceWorker.controller) {\r\n                            // At this point, the updated precached content has been fetched,\r\n                            // but the previous service worker will still serve the older\r\n                            // content until all client tabs are closed.\r\n                            console.log(\r\n                                \"New content is available and will be used when all \" +\r\n                                    \"tabs for this page are closed. See https://bit.ly/CRA-PWA.\"\r\n                            );\r\n\r\n                            // Execute callback\r\n                            if (config && config.onUpdate) {\r\n                                config.onUpdate(registration);\r\n                            }\r\n                        } else {\r\n                            // At this point, everything has been precached.\r\n                            // It's the perfect time to display a\r\n                            // \"Content is cached for offline use.\" message.\r\n                            console.log(\"Content is cached for offline use.\");\r\n\r\n                            // Execute callback\r\n                            if (config && config.onSuccess) {\r\n                                config.onSuccess(registration);\r\n                            }\r\n                        }\r\n                    }\r\n                };\r\n            };\r\n        })\r\n        .catch((error) => {\r\n            console.error(\"Error during service worker registration:\", error);\r\n        });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl, config) {\r\n    // Check if the service worker can be found. If it can't reload the page.\r\n    fetch(swUrl)\r\n        .then((response) => {\r\n            // Ensure service worker exists, and that we really are getting a JS file.\r\n            const contentType = response.headers.get(\"content-type\");\r\n            if (\r\n                response.status === 404 ||\r\n                (contentType != null &&\r\n                    contentType.indexOf(\"javascript\") === -1)\r\n            ) {\r\n                // No service worker found. Probably a different app. Reload the page.\r\n                navigator.serviceWorker.ready.then((registration) => {\r\n                    registration.unregister().then(() => {\r\n                        window.location.reload();\r\n                    });\r\n                });\r\n            } else {\r\n                // Service worker found. Proceed as normal.\r\n                registerValidSW(swUrl, config);\r\n            }\r\n        })\r\n        .catch(() => {\r\n            console.log(\r\n                \"No internet connection found. App is running in offline mode.\"\r\n            );\r\n        });\r\n}\r\n\r\nconst isLocalhost = Boolean(\r\n    window.location.hostname === \"localhost\" ||\r\n        // [::1] is the IPv6 localhost address.\r\n        window.location.hostname === \"[::1]\" ||\r\n        // 127.0.0.1/8 is considered localhost for IPv4.\r\n        window.location.hostname.match(\r\n            /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n        )\r\n);\r\n\r\nexport function register(config) {\r\n    if (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\r\n        // The URL constructor is available in all browsers that support SW.\r\n        const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n        if (publicUrl.origin !== window.location.origin) {\r\n            // Our service worker won't work if PUBLIC_URL is on a different origin\r\n            // from what our page is served on. This might happen if a CDN is used to\r\n            // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n            return;\r\n        }\r\n\r\n        window.addEventListener(\"load\", () => {\r\n            const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n            if (isLocalhost) {\r\n                // This is running on localhost. Let's check if a service worker still exists or not.\r\n                checkValidServiceWorker(swUrl, config);\r\n\r\n                // Add some additional logging to localhost, pointing developers to the\r\n                // service worker/PWA documentation.\r\n                navigator.serviceWorker.ready.then(() => {\r\n                    console.log(\r\n                        \"This web app is being served cache-first by a service \" +\r\n                            \"worker. To learn more, visit https://bit.ly/CRA-PWA\"\r\n                    );\r\n                });\r\n            } else {\r\n                // Is not localhost. Just register service worker\r\n                registerValidSW(swUrl, config);\r\n            }\r\n        });\r\n    }\r\n}\r\n\r\nexport function unregister() {\r\n    if (\"serviceWorker\" in navigator) {\r\n        navigator.serviceWorker.ready.then((registration) => {\r\n            registration.unregister();\r\n        });\r\n    }\r\n}\r\n","import React from \"react\";\r\nimport Auth from \"./Auth\";\r\nimport { Route, Redirect } from \"react-router-dom\";\r\n\r\nfunction AuthRoute({ children, ...rest }) {\r\n    return (\r\n        <Route\r\n            {...rest}\r\n            render={({ location }) =>\r\n                Auth.Check(rest.isLogin) ? (\r\n                    children\r\n                ) : (\r\n                    <Redirect\r\n                        to={{\r\n                            pathname: \"/login\",\r\n                            state: { from: location },\r\n                        }}\r\n                    />\r\n                )\r\n            }\r\n        />\r\n    );\r\n}\r\n\r\nexport default AuthRoute;\r\n","import React from \"react\";\r\nimport Auth from \"./Auth\";\r\nimport { Route, Redirect } from \"react-router-dom\";\r\n\r\nfunction NoAuthRoute({ children, ...rest }) {\r\n    return (\r\n        <Route\r\n            {...rest}\r\n            render={({ location }) =>\r\n                !Auth.Check(rest.isLogin) ? (\r\n                    children\r\n                ) : (\r\n                    <Redirect\r\n                        to={{\r\n                            pathname: \"/home\",\r\n                            state: { from: location },\r\n                        }}\r\n                    />\r\n                )\r\n            }\r\n        />\r\n    );\r\n}\r\n\r\nexport default NoAuthRoute;\r\n","import React from \"react\";\r\nimport SentimentVeryDissatisfiedIcon from \"@material-ui/icons/SentimentVeryDissatisfied\";\r\nimport { lighten, makeStyles } from \"@material-ui/core/styles\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    icon: {\r\n        fontSize: \"160px\",\r\n    },\r\n    emptyContainer: {\r\n        bottom: \"0\",\r\n        height: \"300px\",\r\n        margin: \"50px auto\",\r\n        width: \"300px\",\r\n        color: lighten(theme.palette.text.disabled, 0.4),\r\n        textAlign: \"center\",\r\n        paddingTop: \"20px\",\r\n    },\r\n    emptyInfoBig: {\r\n        fontSize: \"25px\",\r\n        color: lighten(theme.palette.text.disabled, 0.4),\r\n    },\r\n}));\r\n\r\nexport default function Notice(props) {\r\n    const classes = useStyles();\r\n    return (\r\n        <div className={classes.emptyContainer}>\r\n            <SentimentVeryDissatisfiedIcon className={classes.icon} />\r\n            <div className={classes.emptyInfoBig}>{props.msg}</div>\r\n        </div>\r\n    );\r\n}\r\n","import React from \"react\";\r\nimport ContentLoader from \"react-content-loader\";\r\n\r\nconst MyLoader = () => (\r\n    <ContentLoader\r\n        height={60}\r\n        width={240}\r\n        speed={2}\r\n        primaryColor=\"#f3f3f3\"\r\n        secondaryColor=\"#e4e4e4\"\r\n    >\r\n        <rect x=\"0\" y=\"0\" rx=\"3\" ry=\"3\" width=\"100%\" height=\"100%\" />\r\n    </ContentLoader>\r\n);\r\n\r\nfunction captchaPlacholder() {\r\n    return <MyLoader />;\r\n}\r\n\r\nexport default captchaPlacholder;\r\n","import React, {\r\n    forwardRef,\r\n    useCallback,\r\n    useEffect,\r\n    useRef,\r\n    useState,\r\n} from \"react\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport API from \"../middleware/Api\";\r\nimport { FormControl, Input, InputLabel } from \"@material-ui/core\";\r\nimport Placeholder from \"../component/Placeholder/Captcha\";\r\nimport { defaultValidate, useStyle } from \"./useCaptcha\";\r\nimport { toggleSnackbar } from \"../redux/explorer\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst NormalCaptcha = forwardRef(function NormalCaptcha(\r\n    { captchaRef, setLoading },\r\n    ref\r\n) {\r\n    const { t } = useTranslation();\r\n    const classes = useStyle();\r\n\r\n    const [captcha, setCaptcha] = useState(\"\");\r\n    const [captchaData, setCaptchaData] = useState(null);\r\n\r\n    const dispatch = useDispatch();\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n\r\n    const refreshCaptcha = () => {\r\n        API.get(\"/site/captcha\")\r\n            .then((response) => {\r\n                setCaptchaData(response.data);\r\n                setLoading(false);\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    t(\"login.captchaError\", { message: error.message }),\r\n                    \"error\"\r\n                );\r\n            });\r\n    };\r\n\r\n    useEffect(() => {\r\n        ref.current = refreshCaptcha;\r\n        refreshCaptcha();\r\n    }, []);\r\n\r\n    useEffect(() => {\r\n        captchaRef.current.captchaCode = captcha;\r\n    }, [captcha]);\r\n\r\n    return (\r\n        <div className={classes.captchaContainer}>\r\n            <FormControl margin=\"normal\" required fullWidth>\r\n                <InputLabel htmlFor=\"captcha\">{t(\"login.captcha\")}</InputLabel>\r\n                <Input\r\n                    name=\"captcha\"\r\n                    onChange={(e) => setCaptcha(e.target.value)}\r\n                    type=\"text\"\r\n                    id=\"captcha\"\r\n                    value={captcha}\r\n                    autoComplete\r\n                />\r\n            </FormControl>{\" \"}\r\n            <div\r\n                className={classes.captchaImageContainer}\r\n                title={t(\"login.clickToRefresh\")}\r\n            >\r\n                {captchaData === null && (\r\n                    <Placeholder />\r\n                )}\r\n                {captchaData !== null && (\r\n                    <img\r\n                        className={classes.captchaImage}\r\n                        src={captchaData}\r\n                        alt=\"captcha\"\r\n                        onClick={refreshCaptcha}\r\n                    />\r\n                )}\r\n            </div>\r\n        </div>\r\n    );\r\n});\r\n\r\nexport default function useNormalCaptcha(captchaRefreshRef, setLoading) {\r\n    const isValidate = useRef({\r\n        isValidate: true,\r\n    });\r\n\r\n    const captchaParamsRef = useRef({\r\n        captchaCode: \"\",\r\n    });\r\n\r\n    const CaptchaRender = useCallback(\r\n        function Normal() {\r\n            return (\r\n                <NormalCaptcha\r\n                    captchaRef={captchaParamsRef}\r\n                    ref={captchaRefreshRef}\r\n                    setLoading={setLoading}\r\n                />\r\n            );\r\n        },\r\n        [captchaParamsRef, captchaRefreshRef, setLoading]\r\n    );\r\n\r\n    return {\r\n        isValidate,\r\n        validate: defaultValidate,\r\n        captchaParamsRef,\r\n        CaptchaRender,\r\n    };\r\n}\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nexport default class ReCAPTCHA extends React.Component {\r\n    constructor() {\r\n        super();\r\n        this.handleExpired = this.handleExpired.bind(this);\r\n        this.handleErrored = this.handleErrored.bind(this);\r\n        this.handleChange = this.handleChange.bind(this);\r\n        this.handleRecaptchaRef = this.handleRecaptchaRef.bind(this);\r\n    }\r\n\r\n    getValue() {\r\n        if (this.props.grecaptcha && this._widgetId !== undefined) {\r\n            return this.props.grecaptcha.getResponse(this._widgetId);\r\n        }\r\n        return null;\r\n    }\r\n\r\n    getWidgetId() {\r\n        if (this.props.grecaptcha && this._widgetId !== undefined) {\r\n            return this._widgetId;\r\n        }\r\n        return null;\r\n    }\r\n\r\n    execute() {\r\n        const { grecaptcha } = this.props;\r\n\r\n        if (grecaptcha && this._widgetId !== undefined) {\r\n            return grecaptcha.execute(this._widgetId);\r\n        } else {\r\n            this._executeRequested = true;\r\n        }\r\n    }\r\n\r\n    reset() {\r\n        if (this.props.grecaptcha && this._widgetId !== undefined) {\r\n            this.props.grecaptcha.reset(this._widgetId);\r\n        }\r\n    }\r\n\r\n    handleExpired() {\r\n        if (this.props.onExpired) {\r\n            this.props.onExpired();\r\n        } else {\r\n            this.handleChange(null);\r\n        }\r\n    }\r\n\r\n    handleErrored() {\r\n        if (this.props.onErrored) this.props.onErrored();\r\n    }\r\n\r\n    handleChange(token) {\r\n        if (this.props.onChange) this.props.onChange(token);\r\n    }\r\n\r\n    explicitRender() {\r\n        if (\r\n            this.props.grecaptcha &&\r\n            this.props.grecaptcha.render &&\r\n            this._widgetId === undefined\r\n        ) {\r\n            const wrapper = document.createElement(\"div\");\r\n            this._widgetId = this.props.grecaptcha.render(wrapper, {\r\n                sitekey: this.props.sitekey,\r\n                callback: this.handleChange,\r\n                theme: this.props.theme,\r\n                type: this.props.type,\r\n                tabindex: this.props.tabindex,\r\n                \"expired-callback\": this.handleExpired,\r\n                \"error-callback\": this.handleErrored,\r\n                size: this.props.size,\r\n                stoken: this.props.stoken,\r\n                hl: this.props.hl,\r\n                badge: this.props.badge,\r\n            });\r\n            this.captcha.appendChild(wrapper);\r\n        }\r\n        if (\r\n            this._executeRequested &&\r\n            this.props.grecaptcha &&\r\n            this._widgetId !== undefined\r\n        ) {\r\n            this._executeRequested = false;\r\n            this.execute();\r\n        }\r\n    }\r\n\r\n    componentDidMount() {\r\n        this.explicitRender();\r\n    }\r\n\r\n    componentDidUpdate() {\r\n        this.explicitRender();\r\n    }\r\n\r\n    componentWillUnmount() {\r\n        if (this._widgetId !== undefined) {\r\n            this.delayOfCaptchaIframeRemoving();\r\n            this.reset();\r\n        }\r\n    }\r\n\r\n    delayOfCaptchaIframeRemoving() {\r\n        const temporaryNode = document.createElement(\"div\");\r\n        document.body.appendChild(temporaryNode);\r\n        temporaryNode.style.display = \"none\";\r\n\r\n        // move of the recaptcha to a temporary node\r\n        while (this.captcha.firstChild) {\r\n            temporaryNode.appendChild(this.captcha.firstChild);\r\n        }\r\n\r\n        // delete the temporary node after reset will be done\r\n        setTimeout(() => {\r\n            document.body.removeChild(temporaryNode);\r\n        }, 5000);\r\n    }\r\n\r\n    handleRecaptchaRef(elem) {\r\n        this.captcha = elem;\r\n    }\r\n\r\n    render() {\r\n        // consume properties owned by the reCATPCHA, pass the rest to the div so the user can style it.\r\n        /* eslint-disable no-unused-vars */\r\n        /* eslint-disable @typescript-eslint/no-unused-vars */\r\n        const {\r\n            sitekey,\r\n            onChange,\r\n            theme,\r\n            type,\r\n            tabindex,\r\n            onExpired,\r\n            onErrored,\r\n            size,\r\n            stoken,\r\n            grecaptcha,\r\n            badge,\r\n            hl,\r\n            ...childProps\r\n        } = this.props;\r\n        /* eslint-enable no-unused-vars */\r\n        return <div {...childProps} ref={this.handleRecaptchaRef} />;\r\n    }\r\n}\r\n\r\nReCAPTCHA.displayName = \"ReCAPTCHA\";\r\nReCAPTCHA.propTypes = {\r\n    sitekey: PropTypes.string.isRequired,\r\n    onChange: PropTypes.func,\r\n    grecaptcha: PropTypes.object,\r\n    theme: PropTypes.oneOf([\"dark\", \"light\"]),\r\n    type: PropTypes.oneOf([\"image\", \"audio\"]),\r\n    tabindex: PropTypes.number,\r\n    onExpired: PropTypes.func,\r\n    onErrored: PropTypes.func,\r\n    size: PropTypes.oneOf([\"compact\", \"normal\", \"invisible\"]),\r\n    stoken: PropTypes.string,\r\n    hl: PropTypes.string,\r\n    badge: PropTypes.oneOf([\"bottomright\", \"bottomleft\", \"inline\"]),\r\n};\r\nReCAPTCHA.defaultProps = {\r\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n    onChange: () => {},\r\n    theme: \"light\",\r\n    type: \"image\",\r\n    tabindex: 0,\r\n    size: \"normal\",\r\n    badge: \"bottomright\",\r\n};\r\n","import ReCAPTCHA from \"./ReCaptchaWrapper\";\r\nimport makeAsyncScriptLoader from \"react-async-script\";\r\n\r\nconst callbackName = \"onloadcallback\";\r\nconst globalName = \"grecaptcha\";\r\n\r\nfunction getURL() {\r\n    const hostname = \"recaptcha.net\";\r\n    return `https://${hostname}/recaptcha/api.js?onload=${callbackName}&render=explicit`;\r\n}\r\n\r\nexport default makeAsyncScriptLoader(getURL, {\r\n    callbackName,\r\n    globalName,\r\n})(ReCAPTCHA);\r\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { FormControl } from \"@material-ui/core\";\r\nimport ReCaptcha from \"../component/Login/ReCaptcha\";\r\nimport { defaultValidate, useStyle } from \"./useCaptcha\";\r\n\r\nconst Recaptcha = ({ captchaRef, setLoading }) => {\r\n    const classes = useStyle();\r\n\r\n    const [captcha, setCaptcha] = useState(\"\");\r\n\r\n    const reCaptchaKey = useSelector(\r\n        (state) => state.siteConfig.captcha_ReCaptchaKey\r\n    );\r\n\r\n    useEffect(() => {\r\n        captchaRef.current.captchaCode = captcha;\r\n    }, [captcha]);\r\n\r\n    useEffect(() => setLoading(false), []);\r\n\r\n    return (\r\n        <div className={classes.captchaContainer}>\r\n            <FormControl margin=\"normal\" required fullWidth>\r\n                <div>\r\n                    <ReCaptcha\r\n                        style={{\r\n                            display: \"inline-block\",\r\n                        }}\r\n                        sitekey={reCaptchaKey}\r\n                        onChange={(value) => setCaptcha(value)}\r\n                        id=\"captcha\"\r\n                        name=\"captcha\"\r\n                    />\r\n                </div>\r\n            </FormControl>{\" \"}\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default function useRecaptcha(setLoading) {\r\n    const isValidate = useRef({\r\n        isValidate: true,\r\n    });\r\n\r\n    const captchaParamsRef = useRef({\r\n        captchaCode: \"\",\r\n    });\r\n\r\n    const CaptchaRender = useCallback(\r\n        function RecaptchaRender() {\r\n            return (\r\n                <Recaptcha\r\n                    captchaRef={captchaParamsRef}\r\n                    setLoading={setLoading}\r\n                />\r\n            );\r\n        },\r\n        [captchaParamsRef, setLoading]\r\n    );\r\n\r\n    return {\r\n        isValidate,\r\n        validate: defaultValidate,\r\n        captchaParamsRef,\r\n        CaptchaRender,\r\n    };\r\n}\r\n","import React, { forwardRef, useCallback, useRef } from \"react\";\r\nimport Script from \"react-load-script\";\r\nimport { useSelector } from \"react-redux\";\r\n\r\nconst TCaptcha = forwardRef(function TCaptcha(\r\n    { captchaRef, setLoading, isValidateRef, submitRef },\r\n    ref\r\n) {\r\n    const appid = useSelector(\r\n        (state) => state.siteConfig.tcaptcha_captcha_app_id\r\n    );\r\n    const onLoad = () => {\r\n        try {\r\n            ref.current = new window.TencentCaptcha(appid, function (res) {\r\n                if (res.ret === 0) {\r\n                    captchaRef.current.ticket = res.ticket;\r\n                    captchaRef.current.randstr = res.randstr;\r\n\r\n                    isValidateRef.current.isValidate = true;\r\n                    submitRef.current.submit();\r\n                    console.log(submitRef);\r\n                } else {\r\n                    submitRef.current.setLoading(false);\r\n                }\r\n            });\r\n        } catch (e) {\r\n            console.error(e);\r\n        }\r\n        setLoading(false);\r\n    };\r\n    return (\r\n        <Script\r\n            url={\"https://ssl.captcha.qq.com/TCaptcha.js\"}\r\n            onLoad={onLoad}\r\n        />\r\n    );\r\n});\r\n\r\nexport default function useTCaptcha(setLoading) {\r\n    const isValidate = useRef({\r\n        isValidate: false,\r\n    });\r\n    const captchaParamsRef = useRef({\r\n        ticket: \"\",\r\n        randstr: \"\",\r\n    });\r\n    const submitRef = useRef({\r\n        // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n        submit: () => {},\r\n        // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n        setLoading: () => {},\r\n    });\r\n\r\n    const captchaRef = useRef();\r\n\r\n    const CaptchaRender = useCallback(\r\n        function TCaptchaRender() {\r\n            return (\r\n                <TCaptcha\r\n                    captchaRef={captchaParamsRef}\r\n                    setLoading={setLoading}\r\n                    isValidateRef={isValidate}\r\n                    submitRef={submitRef}\r\n                    ref={captchaRef}\r\n                />\r\n            );\r\n        },\r\n        [captchaParamsRef, setLoading, isValidate, submitRef, captchaRef]\r\n    );\r\n\r\n    return {\r\n        isValidate: isValidate,\r\n        validate: (submit, setLoading) => {\r\n            submitRef.current.submit = submit;\r\n            submitRef.current.setLoading = setLoading;\r\n            captchaRef.current.show();\r\n        },\r\n        captchaParamsRef,\r\n        CaptchaRender,\r\n    };\r\n}\r\n","import { useSelector } from \"react-redux\";\r\nimport { useRef, useState } from \"react\";\r\nimport { makeStyles } from \"@material-ui/core\";\r\nimport useNormalCaptcha from \"./normal\";\r\nimport useRecaptcha from \"./recaptcha\";\r\nimport useTCaptcha from \"./tcaptcha\";\r\n\r\nexport const useStyle = makeStyles((theme) => ({\r\n    captchaContainer: {\r\n        display: \"flex\",\r\n        marginTop: \"10px\",\r\n        alignItems: 'center',\r\n        [theme.breakpoints.down(\"sm\")]: {\r\n            marginTop: 0,\r\n            display: \"block\",\r\n        },\r\n    },\r\n    captchaImageContainer: {\r\n        cursor: 'pointer',\r\n        marginLeft: \"1rem\",\r\n        [theme.breakpoints.down(\"sm\")]: {\r\n            marginLeft: 0,\r\n        },\r\n    },\r\n    captchaImage: {\r\n        borderRadius: 4,\r\n    },\r\n}));\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars,@typescript-eslint/no-empty-function\r\nexport const defaultValidate = (submit, setLoading) => {};\r\n\r\nexport const useCaptcha = () => {\r\n    const captchaType = useSelector((state) => state.siteConfig.captcha_type);\r\n\r\n    const [captchaLoading, setCaptchaLoading] = useState(true);\r\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n    const captchaRefreshRef = useRef(() => {});\r\n\r\n    const normal = useNormalCaptcha(captchaRefreshRef, setCaptchaLoading);\r\n    const recaptcha = useRecaptcha(setCaptchaLoading);\r\n    const tcaptcha = useTCaptcha(setCaptchaLoading);\r\n\r\n    switch (captchaType) {\r\n        case \"normal\":\r\n            return { ...normal, captchaRefreshRef, captchaLoading };\r\n        case \"recaptcha\":\r\n            return { ...recaptcha, captchaRefreshRef, captchaLoading };\r\n        case \"tcaptcha\":\r\n            return { ...tcaptcha, captchaRefreshRef, captchaLoading };\r\n        default:\r\n            return { ...normal, captchaRefreshRef, captchaLoading };\r\n    }\r\n};\r\n","import React, { useCallback, useEffect, useState } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport LockOutlinedIcon from \"@material-ui/icons/LockOutlined\";\r\nimport {\r\n    Avatar,\r\n    Button,\r\n    Divider,\r\n    FormControl,\r\n    Input,\r\n    InputLabel,\r\n    Link,\r\n    makeStyles,\r\n    Paper,\r\n    Typography,\r\n} from \"@material-ui/core\";\r\nimport { Link as RouterLink, useHistory } from \"react-router-dom\";\r\nimport API from \"../../middleware/Api\";\r\nimport Auth from \"../../middleware/Auth\";\r\nimport { bufferDecode, bufferEncode } from \"../../utils/index\";\r\nimport { Fingerprint, VpnKey } from \"@material-ui/icons\";\r\nimport VpnIcon from \"@material-ui/icons/VpnKeyOutlined\";\r\nimport { useLocation } from \"react-router\";\r\nimport { useCaptcha } from \"../../hooks/useCaptcha\";\r\nimport {\r\n    applyThemes,\r\n    setSessionStatus,\r\n    toggleSnackbar,\r\n} from \"../../redux/explorer\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    layout: {\r\n        width: \"auto\",\r\n        marginTop: \"110px\",\r\n        marginLeft: theme.spacing(3),\r\n        marginRight: theme.spacing(3),\r\n        [theme.breakpoints.up(\"sm\")]: {\r\n            width: 400,\r\n            marginLeft: \"auto\",\r\n            marginRight: \"auto\",\r\n        },\r\n        marginBottom: 110,\r\n    },\r\n    paper: {\r\n        marginTop: theme.spacing(8),\r\n        display: \"flex\",\r\n        flexDirection: \"column\",\r\n        alignItems: \"center\",\r\n        padding: `${theme.spacing(2)}px ${theme.spacing(3)}px ${theme.spacing(\r\n            3\r\n        )}px`,\r\n    },\r\n    avatar: {\r\n        margin: theme.spacing(1),\r\n        backgroundColor: theme.palette.secondary.main,\r\n    },\r\n    form: {\r\n        width: \"100%\", // Fix IE 11 issue.\r\n        marginTop: theme.spacing(1),\r\n    },\r\n    submit: {\r\n        marginTop: theme.spacing(3),\r\n    },\r\n    link: {\r\n        marginTop: \"20px\",\r\n        display: \"flex\",\r\n        width: \"100%\",\r\n        justifyContent: \"space-between\",\r\n    },\r\n    buttonContainer: {\r\n        display: \"flex\",\r\n    },\r\n    authnLink: {\r\n        textAlign: \"center\",\r\n        marginTop: 16,\r\n    },\r\n}));\r\n\r\nfunction useQuery() {\r\n    return new URLSearchParams(useLocation().search);\r\n}\r\n\r\nfunction LoginForm() {\r\n    const { t } = useTranslation();\r\n\r\n    const [email, setEmail] = useState(\"\");\r\n    const [pwd, setPwd] = useState(\"\");\r\n    const [loading, setLoading] = useState(false);\r\n    const [useAuthn, setUseAuthn] = useState(false);\r\n    const [twoFA, setTwoFA] = useState(false);\r\n    const [faCode, setFACode] = useState(\"\");\r\n\r\n    const loginCaptcha = useSelector((state) => state.siteConfig.loginCaptcha);\r\n    const registerEnabled = useSelector(\r\n        (state) => state.siteConfig.registerEnabled\r\n    );\r\n    const title = useSelector((state) => state.siteConfig.title);\r\n    const authn = useSelector((state) => state.siteConfig.authn);\r\n\r\n    const dispatch = useDispatch();\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n    const ApplyThemes = useCallback((theme) => dispatch(applyThemes(theme)), [\r\n        dispatch,\r\n    ]);\r\n    const SetSessionStatus = useCallback(\r\n        (status) => dispatch(setSessionStatus(status)),\r\n        [dispatch]\r\n    );\r\n\r\n    const history = useHistory();\r\n    const location = useLocation();\r\n    const {\r\n        captchaLoading,\r\n        isValidate,\r\n        validate,\r\n        CaptchaRender,\r\n        captchaRefreshRef,\r\n        captchaParamsRef,\r\n    } = useCaptcha();\r\n    const query = useQuery();\r\n\r\n    const classes = useStyles();\r\n\r\n    useEffect(() => {\r\n        setEmail(query.get(\"username\"));\r\n    }, [location]);\r\n\r\n    const afterLogin = (data) => {\r\n        Auth.authenticate(data);\r\n\r\n        // 设置用户主题色\r\n        if (data[\"preferred_theme\"] !== \"\") {\r\n            ApplyThemes(data[\"preferred_theme\"]);\r\n        }\r\n\r\n        // 设置登录状态\r\n        SetSessionStatus(true);\r\n\r\n        history.push(\"/home\");\r\n        ToggleSnackbar(\"top\", \"right\", t(\"login.success\"), \"success\");\r\n\r\n        localStorage.removeItem(\"siteConfigCache\");\r\n    };\r\n\r\n    const authnLogin = (e) => {\r\n        e.preventDefault();\r\n        if (!navigator.credentials) {\r\n            ToggleSnackbar(\r\n                \"top\",\r\n                \"right\",\r\n                t(\"login.browserNotSupport\"),\r\n                \"warning\"\r\n            );\r\n\r\n            return;\r\n        }\r\n\r\n        setLoading(true);\r\n\r\n        API.get(\"/user/authn/\" + email)\r\n            .then((response) => {\r\n                const credentialRequestOptions = response.data;\r\n                console.log(credentialRequestOptions);\r\n                credentialRequestOptions.publicKey.challenge = bufferDecode(\r\n                    credentialRequestOptions.publicKey.challenge\r\n                );\r\n                credentialRequestOptions.publicKey.allowCredentials.forEach(\r\n                    function (listItem) {\r\n                        listItem.id = bufferDecode(listItem.id);\r\n                    }\r\n                );\r\n\r\n                return navigator.credentials.get({\r\n                    publicKey: credentialRequestOptions.publicKey,\r\n                });\r\n            })\r\n            .then((assertion) => {\r\n                const authData = assertion.response.authenticatorData;\r\n                const clientDataJSON = assertion.response.clientDataJSON;\r\n                const rawId = assertion.rawId;\r\n                const sig = assertion.response.signature;\r\n                const userHandle = assertion.response.userHandle;\r\n\r\n                return API.post(\r\n                    \"/user/authn/finish/\" + email,\r\n                    JSON.stringify({\r\n                        id: assertion.id,\r\n                        rawId: bufferEncode(rawId),\r\n                        type: assertion.type,\r\n                        response: {\r\n                            authenticatorData: bufferEncode(authData),\r\n                            clientDataJSON: bufferEncode(clientDataJSON),\r\n                            signature: bufferEncode(sig),\r\n                            userHandle: bufferEncode(userHandle),\r\n                        },\r\n                    })\r\n                );\r\n            })\r\n            .then((response) => {\r\n                afterLogin(response.data);\r\n            })\r\n            .catch((error) => {\r\n                console.log(error);\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"warning\");\r\n            })\r\n            .then(() => {\r\n                setLoading(false);\r\n            });\r\n    };\r\n\r\n    const login = (e) => {\r\n        e.preventDefault();\r\n        setLoading(true);\r\n        if (!isValidate.current.isValidate && loginCaptcha) {\r\n            validate(() => login(e), setLoading);\r\n            return;\r\n        }\r\n        API.post(\"/user/session\", {\r\n            userName: email,\r\n            Password: pwd,\r\n            ...captchaParamsRef.current,\r\n        })\r\n            .then((response) => {\r\n                setLoading(false);\r\n                if (response.rawData.code === 203) {\r\n                    setTwoFA(true);\r\n                } else {\r\n                    afterLogin(response.data);\r\n                }\r\n            })\r\n            .catch((error) => {\r\n                setLoading(false);\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"warning\");\r\n                captchaRefreshRef.current();\r\n            });\r\n    };\r\n\r\n    const twoFALogin = (e) => {\r\n        e.preventDefault();\r\n        setLoading(true);\r\n        API.post(\"/user/2fa\", {\r\n            code: faCode,\r\n        })\r\n            .then((response) => {\r\n                setLoading(false);\r\n                afterLogin(response.data);\r\n            })\r\n            .catch((error) => {\r\n                setLoading(false);\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"warning\");\r\n            });\r\n    };\r\n\r\n    return (\r\n        <div className={classes.layout}>\r\n            {!twoFA && (\r\n                <>\r\n                    <Paper className={classes.paper}>\r\n                        <Avatar className={classes.avatar}>\r\n                            <LockOutlinedIcon />\r\n                        </Avatar>\r\n                        <Typography component=\"h1\" variant=\"h5\">\r\n                            {t(\"login.title\", { title })}\r\n                        </Typography>\r\n                        {!useAuthn && (\r\n                            <form className={classes.form} onSubmit={login}>\r\n                                <FormControl margin=\"normal\" required fullWidth>\r\n                                    <InputLabel htmlFor=\"email\">\r\n                                        {t(\"login.email\")}\r\n                                    </InputLabel>\r\n                                    <Input\r\n                                        id=\"email\"\r\n                                        type=\"email\"\r\n                                        name=\"email\"\r\n                                        onChange={(e) =>\r\n                                            setEmail(e.target.value)\r\n                                        }\r\n                                        autoComplete\r\n                                        value={email}\r\n                                        autoFocus\r\n                                    />\r\n                                </FormControl>\r\n                                <FormControl margin=\"normal\" required fullWidth>\r\n                                    <InputLabel htmlFor=\"password\">\r\n                                        {t(\"login.password\")}\r\n                                    </InputLabel>\r\n                                    <Input\r\n                                        name=\"password\"\r\n                                        onChange={(e) => setPwd(e.target.value)}\r\n                                        type=\"password\"\r\n                                        id=\"password\"\r\n                                        value={pwd}\r\n                                        autoComplete\r\n                                    />\r\n                                </FormControl>\r\n                                {loginCaptcha && <CaptchaRender />}\r\n\r\n                                <Button\r\n                                    type=\"submit\"\r\n                                    fullWidth\r\n                                    variant=\"contained\"\r\n                                    color=\"primary\"\r\n                                    disabled={\r\n                                        loading ||\r\n                                        (loginCaptcha ? captchaLoading : false)\r\n                                    }\r\n                                    className={classes.submit}\r\n                                >\r\n                                    {t(\"login.signIn\")}\r\n                                </Button>\r\n                            </form>\r\n                        )}\r\n                        {useAuthn && (\r\n                            <form className={classes.form}>\r\n                                <FormControl margin=\"normal\" required fullWidth>\r\n                                    <InputLabel htmlFor=\"email\">\r\n                                        {t(\"login.email\")}\r\n                                    </InputLabel>\r\n                                    <Input\r\n                                        id=\"email\"\r\n                                        type=\"email\"\r\n                                        name=\"email\"\r\n                                        onChange={(e) =>\r\n                                            setEmail(e.target.value)\r\n                                        }\r\n                                        autoComplete\r\n                                        value={email}\r\n                                        autoFocus\r\n                                    />\r\n                                </FormControl>\r\n                                <Button\r\n                                    type=\"submit\"\r\n                                    fullWidth\r\n                                    variant=\"contained\"\r\n                                    color=\"primary\"\r\n                                    disabled={loading}\r\n                                    onClick={authnLogin}\r\n                                    className={classes.submit}\r\n                                >\r\n                                    {t(\"login.continue\")}\r\n                                </Button>\r\n                            </form>\r\n                        )}\r\n                        <Divider />\r\n                        <div className={classes.link}>\r\n                            <div>\r\n                                <Link component={RouterLink} to={\"/forget\"}>\r\n                                    {t(\"login.forgetPassword\")}\r\n                                </Link>\r\n                            </div>\r\n                            <div>\r\n                                {registerEnabled && (\r\n                                    <Link component={RouterLink} to={\"/signup\"}>\r\n                                        {t(\"login.signUpAccount\")}\r\n                                    </Link>\r\n                                )}\r\n                            </div>\r\n                        </div>\r\n                    </Paper>\r\n\r\n                    {authn && (\r\n                        <div className={classes.authnLink}>\r\n                            <Button\r\n                                color=\"primary\"\r\n                                onClick={() => setUseAuthn(!useAuthn)}\r\n                            >\r\n                                {!useAuthn && (\r\n                                    <>\r\n                                        <Fingerprint\r\n                                            style={{\r\n                                                marginRight: 8,\r\n                                            }}\r\n                                        />\r\n                                        {t(\"login.useFIDO2\")}\r\n                                    </>\r\n                                )}\r\n                                {useAuthn && (\r\n                                    <>\r\n                                        <VpnKey\r\n                                            style={{\r\n                                                marginRight: 8,\r\n                                            }}\r\n                                        />\r\n                                        {t(\"login.usePassword\")}\r\n                                    </>\r\n                                )}\r\n                            </Button>\r\n                        </div>\r\n                    )}\r\n                </>\r\n            )}\r\n            {twoFA && (\r\n                <Paper className={classes.paper}>\r\n                    <Avatar className={classes.avatar}>\r\n                        <VpnIcon />\r\n                    </Avatar>\r\n                    <Typography component=\"h1\" variant=\"h5\">\r\n                        {t(\"login.2FA\")}\r\n                    </Typography>\r\n                    <form className={classes.form} onSubmit={twoFALogin}>\r\n                        <FormControl margin=\"normal\" required fullWidth>\r\n                            <InputLabel htmlFor=\"code\">\r\n                                {t(\"login.input2FACode\")}\r\n                            </InputLabel>\r\n                            <Input\r\n                                id=\"code\"\r\n                                type=\"number\"\r\n                                name=\"code\"\r\n                                onChange={(event) =>\r\n                                    setFACode(event.target.value)\r\n                                }\r\n                                autoComplete\r\n                                value={faCode}\r\n                                autoFocus\r\n                            />\r\n                        </FormControl>\r\n                        <Button\r\n                            type=\"submit\"\r\n                            fullWidth\r\n                            variant=\"contained\"\r\n                            color=\"primary\"\r\n                            disabled={loading}\r\n                            className={classes.submit}\r\n                        >\r\n                            {t(\"login.continue\")}\r\n                        </Button>{\" \"}\r\n                    </form>{\" \"}\r\n                    <Divider />\r\n                </Paper>\r\n            )}\r\n        </div>\r\n    );\r\n}\r\n\r\nexport default LoginForm;\r\n","import Highlighter from \"react-highlight-words\";\r\nimport { trimPrefix } from \"../Uploader/core/utils\";\r\nimport React from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    highlight: {\r\n        backgroundColor: theme.palette.warning.light,\r\n    },\r\n}));\r\n\r\nexport default function FileName({ name }) {\r\n    const classes = useStyles();\r\n    const search = useSelector((state) => state.explorer.search);\r\n    if (!search) {\r\n        return name;\r\n    }\r\n\r\n    return (\r\n        <Highlighter\r\n            highlightClassName={classes.highlight}\r\n            searchWords={trimPrefix(search.keywords, \"keywords/\").split(\" \")}\r\n            autoEscape={true}\r\n            textToHighlight={name}\r\n        />\r\n    );\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { connect } from \"react-redux\";\r\nimport classNames from \"classnames\";\r\nimport {\r\n    ButtonBase,\r\n    fade,\r\n    Tooltip,\r\n    Typography,\r\n    withStyles,\r\n} from \"@material-ui/core\";\r\nimport TypeIcon from \"./TypeIcon\";\r\nimport CheckCircleRoundedIcon from \"@material-ui/icons/CheckCircleRounded\";\r\nimport Grow from \"@material-ui/core/Grow\";\r\nimport { Folder } from \"@material-ui/icons\";\r\nimport FileName from \"./FileName\";\r\n\r\nconst styles = (theme) => ({\r\n    container: {\r\n        padding: \"7px\",\r\n    },\r\n\r\n    selected: {\r\n        \"&:hover\": {\r\n            border: \"1px solid #d0d0d0\",\r\n        },\r\n        backgroundColor: fade(\r\n            theme.palette.primary.main,\r\n            theme.palette.type === \"dark\" ? 0.3 : 0.18\r\n        ),\r\n    },\r\n    notSelected: {\r\n        \"&:hover\": {\r\n            backgroundColor: theme.palette.background.default,\r\n            border: \"1px solid #d0d0d0\",\r\n        },\r\n        backgroundColor: theme.palette.background.paper,\r\n    },\r\n\r\n    button: {\r\n        height: \"50px\",\r\n        border: \"1px solid \" + theme.palette.divider,\r\n        width: \"100%\",\r\n        borderRadius: \"6px\",\r\n        boxSizing: \"border-box\",\r\n        transition:\r\n            \"background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms\",\r\n        display: \"flex\",\r\n        justifyContent: \"left\",\r\n        alignItems: \"initial\",\r\n    },\r\n    icon: {\r\n        margin: \"10px 10px 10px 16px\",\r\n        height: \"30px\",\r\n        minWidth: \"30px\",\r\n        backgroundColor: theme.palette.background.paper,\r\n        borderRadius: \"90%\",\r\n        paddingTop: \"3px\",\r\n        color: theme.palette.text.secondary,\r\n    },\r\n    folderNameSelected: {\r\n        color:\r\n            theme.palette.type === \"dark\" ? \"#fff\" : theme.palette.primary.dark,\r\n        fontWeight: \"500\",\r\n    },\r\n    folderNameNotSelected: {\r\n        color: theme.palette.text.secondary,\r\n    },\r\n    folderName: {\r\n        marginTop: \"15px\",\r\n        textOverflow: \"ellipsis\",\r\n        whiteSpace: \"nowrap\",\r\n        overflow: \"hidden\",\r\n        marginRight: \"20px\",\r\n    },\r\n    checkIcon: {\r\n        color: theme.palette.primary.main,\r\n    },\r\n});\r\n\r\nconst mapStateToProps = (state) => {\r\n    return {\r\n        selected: state.explorer.selected,\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = () => {\r\n    return {};\r\n};\r\n\r\nclass SmallIconCompoment extends Component {\r\n    state = {};\r\n\r\n    shouldComponentUpdate(nextProps, nextState, nextContext) {\r\n        const isSelectedCurrent =\r\n            this.props.selected.findIndex((value) => {\r\n                return value === this.props.file;\r\n            }) !== -1;\r\n        const isSelectedNext =\r\n            nextProps.selected.findIndex((value) => {\r\n                return value === this.props.file;\r\n            }) !== -1;\r\n        if (\r\n            nextProps.selected !== this.props.selected &&\r\n            isSelectedCurrent === isSelectedNext\r\n        ) {\r\n            return false;\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n    render() {\r\n        const { classes } = this.props;\r\n        const isSelected =\r\n            this.props.selected.findIndex((value) => {\r\n                return value === this.props.file;\r\n            }) !== -1;\r\n\r\n        return (\r\n            <ButtonBase\r\n                focusRipple\r\n                className={classNames(\r\n                    {\r\n                        [classes.selected]: isSelected,\r\n                        [classes.notSelected]: !isSelected,\r\n                    },\r\n                    classes.button\r\n                )}\r\n            >\r\n                <div\r\n                    onClick={this.props.onIconClick}\r\n                    className={classNames(classes.icon, {\r\n                        [classes.iconSelected]: isSelected,\r\n                        [classes.iconNotSelected]: !isSelected,\r\n                    })}\r\n                >\r\n                    {!isSelected && (\r\n                        <>\r\n                            {this.props.isFolder && <Folder />}\r\n                            {!this.props.isFolder && (\r\n                                <TypeIcon fileName={this.props.file.name} />\r\n                            )}\r\n                        </>\r\n                    )}\r\n                    {isSelected && (\r\n                        <Grow in={isSelected}>\r\n                            <CheckCircleRoundedIcon\r\n                                className={classes.checkIcon}\r\n                            />\r\n                        </Grow>\r\n                    )}\r\n                </div>\r\n                <Tooltip\r\n                    title={this.props.file.name}\r\n                    aria-label={this.props.file.name}\r\n                >\r\n                    <Typography\r\n                        className={classNames(classes.folderName, {\r\n                            [classes.folderNameSelected]: isSelected,\r\n                            [classes.folderNameNotSelected]: !isSelected,\r\n                        })}\r\n                        variant=\"body2\"\r\n                    >\r\n                        <FileName name={this.props.file.name} />\r\n                    </Typography>\r\n                </Tooltip>\r\n            </ButtonBase>\r\n        );\r\n    }\r\n}\r\n\r\nSmallIconCompoment.propTypes = {\r\n    classes: PropTypes.object.isRequired,\r\n    file: PropTypes.object.isRequired,\r\n};\r\n\r\nconst SmallIcon = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(SmallIconCompoment));\r\n\r\nexport default SmallIcon;\r\n","import {\r\n    ButtonBase,\r\n    Divider,\r\n    fade,\r\n    Tooltip,\r\n    Typography,\r\n    withStyles,\r\n} from \"@material-ui/core\";\r\nimport classNames from \"classnames\";\r\nimport PropTypes from \"prop-types\";\r\nimport React, { Component } from \"react\";\r\nimport ContentLoader from \"react-content-loader\";\r\nimport { LazyLoadImage } from \"react-lazy-load-image-component\";\r\nimport { connect } from \"react-redux\";\r\nimport { withRouter } from \"react-router\";\r\nimport { baseURL } from \"../../middleware/Api\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport TypeIcon from \"./TypeIcon\";\r\nimport CheckCircleRoundedIcon from \"@material-ui/icons/CheckCircleRounded\";\r\nimport statusHelper from \"../../utils/page\";\r\nimport Grow from \"@material-ui/core/Grow\";\r\nimport FileName from \"./FileName\";\r\n\r\nconst styles = (theme) => ({\r\n    container: {},\r\n\r\n    selected: {\r\n        \"&:hover\": {\r\n            border: \"1px solid #d0d0d0\",\r\n        },\r\n        backgroundColor: fade(\r\n            theme.palette.primary.main,\r\n            theme.palette.type === \"dark\" ? 0.3 : 0.18\r\n        ),\r\n    },\r\n\r\n    notSelected: {\r\n        \"&:hover\": {\r\n            backgroundColor: theme.palette.background.default,\r\n            border: \"1px solid #d0d0d0\",\r\n        },\r\n        backgroundColor: theme.palette.background.paper,\r\n    },\r\n\r\n    button: {\r\n        border: \"1px solid \" + theme.palette.divider,\r\n        width: \"100%\",\r\n        borderRadius: \"6px\",\r\n        boxSizing: \"border-box\",\r\n        transition:\r\n            \"background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms\",\r\n        alignItems: \"initial\",\r\n        display: \"initial\",\r\n    },\r\n    folderNameSelected: {\r\n        color:\r\n            theme.palette.type === \"dark\" ? \"#fff\" : theme.palette.primary.dark,\r\n        fontWeight: \"500\",\r\n    },\r\n    folderNameNotSelected: {\r\n        color: theme.palette.text.secondary,\r\n    },\r\n    folderName: {\r\n        marginTop: \"15px\",\r\n        textOverflow: \"ellipsis\",\r\n        whiteSpace: \"nowrap\",\r\n        overflow: \"hidden\",\r\n        marginRight: \"20px\",\r\n    },\r\n    preview: {\r\n        overflow: \"hidden\",\r\n        height: \"150px\",\r\n        width: \"100%\",\r\n        borderRadius: \"6px 6px 0 0\",\r\n        backgroundColor: theme.palette.background.default,\r\n    },\r\n    previewIcon: {\r\n        overflow: \"hidden\",\r\n        height: \"149px\",\r\n        width: \"100%\",\r\n        borderRadius: \"5px 5px 0 0\",\r\n        backgroundColor: theme.palette.background.paper,\r\n        paddingTop: \"50px\",\r\n    },\r\n    iconBig: {\r\n        fontSize: 50,\r\n    },\r\n    picPreview: {\r\n        objectFit: \"cover\",\r\n        width: \"100%\",\r\n        height: \"100%\",\r\n    },\r\n    fileInfo: {\r\n        height: \"50px\",\r\n        display: \"flex\",\r\n    },\r\n    icon: {\r\n        margin: \"10px 10px 10px 16px\",\r\n        height: \"30px\",\r\n        minWidth: \"30px\",\r\n        backgroundColor: theme.palette.background.paper,\r\n        borderRadius: \"90%\",\r\n        paddingTop: \"3px\",\r\n        color: theme.palette.text.secondary,\r\n    },\r\n    hide: {\r\n        display: \"none\",\r\n    },\r\n    loadingAnimation: {\r\n        borderRadius: \"6px 6px 0 0\",\r\n        height: \"100%\",\r\n        width: \"100%\",\r\n    },\r\n    shareFix: {\r\n        marginLeft: \"20px\",\r\n    },\r\n    checkIcon: {\r\n        color: theme.palette.primary.main,\r\n    },\r\n    noDrag: {\r\n        userDrag: \"none\",\r\n    },\r\n});\r\n\r\nconst mapStateToProps = (state) => {\r\n    return {\r\n        path: state.navigator.path,\r\n        selected: state.explorer.selected,\r\n        shareInfo: state.viewUpdate.shareInfo,\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = () => {\r\n    return {};\r\n};\r\n\r\nclass FileIconCompoment extends Component {\r\n    static defaultProps = {\r\n        share: false,\r\n    };\r\n\r\n    state = {\r\n        loading: false,\r\n        showPicIcon: false,\r\n    };\r\n\r\n    shouldComponentUpdate(nextProps, nextState, nextContext) {\r\n        const isSelectedCurrent =\r\n            this.props.selected.findIndex((value) => {\r\n                return value === this.props.file;\r\n            }) !== -1;\r\n        const isSelectedNext =\r\n            nextProps.selected.findIndex((value) => {\r\n                return value === this.props.file;\r\n            }) !== -1;\r\n        if (\r\n            nextProps.selected !== this.props.selected &&\r\n            isSelectedCurrent === isSelectedNext\r\n        ) {\r\n            return false;\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n    render() {\r\n        const { classes } = this.props;\r\n        const isSelected =\r\n            this.props.selected.findIndex((value) => {\r\n                return value === this.props.file;\r\n            }) !== -1;\r\n        const isSharePage = pathHelper.isSharePage(\r\n            this.props.location.pathname\r\n        );\r\n        const isMobile = statusHelper.isMobile();\r\n\r\n        return (\r\n            <div className={classes.container}>\r\n                <ButtonBase\r\n                    focusRipple\r\n                    className={classNames(\r\n                        {\r\n                            [classes.selected]: isSelected,\r\n                            [classes.notSelected]: !isSelected,\r\n                        },\r\n                        classes.button\r\n                    )}\r\n                >\r\n                    {this.props.file.pic !== \"\" &&\r\n                        !this.state.showPicIcon &&\r\n                        this.props.file.pic !== \" \" &&\r\n                        this.props.file.pic !== \"null,null\" && (\r\n                            <div className={classes.preview}>\r\n                                <LazyLoadImage\r\n                                    className={classNames(\r\n                                        {\r\n                                            [classes.hide]: this.state.loading,\r\n                                            [classes.picPreview]: !this.state\r\n                                                .loading,\r\n                                        },\r\n                                        classes.noDrag\r\n                                    )}\r\n                                    src={\r\n                                        baseURL +\r\n                                        (isSharePage && this.props.shareInfo\r\n                                            ? \"/share/thumb/\" +\r\n                                              this.props.shareInfo.key +\r\n                                              \"/\" +\r\n                                              this.props.file.id +\r\n                                              \"?path=\" +\r\n                                              encodeURIComponent(\r\n                                                  this.props.file.path\r\n                                              )\r\n                                            : \"/file/thumb/\" +\r\n                                              this.props.file.id)\r\n                                    }\r\n                                    afterLoad={() =>\r\n                                        this.setState({ loading: false })\r\n                                    }\r\n                                    beforeLoad={() =>\r\n                                        this.setState({ loading: true })\r\n                                    }\r\n                                    onError={() =>\r\n                                        this.setState({ showPicIcon: true })\r\n                                    }\r\n                                />\r\n                                <ContentLoader\r\n                                    height={150}\r\n                                    width={170}\r\n                                    className={classNames(\r\n                                        {\r\n                                            [classes.hide]: !this.state.loading,\r\n                                        },\r\n                                        classes.loadingAnimation\r\n                                    )}\r\n                                >\r\n                                    <rect\r\n                                        x=\"0\"\r\n                                        y=\"0\"\r\n                                        width=\"100%\"\r\n                                        height=\"150\"\r\n                                    />\r\n                                </ContentLoader>\r\n                            </div>\r\n                        )}\r\n                    {(this.props.file.pic === \"\" ||\r\n                        this.state.showPicIcon ||\r\n                        this.props.file.pic === \" \" ||\r\n                        this.props.file.pic === \"null,null\") && (\r\n                        <div className={classes.previewIcon}>\r\n                            <TypeIcon\r\n                                className={classes.iconBig}\r\n                                fileName={this.props.file.name}\r\n                            />\r\n                        </div>\r\n                    )}\r\n                    {(this.props.file.pic === \"\" ||\r\n                        this.state.showPicIcon ||\r\n                        this.props.file.pic === \" \" ||\r\n                        this.props.file.pic === \"null,null\") && <Divider />}\r\n                    <div className={classes.fileInfo}>\r\n                        {!this.props.share && (\r\n                            <div\r\n                                onClick={this.props.onIconClick}\r\n                                className={classNames(classes.icon, {\r\n                                    [classes.iconSelected]: isSelected,\r\n                                    [classes.iconNotSelected]: !isSelected,\r\n                                })}\r\n                            >\r\n                                {!isSelected && (\r\n                                    <TypeIcon fileName={this.props.file.name} />\r\n                                )}\r\n                                {isSelected && (\r\n                                    <Grow in={isSelected}>\r\n                                        <CheckCircleRoundedIcon\r\n                                            className={classes.checkIcon}\r\n                                        />\r\n                                    </Grow>\r\n                                )}\r\n                            </div>\r\n                        )}\r\n                        <Tooltip\r\n                            title={this.props.file.name}\r\n                            aria-label={this.props.file.name}\r\n                        >\r\n                            <Typography\r\n                                variant=\"body2\"\r\n                                className={classNames(classes.folderName, {\r\n                                    [classes.folderNameSelected]: isSelected,\r\n                                    [classes.folderNameNotSelected]: !isSelected,\r\n                                    [classes.shareFix]: this.props.share,\r\n                                })}\r\n                            >\r\n                                <FileName name={this.props.file.name} />\r\n                            </Typography>\r\n                        </Tooltip>\r\n                    </div>\r\n                </ButtonBase>\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nFileIconCompoment.propTypes = {\r\n    classes: PropTypes.object.isRequired,\r\n    file: PropTypes.object.isRequired,\r\n};\r\n\r\nconst FileIcon = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(withRouter(FileIconCompoment)));\r\n\r\nexport default FileIcon;\r\n","import React from \"react\";\r\nimport FolderIcon from \"@material-ui/icons/Folder\";\r\nimport classNames from \"classnames\";\r\nimport {\r\n    ButtonBase,\r\n    fade,\r\n    makeStyles,\r\n    Tooltip,\r\n    Typography,\r\n} from \"@material-ui/core\";\r\nimport { useSelector } from \"react-redux\";\r\nimport statusHelper from \"../../utils/page\";\r\nimport CheckCircleRoundedIcon from \"@material-ui/icons/CheckCircleRounded\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    container: {\r\n        padding: \"7px\",\r\n    },\r\n\r\n    selected: {\r\n        \"&:hover\": {\r\n            border: \"1px solid #d0d0d0\",\r\n        },\r\n        backgroundColor: fade(\r\n            theme.palette.primary.main,\r\n            theme.palette.type === \"dark\" ? 0.3 : 0.18\r\n        ),\r\n    },\r\n\r\n    notSelected: {\r\n        \"&:hover\": {\r\n            backgroundColor: theme.palette.background.default,\r\n            border: \"1px solid #d0d0d0\",\r\n        },\r\n        backgroundColor: theme.palette.background.paper,\r\n    },\r\n\r\n    button: {\r\n        height: \"50px\",\r\n        border: \"1px solid \" + theme.palette.divider,\r\n        width: \"100%\",\r\n        borderRadius: \"6px\",\r\n        boxSizing: \"border-box\",\r\n        transition:\r\n            \"background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms\",\r\n        display: \"flex\",\r\n        justifyContent: \"left\",\r\n        alignItems: \"initial\",\r\n    },\r\n    icon: {\r\n        margin: \"10px 10px 10px 16px\",\r\n        height: \"30px\",\r\n        minWidth: \"30px\",\r\n        backgroundColor: theme.palette.background.paper,\r\n        borderRadius: \"90%\",\r\n        paddingTop: \"3px\",\r\n        color: theme.palette.text.secondary,\r\n    },\r\n    folderNameSelected: {\r\n        color:\r\n            theme.palette.type === \"dark\" ? \"#fff\" : theme.palette.primary.dark,\r\n        fontWeight: \"500\",\r\n    },\r\n    folderNameNotSelected: {\r\n        color: theme.palette.text.secondary,\r\n    },\r\n    folderName: {\r\n        marginTop: \"15px\",\r\n        textOverflow: \"ellipsis\",\r\n        whiteSpace: \"nowrap\",\r\n        overflow: \"hidden\",\r\n        marginRight: \"20px\",\r\n    },\r\n    active: {\r\n        boxShadow: \"0 0 0 2px \" + theme.palette.primary.light,\r\n    },\r\n    checkIcon: {\r\n        color: theme.palette.primary.main,\r\n    },\r\n}));\r\n\r\nexport default function Folder({ folder, isActive, onIconClick }) {\r\n    const selected = useSelector((state) => state.explorer.selected);\r\n    const classes = useStyles();\r\n    const isMobile = statusHelper.isMobile();\r\n    const isSelected =\r\n        selected.findIndex((value) => {\r\n            return value === folder;\r\n        }) !== -1;\r\n\r\n    return (\r\n        <ButtonBase\r\n            focusRipple\r\n            className={classNames(\r\n                {\r\n                    [classes.selected]: isSelected,\r\n                    [classes.notSelected]: !isSelected,\r\n                    [classes.active]: isActive,\r\n                },\r\n                classes.button\r\n            )}\r\n        >\r\n            <div\r\n                onClick={onIconClick}\r\n                className={classNames(classes.icon, {\r\n                    [classes.iconSelected]: isSelected,\r\n                    [classes.iconNotSelected]: !isSelected,\r\n                })}\r\n            >\r\n                {!isSelected && <FolderIcon />}\r\n                {isSelected && (\r\n                    <CheckCircleRoundedIcon className={classes.checkIcon} />\r\n                )}\r\n            </div>\r\n            <Tooltip title={folder.name} aria-label={folder.name}>\r\n                <Typography\r\n                    variant=\"body2\"\r\n                    className={classNames(classes.folderName, {\r\n                        [classes.folderNameSelected]: isSelected,\r\n                        [classes.folderNameNotSelected]: !isSelected,\r\n                    })}\r\n                >\r\n                    {folder.name}\r\n                </Typography>\r\n            </Tooltip>\r\n        </ButtonBase>\r\n    );\r\n}\r\n","import React from \"react\";\r\nimport SmallIcon from \"../SmallIcon\";\r\nimport FileIcon from \"../FileIcon\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { makeStyles } from \"@material-ui/core\";\r\nimport Folder from \"../Folder\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n    dragging: {\r\n        width: \"200px\",\r\n    },\r\n    cardDragged: {\r\n        position: \"absolute\",\r\n        \"transform-origin\": \"bottom left\",\r\n    },\r\n}));\r\n\r\nconst diliverIcon = (object, viewMethod, classes) => {\r\n    if (object.type === \"dir\") {\r\n        return (\r\n            <div className={classes.dragging}>\r\n                <SmallIcon file={object} isFolder />\r\n            </div>\r\n        );\r\n    }\r\n    if (object.type === \"file\" && viewMethod === \"icon\") {\r\n        return (\r\n            <div className={classes.dragging}>\r\n                <FileIcon file={object} />\r\n            </div>\r\n        );\r\n    }\r\n    if (\r\n        (object.type === \"file\" && viewMethod === \"smallIcon\") ||\r\n        viewMethod === \"list\"\r\n    ) {\r\n        return (\r\n            <div className={classes.dragging}>\r\n                <SmallIcon file={object} />\r\n            </div>\r\n        );\r\n    }\r\n};\r\n\r\nconst Preview = (props) => {\r\n    const selected = useSelector((state) => state.explorer.selected);\r\n    const viewMethod = useSelector(\r\n        (state) => state.viewUpdate.explorerViewMethod\r\n    );\r\n    const classes = useStyles();\r\n    return (\r\n        <>\r\n            {selected.length === 0 &&\r\n                diliverIcon(props.object, viewMethod, classes)}\r\n            {selected.length > 0 && (\r\n                <>\r\n                    {selected.slice(0, 3).map((card, i) => (\r\n                        <div\r\n                            key={card.id}\r\n                            className={classes.cardDragged}\r\n                            style={{\r\n                                zIndex: selected.length - i,\r\n                                transform: `rotateZ(${-i * 2.5}deg)`,\r\n                            }}\r\n                        >\r\n                            {diliverIcon(card, viewMethod, classes)}\r\n                        </div>\r\n                    ))}\r\n                </>\r\n            )}\r\n        </>\r\n    );\r\n};\r\nexport default Preview;\r\n","import React, { useMemo } from \"react\";\r\nimport { useDragLayer } from \"react-dnd\";\r\nimport Preview from \"./Preview\";\r\nimport { useSelector } from \"react-redux\";\r\n\r\nconst layerStyles = {\r\n    position: \"fixed\",\r\n    pointerEvents: \"none\",\r\n    zIndex: 100,\r\n    left: 0,\r\n    top: 0,\r\n    width: \"100%\",\r\n    height: \"100%\",\r\n};\r\n\r\nfunction getItemStyles(\r\n    initialOffset,\r\n    currentOffset,\r\n    pointerOffset,\r\n    viewMethod\r\n) {\r\n    if (!initialOffset || !currentOffset) {\r\n        return {\r\n            display: \"none\",\r\n        };\r\n    }\r\n    let { x, y } = currentOffset;\r\n    if (viewMethod === \"list\") {\r\n        x += pointerOffset.x - initialOffset.x;\r\n        y += pointerOffset.y - initialOffset.y;\r\n    }\r\n\r\n    const transform = `translate(${x}px, ${y}px)`;\r\n    return {\r\n        opacity: 0.5,\r\n        transform,\r\n        WebkitTransform: transform,\r\n    };\r\n}\r\nconst CustomDragLayer = (props) => {\r\n    const {\r\n        itemType,\r\n        isDragging,\r\n        item,\r\n        initialOffset,\r\n        currentOffset,\r\n        pointerOffset,\r\n    } = useDragLayer((monitor) => ({\r\n        item: monitor.getItem(),\r\n        itemType: monitor.getItemType(),\r\n        initialOffset: monitor.getInitialSourceClientOffset(),\r\n        currentOffset: monitor.getSourceClientOffset(),\r\n        pointerOffset: monitor.getInitialClientOffset(),\r\n        isDragging: monitor.isDragging(),\r\n    }));\r\n    const viewMethod = useSelector(\r\n        (state) => state.viewUpdate.explorerViewMethod\r\n    );\r\n    const image = useMemo(() => {\r\n        switch (itemType) {\r\n            case \"object\":\r\n                return <Preview object={item.object} />;\r\n            default:\r\n                return null;\r\n        }\r\n    }, [itemType, item]);\r\n    if (!isDragging) {\r\n        return null;\r\n    }\r\n    return (\r\n        <div style={layerStyles}>\r\n            <div\r\n                style={getItemStyles(\r\n                    initialOffset,\r\n                    currentOffset,\r\n                    pointerOffset,\r\n                    viewMethod\r\n                )}\r\n            >\r\n                {image}\r\n            </div>\r\n        </div>\r\n    );\r\n};\r\nexport default CustomDragLayer;\r\n","import {\r\n    Divider,\r\n    ListItemIcon,\r\n    MenuItem,\r\n    Typography,\r\n    withStyles,\r\n} from \"@material-ui/core\";\r\nimport Menu from \"@material-ui/core/Menu\";\r\nimport { Archive, InfoOutlined, Unarchive } from \"@material-ui/icons\";\r\nimport RenameIcon from \"@material-ui/icons/BorderColor\";\r\nimport DownloadIcon from \"@material-ui/icons/CloudDownload\";\r\nimport UploadIcon from \"@material-ui/icons/CloudUpload\";\r\nimport NewFolderIcon from \"@material-ui/icons/CreateNewFolder\";\r\nimport DeleteIcon from \"@material-ui/icons/Delete\";\r\nimport FileCopyIcon from \"@material-ui/icons/FileCopy\";\r\nimport OpenFolderIcon from \"@material-ui/icons/FolderOpen\";\r\nimport MoveIcon from \"@material-ui/icons/Input\";\r\nimport LinkIcon from \"@material-ui/icons/InsertLink\";\r\nimport OpenIcon from \"@material-ui/icons/OpenInNew\";\r\nimport ShareIcon from \"@material-ui/icons/Share\";\r\nimport {\r\n    FolderDownload,\r\n    FolderUpload,\r\n    MagnetOn,\r\n    FilePlus,\r\n} from \"mdi-material-ui\";\r\nimport PropTypes from \"prop-types\";\r\nimport React, { Component } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport { isCompressFile, isPreviewable, isTorrent } from \"../../config\";\r\nimport Auth from \"../../middleware/Auth\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport RefreshIcon from \"@material-ui/icons/Refresh\";\r\nimport {\r\n    batchGetSource,\r\n    openPreview,\r\n    setSelectedTarget,\r\n    startBatchDownload,\r\n    startDirectoryDownload,\r\n    startDownload,\r\n    toggleObjectInfoSidebar,\r\n} from \"../../redux/explorer/action\";\r\nimport {\r\n    changeContextMenu,\r\n    navigateTo,\r\n    openCompressDialog,\r\n    openCopyDialog,\r\n    openCreateFileDialog,\r\n    openCreateFolderDialog,\r\n    openDecompressDialog,\r\n    openLoadingDialog,\r\n    openMoveDialog,\r\n    openMusicDialog,\r\n    openRemoteDownloadDialog,\r\n    openRemoveDialog,\r\n    openRenameDialog,\r\n    openShareDialog,\r\n    openTorrentDownloadDialog,\r\n    refreshFileList,\r\n    setNavigatorLoadingStatus,\r\n    showImgPreivew,\r\n    toggleSnackbar,\r\n} from \"../../redux/explorer\";\r\nimport { pathJoin } from \"../Uploader/core/utils\";\r\nimport {\r\n    openFileSelector,\r\n    openFolderSelector,\r\n} from \"../../redux/viewUpdate/action\";\r\nimport { withTranslation } from \"react-i18next\";\r\n\r\nconst styles = () => ({\r\n    propover: {},\r\n    divider: {\r\n        marginTop: 4,\r\n        marginBottom: 4,\r\n    },\r\n});\r\n\r\nconst StyledListItemIcon = withStyles({\r\n    root: {\r\n        minWidth: 38,\r\n    },\r\n})(ListItemIcon);\r\n\r\nconst mapStateToProps = (state) => {\r\n    return {\r\n        menuType: state.viewUpdate.contextType,\r\n        menuOpen: state.viewUpdate.contextOpen,\r\n        isMultiple: state.explorer.selectProps.isMultiple,\r\n        withFolder: state.explorer.selectProps.withFolder,\r\n        withFile: state.explorer.selectProps.withFile,\r\n        withSourceEnabled: state.explorer.selectProps.withSourceEnabled,\r\n        path: state.navigator.path,\r\n        selected: state.explorer.selected,\r\n        search: state.explorer.search,\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n    return {\r\n        changeContextMenu: (type, open) => {\r\n            dispatch(changeContextMenu(type, open));\r\n        },\r\n        setNavigatorLoadingStatus: (status) => {\r\n            dispatch(setNavigatorLoadingStatus(status));\r\n        },\r\n        setSelectedTarget: (targets) => {\r\n            dispatch(setSelectedTarget(targets));\r\n        },\r\n        navigateTo: (path) => {\r\n            dispatch(navigateTo(path));\r\n        },\r\n        openCreateFolderDialog: () => {\r\n            dispatch(openCreateFolderDialog());\r\n        },\r\n        openCreateFileDialog: () => {\r\n            dispatch(openCreateFileDialog());\r\n        },\r\n        openRenameDialog: () => {\r\n            dispatch(openRenameDialog());\r\n        },\r\n        openMoveDialog: () => {\r\n            dispatch(openMoveDialog());\r\n        },\r\n        openRemoveDialog: () => {\r\n            dispatch(openRemoveDialog());\r\n        },\r\n        openShareDialog: () => {\r\n            dispatch(openShareDialog());\r\n        },\r\n        showImgPreivew: (first) => {\r\n            dispatch(showImgPreivew(first));\r\n        },\r\n        openMusicDialog: () => {\r\n            dispatch(openMusicDialog());\r\n        },\r\n        toggleSnackbar: (vertical, horizontal, msg, color) => {\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color));\r\n        },\r\n        openRemoteDownloadDialog: () => {\r\n            dispatch(openRemoteDownloadDialog());\r\n        },\r\n        openTorrentDownloadDialog: () => {\r\n            dispatch(openTorrentDownloadDialog());\r\n        },\r\n        openCopyDialog: () => {\r\n            dispatch(openCopyDialog());\r\n        },\r\n        openLoadingDialog: (text) => {\r\n            dispatch(openLoadingDialog(text));\r\n        },\r\n        openDecompressDialog: () => {\r\n            dispatch(openDecompressDialog());\r\n        },\r\n        openCompressDialog: () => {\r\n            dispatch(openCompressDialog());\r\n        },\r\n        refreshFileList: () => {\r\n            dispatch(refreshFileList());\r\n        },\r\n        openPreview: (share) => {\r\n            dispatch(openPreview(share));\r\n        },\r\n        toggleObjectInfoSidebar: (open) => {\r\n            dispatch(toggleObjectInfoSidebar(open));\r\n        },\r\n        startBatchDownload: (share) => {\r\n            dispatch(startBatchDownload(share));\r\n        },\r\n        openFileSelector: () => {\r\n            dispatch(openFileSelector());\r\n        },\r\n        openFolderSelector: () => {\r\n            dispatch(openFolderSelector());\r\n        },\r\n        startDownload: (share, file) => {\r\n            dispatch(startDownload(share, file));\r\n        },\r\n        batchGetSource: () => {\r\n            dispatch(batchGetSource());\r\n        },\r\n        startDirectoryDownload: (share) => {\r\n            dispatch(startDirectoryDownload(share));\r\n        },\r\n    };\r\n};\r\n\r\nclass ContextMenuCompoment extends Component {\r\n    X = 0;\r\n    Y = 0;\r\n\r\n    state = {};\r\n\r\n    componentDidMount = () => {\r\n        window.document.addEventListener(\"mousemove\", this.setPoint);\r\n    };\r\n\r\n    setPoint = (e) => {\r\n        this.Y = e.clientY;\r\n        this.X = e.clientX;\r\n    };\r\n\r\n    openArchiveDownload = () => {\r\n        this.props.startBatchDownload(this.props.share);\r\n    };\r\n\r\n    openDirectoryDownload = () => {\r\n        this.props.startDirectoryDownload(this.props.share);\r\n    };\r\n\r\n    openDownload = () => {\r\n        this.props.startDownload(this.props.share, this.props.selected[0]);\r\n    };\r\n\r\n    enterFolder = () => {\r\n        this.props.navigateTo(\r\n            pathJoin([this.props.path, this.props.selected[0].name])\r\n        );\r\n    };\r\n\r\n    // 暂时只对空白处右键菜单使用这个函数,疑似有bug会导致的一个菜单被默认选中。\r\n    // 相关issue: https://github.com/mui-org/material-ui/issues/23747\r\n    renderMenuItems = (items) => {\r\n        const res = [];\r\n        let key = 0;\r\n\r\n        [\"top\", \"center\", \"bottom\"].forEach((position) => {\r\n            let visibleCount = 0;\r\n            items[position].forEach((item) => {\r\n                if (item.condition) {\r\n                    res.push(\r\n                        <MenuItem dense key={key} onClick={item.onClick}>\r\n                            <ListItemIcon>{item.icon}</ListItemIcon>\r\n                            <Typography variant=\"inherit\">\r\n                                {item.text}\r\n                            </Typography>\r\n                        </MenuItem>\r\n                    );\r\n                    key++;\r\n                    visibleCount++;\r\n                }\r\n            });\r\n            if (visibleCount > 0 && position != \"bottom\") {\r\n                res.push(\r\n                    <Divider key={key} className={this.props.classes.divider} />\r\n                );\r\n                key++;\r\n            }\r\n        });\r\n\r\n        return res;\r\n    };\r\n\r\n    render() {\r\n        const { classes, t } = this.props;\r\n        const user = Auth.GetUser();\r\n        const isHomePage = pathHelper.isHomePage(this.props.location.pathname);\r\n        const emptyMenuList = {\r\n            top: [\r\n                {\r\n                    condition: true,\r\n                    onClick: () => {\r\n                        this.props.refreshFileList();\r\n                        this.props.changeContextMenu(\r\n                            this.props.menuType,\r\n                            false\r\n                        );\r\n                    },\r\n                    icon: <RefreshIcon />,\r\n                    text: \"刷新\",\r\n                },\r\n            ],\r\n            center: [\r\n                {\r\n                    condition: true,\r\n                    onClick: () => this.props.openFileSelector(),\r\n                    icon: <UploadIcon />,\r\n                    text: \"上传文件\",\r\n                },\r\n                {\r\n                    condition: true,\r\n                    onClick: () => this.props.openFolderSelector(),\r\n                    icon: <FolderUpload />,\r\n                    text: \"上传目录\",\r\n                },\r\n                {\r\n                    condition: user.group.allowRemoteDownload,\r\n                    onClick: () => this.props.openRemoteDownloadDialog(),\r\n                    icon: <DownloadIcon />,\r\n                    text: \"离线下载\",\r\n                },\r\n            ],\r\n            bottom: [\r\n                {\r\n                    condition: true,\r\n                    onClick: () => this.props.openCreateFolderDialog(),\r\n                    icon: <NewFolderIcon />,\r\n                    text: \"创建文件夹\",\r\n                },\r\n                {\r\n                    condition: true,\r\n                    onClick: () => this.props.openCreateFileDialog(),\r\n                    icon: <FilePlus />,\r\n                    text: \"创建文件\",\r\n                },\r\n            ],\r\n        };\r\n\r\n        return (\r\n            <div>\r\n                <Menu\r\n                    keepMounted\r\n                    open={this.props.menuOpen}\r\n                    onClose={() =>\r\n                        this.props.changeContextMenu(this.props.menuType, false)\r\n                    }\r\n                    anchorReference=\"anchorPosition\"\r\n                    anchorPosition={{ top: this.Y, left: this.X }}\r\n                    anchorOrigin={{\r\n                        vertical: \"top\",\r\n                        horizontal: \"left\",\r\n                    }}\r\n                    transformOrigin={{\r\n                        vertical: \"top\",\r\n                        horizontal: \"left\",\r\n                    }}\r\n                >\r\n                    {this.props.menuType === \"empty\" && (\r\n                        <div>\r\n                            <MenuItem\r\n                                dense\r\n                                onClick={() => {\r\n                                    this.props.refreshFileList();\r\n                                    this.props.changeContextMenu(\r\n                                        this.props.menuType,\r\n                                        false\r\n                                    );\r\n                                }}\r\n                            >\r\n                                <StyledListItemIcon>\r\n                                    <RefreshIcon />\r\n                                </StyledListItemIcon>\r\n                                <Typography variant=\"inherit\">\r\n                                    {t(\"fileManager.refresh\")}\r\n                                </Typography>\r\n                            </MenuItem>\r\n                            <Divider className={classes.divider} />\r\n                            <MenuItem\r\n                                dense\r\n                                onClick={() => this.props.openFileSelector()}\r\n                            >\r\n                                <StyledListItemIcon>\r\n                                    <UploadIcon />\r\n                                </StyledListItemIcon>\r\n                                <Typography variant=\"inherit\">\r\n                                    {t(\"fileManager.uploadFiles\")}\r\n                                </Typography>\r\n                            </MenuItem>\r\n                            <MenuItem\r\n                                dense\r\n                                onClick={() => this.props.openFolderSelector()}\r\n                            >\r\n                                <StyledListItemIcon>\r\n                                    <FolderUpload />\r\n                                </StyledListItemIcon>\r\n                                <Typography variant=\"inherit\">\r\n                                    {t(\"fileManager.uploadFolder\")}\r\n                                </Typography>\r\n                            </MenuItem>\r\n                            {user.group.allowRemoteDownload && (\r\n                                <MenuItem\r\n                                    dense\r\n                                    onClick={() =>\r\n                                        this.props.openRemoteDownloadDialog()\r\n                                    }\r\n                                >\r\n                                    <StyledListItemIcon>\r\n                                        <DownloadIcon />\r\n                                    </StyledListItemIcon>\r\n                                    <Typography variant=\"inherit\">\r\n                                        {t(\"fileManager.newRemoteDownloads\")}\r\n                                    </Typography>\r\n                                </MenuItem>\r\n                            )}\r\n\r\n                            <Divider className={classes.divider} />\r\n                            <MenuItem\r\n                                dense\r\n                                onClick={() =>\r\n                                    this.props.openCreateFolderDialog()\r\n                                }\r\n                            >\r\n                                <StyledListItemIcon>\r\n                                    <NewFolderIcon />\r\n                                </StyledListItemIcon>\r\n                                <Typography variant=\"inherit\">\r\n                                    {t(\"fileManager.newFolder\")}\r\n                                </Typography>\r\n                            </MenuItem>\r\n                            <MenuItem\r\n                                dense\r\n                                onClick={() =>\r\n                                    this.props.openCreateFileDialog()\r\n                                }\r\n                            >\r\n                                <StyledListItemIcon>\r\n                                    <FilePlus />\r\n                                </StyledListItemIcon>\r\n                                <Typography variant=\"inherit\">\r\n                                    {t(\"fileManager.newFile\")}\r\n                                </Typography>\r\n                            </MenuItem>\r\n                        </div>\r\n                    )}\r\n                    {this.props.menuType !== \"empty\" && (\r\n                        <div>\r\n                            {!this.props.isMultiple && this.props.withFolder && (\r\n                                <div>\r\n                                    <MenuItem dense onClick={this.enterFolder}>\r\n                                        <StyledListItemIcon>\r\n                                            <OpenFolderIcon />\r\n                                        </StyledListItemIcon>\r\n                                        <Typography variant=\"inherit\">\r\n                                            {t(\"fileManager.enter\")}\r\n                                        </Typography>\r\n                                    </MenuItem>\r\n                                    {isHomePage && (\r\n                                        <Divider className={classes.divider} />\r\n                                    )}\r\n                                </div>\r\n                            )}\r\n                            {!this.props.isMultiple &&\r\n                                this.props.withFile &&\r\n                                (!this.props.share ||\r\n                                    this.props.share.preview) &&\r\n                                isPreviewable(this.props.selected[0].name) && (\r\n                                    <div>\r\n                                        <MenuItem\r\n                                            dense\r\n                                            onClick={() =>\r\n                                                this.props.openPreview()\r\n                                            }\r\n                                        >\r\n                                            <StyledListItemIcon>\r\n                                                <OpenIcon />\r\n                                            </StyledListItemIcon>\r\n                                            <Typography variant=\"inherit\">\r\n                                                {t(\"fileManager.open\")}\r\n                                            </Typography>\r\n                                        </MenuItem>\r\n                                    </div>\r\n                                )}\r\n\r\n                            {!this.props.isMultiple && this.props.withFile && (\r\n                                <div>\r\n                                    <MenuItem\r\n                                        dense\r\n                                        onClick={() =>\r\n                                            this.openDownload(this.props.share)\r\n                                        }\r\n                                    >\r\n                                        <StyledListItemIcon>\r\n                                            <DownloadIcon />\r\n                                        </StyledListItemIcon>\r\n                                        <Typography variant=\"inherit\">\r\n                                            {t(\"fileManager.download\")}\r\n                                        </Typography>\r\n                                    </MenuItem>\r\n                                    {isHomePage && (\r\n                                        <Divider className={classes.divider} />\r\n                                    )}\r\n                                </div>\r\n                            )}\r\n\r\n                            {(this.props.isMultiple || this.props.withFolder) &&\r\n                                window.showDirectoryPicker &&\r\n                                window.isSecureContext && (\r\n                                    <MenuItem\r\n                                        dense\r\n                                        onClick={() =>\r\n                                            this.openDirectoryDownload()\r\n                                        }\r\n                                    >\r\n                                        <StyledListItemIcon>\r\n                                            <FolderDownload />\r\n                                        </StyledListItemIcon>\r\n                                        <Typography variant=\"inherit\">\r\n                                            {t(\"fileManager.download\")}\r\n                                        </Typography>\r\n                                    </MenuItem>\r\n                                )}\r\n\r\n                            {(this.props.isMultiple ||\r\n                                this.props.withFolder) && (\r\n                                <MenuItem\r\n                                    dense\r\n                                    onClick={() => this.openArchiveDownload()}\r\n                                >\r\n                                    <StyledListItemIcon>\r\n                                        <DownloadIcon />\r\n                                    </StyledListItemIcon>\r\n                                    <Typography variant=\"inherit\">\r\n                                        {t(\"fileManager.batchDownload\")}\r\n                                    </Typography>\r\n                                </MenuItem>\r\n                            )}\r\n\r\n                            {isHomePage &&\r\n                                user.group.sourceBatch > 0 &&\r\n                                this.props.withSourceEnabled && (\r\n                                    <MenuItem\r\n                                        dense\r\n                                        onClick={() =>\r\n                                            this.props.batchGetSource()\r\n                                        }\r\n                                    >\r\n                                        <StyledListItemIcon>\r\n                                            <LinkIcon />\r\n                                        </StyledListItemIcon>\r\n                                        <Typography variant=\"inherit\">\r\n                                            {this.props.isMultiple ||\r\n                                            (this.props.withFolder &&\r\n                                                !this.props.withFile)\r\n                                                ? t(\r\n                                                      \"fileManager.getSourceLinkInBatch\"\r\n                                                  )\r\n                                                : t(\r\n                                                      \"fileManager.getSourceLink\"\r\n                                                  )}\r\n                                        </Typography>\r\n                                    </MenuItem>\r\n                                )}\r\n\r\n                            {!this.props.isMultiple &&\r\n                                isHomePage &&\r\n                                user.group.allowRemoteDownload &&\r\n                                this.props.withFile &&\r\n                                isTorrent(this.props.selected[0].name) && (\r\n                                    <MenuItem\r\n                                        dense\r\n                                        onClick={() =>\r\n                                            this.props.openTorrentDownloadDialog()\r\n                                        }\r\n                                    >\r\n                                        <StyledListItemIcon>\r\n                                            <MagnetOn />\r\n                                        </StyledListItemIcon>\r\n                                        <Typography variant=\"inherit\">\r\n                                            {t(\r\n                                                \"fileManager.createRemoteDownloadForTorrent\"\r\n                                            )}\r\n                                        </Typography>\r\n                                    </MenuItem>\r\n                                )}\r\n                            {!this.props.isMultiple &&\r\n                                isHomePage &&\r\n                                user.group.compress &&\r\n                                this.props.withFile &&\r\n                                isCompressFile(this.props.selected[0].name) && (\r\n                                    <MenuItem\r\n                                        dense\r\n                                        onClick={() =>\r\n                                            this.props.openDecompressDialog()\r\n                                        }\r\n                                    >\r\n                                        <StyledListItemIcon>\r\n                                            <Unarchive />\r\n                                        </StyledListItemIcon>\r\n                                        <Typography variant=\"inherit\">\r\n                                            {t(\"fileManager.decompress\")}\r\n                                        </Typography>\r\n                                    </MenuItem>\r\n                                )}\r\n\r\n                            {isHomePage && user.group.compress && (\r\n                                <MenuItem\r\n                                    dense\r\n                                    onClick={() =>\r\n                                        this.props.openCompressDialog()\r\n                                    }\r\n                                >\r\n                                    <StyledListItemIcon>\r\n                                        <Archive />\r\n                                    </StyledListItemIcon>\r\n                                    <Typography variant=\"inherit\">\r\n                                        {t(\"fileManager.compress\")}\r\n                                    </Typography>\r\n                                </MenuItem>\r\n                            )}\r\n\r\n                            {!this.props.isMultiple && isHomePage && (\r\n                                <MenuItem\r\n                                    dense\r\n                                    onClick={() => this.props.openShareDialog()}\r\n                                >\r\n                                    <StyledListItemIcon>\r\n                                        <ShareIcon />\r\n                                    </StyledListItemIcon>\r\n                                    <Typography variant=\"inherit\">\r\n                                        {t(\"fileManager.createShareLink\")}\r\n                                    </Typography>\r\n                                </MenuItem>\r\n                            )}\r\n\r\n                            {!this.props.isMultiple && isHomePage && (\r\n                                <MenuItem\r\n                                    dense\r\n                                    onClick={() =>\r\n                                        this.props.toggleObjectInfoSidebar(true)\r\n                                    }\r\n                                >\r\n                                    <StyledListItemIcon>\r\n                                        <InfoOutlined />\r\n                                    </StyledListItemIcon>\r\n                                    <Typography variant=\"inherit\">\r\n                                        {t(\"fileManager.viewDetails\")}\r\n                                    </Typography>\r\n                                </MenuItem>\r\n                            )}\r\n\r\n                            {!this.props.isMultiple && isHomePage && (\r\n                                <Divider className={classes.divider} />\r\n                            )}\r\n\r\n                            {!this.props.isMultiple && isHomePage && (\r\n                                <div>\r\n                                    <MenuItem\r\n                                        dense\r\n                                        onClick={() =>\r\n                                            this.props.openRenameDialog()\r\n                                        }\r\n                                    >\r\n                                        <StyledListItemIcon>\r\n                                            <RenameIcon />\r\n                                        </StyledListItemIcon>\r\n                                        <Typography variant=\"inherit\">\r\n                                            {t(\"fileManager.rename\")}\r\n                                        </Typography>\r\n                                    </MenuItem>\r\n                                    {!this.props.search && (\r\n                                        <MenuItem\r\n                                            dense\r\n                                            onClick={() =>\r\n                                                this.props.openCopyDialog()\r\n                                            }\r\n                                        >\r\n                                            <StyledListItemIcon>\r\n                                                <FileCopyIcon />\r\n                                            </StyledListItemIcon>\r\n                                            <Typography variant=\"inherit\">\r\n                                                {t(\"fileManager.copy\")}\r\n                                            </Typography>\r\n                                        </MenuItem>\r\n                                    )}\r\n                                </div>\r\n                            )}\r\n                            {isHomePage && (\r\n                                <div>\r\n                                    {!this.props.search && (\r\n                                        <MenuItem\r\n                                            dense\r\n                                            onClick={() =>\r\n                                                this.props.openMoveDialog()\r\n                                            }\r\n                                        >\r\n                                            <StyledListItemIcon>\r\n                                                <MoveIcon />\r\n                                            </StyledListItemIcon>\r\n                                            <Typography variant=\"inherit\">\r\n                                                {t(\"fileManager.move\")}\r\n                                            </Typography>\r\n                                        </MenuItem>\r\n                                    )}\r\n\r\n                                    <Divider className={classes.divider} />\r\n                                    <MenuItem\r\n                                        dense\r\n                                        className={classes.propover}\r\n                                        onClick={() =>\r\n                                            this.props.openRemoveDialog()\r\n                                        }\r\n                                    >\r\n                                        <StyledListItemIcon>\r\n                                            <DeleteIcon />\r\n                                        </StyledListItemIcon>\r\n                                        <Typography variant=\"inherit\">\r\n                                            {t(\"fileManager.delete\")}\r\n                                        </Typography>\r\n                                    </MenuItem>\r\n                                </div>\r\n                            )}\r\n                        </div>\r\n                    )}\r\n                </Menu>\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nContextMenuCompoment.propTypes = {\r\n    classes: PropTypes.object.isRequired,\r\n    menuType: PropTypes.string.isRequired,\r\n};\r\n\r\nconst ContextMenu = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(withRouter(withTranslation()(ContextMenuCompoment))));\r\n\r\nexport default ContextMenu;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { connect } from \"react-redux\";\r\n\r\nimport FolderIcon from \"@material-ui/icons/Folder\";\r\nimport classNames from \"classnames\";\r\nimport { sizeToString } from \"../../utils/index\";\r\nimport {\r\n    fade,\r\n    TableCell,\r\n    TableRow,\r\n    Typography,\r\n    withStyles,\r\n} from \"@material-ui/core\";\r\nimport TypeIcon from \"./TypeIcon\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport statusHelper from \"../../utils/page\";\r\nimport { withRouter } from \"react-router\";\r\nimport KeyboardReturnIcon from \"@material-ui/icons/KeyboardReturn\";\r\nimport CheckCircleRoundedIcon from \"@material-ui/icons/CheckCircleRounded\";\r\nimport Grow from \"@material-ui/core/Grow\";\r\nimport { formatLocalTime } from \"../../utils/datetime\";\r\nimport FileName from \"./FileName\";\r\n\r\nconst styles = (theme) => ({\r\n    selected: {\r\n        \"&:hover\": {},\r\n        backgroundColor: fade(theme.palette.primary.main, 0.18),\r\n    },\r\n\r\n    selectedShared: {\r\n        \"&:hover\": {},\r\n        backgroundColor: fade(theme.palette.primary.main, 0.18),\r\n    },\r\n\r\n    notSelected: {\r\n        \"&:hover\": {\r\n            backgroundColor: theme.palette.action.hover,\r\n        },\r\n    },\r\n    icon: {\r\n        verticalAlign: \"middle\",\r\n        marginRight: \"20px\",\r\n        color: theme.palette.text.secondary,\r\n    },\r\n    tableIcon: {\r\n        marginRight: \"20px\",\r\n        verticalAlign: \"middle\",\r\n    },\r\n    folderNameSelected: {\r\n        color:\r\n            theme.palette.type === \"dark\" ? \"#fff\" : theme.palette.primary.dark,\r\n        fontWeight: \"500\",\r\n        userSelect: \"none\",\r\n    },\r\n    folderNameNotSelected: {\r\n        color: theme.palette.text.secondary,\r\n        userSelect: \"none\",\r\n    },\r\n    folderName: {\r\n        marginRight: \"20px\",\r\n        display: \"flex\",\r\n        alignItems: \"center\",\r\n    },\r\n    hideAuto: {\r\n        [theme.breakpoints.down(\"sm\")]: {\r\n            display: \"none\",\r\n        },\r\n    },\r\n    tableRow: {\r\n        padding: \"10px 16px\",\r\n    },\r\n    checkIcon: {\r\n        color: theme.palette.primary.main,\r\n    },\r\n    active: {\r\n        backgroundColor: fade(theme.palette.primary.main, 0.1),\r\n    },\r\n});\r\n\r\nconst mapStateToProps = (state) => {\r\n    return {\r\n        selected: state.explorer.selected,\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = () => {\r\n    return {};\r\n};\r\n\r\nclass TableRowCompoment extends Component {\r\n    state = {};\r\n\r\n    shouldComponentUpdate(nextProps, nextState, nextContext) {\r\n        const isSelectedCurrent =\r\n            this.props.selected.findIndex((value) => {\r\n                return value === this.props.file;\r\n            }) !== -1;\r\n        const isSelectedNext =\r\n            nextProps.selected.findIndex((value) => {\r\n                return value === this.props.file;\r\n            }) !== -1;\r\n        if (\r\n            nextProps.selected !== this.props.selected &&\r\n            isSelectedCurrent === isSelectedNext\r\n        ) {\r\n            return false;\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n    render() {\r\n        const { classes } = this.props;\r\n        const isShare = pathHelper.isSharePage(this.props.location.pathname);\r\n\r\n        let icon;\r\n        if (this.props.file.type === \"dir\") {\r\n            icon = <FolderIcon className={classes.icon} />;\r\n        } else if (this.props.file.type === \"up\") {\r\n            icon = <KeyboardReturnIcon className={classes.icon} />;\r\n        } else {\r\n            icon = (\r\n                <TypeIcon\r\n                    className={classes.tableIcon}\r\n                    fileName={this.props.file.name}\r\n                />\r\n            );\r\n        }\r\n        const isSelected =\r\n            this.props.selected.findIndex((value) => {\r\n                return value === this.props.file;\r\n            }) !== -1;\r\n        const isMobile = statusHelper.isMobile();\r\n\r\n        return (\r\n            <TableRow\r\n                ref={this.props.pref}\r\n                onContextMenu={this.props.contextMenu}\r\n                onClick={this.props.handleClick}\r\n                onDoubleClick={this.props.handleDoubleClick.bind(this)}\r\n                className={classNames({\r\n                    [classes.selected]: isSelected && !isShare,\r\n                    [classes.selectedShared]: isSelected && isShare,\r\n                    [classes.notSelected]: !isSelected,\r\n                    [classes.active]: this.props.isActive,\r\n                })}\r\n            >\r\n                <TableCell\r\n                    ref={this.props.dref}\r\n                    component=\"th\"\r\n                    scope=\"row\"\r\n                    className={classes.tableRow}\r\n                >\r\n                    <Typography\r\n                        variant=\"body2\"\r\n                        className={classNames(classes.folderName, {\r\n                            [classes.folderNameSelected]: isSelected,\r\n                            [classes.folderNameNotSelected]: !isSelected,\r\n                        })}\r\n                    >\r\n                        <div\r\n                            onClick={\r\n                                this.props.file.type !== \"up\"\r\n                                    ? this.props.onIconClick\r\n                                    : null\r\n                            }\r\n                        >\r\n                            {!isSelected && icon}\r\n                            {isSelected && (\r\n                                <Grow in={isSelected}>\r\n                                    <CheckCircleRoundedIcon\r\n                                        className={classNames(\r\n                                            classes.checkIcon,\r\n                                            classes.icon\r\n                                        )}\r\n                                    />\r\n                                </Grow>\r\n                            )}\r\n                        </div>\r\n                        <FileName name={this.props.file.name} />\r\n                    </Typography>\r\n                </TableCell>\r\n                <TableCell\r\n                    className={classNames(classes.hideAuto, classes.tableRow)}\r\n                >\r\n                    <Typography\r\n                        variant=\"body2\"\r\n                        className={classNames(classes.folderName, {\r\n                            [classes.folderNameSelected]: isSelected,\r\n                            [classes.folderNameNotSelected]: !isSelected,\r\n                        })}\r\n                    >\r\n                        {\" \"}\r\n                        {this.props.file.type !== \"dir\" &&\r\n                            this.props.file.type !== \"up\" &&\r\n                            sizeToString(this.props.file.size)}\r\n                    </Typography>\r\n                </TableCell>\r\n                <TableCell\r\n                    className={classNames(classes.hideAuto, classes.tableRow)}\r\n                >\r\n                    <Typography\r\n                        variant=\"body2\"\r\n                        className={classNames(classes.folderName, {\r\n                            [classes.folderNameSelected]: isSelected,\r\n                            [classes.folderNameNotSelected]: !isSelected,\r\n                        })}\r\n                    >\r\n                        {\" \"}\r\n                        {formatLocalTime(this.props.file.date)}\r\n                    </Typography>\r\n                </TableCell>\r\n            </TableRow>\r\n        );\r\n    }\r\n}\r\n\r\nTableRowCompoment.propTypes = {\r\n    classes: PropTypes.object.isRequired,\r\n    file: PropTypes.object.isRequired,\r\n};\r\n\r\nconst TableItem = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(withRouter(TableRowCompoment)));\r\n\r\nexport default TableItem;\r\n","import React from \"react\";\r\nimport { useDrop } from \"react-dnd\";\r\nimport Folder from \"../Folder\";\r\nimport classNames from \"classnames\";\r\nimport TableItem from \"../TableRow\";\r\nexport default function FolderDropWarpper({\r\n    isListView,\r\n    folder,\r\n    onIconClick,\r\n    contextMenu,\r\n    handleClick,\r\n    handleDoubleClick,\r\n    className,\r\n    pref,\r\n}) {\r\n    const [{ canDrop, isOver }, drop] = useDrop({\r\n        accept: \"object\",\r\n        drop: () => ({ folder }),\r\n        collect: (monitor) => ({\r\n            isOver: monitor.isOver(),\r\n            canDrop: monitor.canDrop(),\r\n        }),\r\n    });\r\n    const isActive = canDrop && isOver;\r\n    if (!isListView) {\r\n        return (\r\n            <div ref={drop}>\r\n                <Folder\r\n                    folder={folder}\r\n                    onIconClick={onIconClick}\r\n                    isActive={isActive}\r\n                />\r\n            </div>\r\n        );\r\n    }\r\n    return (\r\n        <TableItem\r\n            pref={pref}\r\n            dref={drop}\r\n            className={className}\r\n            onIconClick={onIconClick}\r\n            contextMenu={contextMenu}\r\n            handleClick={handleClick}\r\n            handleDoubleClick={handleDoubleClick}\r\n            file={folder}\r\n            isActive={isActive}\r\n        />\r\n    );\r\n}\r\n","import { useRef } from \"react\";\r\nimport { throttle } from \"lodash\";\r\n\r\nconst useDragScrolling = () => {\r\n    const isScrolling = useRef(false);\r\n    const target = document.querySelector(\"#explorer-container\");\r\n\r\n    const goDown = () => {\r\n        target.scrollTop += 10;\r\n\r\n        const { offsetHeight, scrollTop, scrollHeight } = target;\r\n        const isScrollEnd = offsetHeight + scrollTop >= scrollHeight;\r\n\r\n        if (isScrolling.current && !isScrollEnd) {\r\n            window.requestAnimationFrame(goDown);\r\n        }\r\n    };\r\n\r\n    const goUp = () => {\r\n        target.scrollTop -= 10;\r\n\r\n        if (isScrolling.current && target.scrollTop > 0) {\r\n            window.requestAnimationFrame(goUp);\r\n        }\r\n    };\r\n\r\n    const onDragOver = (event) => {\r\n        const isMouseOnTop = event.clientY < 100;\r\n        const isMouseOnDown = window.innerHeight - event.clientY < 100;\r\n\r\n        if (!isScrolling.current && (isMouseOnTop || isMouseOnDown)) {\r\n            isScrolling.current = true;\r\n\r\n            if (isMouseOnTop) {\r\n                window.requestAnimationFrame(goUp);\r\n            }\r\n\r\n            if (isMouseOnDown) {\r\n                window.requestAnimationFrame(goDown);\r\n            }\r\n        } else if (!isMouseOnTop && !isMouseOnDown) {\r\n            isScrolling.current = false;\r\n        }\r\n    };\r\n\r\n    const throttleOnDragOver = throttle(onDragOver, 300);\r\n\r\n    const addEventListenerForWindow = () => {\r\n        window.addEventListener(\"dragover\", throttleOnDragOver, false);\r\n    };\r\n\r\n    const removeEventListenerForWindow = () => {\r\n        window.removeEventListener(\"dragover\", throttleOnDragOver, false);\r\n        isScrolling.current = false;\r\n    };\r\n\r\n    return {\r\n        addEventListenerForWindow,\r\n        removeEventListenerForWindow,\r\n    };\r\n};\r\n\r\nexport default useDragScrolling;\r\n","import React, { useCallback, useEffect } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport statusHelper from \"../../utils/page\";\r\nimport FileIcon from \"./FileIcon\";\r\nimport SmallIcon from \"./SmallIcon\";\r\nimport TableItem from \"./TableRow\";\r\nimport classNames from \"classnames\";\r\nimport { makeStyles } from \"@material-ui/core\";\r\nimport { useDrag } from \"react-dnd\";\r\nimport { getEmptyImage } from \"react-dnd-html5-backend\";\r\nimport DropWarpper from \"./DnD/DropWarpper\";\r\nimport { useLocation } from \"react-router-dom\";\r\nimport { pathBack } from \"../../utils\";\r\nimport {\r\n    changeContextMenu,\r\n    dragAndDrop,\r\n    navigateTo,\r\n    openLoadingDialog,\r\n    openPreview,\r\n    selectFile,\r\n    setSelectedTarget,\r\n    toggleSnackbar,\r\n} from \"../../redux/explorer\";\r\nimport useDragScrolling from \"./DnD/Scrolling\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n    container: {\r\n        padding: \"7px\",\r\n    },\r\n    fixFlex: {\r\n        minWidth: 0,\r\n    },\r\n    dragging: {\r\n        opacity: 0.4,\r\n    },\r\n}));\r\n\r\nexport default function ObjectIcon(props) {\r\n    const path = useSelector((state) => state.navigator.path);\r\n    const shareInfo = useSelector((state) => state.viewUpdate.shareInfo);\r\n    const selected = useSelector((state) => state.explorer.selected);\r\n    const viewMethod = useSelector(\r\n        (state) => state.viewUpdate.explorerViewMethod\r\n    );\r\n    const navigatorPath = useSelector((state) => state.navigator.path);\r\n    const location = useLocation();\r\n\r\n    const dispatch = useDispatch();\r\n    const ContextMenu = useCallback(\r\n        (type, open) => dispatch(changeContextMenu(type, open)),\r\n        [dispatch]\r\n    );\r\n    const SetSelectedTarget = useCallback(\r\n        (targets) => dispatch(setSelectedTarget(targets)),\r\n        [dispatch]\r\n    );\r\n\r\n    const NavitateTo = useCallback((targets) => dispatch(navigateTo(targets)), [\r\n        dispatch,\r\n    ]);\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n    const DragAndDrop = useCallback(\r\n        (source, target) => dispatch(dragAndDrop(source, target)),\r\n        [dispatch]\r\n    );\r\n    const OpenLoadingDialog = useCallback(\r\n        (text) => dispatch(openLoadingDialog(text)),\r\n        [dispatch]\r\n    );\r\n    const OpenPreview = useCallback((share) => dispatch(openPreview(share)), [\r\n        dispatch,\r\n    ]);\r\n    const StartDownload = useCallback(\r\n        (share, file) => dispatch(StartDownload(share, file)),\r\n        [dispatch]\r\n    );\r\n\r\n    const classes = useStyles();\r\n\r\n    const contextMenu = (e) => {\r\n        if (props.file.type === \"up\") {\r\n            return;\r\n        }\r\n        e.preventDefault();\r\n        if (\r\n            selected.findIndex((value) => {\r\n                return value === props.file;\r\n            }) === -1\r\n        ) {\r\n            SetSelectedTarget([props.file]);\r\n        }\r\n        ContextMenu(\"file\", true);\r\n    };\r\n\r\n    const SelectFile = (e) => {\r\n        dispatch(selectFile(props.file, e, props.index));\r\n    };\r\n    const enterFolder = () => {\r\n        NavitateTo(\r\n            path === \"/\" ? path + props.file.name : path + \"/\" + props.file.name\r\n        );\r\n    };\r\n    const handleClick = (e) => {\r\n        if (props.file.type === \"up\") {\r\n            NavitateTo(pathBack(navigatorPath));\r\n            return;\r\n        }\r\n\r\n        SelectFile(e);\r\n        if (\r\n            props.file.type === \"dir\" &&\r\n            !e.ctrlKey &&\r\n            !e.metaKey &&\r\n            !e.shiftKey\r\n        ) {\r\n            enterFolder();\r\n        }\r\n    };\r\n\r\n    const handleDoubleClick = () => {\r\n        if (props.file.type === \"up\") {\r\n            return;\r\n        }\r\n        if (props.file.type === \"dir\") {\r\n            enterFolder();\r\n            return;\r\n        }\r\n\r\n        OpenPreview(shareInfo);\r\n    };\r\n\r\n    const handleIconClick = (e) => {\r\n        e.stopPropagation();\r\n        if (!e.shiftKey) {\r\n            e.ctrlKey = true;\r\n        }\r\n        SelectFile(e);\r\n        return false;\r\n    };\r\n\r\n    const {\r\n        addEventListenerForWindow,\r\n        removeEventListenerForWindow,\r\n    } = useDragScrolling();\r\n\r\n    const [{ isDragging }, drag, preview] = useDrag({\r\n        item: {\r\n            object: props.file,\r\n            type: \"object\",\r\n            selected: [...selected],\r\n            viewMethod: viewMethod,\r\n        },\r\n        begin: () => {\r\n            addEventListenerForWindow();\r\n        },\r\n        end: (item, monitor) => {\r\n            removeEventListenerForWindow();\r\n            const dropResult = monitor.getDropResult();\r\n            if (item && dropResult) {\r\n                if (dropResult.folder) {\r\n                    if (\r\n                        item.object.id !== dropResult.folder.id ||\r\n                        item.object.type !== dropResult.folder.type\r\n                    ) {\r\n                        DragAndDrop(item.object, dropResult.folder);\r\n                    }\r\n                }\r\n            }\r\n        },\r\n        canDrag: () => {\r\n            return (\r\n                !statusHelper.isMobile() &&\r\n                statusHelper.isHomePage(location.pathname)\r\n            );\r\n        },\r\n        collect: (monitor) => ({\r\n            isDragging: monitor.isDragging(),\r\n        }),\r\n    });\r\n\r\n    useEffect(() => {\r\n        preview(getEmptyImage(), { captureDraggingState: true });\r\n        // eslint-disable-next-line\r\n    }, []);\r\n\r\n    if (viewMethod === \"list\") {\r\n        return (\r\n            <>\r\n                {props.file.type === \"dir\" && (\r\n                    <DropWarpper\r\n                        isListView={true}\r\n                        pref={drag}\r\n                        className={classNames(classes.container, {\r\n                            [classes.dragging]: isDragging,\r\n                        })}\r\n                        onIconClick={handleIconClick}\r\n                        contextMenu={contextMenu}\r\n                        handleClick={handleClick}\r\n                        handleDoubleClick={handleDoubleClick.bind(this)}\r\n                        folder={props.file}\r\n                    />\r\n                )}\r\n                {props.file.type !== \"dir\" && (\r\n                    <TableItem\r\n                        pref={drag}\r\n                        className={classNames(classes.container, {\r\n                            [classes.dragging]: isDragging,\r\n                        })}\r\n                        onIconClick={handleIconClick}\r\n                        contextMenu={contextMenu}\r\n                        handleClick={handleClick}\r\n                        handleDoubleClick={handleDoubleClick.bind(this)}\r\n                        file={props.file}\r\n                    />\r\n                )}\r\n            </>\r\n        );\r\n    }\r\n\r\n    return (\r\n        <div\r\n            ref={drag}\r\n            className={classNames({\r\n                [classes.container]: viewMethod !== \"list\",\r\n                [classes.dragging]: isDragging,\r\n            })}\r\n        >\r\n            <div\r\n                className={classes.fixFlex}\r\n                onContextMenu={contextMenu}\r\n                onClick={handleClick}\r\n                onDoubleClick={handleDoubleClick.bind(this)}\r\n            >\r\n                {props.file.type === \"dir\" && viewMethod !== \"list\" && (\r\n                    <DropWarpper\r\n                        isListView={false}\r\n                        onIconClick={handleIconClick}\r\n                        folder={props.file}\r\n                    />\r\n                )}\r\n                {props.file.type === \"file\" && viewMethod === \"icon\" && (\r\n                    <FileIcon\r\n                        onIconClick={handleIconClick}\r\n                        ref={drag}\r\n                        file={props.file}\r\n                    />\r\n                )}\r\n                {props.file.type === \"file\" && viewMethod === \"smallIcon\" && (\r\n                    <SmallIcon\r\n                        onIconClick={handleIconClick}\r\n                        file={props.file}\r\n                    />\r\n                )}\r\n            </div>\r\n        </div>\r\n    );\r\n}\r\n","import {\r\n    CircularProgress,\r\n    Grid,\r\n    Paper,\r\n    Table,\r\n    TableBody,\r\n    TableCell,\r\n    TableHead,\r\n    TableRow,\r\n    Typography,\r\n} from \"@material-ui/core\";\r\nimport TableSortLabel from \"@material-ui/core/TableSortLabel\";\r\nimport classNames from \"classnames\";\r\nimport React, { useCallback, useEffect, useMemo } from \"react\";\r\nimport { configure, GlobalHotKeys } from \"react-hotkeys\";\r\nimport explorer, {\r\n    changeContextMenu,\r\n    openRemoveDialog,\r\n    setSelectedTarget,\r\n} from \"../../redux/explorer\";\r\nimport { isMac } from \"../../utils\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport ContextMenu from \"./ContextMenu\";\r\nimport ImgPreivew from \"./ImgPreview\";\r\nimport ObjectIcon from \"./ObjectIcon\";\r\nimport Nothing from \"../Placeholder/Nothing\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { useLocation } from \"react-router\";\r\nimport { usePagination } from \"../../hooks/pagination\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    paper: {\r\n        padding: theme.spacing(2),\r\n        textAlign: \"center\",\r\n        color: theme.palette.text.secondary,\r\n        margin: \"10px\",\r\n    },\r\n    root: {\r\n        padding: \"10px\",\r\n        [theme.breakpoints.up(\"sm\")]: {\r\n            height: \"calc(100vh - 113px)\",\r\n        },\r\n    },\r\n    rootTable: {\r\n        padding: \"0px\",\r\n        backgroundColor: theme.palette.background.paper.white,\r\n        [theme.breakpoints.up(\"sm\")]: {\r\n            height: \"calc(100vh - 113px)\",\r\n        },\r\n    },\r\n    typeHeader: {\r\n        margin: \"10px 25px\",\r\n        color: \"#6b6b6b\",\r\n        fontWeight: \"500\",\r\n    },\r\n    loading: {\r\n        justifyContent: \"center\",\r\n        display: \"flex\",\r\n        marginTop: \"40px\",\r\n    },\r\n    errorBox: {\r\n        padding: theme.spacing(4),\r\n    },\r\n    errorMsg: {\r\n        marginTop: \"10px\",\r\n    },\r\n    hideAuto: {\r\n        [theme.breakpoints.down(\"sm\")]: {\r\n            display: \"none\",\r\n        },\r\n    },\r\n    flexFix: {\r\n        minWidth: 0,\r\n    },\r\n    upButton: {\r\n        marginLeft: \"20px\",\r\n        marginTop: \"10px\",\r\n        marginBottom: \"10px\",\r\n    },\r\n    clickAway: {\r\n        height: \"100%\",\r\n        width: \"100%\",\r\n    },\r\n    rootShare: {\r\n        height: \"100%\",\r\n        minHeight: 500,\r\n    },\r\n    visuallyHidden: {\r\n        border: 0,\r\n        clip: \"rect(0 0 0 0)\",\r\n        height: 1,\r\n        margin: -1,\r\n        overflow: \"hidden\",\r\n        padding: 0,\r\n        position: \"absolute\",\r\n        top: 20,\r\n        width: 1,\r\n    },\r\n    gridContainer: {\r\n        [theme.breakpoints.down(\"sm\")]: {\r\n            gridTemplateColumns:\r\n                \"repeat(auto-fill,minmax(180px,1fr))!important\",\r\n        },\r\n        [theme.breakpoints.up(\"md\")]: {\r\n            gridTemplateColumns:\r\n                \"repeat(auto-fill,minmax(220px,1fr))!important\",\r\n        },\r\n        display: \"grid!important\",\r\n    },\r\n    gridItem: {\r\n        flex: \"1 1 220px!important\",\r\n    },\r\n}));\r\n\r\nconst keyMap = {\r\n    DELETE_FILE: \"del\",\r\n    SELECT_ALL_SHOWED: `${isMac() ? \"command\" : \"ctrl\"}+a`,\r\n    SELECT_ALL: `${isMac() ? \"command\" : \"ctrl\"}+shift+a`,\r\n    DESELECT_ALL: \"esc\",\r\n};\r\n\r\nexport default function Explorer({ share }) {\r\n    const { t } = useTranslation(\"application\", { keyPrefix: \"fileManager\" });\r\n    const location = useLocation();\r\n    const dispatch = useDispatch();\r\n    const selected = useSelector((state) => state.explorer.selected);\r\n    const search = useSelector((state) => state.explorer.search);\r\n    const loading = useSelector((state) => state.viewUpdate.navigatorLoading);\r\n    const path = useSelector((state) => state.navigator.path);\r\n    const sortMethod = useSelector((state) => state.viewUpdate.sortMethod);\r\n    const navigatorErrorMsg = useSelector(\r\n        (state) => state.viewUpdate.navigatorErrorMsg\r\n    );\r\n    const navigatorError = useSelector(\r\n        (state) => state.viewUpdate.navigatorError\r\n    );\r\n    const viewMethod = useSelector(\r\n        (state) => state.viewUpdate.explorerViewMethod\r\n    );\r\n\r\n    const OpenRemoveDialog = useCallback(() => dispatch(openRemoveDialog()), [\r\n        dispatch,\r\n    ]);\r\n    const SetSelectedTarget = useCallback(\r\n        (targets) => dispatch(setSelectedTarget(targets)),\r\n        [dispatch]\r\n    );\r\n    const ChangeContextMenu = useCallback(\r\n        (type, open) => dispatch(changeContextMenu(type, open)),\r\n        [dispatch]\r\n    );\r\n    const ChangeSortMethod = useCallback(\r\n        (method) => dispatch(explorer.actions.changeSortMethod(method)),\r\n        [dispatch]\r\n    );\r\n    const SelectAll = useCallback(\r\n        () => dispatch(explorer.actions.selectAll()),\r\n        [dispatch]\r\n    );\r\n\r\n    const { dirList, fileList, startIndex } = usePagination();\r\n\r\n    const handlers = {\r\n        DELETE_FILE: () => {\r\n            if (selected.length > 0 && !share) {\r\n                OpenRemoveDialog();\r\n            }\r\n        },\r\n        SELECT_ALL_SHOWED: (e) => {\r\n            e.preventDefault();\r\n            if (selected.length >= dirList.length + fileList.length) {\r\n                SetSelectedTarget([]);\r\n            } else {\r\n                SetSelectedTarget([...dirList, ...fileList]);\r\n            }\r\n        },\r\n        SELECT_ALL: (e) => {\r\n            e.preventDefault();\r\n            SelectAll();\r\n        },\r\n        DESELECT_ALL: (e) => {\r\n            e.preventDefault();\r\n            SetSelectedTarget([]);\r\n        },\r\n    };\r\n\r\n    useEffect(\r\n        () =>\r\n            configure({\r\n                ignoreTags: [\"input\", \"select\", \"textarea\"],\r\n            }),\r\n        []\r\n    );\r\n\r\n    const contextMenu = (e) => {\r\n        e.preventDefault();\r\n        if (!search && !pathHelper.isSharePage(location.pathname)) {\r\n            if (!loading) {\r\n                ChangeContextMenu(\"empty\", true);\r\n            }\r\n        }\r\n    };\r\n\r\n    const ClickAway = (e) => {\r\n        const element = e.target;\r\n        if (element.dataset.clickaway) {\r\n            SetSelectedTarget([]);\r\n        }\r\n    };\r\n\r\n    const classes = useStyles();\r\n    const isHomePage = pathHelper.isHomePage(location.pathname);\r\n\r\n    const showView =\r\n        !loading && (dirList.length !== 0 || fileList.length !== 0);\r\n\r\n    const listView = useMemo(\r\n        () => (\r\n            <Table className={classes.table}>\r\n                <TableHead>\r\n                    <TableRow>\r\n                        <TableCell>\r\n                            <TableSortLabel\r\n                                active={\r\n                                    sortMethod === \"namePos\" ||\r\n                                    sortMethod === \"nameRev\"\r\n                                }\r\n                                direction={\r\n                                    sortMethod === \"namePos\" ? \"asc\" : \"des\"\r\n                                }\r\n                                onClick={() => {\r\n                                    ChangeSortMethod(\r\n                                        sortMethod === \"namePos\"\r\n                                            ? \"nameRev\"\r\n                                            : \"namePos\"\r\n                                    );\r\n                                }}\r\n                            >\r\n                                {t(\"name\")}\r\n                                {sortMethod === \"namePos\" ||\r\n                                sortMethod === \"nameRev\" ? (\r\n                                    <span className={classes.visuallyHidden}>\r\n                                        {sortMethod === \"nameRev\"\r\n                                            ? \"sorted descending\"\r\n                                            : \"sorted ascending\"}\r\n                                    </span>\r\n                                ) : null}\r\n                            </TableSortLabel>\r\n                        </TableCell>\r\n                        <TableCell className={classes.hideAuto}>\r\n                            <TableSortLabel\r\n                                active={\r\n                                    sortMethod === \"sizePos\" ||\r\n                                    sortMethod === \"sizeRes\"\r\n                                }\r\n                                direction={\r\n                                    sortMethod === \"sizePos\" ? \"asc\" : \"des\"\r\n                                }\r\n                                onClick={() => {\r\n                                    ChangeSortMethod(\r\n                                        sortMethod === \"sizePos\"\r\n                                            ? \"sizeRes\"\r\n                                            : \"sizePos\"\r\n                                    );\r\n                                }}\r\n                            >\r\n                                {t(\"size\")}\r\n                                {sortMethod === \"sizePos\" ||\r\n                                sortMethod === \"sizeRes\" ? (\r\n                                    <span className={classes.visuallyHidden}>\r\n                                        {sortMethod === \"sizeRes\"\r\n                                            ? \"sorted descending\"\r\n                                            : \"sorted ascending\"}\r\n                                    </span>\r\n                                ) : null}\r\n                            </TableSortLabel>\r\n                        </TableCell>\r\n                        <TableCell className={classes.hideAuto}>\r\n                            <TableSortLabel\r\n                                active={\r\n                                    sortMethod === \"modifyTimePos\" ||\r\n                                    sortMethod === \"modifyTimeRev\"\r\n                                }\r\n                                direction={\r\n                                    sortMethod === \"modifyTimePos\"\r\n                                        ? \"asc\"\r\n                                        : \"des\"\r\n                                }\r\n                                onClick={() => {\r\n                                    ChangeSortMethod(\r\n                                        sortMethod === \"modifyTimePos\"\r\n                                            ? \"modifyTimeRev\"\r\n                                            : \"modifyTimePos\"\r\n                                    );\r\n                                }}\r\n                            >\r\n                                {t(\"lastModified\")}\r\n                                {sortMethod === \"modifyTimePos\" ||\r\n                                sortMethod === \"modifyTimeRev\" ? (\r\n                                    <span className={classes.visuallyHidden}>\r\n                                        {sortMethod === \"sizeRes\"\r\n                                            ? \"sorted descending\"\r\n                                            : \"sorted ascending\"}\r\n                                    </span>\r\n                                ) : null}\r\n                            </TableSortLabel>\r\n                        </TableCell>\r\n                    </TableRow>\r\n                </TableHead>\r\n                <TableBody>\r\n                    {pathHelper.isMobile() && path !== \"/\" && (\r\n                        <ObjectIcon\r\n                            file={{\r\n                                type: \"up\",\r\n                                name: t(\"backToParentFolder\"),\r\n                            }}\r\n                        />\r\n                    )}\r\n                    {dirList.map((value, index) => (\r\n                        <ObjectIcon\r\n                            key={value.id}\r\n                            file={value}\r\n                            index={startIndex + index}\r\n                        />\r\n                    ))}\r\n                    {fileList.map((value, index) => (\r\n                        <ObjectIcon\r\n                            key={value.id}\r\n                            file={value}\r\n                            index={startIndex + dirList.length + index}\r\n                        />\r\n                    ))}\r\n                </TableBody>\r\n            </Table>\r\n        ),\r\n        [dirList, fileList, path, sortMethod, ChangeSortMethod, classes]\r\n    );\r\n\r\n    const normalView = useMemo(\r\n        () => (\r\n            <div className={classes.flexFix}>\r\n                {dirList.length !== 0 && (\r\n                    <>\r\n                        <Typography\r\n                            data-clickAway={\"true\"}\r\n                            variant=\"body2\"\r\n                            className={classes.typeHeader}\r\n                        >\r\n                            {t(\"folders\")}\r\n                        </Typography>\r\n                        <Grid\r\n                            data-clickAway={\"true\"}\r\n                            container\r\n                            spacing={0}\r\n                            alignItems=\"flex-start\"\r\n                            className={classes.gridContainer}\r\n                        >\r\n                            {dirList.map((value, index) => (\r\n                                <Grid\r\n                                    key={value.id}\r\n                                    item\r\n                                    className={classes.gridItem}\r\n                                >\r\n                                    <ObjectIcon\r\n                                        key={value.id}\r\n                                        file={value}\r\n                                        index={startIndex + index}\r\n                                    />\r\n                                </Grid>\r\n                            ))}\r\n                        </Grid>\r\n                    </>\r\n                )}\r\n                {fileList.length !== 0 && (\r\n                    <>\r\n                        <Typography\r\n                            data-clickAway={\"true\"}\r\n                            variant=\"body2\"\r\n                            className={classes.typeHeader}\r\n                        >\r\n                            {t(\"files\")}\r\n                        </Typography>\r\n                        <Grid\r\n                            data-clickAway={\"true\"}\r\n                            container\r\n                            spacing={0}\r\n                            alignItems=\"flex-start\"\r\n                            className={classes.gridContainer}\r\n                        >\r\n                            {fileList.map((value, index) => (\r\n                                <Grid\r\n                                    className={classes.gridItem}\r\n                                    key={value.id}\r\n                                    item\r\n                                >\r\n                                    <ObjectIcon\r\n                                        key={value.id}\r\n                                        index={\r\n                                            startIndex + dirList.length + index\r\n                                        }\r\n                                        file={value}\r\n                                    />\r\n                                </Grid>\r\n                            ))}\r\n                        </Grid>\r\n                    </>\r\n                )}\r\n            </div>\r\n        ),\r\n        [dirList, fileList, classes]\r\n    );\r\n\r\n    const view = viewMethod === \"list\" ? listView : normalView;\r\n\r\n    return (\r\n        <div\r\n            onContextMenu={contextMenu}\r\n            onClick={ClickAway}\r\n            className={classNames(\r\n                {\r\n                    [classes.root]: viewMethod !== \"list\",\r\n                    [classes.rootTable]: viewMethod === \"list\",\r\n                    [classes.rootShare]: share,\r\n                },\r\n                classes.button\r\n            )}\r\n        >\r\n            <GlobalHotKeys handlers={handlers} allowChanges keyMap={keyMap} />\r\n            <ContextMenu share={share} />\r\n            <ImgPreivew />\r\n            {navigatorError && (\r\n                <Paper elevation={1} className={classes.errorBox}>\r\n                    <Typography variant=\"h5\" component=\"h3\">\r\n                        {t(\"listError\")}\r\n                    </Typography>\r\n                    <Typography\r\n                        color={\"textSecondary\"}\r\n                        className={classes.errorMsg}\r\n                    >\r\n                        {navigatorErrorMsg.message}\r\n                    </Typography>\r\n                </Paper>\r\n            )}\r\n\r\n            {loading && !navigatorError && (\r\n                <div className={classes.loading}>\r\n                    <CircularProgress />\r\n                </div>\r\n            )}\r\n\r\n            {!search &&\r\n                isHomePage &&\r\n                dirList.length === 0 &&\r\n                fileList.length === 0 &&\r\n                !loading &&\r\n                !navigatorError && (\r\n                    <Nothing\r\n                        primary={t(\"dropFileHere\")}\r\n                        secondary={t(\"orClickUploadButton\")}\r\n                    />\r\n                )}\r\n            {((search &&\r\n                dirList.length === 0 &&\r\n                fileList.length === 0 &&\r\n                !loading &&\r\n                !navigatorError) ||\r\n                (dirList.length === 0 &&\r\n                    fileList.length === 0 &&\r\n                    !loading &&\r\n                    !navigatorError &&\r\n                    !isHomePage)) && <Nothing primary={t(\"nothingFound\")} />}\r\n            {showView && view}\r\n        </div>\r\n    );\r\n}\r\n","import React, { useMemo } from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\n\r\nconst paginate = (array, page_size, page_number) =>\r\n    page_size === -1\r\n        ? array\r\n        : array.slice((page_number - 1) * page_size, page_number * page_size);\r\n\r\nexport function usePagination() {\r\n    const files = useSelector((state) => state.explorer.fileList);\r\n    const folders = useSelector((state) => state.explorer.dirList);\r\n    const pagination = useSelector((state) => state.viewUpdate.pagination);\r\n\r\n    const { dirList, fileList, startIndex } = useMemo(() => {\r\n        const all = paginate(\r\n            [...folders, ...files],\r\n            pagination.size,\r\n            pagination.page\r\n        );\r\n        const dirList = [];\r\n        const fileList = [];\r\n        all.forEach((v) =>\r\n            v.type === \"dir\" ? dirList.push(v) : fileList.push(v)\r\n        );\r\n        const startIndex = pagination.size * (pagination.page - 1);\r\n        return { dirList, fileList, startIndex };\r\n    }, [folders, files, pagination]);\r\n    return { dirList, fileList, startIndex };\r\n}\r\n","import React, { useEffect } from \"react\";\r\nimport ExpandMore from \"@material-ui/icons/ExpandMore\";\r\nimport { Button } from \"@material-ui/core\";\r\nimport { makeStyles } from \"@material-ui/core\";\r\nimport { useDrop } from \"react-dnd\";\r\nimport classNames from \"classnames\";\r\nimport MoreIcon from \"@material-ui/icons/MoreHoriz\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    expandMore: {\r\n        color: \"#8d8d8d\",\r\n    },\r\n    active: {\r\n        boxShadow: \"0 0 0 2px \" + theme.palette.primary.light,\r\n    },\r\n    button: {\r\n        textTransform: \"none\",\r\n    },\r\n}));\r\n\r\nexport default function PathButton(props) {\r\n    const inputRef = React.useRef(null);\r\n\r\n    const [{ canDrop, isOver }, drop] = useDrop({\r\n        accept: \"object\",\r\n        drop: () => {\r\n            if (props.more) {\r\n                inputRef.current.click();\r\n            } else {\r\n                return {\r\n                    folder: {\r\n                        id: -1,\r\n                        path: props.path,\r\n                        name: props.folder === \"/\" ? \"\" : props.folder,\r\n                    },\r\n                };\r\n            }\r\n        },\r\n        collect: (monitor) => ({\r\n            isOver: monitor.isOver(),\r\n            canDrop: monitor.canDrop(),\r\n        }),\r\n    });\r\n\r\n    const isActive = canDrop && isOver;\r\n\r\n    useEffect(() => {\r\n        if (props.more && isActive) {\r\n            inputRef.current.click();\r\n        }\r\n        // eslint-disable-next-line\r\n    }, [isActive]);\r\n\r\n    const classes = useStyles();\r\n    return (\r\n        <span onClick={props.onClick} ref={inputRef}>\r\n            <Button\r\n                ref={drop}\r\n                className={classNames(\r\n                    {\r\n                        [classes.active]: isActive,\r\n                    },\r\n                    classes.button\r\n                )}\r\n                component=\"span\"\r\n                title={props.title}\r\n            >\r\n                {props.more && <MoreIcon />}\r\n                {!props.more && (\r\n                    <>\r\n                        {props.folder}\r\n                        {props.last && (\r\n                            <ExpandMore className={classes.expandMore} />\r\n                        )}\r\n                    </>\r\n                )}\r\n            </Button>\r\n        </span>\r\n    );\r\n}\r\n","import React, { useEffect } from \"react\";\r\nimport { makeStyles } from \"@material-ui/core\";\r\nimport FolderIcon from \"@material-ui/icons/Folder\";\r\nimport { MenuItem, ListItemIcon, ListItemText } from \"@material-ui/core\";\r\nimport { useDrop } from \"react-dnd\";\r\nimport classNames from \"classnames\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    active: {\r\n        border: \"2px solid \" + theme.palette.primary.light,\r\n    },\r\n}));\r\n\r\nexport default function DropDownItem(props) {\r\n    const [{ canDrop, isOver }, drop] = useDrop({\r\n        accept: \"object\",\r\n        drop: () => {\r\n            console.log({\r\n                folder: {\r\n                    id: -1,\r\n                    path: props.path,\r\n                    name: props.folder === \"/\" ? \"\" : props.folder,\r\n                },\r\n            });\r\n        },\r\n        collect: (monitor) => ({\r\n            isOver: monitor.isOver(),\r\n            canDrop: monitor.canDrop(),\r\n        }),\r\n    });\r\n\r\n    const isActive = canDrop && isOver;\r\n\r\n    useEffect(() => {\r\n        props.setActiveStatus(props.id, isActive);\r\n        // eslint-disable-next-line\r\n    }, [isActive]);\r\n\r\n    const classes = useStyles();\r\n    return (\r\n        <MenuItem\r\n            ref={drop}\r\n            className={classNames({\r\n                [classes.active]: isActive,\r\n            })}\r\n            onClick={(e) => props.navigateTo(e, props.id)}\r\n        >\r\n            <ListItemIcon>\r\n                <FolderIcon />\r\n            </ListItemIcon>\r\n            <ListItemText primary={props.folder} />\r\n        </MenuItem>\r\n    );\r\n}\r\n","import React from \"react\";\r\nimport DropDownItem from \"./DropDownItem\";\r\n\r\nexport default function DropDown(props) {\r\n    let timer;\r\n    let first = props.folders.length;\r\n    const status = [];\r\n    for (let index = 0; index < props.folders.length; index++) {\r\n        status[index] = false;\r\n    }\r\n\r\n    const setActiveStatus = (id, value) => {\r\n        status[id] = value;\r\n        if (value) {\r\n            clearTimeout(timer);\r\n        } else {\r\n            let shouldClose = true;\r\n            status.forEach((element) => {\r\n                if (element) {\r\n                    shouldClose = false;\r\n                }\r\n            });\r\n            if (shouldClose) {\r\n                if (first <= 0) {\r\n                    timer = setTimeout(() => {\r\n                        props.onClose();\r\n                    }, 100);\r\n                } else {\r\n                    first--;\r\n                }\r\n            }\r\n        }\r\n        console.log(status);\r\n    };\r\n\r\n    return (\r\n        <>\r\n            {props.folders.map((folder, id) => (\r\n                <DropDownItem\r\n                    key={id}\r\n                    path={\"/\" + props.folders.slice(0, id).join(\"/\")}\r\n                    navigateTo={props.navigateTo}\r\n                    id={id}\r\n                    setActiveStatus={setActiveStatus}\r\n                    folder={folder}\r\n                />\r\n            ))}\r\n        </>\r\n    );\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { connect } from \"react-redux\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport RightIcon from \"@material-ui/icons/KeyboardArrowRight\";\r\nimport ShareIcon from \"@material-ui/icons/Share\";\r\nimport NewFolderIcon from \"@material-ui/icons/CreateNewFolder\";\r\nimport RefreshIcon from \"@material-ui/icons/Refresh\";\r\nimport explorer, {\r\n    drawerToggleAction,\r\n    navigateTo,\r\n    navigateUp,\r\n    openCompressDialog,\r\n    openCreateFileDialog,\r\n    openCreateFolderDialog,\r\n    openShareDialog,\r\n    refreshFileList,\r\n    setNavigatorError,\r\n    setNavigatorLoadingStatus,\r\n    setSelectedTarget,\r\n} from \"../../../redux/explorer\";\r\nimport { fixUrlHash, setGetParameter } from \"../../../utils/index\";\r\nimport {\r\n    Divider,\r\n    ListItemIcon,\r\n    Menu,\r\n    MenuItem,\r\n    withStyles,\r\n} from \"@material-ui/core\";\r\nimport PathButton from \"./PathButton\";\r\nimport DropDown from \"./DropDown\";\r\nimport pathHelper from \"../../../utils/page\";\r\nimport classNames from \"classnames\";\r\nimport Auth from \"../../../middleware/Auth\";\r\nimport Avatar from \"@material-ui/core/Avatar\";\r\nimport { Archive } from \"@material-ui/icons\";\r\nimport { FilePlus } from \"mdi-material-ui\";\r\nimport SubActions from \"./SubActions\";\r\nimport { setCurrentPolicy } from \"../../../redux/explorer/action\";\r\nimport { list } from \"../../../services/navigate\";\r\nimport { withTranslation } from \"react-i18next\";\r\n\r\nconst mapStateToProps = (state) => {\r\n    return {\r\n        path: state.navigator.path,\r\n        refresh: state.navigator.refresh,\r\n        drawerDesktopOpen: state.viewUpdate.open,\r\n        viewMethod: state.viewUpdate.explorerViewMethod,\r\n        search: state.explorer.search,\r\n        sortMethod: state.viewUpdate.sortMethod,\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n    return {\r\n        navigateToPath: (path) => {\r\n            dispatch(navigateTo(path));\r\n        },\r\n        navigateUp: () => {\r\n            dispatch(navigateUp());\r\n        },\r\n        setNavigatorError: (status, msg) => {\r\n            dispatch(setNavigatorError(status, msg));\r\n        },\r\n        updateFileList: (list) => {\r\n            dispatch(explorer.actions.updateFileList(list));\r\n        },\r\n        setNavigatorLoadingStatus: (status) => {\r\n            dispatch(setNavigatorLoadingStatus(status));\r\n        },\r\n        refreshFileList: () => {\r\n            dispatch(refreshFileList());\r\n        },\r\n        setSelectedTarget: (target) => {\r\n            dispatch(setSelectedTarget(target));\r\n        },\r\n        openCreateFolderDialog: () => {\r\n            dispatch(openCreateFolderDialog());\r\n        },\r\n        openCreateFileDialog: () => {\r\n            dispatch(openCreateFileDialog());\r\n        },\r\n        openShareDialog: () => {\r\n            dispatch(openShareDialog());\r\n        },\r\n        handleDesktopToggle: (open) => {\r\n            dispatch(drawerToggleAction(open));\r\n        },\r\n        openCompressDialog: () => {\r\n            dispatch(openCompressDialog());\r\n        },\r\n        setCurrentPolicy: (policy) => {\r\n            dispatch(setCurrentPolicy(policy));\r\n        },\r\n    };\r\n};\r\n\r\nconst delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\r\n\r\nconst styles = (theme) => ({\r\n    container: {\r\n        [theme.breakpoints.down(\"xs\")]: {\r\n            display: \"none\",\r\n        },\r\n        backgroundColor: theme.palette.background.paper,\r\n    },\r\n    navigatorContainer: {\r\n        display: \"flex\",\r\n        justifyContent: \"space-between\",\r\n    },\r\n    nav: {\r\n        height: \"48px\",\r\n        padding: \"5px 15px\",\r\n        display: \"flex\",\r\n    },\r\n    optionContainer: {\r\n        paddingTop: \"6px\",\r\n        marginRight: \"10px\",\r\n    },\r\n    rightIcon: {\r\n        marginTop: \"6px\",\r\n        verticalAlign: \"top\",\r\n        color: \"#868686\",\r\n    },\r\n    expandMore: {\r\n        color: \"#8d8d8d\",\r\n    },\r\n    roundBorder: {\r\n        borderRadius: \"4px 4px 0 0\",\r\n    },\r\n});\r\n\r\nclass NavigatorComponent extends Component {\r\n    search = undefined;\r\n    currentID = 0;\r\n\r\n    state = {\r\n        hidden: false,\r\n        hiddenFolders: [],\r\n        folders: [],\r\n        anchorEl: null,\r\n        hiddenMode: false,\r\n        anchorHidden: null,\r\n    };\r\n\r\n    constructor(props) {\r\n        super(props);\r\n        this.element = React.createRef();\r\n    }\r\n\r\n    componentDidMount = () => {\r\n        const url = new URL(fixUrlHash(window.location.href));\r\n        const c = url.searchParams.get(\"path\");\r\n        this.renderPath(c === null ? \"/\" : c);\r\n\r\n        if (!this.props.isShare) {\r\n            // 如果是在个人文件管理页,首次加载时打开侧边栏\r\n            this.props.handleDesktopToggle(true);\r\n        }\r\n\r\n        // 后退操作时重新导航\r\n        window.onpopstate = () => {\r\n            const url = new URL(fixUrlHash(window.location.href));\r\n            const c = url.searchParams.get(\"path\");\r\n            if (c !== null) {\r\n                this.props.navigateToPath(c);\r\n            }\r\n        };\r\n    };\r\n\r\n    renderPath = (path = null) => {\r\n        this.props.setNavigatorError(false, null);\r\n        this.setState({\r\n            folders:\r\n                path !== null\r\n                    ? path.substr(1).split(\"/\")\r\n                    : this.props.path.substr(1).split(\"/\"),\r\n        });\r\n        const newPath = path !== null ? path : this.props.path;\r\n        list(\r\n            newPath,\r\n            this.props.share,\r\n            this.search ? this.search.keywords : \"\",\r\n            this.search ? this.search.searchPath : \"\"\r\n        )\r\n            .then((response) => {\r\n                this.currentID = response.data.parent;\r\n                this.props.updateFileList(response.data.objects);\r\n                this.props.setNavigatorLoadingStatus(false);\r\n                if (!this.search) {\r\n                    setGetParameter(\"path\", encodeURIComponent(newPath));\r\n                }\r\n                if (response.data.policy) {\r\n                    this.props.setCurrentPolicy({\r\n                        id: response.data.policy.id,\r\n                        name: response.data.policy.name,\r\n                        type: response.data.policy.type,\r\n                        maxSize: response.data.policy.max_size,\r\n                        allowedSuffix: response.data.policy.file_type,\r\n                    });\r\n                }\r\n            })\r\n            .catch((error) => {\r\n                this.props.setNavigatorError(true, error);\r\n            });\r\n\r\n        this.checkOverFlow(true);\r\n    };\r\n\r\n    redresh = (path) => {\r\n        this.props.setNavigatorLoadingStatus(true);\r\n        this.props.setNavigatorError(false, \"error\");\r\n        this.renderPath(path);\r\n    };\r\n\r\n    UNSAFE_componentWillReceiveProps = (nextProps) => {\r\n        if (this.props.search !== nextProps.search) {\r\n            this.search = nextProps.search;\r\n        }\r\n        if (this.props.path !== nextProps.path) {\r\n            this.renderPath(nextProps.path);\r\n        }\r\n        if (this.props.refresh !== nextProps.refresh) {\r\n            this.redresh(nextProps.path);\r\n        }\r\n    };\r\n\r\n    componentWillUnmount() {\r\n        this.props.updateFileList([]);\r\n    }\r\n\r\n    componentDidUpdate = (prevProps, prevStates) => {\r\n        if (this.state.folders !== prevStates.folders) {\r\n            this.checkOverFlow(true);\r\n        }\r\n        if (this.props.drawerDesktopOpen !== prevProps.drawerDesktopOpen) {\r\n            delay(500).then(() => this.checkOverFlow());\r\n        }\r\n    };\r\n\r\n    checkOverFlow = (force) => {\r\n        if (this.overflowInitLock && !force) {\r\n            return;\r\n        }\r\n        if (this.element.current !== null) {\r\n            const hasOverflowingChildren =\r\n                this.element.current.offsetHeight <\r\n                    this.element.current.scrollHeight ||\r\n                this.element.current.offsetWidth <\r\n                    this.element.current.scrollWidth;\r\n            if (hasOverflowingChildren) {\r\n                this.overflowInitLock = true;\r\n                this.setState({ hiddenMode: true });\r\n            }\r\n            if (!hasOverflowingChildren && this.state.hiddenMode) {\r\n                this.setState({ hiddenMode: false });\r\n            }\r\n        }\r\n    };\r\n\r\n    navigateTo = (event, id) => {\r\n        if (id === this.state.folders.length - 1) {\r\n            //最后一个路径\r\n            this.setState({ anchorEl: event.currentTarget });\r\n        } else if (\r\n            id === -1 &&\r\n            this.state.folders.length === 1 &&\r\n            this.state.folders[0] === \"\"\r\n        ) {\r\n            this.props.refreshFileList();\r\n            this.handleClose();\r\n        } else if (id === -1) {\r\n            this.props.navigateToPath(\"/\");\r\n            this.handleClose();\r\n        } else {\r\n            this.props.navigateToPath(\r\n                \"/\" + this.state.folders.slice(0, id + 1).join(\"/\")\r\n            );\r\n            this.handleClose();\r\n        }\r\n    };\r\n\r\n    handleClose = () => {\r\n        this.setState({ anchorEl: null, anchorHidden: null, anchorSort: null });\r\n    };\r\n\r\n    showHiddenPath = (e) => {\r\n        this.setState({ anchorHidden: e.currentTarget });\r\n    };\r\n\r\n    performAction = (e) => {\r\n        this.handleClose();\r\n        if (e === \"refresh\") {\r\n            this.redresh();\r\n            return;\r\n        }\r\n        const presentPath = this.props.path.split(\"/\");\r\n        const newTarget = [\r\n            {\r\n                id: this.currentID,\r\n                type: \"dir\",\r\n                name: presentPath.pop(),\r\n                path: presentPath.length === 1 ? \"/\" : presentPath.join(\"/\"),\r\n            },\r\n        ];\r\n        //this.props.navitateUp();\r\n        switch (e) {\r\n            case \"share\":\r\n                this.props.setSelectedTarget(newTarget);\r\n                this.props.openShareDialog();\r\n                break;\r\n            case \"newfolder\":\r\n                this.props.openCreateFolderDialog();\r\n                break;\r\n            case \"compress\":\r\n                this.props.setSelectedTarget(newTarget);\r\n                this.props.openCompressDialog();\r\n                break;\r\n            case \"newFile\":\r\n                this.props.openCreateFileDialog();\r\n                break;\r\n            default:\r\n                break;\r\n        }\r\n    };\r\n\r\n    render() {\r\n        const { classes, t } = this.props;\r\n        const isHomePage = pathHelper.isHomePage(this.props.location.pathname);\r\n        const user = Auth.GetUser();\r\n\r\n        const presentFolderMenu = (\r\n            <Menu\r\n                id=\"presentFolderMenu\"\r\n                anchorEl={this.state.anchorEl}\r\n                open={Boolean(this.state.anchorEl)}\r\n                onClose={this.handleClose}\r\n                disableAutoFocusItem={true}\r\n            >\r\n                <MenuItem onClick={() => this.performAction(\"refresh\")}>\r\n                    <ListItemIcon>\r\n                        <RefreshIcon />\r\n                    </ListItemIcon>\r\n                    {t(\"fileManager.refresh\")}\r\n                </MenuItem>\r\n                {!this.props.search && isHomePage && (\r\n                    <div>\r\n                        <Divider />\r\n                        <MenuItem onClick={() => this.performAction(\"share\")}>\r\n                            <ListItemIcon>\r\n                                <ShareIcon />\r\n                            </ListItemIcon>\r\n                            {t(\"fileManager.share\")}\r\n                        </MenuItem>\r\n                        {user.group.compress && (\r\n                            <MenuItem\r\n                                onClick={() => this.performAction(\"compress\")}\r\n                            >\r\n                                <ListItemIcon>\r\n                                    <Archive />\r\n                                </ListItemIcon>\r\n                                {t(\"fileManager.compress\")}\r\n                            </MenuItem>\r\n                        )}\r\n                        <Divider />\r\n                        <MenuItem\r\n                            onClick={() => this.performAction(\"newfolder\")}\r\n                        >\r\n                            <ListItemIcon>\r\n                                <NewFolderIcon />\r\n                            </ListItemIcon>\r\n                            {t(\"fileManager.newFolder\")}\r\n                        </MenuItem>\r\n                        <MenuItem onClick={() => this.performAction(\"newFile\")}>\r\n                            <ListItemIcon>\r\n                                <FilePlus />\r\n                            </ListItemIcon>\r\n                            {t(\"fileManager.newFile\")}\r\n                        </MenuItem>\r\n                    </div>\r\n                )}\r\n            </Menu>\r\n        );\r\n\r\n        return (\r\n            <div\r\n                className={classNames(\r\n                    {\r\n                        [classes.roundBorder]: this.props.isShare,\r\n                    },\r\n                    classes.container\r\n                )}\r\n            >\r\n                <div className={classes.navigatorContainer}>\r\n                    <div className={classes.nav} ref={this.element}>\r\n                        <span>\r\n                            <PathButton\r\n                                folder=\"/\"\r\n                                path=\"/\"\r\n                                onClick={(e) => this.navigateTo(e, -1)}\r\n                            />\r\n                            <RightIcon className={classes.rightIcon} />\r\n                        </span>\r\n                        {this.state.hiddenMode && (\r\n                            <span>\r\n                                <PathButton\r\n                                    more\r\n                                    title={t(\"fileManager.showFullPath\")}\r\n                                    onClick={this.showHiddenPath}\r\n                                />\r\n                                <Menu\r\n                                    id=\"hiddenPathMenu\"\r\n                                    anchorEl={this.state.anchorHidden}\r\n                                    open={Boolean(this.state.anchorHidden)}\r\n                                    onClose={this.handleClose}\r\n                                    disableAutoFocusItem={true}\r\n                                >\r\n                                    <DropDown\r\n                                        onClose={this.handleClose}\r\n                                        folders={this.state.folders.slice(\r\n                                            0,\r\n                                            -1\r\n                                        )}\r\n                                        navigateTo={this.navigateTo}\r\n                                    />\r\n                                </Menu>\r\n                                <RightIcon className={classes.rightIcon} />\r\n                                <PathButton\r\n                                    folder={this.state.folders.slice(-1)}\r\n                                    path={\r\n                                        \"/\" +\r\n                                        this.state.folders\r\n                                            .slice(0, -1)\r\n                                            .join(\"/\")\r\n                                    }\r\n                                    last={true}\r\n                                    onClick={(e) =>\r\n                                        this.navigateTo(\r\n                                            e,\r\n                                            this.state.folders.length - 1\r\n                                        )\r\n                                    }\r\n                                />\r\n                                {presentFolderMenu}\r\n                            </span>\r\n                        )}\r\n                        {!this.state.hiddenMode &&\r\n                            this.state.folders.map((folder, id, folders) => (\r\n                                <span key={id}>\r\n                                    {folder !== \"\" && (\r\n                                        <span>\r\n                                            <PathButton\r\n                                                folder={folder}\r\n                                                path={\r\n                                                    \"/\" +\r\n                                                    folders\r\n                                                        .slice(0, id)\r\n                                                        .join(\"/\")\r\n                                                }\r\n                                                last={id === folders.length - 1}\r\n                                                onClick={(e) =>\r\n                                                    this.navigateTo(e, id)\r\n                                                }\r\n                                            />\r\n                                            {id === folders.length - 1 &&\r\n                                                presentFolderMenu}\r\n                                            {id !== folders.length - 1 && (\r\n                                                <RightIcon\r\n                                                    className={\r\n                                                        classes.rightIcon\r\n                                                    }\r\n                                                />\r\n                                            )}\r\n                                        </span>\r\n                                    )}\r\n                                </span>\r\n                            ))}\r\n                    </div>\r\n                    <div className={classes.optionContainer}>\r\n                        <SubActions isSmall />\r\n                    </div>\r\n                </div>\r\n                <Divider />\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nNavigatorComponent.propTypes = {\r\n    classes: PropTypes.object.isRequired,\r\n    path: PropTypes.string.isRequired,\r\n};\r\n\r\nconst Navigator = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(withRouter(withTranslation()(NavigatorComponent))));\r\n\r\nexport default Navigator;\r\n","import React from \"react\";\r\nimport { BulletList } from \"react-content-loader\";\r\nimport { makeStyles, useTheme } from \"@material-ui/core/styles\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    loader: {\r\n        width: \"100%\",\r\n        // padding: 40,\r\n        // [theme.breakpoints.down(\"md\")]: {\r\n        //     width: \"100%\",\r\n        //     padding: 10\r\n        // }\r\n    },\r\n}));\r\n\r\nconst MyLoader = (props) => (\r\n    <BulletList\r\n        backgroundColor={props.dark ? \"#333\" : \"#f5f6f7\"}\r\n        foregroundColor={props.dark ? \"#636363\" : \"#eee\"}\r\n        className={props.className}\r\n    />\r\n);\r\n\r\nfunction ListLoading() {\r\n    const theme = useTheme();\r\n    const classes = useStyles();\r\n\r\n    return (\r\n        <div>\r\n            <MyLoader\r\n                dark={theme.palette.type === \"dark\"}\r\n                className={classes.loader}\r\n            />\r\n        </div>\r\n    );\r\n}\r\n\r\nexport default ListLoading;\r\n","import React, { useCallback, useEffect, useState } from \"react\";\r\nimport { makeStyles } from \"@material-ui/core\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport Drawer from \"@material-ui/core/Drawer\";\r\nimport Toolbar from \"@material-ui/core/Toolbar\";\r\nimport { Clear, Folder } from \"@material-ui/icons\";\r\nimport Divider from \"@material-ui/core/Divider\";\r\nimport { setSideBar } from \"../../../redux/explorer/action\";\r\nimport TypeIcon from \"../TypeIcon\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport API from \"../../../middleware/Api\";\r\nimport { filename, sizeToString } from \"../../../utils\";\r\nimport Link from \"@material-ui/core/Link\";\r\nimport Tooltip from \"@material-ui/core/Tooltip\";\r\nimport TimeAgo from \"timeago-react\";\r\nimport ListLoading from \"../../Placeholder/ListLoading\";\r\nimport Hidden from \"@material-ui/core/Hidden\";\r\nimport Dialog from \"@material-ui/core/Dialog\";\r\nimport Slide from \"@material-ui/core/Slide\";\r\nimport AppBar from \"@material-ui/core/AppBar\";\r\nimport { formatLocalTime } from \"../../../utils/datetime\";\r\nimport { navigateTo, toggleSnackbar } from \"../../../redux/explorer\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\n\r\nconst drawerWidth = 350;\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    drawer: {\r\n        width: drawerWidth,\r\n        flexShrink: 0,\r\n    },\r\n    drawerPaper: {\r\n        width: drawerWidth,\r\n        boxShadow:\r\n            \"0px 8px 10px -5px rgb(0 0 0 / 20%), 0px 16px 24px 2px rgb(0 0 0 / 14%), 0px 6px 30px 5px rgb(0 0 0 / 12%)\",\r\n    },\r\n    drawerContainer: {\r\n        overflow: \"auto\",\r\n    },\r\n    header: {\r\n        display: \"flex\",\r\n        padding: theme.spacing(3),\r\n        placeContent: \"space-between\",\r\n    },\r\n    fileIcon: { width: 33, height: 33 },\r\n    fileIconSVG: { fontSize: 20 },\r\n    folderIcon: {\r\n        color: theme.palette.text.secondary,\r\n        width: 33,\r\n        height: 33,\r\n    },\r\n    fileName: {\r\n        marginLeft: theme.spacing(2),\r\n        marginRight: theme.spacing(2),\r\n        wordBreak: \"break-all\",\r\n        flexGrow: 2,\r\n    },\r\n    closeIcon: {\r\n        placeSelf: \"flex-start\",\r\n        marginTop: 2,\r\n    },\r\n    propsContainer: {\r\n        padding: theme.spacing(3),\r\n    },\r\n    propsLabel: {\r\n        color: theme.palette.text.secondary,\r\n        padding: theme.spacing(1),\r\n    },\r\n    propsTime: {\r\n        color: theme.palette.text.disabled,\r\n        padding: theme.spacing(1),\r\n    },\r\n    propsValue: {\r\n        padding: theme.spacing(1),\r\n        wordBreak: \"break-all\",\r\n    },\r\n    appBar: {\r\n        position: \"relative\",\r\n    },\r\n    title: {\r\n        marginLeft: theme.spacing(2),\r\n        flex: 1,\r\n    },\r\n}));\r\n\r\nconst Transition = React.forwardRef(function Transition(props, ref) {\r\n    return <Slide direction=\"up\" ref={ref} {...props} />;\r\n});\r\n\r\nexport default function SideDrawer() {\r\n    const { t } = useTranslation();\r\n    const dispatch = useDispatch();\r\n    const sideBarOpen = useSelector((state) => state.explorer.sideBarOpen);\r\n    const selected = useSelector((state) => state.explorer.selected);\r\n    const SetSideBar = useCallback((open) => dispatch(setSideBar(open)), [\r\n        dispatch,\r\n    ]);\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n    const NavigateTo = useCallback((k) => dispatch(navigateTo(k)), [dispatch]);\r\n    const search = useSelector((state) => state.explorer.search);\r\n    const [target, setTarget] = useState(null);\r\n    const [details, setDetails] = useState(null);\r\n    const loadProps = (object) => {\r\n        API.get(\r\n            \"/object/property/\" +\r\n                object.id +\r\n                \"?trace_root=\" +\r\n                (search ? \"true\" : \"false\") +\r\n                \"&is_folder=\" +\r\n                (object.type === \"dir\").toString()\r\n        )\r\n            .then((response) => {\r\n                setDetails(response.data);\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n            });\r\n    };\r\n\r\n    useEffect(() => {\r\n        setDetails(null);\r\n        if (sideBarOpen) {\r\n            if (selected.length !== 1) {\r\n                SetSideBar(false);\r\n            } else {\r\n                setTarget(selected[0]);\r\n                loadProps(selected[0]);\r\n            }\r\n        }\r\n    }, [selected, sideBarOpen]);\r\n\r\n    const classes = useStyles();\r\n    const propsItem = [\r\n        {\r\n            label: t(\"fileManager.size\"),\r\n            value: (d, target) =>\r\n                sizeToString(d.size) +\r\n                t(\"fileManager.bytes\", { bytes: d.size.toLocaleString() }),\r\n            show: (d) => true,\r\n        },\r\n        {\r\n            label: t(\"fileManager.storagePolicy\"),\r\n            value: (d, target) => d.policy,\r\n            show: (d) => d.type === \"file\",\r\n        },\r\n        {\r\n            label: t(\"fileManager.childFolders\"),\r\n            value: (d, target) =>\r\n                t(\"fileManager.childCount\", {\r\n                    num: d.child_folder_num.toLocaleString(),\r\n                }),\r\n            show: (d) => d.type === \"dir\",\r\n        },\r\n        {\r\n            label: t(\"fileManager.childFiles\"),\r\n            value: (d, target) =>\r\n                t(\"fileManager.childCount\", {\r\n                    num: d.child_file_num.toLocaleString(),\r\n                }),\r\n            show: (d) => d.type === \"dir\",\r\n        },\r\n        {\r\n            label: t(\"fileManager.parentFolder\"),\r\n            // eslint-disable-next-line react/display-name\r\n            value: (d, target) => {\r\n                const path = d.path === \"\" ? target.path : d.path;\r\n                const name = filename(path);\r\n                return (\r\n                    <Tooltip title={path}>\r\n                        <Link\r\n                            href={\"javascript:void\"}\r\n                            onClick={() => NavigateTo(path)}\r\n                        >\r\n                            {name === \"\" ? t(\"fileManager.rootFolder\") : name}\r\n                        </Link>\r\n                    </Tooltip>\r\n                );\r\n            },\r\n            show: (d) => true,\r\n        },\r\n        {\r\n            label: t(\"fileManager.modifiedAt\"),\r\n            value: (d, target) => formatLocalTime(d.updated_at),\r\n            show: (d) => true,\r\n        },\r\n        {\r\n            label: t(\"fileManager.createdAt\"),\r\n            value: (d) => formatLocalTime(d.created_at),\r\n            show: (d) => true,\r\n        },\r\n    ];\r\n    const content = (\r\n        <Grid container className={classes.propsContainer}>\r\n            {!details && <ListLoading />}\r\n            {details && (\r\n                <>\r\n                    {propsItem.map((item) => {\r\n                        if (item.show(target)) {\r\n                            return (\r\n                                <>\r\n                                    <Grid\r\n                                        item\r\n                                        xs={5}\r\n                                        className={classes.propsLabel}\r\n                                    >\r\n                                        {item.label}\r\n                                    </Grid>\r\n                                    <Grid\r\n                                        item\r\n                                        xs={7}\r\n                                        className={classes.propsValue}\r\n                                    >\r\n                                        {item.value(details, target)}\r\n                                    </Grid>\r\n                                </>\r\n                            );\r\n                        }\r\n                    })}\r\n                    {target.type === \"dir\" && (\r\n                        <Grid item xs={12} className={classes.propsTime}>\r\n                            <Trans\r\n                                i18nKey=\"fileManager.statisticAt\"\r\n                                components={[\r\n                                    <span key={0} />,\r\n                                    <TimeAgo\r\n                                        key={1}\r\n                                        datetime={details.query_date}\r\n                                        locale={t(\"timeAgoLocaleCode\", {\r\n                                            ns: \"common\",\r\n                                        })}\r\n                                    />,\r\n                                    <span key={2} />,\r\n                                ]}\r\n                            />\r\n                        </Grid>\r\n                    )}\r\n                </>\r\n            )}\r\n        </Grid>\r\n    );\r\n    return (\r\n        <>\r\n            <Hidden smUp>\r\n                <Dialog\r\n                    fullScreen\r\n                    open={sideBarOpen}\r\n                    TransitionComponent={Transition}\r\n                >\r\n                    {target && (\r\n                        <>\r\n                            <AppBar className={classes.appBar}>\r\n                                <Toolbar>\r\n                                    <IconButton\r\n                                        edge=\"start\"\r\n                                        color=\"inherit\"\r\n                                        onClick={() => SetSideBar(false)}\r\n                                        aria-label=\"close\"\r\n                                    >\r\n                                        <Clear />\r\n                                    </IconButton>\r\n                                    <Typography\r\n                                        variant=\"h6\"\r\n                                        className={classes.title}\r\n                                    >\r\n                                        {target.name}\r\n                                    </Typography>\r\n                                </Toolbar>\r\n                            </AppBar>\r\n                            {content}\r\n                        </>\r\n                    )}\r\n                </Dialog>\r\n            </Hidden>\r\n            <Hidden xsDown>\r\n                <Drawer\r\n                    className={classes.drawer}\r\n                    variant=\"persistent\"\r\n                    classes={{\r\n                        paper: classes.drawerPaper,\r\n                    }}\r\n                    open={sideBarOpen}\r\n                    anchor=\"right\"\r\n                >\r\n                    <Toolbar />\r\n                    <div className={classes.drawerContainer}>\r\n                        {target && (\r\n                            <>\r\n                                <div className={classes.header}>\r\n                                    {target.type === \"dir\" && (\r\n                                        <Folder\r\n                                            className={classes.folderIcon}\r\n                                        />\r\n                                    )}\r\n                                    {target.type !== \"dir\" && (\r\n                                        <TypeIcon\r\n                                            isUpload\r\n                                            className={classes.fileIcon}\r\n                                            iconClassName={classes.fileIconSVG}\r\n                                            fileName={target.name}\r\n                                        />\r\n                                    )}\r\n                                    <div className={classes.fileName}>\r\n                                        <Typography variant=\"h6\" gutterBottom>\r\n                                            {target.name}\r\n                                        </Typography>\r\n                                    </div>\r\n                                    <IconButton\r\n                                        onClick={() => SetSideBar(false)}\r\n                                        className={classes.closeIcon}\r\n                                        aria-label=\"close\"\r\n                                        size={\"small\"}\r\n                                    >\r\n                                        <Clear />\r\n                                    </IconButton>\r\n                                </div>\r\n                            </>\r\n                        )}\r\n                        <Divider />\r\n                        {content}\r\n                    </div>\r\n                </Drawer>\r\n            </Hidden>\r\n        </>\r\n    );\r\n}\r\n","import React, { useEffect, useRef } from \"react\";\r\nimport { useDrop } from \"react-dnd\";\r\nimport { PaginationItem } from \"@material-ui/lab\";\r\n\r\nexport default function CustomPaginationItem(props) {\r\n    const inputRef = useRef(null);\r\n\r\n    const [{ canDrop, isOver }, drop] = useDrop({\r\n        accept: \"object\",\r\n        collect: (monitor) => ({\r\n            isOver: monitor.isOver(),\r\n            canDrop: monitor.canDrop(),\r\n        }),\r\n    });\r\n\r\n    const isActive = canDrop && isOver;\r\n\r\n    useEffect(() => {\r\n        if (\r\n            isActive &&\r\n            props.onClick &&\r\n            props.type !== \"start-ellipsis\" &&\r\n            props.type !== \"end-ellipsis\"\r\n        ) {\r\n            console.log(\"ss\");\r\n            props.onClick();\r\n        }\r\n    }, [isActive, inputRef]);\r\n\r\n    if (\r\n        props.isMobile &&\r\n        (props.type === \"start-ellipsis\" ||\r\n            props.type === \"end-ellipsis\" ||\r\n            props.type === \"page\")\r\n    ) {\r\n        if (props.selected) {\r\n            return (\r\n                <div>\r\n                    {props.page} / {props.count}\r\n                </div>\r\n            );\r\n        }\r\n        return <></>;\r\n    }\r\n    return (\r\n        <div ref={inputRef}>\r\n            <PaginationItem ref={drop} {...props} />\r\n        </div>\r\n    );\r\n}\r\n","import React, { useCallback, useMemo } from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { Pagination } from \"@material-ui/lab\";\r\nimport CustomPaginationItem from \"./PaginationItem\";\r\nimport { setPagination } from \"../../redux/viewUpdate/action\";\r\nimport AutoHidden from \"../Dial/AutoHidden\";\r\nimport statusHelper from \"../../utils/page\";\r\nimport { useLocation } from \"react-router-dom\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    root: {\r\n        position: \"fixed\",\r\n        bottom: 23,\r\n        /* left: 8px; */\r\n        background: theme.palette.background.paper,\r\n        borderRadius: 24,\r\n        boxShadow:\r\n            \" 0px 3px 5px -1px rgb(0 0 0 / 20%), 0px 6px 10px 0px rgb(0 0 0 / 14%), 0px 1px 18px 0px rgb(0 0 0 / 12%)\",\r\n        padding: \"8px 4px 8px 4px\",\r\n        marginLeft: 20,\r\n    },\r\n    placeholder: {\r\n        marginTop: 80,\r\n    },\r\n}));\r\n\r\nexport default function PaginationFooter() {\r\n    const classes = useStyles();\r\n    const dispatch = useDispatch();\r\n    const files = useSelector((state) => state.explorer.fileList);\r\n    const folders = useSelector((state) => state.explorer.dirList);\r\n    const pagination = useSelector((state) => state.viewUpdate.pagination);\r\n    const loading = useSelector((state) => state.viewUpdate.navigatorLoading);\r\n    const location = useLocation();\r\n\r\n    const SetPagination = useCallback((p) => dispatch(setPagination(p)), [\r\n        dispatch,\r\n    ]);\r\n\r\n    const handleChange = (event, value) => {\r\n        SetPagination({ ...pagination, page: value });\r\n    };\r\n\r\n    const count = useMemo(\r\n        () => Math.ceil((files.length + folders.length) / pagination.size),\r\n        [files, folders, pagination.size]\r\n    );\r\n\r\n    const isMobile = statusHelper.isMobile();\r\n    const isSharePage = statusHelper.isSharePage(location.pathname);\r\n\r\n    if (count > 1 && !loading) {\r\n        return (\r\n            <>\r\n                {!isMobile && !isSharePage && (\r\n                    <div className={classes.placeholder} />\r\n                )}\r\n                <AutoHidden\r\n                    enable\r\n                    element={\r\n                        isMobile || isSharePage\r\n                            ? null\r\n                            : document.querySelector(\"#explorer-container\")\r\n                    }\r\n                >\r\n                    <div className={classes.root}>\r\n                        <Pagination\r\n                            renderItem={(item) => (\r\n                                <CustomPaginationItem\r\n                                    count={count}\r\n                                    isMobile={isMobile}\r\n                                    {...item}\r\n                                />\r\n                            )}\r\n                            color=\"secondary\"\r\n                            count={count}\r\n                            page={pagination.page}\r\n                            onChange={handleChange}\r\n                        />\r\n                    </div>\r\n                </AutoHidden>\r\n            </>\r\n        );\r\n    }\r\n    return <div></div>;\r\n}\r\n","import React, { Component } from \"react\";\r\nimport { DndProvider } from \"react-dnd\";\r\nimport HTML5Backend from \"react-dnd-html5-backend\";\r\nimport { connect } from \"react-redux\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport { changeSubTitle } from \"../../redux/viewUpdate/action\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport DragLayer from \"./DnD/DragLayer\";\r\nimport Explorer from \"./Explorer\";\r\nimport Modals from \"./Modals\";\r\nimport Navigator from \"./Navigator/Navigator\";\r\nimport SideDrawer from \"./Sidebar/SideDrawer\";\r\nimport classNames from \"classnames\";\r\nimport {\r\n    closeAllModals,\r\n    navigateTo,\r\n    setSelectedTarget,\r\n    toggleSnackbar,\r\n} from \"../../redux/explorer\";\r\nimport PaginationFooter from \"./Pagination\";\r\nimport withStyles from \"@material-ui/core/styles/withStyles\";\r\n\r\nconst styles = (theme) => ({\r\n    root: {\r\n        display: \"flex\",\r\n        flexDirection: \"column\",\r\n        height: \"calc(100vh - 64px)\",\r\n        [theme.breakpoints.down(\"xs\")]: {\r\n            height: \"100%\",\r\n        },\r\n    },\r\n    rootShare: {\r\n        display: \"flex\",\r\n        flexDirection: \"column\",\r\n        height: \"100%\",\r\n        minHeight: 500,\r\n    },\r\n    explorer: {\r\n        display: \"flex\",\r\n        flexDirection: \"column\",\r\n        overflowY: \"auto\",\r\n    },\r\n});\r\n\r\nconst mapStateToProps = () => ({});\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n    return {\r\n        changeSubTitle: (text) => {\r\n            dispatch(changeSubTitle(text));\r\n        },\r\n        setSelectedTarget: (targets) => {\r\n            dispatch(setSelectedTarget(targets));\r\n        },\r\n        toggleSnackbar: (vertical, horizontal, msg, color) => {\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color));\r\n        },\r\n        closeAllModals: () => {\r\n            dispatch(closeAllModals());\r\n        },\r\n        navigateTo: (path) => {\r\n            dispatch(navigateTo(path));\r\n        },\r\n    };\r\n};\r\n\r\nclass FileManager extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n        this.image = React.createRef();\r\n    }\r\n    componentWillUnmount() {\r\n        this.props.setSelectedTarget([]);\r\n        this.props.closeAllModals();\r\n        this.props.navigateTo(\"/\");\r\n    }\r\n\r\n    componentDidMount() {\r\n        if (pathHelper.isHomePage(this.props.location.pathname)) {\r\n            this.props.changeSubTitle(null);\r\n        }\r\n    }\r\n    render() {\r\n        const { classes } = this.props;\r\n        return (\r\n            <div\r\n                className={classNames({\r\n                    [classes.rootShare]: this.props.share,\r\n                    [classes.root]: !this.props.share,\r\n                })}\r\n            >\r\n                <DndProvider backend={HTML5Backend}>\r\n                    <Modals share={this.props.share} />\r\n                    <Navigator\r\n                        isShare={this.props.isShare}\r\n                        share={this.props.share}\r\n                    />\r\n                    <div className={classes.explorer} id={\"explorer-container\"}>\r\n                        <Explorer share={this.props.share} />\r\n                        <PaginationFooter />\r\n                    </div>\r\n\r\n                    <DragLayer />\r\n                </DndProvider>\r\n                <SideDrawer />\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nFileManager.propTypes = {};\r\n\r\nexport default connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(withRouter(FileManager)));\r\n","import React from \"react\";\r\nimport {\r\n    Icon,\r\n    ListItemIcon,\r\n    makeStyles,\r\n    Menu,\r\n    MenuItem,\r\n} from \"@material-ui/core\";\r\nimport CheckIcon from \"@material-ui/icons/Check\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    icon: {\r\n        minWidth: 38,\r\n    },\r\n}));\r\n\r\nexport default function SelectMenu({\r\n    options,\r\n    anchorEl,\r\n    handleClose,\r\n    callback,\r\n    selected,\r\n    showIcon = true,\r\n}) {\r\n    const classes = useStyles();\r\n\r\n    return (\r\n        <Menu\r\n            id=\"simple-menu\"\r\n            anchorEl={anchorEl}\r\n            keepMounted\r\n            open={Boolean(anchorEl)}\r\n            onClose={handleClose}\r\n        >\r\n            {options.map((item) => (\r\n                <>\r\n                    <MenuItem\r\n                        style={{ whiteSpace: \"normal\" }}\r\n                        dense\r\n                        onClick={() => callback(item)}\r\n                    >\r\n                        {showIcon && (\r\n                            <ListItemIcon className={classes.icon}>\r\n                                {item.name !== selected ? (\r\n                                    <Icon />\r\n                                ) : (\r\n                                    <CheckIcon />\r\n                                )}\r\n                            </ListItemIcon>\r\n                        )}\r\n\r\n                        {item.name}\r\n                    </MenuItem>\r\n                </>\r\n            ))}\r\n        </Menu>\r\n    );\r\n}\r\n","import React, { Suspense, useCallback, useEffect, useState } from \"react\";\r\nimport { Button, Paper } from \"@material-ui/core\";\r\nimport { makeStyles, useTheme } from \"@material-ui/core/styles\";\r\nimport { useLocation, useParams, useRouteMatch } from \"react-router\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport UseFileSubTitle from \"../../hooks/fileSubtitle\";\r\nimport { getPreviewURL } from \"../../middleware/Api\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { basename, fileNameNoExt, isMobileSafari } from \"../../utils\";\r\nimport { list } from \"../../services/navigate\";\r\nimport { getViewerURL } from \"../../redux/explorer/action\";\r\nimport { subtitleSuffix, videoPreviewSuffix } from \"../../config\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport { pathJoin } from \"../Uploader/core/utils\";\r\nimport { Launch, PlaylistPlay, Subtitles } from \"@material-ui/icons\";\r\nimport TextLoading from \"../Placeholder/TextLoading\";\r\nimport SelectMenu from \"./SelectMenu\";\r\nimport { getDownloadURL } from \"../../services/file\";\r\nimport { sortMethodFuncs } from \"../../redux/explorer/action\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst Artplayer = React.lazy(() =>\r\n    import(\r\n        /* webpackChunkName: \"artplayer\" */ \"artplayer/examples/react/Artplayer\"\r\n    )\r\n);\r\n\r\nconst externalPlayers = [\r\n    {\r\n        name: \"PotPlayer\",\r\n        url: (source, title) => `potplayer://${source}`,\r\n    },\r\n    {\r\n        name: \"VLC\",\r\n        url: (source, title) => `vlc://${source}`,\r\n    },\r\n    {\r\n        name: \"IINA\",\r\n        url: (source, title) => `iina://weblink?url=${source}`,\r\n    },\r\n    {\r\n        name: \"nPlayer\",\r\n        url: (source, title) => `nplayer-${source}`,\r\n    },\r\n    {\r\n        name: \"MXPlayer (Free)\",\r\n        url: (source, title) =>\r\n            `intent:${source}#Intent;package=com.mxtech.videoplayer.ad;S.title=${title};end`,\r\n    },\r\n    {\r\n        name: \"MXPlayer (Pro)\",\r\n        url: (source, title) =>\r\n            `intent:${source}#Intent;package=com.mxtech.videoplayer.pro;S.title=${title};end`,\r\n    },\r\n];\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    layout: {\r\n        width: \"auto\",\r\n        marginTop: 30,\r\n        marginBottom: 20,\r\n        marginLeft: theme.spacing(3),\r\n        marginRight: theme.spacing(3),\r\n        [theme.breakpoints.up(1100 + theme.spacing(3) * 2)]: {\r\n            width: 1100,\r\n            marginLeft: \"auto\",\r\n            marginRight: \"auto\",\r\n        },\r\n    },\r\n    player: {\r\n        borderRadius: 4,\r\n        height: \"100vh\",\r\n        maxHeight: \"calc(100vh - 180px)\",\r\n    },\r\n    actions: {\r\n        marginTop: theme.spacing(2),\r\n    },\r\n    actionButton: {\r\n        marginRight: theme.spacing(1),\r\n        marginTop: theme.spacing(1),\r\n    },\r\n}));\r\n\r\nfunction useQuery() {\r\n    return new URLSearchParams(useLocation().search);\r\n}\r\n\r\nexport default function VideoViewer() {\r\n    const { t } = useTranslation();\r\n    const math = useRouteMatch();\r\n    const location = useLocation();\r\n    const query = useQuery();\r\n    const { id } = useParams();\r\n    const dispatch = useDispatch();\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n    const { title, path } = UseFileSubTitle(query, math, location);\r\n    const theme = useTheme();\r\n    const [art, setArt] = useState(null);\r\n    const history = useHistory();\r\n    const [files, setFiles] = useState([]);\r\n    const [subtitles, setSubtitles] = useState([]);\r\n    const [playlist, setPlaylist] = useState([]);\r\n    const [subtitleOpen, setSubtitleOpen] = useState(null);\r\n    const [subtitleSelected, setSubtitleSelected] = useState(\"\");\r\n    const [playlistOpen, setPlaylistOpen] = useState(null);\r\n    const [externalPlayerOpen, setExternalPlayerOpen] = useState(null);\r\n    const isShare = pathHelper.isSharePage(location.pathname);\r\n    const sortMethod = useSelector((state) => state.viewUpdate.sortMethod);\r\n    const sortFunc = sortMethodFuncs[sortMethod];\r\n\r\n    useEffect(() => {\r\n        art &&\r\n            art.on(\"ready\", () => {\r\n                art.autoHeight = true;\r\n            });\r\n        return () => {\r\n            if (\r\n                art !== null &&\r\n                !isMobileSafari() &&\r\n                document.pictureInPictureEnabled &&\r\n                art.playing\r\n            ) {\r\n                art.pip = true;\r\n                art.query(\".art-video\").addEventListener(\r\n                    \"leavepictureinpicture\",\r\n                    () => {\r\n                        art.pause();\r\n                    },\r\n                    false\r\n                );\r\n            }\r\n        };\r\n    }, [art]);\r\n\r\n    const classes = useStyles();\r\n\r\n    useEffect(() => {\r\n        if (art !== null) {\r\n            const newURL = getPreviewURL(\r\n                isShare,\r\n                id,\r\n                query.get(\"id\"),\r\n                query.get(\"share_path\")\r\n            );\r\n            if (newURL !== art.url) {\r\n                if (art.subtitle) {\r\n                    art.subtitle.show = false;\r\n                }\r\n                art.switchUrl(newURL);\r\n                if (path && path !== \"\") {\r\n                    list(\r\n                        basename(path),\r\n                        isShare ? { key: id } : null,\r\n                        \"\",\r\n                        \"\"\r\n                    ).then((res) => {\r\n                        setFiles(\r\n                            res.data.objects.sort(sortFunc).filter((o) => o.type === \"file\")\r\n                        );\r\n                        setPlaylist(\r\n                            res.data.objects.filter(\r\n                                (o) =>\r\n                                    o.type === \"file\" &&\r\n                                    videoPreviewSuffix.indexOf(\r\n                                        o.name.split(\".\").pop().toLowerCase()\r\n                                    ) !== -1\r\n                            )\r\n                        );\r\n                    });\r\n                }\r\n            }\r\n        }\r\n    }, [art, id, location, path]);\r\n\r\n    const switchSubtitle = (f) => {\r\n        if (art !== null) {\r\n            const fileType = f.name.split(\".\").pop().toLowerCase();\r\n            art.subtitle.switch(\r\n                getPreviewURL(\r\n                    isShare,\r\n                    id,\r\n                    f.id,\r\n                    pathJoin([basename(query.get(\"share_path\")), f.name])\r\n                ),\r\n                {\r\n                    type: fileType,\r\n                }\r\n            );\r\n            art.subtitle.show = true;\r\n            setSubtitleSelected(f.name);\r\n            ToggleSnackbar(\r\n                \"top\",\r\n                \"center\",\r\n                t(\"fileManager.subtitleSwitchTo\", {\r\n                    subtitle: f.name,\r\n                }),\r\n                \"info\"\r\n            );\r\n        }\r\n    };\r\n\r\n    useEffect(() => {\r\n        if (files.length > 0) {\r\n            const fileNameMatch = fileNameNoExt(title) + \".\";\r\n            const options = files.filter((f) => {\r\n                const fileType = f.name.split(\".\").pop().toLowerCase();\r\n                return subtitleSuffix.indexOf(fileType) !== -1;\r\n            }).sort((a, b) => {\r\n                return (a.name.startsWith(fileNameMatch) && !b.name.startsWith(fileNameMatch)) ? -1 : 0;\r\n            });\r\n            if (options.length > 0 && options[0].name.startsWith(fileNameMatch)) {\r\n                switchSubtitle(options[0]);\r\n            }\r\n            setSubtitles(options);\r\n        }\r\n    }, [files]);\r\n\r\n    const switchVideo = (file) => {\r\n        setSubtitleSelected(null);\r\n        if (isShare) {\r\n            file.key = id;\r\n        }\r\n        if (isMobileSafari()) {\r\n            window.location.href = getViewerURL(\"video\", file, isShare);\r\n        } else {\r\n            history.push(getViewerURL(\"video\", file, isShare));\r\n        }\r\n    };\r\n\r\n    const setSubtitle = (sub) => {\r\n        setSubtitleOpen(null);\r\n        switchSubtitle(sub);\r\n    };\r\n\r\n    const startSelectSubTitle = (e) => {\r\n        if (subtitles.length === 0) {\r\n            ToggleSnackbar(\r\n                \"top\",\r\n                \"right\",\r\n                t(\"fileManager.noSubtitleAvailable\"),\r\n                \"warning\"\r\n            );\r\n            return;\r\n        }\r\n        setSubtitleOpen(e.currentTarget);\r\n    };\r\n\r\n    const openInExternalPlayer = (player) => {\r\n        const current = { name: title };\r\n        current.id = query.get(\"id\");\r\n        current.path = basename(path);\r\n        if (isShare) {\r\n            current.key = id;\r\n        }\r\n\r\n        setExternalPlayerOpen(null);\r\n        getDownloadURL(current)\r\n            .then((response) => {\r\n                window.location.assign(player.url(response.data, title));\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n            });\r\n    };\r\n\r\n    return (\r\n        <div className={classes.layout}>\r\n            <Paper className={classes.root} elevation={1}>\r\n                <Suspense fallback={<TextLoading />}>\r\n                    <Artplayer\r\n                        option={{\r\n                            title: title,\r\n                            theme: theme.palette.secondary.main,\r\n                            flip: true,\r\n                            setting: true,\r\n                            playbackRate: true,\r\n                            aspectRatio: true,\r\n                            hotkey: true,\r\n                            pip: true,\r\n                            fullscreen: true,\r\n                            fullscreenWeb: true,\r\n                            autoHeight: true,\r\n                            whitelist: [\"*\"],\r\n                            moreVideoAttr: {\r\n                                \"webkit-playsinline\": true,\r\n                                playsInline: true,\r\n                            },\r\n                            lang: t(\"artPlayerLocaleCode\", { ns: \"common\" }),\r\n                        }}\r\n                        className={classes.player}\r\n                        getInstance={(a) => setArt(a)}\r\n                    />\r\n                </Suspense>\r\n            </Paper>\r\n            <div className={classes.actions}>\r\n                <Button\r\n                    onClick={startSelectSubTitle}\r\n                    className={classes.actionButton}\r\n                    startIcon={<Subtitles />}\r\n                    variant=\"outlined\"\r\n                >\r\n                    {t(\"fileManager.subtitle\")}\r\n                </Button>\r\n                {playlist.length >= 2 && (\r\n                    <Button\r\n                        onClick={(e) => setPlaylistOpen(e.currentTarget)}\r\n                        className={classes.actionButton}\r\n                        startIcon={<PlaylistPlay />}\r\n                        variant=\"outlined\"\r\n                    >\r\n                        {t(\"fileManager.playlist\")}\r\n                    </Button>\r\n                )}\r\n                <Button\r\n                    onClick={(e) => setExternalPlayerOpen(e.currentTarget)}\r\n                    className={classes.actionButton}\r\n                    startIcon={<Launch />}\r\n                    variant=\"outlined\"\r\n                >\r\n                    {t(\"fileManager.openInExternalPlayer\")}\r\n                </Button>\r\n            </div>\r\n            <SelectMenu\r\n                selected={subtitleSelected}\r\n                options={subtitles}\r\n                callback={setSubtitle}\r\n                anchorEl={subtitleOpen}\r\n                handleClose={() => setSubtitleOpen(null)}\r\n            />\r\n            <SelectMenu\r\n                selected={title}\r\n                options={playlist}\r\n                callback={switchVideo}\r\n                anchorEl={playlistOpen}\r\n                handleClose={() => setPlaylistOpen(null)}\r\n            />\r\n            <SelectMenu\r\n                showIcon={false}\r\n                options={externalPlayers}\r\n                callback={openInExternalPlayer}\r\n                anchorEl={externalPlayerOpen}\r\n                handleClose={() => setExternalPlayerOpen(null)}\r\n            />\r\n        </div>\r\n    );\r\n}\r\n","import React, { useCallback, useEffect, useState } from \"react\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport OpenIcon from \"@material-ui/icons/OpenInNew\";\r\nimport Pagination from \"@material-ui/lab/Pagination\";\r\nimport FolderIcon from \"@material-ui/icons/Folder\";\r\n\r\nimport {\r\n    Avatar,\r\n    Card,\r\n    CardHeader,\r\n    Grid,\r\n    IconButton,\r\n    Tooltip,\r\n    Typography,\r\n} from \"@material-ui/core\";\r\nimport API from \"../../middleware/Api\";\r\nimport TypeIcon from \"../FileManager/TypeIcon\";\r\nimport Select from \"@material-ui/core/Select\";\r\nimport MenuItem from \"@material-ui/core/MenuItem\";\r\nimport FormControl from \"@material-ui/core/FormControl\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { useLocation } from \"react-router\";\r\nimport TimeAgo from \"timeago-react\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport Nothing from \"../Placeholder/Nothing\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    cardContainer: {\r\n        padding: theme.spacing(1),\r\n    },\r\n    card: {\r\n        maxWidth: 400,\r\n        margin: \"0 auto\",\r\n    },\r\n    actions: {\r\n        display: \"flex\",\r\n    },\r\n    layout: {\r\n        width: \"auto\",\r\n        marginTop: \"50px\",\r\n        marginLeft: theme.spacing(3),\r\n        marginRight: theme.spacing(3),\r\n        [theme.breakpoints.up(1100 + theme.spacing(3) * 2)]: {\r\n            width: 1100,\r\n            marginLeft: \"auto\",\r\n            marginRight: \"auto\",\r\n        },\r\n    },\r\n    shareTitle: {\r\n        maxWidth: \"200px\",\r\n    },\r\n    avatarFile: {\r\n        backgroundColor: theme.palette.primary.light,\r\n    },\r\n    avatarFolder: {\r\n        backgroundColor: theme.palette.secondary.light,\r\n    },\r\n    gird: {\r\n        marginTop: \"30px\",\r\n    },\r\n    loadMore: {\r\n        textAlign: \"right\",\r\n        marginTop: \"20px\",\r\n        marginBottom: \"40px\",\r\n    },\r\n    badge: {\r\n        marginLeft: theme.spacing(1),\r\n        height: 17,\r\n    },\r\n    orderSelect: {\r\n        textAlign: \"right\",\r\n        marginTop: 5,\r\n    },\r\n    cardAction: {\r\n        marginTop: 0,\r\n    },\r\n}));\r\n\r\nfunction useQuery() {\r\n    return new URLSearchParams(useLocation().search);\r\n}\r\n\r\nexport default function SearchResult() {\r\n    const { t } = useTranslation(\"application\", { keyPrefix: \"share\" });\r\n    const { t: tGlobal } = useTranslation();\r\n    const classes = useStyles();\r\n    const dispatch = useDispatch();\r\n\r\n    const query = useQuery();\r\n    const location = useLocation();\r\n    const history = useHistory();\r\n\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n\r\n    const [page, setPage] = useState(1);\r\n    const [total, setTotal] = useState(0);\r\n    const [shareList, setShareList] = useState([]);\r\n    const [orderBy, setOrderBy] = useState(\"created_at DESC\");\r\n\r\n    const search = useCallback((keywords, page, orderBy) => {\r\n        const order = orderBy.split(\" \");\r\n        API.get(\r\n            \"/share/search?page=\" +\r\n                page +\r\n                \"&order_by=\" +\r\n                order[0] +\r\n                \"&order=\" +\r\n                order[1] +\r\n                \"&keywords=\" +\r\n                encodeURIComponent(keywords)\r\n        )\r\n            .then((response) => {\r\n                setTotal(response.data.total);\r\n                setShareList(response.data.items);\r\n            })\r\n            .catch(() => {\r\n                ToggleSnackbar(\"top\", \"right\", t(\"listLoadingError\"), \"error\");\r\n            });\r\n    }, []);\r\n\r\n    useEffect(() => {\r\n        const keywords = query.get(\"keywords\");\r\n        if (keywords) {\r\n            search(keywords, page, orderBy);\r\n        } else {\r\n            ToggleSnackbar(\"top\", \"right\", t(\"enterKeywords\"), \"warning\");\r\n        }\r\n    }, [location]);\r\n\r\n    const handlePageChange = (event, value) => {\r\n        setPage(value);\r\n        const keywords = query.get(\"keywords\");\r\n        search(keywords, value, orderBy);\r\n    };\r\n\r\n    const handleOrderChange = (event) => {\r\n        setOrderBy(event.target.value);\r\n        const keywords = query.get(\"keywords\");\r\n        search(keywords, page, event.target.value);\r\n    };\r\n\r\n    return (\r\n        <div className={classes.layout}>\r\n            <Grid container>\r\n                <Grid sm={6} xs={6}>\r\n                    <Typography color=\"textSecondary\" variant=\"h4\">\r\n                        {t(\"searchResult\")}\r\n                    </Typography>\r\n                </Grid>\r\n                <Grid sm={6} xs={6} className={classes.orderSelect}>\r\n                    <FormControl>\r\n                        <Select\r\n                            color={\"secondary\"}\r\n                            onChange={handleOrderChange}\r\n                            value={orderBy}\r\n                        >\r\n                            <MenuItem value={\"created_at DESC\"}>\r\n                                {t(\"createdAtDesc\")}\r\n                            </MenuItem>\r\n                            <MenuItem value={\"created_at ASC\"}>\r\n                                {t(\"createdAtAsc\")}\r\n                            </MenuItem>\r\n                            <MenuItem value={\"downloads DESC\"}>\r\n                                {t(\"downloadsDesc\")}\r\n                            </MenuItem>\r\n                            <MenuItem value={\"downloads ASC\"}>\r\n                                {t(\"downloadsAsc\")}\r\n                            </MenuItem>\r\n                            <MenuItem value={\"views DESC\"}>\r\n                                {t(\"viewsDesc\")}\r\n                            </MenuItem>\r\n                            <MenuItem value={\"views ASC\"}>\r\n                                {t(\"viewsAsc\")}\r\n                            </MenuItem>\r\n                        </Select>\r\n                    </FormControl>\r\n                </Grid>\r\n            </Grid>\r\n            <Grid container spacing={24} className={classes.gird}>\r\n                {shareList.length === 0 && <Nothing primary={t(\"noRecords\")} />}\r\n                {shareList.map((value) => (\r\n                    <Grid\r\n                        item\r\n                        xs={12}\r\n                        sm={4}\r\n                        key={value.id}\r\n                        className={classes.cardContainer}\r\n                    >\r\n                        <Card className={classes.card}>\r\n                            <CardHeader\r\n                                classes={{\r\n                                    action: classes.cardAction,\r\n                                }}\r\n                                avatar={\r\n                                    <div>\r\n                                        {!value.is_dir && (\r\n                                            <TypeIcon\r\n                                                fileName={\r\n                                                    value.source\r\n                                                        ? value.source.name\r\n                                                        : \"\"\r\n                                                }\r\n                                                isUpload\r\n                                            />\r\n                                        )}{\" \"}\r\n                                        {value.is_dir && (\r\n                                            <Avatar\r\n                                                className={classes.avatarFolder}\r\n                                            >\r\n                                                <FolderIcon />\r\n                                            </Avatar>\r\n                                        )}\r\n                                    </div>\r\n                                }\r\n                                action={\r\n                                    <Tooltip\r\n                                        placement=\"top\"\r\n                                        title={tGlobal(\"fileManager.open\")}\r\n                                    >\r\n                                        <IconButton\r\n                                            onClick={() =>\r\n                                                history.push(\"/s/\" + value.key)\r\n                                            }\r\n                                        >\r\n                                            <OpenIcon />\r\n                                        </IconButton>\r\n                                    </Tooltip>\r\n                                }\r\n                                title={\r\n                                    <Tooltip\r\n                                        placement=\"top\"\r\n                                        title={\r\n                                            value.source\r\n                                                ? value.source.name\r\n                                                : t(\"sourceNotFound\")\r\n                                        }\r\n                                    >\r\n                                        <Typography\r\n                                            noWrap\r\n                                            className={classes.shareTitle}\r\n                                        >\r\n                                            {value.source\r\n                                                ? value.source.name\r\n                                                : t(\"sourceNotFound\")}\r\n                                        </Typography>\r\n                                    </Tooltip>\r\n                                }\r\n                                subheader={\r\n                                    <span>\r\n                                        <Trans\r\n                                            i18nKey=\"share.sharedAt\"\r\n                                            components={[\r\n                                                <TimeAgo\r\n                                                    key={0}\r\n                                                    datetime={value.create_date}\r\n                                                    locale={tGlobal(\r\n                                                        \"timeAgoLocaleCode\",\r\n                                                        {\r\n                                                            ns: \"common\",\r\n                                                        }\r\n                                                    )}\r\n                                                />,\r\n                                            ]}\r\n                                        />\r\n                                    </span>\r\n                                }\r\n                            />\r\n                        </Card>\r\n                    </Grid>\r\n                ))}\r\n            </Grid>\r\n            <div className={classes.loadMore}>\r\n                <Pagination\r\n                    count={Math.ceil(total / 18)}\r\n                    onChange={handlePageChange}\r\n                    color=\"secondary\"\r\n                />\r\n            </div>{\" \"}\r\n        </div>\r\n    );\r\n}\r\n","import React, { Component } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport OpenIcon from \"@material-ui/icons/OpenInNew\";\r\nimport Pagination from \"@material-ui/lab/Pagination\";\r\nimport FolderIcon from \"@material-ui/icons/Folder\";\r\nimport LockIcon from \"@material-ui/icons/Lock\";\r\nimport UnlockIcon from \"@material-ui/icons/LockOpen\";\r\nimport EyeIcon from \"@material-ui/icons/RemoveRedEye\";\r\nimport DeleteIcon from \"@material-ui/icons/Delete\";\r\n\r\nimport {\r\n    Avatar,\r\n    Button,\r\n    Card,\r\n    CardActions,\r\n    CardHeader,\r\n    Dialog,\r\n    DialogActions,\r\n    DialogContent,\r\n    DialogTitle,\r\n    Grid,\r\n    IconButton,\r\n    TextField,\r\n    Tooltip,\r\n    Typography,\r\n    withStyles,\r\n} from \"@material-ui/core\";\r\nimport API from \"../../middleware/Api\";\r\nimport TypeIcon from \"../FileManager/TypeIcon\";\r\nimport Chip from \"@material-ui/core/Chip\";\r\nimport Divider from \"@material-ui/core/Divider\";\r\nimport { VisibilityOff, VpnKey } from \"@material-ui/icons\";\r\nimport Select from \"@material-ui/core/Select\";\r\nimport MenuItem from \"@material-ui/core/MenuItem\";\r\nimport FormControl from \"@material-ui/core/FormControl\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport ToggleIcon from \"material-ui-toggle-icon\";\r\nimport { formatLocalTime } from \"../../utils/datetime\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport Nothing from \"../Placeholder/Nothing\";\r\nimport { withTranslation } from \"react-i18next\";\r\n\r\nconst styles = (theme) => ({\r\n    cardContainer: {\r\n        padding: theme.spacing(1),\r\n    },\r\n    card: {\r\n        maxWidth: 400,\r\n        margin: \"0 auto\",\r\n    },\r\n    actions: {\r\n        display: \"flex\",\r\n    },\r\n    layout: {\r\n        width: \"auto\",\r\n        marginTop: \"50px\",\r\n        marginLeft: theme.spacing(3),\r\n        marginRight: theme.spacing(3),\r\n        [theme.breakpoints.up(1100 + theme.spacing(3) * 2)]: {\r\n            width: 1100,\r\n            marginLeft: \"auto\",\r\n            marginRight: \"auto\",\r\n        },\r\n    },\r\n    shareTitle: {\r\n        maxWidth: \"200px\",\r\n    },\r\n    avatarFile: {\r\n        backgroundColor: theme.palette.primary.light,\r\n    },\r\n    avatarFolder: {\r\n        backgroundColor: theme.palette.secondary.light,\r\n    },\r\n    gird: {\r\n        marginTop: \"30px\",\r\n    },\r\n    loadMore: {\r\n        textAlign: \"right\",\r\n        marginTop: \"20px\",\r\n        marginBottom: \"40px\",\r\n    },\r\n    badge: {\r\n        marginLeft: theme.spacing(1),\r\n        height: 17,\r\n    },\r\n    orderSelect: {\r\n        textAlign: \"right\",\r\n        marginTop: 5,\r\n    },\r\n});\r\nconst mapStateToProps = () => {\r\n    return {};\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n    return {\r\n        toggleSnackbar: (vertical, horizontal, msg, color) => {\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color));\r\n        },\r\n    };\r\n};\r\n\r\nclass MyShareCompoment extends Component {\r\n    state = {\r\n        page: 1,\r\n        total: 0,\r\n        shareList: [],\r\n        showPwd: null,\r\n        orderBy: \"created_at DESC\",\r\n    };\r\n\r\n    componentDidMount = () => {\r\n        this.loadList(1, this.state.orderBy);\r\n    };\r\n\r\n    showPwd = (pwd) => {\r\n        this.setState({ showPwd: pwd });\r\n    };\r\n\r\n    handleClose = () => {\r\n        this.setState({ showPwd: null });\r\n    };\r\n\r\n    removeShare = (id) => {\r\n        API.delete(\"/share/\" + id)\r\n            .then(() => {\r\n                let oldList = this.state.shareList;\r\n                oldList = oldList.filter((value) => {\r\n                    return value.key !== id;\r\n                });\r\n                this.setState({\r\n                    shareList: oldList,\r\n                    total: this.state.total - 1,\r\n                });\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    this.props.t(\"share.shareCanceled\"),\r\n                    \"success\"\r\n                );\r\n                if (oldList.length === 0) {\r\n                    this.loadList(1, this.state.orderBy);\r\n                }\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n            });\r\n    };\r\n\r\n    changePermission = (id) => {\r\n        const newPwd = Math.random().toString(36).substr(2).slice(2, 8);\r\n        const oldList = this.state.shareList;\r\n        const shareIndex = oldList.findIndex((value) => {\r\n            return value.key === id;\r\n        });\r\n        API.patch(\"/share/\" + id, {\r\n            prop: \"password\",\r\n            value: oldList[shareIndex].password === \"\" ? newPwd : \"\",\r\n        })\r\n            .then((response) => {\r\n                oldList[shareIndex].password = response.data;\r\n                this.setState({\r\n                    shareList: oldList,\r\n                });\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n            });\r\n    };\r\n\r\n    changePreviewOption = (id) => {\r\n        const oldList = this.state.shareList;\r\n        const shareIndex = oldList.findIndex((value) => {\r\n            return value.key === id;\r\n        });\r\n        API.patch(\"/share/\" + id, {\r\n            prop: \"preview_enabled\",\r\n            value: oldList[shareIndex].preview ? \"false\" : \"true\",\r\n        })\r\n            .then((response) => {\r\n                oldList[shareIndex].preview = response.data;\r\n                this.setState({\r\n                    shareList: oldList,\r\n                });\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n            });\r\n    };\r\n\r\n    loadList = (page, orderBy) => {\r\n        const order = orderBy.split(\" \");\r\n        API.get(\r\n            \"/share?page=\" +\r\n                page +\r\n                \"&order_by=\" +\r\n                order[0] +\r\n                \"&order=\" +\r\n                order[1]\r\n        )\r\n            .then((response) => {\r\n                this.setState({\r\n                    total: response.data.total,\r\n                    shareList: response.data.items,\r\n                });\r\n            })\r\n            .catch(() => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    this.props.t(\"share.listLoadingError\"),\r\n                    \"error\"\r\n                );\r\n            });\r\n    };\r\n\r\n    handlePageChange = (event, value) => {\r\n        this.setState({\r\n            page: value,\r\n        });\r\n        this.loadList(value, this.state.orderBy);\r\n    };\r\n\r\n    handleOrderChange = (event) => {\r\n        this.setState({\r\n            orderBy: event.target.value,\r\n        });\r\n        this.loadList(this.state.page, event.target.value);\r\n    };\r\n\r\n    isExpired = (share) => {\r\n        return share.expire < -1 || share.remain_downloads === 0;\r\n    };\r\n\r\n    render() {\r\n        const { classes, t } = this.props;\r\n\r\n        return (\r\n            <div className={classes.layout}>\r\n                <Grid container>\r\n                    <Grid sm={6} xs={6}>\r\n                        <Typography color=\"textSecondary\" variant=\"h4\">\r\n                            {t(\"share.sharedFiles\")}\r\n                        </Typography>\r\n                    </Grid>\r\n                    <Grid sm={6} xs={6} className={classes.orderSelect}>\r\n                        <FormControl>\r\n                            <Select\r\n                                color={\"secondary\"}\r\n                                onChange={this.handleOrderChange}\r\n                                value={this.state.orderBy}\r\n                            >\r\n                                <MenuItem value={\"created_at DESC\"}>\r\n                                    {t(\"share.createdAtDesc\")}\r\n                                </MenuItem>\r\n                                <MenuItem value={\"created_at ASC\"}>\r\n                                    {t(\"share.createdAtAsc\")}\r\n                                </MenuItem>\r\n                                <MenuItem value={\"downloads DESC\"}>\r\n                                    {t(\"share.downloadsDesc\")}\r\n                                </MenuItem>\r\n                                <MenuItem value={\"downloads ASC\"}>\r\n                                    {t(\"share.downloadsAsc\")}\r\n                                </MenuItem>\r\n                                <MenuItem value={\"views DESC\"}>\r\n                                    {t(\"share.viewsDesc\")}\r\n                                </MenuItem>\r\n                                <MenuItem value={\"views ASC\"}>\r\n                                    {t(\"share.viewsAsc\")}\r\n                                </MenuItem>\r\n                            </Select>\r\n                        </FormControl>\r\n                    </Grid>\r\n                </Grid>\r\n                <Grid container spacing={2} className={classes.gird}>\r\n                    {this.state.shareList.length === 0 && (\r\n                        <Nothing primary={t(\"share.noRecords\")} />\r\n                    )}\r\n                    {this.state.shareList.map((value) => (\r\n                        <Grid\r\n                            item\r\n                            xs={12}\r\n                            sm={6}\r\n                            md={4}\r\n                            key={value.id}\r\n                            className={classes.cardContainer}\r\n                        >\r\n                            <Card className={classes.card}>\r\n                                <CardHeader\r\n                                    avatar={\r\n                                        <div>\r\n                                            {!value.is_dir && (\r\n                                                <TypeIcon\r\n                                                    fileName={\r\n                                                        value.source\r\n                                                            ? value.source.name\r\n                                                            : \"\"\r\n                                                    }\r\n                                                    isUpload\r\n                                                />\r\n                                            )}{\" \"}\r\n                                            {value.is_dir && (\r\n                                                <Avatar\r\n                                                    className={\r\n                                                        classes.avatarFolder\r\n                                                    }\r\n                                                >\r\n                                                    <FolderIcon />\r\n                                                </Avatar>\r\n                                            )}\r\n                                        </div>\r\n                                    }\r\n                                    title={\r\n                                        <Tooltip\r\n                                            placement=\"top\"\r\n                                            title={\r\n                                                value.source\r\n                                                    ? value.source.name\r\n                                                    : t(\"share.sourceNotFound\")\r\n                                            }\r\n                                        >\r\n                                            <Typography\r\n                                                noWrap\r\n                                                className={classes.shareTitle}\r\n                                            >\r\n                                                {value.source\r\n                                                    ? value.source.name\r\n                                                    : t(\"share.sourceNotFound\")}\r\n                                            </Typography>\r\n                                        </Tooltip>\r\n                                    }\r\n                                    subheader={\r\n                                        <span>\r\n                                            {formatLocalTime(value.create_date)}\r\n                                            {this.isExpired(value) && (\r\n                                                <Chip\r\n                                                    size=\"small\"\r\n                                                    className={classes.badge}\r\n                                                    label={t(\"share.expired\")}\r\n                                                />\r\n                                            )}\r\n                                        </span>\r\n                                    }\r\n                                />\r\n                                <Divider />\r\n                                <CardActions\r\n                                    disableActionSpacing\r\n                                    style={{\r\n                                        display: \"block\",\r\n                                        textAlign: \"right\",\r\n                                    }}\r\n                                >\r\n                                    <Tooltip\r\n                                        placement=\"top\"\r\n                                        title={t(\"fileManager.open\")}\r\n                                    >\r\n                                        <IconButton\r\n                                            onClick={() =>\r\n                                                this.props.history.push(\r\n                                                    \"/s/\" +\r\n                                                        value.key +\r\n                                                        (value.password === \"\"\r\n                                                            ? \"\"\r\n                                                            : \"?password=\" +\r\n                                                              value.password)\r\n                                                )\r\n                                            }\r\n                                        >\r\n                                            <OpenIcon fontSize={\"small\"} />\r\n                                        </IconButton>\r\n                                    </Tooltip>{\" \"}\r\n                                    {value.password !== \"\" && (\r\n                                        <>\r\n                                            <Tooltip\r\n                                                placement=\"top\"\r\n                                                title={t(\r\n                                                    \"share.changeToPublic\"\r\n                                                )}\r\n                                                onClick={() =>\r\n                                                    this.changePermission(\r\n                                                        value.key\r\n                                                    )\r\n                                                }\r\n                                            >\r\n                                                <IconButton>\r\n                                                    <LockIcon\r\n                                                        fontSize={\"small\"}\r\n                                                    />\r\n                                                </IconButton>\r\n                                            </Tooltip>\r\n                                            <Tooltip\r\n                                                placement=\"top\"\r\n                                                title={t(\"share.viewPassword\")}\r\n                                                onClick={() =>\r\n                                                    this.showPwd(value.password)\r\n                                                }\r\n                                            >\r\n                                                <IconButton>\r\n                                                    <VpnKey\r\n                                                        fontSize={\"small\"}\r\n                                                    />\r\n                                                </IconButton>\r\n                                            </Tooltip>\r\n                                        </>\r\n                                    )}\r\n                                    {value.password === \"\" && (\r\n                                        <Tooltip\r\n                                            placement=\"top\"\r\n                                            title={t(\"share.changeToPrivate\")}\r\n                                            onClick={() =>\r\n                                                this.changePermission(value.key)\r\n                                            }\r\n                                        >\r\n                                            <IconButton>\r\n                                                <UnlockIcon\r\n                                                    fontSize={\"small\"}\r\n                                                />\r\n                                            </IconButton>\r\n                                        </Tooltip>\r\n                                    )}\r\n                                    <Tooltip\r\n                                        placement=\"top\"\r\n                                        title={\r\n                                            value.preview\r\n                                                ? t(\"share.disablePreview\")\r\n                                                : t(\"share.enablePreview\")\r\n                                        }\r\n                                        onClick={() =>\r\n                                            this.changePreviewOption(value.key)\r\n                                        }\r\n                                    >\r\n                                        <IconButton>\r\n                                            <ToggleIcon\r\n                                                on={value.preview}\r\n                                                onIcon={\r\n                                                    <EyeIcon\r\n                                                        fontSize={\"small\"}\r\n                                                    />\r\n                                                }\r\n                                                offIcon={\r\n                                                    <VisibilityOff\r\n                                                        fontSize={\"small\"}\r\n                                                    />\r\n                                                }\r\n                                            />\r\n                                        </IconButton>\r\n                                    </Tooltip>\r\n                                    <Tooltip\r\n                                        placement=\"top\"\r\n                                        title={t(\"share.cancelShare\")}\r\n                                        onClick={() =>\r\n                                            this.removeShare(value.key)\r\n                                        }\r\n                                    >\r\n                                        <IconButton>\r\n                                            <DeleteIcon fontSize={\"small\"} />\r\n                                        </IconButton>\r\n                                    </Tooltip>\r\n                                </CardActions>\r\n                            </Card>\r\n                        </Grid>\r\n                    ))}\r\n                </Grid>\r\n                <div className={classes.loadMore}>\r\n                    <Pagination\r\n                        count={Math.ceil(this.state.total / 18)}\r\n                        onChange={this.handlePageChange}\r\n                        color=\"secondary\"\r\n                    />\r\n                </div>{\" \"}\r\n                <Dialog\r\n                    open={this.state.showPwd !== null}\r\n                    onClose={this.handleClose}\r\n                >\r\n                    <DialogTitle> {t(\"share.sharePassword\")} </DialogTitle>{\" \"}\r\n                    <DialogContent>\r\n                        <TextField\r\n                            id=\"standard-name\"\r\n                            value={this.state.showPwd}\r\n                            margin=\"normal\"\r\n                            autoFocus\r\n                        />\r\n                    </DialogContent>{\" \"}\r\n                    <DialogActions>\r\n                        <Button onClick={this.handleClose} color=\"default\">\r\n                            {t(\"close\", { ns: \"common\" })}\r\n                        </Button>{\" \"}\r\n                    </DialogActions>{\" \"}\r\n                </Dialog>{\" \"}\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nconst MyShare = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(withRouter(withTranslation()(MyShareCompoment))));\r\n\r\nexport default MyShare;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport {\r\n    Button,\r\n    CircularProgress,\r\n    Dialog,\r\n    DialogActions,\r\n    DialogContent,\r\n    DialogTitle,\r\n    makeStyles,\r\n} from \"@material-ui/core\";\r\nimport FormGroup from \"@material-ui/core/FormGroup\";\r\nimport FormControlLabel from \"@material-ui/core/FormControlLabel\";\r\nimport Checkbox from \"@material-ui/core/Checkbox\";\r\nimport MenuItem from \"@material-ui/core/MenuItem\";\r\nimport { Virtuoso } from \"react-virtuoso\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    contentFix: {\r\n        padding: \"10px 24px 0px 24px\",\r\n    },\r\n    wrapper: {\r\n        margin: theme.spacing(1),\r\n        position: \"relative\",\r\n    },\r\n    buttonProgress: {\r\n        color: theme.palette.secondary.light,\r\n        position: \"absolute\",\r\n        top: \"50%\",\r\n        left: \"50%\",\r\n        marginTop: -12,\r\n        marginLeft: -12,\r\n    },\r\n    content: {\r\n        padding: 0,\r\n    },\r\n    scroll: {\r\n        maxHeight: \"calc(100vh - 200px)\",\r\n    },\r\n}));\r\n\r\nexport default function SelectFileDialog(props) {\r\n    const { t } = useTranslation();\r\n    const [files, setFiles] = useState(props.files);\r\n\r\n    useEffect(() => {\r\n        setFiles(props.files);\r\n    }, [props.files]);\r\n\r\n    const handleChange = (index) => (event) => {\r\n        const filesCopy = [...files];\r\n        // eslint-disable-next-line\r\n        filesCopy.map((v, k) => {\r\n            if (v.index === index) {\r\n                filesCopy[k] = {\r\n                    ...filesCopy[k],\r\n                    selected: event.target.checked ? \"true\" : \"false\",\r\n                };\r\n            }\r\n        });\r\n        setFiles(filesCopy);\r\n    };\r\n\r\n    const submit = () => {\r\n        const index = [];\r\n        // eslint-disable-next-line\r\n        files.map((v) => {\r\n            if (v.selected === \"true\") {\r\n                index.push(parseInt(v.index));\r\n            }\r\n        });\r\n        props.onSubmit(index);\r\n    };\r\n\r\n    const classes = useStyles();\r\n\r\n    return (\r\n        <Dialog\r\n            open={props.open}\r\n            onClose={props.onClose}\r\n            aria-labelledby=\"form-dialog-title\"\r\n            fullWidth\r\n        >\r\n            <DialogTitle id=\"form-dialog-title\">\r\n                {t(\"download.selectDownloadingFile\")}\r\n            </DialogTitle>\r\n            <DialogContent dividers={\"paper\"} className={classes.content}>\r\n                <Virtuoso\r\n                    style={{ height: 54 * files.length }}\r\n                    className={classes.scroll}\r\n                    data={files}\r\n                    itemContent={(index, v) => (\r\n                        <MenuItem key={index}>\r\n                            <FormGroup row>\r\n                                <FormControlLabel\r\n                                    control={\r\n                                        <Checkbox\r\n                                            onChange={handleChange(v.index)}\r\n                                            checked={v.selected === \"true\"}\r\n                                            value=\"checkedA\"\r\n                                        />\r\n                                    }\r\n                                    label={v.path}\r\n                                />\r\n                            </FormGroup>\r\n                        </MenuItem>\r\n                    )}\r\n                />\r\n            </DialogContent>\r\n            <DialogActions>\r\n                <Button onClick={props.onClose}>\r\n                    {t(\"cancel\", { ns: \"common\" })}\r\n                </Button>\r\n                <div className={classes.wrapper}>\r\n                    <Button\r\n                        color=\"primary\"\r\n                        onClick={submit}\r\n                        disabled={props.modalsLoading}\r\n                    >\r\n                        {t(\"ok\", { ns: \"common\" })}\r\n                        {props.modalsLoading && (\r\n                            <CircularProgress\r\n                                size={24}\r\n                                className={classes.buttonProgress}\r\n                            />\r\n                        )}\r\n                    </Button>\r\n                </div>\r\n            </DialogActions>\r\n        </Dialog>\r\n    );\r\n}\r\n","import {\r\n    Card,\r\n    CardContent,\r\n    darken,\r\n    IconButton,\r\n    lighten,\r\n    LinearProgress,\r\n    makeStyles,\r\n    Typography,\r\n    useTheme,\r\n} from \"@material-ui/core\";\r\nimport Badge from \"@material-ui/core/Badge\";\r\nimport Button from \"@material-ui/core/Button\";\r\nimport Divider from \"@material-ui/core/Divider\";\r\nimport MuiExpansionPanel from \"@material-ui/core/ExpansionPanel\";\r\nimport MuiExpansionPanelDetails from \"@material-ui/core/ExpansionPanelDetails\";\r\nimport MuiExpansionPanelSummary from \"@material-ui/core/ExpansionPanelSummary\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport withStyles from \"@material-ui/core/styles/withStyles\";\r\nimport Table from \"@material-ui/core/Table\";\r\nimport TableBody from \"@material-ui/core/TableBody\";\r\nimport TableRow from \"@material-ui/core/TableRow\";\r\nimport TableCell from \"@material-ui/core/TableCell\";\r\nimport Tooltip from \"@material-ui/core/Tooltip\";\r\nimport { ExpandMore, HighlightOff } from \"@material-ui/icons\";\r\nimport PermMediaIcon from \"@material-ui/icons/PermMedia\";\r\nimport classNames from \"classnames\";\r\nimport React, { useCallback, useEffect, useMemo } from \"react\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport TimeAgo from \"timeago-react\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport API from \"../../middleware/Api\";\r\nimport { hex2bin, sizeToString } from \"../../utils\";\r\nimport TypeIcon from \"../FileManager/TypeIcon\";\r\nimport SelectFileDialog from \"../Modals/SelectFile\";\r\nimport { useHistory } from \"react-router\";\r\nimport { TableVirtuoso } from \"react-virtuoso\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst ExpansionPanel = withStyles({\r\n    root: {\r\n        maxWidth: \"100%\",\r\n        boxShadow: \"none\",\r\n        \"&:not(:last-child)\": {\r\n            borderBottom: 0,\r\n        },\r\n        \"&:before\": {\r\n            display: \"none\",\r\n        },\r\n        \"&$expanded\": {},\r\n    },\r\n    expanded: {},\r\n})(MuiExpansionPanel);\r\n\r\nconst ExpansionPanelSummary = withStyles({\r\n    root: {\r\n        minHeight: 0,\r\n        padding: 0,\r\n\r\n        \"&$expanded\": {\r\n            minHeight: 56,\r\n        },\r\n    },\r\n    content: {\r\n        maxWidth: \"100%\",\r\n        margin: 0,\r\n        display: \"flex\",\r\n        \"&$expanded\": {\r\n            margin: \"0\",\r\n        },\r\n    },\r\n    expanded: {},\r\n})(MuiExpansionPanelSummary);\r\n\r\nconst ExpansionPanelDetails = withStyles((theme) => ({\r\n    root: {\r\n        display: \"block\",\r\n        padding: theme.spacing(0),\r\n    },\r\n}))(MuiExpansionPanelDetails);\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    card: {\r\n        marginTop: \"20px\",\r\n        justifyContent: \"space-between\",\r\n    },\r\n    iconContainer: {\r\n        width: \"90px\",\r\n        height: \"96px\",\r\n        padding: \" 35px 29px 29px 29px\",\r\n        paddingLeft: \"35px\",\r\n        [theme.breakpoints.down(\"sm\")]: {\r\n            display: \"none\",\r\n        },\r\n    },\r\n    content: {\r\n        width: \"100%\",\r\n        minWidth: 0,\r\n        [theme.breakpoints.up(\"sm\")]: {\r\n            borderInlineStart: \"1px \" + theme.palette.divider + \" solid\",\r\n        },\r\n    },\r\n    contentSide: {\r\n        minWidth: 0,\r\n        paddingTop: \"24px\",\r\n        paddingRight: \"28px\",\r\n        [theme.breakpoints.down(\"sm\")]: {\r\n            display: \"none\",\r\n        },\r\n    },\r\n    iconBig: {\r\n        fontSize: \"30px\",\r\n    },\r\n    iconMultiple: {\r\n        fontSize: \"30px\",\r\n        color: \"#607D8B\",\r\n    },\r\n    progress: {\r\n        marginTop: 8,\r\n        marginBottom: 4,\r\n    },\r\n    expand: {\r\n        transition: \".15s transform ease-in-out\",\r\n    },\r\n    expanded: {\r\n        transform: \"rotate(180deg)\",\r\n    },\r\n    subFile: {\r\n        width: \"100%\",\r\n        minWidth: 300,\r\n        wordBreak: \"break-all\",\r\n    },\r\n    subFileName: {\r\n        display: \"flex\",\r\n    },\r\n    subFileIcon: {\r\n        marginRight: \"20px\",\r\n    },\r\n    subFileSize: {\r\n        minWidth: 120,\r\n    },\r\n    subFilePercent: {\r\n        minWidth: 105,\r\n    },\r\n    scroll: {\r\n        overflow: \"auto\",\r\n        maxHeight: \"300px\",\r\n    },\r\n    action: {\r\n        padding: theme.spacing(2),\r\n        textAlign: \"right\",\r\n    },\r\n    actionButton: {\r\n        marginLeft: theme.spacing(1),\r\n    },\r\n    info: {\r\n        padding: theme.spacing(2),\r\n    },\r\n    infoTitle: {\r\n        fontWeight: 700,\r\n    },\r\n    infoValue: {\r\n        color: theme.palette.text.secondary,\r\n    },\r\n    bitmap: {\r\n        width: \"100%\",\r\n        height: \"50px\",\r\n        backgroundColor: theme.palette.background.default,\r\n    },\r\n}));\r\n\r\nexport default function DownloadingCard(props) {\r\n    const { t } = useTranslation(\"application\", { keyPrefix: \"download\" });\r\n    const { t: tGlobal } = useTranslation();\r\n    const canvasRef = React.createRef();\r\n    const classes = useStyles();\r\n    const theme = useTheme();\r\n    const history = useHistory();\r\n\r\n    const [expanded, setExpanded] = React.useState(\"\");\r\n    const [task, setTask] = React.useState(props.task);\r\n    const [loading, setLoading] = React.useState(false);\r\n    const [selectDialogOpen, setSelectDialogOpen] = React.useState(false);\r\n    const [selectFileOption, setSelectFileOption] = React.useState([]);\r\n\r\n    const handleChange = (panel) => (event, newExpanded) => {\r\n        setExpanded(newExpanded ? panel : false);\r\n    };\r\n\r\n    const dispatch = useDispatch();\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n\r\n    useEffect(() => {\r\n        setTask(props.task);\r\n    }, [props.task]);\r\n\r\n    useEffect(() => {\r\n        if (task.info.bitfield === \"\") {\r\n            return;\r\n        }\r\n        let result = \"\";\r\n        task.info.bitfield.match(/.{1,2}/g).forEach((str) => {\r\n            result += hex2bin(str);\r\n        });\r\n        const canvas = canvasRef.current;\r\n        const context = canvas.getContext(\"2d\");\r\n        context.clearRect(0, 0, canvas.width, canvas.height);\r\n        context.strokeStyle = theme.palette.primary.main;\r\n        for (let i = 0; i < canvas.width; i++) {\r\n            let bit =\r\n                result[\r\n                    Math.round(((i + 1) / canvas.width) * task.info.numPieces)\r\n                ];\r\n            bit = bit ? bit : result.slice(-1);\r\n            if (bit === \"1\") {\r\n                context.beginPath();\r\n                context.moveTo(i, 0);\r\n                context.lineTo(i, canvas.height);\r\n                context.stroke();\r\n            }\r\n        }\r\n        // eslint-disable-next-line\r\n    }, [task.info.bitfield, task.info.numPieces, theme]);\r\n\r\n    const getPercent = (completed, total) => {\r\n        if (total === 0) {\r\n            return 0;\r\n        }\r\n        return (completed / total) * 100;\r\n    };\r\n\r\n    const activeFiles = useCallback(() => {\r\n        return task.info.files.filter((v) => v.selected === \"true\");\r\n    }, [task.info.files]);\r\n\r\n    const deleteFile = (index) => {\r\n        setLoading(true);\r\n        const current = activeFiles();\r\n        const newIndex = [];\r\n        const newFiles = [];\r\n        // eslint-disable-next-line\r\n        current.map((v) => {\r\n            if (v.index !== index && v.selected) {\r\n                newIndex.push(parseInt(v.index));\r\n                newFiles.push({\r\n                    ...v,\r\n                    selected: \"true\",\r\n                });\r\n            } else {\r\n                newFiles.push({\r\n                    ...v,\r\n                    selected: \"false\",\r\n                });\r\n            }\r\n        });\r\n        API.put(\"/aria2/select/\" + task.info.gid, {\r\n            indexes: newIndex,\r\n        })\r\n            .then(() => {\r\n                setTask({\r\n                    ...task,\r\n                    info: {\r\n                        ...task.info,\r\n                        files: newFiles,\r\n                    },\r\n                });\r\n                ToggleSnackbar(\"top\", \"right\", t(\"taskFileDeleted\"), \"success\");\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n            })\r\n            .then(() => {\r\n                setLoading(false);\r\n            });\r\n    };\r\n\r\n    const getDownloadName = useCallback(() => {\r\n        if (task.info.bittorrent.info.name !== \"\") {\r\n            return task.info.bittorrent.info.name;\r\n        }\r\n        return task.name === \".\" ? t(\"unknownTaskName\") : task.name;\r\n    }, [task]);\r\n\r\n    const getIcon = useCallback(() => {\r\n        if (task.info.bittorrent.mode === \"multi\") {\r\n            return (\r\n                <Badge badgeContent={activeFiles().length} color=\"secondary\">\r\n                    <PermMediaIcon className={classes.iconMultiple} />\r\n                </Badge>\r\n            );\r\n        } else {\r\n            return (\r\n                <TypeIcon\r\n                    className={classes.iconBig}\r\n                    fileName={getDownloadName(task)}\r\n                />\r\n            );\r\n        }\r\n        // eslint-disable-next-line\r\n    }, [task, classes]);\r\n\r\n    const cancel = () => {\r\n        setLoading(true);\r\n        API.delete(\"/aria2/task/\" + task.info.gid)\r\n            .then(() => {\r\n                ToggleSnackbar(\"top\", \"right\", t(\"taskCanceled\"), \"success\");\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n            })\r\n            .then(() => {\r\n                setLoading(false);\r\n            });\r\n    };\r\n\r\n    const changeSelectedFile = (fileIndex) => {\r\n        setLoading(true);\r\n        API.put(\"/aria2/select/\" + task.info.gid, {\r\n            indexes: fileIndex,\r\n        })\r\n            .then(() => {\r\n                ToggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    t(\"operationSubmitted\"),\r\n                    \"success\"\r\n                );\r\n                setSelectDialogOpen(false);\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n            })\r\n            .then(() => {\r\n                setLoading(false);\r\n            });\r\n    };\r\n\r\n    const subFileList = useMemo(() => {\r\n        const processStyle = (value) => ({\r\n            background:\r\n                \"linear-gradient(to right, \" +\r\n                (theme.palette.type ===\r\n                    \"dark\"\r\n                    ? darken(\r\n                        theme.palette\r\n                            .primary\r\n                            .main,\r\n                        0.4\r\n                    )\r\n                    : lighten(\r\n                        theme.palette\r\n                            .primary\r\n                            .main,\r\n                        0.85\r\n                    )) +\r\n                \" 0%,\" +\r\n                (theme.palette.type ===\r\n                    \"dark\"\r\n                    ? darken(\r\n                        theme.palette\r\n                            .primary\r\n                            .main,\r\n                        0.4\r\n                    )\r\n                    : lighten(\r\n                        theme.palette\r\n                            .primary\r\n                            .main,\r\n                        0.85\r\n                    )) +\r\n                \" \" +\r\n                getPercent(\r\n                    value.completedLength,\r\n                    value.length\r\n                ).toFixed(0) +\r\n                \"%,\" +\r\n                theme.palette.background\r\n                    .paper +\r\n                \" \" +\r\n                getPercent(\r\n                    value.completedLength,\r\n                    value.length\r\n                ).toFixed(0) +\r\n                \"%,\" +\r\n                theme.palette.background\r\n                    .paper +\r\n                \" 100%)\",\r\n        });\r\n\r\n        const subFileCell = (value) => (\r\n            <>\r\n                <TableCell\r\n                    component=\"th\"\r\n                    scope=\"row\"\r\n                    className={classes.subFile}\r\n                >\r\n                    <Typography\r\n                        className={\r\n                            classes.subFileName\r\n                        }\r\n                    >\r\n                        <TypeIcon\r\n                            className={\r\n                                classes.subFileIcon\r\n                            }\r\n                            fileName={\r\n                                value.path\r\n                            }\r\n                        />\r\n                        {value.path}\r\n                    </Typography>\r\n                </TableCell>\r\n                <TableCell\r\n                    component=\"th\"\r\n                    scope=\"row\"\r\n                    className={classes.subFileSize}\r\n                >\r\n                    <Typography noWrap>\r\n                        {\" \"}\r\n                        {sizeToString(\r\n                            value.length\r\n                        )}\r\n                    </Typography>\r\n                </TableCell>\r\n                <TableCell\r\n                    component=\"th\"\r\n                    scope=\"row\"\r\n                    className={classes.subFilePercent}\r\n                >\r\n                    <Typography noWrap>\r\n                        {getPercent(\r\n                            value.completedLength,\r\n                            value.length\r\n                        ).toFixed(2)}\r\n                        %\r\n                    </Typography>\r\n                </TableCell>\r\n                <TableCell>\r\n                    <Tooltip\r\n                        title={t(\r\n                            \"deleteThisFile\"\r\n                        )}\r\n                    >\r\n                        <IconButton\r\n                            onClick={() =>\r\n                                deleteFile(\r\n                                    value.index\r\n                                )\r\n                            }\r\n                            disabled={loading}\r\n                            size={\"small\"}\r\n                        >\r\n                            <HighlightOff />\r\n                        </IconButton>\r\n                    </Tooltip>\r\n                </TableCell>\r\n            </>\r\n        );\r\n\r\n        return activeFiles().length > 5 ? (\r\n            <TableVirtuoso\r\n                style={{ height: 43 * activeFiles().length }}\r\n                className={classes.scroll}\r\n                components={{\r\n                    // eslint-disable-next-line react/display-name\r\n                    Table: (props) => <Table {...props} size={\"small\"} />,\r\n                    // eslint-disable-next-line react/display-name\r\n                    TableRow: (props) => {\r\n                        const index = props[\"data-index\"];\r\n                        const value = activeFiles()[index];\r\n                        return (\r\n                            <TableRow\r\n                                {...props}\r\n                                key={index}\r\n                                style={processStyle(value)}\r\n                            />\r\n                        );\r\n                    },\r\n                }}\r\n                data={activeFiles()}\r\n                itemContent={(index, value) => (\r\n                    subFileCell(value)\r\n                )}\r\n            />\r\n        ) : (\r\n            <div className={classes.scroll}>\r\n                <Table size=\"small\">\r\n                    <TableBody>\r\n                        {activeFiles().map((value) => {\r\n                            return (\r\n                                <TableRow\r\n                                    key={value.index}\r\n                                    style={processStyle(value)}\r\n                                >\r\n                                    {subFileCell(value)}\r\n                                </TableRow>\r\n                            );\r\n                        })}\r\n                    </TableBody>\r\n                </Table>\r\n            </div>\r\n        );\r\n    }, [\r\n        classes,\r\n        theme,\r\n        activeFiles,\r\n    ]);\r\n\r\n    return (\r\n        <Card className={classes.card}>\r\n            <SelectFileDialog\r\n                open={selectDialogOpen}\r\n                onClose={() => setSelectDialogOpen(false)}\r\n                modalsLoading={loading}\r\n                files={selectFileOption}\r\n                onSubmit={changeSelectedFile}\r\n            />\r\n            <ExpansionPanel\r\n                square\r\n                expanded={expanded === task.info.gid}\r\n                onChange={handleChange(task.info.gid)}\r\n            >\r\n                <ExpansionPanelSummary\r\n                    aria-controls=\"panel1d-content\"\r\n                    id=\"panel1d-header\"\r\n                >\r\n                    <div className={classes.iconContainer}>{getIcon()}</div>\r\n                    <CardContent className={classes.content}>\r\n                        <Typography color=\"primary\" noWrap>\r\n                            <Tooltip title={getDownloadName()}>\r\n                                <span>{getDownloadName()}</span>\r\n                            </Tooltip>\r\n                        </Typography>\r\n                        <LinearProgress\r\n                            color=\"secondary\"\r\n                            variant=\"determinate\"\r\n                            className={classes.progress}\r\n                            value={getPercent(task.downloaded, task.total)}\r\n                        />\r\n                        <Typography\r\n                            variant=\"body2\"\r\n                            color=\"textSecondary\"\r\n                            noWrap\r\n                        >\r\n                            {task.total > 0 && (\r\n                                <span>\r\n                                    {getPercent(\r\n                                        task.downloaded,\r\n                                        task.total\r\n                                    ).toFixed(2)}\r\n                                    % -{\" \"}\r\n                                    {task.downloaded === 0\r\n                                        ? \"0Bytes\"\r\n                                        : sizeToString(task.downloaded)}\r\n                                    /\r\n                                    {task.total === 0\r\n                                        ? \"0Bytes\"\r\n                                        : sizeToString(task.total)}{\" \"}\r\n                                    -{\" \"}\r\n                                    {task.speed === \"0\"\r\n                                        ? \"0B/s\"\r\n                                        : sizeToString(task.speed) + \"/s\"}\r\n                                </span>\r\n                            )}\r\n                            {task.total === 0 && <span> - </span>}\r\n                        </Typography>\r\n                    </CardContent>\r\n                    <CardContent className={classes.contentSide}>\r\n                        <IconButton>\r\n                            <ExpandMore\r\n                                className={classNames(\r\n                                    {\r\n                                        [classes.expanded]:\r\n                                            expanded === task.info.gid,\r\n                                    },\r\n                                    classes.expand\r\n                                )}\r\n                            />\r\n                        </IconButton>\r\n                    </CardContent>\r\n                </ExpansionPanelSummary>\r\n                <ExpansionPanelDetails>\r\n                    <Divider />\r\n                    {task.info.bittorrent.mode === \"multi\" && subFileList}\r\n                    <div className={classes.action}>\r\n                        <Button\r\n                            className={classes.actionButton}\r\n                            variant=\"outlined\"\r\n                            color=\"secondary\"\r\n                            onClick={() =>\r\n                                history.push(\r\n                                    \"/home?path=\" + encodeURIComponent(task.dst)\r\n                                )\r\n                            }\r\n                        >\r\n                            {t(\"openDstFolder\")}\r\n                        </Button>\r\n                        {task.info.bittorrent.mode === \"multi\" && (\r\n                            <Button\r\n                                className={classes.actionButton}\r\n                                variant=\"outlined\"\r\n                                color=\"secondary\"\r\n                                disabled={loading}\r\n                                onClick={() => {\r\n                                    setSelectDialogOpen(true);\r\n                                    setSelectFileOption([\r\n                                        ...props.task.info.files,\r\n                                    ]);\r\n                                }}\r\n                            >\r\n                                {t(\"selectDownloadingFile\")}\r\n                            </Button>\r\n                        )}\r\n                        <Button\r\n                            className={classes.actionButton}\r\n                            onClick={cancel}\r\n                            variant=\"contained\"\r\n                            color=\"secondary\"\r\n                            disabled={loading}\r\n                        >\r\n                            {t(\"cancelTask\")}\r\n                        </Button>\r\n                    </div>\r\n                    <Divider />\r\n                    <div className={classes.info}>\r\n                        {task.info.bitfield !== \"\" && (\r\n                            <canvas\r\n                                width={\"700\"}\r\n                                height={\"100\"}\r\n                                ref={canvasRef}\r\n                                className={classes.bitmap}\r\n                            />\r\n                        )}\r\n\r\n                        <Grid container>\r\n                            <Grid container xs={12} sm={4}>\r\n                                <Grid item xs={5} className={classes.infoTitle}>\r\n                                    {t(\"updatedAt\")}\r\n                                </Grid>\r\n                                <Grid item xs={7} className={classes.infoValue}>\r\n                                    <TimeAgo\r\n                                        datetime={task.update}\r\n                                        locale={tGlobal(\"timeAgoLocaleCode\", {\r\n                                            ns: \"common\",\r\n                                        })}\r\n                                    />\r\n                                </Grid>\r\n                            </Grid>\r\n                            <Grid container xs={12} sm={4}>\r\n                                <Grid item xs={5} className={classes.infoTitle}>\r\n                                    {t(\"uploaded\")}\r\n                                </Grid>\r\n                                <Grid item xs={7} className={classes.infoValue}>\r\n                                    {sizeToString(task.info.uploadLength)}\r\n                                </Grid>\r\n                            </Grid>\r\n                            <Grid container xs={12} sm={4}>\r\n                                <Grid item xs={5} className={classes.infoTitle}>\r\n                                    {t(\"uploadSpeed\")}\r\n                                </Grid>\r\n                                <Grid item xs={7} className={classes.infoValue}>\r\n                                    {sizeToString(task.info.uploadSpeed)} / s\r\n                                </Grid>\r\n                            </Grid>\r\n                            {task.info.bittorrent.mode !== \"\" && (\r\n                                <>\r\n                                    <Grid container xs={12} sm={8}>\r\n                                        <Grid\r\n                                            item\r\n                                            sm={2}\r\n                                            xs={4}\r\n                                            className={classes.infoTitle}\r\n                                        >\r\n                                            {t(\"InfoHash\")}\r\n                                        </Grid>\r\n                                        <Grid\r\n                                            item\r\n                                            sm={10}\r\n                                            xs={8}\r\n                                            style={{\r\n                                                wordBreak: \"break-all\",\r\n                                            }}\r\n                                            className={classes.infoValue}\r\n                                        >\r\n                                            {task.info.infoHash}\r\n                                        </Grid>\r\n                                    </Grid>\r\n                                    <Grid container xs={12} sm={4}>\r\n                                        <Grid\r\n                                            item\r\n                                            xs={5}\r\n                                            className={classes.infoTitle}\r\n                                        >\r\n                                            {t(\"seederCount\")}\r\n                                        </Grid>\r\n                                        <Grid\r\n                                            item\r\n                                            xs={7}\r\n                                            className={classes.infoValue}\r\n                                        >\r\n                                            {task.info.numSeeders}\r\n                                        </Grid>\r\n                                    </Grid>\r\n                                    <Grid container xs={12} sm={4}>\r\n                                        <Grid\r\n                                            item\r\n                                            xs={5}\r\n                                            className={classes.infoTitle}\r\n                                        >\r\n                                            {t(\"seeding\")}\r\n                                        </Grid>\r\n                                        <Grid\r\n                                            item\r\n                                            xs={7}\r\n                                            className={classes.infoValue}\r\n                                        >\r\n                                            {task.info.seeder === \"true\"\r\n                                                ? t(\"isSeeding\")\r\n                                                : t(\"notSeeding\")}\r\n                                        </Grid>\r\n                                    </Grid>\r\n                                </>\r\n                            )}\r\n                            <Grid container xs={12} sm={4}>\r\n                                <Grid item xs={5} className={classes.infoTitle}>\r\n                                    {t(\"chunkSize\")}\r\n                                </Grid>\r\n                                <Grid item xs={7} className={classes.infoValue}>\r\n                                    {sizeToString(task.info.pieceLength)}\r\n                                </Grid>\r\n                            </Grid>\r\n                            <Grid container xs={12} sm={4}>\r\n                                <Grid item xs={5} className={classes.infoTitle}>\r\n                                    {t(\"chunkNumbers\")}\r\n                                </Grid>\r\n                                <Grid item xs={7} className={classes.infoValue}>\r\n                                    {task.info.numPieces}\r\n                                </Grid>\r\n                            </Grid>\r\n                        </Grid>\r\n                    </div>\r\n                </ExpansionPanelDetails>\r\n            </ExpansionPanel>\r\n        </Card>\r\n    );\r\n}\r\n","import React, { useCallback, useMemo } from \"react\";\r\nimport {\r\n    Card,\r\n    CardContent,\r\n    IconButton,\r\n    makeStyles,\r\n    Typography,\r\n    useTheme,\r\n} from \"@material-ui/core\";\r\nimport { sizeToString } from \"../../utils\";\r\nimport PermMediaIcon from \"@material-ui/icons/PermMedia\";\r\nimport TypeIcon from \"../FileManager/TypeIcon\";\r\nimport MuiExpansionPanel from \"@material-ui/core/ExpansionPanel\";\r\nimport MuiExpansionPanelSummary from \"@material-ui/core/ExpansionPanelSummary\";\r\nimport MuiExpansionPanelDetails from \"@material-ui/core/ExpansionPanelDetails\";\r\nimport withStyles from \"@material-ui/core/styles/withStyles\";\r\nimport Divider from \"@material-ui/core/Divider\";\r\nimport { ExpandMore } from \"@material-ui/icons\";\r\nimport classNames from \"classnames\";\r\nimport Table from \"@material-ui/core/Table\";\r\nimport TableBody from \"@material-ui/core/TableBody\";\r\nimport TableRow from \"@material-ui/core/TableRow\";\r\nimport TableCell from \"@material-ui/core/TableCell\";\r\nimport Badge from \"@material-ui/core/Badge\";\r\nimport Tooltip from \"@material-ui/core/Tooltip\";\r\nimport Button from \"@material-ui/core/Button\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport API from \"../../middleware/Api\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport { useHistory } from \"react-router\";\r\nimport { formatLocalTime } from \"../../utils/datetime\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport { TableVirtuoso } from \"react-virtuoso\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst ExpansionPanel = withStyles({\r\n    root: {\r\n        maxWidth: \"100%\",\r\n        boxShadow: \"none\",\r\n        \"&:not(:last-child)\": {\r\n            borderBottom: 0,\r\n        },\r\n        \"&:before\": {\r\n            display: \"none\",\r\n        },\r\n        \"&$expanded\": {},\r\n    },\r\n    expanded: {},\r\n})(MuiExpansionPanel);\r\n\r\nconst ExpansionPanelSummary = withStyles({\r\n    root: {\r\n        minHeight: 0,\r\n        padding: 0,\r\n\r\n        \"&$expanded\": {\r\n            minHeight: 56,\r\n        },\r\n    },\r\n    content: {\r\n        maxWidth: \"100%\",\r\n        margin: 0,\r\n        display: \"flex\",\r\n        \"&$expanded\": {\r\n            margin: \"0\",\r\n        },\r\n    },\r\n    expanded: {},\r\n})(MuiExpansionPanelSummary);\r\n\r\nconst ExpansionPanelDetails = withStyles((theme) => ({\r\n    root: {\r\n        display: \"block\",\r\n        padding: theme.spacing(0),\r\n    },\r\n}))(MuiExpansionPanelDetails);\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    card: {\r\n        marginTop: \"20px\",\r\n        justifyContent: \"space-between\",\r\n    },\r\n    iconContainer: {\r\n        width: \"90px\",\r\n        height: \"96px\",\r\n        padding: \" 35px 29px 29px 29px\",\r\n        paddingLeft: \"35px\",\r\n        [theme.breakpoints.down(\"sm\")]: {\r\n            display: \"none\",\r\n        },\r\n    },\r\n    content: {\r\n        width: \"100%\",\r\n        minWidth: 0,\r\n        [theme.breakpoints.up(\"sm\")]: {\r\n            borderInlineStart: \"1px \" + theme.palette.divider + \" solid\",\r\n        },\r\n        textAlign: \"left\",\r\n    },\r\n    contentSide: {\r\n        minWidth: 0,\r\n        paddingTop: \"24px\",\r\n        paddingRight: \"28px\",\r\n        [theme.breakpoints.down(\"sm\")]: {\r\n            display: \"none\",\r\n        },\r\n    },\r\n    iconBig: {\r\n        fontSize: \"30px\",\r\n    },\r\n    iconMultiple: {\r\n        fontSize: \"30px\",\r\n        color: \"#607D8B\",\r\n    },\r\n    progress: {\r\n        marginTop: 8,\r\n        marginBottom: 4,\r\n    },\r\n    expand: {\r\n        transition: \".15s transform ease-in-out\",\r\n    },\r\n    expanded: {\r\n        transform: \"rotate(180deg)\",\r\n    },\r\n    subFile: {\r\n        width: \"100%\",\r\n        minWidth: 300,\r\n        wordBreak: \"break-all\",\r\n    },\r\n    subFileName: {\r\n        display: \"flex\",\r\n    },\r\n    subFileIcon: {\r\n        marginRight: \"20px\",\r\n    },\r\n    subFileSize: {\r\n        minWidth: 115,\r\n    },\r\n    subFilePercent: {\r\n        minWidth: 100,\r\n    },\r\n    scroll: {\r\n        overflow: \"auto\",\r\n        maxHeight: \"300px\",\r\n    },\r\n    action: {\r\n        padding: theme.spacing(2),\r\n        textAlign: \"right\",\r\n    },\r\n    actionButton: {\r\n        marginLeft: theme.spacing(1),\r\n    },\r\n    info: {\r\n        padding: theme.spacing(2),\r\n    },\r\n    infoTitle: {\r\n        fontWeight: 700,\r\n    },\r\n    infoValue: {\r\n        color: theme.palette.text.secondary,\r\n    },\r\n}));\r\n\r\nexport default function FinishedCard(props) {\r\n    const { t } = useTranslation(\"application\", { keyPrefix: \"download\" });\r\n    const classes = useStyles();\r\n    const theme = useTheme();\r\n    const history = useHistory();\r\n\r\n    const [expanded, setExpanded] = React.useState(false);\r\n    const [loading, setLoading] = React.useState(false);\r\n\r\n    const dispatch = useDispatch();\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n\r\n    const handleChange = () => (event, newExpanded) => {\r\n        setExpanded(!!newExpanded);\r\n    };\r\n\r\n    const getPercent = (completed, total) => {\r\n        if (total === 0) {\r\n            return 0;\r\n        }\r\n        return (completed / total) * 100;\r\n    };\r\n\r\n    const cancel = () => {\r\n        setLoading(true);\r\n        API.delete(\"/aria2/task/\" + props.task.gid)\r\n            .then(() => {\r\n                ToggleSnackbar(\"top\", \"right\", t(\"taskDeleted\"), \"success\");\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n            })\r\n            .then(() => {\r\n                window.location.reload();\r\n            });\r\n    };\r\n\r\n    const getDownloadName = useCallback(() => {\r\n        return props.task.name === \".\" ? t(\"unknownTaskName\") : props.task.name;\r\n    }, [props.task.name]);\r\n\r\n    const activeFiles = useCallback(() => {\r\n        return props.task.files.filter((v) => v.selected === \"true\");\r\n    }, [props.task.files]);\r\n\r\n    const getIcon = useCallback(() => {\r\n        if (props.task.files.length > 1) {\r\n            return (\r\n                <Badge badgeContent={activeFiles().length} color=\"secondary\">\r\n                    <PermMediaIcon className={classes.iconMultiple} />\r\n                </Badge>\r\n            );\r\n        } else {\r\n            return (\r\n                <TypeIcon\r\n                    className={classes.iconBig}\r\n                    fileName={getDownloadName(props.task)}\r\n                />\r\n            );\r\n        }\r\n    }, [props.task, classes]);\r\n\r\n    const getTaskError = (error) => {\r\n        try {\r\n            const res = JSON.parse(error);\r\n            return res.msg + \":\" + res.error;\r\n        } catch (e) {\r\n            return t(\"transferFailed\");\r\n        }\r\n    };\r\n\r\n    const subFileList = useMemo(() => {\r\n        const subFileCell = (value) => (\r\n            <>\r\n                <TableCell\r\n                    component=\"th\"\r\n                    scope=\"row\"\r\n                    className={classes.subFile}\r\n                >\r\n                    <Typography\r\n                        className={\r\n                            classes.subFileName\r\n                        }\r\n                    >\r\n                        <TypeIcon\r\n                            className={\r\n                                classes.subFileIcon\r\n                            }\r\n                            fileName={\r\n                                value.path\r\n                            }\r\n                        />\r\n                        {value.path}\r\n                    </Typography>\r\n                </TableCell>\r\n                <TableCell\r\n                    component=\"th\"\r\n                    scope=\"row\"\r\n                    className={classes.subFileSize}\r\n                >\r\n                    <Typography noWrap>\r\n                        {\" \"}\r\n                        {sizeToString(\r\n                            value.length\r\n                        )}\r\n                    </Typography>\r\n                </TableCell>\r\n                <TableCell\r\n                    component=\"th\"\r\n                    scope=\"row\"\r\n                    className={classes.subFilePercent}\r\n                >\r\n                    <Typography noWrap>\r\n                        {getPercent(\r\n                            value.completedLength,\r\n                            value.length\r\n                        ).toFixed(2)}\r\n                        %\r\n                    </Typography>\r\n                </TableCell>\r\n            </>\r\n        );\r\n\r\n        return activeFiles().length > 5 ? (\r\n            <TableVirtuoso\r\n                style={{ height: 57 * activeFiles().length }}\r\n                className={classes.scroll}\r\n                components={{\r\n                    // eslint-disable-next-line react/display-name\r\n                    Table: (props) => <Table {...props} />,\r\n                }}\r\n                data={activeFiles()}\r\n                itemContent={(index, value) => (\r\n                    subFileCell(value)\r\n                )}\r\n            />\r\n        ) : (\r\n            <div className={classes.scroll}>\r\n                <Table>\r\n                    <TableBody>\r\n                        {activeFiles().map((value) => {\r\n                            return (\r\n                                <TableRow key={value.index}>\r\n                                    {subFileCell(value)}\r\n                                </TableRow>\r\n                            );\r\n                        })}\r\n                    </TableBody>\r\n                </Table>\r\n            </div>\r\n        );\r\n    }, [\r\n        classes,\r\n        activeFiles,\r\n    ]);\r\n\r\n    return (\r\n        <Card className={classes.card}>\r\n            <ExpansionPanel\r\n                square\r\n                expanded={expanded}\r\n                onChange={handleChange(\"\")}\r\n            >\r\n                <ExpansionPanelSummary\r\n                    aria-controls=\"panel1d-content\"\r\n                    id=\"panel1d-header\"\r\n                >\r\n                    <div className={classes.iconContainer}>{getIcon()}</div>\r\n                    <CardContent className={classes.content}>\r\n                        <Typography color=\"primary\" noWrap>\r\n                            <Tooltip title={getDownloadName()}>\r\n                                <span>{getDownloadName()}</span>\r\n                            </Tooltip>\r\n                        </Typography>\r\n                        {props.task.status === 3 && (\r\n                            <Tooltip title={props.task.error}>\r\n                                <Typography\r\n                                    variant=\"body2\"\r\n                                    color=\"error\"\r\n                                    noWrap\r\n                                >\r\n                                    {t(\"downloadFailed\", {\r\n                                        msg: props.task.error,\r\n                                    })}\r\n                                </Typography>\r\n                            </Tooltip>\r\n                        )}\r\n                        {props.task.status === 5 && (\r\n                            <Typography\r\n                                variant=\"body2\"\r\n                                color=\"textSecondary\"\r\n                                noWrap\r\n                            >\r\n                                {t(\"canceledStatus\")}\r\n                                {props.task.error !== \"\" && (\r\n                                    <span>({props.task.error})</span>\r\n                                )}\r\n                            </Typography>\r\n                        )}\r\n                        {props.task.status === 4 &&\r\n                            props.task.task_status === 4 && (\r\n                                <Typography\r\n                                    variant=\"body2\"\r\n                                    style={{\r\n                                        color: theme.palette.success.main,\r\n                                    }}\r\n                                    noWrap\r\n                                >\r\n                                    {t(\"finishedStatus\")}\r\n                                </Typography>\r\n                            )}\r\n                        {props.task.status === 4 &&\r\n                            props.task.task_status === 0 && (\r\n                                <Typography\r\n                                    variant=\"body2\"\r\n                                    style={{\r\n                                        color: theme.palette.success.light,\r\n                                    }}\r\n                                    noWrap\r\n                                >\r\n                                    {t(\"transferring\")}\r\n                                </Typography>\r\n                            )}\r\n                        {props.task.status === 4 &&\r\n                            props.task.task_status === 1 && (\r\n                                <Typography\r\n                                    variant=\"body2\"\r\n                                    style={{\r\n                                        color: theme.palette.success.light,\r\n                                    }}\r\n                                    noWrap\r\n                                >\r\n                                    {t(\"transferring\")}\r\n                                </Typography>\r\n                            )}\r\n                        {props.task.status === 4 &&\r\n                            props.task.task_status === 2 && (\r\n                                <Typography\r\n                                    variant=\"body2\"\r\n                                    color={\"error\"}\r\n                                    noWrap\r\n                                >\r\n                                    {getTaskError(props.task.task_error)}\r\n                                </Typography>\r\n                            )}\r\n                    </CardContent>\r\n                    <CardContent className={classes.contentSide}>\r\n                        <IconButton>\r\n                            <ExpandMore\r\n                                className={classNames(\r\n                                    {\r\n                                        [classes.expanded]: expanded,\r\n                                    },\r\n                                    classes.expand\r\n                                )}\r\n                            />\r\n                        </IconButton>\r\n                    </CardContent>\r\n                </ExpansionPanelSummary>\r\n                <ExpansionPanelDetails>\r\n                    <Divider />\r\n                    {props.task.files.length > 1 && subFileList}\r\n                    <div className={classes.action}>\r\n                        <Button\r\n                            className={classes.actionButton}\r\n                            variant=\"outlined\"\r\n                            color=\"secondary\"\r\n                            onClick={() =>\r\n                                history.push(\r\n                                    \"/home?path=\" +\r\n                                        encodeURIComponent(props.task.dst)\r\n                                )\r\n                            }\r\n                        >\r\n                            {t(\"openDstFolder\")}\r\n                        </Button>\r\n                        <Button\r\n                            className={classes.actionButton}\r\n                            onClick={cancel}\r\n                            variant=\"contained\"\r\n                            color=\"secondary\"\r\n                            disabled={loading}\r\n                        >\r\n                            {t(\"deleteRecord\")}\r\n                        </Button>\r\n                    </div>\r\n                    <Divider />\r\n                    <div className={classes.info}>\r\n                        <Grid container>\r\n                            <Grid container xs={12} sm={6}>\r\n                                <Grid item xs={5} className={classes.infoTitle}>\r\n                                    {t(\"createdAt\")}\r\n                                </Grid>\r\n                                <Grid item xs={7} className={classes.infoValue}>\r\n                                    {formatLocalTime(props.task.create)}\r\n                                </Grid>\r\n                            </Grid>\r\n                            <Grid container xs={12} sm={6}>\r\n                                <Grid item xs={5} className={classes.infoTitle}>\r\n                                    {t(\"updatedAt\")}\r\n                                </Grid>\r\n                                <Grid item xs={7} className={classes.infoValue}>\r\n                                    {formatLocalTime(props.task.update)}\r\n                                </Grid>\r\n                            </Grid>\r\n                        </Grid>\r\n                    </div>\r\n                </ExpansionPanelDetails>\r\n            </ExpansionPanel>\r\n        </Card>\r\n    );\r\n}\r\n","import React, { useCallback } from \"react\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport AutoHidden from \"./AutoHidden\";\r\nimport { makeStyles } from \"@material-ui/core\";\r\nimport Fab from \"@material-ui/core/Fab\";\r\nimport { Add } from \"@material-ui/icons\";\r\nimport Modals from \"../FileManager/Modals\";\r\nimport { openRemoteDownloadDialog } from \"../../redux/explorer\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n    fab: {\r\n        margin: 0,\r\n        top: \"auto\",\r\n        right: 20,\r\n        bottom: 20,\r\n        left: \"auto\",\r\n        zIndex: 5,\r\n        position: \"fixed\",\r\n    },\r\n}));\r\n\r\nexport default function RemoteDownloadButton() {\r\n    const classes = useStyles();\r\n    const dispatch = useDispatch();\r\n\r\n    const OpenRemoteDownloadDialog = useCallback(\r\n        () => dispatch(openRemoteDownloadDialog()),\r\n        [dispatch]\r\n    );\r\n\r\n    return (\r\n        <>\r\n            <Modals />\r\n            <AutoHidden enable>\r\n                <Fab\r\n                    className={classes.fab}\r\n                    color=\"secondary\"\r\n                    onClick={() => OpenRemoteDownloadDialog()}\r\n                >\r\n                    <Add />\r\n                </Fab>\r\n            </AutoHidden>\r\n        </>\r\n    );\r\n}\r\n","import { Button, IconButton, Typography, withStyles } from \"@material-ui/core\";\r\nimport RefreshIcon from \"@material-ui/icons/Refresh\";\r\nimport React, { Component } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport API from \"../../middleware/Api\";\r\nimport DownloadingCard from \"./DownloadingCard\";\r\nimport FinishedCard from \"./FinishedCard\";\r\nimport RemoteDownloadButton from \"../Dial/Aria2\";\r\nimport Auth from \"../../middleware/Auth\";\r\nimport Nothing from \"../Placeholder/Nothing\";\r\nimport { withTranslation } from \"react-i18next\";\r\n\r\nconst styles = (theme) => ({\r\n    actions: {\r\n        display: \"flex\",\r\n    },\r\n    title: {\r\n        marginTop: \"20px\",\r\n    },\r\n    layout: {\r\n        width: \"auto\",\r\n        marginTop: \"30px\",\r\n        marginLeft: theme.spacing(3),\r\n        marginRight: theme.spacing(3),\r\n        [theme.breakpoints.up(1100 + theme.spacing(3) * 2)]: {\r\n            width: 700,\r\n            marginLeft: \"auto\",\r\n            marginRight: \"auto\",\r\n        },\r\n    },\r\n    shareTitle: {\r\n        maxWidth: \"200px\",\r\n    },\r\n    avatarFile: {\r\n        backgroundColor: theme.palette.primary.light,\r\n    },\r\n    avatarFolder: {\r\n        backgroundColor: theme.palette.secondary.light,\r\n    },\r\n    gird: {\r\n        marginTop: \"30px\",\r\n    },\r\n    hide: {\r\n        display: \"none\",\r\n    },\r\n    loadingAnimation: {\r\n        borderRadius: \"6px 6px 0 0\",\r\n    },\r\n    shareFix: {\r\n        marginLeft: \"20px\",\r\n    },\r\n    loadMore: {\r\n        textAlign: \"center\",\r\n        marginTop: \"20px\",\r\n        marginBottom: \"20px\",\r\n    },\r\n    margin: {\r\n        marginTop: theme.spacing(2),\r\n    },\r\n});\r\nconst mapStateToProps = () => {\r\n    return {};\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n    return {\r\n        toggleSnackbar: (vertical, horizontal, msg, color) => {\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color));\r\n        },\r\n    };\r\n};\r\n\r\nclass DownloadComponent extends Component {\r\n    page = 0;\r\n    interval = 0;\r\n    previousDownloading = -1;\r\n\r\n    state = {\r\n        downloading: [],\r\n        loading: false,\r\n        finishedList: [],\r\n        continue: true,\r\n    };\r\n\r\n    componentDidMount = () => {\r\n        this.loadDownloading();\r\n    };\r\n\r\n    componentWillUnmount() {\r\n        clearTimeout(this.interval);\r\n    }\r\n\r\n    loadDownloading = () => {\r\n        this.setState({\r\n            loading: true,\r\n        });\r\n        API.get(\"/aria2/downloading\")\r\n            .then((response) => {\r\n                this.setState({\r\n                    downloading: response.data,\r\n                    loading: false,\r\n                });\r\n                // 设定自动更新\r\n                clearTimeout(this.interval);\r\n                if (response.data.length > 0) {\r\n                    this.interval = setTimeout(\r\n                        this.loadDownloading,\r\n                        1000 *\r\n                            response.data.reduce(function (prev, current) {\r\n                                return prev.interval < current.interval\r\n                                    ? prev\r\n                                    : current;\r\n                            }).interval\r\n                    );\r\n                }\r\n\r\n                // 下载中条目变更时刷新已完成列表\r\n                if (response.data.length !== this.previousDownloading) {\r\n                    this.page = 0;\r\n                    this.setState({\r\n                        finishedList: [],\r\n                        continue: true,\r\n                    });\r\n                    this.loadMore();\r\n                }\r\n                this.previousDownloading = response.data.length;\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n            });\r\n    };\r\n\r\n    loadMore = () => {\r\n        this.setState({\r\n            loading: true,\r\n        });\r\n        API.get(\"/aria2/finished?page=\" + ++this.page)\r\n            .then((response) => {\r\n                this.setState({\r\n                    finishedList: [\r\n                        ...this.state.finishedList,\r\n                        ...response.data,\r\n                    ],\r\n                    loading: false,\r\n                    continue: response.data.length >= 10,\r\n                });\r\n            })\r\n            .catch(() => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    this.props.t(\"download.failedToLoad\"),\r\n                    \"error\"\r\n                );\r\n                this.setState({\r\n                    loading: false,\r\n                });\r\n            });\r\n    };\r\n\r\n    render() {\r\n        const { classes, t } = this.props;\r\n        const user = Auth.GetUser();\r\n\r\n        return (\r\n            <div className={classes.layout}>\r\n                {user.group.allowRemoteDownload && <RemoteDownloadButton />}\r\n                <Typography\r\n                    color=\"textSecondary\"\r\n                    variant=\"h4\"\r\n                    className={classes.title}\r\n                >\r\n                    {t(\"download.active\")}\r\n                    <IconButton\r\n                        disabled={this.state.loading}\r\n                        onClick={this.loadDownloading}\r\n                    >\r\n                        <RefreshIcon />\r\n                    </IconButton>\r\n                </Typography>\r\n                {this.state.downloading.length === 0 && (\r\n                    <Nothing primary={t(\"download.activeEmpty\")} />\r\n                )}\r\n                {this.state.downloading.map((value, k) => (\r\n                    <DownloadingCard key={k} task={value} />\r\n                ))}\r\n                <Typography\r\n                    color=\"textSecondary\"\r\n                    variant=\"h4\"\r\n                    className={classes.title}\r\n                >\r\n                    {t(\"download.finished\")}\r\n                </Typography>\r\n                <div className={classes.loadMore}>\r\n                    {this.state.finishedList.length === 0 && (\r\n                        <Nothing primary={t(\"download.finishedEmpty\")} />\r\n                    )}\r\n                    {this.state.finishedList.map((value, k) => {\r\n                        if (value.files) {\r\n                            return <FinishedCard key={k} task={value} />;\r\n                        }\r\n                        return null;\r\n                    })}\r\n                    <Button\r\n                        size=\"large\"\r\n                        className={classes.margin}\r\n                        disabled={!this.state.continue}\r\n                        onClick={this.loadMore}\r\n                    >\r\n                        {t(\"download.loadMore\")}\r\n                    </Button>\r\n                </div>\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nconst Download = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(withTranslation()(DownloadComponent)));\r\n\r\nexport default Download;\r\n","import React from \"react\";\r\nimport { Facebook } from \"react-content-loader\";\r\nimport { makeStyles, useTheme } from \"@material-ui/core/styles\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    loader: {\r\n        width: \"80%\",\r\n        [theme.breakpoints.up(\"md\")]: {\r\n            width: \" 50%\",\r\n        },\r\n\r\n        marginTop: 30,\r\n    },\r\n}));\r\n\r\nconst MyLoader = (props) => {\r\n    return (\r\n        <Facebook\r\n            backgroundColor={props.dark ? \"#333\" : \"#f5f6f7\"}\r\n            foregroundColor={props.dark ? \"#636363\" : \"#eee\"}\r\n            className={props.className}\r\n        />\r\n    );\r\n};\r\n\r\nfunction PageLoading() {\r\n    const theme = useTheme();\r\n    const classes = useStyles();\r\n\r\n    return (\r\n        <div\r\n            style={{\r\n                textAlign: \"center\",\r\n            }}\r\n        >\r\n            <MyLoader\r\n                dark={theme.palette.type === \"dark\"}\r\n                className={classes.loader}\r\n            />\r\n        </div>\r\n    );\r\n}\r\n\r\nexport default PageLoading;\r\n","import React, { Component } from \"react\";\r\nimport { connect } from \"react-redux\";\r\n\r\nimport {\r\n    Avatar,\r\n    Button,\r\n    Card,\r\n    CardActions,\r\n    CardContent,\r\n    CardHeader,\r\n    Divider,\r\n    TextField,\r\n    withStyles,\r\n} from \"@material-ui/core\";\r\nimport { withRouter } from \"react-router\";\r\nimport { formatLocalTime } from \"../../utils/datetime\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport { withTranslation } from \"react-i18next\";\r\n\r\nconst styles = (theme) => ({\r\n    card: {\r\n        maxWidth: 400,\r\n        margin: \"0 auto\",\r\n    },\r\n    actions: {\r\n        display: \"flex\",\r\n    },\r\n    layout: {\r\n        width: \"auto\",\r\n        marginTop: \"110px\",\r\n        marginLeft: theme.spacing(3),\r\n        marginRight: theme.spacing(3),\r\n        [theme.breakpoints.up(1100 + theme.spacing(3) * 2)]: {\r\n            width: 1100,\r\n            marginLeft: \"auto\",\r\n            marginRight: \"auto\",\r\n        },\r\n    },\r\n    continue: {\r\n        marginLeft: \"auto\",\r\n        marginRight: \"10px\",\r\n        marginRottom: \"10px\",\r\n    },\r\n});\r\nconst mapStateToProps = () => {\r\n    return {};\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n    return {\r\n        toggleSnackbar: (vertical, horizontal, msg, color) => {\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color));\r\n        },\r\n    };\r\n};\r\n\r\nclass LockedFileCompoment extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n        const query = new URLSearchParams(this.props.location.search);\r\n        this.state = {\r\n            pwd: query.get(\"password\"),\r\n        };\r\n    }\r\n\r\n    handleChange = (name) => (event) => {\r\n        this.setState({ [name]: event.target.value });\r\n    };\r\n\r\n    submit = (e) => {\r\n        e.preventDefault();\r\n        if (this.state.pwd === \"\") {\r\n            return;\r\n        }\r\n        this.props.setPassowrd(this.state.pwd);\r\n    };\r\n\r\n    render() {\r\n        const { classes, t } = this.props;\r\n\r\n        return (\r\n            <div className={classes.layout}>\r\n                <Card className={classes.card}>\r\n                    <CardHeader\r\n                        avatar={\r\n                            <Avatar\r\n                                aria-label=\"Recipe\"\r\n                                src={\r\n                                    \"/api/v3/user/avatar/\" +\r\n                                    this.props.share.creator.key +\r\n                                    \"/l\"\r\n                                }\r\n                            />\r\n                        }\r\n                        title={t(\"share.privateShareTitle\", {\r\n                            nick: this.props.share.creator.nick,\r\n                        })}\r\n                        subheader={formatLocalTime(\r\n                            this.props.share.create_date\r\n                        )}\r\n                    />\r\n                    <Divider />\r\n                    <CardContent>\r\n                        <form onSubmit={this.submit}>\r\n                            <TextField\r\n                                id=\"pwd\"\r\n                                label={t(\"share.enterPassword\")}\r\n                                value={this.state.pwd}\r\n                                onChange={this.handleChange(\"pwd\")}\r\n                                margin=\"normal\"\r\n                                type=\"password\"\r\n                                autoFocus\r\n                                fullWidth\r\n                                color=\"secondary\"\r\n                            />\r\n                        </form>\r\n                    </CardContent>\r\n                    <CardActions\r\n                        className={classes.actions}\r\n                        disableActionSpacing\r\n                    >\r\n                        <Button\r\n                            onClick={this.submit}\r\n                            color=\"secondary\"\r\n                            className={classes.continue}\r\n                            variant=\"contained\"\r\n                            disabled={\r\n                                this.state.pwd === \"\" || this.props.loading\r\n                            }\r\n                        >\r\n                            {t(\"share.continue\")}\r\n                        </Button>\r\n                    </CardActions>\r\n                </Card>\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nconst LockedFile = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(withRouter(withTranslation()(LockedFileCompoment))));\r\n\r\nexport default LockedFile;\r\n","import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { Avatar, Typography } from \"@material-ui/core\";\r\nimport { useHistory } from \"react-router\";\r\nimport Link from \"@material-ui/core/Link\";\r\nimport { formatLocalTime } from \"../../utils/datetime\";\r\nimport { Trans, useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    boxHeader: {\r\n        textAlign: \"center\",\r\n        padding: 24,\r\n    },\r\n    avatar: {\r\n        backgroundColor: theme.palette.secondary.main,\r\n        margin: \"0 auto\",\r\n        width: 50,\r\n        height: 50,\r\n        cursor: \"pointer\",\r\n    },\r\n    shareDes: {\r\n        marginTop: 12,\r\n    },\r\n    shareInfo: {\r\n        color: theme.palette.text.disabled,\r\n        fontSize: 14,\r\n    },\r\n}));\r\n\r\nexport default function Creator(props) {\r\n    const { t } = useTranslation(\"application\", { keyPrefix: \"share\" });\r\n    const classes = useStyles();\r\n    const history = useHistory();\r\n\r\n    const getSecondDes = () => {\r\n        if (props.share.expire > 0) {\r\n            if (props.share.expire >= 24 * 3600) {\r\n                return t(\"expireInXDays\", {\r\n                    num: Math.round(props.share.expire / (24 * 3600)),\r\n                });\r\n            }\r\n\r\n            return t(\"expireInXHours\", {\r\n                num: Math.round(props.share.expire / 3600),\r\n            });\r\n        }\r\n        return formatLocalTime(props.share.create_date);\r\n    };\r\n\r\n    const userProfile = () => {\r\n        history.push(\"/profile/\" + props.share.creator.key);\r\n        props.onClose && props.onClose();\r\n    };\r\n\r\n    return (\r\n        <div className={classes.boxHeader}>\r\n            <Avatar\r\n                className={classes.avatar}\r\n                alt={props.share.creator.nick}\r\n                src={\"/api/v3/user/avatar/\" + props.share.creator.key + \"/l\"}\r\n                onClick={() => userProfile()}\r\n            />\r\n            <Typography variant=\"h6\" className={classes.shareDes}>\r\n                {props.isFolder && (\r\n                    <Trans\r\n                        i18nKey=\"share.createdBy\"\r\n                        values={{\r\n                            nick: props.share.creator.nick,\r\n                        }}\r\n                        components={[\r\n                            <Link\r\n                                key={0}\r\n                                onClick={() => userProfile()}\r\n                                href={\"javascript:void(0)\"}\r\n                                color=\"inherit\"\r\n                            />,\r\n                        ]}\r\n                    />\r\n                )}\r\n                {!props.isFolder && (\r\n                    <Trans\r\n                        i18nKey=\"share.sharedBy\"\r\n                        values={{\r\n                            num: 1,\r\n                            nick: props.share.creator.nick,\r\n                        }}\r\n                        components={[\r\n                            <Link\r\n                                key={0}\r\n                                onClick={() => userProfile()}\r\n                                href={\"javascript:void(0)\"}\r\n                                color=\"inherit\"\r\n                            />,\r\n                        ]}\r\n                    />\r\n                )}\r\n            </Typography>\r\n            <Typography className={classes.shareInfo}>\r\n                {t(\"statistics\", {\r\n                    views: props.share.views,\r\n                    downloads: props.share.downloads,\r\n                    time: getSecondDes(),\r\n                })}\r\n            </Typography>\r\n        </div>\r\n    );\r\n}\r\n","import React, { Component } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { sizeToString, vhCheck } from \"../../utils\";\r\nimport { isPreviewable } from \"../../config\";\r\nimport { Button, Typography, withStyles } from \"@material-ui/core\";\r\nimport Divider from \"@material-ui/core/Divider\";\r\nimport TypeIcon from \"../FileManager/TypeIcon\";\r\nimport Auth from \"../../middleware/Auth\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport Creator from \"./Creator\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport {\r\n    openMusicDialog,\r\n    openResaveDialog,\r\n    setSelectedTarget,\r\n    showImgPreivew,\r\n    toggleSnackbar,\r\n} from \"../../redux/explorer\";\r\nimport { startDownload } from \"../../redux/explorer/action\";\r\nimport { withTranslation } from \"react-i18next\";\r\n\r\nvhCheck();\r\nconst styles = (theme) => ({\r\n    layout: {\r\n        width: \"auto\",\r\n        marginTop: \"90px\",\r\n        marginLeft: theme.spacing(3),\r\n        marginRight: theme.spacing(3),\r\n        [theme.breakpoints.up(1100 + theme.spacing(3) * 2)]: {\r\n            width: 1100,\r\n            marginTop: \"90px\",\r\n            marginLeft: \"auto\",\r\n            marginRight: \"auto\",\r\n        },\r\n        [theme.breakpoints.down(\"sm\")]: {\r\n            marginTop: 0,\r\n            marginLeft: 0,\r\n            marginRight: 0,\r\n        },\r\n        justifyContent: \"center\",\r\n        display: \"flex\",\r\n    },\r\n    player: {\r\n        borderRadius: \"4px\",\r\n    },\r\n    fileCotainer: {\r\n        width: \"200px\",\r\n        margin: \"0 auto\",\r\n    },\r\n    buttonCotainer: {\r\n        width: \"400px\",\r\n        margin: \"0 auto\",\r\n        textAlign: \"center\",\r\n        marginTop: \"20px\",\r\n    },\r\n    paper: {\r\n        padding: theme.spacing(2),\r\n    },\r\n    icon: {\r\n        borderRadius: \"10%\",\r\n        marginTop: 2,\r\n    },\r\n\r\n    box: {\r\n        width: \"100%\",\r\n        maxWidth: 440,\r\n        backgroundColor: theme.palette.background.paper,\r\n        borderRadius: 12,\r\n        boxShadow: \"0 8px 16px rgba(29,39,55,.25)\",\r\n        [theme.breakpoints.down(\"sm\")]: {\r\n            height: \"calc(var(--vh, 100vh) - 56px)\",\r\n            borderRadius: 0,\r\n            maxWidth: 1000,\r\n        },\r\n        display: \"flex\",\r\n        flexDirection: \"column\",\r\n    },\r\n    boxContent: {\r\n        padding: 24,\r\n        display: \"flex\",\r\n        flex: \"1\",\r\n    },\r\n    fileName: {\r\n        marginLeft: 20,\r\n    },\r\n    fileSize: {\r\n        color: theme.palette.text.disabled,\r\n        fontSize: 14,\r\n    },\r\n    boxFooter: {\r\n        display: \"flex\",\r\n        padding: \"20px 16px\",\r\n        justifyContent: \"space-between\",\r\n    },\r\n    downloadButton: {\r\n        marginLeft: 8,\r\n    },\r\n});\r\nconst mapStateToProps = () => {\r\n    return {};\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n    return {\r\n        toggleSnackbar: (vertical, horizontal, msg, color) => {\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color));\r\n        },\r\n        openMusicDialog: () => {\r\n            dispatch(openMusicDialog());\r\n        },\r\n        setSelectedTarget: (targets) => {\r\n            dispatch(setSelectedTarget(targets));\r\n        },\r\n        showImgPreivew: (first) => {\r\n            dispatch(showImgPreivew(first));\r\n        },\r\n        openResave: (key) => {\r\n            dispatch(openResaveDialog(key));\r\n        },\r\n        startDownload: (share, file) => {\r\n            dispatch(startDownload(share, file));\r\n        },\r\n    };\r\n};\r\n\r\nconst Modals = React.lazy(() => import(\"../FileManager/Modals\"));\r\nconst ImgPreview = React.lazy(() => import(\"../FileManager/ImgPreview\"));\r\n\r\nclass SharedFileCompoment extends Component {\r\n    state = {\r\n        anchorEl: null,\r\n        open: false,\r\n        purchaseCallback: null,\r\n        loading: false,\r\n    };\r\n\r\n    downloaded = false;\r\n\r\n    // TODO merge into react thunk\r\n    preview = () => {\r\n        if (pathHelper.isSharePage(this.props.location.pathname)) {\r\n            const user = Auth.GetUser();\r\n            if (!Auth.Check() && user && !user.group.shareDownload) {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    this.props.t(\"share.pleaseLogin\"),\r\n                    \"warning\"\r\n                );\r\n                return;\r\n            }\r\n        }\r\n\r\n        switch (isPreviewable(this.props.share.source.name)) {\r\n            case \"img\":\r\n                this.props.showImgPreivew({\r\n                    key: this.props.share.key,\r\n                    name: this.props.share.source.name,\r\n                });\r\n                return;\r\n            case \"msDoc\":\r\n                this.props.history.push(\r\n                    this.props.share.key +\r\n                        \"/doc?name=\" +\r\n                        encodeURIComponent(this.props.share.source.name)\r\n                );\r\n                return;\r\n            case \"audio\":\r\n                this.props.setSelectedTarget([\r\n                    {\r\n                        key: this.props.share.key,\r\n                        type: \"share\",\r\n                    },\r\n                ]);\r\n                this.props.openMusicDialog();\r\n                return;\r\n            case \"video\":\r\n                this.props.history.push(\r\n                    this.props.share.key +\r\n                        \"/video?name=\" +\r\n                        encodeURIComponent(this.props.share.source.name)\r\n                );\r\n                return;\r\n            case \"edit\":\r\n                this.props.history.push(\r\n                    this.props.share.key +\r\n                        \"/text?name=\" +\r\n                        encodeURIComponent(this.props.share.source.name)\r\n                );\r\n                return;\r\n            case \"pdf\":\r\n                this.props.history.push(\r\n                    this.props.share.key +\r\n                        \"/pdf?name=\" +\r\n                        encodeURIComponent(this.props.share.source.name)\r\n                );\r\n                return;\r\n            case \"code\":\r\n                this.props.history.push(\r\n                    this.props.share.key +\r\n                        \"/code?name=\" +\r\n                        encodeURIComponent(this.props.share.source.name)\r\n                );\r\n                return;\r\n            case \"epub\":\r\n                this.props.history.push(\r\n                    this.props.share.key +\r\n                        \"/epub?name=\" +\r\n                        encodeURIComponent(this.props.share.source.name)\r\n                );\r\n                return;\r\n            default:\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    this.props.t(\"share.cannotShare\"),\r\n                    \"warning\"\r\n                );\r\n                return;\r\n        }\r\n    };\r\n\r\n    componentWillUnmount() {\r\n        this.props.setSelectedTarget([]);\r\n    }\r\n\r\n    scoreHandle = (callback) => (event) => {\r\n        callback(event);\r\n    };\r\n\r\n    download = () => {\r\n        this.props.startDownload(this.props.share, null);\r\n    };\r\n\r\n    render() {\r\n        const { classes, t } = this.props;\r\n        return (\r\n            <div className={classes.layout}>\r\n                <Modals />\r\n                <ImgPreview />\r\n                <div className={classes.box}>\r\n                    <Creator share={this.props.share} />\r\n                    <Divider />\r\n                    <div className={classes.boxContent}>\r\n                        <TypeIcon\r\n                            className={classes.icon}\r\n                            isUpload\r\n                            fileName={this.props.share.source.name}\r\n                        />\r\n                        <div className={classes.fileName}>\r\n                            <Typography style={{ wordBreak: \"break-all\" }}>\r\n                                {this.props.share.source.name}\r\n                            </Typography>\r\n                            <Typography className={classes.fileSize}>\r\n                                {sizeToString(this.props.share.source.size)}\r\n                            </Typography>\r\n                        </div>\r\n                    </div>\r\n                    <Divider />\r\n                    <div className={classes.boxFooter}>\r\n                        <div className={classes.actionLeft}>\r\n                            {this.props.share.preview && (\r\n                                <Button\r\n                                    variant=\"outlined\"\r\n                                    color=\"secondary\"\r\n                                    onClick={this.scoreHandle(this.preview)}\r\n                                    disabled={this.state.loading}\r\n                                >\r\n                                    {t(\"share.preview\")}\r\n                                </Button>\r\n                            )}\r\n                        </div>\r\n                        <div className={classes.actions}>\r\n                            <Button\r\n                                variant=\"contained\"\r\n                                color=\"secondary\"\r\n                                className={classes.downloadButton}\r\n                                onClick={this.download}\r\n                                disabled={this.state.loading}\r\n                            >\r\n                                {t(\"fileManager.download\")}\r\n                            </Button>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nconst SharedFile = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(withRouter(withTranslation()(SharedFileCompoment))));\r\n\r\nexport default SharedFile;\r\n","import React, { Component } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Typography, withStyles } from \"@material-ui/core\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport FileManager from \"../FileManager/FileManager\";\r\nimport Paper from \"@material-ui/core/Paper\";\r\nimport Popover from \"@material-ui/core/Popover\";\r\nimport Creator from \"./Creator\";\r\nimport ClickAwayListener from \"@material-ui/core/ClickAwayListener\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport {\r\n    openMusicDialog,\r\n    openResaveDialog,\r\n    setSelectedTarget,\r\n    setShareUserPopover,\r\n    showImgPreivew,\r\n    toggleSnackbar,\r\n} from \"../../redux/explorer\";\r\nimport { setShareInfo } from \"../../redux/viewUpdate/action\";\r\n\r\nconst styles = (theme) => ({\r\n    layout: {\r\n        width: \"auto\",\r\n        marginTop: 30,\r\n        marginBottom: 30,\r\n        marginLeft: theme.spacing(3),\r\n        marginRight: theme.spacing(3),\r\n        [theme.breakpoints.up(1100 + theme.spacing(3) * 2)]: {\r\n            width: 1100,\r\n            marginLeft: \"auto\",\r\n            marginRight: \"auto\",\r\n        },\r\n        [theme.breakpoints.down(\"sm\")]: {\r\n            marginTop: theme.spacing(2),\r\n            marginLeft: theme.spacing(1),\r\n            marginRight: theme.spacing(1),\r\n        },\r\n    },\r\n    managerContainer: {\r\n        overflowY: \"auto\",\r\n    },\r\n});\r\n\r\nconst ReadMe = React.lazy(() => import(\"./ReadMe\"));\r\n\r\nconst mapStateToProps = (state) => {\r\n    return {\r\n        anchorEl: state.viewUpdate.shareUserPopoverAnchorEl,\r\n        fileList: state.explorer.fileList,\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n    return {\r\n        toggleSnackbar: (vertical, horizontal, msg, color) => {\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color));\r\n        },\r\n        openMusicDialog: () => {\r\n            dispatch(openMusicDialog());\r\n        },\r\n        setSelectedTarget: (targets) => {\r\n            dispatch(setSelectedTarget(targets));\r\n        },\r\n        showImgPreivew: (first) => {\r\n            dispatch(showImgPreivew(first));\r\n        },\r\n        openResave: (key) => {\r\n            dispatch(openResaveDialog(key));\r\n        },\r\n        setShareUserPopover: (e) => {\r\n            dispatch(setShareUserPopover(e));\r\n        },\r\n        setShareInfo: (s) => {\r\n            dispatch(setShareInfo(s));\r\n        },\r\n    };\r\n};\r\n\r\nclass SharedFolderComponent extends Component {\r\n    state = {};\r\n\r\n    UNSAFE_componentWillMount() {\r\n        this.props.setShareInfo(this.props.share);\r\n    }\r\n\r\n    componentWillUnmount() {\r\n        this.props.setShareInfo(null);\r\n        this.props.setSelectedTarget([]);\r\n    }\r\n\r\n    handleClickAway = (e) => {\r\n        const ignore = e && e.clientY && e.clientY <= 64;\r\n        if (!pathHelper.isMobile() && !ignore) {\r\n            this.props.setSelectedTarget([]);\r\n        }\r\n    };\r\n\r\n    render() {\r\n        const { classes } = this.props;\r\n        let readmeShowed = false;\r\n        const id = this.props.anchorEl !== null ? \"simple-popover\" : undefined;\r\n\r\n        return (\r\n            <div className={classes.layout}>\r\n                <ClickAwayListener onClickAway={this.handleClickAway}>\r\n                    <Paper className={classes.managerContainer}>\r\n                        <FileManager isShare share={this.props.share} />\r\n                    </Paper>\r\n                </ClickAwayListener>\r\n                {/* eslint-disable-next-line */}\r\n                {this.props.fileList.map((value) => {\r\n                    if (\r\n                        (value.name.toLowerCase() === \"readme.md\" ||\r\n                            value.name.toLowerCase() === \"readme.txt\") &&\r\n                        !readmeShowed\r\n                    ) {\r\n                        readmeShowed = true;\r\n                        return <ReadMe share={this.props.share} file={value} />;\r\n                    }\r\n                })}\r\n                <Popover\r\n                    id={id}\r\n                    open={this.props.anchorEl !== null}\r\n                    anchorEl={this.props.anchorEl}\r\n                    onClose={() => this.props.setShareUserPopover(null)}\r\n                    anchorOrigin={{\r\n                        vertical: \"bottom\",\r\n                        horizontal: \"center\",\r\n                    }}\r\n                    transformOrigin={{\r\n                        vertical: \"top\",\r\n                        horizontal: \"center\",\r\n                    }}\r\n                >\r\n                    <Typography>\r\n                        <Creator\r\n                            isFolder\r\n                            onClose={() => this.props.setShareUserPopover(null)}\r\n                            share={this.props.share}\r\n                        />\r\n                    </Typography>\r\n                </Popover>\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nconst SharedFolder = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(withRouter(SharedFolderComponent)));\r\n\r\nexport default SharedFolder;\r\n","import React, { Suspense, useCallback, useEffect, useState } from \"react\";\r\nimport PageLoading from \"../Placeholder/PageLoading\";\r\nimport { useParams } from \"react-router\";\r\nimport API from \"../../middleware/Api\";\r\nimport { changeSubTitle } from \"../../redux/viewUpdate/action\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport Notice from \"./NotFound\";\r\nimport LockedFile from \"./LockedFile\";\r\nimport SharedFile from \"./SharedFile\";\r\nimport SharedFolder from \"./SharedFolder\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nexport default function SharePreload() {\r\n    const { t } = useTranslation(\"application\", { keyPrefix: \"share\" });\r\n    const dispatch = useDispatch();\r\n    const { id } = useParams();\r\n\r\n    const [share, setShare] = useState(undefined);\r\n    const [loading, setLoading] = useState(false);\r\n    const [password, setPassword] = useState(\"\");\r\n\r\n    const SetSubTitle = useCallback(\r\n        (title) => dispatch(changeSubTitle(title)),\r\n        [dispatch]\r\n    );\r\n\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n\r\n    useEffect(() => {\r\n        if (share) {\r\n            if (share.locked) {\r\n                SetSubTitle(\r\n                    t(\"privateShareTitle\", { nick: share.creator.nick })\r\n                );\r\n                if (password !== \"\") {\r\n                    ToggleSnackbar(\r\n                        \"top\",\r\n                        \"right\",\r\n                        t(\"incorrectPassword\"),\r\n                        \"warning\"\r\n                    );\r\n                }\r\n            } else {\r\n                SetSubTitle(share.source.name);\r\n            }\r\n        } else {\r\n            SetSubTitle();\r\n        }\r\n    }, [share, SetSubTitle, ToggleSnackbar]);\r\n\r\n    useEffect(() => {\r\n        return () => {\r\n            SetSubTitle();\r\n        };\r\n        // eslint-disable-next-line\r\n    }, []);\r\n\r\n    useEffect(() => {\r\n        setLoading(true);\r\n        let withPassword = \"\";\r\n        if (password !== \"\") {\r\n            withPassword = \"?password=\" + password;\r\n        }\r\n        API.get(\"/share/info/\" + id + withPassword)\r\n            .then((response) => {\r\n                setShare(response.data);\r\n                setLoading(false);\r\n            })\r\n            .catch((error) => {\r\n                setLoading(false);\r\n                if (error.code === 404) {\r\n                    setShare(null);\r\n                } else {\r\n                    ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n                }\r\n            });\r\n    }, [id, password, ToggleSnackbar]);\r\n\r\n    return (\r\n        <Suspense fallback={<PageLoading />}>\r\n            {share === undefined && <PageLoading />}\r\n            {share === null && <Notice msg={t(\"shareNotExist\")} />}\r\n            {share && share.locked && (\r\n                <LockedFile\r\n                    loading={loading}\r\n                    setPassowrd={setPassword}\r\n                    share={share}\r\n                />\r\n            )}\r\n            {share && !share.locked && !share.is_dir && (\r\n                <SharedFile share={share} />\r\n            )}\r\n            {share && !share.locked && share.is_dir && (\r\n                <SharedFolder share={share} />\r\n            )}\r\n        </Suspense>\r\n    );\r\n}\r\n","import React, { useCallback, useEffect, useState } from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { useLocation, useParams, useRouteMatch } from \"react-router\";\r\nimport API from \"../../middleware/Api\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport UseFileSubTitle from \"../../hooks/fileSubtitle\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n    layout: {\r\n        width: \"auto\",\r\n    },\r\n\r\n    container: {\r\n        border: \"none\",\r\n        width: \"100%\",\r\n        height: \"calc(100vh - 64px)\",\r\n        marginBottom: -10,\r\n    },\r\n}));\r\n\r\nfunction useQuery() {\r\n    return new URLSearchParams(useLocation().search);\r\n}\r\n\r\nexport default function DocViewer() {\r\n    const [url, setURL] = useState(\"\");\r\n    const math = useRouteMatch();\r\n    const location = useLocation();\r\n    const query = useQuery();\r\n    const { id } = useParams();\r\n    UseFileSubTitle(query, math, location);\r\n\r\n    const dispatch = useDispatch();\r\n\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n\r\n    useEffect(() => {\r\n        let requestURL = \"/file/doc/\" + query.get(\"id\");\r\n        if (pathHelper.isSharePage(location.pathname)) {\r\n            requestURL = \"/share/doc/\" + id;\r\n            if (query.get(\"share_path\") !== \"\") {\r\n                requestURL +=\r\n                    \"?path=\" + encodeURIComponent(query.get(\"share_path\"));\r\n            }\r\n        }\r\n        API.get(requestURL)\r\n            .then((response) => {\r\n                setURL(response.data);\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n            });\r\n        // eslint-disable-next-line\r\n    }, [math.params[0], location]);\r\n\r\n    const classes = useStyles();\r\n    return (\r\n        <div className={classes.layout}>\r\n            {url !== \"\" && (\r\n                <iframe title={\"ms\"} className={classes.container} src={url} />\r\n            )}\r\n        </div>\r\n    );\r\n}\r\n","import React, { useState } from \"react\";\r\nimport { Dialog, makeStyles } from \"@material-ui/core\";\r\nimport DialogTitle from \"@material-ui/core/DialogTitle\";\r\nimport DialogActions from \"@material-ui/core/DialogActions\";\r\nimport Button from \"@material-ui/core/Button\";\r\nimport TextField from \"@material-ui/core/TextField\";\r\nimport { FolderOpenOutlined, LabelOutlined } from \"@material-ui/icons\";\r\nimport PathSelector from \"../FileManager/PathSelector\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    formGroup: {\r\n        display: \"flex\",\r\n        marginTop: theme.spacing(1),\r\n    },\r\n    formIcon: {\r\n        marginTop: 21,\r\n        marginRight: 19,\r\n        color: theme.palette.text.secondary,\r\n    },\r\n    input: {\r\n        width: 250,\r\n    },\r\n    dialogContent: {\r\n        paddingTop: 24,\r\n        paddingRight: 24,\r\n        paddingBottom: 8,\r\n        paddingLeft: 24,\r\n    },\r\n    button: {\r\n        marginTop: 8,\r\n    },\r\n}));\r\n\r\nexport default function CreateWebDAVAccount(props) {\r\n    const { t } = useTranslation();\r\n    const [value, setValue] = useState({\r\n        name: \"\",\r\n        path: \"/\",\r\n    });\r\n    const [pathSelectDialog, setPathSelectDialog] = React.useState(false);\r\n    const [selectedPath, setSelectedPath] = useState(\"\");\r\n    // eslint-disable-next-line\r\n    const [selectedPathName, setSelectedPathName] = useState(\"\");\r\n    const classes = useStyles();\r\n\r\n    const setMoveTarget = (folder) => {\r\n        const path =\r\n            folder.path === \"/\"\r\n                ? folder.path + folder.name\r\n                : folder.path + \"/\" + folder.name;\r\n        setSelectedPath(path);\r\n        setSelectedPathName(folder.name);\r\n    };\r\n\r\n    const handleInputChange = (name) => (e) => {\r\n        setValue({\r\n            ...value,\r\n            [name]: e.target.value,\r\n        });\r\n    };\r\n\r\n    const selectPath = () => {\r\n        setValue({\r\n            ...value,\r\n            path: selectedPath === \"//\" ? \"/\" : selectedPath,\r\n        });\r\n        setPathSelectDialog(false);\r\n    };\r\n\r\n    return (\r\n        <Dialog\r\n            open={props.open}\r\n            onClose={props.onClose}\r\n            aria-labelledby=\"form-dialog-title\"\r\n        >\r\n            <Dialog\r\n                open={pathSelectDialog}\r\n                onClose={() => setPathSelectDialog(false)}\r\n                aria-labelledby=\"form-dialog-title\"\r\n            >\r\n                <DialogTitle id=\"form-dialog-title\">\r\n                    {t(\"navbar.addTagDialog.selectFolder\")}\r\n                </DialogTitle>\r\n                <PathSelector\r\n                    presentPath=\"/\"\r\n                    selected={[]}\r\n                    onSelect={setMoveTarget}\r\n                />\r\n\r\n                <DialogActions>\r\n                    <Button onClick={() => setPathSelectDialog(false)}>\r\n                        {t(\"cancel\", { ns: \"common\" })}\r\n                    </Button>\r\n                    <Button\r\n                        onClick={selectPath}\r\n                        color=\"primary\"\r\n                        disabled={selectedPath === \"\"}\r\n                    >\r\n                        {t(\"ok\", { ns: \"common\" })}\r\n                    </Button>\r\n                </DialogActions>\r\n            </Dialog>\r\n            <div className={classes.dialogContent}>\r\n                <div className={classes.formContainer}>\r\n                    <div className={classes.formGroup}>\r\n                        <div className={classes.formIcon}>\r\n                            <LabelOutlined />\r\n                        </div>\r\n\r\n                        <TextField\r\n                            className={classes.input}\r\n                            value={value.name}\r\n                            onChange={handleInputChange(\"name\")}\r\n                            label={t(\"setting.annotation\")}\r\n                        />\r\n                    </div>\r\n                    <div className={classes.formGroup}>\r\n                        <div className={classes.formIcon}>\r\n                            <FolderOpenOutlined />\r\n                        </div>\r\n                        <div>\r\n                            <TextField\r\n                                value={value.path}\r\n                                onChange={handleInputChange(\"path\")}\r\n                                className={classes.input}\r\n                                label={t(\"setting.rootFolder\")}\r\n                            />\r\n                            <br />\r\n                            <Button\r\n                                className={classes.button}\r\n                                color=\"primary\"\r\n                                onClick={() => setPathSelectDialog(true)}\r\n                            >\r\n                                {t(\"navbar.addTagDialog.selectFolder\")}\r\n                            </Button>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n            <DialogActions>\r\n                <Button onClick={props.onClose}>\r\n                    {t(\"cancel\", { ns: \"common\" })}\r\n                </Button>\r\n                <Button\r\n                    disabled={value.path === \"\" || value.name === \"\"}\r\n                    color=\"primary\"\r\n                    onClick={() => props.callback(value)}\r\n                >\r\n                    {t(\"ok\", { ns: \"common\" })}\r\n                </Button>\r\n            </DialogActions>\r\n        </Dialog>\r\n    );\r\n}\r\n","import React, { useState, useCallback, useEffect } from \"react\";\r\nimport { makeStyles, Typography } from \"@material-ui/core\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport Paper from \"@material-ui/core/Paper\";\r\nimport Tabs from \"@material-ui/core/Tabs\";\r\nimport Tab from \"@material-ui/core/Tab\";\r\nimport Button from \"@material-ui/core/Button\";\r\nimport TableContainer from \"@material-ui/core/TableContainer\";\r\nimport Table from \"@material-ui/core/Table\";\r\nimport TableHead from \"@material-ui/core/TableHead\";\r\nimport TableRow from \"@material-ui/core/TableRow\";\r\nimport TableCell from \"@material-ui/core/TableCell\";\r\nimport TableBody from \"@material-ui/core/TableBody\";\r\nimport Alert from \"@material-ui/lab/Alert\";\r\nimport Auth from \"../../middleware/Auth\";\r\nimport API from \"../../middleware/Api\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport { Delete } from \"@material-ui/icons\";\r\nimport CreateWebDAVAccount from \"../Modals/CreateWebDAVAccount\";\r\nimport TimeAgo from \"timeago-react\";\r\nimport Link from \"@material-ui/core/Link\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport Nothing from \"../Placeholder/Nothing\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    layout: {\r\n        width: \"auto\",\r\n        marginTop: \"50px\",\r\n        marginLeft: theme.spacing(3),\r\n        marginRight: theme.spacing(3),\r\n        [theme.breakpoints.up(1100 + theme.spacing(3) * 2)]: {\r\n            width: 1100,\r\n            marginLeft: \"auto\",\r\n            marginRight: \"auto\",\r\n        },\r\n        marginBottom: \"50px\",\r\n    },\r\n    content: {\r\n        marginTop: theme.spacing(4),\r\n    },\r\n    cardContent: {\r\n        padding: theme.spacing(2),\r\n    },\r\n    tableContainer: {\r\n        overflowX: \"auto\",\r\n    },\r\n    create: {\r\n        marginTop: theme.spacing(2),\r\n    },\r\n    copy: {\r\n        marginLeft: 10,\r\n    },\r\n}));\r\n\r\nexport default function WebDAV() {\r\n    const { t } = useTranslation();\r\n    const [tab, setTab] = useState(0);\r\n    const [create, setCreate] = useState(false);\r\n    const [accounts, setAccounts] = useState([]);\r\n\r\n    const dispatch = useDispatch();\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n\r\n    const copyToClipboard = (text) => {\r\n        if (navigator.clipboard) {\r\n            navigator.clipboard.writeText(text);\r\n            ToggleSnackbar(\"top\", \"center\", t(\"setting.copied\"), \"success\");\r\n        } else {\r\n            ToggleSnackbar(\r\n                \"top\",\r\n                \"center\",\r\n                t(\"setting.pleaseManuallyCopy\"),\r\n                \"warning\"\r\n            );\r\n        }\r\n    };\r\n\r\n    const loadList = () => {\r\n        API.get(\"/webdav/accounts\")\r\n            .then((response) => {\r\n                setAccounts(response.data.accounts);\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n            });\r\n    };\r\n    useEffect(() => {\r\n        loadList();\r\n        // eslint-disable-next-line\r\n    }, []);\r\n\r\n    const deleteAccount = (id) => {\r\n        const account = accounts[id];\r\n        API.delete(\"/webdav/accounts/\" + account.ID)\r\n            .then(() => {\r\n                let accountCopy = [...accounts];\r\n                accountCopy = accountCopy.filter((v, i) => {\r\n                    return i !== id;\r\n                });\r\n                setAccounts(accountCopy);\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n            });\r\n    };\r\n\r\n    const addAccount = (account) => {\r\n        setCreate(false);\r\n        API.post(\"/webdav/accounts\", {\r\n            path: account.path,\r\n            name: account.name,\r\n        })\r\n            .then((response) => {\r\n                setAccounts([\r\n                    {\r\n                        ID: response.data.id,\r\n                        Password: response.data.password,\r\n                        CreatedAt: response.data.created_at,\r\n                        Name: account.name,\r\n                        Root: account.path,\r\n                    },\r\n                    ...accounts,\r\n                ]);\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n            });\r\n    };\r\n\r\n    const classes = useStyles();\r\n    const user = Auth.GetUser();\r\n\r\n    return (\r\n        <div className={classes.layout}>\r\n            <CreateWebDAVAccount\r\n                callback={addAccount}\r\n                open={create}\r\n                onClose={() => setCreate(false)}\r\n            />\r\n            <Typography color=\"textSecondary\" variant=\"h4\">\r\n                {t(\"navbar.connect\")}\r\n            </Typography>\r\n            <Paper elevation={3} className={classes.content}>\r\n                <Tabs\r\n                    value={tab}\r\n                    indicatorColor=\"primary\"\r\n                    textColor=\"primary\"\r\n                    onChange={(event, newValue) => setTab(newValue)}\r\n                    aria-label=\"disabled tabs example\"\r\n                >\r\n                    <Tab label={t(\"setting.webdavAccounts\")} />\r\n                </Tabs>\r\n                <div className={classes.cardContent}>\r\n                    {tab === 0 && (\r\n                        <div>\r\n                            <Alert severity=\"info\">\r\n                                {t(\"setting.webdavHint\", {\r\n                                    url: window.location.origin + \"/dav\",\r\n                                    name: user.user_name,\r\n                                })}\r\n                            </Alert>\r\n                            <TableContainer className={classes.tableContainer}>\r\n                                <Table\r\n                                    className={classes.table}\r\n                                    aria-label=\"simple table\"\r\n                                >\r\n                                    <TableHead>\r\n                                        <TableRow>\r\n                                            <TableCell>\r\n                                                {t(\"setting.annotation\")}\r\n                                            </TableCell>\r\n                                            <TableCell>\r\n                                                {t(\"login.password\")}\r\n                                            </TableCell>\r\n                                            <TableCell align=\"right\">\r\n                                                {t(\"setting.rootFolder\")}\r\n                                            </TableCell>\r\n                                            <TableCell align=\"right\">\r\n                                                {t(\"setting.createdAt\")}\r\n                                            </TableCell>\r\n                                            <TableCell align=\"right\">\r\n                                                {t(\"setting.action\")}\r\n                                            </TableCell>\r\n                                        </TableRow>\r\n                                    </TableHead>\r\n                                    <TableBody>\r\n                                        {accounts.map((row, id) => (\r\n                                            <TableRow key={id}>\r\n                                                <TableCell\r\n                                                    component=\"th\"\r\n                                                    scope=\"row\"\r\n                                                >\r\n                                                    {row.Name}\r\n                                                </TableCell>\r\n                                                <TableCell>\r\n                                                    {row.Password}\r\n                                                    <Link\r\n                                                        className={classes.copy}\r\n                                                        onClick={() =>\r\n                                                            copyToClipboard(\r\n                                                                row.Password\r\n                                                            )\r\n                                                        }\r\n                                                        href={\"javascript:void\"}\r\n                                                    >\r\n                                                        {t(\"copy\", {\r\n                                                            ns: \"common\",\r\n                                                        })}\r\n                                                    </Link>\r\n                                                </TableCell>\r\n                                                <TableCell align=\"right\">\r\n                                                    {row.Root}\r\n                                                </TableCell>\r\n                                                <TableCell align=\"right\">\r\n                                                    <TimeAgo\r\n                                                        datetime={row.CreatedAt}\r\n                                                        locale={t(\r\n                                                            \"timeAgoLocaleCode\",\r\n                                                            {\r\n                                                                ns: \"common\",\r\n                                                            }\r\n                                                        )}\r\n                                                    />\r\n                                                </TableCell>\r\n                                                <TableCell align=\"right\">\r\n                                                    <IconButton\r\n                                                        size={\"small\"}\r\n                                                        onClick={() =>\r\n                                                            deleteAccount(id)\r\n                                                        }\r\n                                                    >\r\n                                                        <Delete />\r\n                                                    </IconButton>\r\n                                                </TableCell>\r\n                                            </TableRow>\r\n                                        ))}\r\n                                    </TableBody>\r\n                                </Table>\r\n                                {accounts.length === 0 && (\r\n                                    <Nothing primary={t(\"setting.listEmpty\")} />\r\n                                )}\r\n                            </TableContainer>\r\n                            <Button\r\n                                onClick={() => setCreate(true)}\r\n                                className={classes.create}\r\n                                variant=\"contained\"\r\n                                color=\"secondary\"\r\n                            >\r\n                                {t(\"setting.createNewAccount\")}\r\n                            </Button>\r\n                        </div>\r\n                    )}\r\n                </div>\r\n            </Paper>\r\n        </div>\r\n    );\r\n}\r\n","import React, { useCallback, useEffect, useState } from \"react\";\r\nimport { makeStyles, Typography } from \"@material-ui/core\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport Paper from \"@material-ui/core/Paper\";\r\nimport Table from \"@material-ui/core/Table\";\r\nimport TableHead from \"@material-ui/core/TableHead\";\r\nimport TableRow from \"@material-ui/core/TableRow\";\r\nimport TableCell from \"@material-ui/core/TableCell\";\r\nimport TableBody from \"@material-ui/core/TableBody\";\r\nimport API from \"../../middleware/Api\";\r\nimport { getTaskProgress, getTaskStatus, getTaskType } from \"../../config\";\r\nimport Pagination from \"@material-ui/lab/Pagination\";\r\nimport { formatLocalTime } from \"../../utils/datetime\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport Nothing from \"../Placeholder/Nothing\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    layout: {\r\n        width: \"auto\",\r\n        marginTop: \"50px\",\r\n        marginLeft: theme.spacing(3),\r\n        marginRight: theme.spacing(3),\r\n        [theme.breakpoints.up(1100 + theme.spacing(3) * 2)]: {\r\n            width: 1100,\r\n            marginLeft: \"auto\",\r\n            marginRight: \"auto\",\r\n        },\r\n        marginBottom: \"50px\",\r\n    },\r\n    content: {\r\n        marginTop: theme.spacing(4),\r\n        overflowX: \"auto\",\r\n    },\r\n    cardContent: {\r\n        padding: theme.spacing(2),\r\n    },\r\n    tableContainer: {\r\n        overflowX: \"auto\",\r\n    },\r\n    create: {\r\n        marginTop: theme.spacing(2),\r\n    },\r\n    noWrap: {\r\n        wordBreak: \"keepAll\",\r\n    },\r\n    footer: {\r\n        padding: theme.spacing(2),\r\n    },\r\n}));\r\n\r\nexport default function Tasks() {\r\n    const { t } = useTranslation();\r\n    const [tasks, setTasks] = useState([]);\r\n    const [total, setTotal] = useState(0);\r\n    const [page, setPage] = useState(1);\r\n\r\n    const dispatch = useDispatch();\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n\r\n    const loadList = (page) => {\r\n        API.get(\"/user/setting/tasks?page=\" + page)\r\n            .then((response) => {\r\n                setTasks(response.data.tasks);\r\n                setTotal(response.data.total);\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n            });\r\n    };\r\n\r\n    useEffect(() => {\r\n        loadList(page);\r\n        // eslint-disable-next-line\r\n    }, [page]);\r\n\r\n    const getError = (error) => {\r\n        if (error === \"\") {\r\n            return \"-\";\r\n        }\r\n        try {\r\n            const res = JSON.parse(error);\r\n            return `${res.msg}: ${res.error}`;\r\n        } catch (e) {\r\n            return t(\"uploader.unknownStatus\");\r\n        }\r\n    };\r\n\r\n    const classes = useStyles();\r\n\r\n    return (\r\n        <div className={classes.layout}>\r\n            <Typography color=\"textSecondary\" variant=\"h4\">\r\n                {t(\"navbar.taskQueue\")}\r\n            </Typography>\r\n            <Paper elevation={3} className={classes.content}>\r\n                <Table className={classes.table} aria-label=\"simple table\">\r\n                    <TableHead>\r\n                        <TableRow>\r\n                            <TableCell nowrap=\"nowrap\">\r\n                                {t(\"setting.createdAt\")}\r\n                            </TableCell>\r\n                            <TableCell nowrap=\"nowrap\" align=\"right\">\r\n                                {t(\"setting.taskType\")}\r\n                            </TableCell>\r\n                            <TableCell nowrap=\"nowrap\" align=\"right\">\r\n                                {t(\"setting.taskStatus\")}\r\n                            </TableCell>\r\n                            <TableCell nowrap=\"nowrap\" align=\"right\">\r\n                                {t(\"setting.lastProgress\")}\r\n                            </TableCell>\r\n                            <TableCell nowrap=\"nowrap\">\r\n                                {t(\"setting.errorDetails\")}\r\n                            </TableCell>\r\n                        </TableRow>\r\n                    </TableHead>\r\n                    <TableBody>\r\n                        {tasks.map((row, id) => (\r\n                            <TableRow key={id}>\r\n                                <TableCell\r\n                                    nowrap=\"nowrap\"\r\n                                    component=\"th\"\r\n                                    scope=\"row\"\r\n                                >\r\n                                    {formatLocalTime(row.create_date)}\r\n                                </TableCell>\r\n                                <TableCell nowrap=\"nowrap\" align=\"right\">\r\n                                    {getTaskType(row.type)}\r\n                                </TableCell>\r\n                                <TableCell nowrap=\"nowrap\" align=\"right\">\r\n                                    {getTaskStatus(row.status)}\r\n                                </TableCell>\r\n                                <TableCell nowrap=\"nowrap\" align=\"right\">\r\n                                    {getTaskProgress(row.type, row.progress)}\r\n                                </TableCell>\r\n                                <TableCell className={classes.noWrap}>\r\n                                    {getError(row.error)}\r\n                                </TableCell>\r\n                            </TableRow>\r\n                        ))}\r\n                    </TableBody>\r\n                </Table>\r\n                {tasks.length === 0 && (\r\n                    <Nothing primary={t(\"setting.listEmpty\")} />\r\n                )}\r\n                <div className={classes.footer}>\r\n                    <Pagination\r\n                        count={Math.ceil(total / 10)}\r\n                        onChange={(e, v) => setPage(v)}\r\n                        color=\"secondary\"\r\n                    />\r\n                </div>\r\n            </Paper>\r\n        </div>\r\n    );\r\n}\r\n","import React, { Component } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport API from \"../../middleware/Api\";\r\n\r\nimport {\r\n    Avatar,\r\n    Grid,\r\n    Paper,\r\n    Tab,\r\n    Table,\r\n    TableBody,\r\n    TableCell,\r\n    TableHead,\r\n    TableRow,\r\n    Tabs,\r\n    Typography,\r\n    withStyles,\r\n} from \"@material-ui/core\";\r\nimport { withRouter } from \"react-router\";\r\nimport Pagination from \"@material-ui/lab/Pagination\";\r\nimport { formatLocalTime } from \"../../utils/datetime\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport { withTranslation } from \"react-i18next\";\r\n\r\nconst styles = (theme) => ({\r\n    layout: {\r\n        width: \"auto\",\r\n        marginTop: \"50px\",\r\n        marginLeft: theme.spacing(3),\r\n        marginRight: theme.spacing(3),\r\n        marginBottom: \"30px\",\r\n        [theme.breakpoints.up(\"sm\")]: {\r\n            width: 700,\r\n            marginLeft: \"auto\",\r\n            marginRight: \"auto\",\r\n        },\r\n    },\r\n    userNav: {\r\n        height: \"270px\",\r\n        backgroundColor: theme.palette.primary.main,\r\n        padding: \"20px 20px 2em\",\r\n        backgroundImage:\r\n            \"url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 900'%3E%3Cpolygon fill='\" +\r\n            theme.palette.primary.light.replace(\"#\", \"%23\") +\r\n            \"' points='957 450 539 900 1396 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.primary.dark.replace(\"#\", \"%23\") +\r\n            \"' points='957 450 872.9 900 1396 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.secondary.main.replace(\"#\", \"%23\") +\r\n            \"' points='-60 900 398 662 816 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.secondary.dark.replace(\"#\", \"%23\") +\r\n            \"' points='337 900 398 662 816 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.secondary.light.replace(\"#\", \"%23\") +\r\n            \"' points='1203 546 1552 900 876 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.secondary.main.replace(\"#\", \"%23\") +\r\n            \"' points='1203 546 1552 900 1162 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.primary.dark.replace(\"#\", \"%23\") +\r\n            \"' points='641 695 886 900 367 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.primary.main.replace(\"#\", \"%23\") +\r\n            \"' points='587 900 641 695 886 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.secondary.light.replace(\"#\", \"%23\") +\r\n            \"' points='1710 900 1401 632 1096 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.secondary.dark.replace(\"#\", \"%23\") +\r\n            \"' points='1710 900 1401 632 1365 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.secondary.main.replace(\"#\", \"%23\") +\r\n            \"' points='1210 900 971 687 725 900'/%3E%3Cpolygon fill='\" +\r\n            theme.palette.secondary.dark.replace(\"#\", \"%23\") +\r\n            \"' points='943 900 1210 900 971 687'/%3E%3C/svg%3E\\\")\",\r\n        backgroundSize: \"cover\",\r\n        backgroundPosition: \"bottom\",\r\n    },\r\n    avatarContainer: {\r\n        height: \"80px\",\r\n        width: \"80px\",\r\n        borderRaidus: \"50%\",\r\n        margin: \"auto\",\r\n        marginTop: \"50px\",\r\n        boxShadow:\r\n            \"0 2px 5px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12)\",\r\n        border: \"2px solid #fff\",\r\n    },\r\n    nickName: {\r\n        width: \"200px\",\r\n        margin: \"auto\",\r\n        textAlign: \"center\",\r\n        marginTop: \"1px\",\r\n        fontSize: \"25px\",\r\n        color: \"#ffffff\",\r\n        opacity: \"0.81\",\r\n    },\r\n    th: {\r\n        minWidth: \"106px\",\r\n    },\r\n    mobileHide: {\r\n        [theme.breakpoints.down(\"md\")]: {\r\n            display: \"none\",\r\n        },\r\n    },\r\n    tableLink: {\r\n        cursor: \"pointer\",\r\n    },\r\n    navigator: {\r\n        padding: theme.spacing(2),\r\n    },\r\n    pageInfo: {\r\n        marginTop: \"14px\",\r\n        marginLeft: \"23px\",\r\n    },\r\n    infoItem: {\r\n        paddingLeft: \"46px!important\",\r\n        paddingBottom: \"20px!important\",\r\n    },\r\n    infoContainer: {\r\n        marginTop: \"30px\",\r\n    },\r\n    tableContainer: {\r\n        overflowX: \"auto\",\r\n    },\r\n});\r\nconst mapStateToProps = () => {\r\n    return {};\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n    return {\r\n        toggleSnackbar: (vertical, horizontal, msg, color) => {\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color));\r\n        },\r\n    };\r\n};\r\n\r\nclass ProfileCompoment extends Component {\r\n    state = {\r\n        listType: 0,\r\n        shareList: [],\r\n        page: 1,\r\n        user: null,\r\n        total: 0,\r\n    };\r\n\r\n    handleChange = (event, listType) => {\r\n        this.setState({ listType });\r\n        if (listType === 1) {\r\n            this.loadList(1, \"hot\");\r\n        } else if (listType === 0) {\r\n            this.loadList(1, \"default\");\r\n        }\r\n    };\r\n\r\n    componentDidMount = () => {\r\n        this.loadList(1, \"default\");\r\n    };\r\n\r\n    loadList = (page, order) => {\r\n        API.get(\r\n            \"/user/profile/\" +\r\n                this.props.match.params.id +\r\n                \"?page=\" +\r\n                page +\r\n                \"&type=\" +\r\n                order\r\n        )\r\n            .then((response) => {\r\n                this.setState({\r\n                    shareList: response.data.items,\r\n                    user: response.data.user,\r\n                    total: response.data.total,\r\n                });\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n            });\r\n    };\r\n\r\n    loadNext = () => {\r\n        this.loadList(\r\n            this.state.page + 1,\r\n            this.state.listType === 0 ? \"default\" : \"hot\"\r\n        );\r\n    };\r\n\r\n    loadPrev = () => {\r\n        this.loadList(\r\n            this.state.page - 1,\r\n            this.state.listType === 0 ? \"default\" : \"hot\"\r\n        );\r\n    };\r\n\r\n    render() {\r\n        const { classes, t } = this.props;\r\n\r\n        return (\r\n            <div className={classes.layout}>\r\n                {this.state.user === null && <div></div>}\r\n                {this.state.user !== null && (\r\n                    <Paper square>\r\n                        <div className={classes.userNav}>\r\n                            <div>\r\n                                <Avatar\r\n                                    className={classes.avatarContainer}\r\n                                    src={\r\n                                        \"/api/v3/user/avatar/\" +\r\n                                        this.state.user.id +\r\n                                        \"/l\"\r\n                                    }\r\n                                />\r\n                            </div>\r\n                            <div>\r\n                                <Typography className={classes.nickName} noWrap>\r\n                                    {this.state.user.nick}\r\n                                </Typography>\r\n                            </div>\r\n                        </div>\r\n                        <Tabs\r\n                            value={this.state.listType}\r\n                            indicatorColor=\"primary\"\r\n                            textColor=\"primary\"\r\n                            onChange={this.handleChange}\r\n                            centered\r\n                        >\r\n                            <Tab label={t(\"setting.allShares\")} />\r\n                            <Tab label={t(\"setting.trendingShares\")} />\r\n                            <Tab label={t(\"setting.profile\")} />\r\n                        </Tabs>\r\n                        {this.state.listType === 2 && (\r\n                            <div className={classes.infoContainer}>\r\n                                <Grid container spacing={24}>\r\n                                    <Grid\r\n                                        item\r\n                                        md={4}\r\n                                        xs={12}\r\n                                        className={classes.infoItem}\r\n                                    >\r\n                                        <Typography\r\n                                            color=\"textSecondary\"\r\n                                            variant=\"h6\"\r\n                                        >\r\n                                            {t(\"setting.uid\")}\r\n                                        </Typography>\r\n                                        <Typography>\r\n                                            {this.state.user.id}\r\n                                        </Typography>\r\n                                    </Grid>\r\n                                    <Grid\r\n                                        item\r\n                                        md={4}\r\n                                        xs={12}\r\n                                        className={classes.infoItem}\r\n                                    >\r\n                                        <Typography\r\n                                            color=\"textSecondary\"\r\n                                            variant=\"h6\"\r\n                                        >\r\n                                            {t(\"setting.nickname\")}\r\n                                        </Typography>\r\n                                        <Typography>\r\n                                            {this.state.user.nick}\r\n                                        </Typography>\r\n                                    </Grid>\r\n                                    <Grid\r\n                                        item\r\n                                        md={4}\r\n                                        xs={12}\r\n                                        className={classes.infoItem}\r\n                                    >\r\n                                        <Typography\r\n                                            color=\"textSecondary\"\r\n                                            variant=\"h6\"\r\n                                        >\r\n                                            {t(\"setting.group\")}\r\n                                        </Typography>\r\n                                        <Typography>\r\n                                            {this.state.user.group}\r\n                                        </Typography>\r\n                                    </Grid>\r\n                                    <Grid\r\n                                        item\r\n                                        md={4}\r\n                                        xs={12}\r\n                                        className={classes.infoItem}\r\n                                    >\r\n                                        <Typography\r\n                                            color=\"textSecondary\"\r\n                                            variant=\"h6\"\r\n                                        >\r\n                                            {t(\"setting.totalShares\")}\r\n                                        </Typography>\r\n                                        <Typography>\r\n                                            {this.state.total}\r\n                                        </Typography>\r\n                                    </Grid>\r\n                                    <Grid\r\n                                        item\r\n                                        md={4}\r\n                                        xs={12}\r\n                                        className={classes.infoItem}\r\n                                    >\r\n                                        <Typography\r\n                                            color=\"textSecondary\"\r\n                                            variant=\"h6\"\r\n                                        >\r\n                                            {t(\"setting.regTime\")}\r\n                                        </Typography>\r\n                                        <Typography>\r\n                                            {this.state.user.date}\r\n                                        </Typography>\r\n                                    </Grid>\r\n                                </Grid>\r\n                            </div>\r\n                        )}\r\n                        {(this.state.listType === 0 ||\r\n                            this.state.listType === 1) && (\r\n                            <div>\r\n                                <div className={classes.tableContainer}>\r\n                                    <Table className={classes.table}>\r\n                                        <TableHead>\r\n                                            <TableRow>\r\n                                                <TableCell>\r\n                                                    {t(\"setting.fileName\")}\r\n                                                </TableCell>\r\n                                                <TableCell\r\n                                                    className={\r\n                                                        classes.mobileHide\r\n                                                    }\r\n                                                >\r\n                                                    {t(\"setting.shareDate\")}\r\n                                                </TableCell>\r\n                                                <TableCell\r\n                                                    className={[\r\n                                                        classes.th,\r\n                                                        classes.mobileHide,\r\n                                                    ]}\r\n                                                >\r\n                                                    {t(\r\n                                                        \"setting.downloadNumber\"\r\n                                                    )}\r\n                                                </TableCell>\r\n                                                <TableCell\r\n                                                    className={[\r\n                                                        classes.th,\r\n                                                        classes.mobileHide,\r\n                                                    ]}\r\n                                                >\r\n                                                    {t(\"setting.viewNumber\")}\r\n                                                </TableCell>\r\n                                            </TableRow>\r\n                                        </TableHead>\r\n                                        <TableBody>\r\n                                            {this.state.shareList.map(\r\n                                                (row, id) => (\r\n                                                    <TableRow\r\n                                                        key={id}\r\n                                                        className={\r\n                                                            classes.tableLink\r\n                                                        }\r\n                                                        onClick={() =>\r\n                                                            this.props.history.push(\r\n                                                                \"/s/\" + row.key\r\n                                                            )\r\n                                                        }\r\n                                                    >\r\n                                                        <TableCell>\r\n                                                            <Typography>\r\n                                                                {row.source\r\n                                                                    ? row.source\r\n                                                                          .name\r\n                                                                    : \"[\" +\r\n                                                                      t(\r\n                                                                          \"share.expired\"\r\n                                                                      ) +\r\n                                                                      \"]\"}\r\n                                                            </Typography>\r\n                                                        </TableCell>\r\n                                                        <TableCell\r\n                                                            nowrap={\"nowrap\"}\r\n                                                            className={\r\n                                                                classes.mobileHide\r\n                                                            }\r\n                                                        >\r\n                                                            {formatLocalTime(\r\n                                                                row.create_date\r\n                                                            )}\r\n                                                        </TableCell>\r\n                                                        <TableCell\r\n                                                            className={\r\n                                                                classes.mobileHide\r\n                                                            }\r\n                                                        >\r\n                                                            {row.downloads}\r\n                                                        </TableCell>\r\n                                                        <TableCell\r\n                                                            className={\r\n                                                                classes.mobileHide\r\n                                                            }\r\n                                                        >\r\n                                                            {row.views}\r\n                                                        </TableCell>\r\n                                                    </TableRow>\r\n                                                )\r\n                                            )}\r\n                                        </TableBody>\r\n                                    </Table>\r\n                                </div>\r\n                                {this.state.shareList.length !== 0 &&\r\n                                    this.state.listType === 0 && (\r\n                                        <div className={classes.navigator}>\r\n                                            <Pagination\r\n                                                count={Math.ceil(\r\n                                                    this.state.total / 10\r\n                                                )}\r\n                                                onChange={(e, v) =>\r\n                                                    this.loadList(\r\n                                                        v,\r\n                                                        this.state.listType ===\r\n                                                            0\r\n                                                            ? \"default\"\r\n                                                            : \"hot\"\r\n                                                    )\r\n                                                }\r\n                                                color=\"secondary\"\r\n                                            />\r\n                                        </div>\r\n                                    )}\r\n                            </div>\r\n                        )}\r\n                    </Paper>\r\n                )}\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nconst Profile = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(withRouter(withTranslation()(ProfileCompoment))));\r\n\r\nexport default Profile;\r\n","import React, { useCallback, useState } from \"react\";\r\nimport {\r\n    Button,\r\n    Dialog,\r\n    DialogActions,\r\n    DialogContent,\r\n    DialogTitle,\r\n    Divider,\r\n    List,\r\n    ListItem,\r\n    ListItemIcon,\r\n    ListItemSecondaryAction,\r\n    ListItemText,\r\n    makeStyles,\r\n    Paper,\r\n    Typography,\r\n} from \"@material-ui/core\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport RightIcon from \"@material-ui/icons/KeyboardArrowRight\";\r\nimport { Add, Fingerprint, HighlightOff } from \"@material-ui/icons\";\r\nimport API from \"../../middleware/Api\";\r\nimport { bufferDecode, bufferEncode } from \"../../utils\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    sectionTitle: {\r\n        paddingBottom: \"10px\",\r\n        paddingTop: \"30px\",\r\n    },\r\n    rightIcon: {\r\n        marginTop: \"4px\",\r\n        marginRight: \"10px\",\r\n        color: theme.palette.text.secondary,\r\n    },\r\n    desenList: {\r\n        paddingTop: 0,\r\n        paddingBottom: 0,\r\n    },\r\n    iconFix: {\r\n        marginRight: \"11px\",\r\n        marginLeft: \"7px\",\r\n        minWidth: 40,\r\n    },\r\n    flexContainer: {\r\n        display: \"flex\",\r\n    },\r\n}));\r\n\r\nexport default function Authn(props) {\r\n    const { t } = useTranslation();\r\n    const [selected, setSelected] = useState(\"\");\r\n    const [confirm, setConfirm] = useState(false);\r\n    const dispatch = useDispatch();\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n\r\n    const deleteCredential = (id) => {\r\n        API.patch(\"/user/setting/authn\", {\r\n            id: id,\r\n        })\r\n            .then(() => {\r\n                ToggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    t(\"setting.authenticatorRemoved\"),\r\n                    \"success\"\r\n                );\r\n                props.remove(id);\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n            })\r\n            .then(() => {\r\n                setConfirm(false);\r\n            });\r\n    };\r\n\r\n    const classes = useStyles();\r\n\r\n    const addCredential = () => {\r\n        if (!navigator.credentials) {\r\n            ToggleSnackbar(\r\n                \"top\",\r\n                \"right\",\r\n                t(\"setting.browserNotSupported\"),\r\n                \"warning\"\r\n            );\r\n\r\n            return;\r\n        }\r\n        API.put(\"/user/authn\", {})\r\n            .then((response) => {\r\n                const credentialCreationOptions = response.data;\r\n                credentialCreationOptions.publicKey.challenge = bufferDecode(\r\n                    credentialCreationOptions.publicKey.challenge\r\n                );\r\n                credentialCreationOptions.publicKey.user.id = bufferDecode(\r\n                    credentialCreationOptions.publicKey.user.id\r\n                );\r\n                if (credentialCreationOptions.publicKey.excludeCredentials) {\r\n                    for (\r\n                        let i = 0;\r\n                        i <\r\n                        credentialCreationOptions.publicKey.excludeCredentials\r\n                            .length;\r\n                        i++\r\n                    ) {\r\n                        credentialCreationOptions.publicKey.excludeCredentials[\r\n                            i\r\n                        ].id = bufferDecode(\r\n                            credentialCreationOptions.publicKey\r\n                                .excludeCredentials[i].id\r\n                        );\r\n                    }\r\n                }\r\n\r\n                return navigator.credentials.create({\r\n                    publicKey: credentialCreationOptions.publicKey,\r\n                });\r\n            })\r\n            .then((credential) => {\r\n                const attestationObject = credential.response.attestationObject;\r\n                const clientDataJSON = credential.response.clientDataJSON;\r\n                const rawId = credential.rawId;\r\n                return API.put(\r\n                    \"/user/authn/finish\",\r\n                    JSON.stringify({\r\n                        id: credential.id,\r\n                        rawId: bufferEncode(rawId),\r\n                        type: credential.type,\r\n                        response: {\r\n                            attestationObject: bufferEncode(attestationObject),\r\n                            clientDataJSON: bufferEncode(clientDataJSON),\r\n                        },\r\n                    })\r\n                );\r\n            })\r\n            .then((response) => {\r\n                props.add(response.data);\r\n                ToggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    t(\"setting.authenticatorAdded\"),\r\n                    \"success\"\r\n                );\r\n                return;\r\n            })\r\n            .catch((error) => {\r\n                console.log(error);\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"error\");\r\n            });\r\n    };\r\n\r\n    return (\r\n        <div>\r\n            <Dialog open={confirm} onClose={() => setConfirm(false)}>\r\n                <DialogTitle>{t(\"setting.removedAuthenticator\")}</DialogTitle>\r\n                <DialogContent>\r\n                    {t(\"setting.removedAuthenticatorConfirm\")}\r\n                </DialogContent>\r\n                <DialogActions>\r\n                    <Button onClick={() => setConfirm(false)} color=\"default\">\r\n                        {t(\"cancel\", { ns: \"common\" })}\r\n                    </Button>\r\n                    <Button\r\n                        onClick={() => deleteCredential(selected)}\r\n                        color=\"primary\"\r\n                    >\r\n                        {t(\"ok\", { ns: \"common\" })}\r\n                    </Button>\r\n                </DialogActions>\r\n            </Dialog>\r\n\r\n            <Typography className={classes.sectionTitle} variant=\"subtitle2\">\r\n                {t(\"setting.hardwareAuthenticator\")}\r\n            </Typography>\r\n            <Paper>\r\n                <List className={classes.desenList}>\r\n                    {props.list.map((v) => (\r\n                        <>\r\n                            <ListItem\r\n                                button\r\n                                style={{\r\n                                    paddingRight: 60,\r\n                                }}\r\n                                onClick={() => {\r\n                                    setConfirm(true);\r\n                                    setSelected(v.id);\r\n                                }}\r\n                            >\r\n                                <ListItemIcon className={classes.iconFix}>\r\n                                    <Fingerprint />\r\n                                </ListItemIcon>\r\n                                <ListItemText primary={v.fingerprint} />\r\n\r\n                                <ListItemSecondaryAction\r\n                                    onClick={() => deleteCredential(v.id)}\r\n                                    className={classes.flexContainer}\r\n                                >\r\n                                    <HighlightOff\r\n                                        className={classes.rightIcon}\r\n                                    />\r\n                                </ListItemSecondaryAction>\r\n                            </ListItem>\r\n                            <Divider />\r\n                        </>\r\n                    ))}\r\n                    <ListItem button onClick={() => addCredential()}>\r\n                        <ListItemIcon className={classes.iconFix}>\r\n                            <Add />\r\n                        </ListItemIcon>\r\n                        <ListItemText\r\n                            primary={t(\"setting.addNewAuthenticator\")}\r\n                        />\r\n\r\n                        <ListItemSecondaryAction\r\n                            className={classes.flexContainer}\r\n                        >\r\n                            <RightIcon className={classes.rightIcon} />\r\n                        </ListItemSecondaryAction>\r\n                    </ListItem>\r\n                </List>\r\n            </Paper>\r\n        </div>\r\n    );\r\n}\r\n","import React, { useCallback, useState } from \"react\";\r\nimport {\r\n    Button,\r\n    CircularProgress,\r\n    Dialog,\r\n    DialogActions,\r\n    DialogContent,\r\n    DialogTitle,\r\n    makeStyles,\r\n} from \"@material-ui/core\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport TextField from \"@material-ui/core/TextField\";\r\nimport {\r\n    refreshTimeZone,\r\n    timeZone,\r\n    validateTimeZone,\r\n} from \"../../utils/datetime\";\r\nimport FormControl from \"@material-ui/core/FormControl\";\r\nimport Auth from \"../../middleware/Auth\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({}));\r\n\r\nexport default function TimeZoneDialog(props) {\r\n    const { t } = useTranslation();\r\n    const [timeZoneValue, setTimeZoneValue] = useState(timeZone);\r\n    const dispatch = useDispatch();\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n\r\n    const saveZoneInfo = () => {\r\n        if (!validateTimeZone(timeZoneValue)) {\r\n            ToggleSnackbar(\"top\", \"right\", \"无效的时区名称\", \"warning\");\r\n            return;\r\n        }\r\n        Auth.SetPreference(\"timeZone\", timeZoneValue);\r\n        refreshTimeZone();\r\n        props.onClose();\r\n    };\r\n\r\n    const classes = useStyles();\r\n\r\n    return (\r\n        <Dialog\r\n            open={props.open}\r\n            onClose={props.onClose}\r\n            aria-labelledby=\"form-dialog-title\"\r\n        >\r\n            <DialogTitle id=\"form-dialog-title\">\r\n                {t(\"setting.timeZone\")}\r\n            </DialogTitle>\r\n\r\n            <DialogContent>\r\n                <FormControl>\r\n                    <TextField\r\n                        label={t(\"setting.timeZoneCode\")}\r\n                        value={timeZoneValue}\r\n                        onChange={(e) => setTimeZoneValue(e.target.value)}\r\n                    />\r\n                </FormControl>\r\n            </DialogContent>\r\n\r\n            <DialogActions>\r\n                <Button onClick={props.onClose}>\r\n                    {t(\"cancel\", { ns: \"common\" })}\r\n                </Button>\r\n                <div className={classes.wrapper}>\r\n                    <Button\r\n                        color=\"primary\"\r\n                        disabled={timeZoneValue === \"\"}\r\n                        onClick={() => saveZoneInfo()}\r\n                    >\r\n                        {t(\"ok\", { ns: \"common\" })}\r\n                        {props.modalsLoading && (\r\n                            <CircularProgress\r\n                                size={24}\r\n                                className={classes.buttonProgress}\r\n                            />\r\n                        )}\r\n                    </Button>\r\n                </div>\r\n            </DialogActions>\r\n        </Dialog>\r\n    );\r\n}\r\n","import React, { Component } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport PhotoIcon from \"@material-ui/icons/InsertPhoto\";\r\nimport GroupIcon from \"@material-ui/icons/Group\";\r\nimport DateIcon from \"@material-ui/icons/DateRange\";\r\nimport EmailIcon from \"@material-ui/icons/Email\";\r\nimport HomeIcon from \"@material-ui/icons/Home\";\r\nimport LinkIcon from \"@material-ui/icons/Phonelink\";\r\nimport InputIcon from \"@material-ui/icons/Input\";\r\nimport SecurityIcon from \"@material-ui/icons/Security\";\r\nimport NickIcon from \"@material-ui/icons/PermContactCalendar\";\r\nimport LockIcon from \"@material-ui/icons/Lock\";\r\nimport VerifyIcon from \"@material-ui/icons/VpnKey\";\r\nimport ColorIcon from \"@material-ui/icons/Palette\";\r\nimport axios from \"axios\";\r\nimport FingerprintIcon from \"@material-ui/icons/Fingerprint\";\r\nimport ToggleButton from \"@material-ui/lab/ToggleButton\";\r\nimport ToggleButtonGroup from \"@material-ui/lab/ToggleButtonGroup\";\r\nimport RightIcon from \"@material-ui/icons/KeyboardArrowRight\";\r\nimport {\r\n    ListItemIcon,\r\n    withStyles,\r\n    Button,\r\n    Divider,\r\n    TextField,\r\n    Avatar,\r\n    Paper,\r\n    Typography,\r\n    List,\r\n    ListItem,\r\n    ListItemSecondaryAction,\r\n    ListItemText,\r\n    ListItemAvatar,\r\n    Dialog,\r\n    DialogActions,\r\n    DialogContent,\r\n    DialogTitle,\r\n    Switch,\r\n} from \"@material-ui/core\";\r\nimport { blue, green, yellow } from \"@material-ui/core/colors\";\r\nimport API from \"../../middleware/Api\";\r\nimport Auth from \"../../middleware/Auth\";\r\nimport { withRouter } from \"react-router\";\r\nimport QRCode from \"qrcode-react\";\r\nimport {\r\n    Brightness3,\r\n    GitHub,\r\n    Home,\r\n    ListAlt,\r\n    PermContactCalendar,\r\n    Schedule,\r\n    Translate,\r\n} from \"@material-ui/icons\";\r\nimport Authn from \"./Authn\";\r\nimport { formatLocalTime, timeZone } from \"../../utils/datetime\";\r\nimport TimeZoneDialog from \"../Modals/TimeZone\";\r\nimport {\r\n    applyThemes,\r\n    changeViewMethod,\r\n    toggleDaylightMode,\r\n    toggleSnackbar,\r\n} from \"../../redux/explorer\";\r\nimport { Trans, withTranslation } from \"react-i18next\";\r\nimport { selectLanguage } from \"../../redux/viewUpdate/action\";\r\nimport OptionSelector from \"../Modals/OptionSelector\";\r\n\r\nconst styles = (theme) => ({\r\n    layout: {\r\n        width: \"auto\",\r\n        marginLeft: theme.spacing(3),\r\n        marginRight: theme.spacing(3),\r\n        [theme.breakpoints.up(1100 + theme.spacing(3) * 2)]: {\r\n            width: 700,\r\n            marginLeft: \"auto\",\r\n            marginRight: \"auto\",\r\n        },\r\n    },\r\n    sectionTitle: {\r\n        paddingBottom: \"10px\",\r\n        paddingTop: \"30px\",\r\n    },\r\n    rightIcon: {\r\n        marginTop: \"4px\",\r\n        marginRight: \"10px\",\r\n        color: theme.palette.text.secondary,\r\n    },\r\n    uploadFromFile: {\r\n        backgroundColor: blue[100],\r\n        color: blue[600],\r\n    },\r\n    userGravatar: {\r\n        backgroundColor: yellow[100],\r\n        color: yellow[800],\r\n    },\r\n    policySelected: {\r\n        backgroundColor: green[100],\r\n        color: green[800],\r\n    },\r\n    infoText: {\r\n        marginRight: \"17px\",\r\n        [theme.breakpoints.down(\"xs\")]: {\r\n            maxWidth: 100,\r\n            textOverflow: \"ellipsis\",\r\n            whiteSpace: \"nowrap\",\r\n            overflow: \"hidden\",\r\n        },\r\n    },\r\n    infoTextWithIcon: {\r\n        marginRight: \"17px\",\r\n        marginTop: \"1px\",\r\n        [theme.breakpoints.down(\"xs\")]: {\r\n            maxWidth: 100,\r\n            textOverflow: \"ellipsis\",\r\n            whiteSpace: \"nowrap\",\r\n            overflow: \"hidden\",\r\n        },\r\n    },\r\n    rightIconWithText: {\r\n        marginTop: \"0px\",\r\n        marginRight: \"10px\",\r\n        color: theme.palette.text.secondary,\r\n    },\r\n    iconFix: {\r\n        marginRight: \"11px\",\r\n        marginLeft: \"7px\",\r\n        minWidth: 40,\r\n    },\r\n    flexContainer: {\r\n        display: \"flex\",\r\n    },\r\n    desenList: {\r\n        paddingTop: 0,\r\n        paddingBottom: 0,\r\n    },\r\n    flexContainerResponse: {\r\n        display: \"flex\",\r\n        [theme.breakpoints.down(\"sm\")]: {\r\n            display: \"initial\",\r\n        },\r\n    },\r\n    desText: {\r\n        marginTop: \"10px\",\r\n    },\r\n    secondColor: {\r\n        height: \"20px\",\r\n        width: \"20px\",\r\n        backgroundColor: theme.palette.secondary.main,\r\n        borderRadius: \"50%\",\r\n        marginRight: \"17px\",\r\n    },\r\n    firstColor: {\r\n        height: \"20px\",\r\n        width: \"20px\",\r\n        backgroundColor: theme.palette.primary.main,\r\n        borderRadius: \"50%\",\r\n        marginRight: \"6px\",\r\n    },\r\n    themeBlock: {\r\n        height: \"20px\",\r\n        width: \"20px\",\r\n    },\r\n    paddingBottom: {\r\n        marginBottom: \"30px\",\r\n    },\r\n    paddingText: {\r\n        paddingRight: theme.spacing(2),\r\n    },\r\n    qrcode: {\r\n        width: 128,\r\n        marginTop: 16,\r\n        marginRight: 16,\r\n    },\r\n});\r\n\r\nconst mapStateToProps = (state) => {\r\n    return {\r\n        title: state.siteConfig.title,\r\n        authn: state.siteConfig.authn,\r\n        viewMethod: state.viewUpdate.explorerViewMethod,\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n    return {\r\n        toggleSnackbar: (vertical, horizontal, msg, color) => {\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color));\r\n        },\r\n        applyThemes: (color) => {\r\n            dispatch(applyThemes(color));\r\n        },\r\n        toggleDaylightMode: () => {\r\n            dispatch(toggleDaylightMode());\r\n        },\r\n        changeView: (method) => {\r\n            dispatch(changeViewMethod(method));\r\n        },\r\n        selectLanguage: () => {\r\n            dispatch(selectLanguage());\r\n        },\r\n    };\r\n};\r\n\r\nclass UserSettingCompoment extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n        this.fileInput = React.createRef();\r\n    }\r\n\r\n    state = {\r\n        avatarModal: false,\r\n        nickModal: false,\r\n        changePassword: false,\r\n        loading: \"\",\r\n        oldPwd: \"\",\r\n        newPwd: \"\",\r\n        webdavPwd: \"\",\r\n        newPwdRepeat: \"\",\r\n        twoFactor: false,\r\n        authCode: \"\",\r\n        changeTheme: false,\r\n        chosenTheme: null,\r\n        showWebDavUrl: false,\r\n        showWebDavUserName: false,\r\n        changeWebDavPwd: false,\r\n        groupBackModal: false,\r\n        changePolicy: false,\r\n        changeTimeZone: false,\r\n        settings: {\r\n            uid: 0,\r\n            group_expires: 0,\r\n            policy: {\r\n                current: {\r\n                    name: \"-\",\r\n                    id: \"\",\r\n                },\r\n                options: [],\r\n            },\r\n            qq: \"\",\r\n            homepage: true,\r\n            two_factor: \"\",\r\n            two_fa_secret: \"\",\r\n            prefer_theme: \"\",\r\n            themes: {},\r\n            authn: [],\r\n        },\r\n    };\r\n\r\n    handleClose = () => {\r\n        this.setState({\r\n            avatarModal: false,\r\n            nickModal: false,\r\n            changePassword: false,\r\n            loading: \"\",\r\n            twoFactor: false,\r\n            changeTheme: false,\r\n            showWebDavUrl: false,\r\n            showWebDavUserName: false,\r\n            changeWebDavPwd: false,\r\n            groupBackModal: false,\r\n            changePolicy: false,\r\n        });\r\n    };\r\n\r\n    componentDidMount() {\r\n        this.loadSetting();\r\n    }\r\n\r\n    toggleViewMethod = () => {\r\n        const newMethod =\r\n            this.props.viewMethod === \"icon\"\r\n                ? \"list\"\r\n                : this.props.viewMethod === \"list\"\r\n                ? \"smallIcon\"\r\n                : \"icon\";\r\n        Auth.SetPreference(\"view_method\", newMethod);\r\n        this.props.changeView(newMethod);\r\n    };\r\n\r\n    loadSetting = () => {\r\n        API.get(\"/user/setting\")\r\n            .then((response) => {\r\n                const theme = JSON.parse(response.data.themes);\r\n                response.data.themes = theme;\r\n                this.setState({\r\n                    settings: response.data,\r\n                });\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n            });\r\n    };\r\n\r\n    useGravatar = () => {\r\n        this.setState({\r\n            loading: \"gravatar\",\r\n        });\r\n        API.put(\"/user/setting/avatar\")\r\n            .then(() => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    this.props.t(\"setting.avatarUpdated\"),\r\n                    \"success\"\r\n                );\r\n                this.setState({\r\n                    loading: \"\",\r\n                });\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n                this.setState({\r\n                    loading: \"\",\r\n                });\r\n            });\r\n    };\r\n\r\n    changeNick = () => {\r\n        this.setState({\r\n            loading: \"nick\",\r\n        });\r\n        API.patch(\"/user/setting/nick\", {\r\n            nick: this.state.nick,\r\n        })\r\n            .then(() => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    this.props.t(\"nickChanged\"),\r\n                    \"success\"\r\n                );\r\n                this.setState({\r\n                    loading: \"\",\r\n                });\r\n                this.handleClose();\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n                this.setState({\r\n                    loading: \"\",\r\n                });\r\n            });\r\n    };\r\n\r\n    uploadAvatar = () => {\r\n        this.setState({\r\n            loading: \"avatar\",\r\n        });\r\n        const formData = new FormData();\r\n        formData.append(\"avatar\", this.fileInput.current.files[0]);\r\n        API.post(\"/user/setting/avatar\", formData, {\r\n            headers: {\r\n                \"Content-Type\": \"multipart/form-data\",\r\n            },\r\n        })\r\n            .then(() => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    this.props.t(\"setting.avatarUpdated\"),\r\n                    \"success\"\r\n                );\r\n                this.setState({\r\n                    loading: \"\",\r\n                });\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n                this.setState({\r\n                    loading: \"\",\r\n                });\r\n            });\r\n    };\r\n\r\n    handleToggle = () => {\r\n        API.patch(\"/user/setting/homepage\", {\r\n            status: !this.state.settings.homepage,\r\n        })\r\n            .then(() => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    this.props.t(\"setting.settingSaved\"),\r\n                    \"success\"\r\n                );\r\n                this.setState({\r\n                    settings: {\r\n                        ...this.state.settings,\r\n                        homepage: !this.state.settings.homepage,\r\n                    },\r\n                });\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n            });\r\n    };\r\n\r\n    changhePwd = () => {\r\n        if (this.state.newPwd !== this.state.newPwdRepeat) {\r\n            this.props.toggleSnackbar(\r\n                \"top\",\r\n                \"right\",\r\n                this.props.t(\"login.passwordNotMatch\"),\r\n                \"warning\"\r\n            );\r\n            return;\r\n        }\r\n        this.setState({\r\n            loading: \"changePassword\",\r\n        });\r\n        API.patch(\"/user/setting/password\", {\r\n            old: this.state.oldPwd,\r\n            new: this.state.newPwd,\r\n        })\r\n            .then(() => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    this.props.t(\"login.passwordReset\"),\r\n                    \"success\"\r\n                );\r\n                this.setState({\r\n                    loading: \"\",\r\n                });\r\n                this.handleClose();\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n                this.setState({\r\n                    loading: \"\",\r\n                });\r\n            });\r\n    };\r\n\r\n    changeTheme = () => {\r\n        this.setState({\r\n            loading: \"changeTheme\",\r\n        });\r\n        API.patch(\"/user/setting/theme\", {\r\n            theme: this.state.chosenTheme,\r\n        })\r\n            .then(() => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    this.props.t(\"setting.themeColorChanged\"),\r\n                    \"success\"\r\n                );\r\n                this.props.applyThemes(this.state.chosenTheme);\r\n                this.setState({\r\n                    loading: \"\",\r\n                });\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n                this.setState({\r\n                    loading: \"\",\r\n                });\r\n            });\r\n    };\r\n\r\n    changheWebdavPwd = () => {\r\n        this.setState({\r\n            loading: \"changheWebdavPwd\",\r\n        });\r\n        axios\r\n            .post(\"/Member/setWebdavPwd\", {\r\n                pwd: this.state.webdavPwd,\r\n            })\r\n            .then((response) => {\r\n                if (response.data.error === \"1\") {\r\n                    this.props.toggleSnackbar(\r\n                        \"top\",\r\n                        \"right\",\r\n                        response.data.msg,\r\n                        \"error\"\r\n                    );\r\n                    this.setState({\r\n                        loading: \"\",\r\n                    });\r\n                } else {\r\n                    this.props.toggleSnackbar(\r\n                        \"top\",\r\n                        \"right\",\r\n                        response.data.msg,\r\n                        \"success\"\r\n                    );\r\n                    this.setState({\r\n                        loading: \"\",\r\n                        changeWebDavPwd: false,\r\n                    });\r\n                }\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n                this.setState({\r\n                    loading: \"\",\r\n                });\r\n            });\r\n    };\r\n\r\n    init2FA = () => {\r\n        if (this.state.settings.two_factor) {\r\n            this.setState({ twoFactor: true });\r\n            return;\r\n        }\r\n        API.get(\"/user/setting/2fa\")\r\n            .then((response) => {\r\n                this.setState({\r\n                    two_fa_secret: response.data,\r\n                    twoFactor: true,\r\n                });\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n            });\r\n    };\r\n\r\n    twoFactor = () => {\r\n        this.setState({\r\n            loading: \"twoFactor\",\r\n        });\r\n        API.patch(\"/user/setting/2fa\", {\r\n            code: this.state.authCode,\r\n        })\r\n            .then(() => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    this.props.t(\"setting.settingSaved\"),\r\n                    \"success\"\r\n                );\r\n                this.setState({\r\n                    loading: \"\",\r\n                    settings: {\r\n                        ...this.state.settings,\r\n                        two_factor: !this.state.settings.two_factor,\r\n                    },\r\n                });\r\n                this.handleClose();\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n                this.setState({\r\n                    loading: \"\",\r\n                });\r\n            });\r\n    };\r\n\r\n    handleChange = (name) => (event) => {\r\n        this.setState({ [name]: event.target.value });\r\n    };\r\n\r\n    handleAlignment = (event, chosenTheme) => this.setState({ chosenTheme });\r\n\r\n    toggleThemeMode = (current) => {\r\n        const newMode =\r\n            current === null ? \"light\" : current === \"light\" ? \"dark\" : null;\r\n        this.props.toggleDaylightMode();\r\n        Auth.SetPreference(\"theme_mode\", newMode);\r\n    };\r\n\r\n    render() {\r\n        const { classes, t } = this.props;\r\n        const user = Auth.GetUser();\r\n        const dark = Auth.GetPreference(\"theme_mode\");\r\n\r\n        return (\r\n            <div>\r\n                <div className={classes.layout}>\r\n                    <Typography\r\n                        className={classes.sectionTitle}\r\n                        variant=\"subtitle2\"\r\n                    >\r\n                        {t(\"setting.profile\")}\r\n                    </Typography>\r\n                    <Paper>\r\n                        <List className={classes.desenList}>\r\n                            <ListItem\r\n                                button\r\n                                onClick={() =>\r\n                                    this.setState({ avatarModal: true })\r\n                                }\r\n                            >\r\n                                <ListItemAvatar>\r\n                                    <Avatar\r\n                                        src={\r\n                                            \"/api/v3/user/avatar/\" +\r\n                                            user.id +\r\n                                            \"/l\"\r\n                                        }\r\n                                    />\r\n                                </ListItemAvatar>\r\n                                <ListItemText primary={t(\"setting.avatar\")} />\r\n                                <ListItemSecondaryAction>\r\n                                    <RightIcon className={classes.rightIcon} />\r\n                                </ListItemSecondaryAction>\r\n                            </ListItem>\r\n                            <Divider />\r\n                            <ListItem button>\r\n                                <ListItemIcon className={classes.iconFix}>\r\n                                    <PermContactCalendar />\r\n                                </ListItemIcon>\r\n                                <ListItemText primary={t(\"setting.uid\")} />\r\n\r\n                                <ListItemSecondaryAction>\r\n                                    <Typography\r\n                                        className={classes.infoTextWithIcon}\r\n                                        color=\"textSecondary\"\r\n                                    >\r\n                                        {this.state.settings.uid}\r\n                                    </Typography>\r\n                                </ListItemSecondaryAction>\r\n                            </ListItem>\r\n                            <Divider />\r\n                            <ListItem\r\n                                button\r\n                                onClick={() =>\r\n                                    this.setState({ nickModal: true })\r\n                                }\r\n                            >\r\n                                <ListItemIcon className={classes.iconFix}>\r\n                                    <NickIcon />\r\n                                </ListItemIcon>\r\n                                <ListItemText primary={t(\"setting.nickname\")} />\r\n\r\n                                <ListItemSecondaryAction\r\n                                    onClick={() =>\r\n                                        this.setState({ nickModal: true })\r\n                                    }\r\n                                    className={classes.flexContainer}\r\n                                >\r\n                                    <Typography\r\n                                        className={classes.infoTextWithIcon}\r\n                                        color=\"textSecondary\"\r\n                                    >\r\n                                        {user.nickname}\r\n                                    </Typography>\r\n                                    <RightIcon\r\n                                        className={classes.rightIconWithText}\r\n                                    />\r\n                                </ListItemSecondaryAction>\r\n                            </ListItem>\r\n                            <Divider />\r\n                            <ListItem button>\r\n                                <ListItemIcon className={classes.iconFix}>\r\n                                    <EmailIcon />\r\n                                </ListItemIcon>\r\n                                <ListItemText primary={t(\"login.email\")} />\r\n\r\n                                <ListItemSecondaryAction>\r\n                                    <Typography\r\n                                        className={classes.infoText}\r\n                                        color=\"textSecondary\"\r\n                                    >\r\n                                        {user.user_name}\r\n                                    </Typography>\r\n                                </ListItemSecondaryAction>\r\n                            </ListItem>\r\n                            <Divider />\r\n                            <ListItem button>\r\n                                <ListItemIcon className={classes.iconFix}>\r\n                                    <GroupIcon />\r\n                                </ListItemIcon>\r\n                                <ListItemText primary={t(\"setting.group\")} />\r\n\r\n                                <ListItemSecondaryAction>\r\n                                    <Typography\r\n                                        className={classes.infoText}\r\n                                        color=\"textSecondary\"\r\n                                    >\r\n                                        {user.group.name}\r\n                                    </Typography>\r\n                                </ListItemSecondaryAction>\r\n                            </ListItem>\r\n                            <Divider />\r\n                            <ListItem button>\r\n                                <ListItemIcon className={classes.iconFix}>\r\n                                    <DateIcon />\r\n                                </ListItemIcon>\r\n                                <ListItemText primary={t(\"setting.regTime\")} />\r\n\r\n                                <ListItemSecondaryAction>\r\n                                    <Typography\r\n                                        className={classes.infoText}\r\n                                        color=\"textSecondary\"\r\n                                    >\r\n                                        {formatLocalTime(user.created_at)}\r\n                                    </Typography>\r\n                                </ListItemSecondaryAction>\r\n                            </ListItem>\r\n                        </List>\r\n                    </Paper>\r\n                    <Typography\r\n                        className={classes.sectionTitle}\r\n                        variant=\"subtitle2\"\r\n                    >\r\n                        {t(\"setting.privacyAndSecurity\")}\r\n                    </Typography>\r\n                    <Paper>\r\n                        <List className={classes.desenList}>\r\n                            <ListItem button>\r\n                                <ListItemIcon className={classes.iconFix}>\r\n                                    <HomeIcon />\r\n                                </ListItemIcon>\r\n                                <ListItemText\r\n                                    primary={t(\"setting.profilePage\")}\r\n                                />\r\n\r\n                                <ListItemSecondaryAction>\r\n                                    <Switch\r\n                                        onChange={this.handleToggle}\r\n                                        checked={this.state.settings.homepage}\r\n                                    />\r\n                                </ListItemSecondaryAction>\r\n                            </ListItem>\r\n                            <Divider />\r\n                            <ListItem\r\n                                button\r\n                                onClick={() =>\r\n                                    this.setState({ changePassword: true })\r\n                                }\r\n                            >\r\n                                <ListItemIcon className={classes.iconFix}>\r\n                                    <LockIcon />\r\n                                </ListItemIcon>\r\n                                <ListItemText\r\n                                    primary={t(\"setting.accountPassword\")}\r\n                                />\r\n\r\n                                <ListItemSecondaryAction\r\n                                    className={classes.flexContainer}\r\n                                >\r\n                                    <RightIcon className={classes.rightIcon} />\r\n                                </ListItemSecondaryAction>\r\n                            </ListItem>\r\n                            <Divider />\r\n                            <ListItem button onClick={() => this.init2FA()}>\r\n                                <ListItemIcon className={classes.iconFix}>\r\n                                    <VerifyIcon />\r\n                                </ListItemIcon>\r\n                                <ListItemText primary={t(\"setting.2fa\")} />\r\n\r\n                                <ListItemSecondaryAction\r\n                                    className={classes.flexContainer}\r\n                                >\r\n                                    <Typography\r\n                                        className={classes.infoTextWithIcon}\r\n                                        color=\"textSecondary\"\r\n                                    >\r\n                                        {!this.state.settings.two_factor\r\n                                            ? t(\"setting.disabled\")\r\n                                            : t(\"setting.enabled\")}\r\n                                    </Typography>\r\n                                    <RightIcon\r\n                                        className={classes.rightIconWithText}\r\n                                    />\r\n                                </ListItemSecondaryAction>\r\n                            </ListItem>\r\n                        </List>\r\n                    </Paper>\r\n\r\n                    <Authn\r\n                        list={this.state.settings.authn}\r\n                        add={(credential) => {\r\n                            this.setState({\r\n                                settings: {\r\n                                    ...this.state.settings,\r\n                                    authn: [\r\n                                        ...this.state.settings.authn,\r\n                                        credential,\r\n                                    ],\r\n                                },\r\n                            });\r\n                        }}\r\n                        remove={(id) => {\r\n                            let credentials = [...this.state.settings.authn];\r\n                            credentials = credentials.filter((v) => {\r\n                                return v.id !== id;\r\n                            });\r\n                            this.setState({\r\n                                settings: {\r\n                                    ...this.state.settings,\r\n                                    authn: credentials,\r\n                                },\r\n                            });\r\n                        }}\r\n                    />\r\n\r\n                    <Typography\r\n                        className={classes.sectionTitle}\r\n                        variant=\"subtitle2\"\r\n                    >\r\n                        {t(\"setting.appearance\")}\r\n                    </Typography>\r\n                    <Paper>\r\n                        <List className={classes.desenList}>\r\n                            <ListItem\r\n                                button\r\n                                onClick={() =>\r\n                                    this.setState({ changeTheme: true })\r\n                                }\r\n                            >\r\n                                <ListItemIcon className={classes.iconFix}>\r\n                                    <ColorIcon />\r\n                                </ListItemIcon>\r\n                                <ListItemText\r\n                                    primary={t(\"setting.themeColor\")}\r\n                                />\r\n\r\n                                <ListItemSecondaryAction\r\n                                    className={classes.flexContainer}\r\n                                >\r\n                                    <div className={classes.firstColor} />\r\n                                    <div className={classes.secondColor} />\r\n                                </ListItemSecondaryAction>\r\n                            </ListItem>\r\n                            <Divider />\r\n                            <ListItem\r\n                                button\r\n                                onClick={() => this.toggleThemeMode(dark)}\r\n                            >\r\n                                <ListItemIcon className={classes.iconFix}>\r\n                                    <Brightness3 />\r\n                                </ListItemIcon>\r\n                                <ListItemText primary={t(\"setting.darkMode\")} />\r\n\r\n                                <ListItemSecondaryAction\r\n                                    className={classes.flexContainer}\r\n                                >\r\n                                    <Typography\r\n                                        className={classes.infoTextWithIcon}\r\n                                        color=\"textSecondary\"\r\n                                    >\r\n                                        {dark &&\r\n                                            (dark === \"dark\"\r\n                                                ? t(\"setting.enabled\")\r\n                                                : t(\"setting.disabled\"))}\r\n                                        {dark === null &&\r\n                                            t(\"setting.syncWithSystem\")}\r\n                                    </Typography>\r\n                                    <RightIcon\r\n                                        className={classes.rightIconWithText}\r\n                                    />\r\n                                </ListItemSecondaryAction>\r\n                            </ListItem>\r\n                            <Divider />\r\n                            <ListItem\r\n                                button\r\n                                onClick={() => this.toggleViewMethod()}\r\n                            >\r\n                                <ListItemIcon className={classes.iconFix}>\r\n                                    <ListAlt />\r\n                                </ListItemIcon>\r\n                                <ListItemText primary={t(\"setting.fileList\")} />\r\n\r\n                                <ListItemSecondaryAction\r\n                                    className={classes.flexContainer}\r\n                                >\r\n                                    <Typography\r\n                                        className={classes.infoTextWithIcon}\r\n                                        color=\"textSecondary\"\r\n                                    >\r\n                                        {this.props.viewMethod === \"icon\" &&\r\n                                            t(\"fileManager.gridViewLarge\")}\r\n                                        {this.props.viewMethod === \"list\" &&\r\n                                            t(\"fileManager.listView\")}\r\n                                        {this.props.viewMethod ===\r\n                                            \"smallIcon\" &&\r\n                                            t(\"fileManager.gridViewSmall\")}\r\n                                    </Typography>\r\n                                    <RightIcon\r\n                                        className={classes.rightIconWithText}\r\n                                    />\r\n                                </ListItemSecondaryAction>\r\n                            </ListItem>\r\n                            <Divider />\r\n                            <ListItem\r\n                                onClick={() =>\r\n                                    this.setState({ changeTimeZone: true })\r\n                                }\r\n                                button\r\n                            >\r\n                                <ListItemIcon className={classes.iconFix}>\r\n                                    <Schedule />\r\n                                </ListItemIcon>\r\n                                <ListItemText primary={t(\"setting.timeZone\")} />\r\n\r\n                                <ListItemSecondaryAction\r\n                                    className={classes.flexContainer}\r\n                                >\r\n                                    <Typography\r\n                                        className={classes.infoTextWithIcon}\r\n                                        color=\"textSecondary\"\r\n                                    >\r\n                                        {timeZone}\r\n                                    </Typography>\r\n                                    <RightIcon\r\n                                        className={classes.rightIconWithText}\r\n                                    />\r\n                                </ListItemSecondaryAction>\r\n                            </ListItem>\r\n                        </List>\r\n                    </Paper>\r\n                    {user.group.webdav && (\r\n                        <div>\r\n                            <Typography\r\n                                className={classes.sectionTitle}\r\n                                variant=\"subtitle2\"\r\n                            >\r\n                                WebDAV\r\n                            </Typography>\r\n                            <Paper>\r\n                                <List className={classes.desenList}>\r\n                                    <ListItem\r\n                                        button\r\n                                        onClick={() =>\r\n                                            this.setState({\r\n                                                showWebDavUrl: true,\r\n                                            })\r\n                                        }\r\n                                    >\r\n                                        <ListItemIcon\r\n                                            className={classes.iconFix}\r\n                                        >\r\n                                            <LinkIcon />\r\n                                        </ListItemIcon>\r\n                                        <ListItemText\r\n                                            primary={t(\"setting.webdavServer\")}\r\n                                        />\r\n\r\n                                        <ListItemSecondaryAction\r\n                                            className={classes.flexContainer}\r\n                                        >\r\n                                            <RightIcon\r\n                                                className={classes.rightIcon}\r\n                                            />\r\n                                        </ListItemSecondaryAction>\r\n                                    </ListItem>\r\n                                    <Divider />\r\n                                    <ListItem\r\n                                        button\r\n                                        onClick={() =>\r\n                                            this.setState({\r\n                                                showWebDavUserName: true,\r\n                                            })\r\n                                        }\r\n                                    >\r\n                                        <ListItemIcon\r\n                                            className={classes.iconFix}\r\n                                        >\r\n                                            <InputIcon />\r\n                                        </ListItemIcon>\r\n                                        <ListItemText\r\n                                            primary={t(\"setting.userName\")}\r\n                                        />\r\n\r\n                                        <ListItemSecondaryAction\r\n                                            className={classes.flexContainer}\r\n                                        >\r\n                                            <RightIcon\r\n                                                className={classes.rightIcon}\r\n                                            />\r\n                                        </ListItemSecondaryAction>\r\n                                    </ListItem>\r\n                                    <Divider />\r\n                                    <ListItem\r\n                                        button\r\n                                        onClick={() =>\r\n                                            this.props.history.push(\"/webdav?\")\r\n                                        }\r\n                                    >\r\n                                        <ListItemIcon\r\n                                            className={classes.iconFix}\r\n                                        >\r\n                                            <SecurityIcon />\r\n                                        </ListItemIcon>\r\n                                        <ListItemText\r\n                                            primary={t(\"setting.manageAccount\")}\r\n                                        />\r\n\r\n                                        <ListItemSecondaryAction\r\n                                            className={classes.flexContainer}\r\n                                        >\r\n                                            <RightIcon\r\n                                                className={classes.rightIcon}\r\n                                            />\r\n                                        </ListItemSecondaryAction>\r\n                                    </ListItem>\r\n                                </List>\r\n                            </Paper>\r\n                        </div>\r\n                    )}\r\n\r\n                    <Typography\r\n                        className={classes.sectionTitle}\r\n                        variant=\"subtitle2\"\r\n                    >\r\n                        关于 Cloudreve\r\n                    </Typography>\r\n                    <Paper>\r\n                        <List className={classes.desenList}>\r\n                            <ListItem\r\n                                button\r\n                                onClick={() =>\r\n                                    window.open(\r\n                                        \"https://github.com/cloudreve/cloudreve\"\r\n                                    )\r\n                                }\r\n                            >\r\n                                <ListItemIcon className={classes.iconFix}>\r\n                                    <GitHub />\r\n                                </ListItemIcon>\r\n                                <ListItemText primary=\"GitHub 仓库\" />\r\n\r\n                                <ListItemSecondaryAction\r\n                                    className={classes.flexContainer}\r\n                                >\r\n                                    <RightIcon\r\n                                        className={classes.rightIconWithText}\r\n                                    />\r\n                                </ListItemSecondaryAction>\r\n                            </ListItem>\r\n                            <Divider />\r\n                            <ListItem\r\n                                button\r\n                                onClick={() =>\r\n                                    window.open(\"https://cloudreve.org\")\r\n                                }\r\n                            >\r\n                                <ListItemIcon className={classes.iconFix}>\r\n                                    <Home />\r\n                                </ListItemIcon>\r\n                                <ListItemText primary=\"主页\" />\r\n\r\n                                <ListItemSecondaryAction\r\n                                    className={classes.flexContainer}\r\n                                >\r\n                                    <RightIcon\r\n                                        className={classes.rightIconWithText}\r\n                                    />\r\n                                </ListItemSecondaryAction>\r\n                            </ListItem>\r\n                            <Divider />\r\n                            <ListItem\r\n                                onClick={() => this.props.selectLanguage()}\r\n                                button\r\n                            >\r\n                                <ListItemIcon className={classes.iconFix}>\r\n                                    <Translate />\r\n                                </ListItemIcon>\r\n                                <ListItemText primary={t(\"setting.language\")} />\r\n\r\n                                <ListItemSecondaryAction\r\n                                    className={classes.flexContainer}\r\n                                >\r\n                                    <RightIcon\r\n                                        className={classes.rightIconWithText}\r\n                                    />\r\n                                </ListItemSecondaryAction>\r\n                            </ListItem>\r\n                        </List>\r\n                    </Paper>\r\n\r\n                    <div className={classes.paddingBottom} />\r\n                </div>\r\n                <TimeZoneDialog\r\n                    onClose={() => this.setState({ changeTimeZone: false })}\r\n                    open={this.state.changeTimeZone}\r\n                />\r\n                <Dialog\r\n                    open={this.state.avatarModal}\r\n                    onClose={this.handleClose}\r\n                >\r\n                    <DialogTitle>{t(\"setting.avatar\")}</DialogTitle>\r\n                    <List>\r\n                        <ListItem\r\n                            button\r\n                            component=\"label\"\r\n                            disabled={this.state.loading === \"avatar\"}\r\n                        >\r\n                            <input\r\n                                type=\"file\"\r\n                                accept=\"image/*\"\r\n                                style={{ display: \"none\" }}\r\n                                ref={this.fileInput}\r\n                                onChange={this.uploadAvatar}\r\n                            />\r\n                            <ListItemAvatar>\r\n                                <Avatar className={classes.uploadFromFile}>\r\n                                    <PhotoIcon />\r\n                                </Avatar>\r\n                            </ListItemAvatar>\r\n                            <ListItemText primary={t(\"setting.uploadImage\")} />\r\n                        </ListItem>\r\n                        <ListItem\r\n                            button\r\n                            onClick={this.useGravatar}\r\n                            disabled={this.state.loading === \"gravatar\"}\r\n                        >\r\n                            <ListItemAvatar>\r\n                                <Avatar className={classes.userGravatar}>\r\n                                    <FingerprintIcon />\r\n                                </Avatar>\r\n                            </ListItemAvatar>\r\n                            <ListItemText\r\n                                className={classes.paddingText}\r\n                                primary={t(\"setting.useGravatar\")}\r\n                            />\r\n                        </ListItem>\r\n                    </List>\r\n                    <DialogActions>\r\n                        <Button onClick={this.handleClose} color=\"primary\">\r\n                            {t(\"cancel\", { ns: \"common\" })}\r\n                        </Button>\r\n                    </DialogActions>\r\n                </Dialog>\r\n                <Dialog open={this.state.nickModal} onClose={this.handleClose}>\r\n                    <DialogTitle>{t(\"setting.changeNick\")}</DialogTitle>\r\n                    <DialogContent>\r\n                        <TextField\r\n                            id=\"standard-name\"\r\n                            label={t(\"setting.nickname\")}\r\n                            className={classes.textField}\r\n                            value={this.state.nick}\r\n                            onChange={this.handleChange(\"nick\")}\r\n                            margin=\"normal\"\r\n                            autoFocus\r\n                        />\r\n                    </DialogContent>\r\n                    <DialogActions>\r\n                        <Button onClick={this.handleClose} color=\"default\">\r\n                            {t(\"cancel\", { ns: \"common\" })}\r\n                        </Button>\r\n                        <Button\r\n                            onClick={this.changeNick}\r\n                            color=\"primary\"\r\n                            disabled={\r\n                                this.state.loading === \"nick\" ||\r\n                                this.state.nick === \"\"\r\n                            }\r\n                        >\r\n                            {t(\"ok\", { ns: \"common\" })}\r\n                        </Button>\r\n                    </DialogActions>\r\n                </Dialog>\r\n                <Dialog\r\n                    open={this.state.changePassword}\r\n                    onClose={this.handleClose}\r\n                >\r\n                    <DialogTitle>{t(\"login.resetPassword\")}</DialogTitle>\r\n                    <DialogContent>\r\n                        <div>\r\n                            <TextField\r\n                                id=\"standard-name\"\r\n                                label={t(\"setting.originalPassword\")}\r\n                                type=\"password\"\r\n                                className={classes.textField}\r\n                                value={this.state.oldPwd}\r\n                                onChange={this.handleChange(\"oldPwd\")}\r\n                                margin=\"normal\"\r\n                                autoFocus\r\n                            />\r\n                        </div>\r\n                        <div>\r\n                            <TextField\r\n                                id=\"standard-name\"\r\n                                label={t(\"login.newPassword\")}\r\n                                type=\"password\"\r\n                                className={classes.textField}\r\n                                value={this.state.newPwd}\r\n                                onChange={this.handleChange(\"newPwd\")}\r\n                                margin=\"normal\"\r\n                            />\r\n                        </div>\r\n                        <div>\r\n                            <TextField\r\n                                id=\"standard-name\"\r\n                                label={t(\"login.repeatNewPassword\")}\r\n                                type=\"password\"\r\n                                className={classes.textField}\r\n                                value={this.state.newPwdRepeat}\r\n                                onChange={this.handleChange(\"newPwdRepeat\")}\r\n                                margin=\"normal\"\r\n                            />\r\n                        </div>\r\n                    </DialogContent>\r\n                    <DialogActions>\r\n                        <Button onClick={this.handleClose} color=\"default\">\r\n                            {t(\"cancel\", { ns: \"common\" })}\r\n                        </Button>\r\n                        <Button\r\n                            onClick={this.changhePwd}\r\n                            color=\"primary\"\r\n                            disabled={\r\n                                this.state.loading === \"changePassword\" ||\r\n                                this.state.oldPwd === \"\" ||\r\n                                this.state.newPwdRepeat === \"\" ||\r\n                                this.state.newPwd === \"\"\r\n                            }\r\n                        >\r\n                            {t(\"ok\", { ns: \"common\" })}\r\n                        </Button>\r\n                    </DialogActions>\r\n                </Dialog>\r\n                <Dialog open={this.state.twoFactor} onClose={this.handleClose}>\r\n                    <DialogTitle>\r\n                        {this.state.settings.two_factor\r\n                            ? t(\"setting.disable2FA\")\r\n                            : t(\"setting.enable2FA\")}\r\n                    </DialogTitle>\r\n                    <DialogContent>\r\n                        <div className={classes.flexContainerResponse}>\r\n                            {!this.state.settings.two_factor && (\r\n                                <div className={classes.qrcode}>\r\n                                    <QRCode\r\n                                        value={\r\n                                            \"otpauth://totp/\" +\r\n                                            this.props.title +\r\n                                            \"?secret=\" +\r\n                                            this.state.two_fa_secret\r\n                                        }\r\n                                    />\r\n                                </div>\r\n                            )}\r\n\r\n                            <div className={classes.desText}>\r\n                                {!this.state.settings.two_factor && (\r\n                                    <Typography>\r\n                                        {t(\"setting.2faDescription\")}\r\n                                    </Typography>\r\n                                )}\r\n                                {this.state.settings.two_factor && (\r\n                                    <Typography>\r\n                                        {t(\"setting.inputCurrent2FACode\")}\r\n                                    </Typography>\r\n                                )}\r\n                                <TextField\r\n                                    id=\"standard-name\"\r\n                                    label={t(\"login.input2FACode\")}\r\n                                    type=\"number\"\r\n                                    className={classes.textField}\r\n                                    value={this.state.authCode}\r\n                                    onChange={this.handleChange(\"authCode\")}\r\n                                    margin=\"normal\"\r\n                                    autoFocus\r\n                                    fullWidth\r\n                                />\r\n                            </div>\r\n                        </div>\r\n                    </DialogContent>\r\n                    <DialogActions>\r\n                        <Button onClick={this.handleClose} color=\"default\">\r\n                            {t(\"cancel\", { ns: \"common\" })}\r\n                        </Button>\r\n                        <Button\r\n                            onClick={this.twoFactor}\r\n                            color=\"primary\"\r\n                            disabled={\r\n                                this.state.loading === \"twoFactor\" ||\r\n                                this.state.authCode === \"\"\r\n                            }\r\n                        >\r\n                            {this.state.settings.two_factor\r\n                                ? t(\"setting.disable2FA\")\r\n                                : t(\"setting.enable2FA\")}\r\n                        </Button>\r\n                    </DialogActions>\r\n                </Dialog>\r\n                <Dialog\r\n                    open={this.state.changeTheme}\r\n                    onClose={this.handleClose}\r\n                >\r\n                    <DialogTitle>{t(\"setting.themeColor\")}</DialogTitle>\r\n                    <DialogContent>\r\n                        <ToggleButtonGroup\r\n                            value={this.state.chosenTheme}\r\n                            exclusive\r\n                            onChange={this.handleAlignment}\r\n                        >\r\n                            {Object.keys(this.state.settings.themes).map(\r\n                                (value, key) => (\r\n                                    <ToggleButton value={value} key={key}>\r\n                                        <div\r\n                                            className={classes.themeBlock}\r\n                                            style={{ backgroundColor: value }}\r\n                                        />\r\n                                    </ToggleButton>\r\n                                )\r\n                            )}\r\n                        </ToggleButtonGroup>\r\n                    </DialogContent>\r\n                    <DialogActions>\r\n                        <Button onClick={this.handleClose} color=\"default\">\r\n                            {t(\"cancel\", { ns: \"common\" })}\r\n                        </Button>\r\n                        <Button\r\n                            onClick={this.changeTheme}\r\n                            color=\"primary\"\r\n                            disabled={\r\n                                this.state.loading === \"changeTheme\" ||\r\n                                this.state.chosenTheme === null\r\n                            }\r\n                        >\r\n                            {t(\"ok\", { ns: \"common\" })}\r\n                        </Button>\r\n                    </DialogActions>\r\n                </Dialog>\r\n                <Dialog\r\n                    open={this.state.showWebDavUrl}\r\n                    onClose={this.handleClose}\r\n                >\r\n                    <DialogTitle>{t(\"setting.webdavServer\")}</DialogTitle>\r\n                    <DialogContent>\r\n                        <TextField\r\n                            id=\"standard-name\"\r\n                            className={classes.textField}\r\n                            value={window.location.origin + \"/dav\"}\r\n                            margin=\"normal\"\r\n                            autoFocus\r\n                        />\r\n                    </DialogContent>\r\n                    <DialogActions>\r\n                        <Button onClick={this.handleClose} color=\"default\">\r\n                            {t(\"close\", { ns: \"common\" })}\r\n                        </Button>\r\n                    </DialogActions>\r\n                </Dialog>\r\n                <Dialog\r\n                    open={this.state.showWebDavUserName}\r\n                    onClose={this.handleClose}\r\n                >\r\n                    <DialogTitle>{t(\"setting.userName\")}</DialogTitle>\r\n                    <DialogContent>\r\n                        <TextField\r\n                            id=\"standard-name\"\r\n                            className={classes.textField}\r\n                            value={user.user_name}\r\n                            margin=\"normal\"\r\n                            autoFocus\r\n                        />\r\n                    </DialogContent>\r\n                    <DialogActions>\r\n                        <Button onClick={this.handleClose} color=\"default\">\r\n                            {t(\"close\", { ns: \"common\" })}\r\n                        </Button>\r\n                    </DialogActions>\r\n                </Dialog>\r\n                <OptionSelector />\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nconst UserSetting = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(withRouter(withTranslation()(UserSettingCompoment))));\r\n\r\nexport default UserSetting;\r\n","import React, { useCallback, useState } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport RegIcon from \"@material-ui/icons/AssignmentIndOutlined\";\r\nimport {\r\n    Avatar,\r\n    Button,\r\n    Divider,\r\n    FormControl,\r\n    Input,\r\n    InputLabel,\r\n    Link,\r\n    makeStyles,\r\n    Paper,\r\n    Typography,\r\n} from \"@material-ui/core\";\r\nimport { Link as RouterLink, useHistory } from \"react-router-dom\";\r\nimport API from \"../../middleware/Api\";\r\nimport EmailIcon from \"@material-ui/icons/EmailOutlined\";\r\nimport { useCaptcha } from \"../../hooks/useCaptcha\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    layout: {\r\n        width: \"auto\",\r\n        marginTop: \"110px\",\r\n        marginLeft: theme.spacing(3),\r\n        marginRight: theme.spacing(3),\r\n        [theme.breakpoints.up(\"sm\")]: {\r\n            width: 400,\r\n            marginLeft: \"auto\",\r\n            marginRight: \"auto\",\r\n        },\r\n        marginBottom: 110,\r\n    },\r\n    paper: {\r\n        marginTop: theme.spacing(8),\r\n        display: \"flex\",\r\n        flexDirection: \"column\",\r\n        alignItems: \"center\",\r\n        padding: `${theme.spacing(2)}px ${theme.spacing(3)}px ${theme.spacing(\r\n            3\r\n        )}px`,\r\n    },\r\n    avatar: {\r\n        margin: theme.spacing(1),\r\n        backgroundColor: theme.palette.secondary.main,\r\n    },\r\n    form: {\r\n        width: \"100%\", // Fix IE 11 issue.\r\n        marginTop: theme.spacing(1),\r\n    },\r\n    submit: {\r\n        marginTop: theme.spacing(3),\r\n    },\r\n    link: {\r\n        marginTop: \"20px\",\r\n        display: \"flex\",\r\n        width: \"100%\",\r\n        justifyContent: \"space-between\",\r\n    },\r\n    buttonContainer: {\r\n        display: \"flex\",\r\n    },\r\n    authnLink: {\r\n        textAlign: \"center\",\r\n        marginTop: 16,\r\n    },\r\n    avatarSuccess: {\r\n        margin: theme.spacing(1),\r\n        backgroundColor: theme.palette.primary.main,\r\n    },\r\n}));\r\n\r\nfunction Register() {\r\n    const { t } = useTranslation();\r\n\r\n    const [input, setInput] = useState({\r\n        email: \"\",\r\n        password: \"\",\r\n        password_repeat: \"\",\r\n    });\r\n    const [loading, setLoading] = useState(false);\r\n    const [emailActive, setEmailActive] = useState(false);\r\n\r\n    const title = useSelector((state) => state.siteConfig.title);\r\n    const regCaptcha = useSelector((state) => state.siteConfig.regCaptcha);\r\n\r\n    const dispatch = useDispatch();\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n    const history = useHistory();\r\n\r\n    const handleInputChange = (name) => (e) => {\r\n        setInput({\r\n            ...input,\r\n            [name]: e.target.value,\r\n        });\r\n    };\r\n\r\n    const {\r\n        captchaLoading,\r\n        isValidate,\r\n        validate,\r\n        CaptchaRender,\r\n        captchaRefreshRef,\r\n        captchaParamsRef,\r\n    } = useCaptcha();\r\n    const classes = useStyles();\r\n\r\n    const register = (e) => {\r\n        e.preventDefault();\r\n\r\n        if (input.password !== input.password_repeat) {\r\n            ToggleSnackbar(\r\n                \"top\",\r\n                \"right\",\r\n                t(\"login.passwordNotMatch\"),\r\n                \"warning\"\r\n            );\r\n            return;\r\n        }\r\n\r\n        setLoading(true);\r\n        if (!isValidate.current.isValidate && regCaptcha) {\r\n            validate(() => register(e), setLoading);\r\n            return;\r\n        }\r\n        API.post(\"/user\", {\r\n            userName: input.email,\r\n            Password: input.password,\r\n            ...captchaParamsRef.current,\r\n        })\r\n            .then((response) => {\r\n                setLoading(false);\r\n                if (response.rawData.code === 203) {\r\n                    setEmailActive(true);\r\n                } else {\r\n                    history.push(\"/login?username=\" + input.email);\r\n                    ToggleSnackbar(\r\n                        \"top\",\r\n                        \"right\",\r\n                        t(\"login.signUpSuccess\"),\r\n                        \"success\"\r\n                    );\r\n                }\r\n            })\r\n            .catch((error) => {\r\n                setLoading(false);\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"warning\");\r\n                captchaRefreshRef.current();\r\n            });\r\n    };\r\n\r\n    return (\r\n        <div className={classes.layout}>\r\n            <>\r\n                {!emailActive && (\r\n                    <Paper className={classes.paper}>\r\n                        <Avatar className={classes.avatar}>\r\n                            <RegIcon />\r\n                        </Avatar>\r\n                        <Typography component=\"h1\" variant=\"h5\">\r\n                            {t(\"login.sinUpTitle\", { title })}\r\n                        </Typography>\r\n\r\n                        <form className={classes.form} onSubmit={register}>\r\n                            <FormControl margin=\"normal\" required fullWidth>\r\n                                <InputLabel htmlFor=\"email\">\r\n                                    {t(\"login.email\")}\r\n                                </InputLabel>\r\n                                <Input\r\n                                    id=\"email\"\r\n                                    type=\"email\"\r\n                                    name=\"email\"\r\n                                    onChange={handleInputChange(\"email\")}\r\n                                    autoComplete\r\n                                    value={input.email}\r\n                                    autoFocus\r\n                                />\r\n                            </FormControl>\r\n                            <FormControl margin=\"normal\" required fullWidth>\r\n                                <InputLabel htmlFor=\"password\">\r\n                                    {t(\"login.password\")}\r\n                                </InputLabel>\r\n                                <Input\r\n                                    name=\"password\"\r\n                                    onChange={handleInputChange(\"password\")}\r\n                                    type=\"password\"\r\n                                    id=\"password\"\r\n                                    value={input.password}\r\n                                    autoComplete\r\n                                />\r\n                            </FormControl>\r\n                            <FormControl margin=\"normal\" required fullWidth>\r\n                                <InputLabel htmlFor=\"password\">\r\n                                    {t(\"login.repeatPassword\")}\r\n                                </InputLabel>\r\n                                <Input\r\n                                    name=\"pwdRepeat\"\r\n                                    onChange={handleInputChange(\r\n                                        \"password_repeat\"\r\n                                    )}\r\n                                    type=\"password\"\r\n                                    id=\"pwdRepeat\"\r\n                                    value={input.password_repeat}\r\n                                    autoComplete\r\n                                />\r\n                            </FormControl>\r\n                            {regCaptcha && <CaptchaRender />}\r\n\r\n                            <Button\r\n                                type=\"submit\"\r\n                                fullWidth\r\n                                variant=\"contained\"\r\n                                color=\"primary\"\r\n                                disabled={\r\n                                    loading ||\r\n                                    (regCaptcha ? captchaLoading : false)\r\n                                }\r\n                                className={classes.submit}\r\n                            >\r\n                                {t(\"login.signUp\")}\r\n                            </Button>\r\n                        </form>\r\n\r\n                        <Divider />\r\n                        <div className={classes.link}>\r\n                            <div>\r\n                                <Link component={RouterLink} to={\"/login\"}>\r\n                                    {t(\"login.backToSingIn\")}\r\n                                </Link>\r\n                            </div>\r\n                            <div>\r\n                                <Link component={RouterLink} to={\"/forget\"}>\r\n                                    {t(\"login.forgetPassword\")}\r\n                                </Link>\r\n                            </div>\r\n                        </div>\r\n                    </Paper>\r\n                )}\r\n                {emailActive && (\r\n                    <Paper className={classes.paper}>\r\n                        <Avatar className={classes.avatarSuccess}>\r\n                            <EmailIcon />\r\n                        </Avatar>\r\n                        <Typography component=\"h1\" variant=\"h5\">\r\n                            {t(\"login.activateTitle\")}\r\n                        </Typography>\r\n                        <Typography style={{ marginTop: \"10px\" }}>\r\n                            {t(\"login.activateDescription\")}\r\n                        </Typography>\r\n                    </Paper>\r\n                )}\r\n            </>\r\n        </div>\r\n    );\r\n}\r\n\r\nexport default Register;\r\n","import React, { useCallback, useEffect, useState } from \"react\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport {\r\n    Avatar,\r\n    Button,\r\n    makeStyles,\r\n    Paper,\r\n    Typography,\r\n} from \"@material-ui/core\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport API from \"../../middleware/Api\";\r\nimport EmailIcon from \"@material-ui/icons/EmailOutlined\";\r\nimport { useLocation } from \"react-router\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    layout: {\r\n        width: \"auto\",\r\n        marginTop: \"110px\",\r\n        marginLeft: theme.spacing(3),\r\n        marginRight: theme.spacing(3),\r\n        [theme.breakpoints.up(\"sm\")]: {\r\n            width: 400,\r\n            marginLeft: \"auto\",\r\n            marginRight: \"auto\",\r\n        },\r\n        marginBottom: 110,\r\n    },\r\n    paper: {\r\n        marginTop: theme.spacing(8),\r\n        display: \"flex\",\r\n        flexDirection: \"column\",\r\n        alignItems: \"center\",\r\n        padding: `${theme.spacing(2)}px ${theme.spacing(3)}px ${theme.spacing(\r\n            3\r\n        )}px`,\r\n    },\r\n    avatar: {\r\n        margin: theme.spacing(1),\r\n        backgroundColor: theme.palette.secondary.main,\r\n    },\r\n    submit: {\r\n        marginTop: theme.spacing(3),\r\n    },\r\n}));\r\n\r\nfunction useQuery() {\r\n    return new URLSearchParams(useLocation().search);\r\n}\r\n\r\nfunction Activation() {\r\n    const { t } = useTranslation();\r\n    const query = useQuery();\r\n    const location = useLocation();\r\n\r\n    const [success, setSuccess] = useState(false);\r\n    const [email, setEmail] = useState(\"\");\r\n\r\n    const dispatch = useDispatch();\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n    const history = useHistory();\r\n\r\n    const classes = useStyles();\r\n\r\n    useEffect(() => {\r\n        API.get(\r\n            \"/user/activate/\" + query.get(\"id\") + \"?sign=\" + query.get(\"sign\")\r\n        )\r\n            .then((response) => {\r\n                setEmail(response.data);\r\n                setSuccess(true);\r\n            })\r\n            .catch((error) => {\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"warning\");\r\n                history.push(\"/login\");\r\n            });\r\n        // eslint-disable-next-line\r\n    }, [location]);\r\n\r\n    return (\r\n        <div className={classes.layout}>\r\n            {success && (\r\n                <Paper className={classes.paper}>\r\n                    <Avatar className={classes.avatar}>\r\n                        <EmailIcon />\r\n                    </Avatar>\r\n                    <Typography component=\"h1\" variant=\"h5\">\r\n                        {t(\"login.activateSuccess\")}\r\n                    </Typography>\r\n                    <Typography style={{ marginTop: \"20px\" }}>\r\n                        {t(\"login.accountActivated\")}\r\n                    </Typography>\r\n                    <Button\r\n                        type=\"submit\"\r\n                        fullWidth\r\n                        variant=\"contained\"\r\n                        color=\"primary\"\r\n                        className={classes.submit}\r\n                        onClick={() => history.push(\"/login?username=\" + email)}\r\n                    >\r\n                        {t(\"login.backToSingIn\")}\r\n                    </Button>\r\n                </Paper>\r\n            )}\r\n        </div>\r\n    );\r\n}\r\n\r\nexport default Activation;\r\n","import React, { useCallback, useState } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport {\r\n    Avatar,\r\n    Button,\r\n    Divider,\r\n    FormControl,\r\n    Input,\r\n    InputLabel,\r\n    Link,\r\n    makeStyles,\r\n    Paper,\r\n    Typography,\r\n} from \"@material-ui/core\";\r\nimport { Link as RouterLink, useHistory } from \"react-router-dom\";\r\nimport API from \"../../middleware/Api\";\r\nimport { useLocation } from \"react-router\";\r\nimport KeyIcon from \"@material-ui/icons/VpnKeyOutlined\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    layout: {\r\n        width: \"auto\",\r\n        marginTop: \"110px\",\r\n        marginLeft: theme.spacing(3),\r\n        marginRight: theme.spacing(3),\r\n        [theme.breakpoints.up(\"sm\")]: {\r\n            width: 400,\r\n            marginLeft: \"auto\",\r\n            marginRight: \"auto\",\r\n        },\r\n        marginBottom: 110,\r\n    },\r\n    paper: {\r\n        marginTop: theme.spacing(8),\r\n        display: \"flex\",\r\n        flexDirection: \"column\",\r\n        alignItems: \"center\",\r\n        padding: `${theme.spacing(2)}px ${theme.spacing(3)}px ${theme.spacing(\r\n            3\r\n        )}px`,\r\n    },\r\n    avatar: {\r\n        margin: theme.spacing(1),\r\n        backgroundColor: theme.palette.secondary.main,\r\n    },\r\n    submit: {\r\n        marginTop: theme.spacing(3),\r\n    },\r\n    link: {\r\n        marginTop: \"20px\",\r\n        display: \"flex\",\r\n        width: \"100%\",\r\n        justifyContent: \"space-between\",\r\n    },\r\n}));\r\n\r\nfunction useQuery() {\r\n    return new URLSearchParams(useLocation().search);\r\n}\r\n\r\nfunction ResetForm() {\r\n    const { t } = useTranslation();\r\n    const query = useQuery();\r\n    const [input, setInput] = useState({\r\n        password: \"\",\r\n        password_repeat: \"\",\r\n    });\r\n    const [loading, setLoading] = useState(false);\r\n    const registerEnabled = useSelector(\r\n        (state) => state.siteConfig.registerEnabled\r\n    );\r\n    const handleInputChange = (name) => (e) => {\r\n        setInput({\r\n            ...input,\r\n            [name]: e.target.value,\r\n        });\r\n    };\r\n    const dispatch = useDispatch();\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n    const history = useHistory();\r\n\r\n    const submit = (e) => {\r\n        e.preventDefault();\r\n        if (input.password !== input.password_repeat) {\r\n            ToggleSnackbar(\r\n                \"top\",\r\n                \"right\",\r\n                t(\"login.passwordNotMatch\"),\r\n                \"warning\"\r\n            );\r\n            return;\r\n        }\r\n        setLoading(true);\r\n        API.patch(\"/user/reset\", {\r\n            secret: query.get(\"sign\"),\r\n            id: query.get(\"id\"),\r\n            Password: input.password,\r\n        })\r\n            .then(() => {\r\n                setLoading(false);\r\n                history.push(\"/login\");\r\n                ToggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    t(\"login.passwordReset\"),\r\n                    \"success\"\r\n                );\r\n            })\r\n            .catch((error) => {\r\n                setLoading(false);\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"warning\");\r\n            });\r\n    };\r\n\r\n    const classes = useStyles();\r\n\r\n    return (\r\n        <div className={classes.layout}>\r\n            <Paper className={classes.paper}>\r\n                <Avatar className={classes.avatar}>\r\n                    <KeyIcon />\r\n                </Avatar>\r\n                <Typography component=\"h1\" variant=\"h5\">\r\n                    {t(\"login.findMyPassword\")}\r\n                </Typography>\r\n                <form className={classes.form} onSubmit={submit}>\r\n                    <FormControl margin=\"normal\" required fullWidth>\r\n                        <InputLabel htmlFor=\"email\">\r\n                            {t(\"login.newPassword\")}\r\n                        </InputLabel>\r\n                        <Input\r\n                            id=\"pwd\"\r\n                            type=\"password\"\r\n                            name=\"pwd\"\r\n                            onChange={handleInputChange(\"password\")}\r\n                            autoComplete\r\n                            value={input.password}\r\n                            autoFocus\r\n                        />\r\n                    </FormControl>\r\n                    <FormControl margin=\"normal\" required fullWidth>\r\n                        <InputLabel htmlFor=\"email\">\r\n                            {t(\"login.repeatNewPassword\")}\r\n                        </InputLabel>\r\n                        <Input\r\n                            id=\"pwdRepeat\"\r\n                            type=\"password\"\r\n                            name=\"pwdRepeat\"\r\n                            onChange={handleInputChange(\"password_repeat\")}\r\n                            autoComplete\r\n                            value={input.password_repeat}\r\n                            autoFocus\r\n                        />\r\n                    </FormControl>\r\n                    <Button\r\n                        type=\"submit\"\r\n                        fullWidth\r\n                        variant=\"contained\"\r\n                        color=\"primary\"\r\n                        disabled={loading}\r\n                        className={classes.submit}\r\n                    >\r\n                        {t(\"login.resetPassword\")}\r\n                    </Button>{\" \"}\r\n                </form>{\" \"}\r\n                <Divider />\r\n                <div className={classes.link}>\r\n                    <div>\r\n                        <Link component={RouterLink} to={\"/login\"}>\r\n                            {t(\"login.backToSingIn\")}\r\n                        </Link>\r\n                    </div>\r\n                    <div>\r\n                        {registerEnabled && (\r\n                            <Link component={RouterLink} to={\"/signup\"}>\r\n                                {t(\"login.signUpAccount\")}\r\n                            </Link>\r\n                        )}\r\n                    </div>\r\n                </div>\r\n            </Paper>\r\n        </div>\r\n    );\r\n}\r\n\r\nexport default ResetForm;\r\n","import React, { useCallback, useState } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport {\r\n    Avatar,\r\n    Button,\r\n    Divider,\r\n    FormControl,\r\n    Input,\r\n    InputLabel,\r\n    Link,\r\n    makeStyles,\r\n    Paper,\r\n    Typography,\r\n} from \"@material-ui/core\";\r\nimport API from \"../../middleware/Api\";\r\nimport KeyIcon from \"@material-ui/icons/VpnKeyOutlined\";\r\nimport { useCaptcha } from \"../../hooks/useCaptcha\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Link as RouterLink } from \"react-router-dom\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    layout: {\r\n        width: \"auto\",\r\n        marginTop: \"110px\",\r\n        marginLeft: theme.spacing(3),\r\n        marginRight: theme.spacing(3),\r\n        [theme.breakpoints.up(\"sm\")]: {\r\n            width: 400,\r\n            marginLeft: \"auto\",\r\n            marginRight: \"auto\",\r\n        },\r\n        marginBottom: 110,\r\n    },\r\n    paper: {\r\n        marginTop: theme.spacing(8),\r\n        display: \"flex\",\r\n        flexDirection: \"column\",\r\n        alignItems: \"center\",\r\n        padding: `${theme.spacing(2)}px ${theme.spacing(3)}px ${theme.spacing(\r\n            3\r\n        )}px`,\r\n    },\r\n    avatar: {\r\n        margin: theme.spacing(1),\r\n        backgroundColor: theme.palette.secondary.main,\r\n    },\r\n    submit: {\r\n        marginTop: theme.spacing(3),\r\n    },\r\n    link: {\r\n        marginTop: \"20px\",\r\n        display: \"flex\",\r\n        width: \"100%\",\r\n        justifyContent: \"space-between\",\r\n    },\r\n}));\r\n\r\nfunction Reset() {\r\n    const { t } = useTranslation();\r\n\r\n    const [input, setInput] = useState({\r\n        email: \"\",\r\n    });\r\n    const [loading, setLoading] = useState(false);\r\n    const forgetCaptcha = useSelector(\r\n        (state) => state.siteConfig.forgetCaptcha\r\n    );\r\n    const registerEnabled = useSelector(\r\n        (state) => state.siteConfig.registerEnabled\r\n    );\r\n    const dispatch = useDispatch();\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n    const handleInputChange = (name) => (e) => {\r\n        setInput({\r\n            ...input,\r\n            [name]: e.target.value,\r\n        });\r\n    };\r\n\r\n    const {\r\n        captchaLoading,\r\n        isValidate,\r\n        validate,\r\n        CaptchaRender,\r\n        captchaRefreshRef,\r\n        captchaParamsRef,\r\n    } = useCaptcha();\r\n\r\n    const submit = (e) => {\r\n        e.preventDefault();\r\n        setLoading(true);\r\n        if (!isValidate.current.isValidate && forgetCaptcha) {\r\n            validate(() => submit(e), setLoading);\r\n            return;\r\n        }\r\n        API.post(\"/user/reset\", {\r\n            userName: input.email,\r\n            ...captchaParamsRef.current,\r\n        })\r\n            .then(() => {\r\n                setLoading(false);\r\n                ToggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    t(\"login.resetEmailSent\"),\r\n                    \"success\"\r\n                );\r\n            })\r\n            .catch((error) => {\r\n                setLoading(false);\r\n                ToggleSnackbar(\"top\", \"right\", error.message, \"warning\");\r\n                captchaRefreshRef.current();\r\n            });\r\n    };\r\n\r\n    const classes = useStyles();\r\n\r\n    return (\r\n        <div className={classes.layout}>\r\n            <Paper className={classes.paper}>\r\n                <Avatar className={classes.avatar}>\r\n                    <KeyIcon />\r\n                </Avatar>\r\n                <Typography component=\"h1\" variant=\"h5\">\r\n                    {t(\"login.findMyPassword\")}\r\n                </Typography>\r\n                <form className={classes.form} onSubmit={submit}>\r\n                    <FormControl margin=\"normal\" required fullWidth>\r\n                        <InputLabel htmlFor=\"email\">\r\n                            {t(\"login.email\")}\r\n                        </InputLabel>\r\n                        <Input\r\n                            id=\"email\"\r\n                            type=\"email\"\r\n                            name=\"email\"\r\n                            onChange={handleInputChange(\"email\")}\r\n                            autoComplete\r\n                            value={input.email}\r\n                            autoFocus\r\n                        />\r\n                    </FormControl>\r\n                    {forgetCaptcha && <CaptchaRender />}\r\n                    <Button\r\n                        type=\"submit\"\r\n                        fullWidth\r\n                        variant=\"contained\"\r\n                        color=\"primary\"\r\n                        disabled={\r\n                            loading || (forgetCaptcha ? captchaLoading : false)\r\n                        }\r\n                        className={classes.submit}\r\n                    >\r\n                        {t(\"login.sendMeAnEmail\")}\r\n                    </Button>{\" \"}\r\n                </form>{\" \"}\r\n                <Divider />\r\n                <div className={classes.link}>\r\n                    <div>\r\n                        <Link component={RouterLink} to={\"/login\"}>\r\n                            {t(\"login.backToSingIn\")}\r\n                        </Link>\r\n                    </div>\r\n                    <div>\r\n                        {registerEnabled && (\r\n                            <Link component={RouterLink} to={\"/signup\"}>\r\n                                {t(\"login.signUpAccount\")}\r\n                            </Link>\r\n                        )}\r\n                    </div>\r\n                </div>\r\n            </Paper>\r\n        </div>\r\n    );\r\n}\r\n\r\nexport default Reset;\r\n","import {\r\n    Button,\r\n    Dialog,\r\n    DialogActions,\r\n    DialogContent,\r\n    DialogTitle,\r\n    Grid,\r\n    List,\r\n    Slider,\r\n    withStyles,\r\n} from \"@material-ui/core\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport ListItem from \"@material-ui/core/ListItem\";\r\nimport ListItemIcon from \"@material-ui/core/ListItemIcon\";\r\nimport ListItemText from \"@material-ui/core/ListItemText\";\r\nimport MusicNote from \"@material-ui/icons/MusicNote\";\r\nimport PlayArrow from \"@material-ui/icons/PlayArrow\";\r\nimport PlayNext from \"@material-ui/icons/SkipNext\";\r\nimport PlayPrev from \"@material-ui/icons/SkipPrevious\";\r\nimport Pause from \"@material-ui/icons/Pause\";\r\nimport { Repeat, RepeatOne, Shuffle } from \"@material-ui/icons\";\r\nimport PropTypes from \"prop-types\";\r\nimport React, { Component } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { withRouter } from \"react-router\";\r\nimport { audioPreviewSuffix } from \"../../config\";\r\nimport { baseURL } from \"../../middleware/Api\";\r\nimport * as explorer from \"../../redux/explorer/reducer\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport {\r\n    audioPreviewSetIsOpen,\r\n    audioPreviewSetPlaying,\r\n    showAudioPreview,\r\n} from \"../../redux/explorer\";\r\nimport { withTranslation } from \"react-i18next\";\r\n\r\nconst styles = (theme) => ({\r\n    list: {\r\n        //maxWidth: 360,\r\n        backgroundColor: theme.palette.background.paper,\r\n        position: \"relative\",\r\n        overflow: \"auto\",\r\n        maxHeight: 300,\r\n    },\r\n    slider_root: {\r\n        \"vertical-align\": \"middle\",\r\n    },\r\n});\r\n\r\nconst mapStateToProps = (state) => {\r\n    return {\r\n        first: state.explorer.audioPreview.first,\r\n        other: state.explorer.audioPreview.other,\r\n        isOpen: state.explorer.audioPreview.isOpen,\r\n        playingName: state.explorer.audioPreview.playingName,\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n    return {\r\n        showAudioPreview: (first) => {\r\n            dispatch(showAudioPreview(first));\r\n        },\r\n        audioPreviewSetIsOpen: (first) => {\r\n            dispatch(audioPreviewSetIsOpen(first));\r\n        },\r\n        audioPreviewSetPlaying: (playingName, paused) => {\r\n            dispatch(audioPreviewSetPlaying(playingName, paused));\r\n        },\r\n    };\r\n};\r\n\r\nclass MusicPlayerComponent extends Component {\r\n    state = {\r\n        items: [],\r\n        currentIndex: 0,\r\n        //isOpen: false,\r\n        //isPlay:false,\r\n        currentTime: 0,\r\n        duration: 0,\r\n        progressText: \"00:00/00:00\",\r\n        looptype: 0,\r\n    };\r\n    myAudioRef = React.createRef();\r\n\r\n    UNSAFE_componentWillReceiveProps = (nextProps) => {\r\n        const items = [];\r\n        let firstOne = 0;\r\n        if (nextProps.first.id !== \"\") {\r\n            if (\r\n                pathHelper.isSharePage(this.props.location.pathname) &&\r\n                !nextProps.first.path\r\n            ) {\r\n                const newItem = {\r\n                    intro: nextProps.first.name,\r\n                    src: baseURL + \"/share/preview/\" + nextProps.first.key,\r\n                };\r\n                firstOne = 0;\r\n                items.push(newItem);\r\n                this.setState({\r\n                    currentIndex: firstOne,\r\n                    items: items,\r\n                    //isOpen: true,\r\n                });\r\n                this.props.audioPreviewSetIsOpen(true);\r\n                return;\r\n            }\r\n            // eslint-disable-next-line\r\n            nextProps.other.map((value) => {\r\n                const fileType = value.name.split(\".\").pop().toLowerCase();\r\n                if (audioPreviewSuffix.indexOf(fileType) !== -1) {\r\n                    let src = \"\";\r\n                    if (pathHelper.isSharePage(this.props.location.pathname)) {\r\n                        src = baseURL + \"/share/preview/\" + value.key;\r\n                        src =\r\n                            src +\r\n                            \"?path=\" +\r\n                            encodeURIComponent(\r\n                                value.path === \"/\"\r\n                                    ? value.path + value.name\r\n                                    : value.path + \"/\" + value.name\r\n                            );\r\n                    } else {\r\n                        src = baseURL + \"/file/preview/\" + value.id;\r\n                    }\r\n                    const newItem = {\r\n                        intro: value.name,\r\n                        src: src,\r\n                    };\r\n                    if (\r\n                        value.path === nextProps.first.path &&\r\n                        value.name === nextProps.first.name\r\n                    ) {\r\n                        firstOne = items.length;\r\n                    }\r\n                    items.push(newItem);\r\n                }\r\n            });\r\n            this.setState({\r\n                currentIndex: firstOne,\r\n                items: items,\r\n                //isOpen: true,\r\n            });\r\n            this.props.audioPreviewSetIsOpen(true);\r\n            this.props.showAudioPreview(explorer.initState.audioPreview.first);\r\n        }\r\n    };\r\n\r\n    handleItemClick = (currentIndex) => () => {\r\n        this.setState({\r\n            currentIndex: currentIndex,\r\n        });\r\n    };\r\n\r\n    handleClose = () => {\r\n        /*this.setState({\r\n            isOpen: false,\r\n        });*/\r\n        this.setState({\r\n            currentIndex: -1,\r\n        });\r\n        this.pause();\r\n        this.props.audioPreviewSetPlaying(null, false);\r\n        this.props.audioPreviewSetIsOpen(false);\r\n    };\r\n    backgroundPlay = () => {\r\n        this.props.audioPreviewSetIsOpen(false);\r\n    };\r\n\r\n    componentDidMount() {\r\n        if (this.myAudioRef.current) {\r\n            this.bindEvents(this.myAudioRef.current);\r\n        }\r\n    }\r\n    componentDidUpdate() {\r\n        if (this.myAudioRef.current) {\r\n            this.bindEvents(this.myAudioRef.current);\r\n        }\r\n    }\r\n    componentWillUnmount() {\r\n        this.unbindEvents(this.myAudioRef.current);\r\n    }\r\n\r\n    bindEvents = (ele) => {\r\n        if (ele) {\r\n            ele.addEventListener(\"canplay\", this.readyPlay);\r\n            ele.addEventListener(\"ended\", this.loopnext);\r\n            ele.addEventListener(\"timeupdate\", this.timeUpdate);\r\n        }\r\n    };\r\n\r\n    unbindEvents = (ele) => {\r\n        if (ele) {\r\n            ele.removeEventListener(\"canplay\", this.readyPlay);\r\n            ele.removeEventListener(\"ended\", this.loopnext);\r\n            ele.removeEventListener(\"timeupdate\", this.timeUpdate);\r\n        }\r\n    };\r\n\r\n    readyPlay = () => {\r\n        this.play();\r\n    };\r\n\r\n    formatTime = (s) => {\r\n        if (isNaN(s)) return \"00:00\";\r\n        const minute = Math.floor(s / 60);\r\n        const second = Math.floor(s % 60);\r\n        return (\r\n            `${minute}`.padStart(2, \"0\") + \":\" + `${second}`.padStart(2, \"0\")\r\n        );\r\n    };\r\n\r\n    timeUpdate = () => {\r\n        const currentTime = Math.floor(this.myAudioRef.current.currentTime); //this.myAudioRef.current.currentTime;//\r\n        this.setState({\r\n            currentTime: currentTime,\r\n            duration: this.myAudioRef.current.duration,\r\n            progressText:\r\n                this.formatTime(currentTime) +\r\n                \"/\" +\r\n                this.formatTime(this.myAudioRef.current.duration),\r\n        });\r\n    };\r\n\r\n    play = () => {\r\n        this.myAudioRef.current.play();\r\n        /*this.setState({\r\n            isPlay: true\r\n        });*/\r\n        this.props.audioPreviewSetPlaying(\r\n            this.state.items[this.state.currentIndex].intro,\r\n            false\r\n        );\r\n    };\r\n\r\n    pause = () => {\r\n        if (this.myAudioRef.current) {\r\n            this.myAudioRef.current.pause();\r\n        }\r\n        /*this.setState({\r\n            isPlay: false\r\n        })*/\r\n        this.props.audioPreviewSetPlaying(\r\n            this.state.items[this.state.currentIndex]?.intro,\r\n            true\r\n        );\r\n    };\r\n\r\n    playOrPaues = () => {\r\n        if (this.state.isPlay) {\r\n            this.pause();\r\n        } else {\r\n            this.play();\r\n        }\r\n    };\r\n    changeLoopType = () => {\r\n        let lt = this.state.looptype + 1;\r\n        if (lt >= 3) {\r\n            lt = 0;\r\n        }\r\n        this.setState({\r\n            looptype: lt,\r\n        });\r\n    };\r\n    loopnext = () => {\r\n        let index = this.state.currentIndex;\r\n        if (this.state.looptype == 0) {\r\n            //all\r\n            index = index + 1;\r\n            if (index >= this.state.items.length) {\r\n                index = 0;\r\n            }\r\n        } else if (this.state.looptype == 1) {\r\n            //single\r\n            //index=index;\r\n        } else if (this.state.looptype == 2) {\r\n            //random\r\n            if (this.state.items.length <= 2) {\r\n                index = index + 1;\r\n                if (index >= this.state.items.length) {\r\n                    index = 0;\r\n                }\r\n            } else {\r\n                while (index == this.state.currentIndex) {\r\n                    index = Math.floor(Math.random() * this.state.items.length);\r\n                }\r\n            }\r\n        }\r\n        if (this.state.currentIndex == index) {\r\n            this.myAudioRef.current.currentTime = 0;\r\n            this.play();\r\n        }\r\n        this.setState({\r\n            currentIndex: index,\r\n        });\r\n    };\r\n\r\n    prev = () => {\r\n        let index = this.state.currentIndex - 1;\r\n        if (index < 0) {\r\n            index = this.state.items.length - 1;\r\n        }\r\n        this.setState({\r\n            currentIndex: index,\r\n        });\r\n    };\r\n\r\n    next = () => {\r\n        let index = this.state.currentIndex + 1;\r\n        if (index >= this.state.items.length) {\r\n            index = 0;\r\n        }\r\n        this.setState({\r\n            currentIndex: index,\r\n        });\r\n    };\r\n\r\n    handleProgress = (e, newValue) => {\r\n        this.myAudioRef.current.currentTime = newValue;\r\n    };\r\n\r\n    render() {\r\n        const { currentIndex, items } = this.state;\r\n        const { isOpen, classes, t } = this.props;\r\n        return (\r\n            <Dialog\r\n                open={isOpen}\r\n                onClose={this.backgroundPlay}\r\n                aria-labelledby=\"form-dialog-title\"\r\n                maxWidth=\"xs\"\r\n                fullWidth\r\n                keepMounted\r\n            >\r\n                <DialogTitle id=\"form-dialog-title\">\r\n                    {t(\"fileManager.musicPlayer\")}\r\n                </DialogTitle>\r\n                <DialogContent>\r\n                    <List className={classes.list} dense>\r\n                        {items.map((value, idx) => {\r\n                            const labelId = `label-${value.intro}`;\r\n                            return (\r\n                                <ListItem\r\n                                    key={value.src}\r\n                                    dense\r\n                                    button\r\n                                    onClick={this.handleItemClick(idx)}\r\n                                    selected={idx === currentIndex}\r\n                                >\r\n                                    <ListItemIcon>\r\n                                        {idx === currentIndex ? (\r\n                                            <PlayArrow />\r\n                                        ) : (\r\n                                            <MusicNote />\r\n                                        )}\r\n                                    </ListItemIcon>\r\n                                    <ListItemText\r\n                                        id={labelId}\r\n                                        primary={`${value.intro}`}\r\n                                    />\r\n                                </ListItem>\r\n                            );\r\n                        })}\r\n                    </List>\r\n                    <audio\r\n                        ref={this.myAudioRef}\r\n                        src={items[currentIndex]?.src}\r\n                    />\r\n                    <div style={{ \"padding-top\": 8 }} />\r\n                    <Grid container spacing={2} alignItems=\"center\">\r\n                        <Grid item xs>\r\n                            <Slider\r\n                                classes={{ root: classes.slider_root }}\r\n                                value={this.state.currentTime}\r\n                                onChange={this.handleProgress}\r\n                                step={1}\r\n                                min={0}\r\n                                max={this.state.duration}\r\n                                aria-labelledby=\"continuous-slider\"\r\n                            />\r\n                        </Grid>\r\n                        <Grid item>{this.state.progressText}</Grid>\r\n                    </Grid>\r\n                    <Grid\r\n                        container\r\n                        spacing={2}\r\n                        justifyContent=\"center\"\r\n                        justify=\"center\"\r\n                    >\r\n                        <Grid item>\r\n                            <IconButton\r\n                                edge=\"end\"\r\n                                aria-label=\"\"\r\n                                onClick={this.changeLoopType}\r\n                            >\r\n                                {this.state.looptype === 0 ? (\r\n                                    <Repeat />\r\n                                ) : this.state.looptype === 1 ? (\r\n                                    <RepeatOne />\r\n                                ) : (\r\n                                    <Shuffle />\r\n                                )}\r\n                            </IconButton>\r\n                        </Grid>\r\n                        <Grid item>\r\n                            <IconButton\r\n                                edge=\"end\"\r\n                                aria-label=\"\"\r\n                                onClick={this.prev}\r\n                            >\r\n                                <PlayPrev />\r\n                            </IconButton>\r\n                        </Grid>\r\n                        <Grid item>\r\n                            <IconButton\r\n                                edge=\"end\"\r\n                                aria-label=\"\"\r\n                                onClick={this.pause}\r\n                            >\r\n                                <Pause />\r\n                            </IconButton>\r\n                        </Grid>\r\n                        <Grid item>\r\n                            <IconButton\r\n                                edge=\"end\"\r\n                                aria-label=\"\"\r\n                                onClick={this.play}\r\n                            >\r\n                                <PlayArrow />\r\n                            </IconButton>\r\n                        </Grid>\r\n                        <Grid item>\r\n                            <IconButton\r\n                                edge=\"end\"\r\n                                aria-label=\"\"\r\n                                onClick={this.next}\r\n                            >\r\n                                <PlayNext />\r\n                            </IconButton>\r\n                        </Grid>\r\n                    </Grid>\r\n                </DialogContent>\r\n                <DialogActions>\r\n                    <Button onClick={this.handleClose}>\r\n                        {t(\"fileManager.closeAndStop\")}\r\n                    </Button>\r\n                    <Button onClick={this.backgroundPlay}>\r\n                        {t(\"fileManager.playInBackground\")}\r\n                    </Button>\r\n                </DialogActions>\r\n            </Dialog>\r\n        );\r\n    }\r\n}\r\n\r\nMusicPlayerComponent.propTypes = {\r\n    classes: PropTypes.object.isRequired,\r\n};\r\n\r\nconst MusicPlayer = connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(withRouter(withTranslation()(MusicPlayerComponent))));\r\n\r\nexport default MusicPlayer;\r\n","import React, { Suspense, useCallback, useMemo, useState } from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { useLocation, useParams, useRouteMatch } from \"react-router\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\nimport UseFileSubTitle from \"../../hooks/fileSubtitle\";\r\nimport { getPreviewURL } from \"../../middleware/Api\";\r\nimport pathHelper from \"../../utils/page\";\r\nimport TextLoading from \"../Placeholder/TextLoading\";\r\n\r\nconst ReactReader = React.lazy(() =>\r\n    import(/* webpackChunkName: \"ReactReader\" */ \"react-reader\").then((m) => ({\r\n        default: m.ReactReader,\r\n    }))\r\n);\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    layout: {\r\n        height: \"calc(100vh - 64px)\",\r\n    },\r\n    paper: {\r\n        marginBottom: theme.spacing(3),\r\n    },\r\n}));\r\n\r\nfunction useQuery() {\r\n    return new URLSearchParams(useLocation().search);\r\n}\r\n\r\nexport default function EpubViewer() {\r\n    const math = useRouteMatch();\r\n    const location = useLocation();\r\n    const query = useQuery();\r\n    const { id } = useParams();\r\n    const { path } = UseFileSubTitle(query, math, location);\r\n    const isShare = pathHelper.isSharePage(location.pathname);\r\n\r\n    const [currentLocation, setLocation] = useState(null);\r\n    const locationChanged = (epubcifi) => {\r\n        setLocation(epubcifi);\r\n    };\r\n\r\n    const dispatch = useDispatch();\r\n    const ToggleSnackbar = useCallback(\r\n        (vertical, horizontal, msg, color) =>\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color)),\r\n        [dispatch]\r\n    );\r\n\r\n    const fileUrl = useMemo(\r\n        () =>\r\n            getPreviewURL(\r\n                isShare,\r\n                id,\r\n                query.get(\"id\"),\r\n                query.get(\"share_path\")\r\n            ),\r\n        [id, location, path]\r\n    );\r\n\r\n    const classes = useStyles();\r\n    return (\r\n        <div className={classes.layout}>\r\n            <Suspense fallback={<TextLoading />}>\r\n                <ReactReader\r\n                    location={currentLocation}\r\n                    locationChanged={locationChanged}\r\n                    epubInitOptions={{\r\n                        openAs: \"epub\",\r\n                    }}\r\n                    showToc={false}\r\n                    className={classes.container}\r\n                    url={fileUrl}\r\n                />\r\n            </Suspense>\r\n        </div>\r\n    );\r\n}\r\n","import React, { Suspense } from \"react\";\r\nimport AuthRoute from \"./middleware/AuthRoute\";\r\nimport NoAuthRoute from \"./middleware/NoAuthRoute\";\r\nimport Navbar from \"./component/Navbar/Navbar.js\";\r\nimport useMediaQuery from \"@material-ui/core/useMediaQuery\";\r\nimport AlertBar from \"./component/Common/Snackbar\";\r\nimport { createMuiTheme, lighten } from \"@material-ui/core/styles\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { Redirect, Route, Switch, useRouteMatch } from \"react-router-dom\";\r\nimport Auth from \"./middleware/Auth\";\r\nimport { CssBaseline, makeStyles, ThemeProvider } from \"@material-ui/core\";\r\nimport { changeThemeColor } from \"./utils\";\r\nimport NotFound from \"./component/Share/NotFound\";\r\n// Lazy loads\r\nimport LoginForm from \"./component/Login/LoginForm\";\r\nimport FileManager from \"./component/FileManager/FileManager.js\";\r\nimport VideoPreview from \"./component/Viewer/Video.js\";\r\nimport SearchResult from \"./component/Share/SearchResult\";\r\nimport MyShare from \"./component/Share/MyShare\";\r\nimport Download from \"./component/Download/Download\";\r\nimport SharePreload from \"./component/Share/SharePreload\";\r\nimport DocViewer from \"./component/Viewer/Doc\";\r\nimport TextViewer from \"./component/Viewer/Text\";\r\nimport WebDAV from \"./component/Setting/WebDAV\";\r\nimport Tasks from \"./component/Setting/Tasks\";\r\nimport Profile from \"./component/Setting/Profile\";\r\nimport UserSetting from \"./component/Setting/UserSetting\";\r\nimport Register from \"./component/Login/Register\";\r\nimport Activation from \"./component/Login/Activication\";\r\nimport ResetForm from \"./component/Login/ResetForm\";\r\nimport Reset from \"./component/Login/Reset\";\r\nimport PageLoading from \"./component/Placeholder/PageLoading\";\r\nimport CodeViewer from \"./component/Viewer/Code\";\r\nimport MusicPlayer from \"./component/FileManager/MusicPlayer\";\r\nimport EpubViewer from \"./component/Viewer/Epub\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst PDFViewer = React.lazy(() =>\r\n    import(/* webpackChunkName: \"pdf\" */ \"./component/Viewer/PDF\")\r\n);\r\n\r\nexport default function App() {\r\n    const themeConfig = useSelector((state) => state.siteConfig.theme);\r\n    const isLogin = useSelector((state) => state.viewUpdate.isLogin);\r\n    const prefersDarkMode = useMediaQuery(\"(prefers-color-scheme: dark)\");\r\n    const { t } = useTranslation();\r\n\r\n    const theme = React.useMemo(() => {\r\n        themeConfig.palette.type = prefersDarkMode ? \"dark\" : \"light\";\r\n        const prefer = Auth.GetPreference(\"theme_mode\");\r\n        if (prefer) {\r\n            themeConfig.palette.type = prefer;\r\n        }\r\n        const theme = createMuiTheme({\r\n            ...themeConfig,\r\n            palette: {\r\n                ...themeConfig.palette,\r\n                primary: {\r\n                    ...themeConfig.palette.primary,\r\n                    main:\r\n                        themeConfig.palette.type === \"dark\"\r\n                            ? lighten(themeConfig.palette.primary.main, 0.3)\r\n                            : themeConfig.palette.primary.main,\r\n                },\r\n            },\r\n            overrides: {\r\n                MuiButton: {\r\n                    root: {\r\n                        textTransform: \"none\",\r\n                    },\r\n                },\r\n                MuiTab: {\r\n                    root: {\r\n                        textTransform: \"none\",\r\n                    },\r\n                },\r\n            },\r\n        });\r\n        changeThemeColor(\r\n            themeConfig.palette.type === \"dark\"\r\n                ? theme.palette.background.default\r\n                : theme.palette.primary.main\r\n        );\r\n        return theme;\r\n    }, [prefersDarkMode, themeConfig]);\r\n\r\n    const useStyles = makeStyles((theme) => ({\r\n        root: {\r\n            display: \"flex\",\r\n        },\r\n        content: {\r\n            flexGrow: 1,\r\n            padding: theme.spacing(0),\r\n            minWidth: 0,\r\n        },\r\n        toolbar: theme.mixins.toolbar,\r\n    }));\r\n\r\n    const classes = useStyles();\r\n\r\n    const { path } = useRouteMatch();\r\n    return (\r\n        <React.Fragment>\r\n            <ThemeProvider theme={theme}>\r\n                <div className={classes.root} id=\"container\">\r\n                    <CssBaseline />\r\n                    <AlertBar />\r\n                    <Navbar />\r\n                    <main className={classes.content}>\r\n                        <div className={classes.toolbar} />\r\n                        <Switch>\r\n                            <AuthRoute exact path={path} isLogin={isLogin}>\r\n                                <Redirect\r\n                                    to={{\r\n                                        pathname: \"/home\",\r\n                                    }}\r\n                                />\r\n                            </AuthRoute>\r\n\r\n                            <AuthRoute path={`${path}home`} isLogin={isLogin}>\r\n                                <FileManager />\r\n                            </AuthRoute>\r\n\r\n                            <AuthRoute path={`${path}video`} isLogin={isLogin}>\r\n                                <VideoPreview />\r\n                            </AuthRoute>\r\n\r\n                            <AuthRoute path={`${path}text`} isLogin={isLogin}>\r\n                                <TextViewer />\r\n                            </AuthRoute>\r\n\r\n                            <AuthRoute path={`${path}doc`} isLogin={isLogin}>\r\n                                <DocViewer />\r\n                            </AuthRoute>\r\n\r\n                            <AuthRoute path={`${path}pdf`} isLogin={isLogin}>\r\n                                <Suspense fallback={<PageLoading />}>\r\n                                    <PDFViewer />\r\n                                </Suspense>\r\n                            </AuthRoute>\r\n\r\n                            <AuthRoute path={`${path}code`} isLogin={isLogin}>\r\n                                <CodeViewer />\r\n                            </AuthRoute>\r\n\r\n                            <AuthRoute path={`${path}epub`} isLogin={isLogin}>\r\n                                <EpubViewer />\r\n                            </AuthRoute>\r\n\r\n                            <AuthRoute path={`${path}aria2`} isLogin={isLogin}>\r\n                                <Download />\r\n                            </AuthRoute>\r\n\r\n                            <AuthRoute path={`${path}shares`} isLogin={isLogin}>\r\n                                <MyShare />\r\n                            </AuthRoute>\r\n\r\n                            <Route path={`${path}search`} isLogin={isLogin}>\r\n                                <SearchResult />\r\n                            </Route>\r\n\r\n                            <Route path={`${path}setting`} isLogin={isLogin}>\r\n                                <UserSetting />\r\n                            </Route>\r\n\r\n                            <AuthRoute\r\n                                path={`${path}profile/:id`}\r\n                                isLogin={isLogin}\r\n                            >\r\n                                <Profile />\r\n                            </AuthRoute>\r\n\r\n                            <AuthRoute path={`${path}webdav`} isLogin={isLogin}>\r\n                                <WebDAV />\r\n                            </AuthRoute>\r\n\r\n                            <AuthRoute path={`${path}tasks`} isLogin={isLogin}>\r\n                                <Tasks />\r\n                            </AuthRoute>\r\n\r\n                            <NoAuthRoute\r\n                                exact\r\n                                path={`${path}login`}\r\n                                isLogin={isLogin}\r\n                            >\r\n                                <LoginForm />\r\n                            </NoAuthRoute>\r\n\r\n                            <NoAuthRoute\r\n                                exact\r\n                                path={`${path}signup`}\r\n                                isLogin={isLogin}\r\n                            >\r\n                                <Register />\r\n                            </NoAuthRoute>\r\n\r\n                            <Route path={`${path}activate`} exact>\r\n                                <Activation />\r\n                            </Route>\r\n\r\n                            <Route path={`${path}reset`} exact>\r\n                                <ResetForm />\r\n                            </Route>\r\n\r\n                            <Route path={`${path}forget`} exact>\r\n                                <Reset />\r\n                            </Route>\r\n\r\n                            <Route exact path={`${path}s/:id`}>\r\n                                <SharePreload />\r\n                            </Route>\r\n\r\n                            <Route path={`${path}s/:id/video(/)*`}>\r\n                                <VideoPreview />\r\n                            </Route>\r\n\r\n                            <Route path={`${path}s/:id/doc(/)*`}>\r\n                                <DocViewer />\r\n                            </Route>\r\n\r\n                            <Route path={`${path}s/:id/text(/)*`}>\r\n                                <TextViewer />\r\n                            </Route>\r\n\r\n                            <Route path={`${path}s/:id/pdf(/)*`}>\r\n                                <Suspense fallback={<PageLoading />}>\r\n                                    <PDFViewer />\r\n                                </Suspense>\r\n                            </Route>\r\n\r\n                            <Route path={`${path}s/:id/code(/)*`}>\r\n                                <CodeViewer />\r\n                            </Route>\r\n\r\n                            <Route path={`${path}s/:id/epub(/)*`}>\r\n                                <EpubViewer />\r\n                            </Route>\r\n\r\n                            <Route path=\"*\">\r\n                                <NotFound\r\n                                    msg={t(\"pageNotFound\", { ns: \"common\" })}\r\n                                />\r\n                            </Route>\r\n                        </Switch>\r\n                    </main>\r\n                    <MusicPlayer />\r\n                </div>\r\n            </ThemeProvider>\r\n        </React.Fragment>\r\n    );\r\n}\r\n","import API from \"./Api\";\r\nimport Auth from \"./Auth\";\r\nimport pathHelper from \"../utils/page\";\r\nimport {\r\n    changeViewMethod,\r\n    setSiteConfig,\r\n    toggleSnackbar,\r\n} from \"../redux/explorer\";\r\nimport i18next from \"../i18n\";\r\n\r\nconst initUserConfig = (siteConfig) => {\r\n    if (siteConfig.user !== undefined && !siteConfig.user.anonymous) {\r\n        const themes = JSON.parse(siteConfig.themes);\r\n        const user = siteConfig.user;\r\n        delete siteConfig.user;\r\n\r\n        //更换用户自定配色\r\n        if (\r\n            user[\"preferred_theme\"] !== \"\" &&\r\n            themes[user[\"preferred_theme\"]] !== undefined\r\n        ) {\r\n            siteConfig.theme = themes[user[\"preferred_theme\"]];\r\n        }\r\n\r\n        // 更新登录态\r\n        Auth.authenticate(user);\r\n    }\r\n    if (siteConfig.user !== undefined && siteConfig.user.anonymous) {\r\n        Auth.SetUser(siteConfig.user);\r\n    }\r\n    return siteConfig;\r\n};\r\n\r\nexport const InitSiteConfig = (rawStore) => {\r\n    // 从缓存获取默认配置\r\n    const configCache = JSON.parse(localStorage.getItem(\"siteConfigCache\"));\r\n    if (configCache != null) {\r\n        rawStore.siteConfig = configCache;\r\n    }\r\n    // 检查是否有path参数\r\n    const url = new URL(window.location.href);\r\n    const c = url.searchParams.get(\"path\");\r\n    rawStore.navigator.path = c === null ? \"/\" : c;\r\n    // 初始化用户个性配置\r\n    rawStore.siteConfig = initUserConfig(rawStore.siteConfig);\r\n\r\n    // 更改站点标题\r\n    document.title = rawStore.siteConfig.title;\r\n    return rawStore;\r\n};\r\n\r\nexport async function UpdateSiteConfig(store) {\r\n    API.get(\"/site/config\")\r\n        .then(function (response) {\r\n            const themes = JSON.parse(response.data.themes);\r\n            response.data.theme = themes[response.data.defaultTheme];\r\n            response.data = initUserConfig(response.data);\r\n            store.dispatch(setSiteConfig(response.data));\r\n            localStorage.setItem(\r\n                \"siteConfigCache\",\r\n                JSON.stringify(response.data)\r\n            );\r\n\r\n            // 偏爱的列表样式\r\n            const preferListMethod = Auth.GetPreference(\"view_method\");\r\n            if (preferListMethod) {\r\n                store.dispatch(changeViewMethod(preferListMethod));\r\n            } else {\r\n                if (pathHelper.isSharePage(window.location.pathname)) {\r\n                    store.dispatch(\r\n                        changeViewMethod(response.data.share_view_method)\r\n                    );\r\n                } else {\r\n                    store.dispatch(\r\n                        changeViewMethod(response.data.home_view_method)\r\n                    );\r\n                }\r\n            }\r\n        })\r\n        .catch(function (error) {\r\n            store.dispatch(\r\n                toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    i18next.t(\"errLoadingSiteConfig\", { ns: \"common\" }) +\r\n                        error.message,\r\n                    \"error\"\r\n                )\r\n            );\r\n        });\r\n}\r\n","import { AnyAction } from \"redux\";\r\nimport Auth from \"../../middleware/Auth\";\r\nimport { SortMethod } from \"../../types\";\r\n\r\nexport interface ViewUpdateState {\r\n    isLogin: boolean;\r\n    open: boolean;\r\n    explorerViewMethod: string;\r\n    sortMethod: SortMethod;\r\n    subTitle: string | null;\r\n    contextType: string;\r\n    contextOpen: boolean;\r\n    menuOpen: boolean;\r\n    navigatorLoading: boolean;\r\n    navigatorError: boolean;\r\n    navigatorErrorMsg: string | null;\r\n    modalsLoading: boolean;\r\n    storageRefresh: boolean;\r\n    userPopoverAnchorEl: any;\r\n    shareUserPopoverAnchorEl: any;\r\n    modals: {\r\n        createNewFolder: boolean;\r\n        createNewFile: boolean;\r\n        rename: boolean;\r\n        move: boolean;\r\n        remove: boolean;\r\n        share: boolean;\r\n        music: boolean;\r\n        remoteDownload: boolean;\r\n        torrentDownload: boolean;\r\n        getSource: string;\r\n        copy: boolean;\r\n        resave: boolean;\r\n        compress: boolean;\r\n        decompress: boolean;\r\n        loading: boolean;\r\n        loadingText: string;\r\n        directoryDownloading: boolean;\r\n        directoryDownloadLog: string;\r\n        directoryDownloadDone: boolean;\r\n        option?: {\r\n            options: {\r\n                open: boolean;\r\n                key: string;\r\n                name: string;\r\n                description?: string;\r\n            }[];\r\n            title: string;\r\n            callback: any;\r\n            onClose: any;\r\n        };\r\n    };\r\n    snackbar: {\r\n        toggle: boolean;\r\n        vertical: string;\r\n        horizontal: string;\r\n        msg: string;\r\n        color: string;\r\n    };\r\n    pagination: {\r\n        page: number;\r\n        size: number;\r\n    };\r\n    openFileSelector: number;\r\n    openFolderSelector: number;\r\n    shareInfo: any;\r\n}\r\nexport const initState: ViewUpdateState = {\r\n    // 是否登录\r\n    isLogin: Auth.Check(),\r\n    open: false,\r\n    explorerViewMethod: \"icon\",\r\n    sortMethod: Auth.GetPreferenceWithDefault(\"sort\", \"timePos\"),\r\n    subTitle: null,\r\n    contextType: \"none\",\r\n    contextOpen: false,\r\n    menuOpen: false,\r\n    navigatorLoading: true,\r\n    navigatorError: false,\r\n    navigatorErrorMsg: null,\r\n    modalsLoading: false,\r\n    storageRefresh: false,\r\n    userPopoverAnchorEl: null,\r\n    shareUserPopoverAnchorEl: null,\r\n    modals: {\r\n        createNewFolder: false,\r\n        createNewFile: false,\r\n        rename: false,\r\n        move: false,\r\n        remove: false,\r\n        share: false,\r\n        music: false,\r\n        remoteDownload: false,\r\n        torrentDownload: false,\r\n        getSource: \"\",\r\n        copy: false,\r\n        resave: false,\r\n        compress: false,\r\n        decompress: false,\r\n        loading: false,\r\n        loadingText: \"\",\r\n        directoryDownloading: false,\r\n        directoryDownloadLog: \"\",\r\n        directoryDownloadDone: false,\r\n    },\r\n    snackbar: {\r\n        toggle: false,\r\n        vertical: \"top\",\r\n        horizontal: \"center\",\r\n        msg: \"\",\r\n        color: \"\",\r\n    },\r\n    pagination: {\r\n        page: 1,\r\n        size: Auth.GetPreferenceWithDefault(\"pagination\", 100),\r\n    },\r\n    openFileSelector: 0,\r\n    openFolderSelector: 0,\r\n    shareInfo: null,\r\n};\r\nconst viewUpdate = (state: ViewUpdateState = initState, action: AnyAction) => {\r\n    switch (action.type) {\r\n        case \"DRAWER_TOGGLE\":\r\n            return Object.assign({}, state, {\r\n                open: action.open,\r\n            });\r\n        case \"CHANGE_VIEW_METHOD\":\r\n            return Object.assign({}, state, {\r\n                explorerViewMethod: action.method,\r\n            });\r\n        case \"SET_NAVIGATOR_LOADING_STATUE\":\r\n            return Object.assign({}, state, {\r\n                navigatorLoading: action.status,\r\n            });\r\n        case \"SET_NAVIGATOR_ERROR\":\r\n            return Object.assign({}, state, {\r\n                navigatorError: action.status,\r\n                navigatorErrorMsg: action.msg,\r\n            });\r\n        case \"OPEN_CREATE_FOLDER_DIALOG\":\r\n            return Object.assign({}, state, {\r\n                modals: Object.assign({}, state.modals, {\r\n                    createNewFolder: true,\r\n                }),\r\n                contextOpen: false,\r\n            });\r\n        case \"OPEN_CREATE_FILE_DIALOG\":\r\n            return Object.assign({}, state, {\r\n                modals: Object.assign({}, state.modals, {\r\n                    createNewFile: true,\r\n                }),\r\n                contextOpen: false,\r\n            });\r\n        case \"OPEN_RENAME_DIALOG\":\r\n            return Object.assign({}, state, {\r\n                modals: Object.assign({}, state.modals, {\r\n                    rename: true,\r\n                }),\r\n                contextOpen: false,\r\n            });\r\n        case \"OPEN_REMOVE_DIALOG\":\r\n            return Object.assign({}, state, {\r\n                modals: Object.assign({}, state.modals, {\r\n                    remove: true,\r\n                }),\r\n                contextOpen: false,\r\n            });\r\n        case \"OPEN_MOVE_DIALOG\":\r\n            return Object.assign({}, state, {\r\n                modals: Object.assign({}, state.modals, {\r\n                    move: true,\r\n                }),\r\n                contextOpen: false,\r\n            });\r\n        case \"OPEN_RESAVE_DIALOG\":\r\n            // window.shareKey = action.key;\r\n            return Object.assign({}, state, {\r\n                modals: Object.assign({}, state.modals, {\r\n                    resave: true,\r\n                }),\r\n                contextOpen: false,\r\n            });\r\n        case \"SET_USER_POPOVER\":\r\n            return Object.assign({}, state, {\r\n                userPopoverAnchorEl: action.anchor,\r\n            });\r\n        case \"SET_SHARE_USER_POPOVER\":\r\n            return Object.assign({}, state, {\r\n                shareUserPopoverAnchorEl: action.anchor,\r\n            });\r\n        case \"OPEN_SHARE_DIALOG\":\r\n            return Object.assign({}, state, {\r\n                modals: Object.assign({}, state.modals, {\r\n                    share: true,\r\n                }),\r\n                contextOpen: false,\r\n            });\r\n        case \"OPEN_MUSIC_DIALOG\":\r\n            return Object.assign({}, state, {\r\n                modals: Object.assign({}, state.modals, {\r\n                    music: true,\r\n                }),\r\n                contextOpen: false,\r\n            });\r\n        case \"OPEN_REMOTE_DOWNLOAD_DIALOG\":\r\n            return Object.assign({}, state, {\r\n                modals: Object.assign({}, state.modals, {\r\n                    remoteDownload: true,\r\n                }),\r\n                contextOpen: false,\r\n            });\r\n        case \"OPEN_TORRENT_DOWNLOAD_DIALOG\":\r\n            return Object.assign({}, state, {\r\n                modals: Object.assign({}, state.modals, {\r\n                    torrentDownload: true,\r\n                }),\r\n                contextOpen: false,\r\n            });\r\n        case \"OPEN_DECOMPRESS_DIALOG\":\r\n            return Object.assign({}, state, {\r\n                modals: Object.assign({}, state.modals, {\r\n                    decompress: true,\r\n                }),\r\n                contextOpen: false,\r\n            });\r\n        case \"OPEN_COMPRESS_DIALOG\":\r\n            return Object.assign({}, state, {\r\n                modals: Object.assign({}, state.modals, {\r\n                    compress: true,\r\n                }),\r\n                contextOpen: false,\r\n            });\r\n        case \"OPEN_GET_SOURCE_DIALOG\":\r\n            return Object.assign({}, state, {\r\n                modals: Object.assign({}, state.modals, {\r\n                    getSource: action.source,\r\n                }),\r\n                contextOpen: false,\r\n            });\r\n        case \"OPEN_COPY_DIALOG\":\r\n            return Object.assign({}, state, {\r\n                modals: Object.assign({}, state.modals, {\r\n                    copy: true,\r\n                }),\r\n                contextOpen: false,\r\n            });\r\n        case \"OPEN_LOADING_DIALOG\":\r\n            return Object.assign({}, state, {\r\n                modals: Object.assign({}, state.modals, {\r\n                    loading: true,\r\n                    loadingText: action.text,\r\n                }),\r\n                contextOpen: false,\r\n            });\r\n        case \"OPEN_DIRECTORY_DOWNLOAD_DIALOG\":\r\n            return Object.assign({}, state, {\r\n                modals: Object.assign({}, state.modals, {\r\n                    directoryDownloading: action.downloading,\r\n                    directoryDownloadLog: action.log,\r\n                    directoryDownloadDone: action.done,\r\n                }),\r\n                contextOpen: false,\r\n            });\r\n        case \"CLOSE_CONTEXT_MENU\":\r\n            return Object.assign({}, state, {\r\n                contextOpen: false,\r\n            });\r\n        case \"CLOSE_ALL_MODALS\":\r\n            return Object.assign({}, state, {\r\n                modals: Object.assign({}, state.modals, {\r\n                    createNewFolder: false,\r\n                    createNewFile: false,\r\n                    rename: false,\r\n                    move: false,\r\n                    remove: false,\r\n                    share: false,\r\n                    music: false,\r\n                    remoteDownload: false,\r\n                    torrentDownload: false,\r\n                    getSource: \"\",\r\n                    resave: false,\r\n                    copy: false,\r\n                    loading: false,\r\n                    compress: false,\r\n                    decompress: false,\r\n                    option: undefined,\r\n                    directoryDownloading: false,\r\n                    directoryDownloadLog: \"\",\r\n                    directoryDownloadDone: false,\r\n                }),\r\n            });\r\n        case \"TOGGLE_SNACKBAR\":\r\n            return Object.assign({}, state, {\r\n                snackbar: {\r\n                    toggle: !state.snackbar.toggle,\r\n                    vertical: action.vertical,\r\n                    horizontal: action.horizontal,\r\n                    msg: action.msg,\r\n                    color: action.color,\r\n                },\r\n            });\r\n        case \"SET_MODALS_LOADING\":\r\n            return Object.assign({}, state, {\r\n                modalsLoading: action.status,\r\n            });\r\n        case \"SET_SESSION_STATUS\":\r\n            return {\r\n                ...state,\r\n                isLogin: action.status,\r\n            };\r\n        case \"REFRESH_STORAGE\":\r\n            return Object.assign({}, state, {\r\n                storageRefresh: !state.storageRefresh,\r\n            });\r\n        case \"SEARCH_MY_FILE\":\r\n            return Object.assign({}, state, {\r\n                contextOpen: false,\r\n                navigatorError: false,\r\n                navigatorLoading: true,\r\n            });\r\n        case \"CHANGE_CONTEXT_MENU\":\r\n            if (state.contextOpen && action.open) {\r\n                return Object.assign({}, state);\r\n            }\r\n            return Object.assign({}, state, {\r\n                contextOpen: action.open,\r\n                contextType: action.menuType,\r\n            });\r\n        case \"SET_SUBTITLE\":\r\n            return Object.assign({}, state, {\r\n                subTitle: action.title,\r\n            });\r\n        case \"SET_SORT_METHOD\":\r\n            return {\r\n                ...state,\r\n                sortMethod: action.method,\r\n            };\r\n        case \"SET_NAVIGATOR\":\r\n            return {\r\n                ...state,\r\n                contextOpen: false,\r\n                navigatorError: false,\r\n                navigatorLoading: action.navigatorLoading,\r\n            };\r\n        case \"SET_OPTION_MODAL\":\r\n            return Object.assign({}, state, {\r\n                modals: Object.assign({}, state.modals, {\r\n                    option: action.option,\r\n                }),\r\n                contextOpen: false,\r\n            });\r\n        case \"OPEN_FILE_SELECTOR\":\r\n            return {\r\n                ...state,\r\n                openFileSelector: state.openFileSelector + 1,\r\n                contextOpen: false,\r\n            };\r\n        case \"OPEN_FOLDER_SELECTOR\":\r\n            return {\r\n                ...state,\r\n                openFolderSelector: state.openFolderSelector + 1,\r\n                contextOpen: false,\r\n            };\r\n        case \"SET_PAGINATION\":\r\n            return {\r\n                ...state,\r\n                pagination: action.pagination,\r\n            };\r\n        case \"SET_SHARE_INFO\":\r\n            return {\r\n                ...state,\r\n                shareInfo: action.shareInfo,\r\n            };\r\n        default:\r\n            return state;\r\n    }\r\n};\r\n\r\nexport default viewUpdate;\r\n","/* eslint-disable no-case-declarations */\r\nimport { InitSiteConfig } from \"../middleware/Init\";\r\nimport { combineReducers } from \"../redux/combineReducers\";\r\nimport viewUpdate from \"../redux/viewUpdate/reducer\";\r\nimport explorer from \"../redux/explorer/reducer\";\r\nimport { connectRouter } from \"connected-react-router\";\r\nimport i18next from \"../i18n\";\r\n\r\nconst doNavigate = (path, state) => {\r\n    window.currntPath = path;\r\n    return Object.assign({}, state, {\r\n        navigator: Object.assign({}, state.navigator, {\r\n            path: path,\r\n        }),\r\n    });\r\n};\r\n\r\nexport const initState = {\r\n    siteConfig: {\r\n        title: window.subTitle,\r\n        siteICPId: \"\",\r\n        loginCaptcha: false,\r\n        regCaptcha: false,\r\n        forgetCaptcha: false,\r\n        emailActive: false,\r\n        QQLogin: false,\r\n        themes: null,\r\n        authn: false,\r\n        theme: {\r\n            palette: {\r\n                common: { black: \"#000\", white: \"#fff\" },\r\n                background: { paper: \"#fff\", default: \"#fafafa\" },\r\n                primary: {\r\n                    light: \"#7986cb\",\r\n                    main: \"#3f51b5\",\r\n                    dark: \"#303f9f\",\r\n                    contrastText: \"#fff\",\r\n                },\r\n                secondary: {\r\n                    light: \"#ff4081\",\r\n                    main: \"#f50057\",\r\n                    dark: \"#c51162\",\r\n                    contrastText: \"#fff\",\r\n                },\r\n                error: {\r\n                    light: \"#e57373\",\r\n                    main: \"#f44336\",\r\n                    dark: \"#d32f2f\",\r\n                    contrastText: \"#fff\",\r\n                },\r\n                text: {\r\n                    primary: \"rgba(0, 0, 0, 0.87)\",\r\n                    secondary: \"rgba(0, 0, 0, 0.54)\",\r\n                    disabled: \"rgba(0, 0, 0, 0.38)\",\r\n                    hint: \"rgba(0, 0, 0, 0.38)\",\r\n                },\r\n                explorer: {\r\n                    filename: \"#474849\",\r\n                    icon: \"#8f8f8f\",\r\n                    bgSelected: \"#D5DAF0\",\r\n                    emptyIcon: \"#e8e8e8\",\r\n                },\r\n            },\r\n        },\r\n        captcha_ReCaptchaKey: \"defaultKey\",\r\n        captcha_type: \"normal\",\r\n        tcaptcha_captcha_app_id: \"\",\r\n    },\r\n    navigator: {\r\n        path: \"/\",\r\n        refresh: true,\r\n    },\r\n};\r\n\r\nconst defaultStatus = InitSiteConfig(initState);\r\n\r\n// TODO: 将cloureveApp切分成小的reducer\r\nconst cloudreveApp = (state = defaultStatus, action) => {\r\n    switch (action.type) {\r\n        case \"SET_NAVIGATOR\":\r\n            return doNavigate(action.path, state);\r\n        case \"TOGGLE_DAYLIGHT_MODE\": {\r\n            const copy = Object.assign({}, state);\r\n            if (\r\n                copy.siteConfig.theme.palette.type === undefined ||\r\n                copy.siteConfig.theme.palette.type === \"light\"\r\n            ) {\r\n                return {\r\n                    ...state,\r\n                    siteConfig: {\r\n                        ...state.siteConfig,\r\n                        theme: {\r\n                            ...state.siteConfig.theme,\r\n                            palette: {\r\n                                ...state.siteConfig.theme.palette,\r\n                                type: \"dark\",\r\n                            },\r\n                        },\r\n                    },\r\n                };\r\n            }\r\n            return {\r\n                ...state,\r\n                siteConfig: {\r\n                    ...state.siteConfig,\r\n                    theme: {\r\n                        ...state.siteConfig.theme,\r\n                        palette: {\r\n                            ...state.siteConfig.theme.palette,\r\n                            type: \"light\",\r\n                        },\r\n                    },\r\n                },\r\n            };\r\n        }\r\n        case \"APPLY_THEME\":\r\n            if (state.siteConfig.themes !== null) {\r\n                const themes = JSON.parse(state.siteConfig.themes);\r\n                if (themes[action.theme] === undefined) {\r\n                    return state;\r\n                }\r\n                return Object.assign({}, state, {\r\n                    siteConfig: Object.assign({}, state.siteConfig, {\r\n                        theme: themes[action.theme],\r\n                    }),\r\n                });\r\n            }\r\n            break;\r\n        case \"NAVIGATOR_UP\":\r\n            return doNavigate(action.path, state);\r\n        case \"SET_SITE_CONFIG\":\r\n            return Object.assign({}, state, {\r\n                siteConfig: action.config,\r\n            });\r\n        case \"REFRESH_FILE_LIST\":\r\n            return Object.assign({}, state, {\r\n                navigator: Object.assign({}, state.navigator, {\r\n                    refresh: !state.navigator.refresh,\r\n                }),\r\n            });\r\n        case \"SEARCH_MY_FILE\":\r\n            return Object.assign({}, state, {\r\n                navigator: Object.assign({}, state.navigator, {\r\n                    path: \"/\" + i18next.t(\"fileManager.searchResult\"),\r\n                    refresh: !state.explorer.search\r\n                        ? state.navigator.refresh\r\n                        : !state.navigator.refresh,\r\n                }),\r\n            });\r\n        default:\r\n            return state;\r\n    }\r\n};\r\n\r\nexport default (history) => (state, action) => {\r\n    const { viewUpdate: viewUpdateState, explorer: explorerState } =\r\n        state || {};\r\n    const appState = cloudreveApp(state, action);\r\n    const combinedState = combineReducers({\r\n        viewUpdate,\r\n        explorer,\r\n        router: connectRouter(history),\r\n    })({ viewUpdate: viewUpdateState, explorer: explorerState }, action);\r\n    return {\r\n        ...appState,\r\n        ...combinedState,\r\n    };\r\n};\r\n","import React from \"react\";\r\nimport { withStyles } from \"@material-ui/core\";\r\nimport { withTranslation } from \"react-i18next\";\r\n\r\nconst styles = {\r\n    h1: {\r\n        color: \"#a4a4a4\",\r\n        margin: \"5px 0px\",\r\n    },\r\n    h2: {\r\n        margin: \"15px 0px\",\r\n    },\r\n};\r\n\r\nclass ErrorBoundary extends React.Component {\r\n    constructor(props) {\r\n        super(props);\r\n        this.state = { hasError: false, error: null, errorInfo: null };\r\n    }\r\n\r\n    static getDerivedStateFromError() {\r\n        return { hasError: true };\r\n    }\r\n\r\n    componentDidCatch(error, errorInfo) {\r\n        this.setState({\r\n            error: error,\r\n            errorInfo: errorInfo,\r\n        });\r\n    }\r\n\r\n    render() {\r\n        const { classes, t } = this.props;\r\n        if (this.state.hasError) {\r\n            return (\r\n                <>\r\n                    <h1 className={classes.h1}>:(</h1>\r\n                    <h2 className={classes.h2}>{t(\"renderError\")}</h2>\r\n                    {this.state.error &&\r\n                        this.state.errorInfo &&\r\n                        this.state.errorInfo.componentStack && (\r\n                            <details>\r\n                                <summary>{t(\"errorDetails\")}</summary>\r\n                                <pre>\r\n                                    <code>{this.state.error.toString()}</code>\r\n                                </pre>\r\n                                <pre>\r\n                                    <code>\r\n                                        {this.state.errorInfo.componentStack}\r\n                                    </code>\r\n                                </pre>\r\n                            </details>\r\n                        )}\r\n                </>\r\n            );\r\n        }\r\n\r\n        return this.props.children;\r\n    }\r\n}\r\n\r\nexport default withTranslation([\"common\"])(withStyles(styles)(ErrorBoundary));\r\n","import React, { Suspense } from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport * as serviceWorker from \"./serviceWorker\";\r\nimport { Route, Switch } from \"react-router-dom\";\r\nimport { Provider } from \"react-redux\";\r\nimport { applyMiddleware, compose, createStore } from \"redux\";\r\nimport thunk from \"redux-thunk\";\r\nimport App from \"./App\";\r\nimport cloureveApp from \"./reducers\";\r\nimport { UpdateSiteConfig } from \"./middleware/Init\";\r\nimport ErrorBoundary from \"./component/Placeholder/ErrorBoundary\";\r\nimport { createBrowserHistory } from \"history\";\r\nimport { ConnectedRouter, routerMiddleware } from \"connected-react-router\";\r\nimport i18next from \"./i18n\";\r\nimport PageLoading from \"./component/Placeholder/PageLoading\";\r\n\r\nconst Admin = React.lazy(() => import(\"./Admin\"));\r\n\r\nif (window.location.hash !== \"\") {\r\n    window.location.href = window.location.hash.split(\"#\")[1];\r\n}\r\nserviceWorker.register({\r\n    onUpdate: (registration) => {\r\n        alert(i18next.t(\"newVersionRefresh\", { ns: \"common\" }));\r\n        if (registration && registration.waiting) {\r\n            registration.waiting.postMessage({ type: \"SKIP_WAITING\" });\r\n        }\r\n        window.location.reload();\r\n    },\r\n});\r\n\r\nexport const history = createBrowserHistory();\r\nlet reduxEnhance = applyMiddleware(routerMiddleware(history), thunk);\r\nif (\r\n    process.env.NODE_ENV === \"development\" &&\r\n    window.__REDUX_DEVTOOLS_EXTENSION__\r\n) {\r\n    reduxEnhance = compose(reduxEnhance, window.__REDUX_DEVTOOLS_EXTENSION__());\r\n}\r\n\r\nconst store = createStore(cloureveApp(history), reduxEnhance);\r\nUpdateSiteConfig(store);\r\n\r\nReactDOM.render(\r\n    <Suspense fallback={<PageLoading />}>\r\n        <ErrorBoundary>\r\n            <Provider store={store}>\r\n                <ConnectedRouter history={history}>\r\n                    <Switch>\r\n                        <Route path=\"/admin\">\r\n                            <Admin />\r\n                        </Route>\r\n                        <Route exact path=\"\">\r\n                            <App />\r\n                        </Route>\r\n                    </Switch>\r\n                </ConnectedRouter>\r\n            </Provider>\r\n        </ErrorBoundary>\r\n    </Suspense>,\r\n    document.getElementById(\"root\")\r\n);\r\n","import {\r\n    combineReducers as combine,\r\n    ReducersMapObject,\r\n    AnyAction,\r\n} from \"redux\";\r\nimport invariant from \"invariant\";\r\n\r\nexport const combineReducers = (reducers: ReducersMapObject) => {\r\n    const combinedReducer = combine(reducers);\r\n    // TODO: define state type\r\n    return (state: any, action: AnyAction) => {\r\n        if (\r\n            action.type &&\r\n            !action.type.startsWith(\"@@\") &&\r\n            action.type.split(\"/\").length > 1\r\n        ) {\r\n            const namespace = action.type.split(\"/\")[0];\r\n            const reducer = reducers[namespace];\r\n            invariant(!!reducer, `reducer ${namespace} doesn't exist`);\r\n            return reducer && reducer(state, action);\r\n        }\r\n        return combinedReducer(state, action);\r\n    };\r\n};\r\n","import React from \"react\";\r\nimport { PackageVariant } from \"mdi-material-ui\";\r\nimport { makeStyles } from \"@material-ui/core\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n    emptyContainer: {\r\n        bottom: \"0\",\r\n\r\n        color: theme.palette.action.disabled,\r\n        textAlign: \"center\",\r\n        paddingTop: \"20px\",\r\n    },\r\n    emptyInfoBig: {\r\n        fontSize: \"25px\",\r\n        color: theme.palette.action.disabled,\r\n    },\r\n    emptyInfoSmall: {\r\n        color: theme.palette.action.disabled,\r\n    },\r\n}));\r\n\r\nexport default function Nothing({ primary, secondary, top = 20, size = 1 }) {\r\n    const classes = useStyles();\r\n    return (\r\n        <div\r\n            style={{\r\n                margin: `${50 * size}px auto`,\r\n                paddingTop: top,\r\n            }}\r\n            className={classes.emptyContainer}\r\n        >\r\n            <PackageVariant\r\n                style={{\r\n                    fontSize: 160 * size,\r\n                }}\r\n            />\r\n            <div\r\n                style={{\r\n                    fontSize: 25 * size,\r\n                }}\r\n                className={classes.emptyInfoBig}\r\n            >\r\n                {primary}\r\n            </div>\r\n            {secondary !== \"\" && (\r\n                <div className={classes.emptyInfoSmall}>{secondary}</div>\r\n            )}\r\n        </div>\r\n    );\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport FolderIcon from \"@material-ui/icons/Folder\";\r\nimport RightIcon from \"@material-ui/icons/KeyboardArrowRight\";\r\nimport UpIcon from \"@material-ui/icons/ArrowUpward\";\r\nimport { connect } from \"react-redux\";\r\nimport classNames from \"classnames\";\r\n\r\nimport {\r\n    IconButton,\r\n    ListItemIcon,\r\n    ListItemSecondaryAction,\r\n    ListItemText,\r\n    MenuItem,\r\n    MenuList,\r\n    withStyles,\r\n} from \"@material-ui/core\";\r\nimport API from \"../../middleware/Api\";\r\nimport { toggleSnackbar } from \"../../redux/explorer\";\r\n\r\nconst mapStateToProps = (state) => {\r\n    return {\r\n        search: state.explorer.search,\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n    return {\r\n        toggleSnackbar: (vertical, horizontal, msg, color) => {\r\n            dispatch(toggleSnackbar(vertical, horizontal, msg, color));\r\n        },\r\n    };\r\n};\r\n\r\nconst styles = (theme) => ({\r\n    iconWhite: {\r\n        color: theme.palette.common.white,\r\n    },\r\n    selected: {\r\n        backgroundColor: theme.palette.primary.main + \"!important\",\r\n        \"& $primary, & $icon\": {\r\n            color: theme.palette.common.white,\r\n        },\r\n    },\r\n    primary: {},\r\n    icon: {},\r\n    buttonIcon: {},\r\n    selector: {\r\n        minWidth: \"300px\",\r\n    },\r\n    container: {\r\n        maxHeight: \"330px\",\r\n        overflowY: \" auto\",\r\n    },\r\n});\r\n\r\nclass PathSelectorCompoment extends Component {\r\n    state = {\r\n        presentPath: \"/\",\r\n        dirList: [],\r\n        selectedTarget: null,\r\n    };\r\n\r\n    componentDidMount = () => {\r\n        const toBeLoad = this.props.presentPath;\r\n        this.enterFolder(!this.props.search ? toBeLoad : \"/\");\r\n    };\r\n\r\n    back = () => {\r\n        const paths = this.state.presentPath.split(\"/\");\r\n        paths.pop();\r\n        const toBeLoad = paths.join(\"/\");\r\n        this.enterFolder(toBeLoad === \"\" ? \"/\" : toBeLoad);\r\n    };\r\n\r\n    enterFolder = (toBeLoad) => {\r\n        API.get(\r\n            (this.props.api ? this.props.api : \"/directory\") +\r\n                encodeURIComponent(toBeLoad)\r\n        )\r\n            .then((response) => {\r\n                const dirList = response.data.objects.filter((x) => {\r\n                    return (\r\n                        x.type === \"dir\" &&\r\n                        this.props.selected.findIndex((value) => {\r\n                            return (\r\n                                value.name === x.name && value.path === x.path\r\n                            );\r\n                        }) === -1\r\n                    );\r\n                });\r\n                if (toBeLoad === \"/\") {\r\n                    dirList.unshift({ name: \"/\", path: \"\" });\r\n                }\r\n                this.setState({\r\n                    presentPath: toBeLoad,\r\n                    dirList: dirList,\r\n                    selectedTarget: null,\r\n                });\r\n            })\r\n            .catch((error) => {\r\n                this.props.toggleSnackbar(\r\n                    \"top\",\r\n                    \"right\",\r\n                    error.message,\r\n                    \"warning\"\r\n                );\r\n            });\r\n    };\r\n\r\n    handleSelect = (index) => {\r\n        this.setState({ selectedTarget: index });\r\n        this.props.onSelect(this.state.dirList[index]);\r\n    };\r\n\r\n    render() {\r\n        const { classes } = this.props;\r\n\r\n        return (\r\n            <div className={classes.container}>\r\n                <MenuList className={classes.selector}>\r\n                    {this.state.presentPath !== \"/\" && (\r\n                        <MenuItem onClick={this.back}>\r\n                            <ListItemIcon>\r\n                                <UpIcon />\r\n                            </ListItemIcon>\r\n                            <ListItemText primary=\"返回上一层\" />\r\n                        </MenuItem>\r\n                    )}\r\n                    {this.state.dirList.map((value, index) => (\r\n                        <MenuItem\r\n                            classes={{\r\n                                selected: classes.selected,\r\n                            }}\r\n                            key={index}\r\n                            selected={this.state.selectedTarget === index}\r\n                            onClick={() => this.handleSelect(index)}\r\n                        >\r\n                            <ListItemIcon className={classes.icon}>\r\n                                <FolderIcon />\r\n                            </ListItemIcon>\r\n                            <ListItemText\r\n                                classes={{ primary: classes.primary }}\r\n                                primary={value.name}\r\n                                primaryTypographyProps={{\r\n                                    style: { whiteSpace: \"normal\" },\r\n                                }}\r\n                            />\r\n                            {value.name !== \"/\" && (\r\n                                <ListItemSecondaryAction\r\n                                    className={classes.buttonIcon}\r\n                                >\r\n                                    <IconButton\r\n                                        className={classNames({\r\n                                            [classes.iconWhite]:\r\n                                                this.state.selectedTarget ===\r\n                                                index,\r\n                                        })}\r\n                                        onClick={() =>\r\n                                            this.enterFolder(\r\n                                                value.path === \"/\"\r\n                                                    ? value.path + value.name\r\n                                                    : value.path +\r\n                                                          \"/\" +\r\n                                                          value.name\r\n                                            )\r\n                                        }\r\n                                    >\r\n                                        <RightIcon />\r\n                                    </IconButton>\r\n                                </ListItemSecondaryAction>\r\n                            )}\r\n                        </MenuItem>\r\n                    ))}\r\n                </MenuList>\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nPathSelectorCompoment.propTypes = {\r\n    classes: PropTypes.object.isRequired,\r\n    presentPath: PropTypes.string.isRequired,\r\n    selected: PropTypes.array.isRequired,\r\n};\r\n\r\nexport default connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(withStyles(styles)(PathSelectorCompoment));\r\n","import { useDispatch } from \"react-redux\";\r\nimport { useCallback, useEffect, useState } from \"react\";\r\nimport { changeSubTitle } from \"../redux/viewUpdate/action\";\r\nimport pathHelper from \"../utils/page\";\r\n\r\nexport default function UseFileSubTitle(query, math, location) {\r\n    const dispatch = useDispatch();\r\n    const [title, setTitle] = useState(\"\");\r\n    const [path, setPath] = useState(\"\");\r\n    const SetSubTitle = useCallback(\r\n        (title) => dispatch(changeSubTitle(title)),\r\n        [dispatch]\r\n    );\r\n\r\n    useEffect(() => {\r\n        if (!pathHelper.isSharePage(location.pathname)) {\r\n            const path = query.get(\"p\").split(\"/\");\r\n            setPath(query.get(\"p\"));\r\n            SetSubTitle(path[path.length - 1]);\r\n            setTitle(path[path.length - 1]);\r\n        } else {\r\n            SetSubTitle(query.get(\"name\"));\r\n            setTitle(query.get(\"name\"));\r\n            setPath(query.get(\"share_path\"));\r\n        }\r\n        // eslint-disable-next-line\r\n    }, [math.params[0], location]);\r\n\r\n    return { title, path };\r\n}\r\n"],"sourceRoot":""}