{"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":""}