{"version":3,"file":"drive-routes-cda03da8.mjs","sources":["../../../resources/client/drive/drive-query-keys.ts","../../../resources/client/drive/shareable-link/shareable-link-page/link-page-store.ts","../../../resources/client/drive/shareable-link/queries/use-shareable-link-page.ts","../../../resources/client/drive/shareable-link/shareable-link-page/queries/check-link-password.ts","../../../resources/client/drive/shareable-link/shareable-link-page/queries/import-into-own-drive.ts","../../../resources/client/drive/shareable-link/shareable-link-page/shareable-link-page-action-buttons.tsx","../../../resources/client/drive/shareable-link/shareable-link-page/shareable-link-navbar.tsx","../../../resources/client/drive/shareable-link/shareable-link-page/password-page.tsx","../../../resources/client/drive/file-view/file-grid/base-file-grid-item.tsx","../../../resources/client/drive/shareable-link/shareable-link-page/folder-preview/folder-preview-file-grid.tsx","../../../resources/client/drive/drive-store.ts","../../../resources/client/drive/shareable-link/queries/create-shareable-link.ts","../../../resources/client/drive/files/queries/use-add-star-to-entries.ts","../../../resources/client/drive/files/queries/use-remove-star-from-entries.ts","../../../resources/client/drive/files/queries/use-duplicate-entries.ts","../../../resources/client/drive/drive-page/add-files.svg","../../../resources/client/drive/drive-page/time-management.svg","../../../resources/client/drive/drive-page/file-searching.svg","../../../resources/client/drive/drive-page/throw-away.svg","../../../resources/client/drive/drive-page/loving-it.svg","../../../resources/client/drive/shareable-link/shareable-link-page/folder-preview/share.svg","../../../resources/client/drive/drive-page/drive-page.tsx","../../../resources/client/drive/files/queries/use-delete-entries.ts","../../../resources/client/drive/share-dialog/queries/use-unshare-entries.ts","../../../resources/client/drive/files/queries/use-restore-entries.ts","../../../resources/client/drive/entry-actions/use-entry-actions.ts","../../../resources/client/drive/layout/sidebar/storage-summary/storage-summary.ts","../../../resources/client/drive/uploading/use-drive-upload-queue.ts","../../../resources/client/drive/entry-actions/use-drive-page-actions.ts","../../../resources/client/drive/entry-actions/entry-action-menu-trigger.tsx","../../../resources/client/drive/file-view/file-table/file-table-columns.tsx","../../../resources/client/drive/shareable-link/shareable-link-page/folder-preview/folder-preview-file-table.tsx","../../../resources/client/drive/shareable-link/shareable-link-page/folder-preview/use-navigate-to-subfolder.tsx","../../../resources/client/drive/shareable-link/shareable-link-page/folder-preview/folder-preview-file-view.tsx","../../../common/resources/client/ui/layout/dashboard-content-header.tsx","../../../resources/client/drive/files/queries/use-folder-path.ts","../../../resources/client/drive/shareable-link/shareable-link-page/folder-preview/folder-preview-breadcrumb.tsx","../../../resources/client/drive/layout/sorting/available-sorts.ts","../../../resources/client/drive/layout/sorting/entries-sort-button.tsx","../../../resources/client/drive/shareable-link/shareable-link-page/folder-preview/folder-preview-header.tsx","../../../resources/client/drive/shareable-link/shareable-link-page/folder-preview/folder-preview.tsx","../../../resources/client/drive/shareable-link/shareable-link-page/shareable-link-page-file-preview.tsx","../../../resources/client/drive/shareable-link/shareable-link-page/shareable-link-page.tsx","../../../common/resources/client/ui/progress/meter.tsx","../../../resources/client/drive/layout/sidebar/storage-summary/storage-meter.tsx","../../../common/resources/client/workspace/requests/create-workspace.ts","../../../common/resources/client/workspace/new-workspace-dialog.tsx","../../../common/resources/client/workspace/requests/workspace-with-members.ts","../../../common/resources/client/workspace/requests/invite-members.ts","../../../common/resources/client/workspace/requests/resend-invite.ts","../../../common/resources/client/utils/string/is-email.ts","../../../common/resources/client/workspace/requests/change-role.ts","../../../common/resources/client/workspace/requests/remove-member.ts","../../../common/resources/client/workspace/leave-workspace-confirmation.tsx","../../../common/resources/client/workspace/workspace-members-dialog.tsx","../../../common/resources/client/workspace/requests/update-workspace.ts","../../../common/resources/client/workspace/rename-workspace-dialog.tsx","../../../common/resources/client/workspace/requests/delete-workspace.ts","../../../common/resources/client/workspace/workspace-selector.tsx","../../../resources/client/drive/menu-positions.ts","../../../resources/client/drive/files/queries/use-folders.ts","../../../resources/client/drive/files/queries/use-move-entries.ts","../../../resources/client/drive/files/utils/can-move-entries-into.ts","../../../resources/client/drive/files/use-folder-drop-action.ts","../../../resources/client/drive/layout/sidebar/folder-tree-drag-id.ts","../../../resources/client/drive/layout/sidebar/use-sidebar-tree-drop-target.ts","../../../common/resources/client/ui/tree/tree-context.tsx","../../../common/resources/client/ui/tree/render-tree.ts","../../../common/resources/client/ui/tree/tree-label.tsx","../../../common/resources/client/ui/tree/tree-item.tsx","../../../common/resources/client/ui/tree/tree.tsx","../../../resources/client/drive/layout/sidebar/folder-tree.tsx","../../../resources/client/drive/layout/sidebar/sidebar-menu.tsx","../../../resources/client/drive/layout/create-new-button.tsx","../../../resources/client/drive/layout/sidebar/sidebar.tsx","../../../resources/client/drive/files/queries/use-paginated-entries.ts","../../../resources/client/drive/search/drive-search-filters.ts","../../../resources/client/drive/search/search-filter-list.tsx","../../../common/resources/client/ui/interactions/utils/restrict-resizable-within-boundary.ts","../../../common/resources/client/ui/interactions/dnd/mouse-selection/use-mouse-selectable.ts","../../../common/resources/client/ui/interactions/utils/rects-intersect.ts","../../../common/resources/client/ui/interactions/dnd/mouse-selection/use-mouse-selection-box.ts","../../../resources/client/drive/files/queries/use-entries.ts","../../../resources/client/drive/files/use-selected-entries.ts","../../../resources/client/drive/entry-actions/entry-action-list.tsx","../../../resources/client/drive/files/drive-context-menu.tsx","../../../common/resources/client/utils/hooks/is-touch-device.ts","../../../resources/client/drive/file-view/use-file-view-dnd.ts","../../../resources/client/drive/file-view/file-table/file-table-row.tsx","../../../resources/client/drive/file-view/use-view-item-action-handler.ts","../../../resources/client/drive/file-view/file-table/file-table.tsx","../../../resources/client/drive/file-view/file-grid/file-grid-item.tsx","../../../resources/client/drive/file-view/file-grid/file-grid.tsx","../../../resources/client/drive/layout/sorting/drive-sort-button.tsx","../../../resources/client/drive/page-breadcrumbs.tsx","../../../common/resources/client/ui/infinite-scroll/infinite-scroll-sentinel.tsx","../../../resources/client/drive/drop-target-mask.tsx","../../../resources/client/drive/file-view/file-view.tsx","../../../resources/client/drive/uploading/upload-queue-item.tsx","../../../resources/client/drive/uploading/upload-queue.tsx","../../../resources/client/drive/details-sidebar/detailed-examination.svg","../../../resources/client/drive/details-sidebar/details-sidebar-header.tsx","../../../resources/client/drive/details-sidebar/details-sidebar-section-header.tsx","../../../resources/client/drive/details-sidebar/requests/use-sync-entry-tags.ts","../../../resources/client/drive/details-sidebar/requests/use-file-entry-tags.ts","../../../resources/client/drive/details-sidebar/details-sidebar-tags.tsx","../../../resources/client/drive/details-sidebar/details-sidebar-properties.tsx","../../../resources/client/drive/details-sidebar/details-sidebar.tsx","../../../resources/client/drive/files/queries/use-rename-entry.ts","../../../resources/client/drive/files/dialogs/rename-entry-dialog.tsx","../../../resources/client/drive/files/queries/create-folder.ts","../../../resources/client/drive/files/dialogs/new-folder-dialog.tsx","../../../resources/client/drive/files/dialogs/entry-preview-dialog.tsx","../../../resources/client/drive/share-dialog/queries/use-share-entry.ts","../../../resources/client/drive/files/drive-entry.ts","../../../resources/client/drive/share-dialog/permission-selector.tsx","../../../resources/client/drive/share-dialog/queries/use-change-permission.ts","../../../common/resources/client/ui/images/user-avatar.tsx","../../../resources/client/drive/share-dialog/member-list.tsx","../../../resources/client/drive/share-dialog/share-panel.tsx","../../../resources/client/drive/shareable-link/queries/use-entry-shareable-link.ts","../../../resources/client/drive/shareable-link/queries/use-delete-shareable-link.ts","../../../common/resources/client/utils/string/random-string.ts","../../../resources/client/drive/share-dialog/link-panel/shareable-link-panel.tsx","../../../resources/client/drive/shareable-link/queries/use-update-shareable-link.ts","../../../resources/client/drive/share-dialog/link-panel/link-settings-dialog.tsx","../../../resources/client/drive/share-dialog/share-dialog.tsx","../../../resources/client/drive/files/dialogs/move-entries-dialog/move-entries-dialog-search.tsx","../../../resources/client/drive/files/dialogs/move-entries-dialog/move-entries-dialog-breadcrumbs.tsx","../../../resources/client/drive/files/dialogs/move-entries-dialog/my-files.svg","../../../resources/client/drive/files/dialogs/move-entries-dialog/move-entries-dialog-folder-list.tsx","../../../resources/client/drive/files/dialogs/move-entries-dialog/move-entries-dialog.tsx","../../../resources/client/drive/files/dialogs/delete-entries-forever-dialog.tsx","../../../resources/client/drive/files/dialogs/block-trash-folder-view-dialog.tsx","../../../resources/client/drive/files/dialogs/drive-dialogs-container.tsx","../../../resources/client/drive/search/navbar-search.tsx","../../../common/resources/client/ui/interactions/dnd/use-drag-monitor.ts","../../../resources/client/drive/file-view/entry-drag-preview.tsx","../../../resources/client/drive/layout/drive-content-header.tsx","../../../resources/client/drive/layout/drive-layout.tsx","../../../resources/client/drive/drive-routes.tsx"],"sourcesContent":["import type {DriveApiIndexParams} from './files/queries/use-paginated-entries';\nimport type {UserFoldersApiParams} from './files/queries/use-folders';\nimport {queryClient} from '@common/http/query-client';\nimport {Key} from 'react';\n\nexport const DriveQueryKeys = {\n fetchEntries: (params?: DriveApiIndexParams) => {\n const key: ('drive-entries' | DriveApiIndexParams)[] = ['drive-entries'];\n if (params) key.push(params);\n return key;\n },\n fetchUserFolders(params?: UserFoldersApiParams) {\n const key: (string | UserFoldersApiParams)[] = ['user-folders'];\n if (params) {\n key.push(params);\n }\n return key;\n },\n fetchShareableLink: (params?: {hash?: string; sort?: string}) => {\n const key: (string | object)[] = ['shareable-link'];\n if (params) {\n key.push(params);\n }\n return key;\n },\n fetchFolderPath(\n hash?: string,\n params?: Record,\n ) {\n const key: (string | any)[] = ['folder-path'];\n if (hash) {\n key.push(hash);\n }\n if (params) {\n key.push(params);\n }\n return key;\n },\n fetchEntryShareableLink: (entryId: number) => {\n return ['file-entries', entryId, 'shareable-link'];\n },\n fetchFileEntry: (id?: number) => {\n const key: Key[] = ['drive/file-entries/model'];\n if (id) key.push(id);\n return key;\n },\n fetchStorageSummary: ['storage-summary'],\n};\n\nexport function invalidateEntryQueries() {\n return Promise.all([\n queryClient.invalidateQueries({queryKey: DriveQueryKeys.fetchEntries()}),\n queryClient.invalidateQueries({queryKey: DriveQueryKeys.fetchFolderPath()}),\n queryClient.invalidateQueries({\n queryKey: DriveQueryKeys.fetchUserFolders(),\n }),\n // fetching model for single file entry in \"useFileEntry\"\n queryClient.invalidateQueries({queryKey: DriveQueryKeys.fetchFileEntry()}),\n ]);\n}\n","import {create} from 'zustand';\nimport {immer} from 'zustand/middleware/immer';\nimport {DriveSortDescriptor} from '../../drive-store';\nimport {\n getFromLocalStorage,\n setInLocalStorage,\n} from '@common/utils/hooks/local-storage';\n\ninterface LinkPageState {\n password: string | null;\n setPassword: (value: string) => void;\n isPasswordProtected: boolean;\n setIsPasswordProtected: (value: boolean) => void;\n activeSort: DriveSortDescriptor;\n setActiveSort: (value: DriveSortDescriptor) => void;\n viewMode: 'grid' | 'list';\n setViewMode: (mode: 'grid' | 'list') => void;\n}\n\nexport const useLinkPageStore = create()(\n immer(set => ({\n password: null,\n viewMode: getFromLocalStorage<'list' | 'grid'>('drive.viewMode'),\n activeSort: {\n orderBy: 'updated_at',\n orderDir: 'desc',\n },\n setPassword: value => {\n set(state => {\n state.password = value;\n });\n },\n isPasswordProtected: false,\n setIsPasswordProtected: value => {\n set(state => {\n state.isPasswordProtected = value;\n });\n },\n\n setViewMode: mode => {\n set(state => {\n state.viewMode = mode;\n setInLocalStorage('drive.viewMode', mode);\n });\n },\n setActiveSort: value => {\n set(state => {\n state.activeSort = value;\n });\n },\n }))\n);\n\nexport function linkPageState() {\n return useLinkPageStore.getState();\n}\n","import {keepPreviousData, useInfiniteQuery} from '@tanstack/react-query';\nimport {useParams} from 'react-router-dom';\nimport type {FetchShareableLinkResponse} from './use-entry-shareable-link';\nimport type {DriveEntry} from '../../files/drive-entry';\nimport {DriveQueryKeys} from '../../drive-query-keys';\nimport {\n linkPageState,\n useLinkPageStore,\n} from '../shareable-link-page/link-page-store';\nimport {LengthAwarePaginationResponse} from '@common/http/backend-response/pagination-response';\nimport {apiClient} from '@common/http/query-client';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\nexport interface FetchShareableLinkPageResponse\n extends FetchShareableLinkResponse {\n folderChildren: LengthAwarePaginationResponse;\n passwordInvalid: boolean;\n}\n\nexport function useShareableLinkPage() {\n const {hash} = useParams();\n const {orderBy, orderDir} = useLinkPageStore(s => s.activeSort);\n const order = `${orderBy}:${orderDir}`;\n const isPasswordProtected = useLinkPageStore(s => s.isPasswordProtected);\n const password = useLinkPageStore(s => s.password);\n\n const query = useInfiniteQuery({\n queryKey: DriveQueryKeys.fetchShareableLink({hash, sort: order}),\n queryFn: async ({pageParam = 1}) => {\n const response = await fetchLinkByHash({\n hash: hash!,\n page: pageParam,\n order,\n password,\n });\n if (response.passwordInvalid) {\n linkPageState().setIsPasswordProtected(true);\n }\n return response;\n },\n initialData: () => {\n const data = getBootstrapData().loaders?.shareableLinkPage;\n if (data && data.link?.hash === hash) {\n if (data.passwordInvalid) {\n linkPageState().setIsPasswordProtected(true);\n }\n return {\n pageParams: [undefined, 1],\n pages: [data],\n };\n }\n },\n initialPageParam: 1,\n getNextPageParam: lastResponse => {\n if (!lastResponse.folderChildren) return undefined;\n const currentPage = lastResponse.folderChildren.current_page;\n const lastPage = lastResponse.folderChildren.last_page;\n if (currentPage >= lastPage) {\n return undefined;\n }\n return currentPage + 1;\n },\n // disable query if link is password protected and correct\n // password was not entered yet, to prevent unnecessary requests\n enabled: (!!hash && !isPasswordProtected) || password != null,\n placeholderData: keepPreviousData,\n });\n\n return {\n ...query,\n link: query.data?.pages[0].link,\n entries: query.data?.pages.flatMap(p => p.folderChildren?.data),\n };\n}\n\ninterface FetchLinkByHashParams {\n hash: string;\n page?: number;\n order?: string;\n password?: string | null;\n}\nfunction fetchLinkByHash({\n hash,\n page = 1,\n order,\n password,\n}: FetchLinkByHashParams): Promise {\n return apiClient\n .get(`shareable-links/${hash}`, {\n params: {loader: 'shareableLinkPage', page, order, password},\n })\n .then(response => response.data);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {linkPageState} from '../link-page-store';\nimport {apiClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {message} from '@common/i18n/message';\n\ninterface Response extends BackendResponse {\n matches: boolean;\n}\n\ninterface Props {\n password: string;\n linkHash: string;\n}\n\nfunction checkLinkPassword({password, linkHash}: Props): Promise {\n return apiClient\n .post(`shareable-links/${linkHash}/check-password`, {password})\n .then(r => r.data);\n}\n\nexport function useCheckLinkPassword() {\n return useMutation({\n mutationFn: (props: Props) => checkLinkPassword(props),\n onSuccess: (response, props) => {\n if (response.matches) {\n linkPageState().setPassword(props.password);\n }\n },\n onError: err => showHttpErrorToast(err, message('Could not create link')),\n });\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {DriveEntryUser} from '../../../files/drive-entry';\nimport {toast} from '@common/ui/toast/toast';\nimport {useLinkPageStore} from '../link-page-store';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {DriveQueryKeys} from '../../../drive-query-keys';\nimport {message} from '@common/i18n/message';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n users: DriveEntryUser[];\n}\n\ninterface Props {\n password: string | null;\n linkId: number;\n}\n\nfunction importIntoOwnDrive({linkId, password}: Props): Promise {\n return apiClient\n .post(`shareable-links/${linkId}/import`, {password})\n .then(r => r.data);\n}\n\nexport function useImportIntoOwnDrive() {\n const password = useLinkPageStore(s => s.password);\n return useMutation({\n mutationFn: (props: Omit) =>\n importIntoOwnDrive({...props, password}),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: DriveQueryKeys.fetchShareableLink(),\n });\n toast(message('Item imported into your drive'));\n },\n onError: err => showHttpErrorToast(err, message('Could not create link')),\n });\n}\n","import {useShareableLinkPage} from '../queries/use-shareable-link-page';\nimport {useAuth} from '@common/auth/use-auth';\nimport {useFileEntryUrls} from '@common/uploads/hooks/file-entry-urls';\nimport {useImportIntoOwnDrive} from './queries/import-into-own-drive';\nimport {Button} from '@common/ui/buttons/button';\nimport {FileDownloadIcon} from '@common/icons/material/FileDownload';\nimport {downloadFileFromUrl} from '@common/uploads/utils/download-file-from-url';\nimport {Trans} from '@common/i18n/trans';\nimport {\n Menu,\n MenuItem,\n MenuTrigger,\n} from '@common/ui/navigation/menu/menu-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {KeyboardArrowDownIcon} from '@common/icons/material/KeyboardArrowDown';\nimport {ImportExportIcon} from '@common/icons/material/ImportExport';\nimport React, {Fragment} from 'react';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\n\nexport function ShareableLinkPageActionButtons() {\n const {link} = useShareableLinkPage();\n const {user, isLoggedIn} = useAuth();\n const {downloadUrl} = useFileEntryUrls(link?.entry);\n const importIntoOwnDrive = useImportIntoOwnDrive();\n const alreadyImported = link?.entry?.users!.find(u => u.id === user?.id);\n\n if (!link?.entry) return null;\n\n return (\n
\n {link.allow_download && }\n {!alreadyImported && isLoggedIn && link.allow_edit && (\n {\n if (key === 'import') {\n importIntoOwnDrive.mutate({linkId: link.id});\n } else if (key === 'download') {\n if (downloadUrl) {\n downloadFileFromUrl(downloadUrl);\n }\n }\n }}\n >\n \n \n \n \n }>\n \n \n }>\n \n \n \n \n )}\n
\n );\n}\n\ninterface DownloadButtonProps {\n downloadUrl: string | undefined;\n}\nfunction DownloadButton({downloadUrl}: DownloadButtonProps) {\n return (\n \n }>\n {\n if (downloadUrl) {\n downloadFileFromUrl(downloadUrl);\n }\n }}\n >\n \n \n \n }\n onClick={() => {\n if (downloadUrl) {\n downloadFileFromUrl(downloadUrl);\n }\n }}\n >\n \n \n \n );\n}\n","import React from 'react';\nimport {FileTypeIcon} from '@common/uploads/file-type-icon/file-type-icon';\nimport {Navbar} from '@common/ui/navigation/navbar/navbar';\nimport {useShareableLinkPage} from '../queries/use-shareable-link-page';\nimport {ShareableLinkPageActionButtons} from './shareable-link-page-action-buttons';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\n\nexport function ShareableLinkNavbar() {\n const {link} = useShareableLinkPage();\n const isMobile = useIsMobileMediaQuery();\n return (\n }\n menuPosition=\"shareable-link-page\"\n hideLogo={isMobile}\n >\n {link?.entry && link.entry.type !== 'folder' && (\n
\n \n
\n {link.entry.name}\n
\n
\n )}\n \n );\n}\n","import {useState} from 'react';\nimport {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport {TextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Button} from '@common/ui/buttons/button';\nimport {useCheckLinkPassword} from './queries/check-link-password';\nimport {Trans} from '@common/i18n/trans';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {ShareableLinkNavbar} from './shareable-link-navbar';\nimport {useParams} from 'react-router-dom';\nimport secureFilesSvg from '@common/auth/ui/account-settings/access-token-panel/secure-files.svg';\n\nexport function PasswordPage() {\n const {trans} = useTrans();\n const {hash} = useParams();\n const fieldLabel = trans({message: 'Password'});\n const [password, setPassword] = useState('');\n const checkPassword = useCheckLinkPassword();\n const linkHash = hash ? hash.split(':')[0] : null;\n\n const passwordIsInvalid = checkPassword.data && !checkPassword.data.matches;\n\n return (\n
\n \n
\n
\n
\n \n
\n {\n e.preventDefault();\n checkPassword.mutate({\n linkHash: linkHash!,\n password,\n });\n }}\n >\n \n \n \n \n }\n onChange={e => {\n setPassword(e.target.value);\n }}\n />\n
\n \n \n \n
\n \n
\n
\n
\n );\n}\n","import React, {ComponentPropsWithoutRef, ReactNode} from 'react';\nimport clsx from 'clsx';\nimport {FileThumbnail} from '@common/uploads/file-type-icon/file-thumbnail';\nimport {DriveEntry} from '../../files/drive-entry';\n\ninterface BaseFileGridItemProps extends ComponentPropsWithoutRef<'div'> {\n entry: DriveEntry;\n className?: string;\n isSelected?: boolean;\n isMobileMode?: boolean;\n footerAdornment?: ReactNode;\n}\n\nexport const BaseFileGridItem = React.forwardRef<\n HTMLDivElement,\n BaseFileGridItemProps\n>(\n (\n {entry, className, isSelected, isMobileMode, footerAdornment, ...domProps},\n ref\n ) => {\n return (\n \n
\n \n
\n \n \n );\n }\n);\n\ninterface FooterProps {\n entry: DriveEntry;\n isSelected?: boolean;\n isMobile?: boolean;\n adornment?: ReactNode;\n}\nfunction Footer({entry, isSelected, isMobile, adornment}: FooterProps) {\n return (\n \n
\n {entry.name}\n
\n {adornment}\n \n );\n}\n","import {BaseFileGridItem} from '../../../file-view/file-grid/base-file-grid-item';\nimport React from 'react';\nimport {DriveEntry} from '../../../files/drive-entry';\n\nexport interface FolderPreviewGridProps {\n entries: DriveEntry[];\n onEntrySelected: (entry: DriveEntry, index: number) => void;\n}\nexport function FolderPreviewFileGrid({\n entries,\n onEntrySelected,\n}: FolderPreviewGridProps) {\n return (\n
\n {entries.map((entry, index) => (\n {\n e.preventDefault();\n }}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') {\n onEntrySelected(entry, index);\n }\n }}\n onClick={() => {\n onEntrySelected(entry, index);\n }}\n />\n ))}\n
\n );\n}\n","import {enableMapSet} from 'immer';\nimport {create} from 'zustand';\nimport {immer} from 'zustand/middleware/immer';\nimport type {DrivePage} from './drive-page/drive-page';\nimport {Key} from 'react';\nimport {DriveEntry} from './files/drive-entry';\nimport {SortColumn, SortDirection} from './layout/sorting/available-sorts';\nimport {\n getFromLocalStorage,\n setInLocalStorage,\n} from '@common/utils/hooks/local-storage';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\nconst stableArray: DriveEntry[] = [];\nenableMapSet();\n\nexport type DriveDialog =\n | 'rename'\n | 'newFolder'\n | 'preview'\n | 'share'\n | 'getLink'\n | 'moveTo'\n | 'confirmAndDeleteForever'\n | 'trashFolderBlock';\n\nexport interface ActiveActionDialog {\n name: DriveDialog;\n entries: DriveEntry[];\n}\n\nexport interface DriveSortDescriptor {\n orderBy?: SortColumn;\n orderDir?: SortDirection;\n}\n\ninterface State {\n uploadQueueIsOpen: boolean;\n selectedEntries: Set;\n sidebarExpandedKeys: Key[];\n activePage?: DrivePage;\n activeActionDialog?: {\n name: DriveDialog;\n entries: DriveEntry[];\n } | null;\n entriesBeingDragged: number[];\n viewMode: 'grid' | 'list';\n sortDescriptor: DriveSortDescriptor;\n contextMenuData: {x: number; y: number; entry?: DriveEntry} | null;\n}\n\ninterface Actions {\n setUploadQueueIsOpen: (isOpen: boolean) => void;\n setSidebarExpandedKeys: (keys: Key[]) => void;\n expandSidebarItem: (key: Key) => void;\n collapseSidebarItem: (key: Key) => void;\n toggleSidebarItem: (key: Key) => void;\n setActivePage: (page: DrivePage) => void;\n setActiveActionDialog: (\n name: DriveDialog | null,\n entries?: DriveEntry[]\n ) => void;\n setViewMode: (mode: 'grid' | 'list') => void;\n setSortDescriptor: (value: DriveSortDescriptor) => void;\n setContextMenuData: (\n position: {x: number; y: number; entry?: DriveEntry} | null\n ) => void;\n setEntriesBeingDragged: (value: number[]) => void;\n selectEntries: (\n entries: (number | undefined | null)[],\n merge?: boolean\n ) => void;\n deselectEntries: (entries: number[] | 'all') => void;\n reset: () => void;\n}\n\nconst initialState: State = {\n uploadQueueIsOpen: false,\n contextMenuData: null,\n selectedEntries: new Set(),\n entriesBeingDragged: [],\n activeActionDialog: null,\n sidebarExpandedKeys: [],\n viewMode: getFromLocalStorage<'list' | 'grid'>(\n 'drive.viewMode',\n getBootstrapData().settings?.drive?.default_view || 'grid'\n ),\n sortDescriptor: {\n orderBy: 'updated_at',\n orderDir: 'desc',\n },\n};\n\nexport const useDriveStore = create()(\n immer((set, get) => ({\n ...initialState,\n setUploadQueueIsOpen: isOpen => {\n set(state => {\n state.uploadQueueIsOpen = isOpen;\n });\n },\n setContextMenuData: data => {\n set(state => {\n state.contextMenuData = data;\n });\n },\n setSortDescriptor: value => {\n set(state => {\n const activePageId = get().activePage?.id;\n if (activePageId) {\n setInLocalStorage('selectedSorting', {\n ...getFromLocalStorage('selectedSorting'),\n [activePageId]: value,\n });\n }\n state.sortDescriptor = value;\n });\n },\n setActivePage: value => {\n set(state => {\n state.activePage = value;\n\n const storedDescriptor =\n getFromLocalStorage('selectedSorting')?.[value.id];\n state.sortDescriptor = storedDescriptor\n ? storedDescriptor\n : value.sortDescriptor;\n });\n },\n setEntriesBeingDragged: value => {\n set(state => {\n state.entriesBeingDragged = value;\n });\n },\n setActiveActionDialog: (name, entries = stableArray) => {\n set(state => {\n const current = get().activeActionDialog;\n // prevent creating a new object, if neither name nor entries changed\n if (current?.name !== name || current.entries !== entries) {\n state.activeActionDialog = name ? {name, entries} : null;\n }\n });\n },\n setViewMode: mode => {\n set(state => {\n state.viewMode = mode;\n setInLocalStorage('drive.viewMode', mode);\n });\n },\n setSidebarExpandedKeys: value =>\n set(state => {\n state.sidebarExpandedKeys = value;\n }),\n expandSidebarItem: key =>\n set(state => {\n if (!state.sidebarExpandedKeys.includes(key)) {\n state.sidebarExpandedKeys.push(key);\n }\n }),\n collapseSidebarItem: key =>\n set(state => {\n const index = state.sidebarExpandedKeys.indexOf(key);\n if (index > -1) {\n state.sidebarExpandedKeys.splice(index, 1);\n }\n }),\n toggleSidebarItem: key =>\n set(state => {\n if (state.sidebarExpandedKeys.includes(key)) {\n state.expandSidebarItem(key);\n } else {\n state.collapseSidebarItem(key);\n }\n }),\n selectEntries: (entries, merge) => {\n set(state => {\n if (!merge) {\n state.selectedEntries.clear();\n }\n entries.forEach(e => e && state.selectedEntries.add(e));\n });\n },\n deselectEntries: entries => {\n set(state => {\n if (!state.selectedEntries.size) return;\n if (entries === 'all') {\n state.selectedEntries = new Set();\n } else {\n entries.forEach(e => state.selectedEntries.delete(e));\n }\n });\n },\n reset: () => {\n set(initialState);\n },\n }))\n);\n\nexport function driveState() {\n return useDriveStore.getState();\n}\n\nexport function useActiveDialogEntry() {\n const dialog = useDriveStore(s => s.activeActionDialog);\n // this will only be used inside dialog, so entry will always be set in that case\n return dialog?.entries[0]!;\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {FetchShareableLinkResponse} from './use-entry-shareable-link';\nimport {DriveQueryKeys} from '../../drive-query-keys';\nimport {message} from '@common/i18n/message';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\nfunction createShareableLink(\n entryId?: number | null,\n): Promise {\n if (!entryId) {\n return Promise.reject(new Error('Invalid entry id'));\n }\n return apiClient\n .post(`file-entries/${entryId}/shareable-link`)\n .then(response => response.data);\n}\n\ninterface Payload {\n entryId: number;\n}\nexport function useCreateShareableLink() {\n return useMutation({\n mutationFn: ({entryId}: Payload) => createShareableLink(entryId),\n onSuccess: (data, {entryId}) => {\n queryClient.setQueryData(\n DriveQueryKeys.fetchEntryShareableLink(entryId),\n data,\n );\n },\n onError: err => showHttpErrorToast(err, message('Could not create link')),\n });\n}\n","import {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {toast} from '@common/ui/toast/toast';\nimport {Tag} from '@common/tags/tag';\nimport {invalidateEntryQueries} from '../../drive-query-keys';\nimport {message} from '@common/i18n/message';\nimport {useMutation} from '@tanstack/react-query';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n tag: Tag;\n}\n\ninterface Payload {\n entryIds: number[];\n}\n\nfunction addStarToEntries({entryIds}: Payload): Promise {\n return apiClient\n .post('file-entries/star', {entryIds})\n .then(response => response.data);\n}\n\nexport function useAddStarToEntries() {\n return useMutation({\n mutationFn: (payload: Payload) => addStarToEntries(payload),\n onSuccess: (data, {entryIds}) => {\n invalidateEntryQueries();\n toast(\n message('Starred [one 1 item|other :count items]', {\n values: {count: entryIds.length},\n }),\n );\n },\n onError: err => showHttpErrorToast(err, message('Could not star items')),\n });\n}\n","import {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {toast} from '@common/ui/toast/toast';\nimport {Tag} from '@common/tags/tag';\nimport {invalidateEntryQueries} from '../../drive-query-keys';\nimport {message} from '@common/i18n/message';\nimport {useMutation} from '@tanstack/react-query';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n tag: Tag;\n}\n\ninterface Payload {\n entryIds: number[];\n}\n\nfunction removeStarFromEntries({entryIds}: Payload): Promise {\n return apiClient\n .post('file-entries/unstar', {entryIds})\n .then(response => response.data);\n}\n\nexport function useRemoveStarFromEntries() {\n return useMutation({\n mutationFn: (payload: Payload) => removeStarFromEntries(payload),\n onSuccess: (data, {entryIds}) => {\n invalidateEntryQueries();\n toast(\n message('Removed star from [one 1 item|other :count items]', {\n values: {count: entryIds.length},\n }),\n );\n },\n onError: err => showHttpErrorToast(err, message('Could not remove star')),\n });\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {DriveEntry} from '../drive-entry';\nimport {toast} from '@common/ui/toast/toast';\nimport {DriveQueryKeys, invalidateEntryQueries} from '../../drive-query-keys';\nimport {message} from '@common/i18n/message';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n entries: DriveEntry[];\n}\n\ninterface Payload {\n entryIds: number[];\n destinationId?: number;\n}\n\nfunction duplicateEntries(payload: Payload): Promise {\n return apiClient\n .post('file-entries/duplicate', payload)\n .then(response => response.data);\n}\n\nexport function useDuplicateEntries() {\n return useMutation({\n mutationFn: (payload: Payload) => {\n toast.loading(\n message('Duplicating [one 1 item|other :count items]...', {\n values: {\n count: payload.entryIds.length,\n },\n }),\n {disableExitAnimation: true},\n );\n return duplicateEntries(payload);\n },\n onSuccess: (r, p) => {\n invalidateEntryQueries();\n queryClient.invalidateQueries({\n queryKey: DriveQueryKeys.fetchStorageSummary,\n });\n toast(\n message('Duplicated [one 1 item|other :count items]', {\n values: {count: p.entryIds.length},\n }),\n {disableEnterAnimation: true},\n );\n },\n onError: err =>\n showHttpErrorToast(err, message('Could not duplicate items'), null, {\n disableEnterAnimation: true,\n }),\n });\n}\n","export default \"__VITE_ASSET__fdd45f16__\"","export default \"__VITE_ASSET__189838f6__\"","export default \"__VITE_ASSET__bc08ea77__\"","export default \"__VITE_ASSET__94ef2bf1__\"","export default \"__VITE_ASSET__291df933__\"","export default \"__VITE_ASSET__5cc493df__\"","import type {DriveFolder} from '../files/drive-entry';\nimport {message} from '@common/i18n/message';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport addFilesSvg from './add-files.svg';\nimport timeManagement from './time-management.svg';\nimport fileSearching from './file-searching.svg';\nimport throwAwaySvg from './throw-away.svg';\nimport lovingItSvg from './loving-it.svg';\nimport shareSvg from './../shareable-link/shareable-link-page/folder-preview/share.svg';\nimport {DriveSortDescriptor} from '../drive-store';\nimport {BootstrapData} from '@common/core/bootstrap-data/bootstrap-data';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\ninterface NoContentMessage {\n title: MessageDescriptor;\n description: MessageDescriptor;\n image: string;\n}\n\nexport interface DrivePage {\n id: string;\n label: MessageDescriptor | string;\n path: string;\n hasActions?: boolean;\n canUpload?: boolean;\n disableSort?: boolean;\n sortDescriptor: DriveSortDescriptor;\n queryParams?: Record;\n folder?: DriveFolder;\n isFolderPage?: boolean;\n noContentMessage: (isSearchingOrFiltering: boolean) => NoContentMessage;\n}\n\nconst defaultSortDescriptor: DriveSortDescriptor = {\n orderBy: 'updated_at',\n orderDir: 'desc',\n};\n\nexport function makeFolderPage(folder: DriveFolder): DrivePage {\n return {\n ...makePartialFolderPage(folder.hash),\n canUpload:\n folder.permissions['files.create'] || folder.permissions['files.update'],\n label: folder.name,\n folder,\n };\n}\n\nexport function makePartialFolderPage(hash: string): DrivePage {\n return {\n id: hash,\n label: '',\n path: getPathForFolder(hash),\n hasActions: true,\n canUpload: false,\n sortDescriptor: defaultSortDescriptor,\n isFolderPage: true,\n noContentMessage: () => ({\n title: message('Drop files or folders here'),\n description: message('Or use the \"Upload\" button'),\n image: addFilesSvg,\n }),\n };\n}\n\nexport function getPathForFolder(hash: string): string {\n if (hash === '0') {\n return '/drive';\n }\n return `/drive/folders/${hash}`;\n}\n\n// bootstrap data will always be available at this point\ninterface BootstrapDataWithRootFolder extends BootstrapData {\n rootFolder: DriveFolder;\n}\nconst rootFolder = (getBootstrapData() as BootstrapDataWithRootFolder)\n .rootFolder;\nexport const RootFolderPage = makeFolderPage(rootFolder) as Required;\n\nexport const RecentPage: DrivePage = {\n id: 'recent',\n label: message('Recent'),\n path: '/drive/recent',\n disableSort: true,\n sortDescriptor: {\n orderBy: 'created_at',\n orderDir: 'desc',\n },\n queryParams: {\n recentOnly: true,\n },\n noContentMessage: () => ({\n title: message('No recent entries'),\n description: message('You have not uploaded any files or folders yet'),\n image: timeManagement,\n }),\n};\n\nexport const SearchPage: DrivePage = {\n id: 'search',\n label: message('Search results'),\n path: '/drive/search',\n sortDescriptor: defaultSortDescriptor,\n noContentMessage: isSearchingOrFiltering => {\n if (isSearchingOrFiltering) {\n return {\n title: message('No matching results'),\n description: message('Try changing your search query or filters'),\n image: fileSearching,\n };\n }\n return {\n title: message('Begin typing or select a filter to search'),\n description: message('Search for files, folders and other content'),\n image: fileSearching,\n };\n },\n};\n\nexport const SharesPage: DrivePage = {\n id: 'shares',\n label: message('Shared'),\n path: '/drive/shares',\n sortDescriptor: defaultSortDescriptor,\n queryParams: {\n sharedOnly: true,\n },\n noContentMessage: () => ({\n title: message('Shared with me'),\n description: message('Files and folders other people have shared with you'),\n image: shareSvg,\n }),\n};\n\nexport const TrashPage: DrivePage = {\n id: 'trash',\n label: message('Trash'),\n path: '/drive/trash',\n sortDescriptor: defaultSortDescriptor,\n hasActions: true,\n queryParams: {\n deletedOnly: true,\n },\n noContentMessage: () => ({\n title: message('Trash is empty'),\n description: message(\n 'There are no files or folders in your trash currently'\n ),\n image: throwAwaySvg,\n }),\n};\n\nexport const StarredPage: DrivePage = {\n id: 'starred',\n label: message('Starred'),\n path: '/drive/starred',\n sortDescriptor: defaultSortDescriptor,\n queryParams: {\n starredOnly: true,\n },\n noContentMessage: () => ({\n title: message('Nothing is starred'),\n description: message(\n 'Add stars to files and folders that you want to easily find later'\n ),\n image: lovingItSvg,\n }),\n};\n\nexport const DRIVE_PAGES = [\n RootFolderPage,\n RecentPage,\n SearchPage,\n SharesPage,\n TrashPage,\n StarredPage,\n];\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {toast} from '@common/ui/toast/toast';\nimport {DriveQueryKeys, invalidateEntryQueries} from '../../drive-query-keys';\nimport {message} from '@common/i18n/message';\nimport {getAxiosErrorMessage} from '@common/utils/http/get-axios-error-message';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\ninterface Response extends BackendResponse {}\n\ninterface Payload {\n entryIds: number[];\n emptyTrash?: boolean;\n deleteForever?: boolean;\n}\n\nfunction deleteEntries(payload: Payload): Promise {\n return apiClient\n .post('file-entries/delete', payload)\n .then(response => response.data);\n}\n\nexport function useDeleteEntries() {\n return useMutation({\n mutationFn: (payload: Payload) => {\n toast.loading(getLoaderMessage(payload), {disableExitAnimation: true});\n return deleteEntries(payload);\n },\n onSuccess: (r, {entryIds, emptyTrash, deleteForever}) => {\n invalidateEntryQueries();\n queryClient.invalidateQueries({\n queryKey: DriveQueryKeys.fetchStorageSummary,\n });\n if (emptyTrash) {\n toast(message('Emptied trash'), {disableEnterAnimation: true});\n } else if (deleteForever) {\n toast(\n message('Permanently deleted [one 1 item|other :count items]', {\n values: {count: entryIds.length},\n }),\n {disableEnterAnimation: true},\n );\n } else {\n toast(\n message('Moved [one 1 item|other :count items] to trash', {\n values: {count: entryIds.length},\n }),\n {disableEnterAnimation: true},\n );\n }\n },\n onError: (err, {emptyTrash}) => {\n const backendError = getAxiosErrorMessage(err);\n if (backendError) {\n toast.danger(backendError, {disableEnterAnimation: true});\n } else if (emptyTrash) {\n toast.danger('could not empty trash', {disableEnterAnimation: true});\n } else {\n toast.danger('Could not delete items', {disableEnterAnimation: true});\n }\n },\n });\n}\n\nfunction getLoaderMessage(payload: Payload): MessageDescriptor {\n if (payload.emptyTrash) {\n return message('Emptying trash...');\n } else if (payload.deleteForever) {\n return message('Deleting files...');\n } else {\n return message('Moving to trash...');\n }\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {DriveEntryUser} from '../../files/drive-entry';\nimport {apiClient} from '@common/http/query-client';\nimport {invalidateEntryQueries} from '../../drive-query-keys';\n\ninterface Response extends BackendResponse {\n users: DriveEntryUser[];\n}\n\ninterface Payload {\n userId: number | 'me';\n entryIds: number[];\n}\n\nexport function useUnshareEntries() {\n return useMutation({\n mutationFn: (payload: Payload) => unshareEntries(payload),\n onSuccess: () => {\n return invalidateEntryQueries();\n },\n });\n}\n\nfunction unshareEntries({entryIds, ...payload}: Payload): Promise {\n return apiClient\n .post(`file-entries/${entryIds.join(',')}/unshare`, payload)\n .then(response => response.data);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {toast} from '@common/ui/toast/toast';\nimport {invalidateEntryQueries} from '../../drive-query-keys';\nimport {message} from '@common/i18n/message';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\ninterface Payload {\n entryIds: number[];\n}\n\nexport function useRestoreEntries() {\n return useMutation({\n mutationFn: (payload: Payload) => restoreEntries(payload),\n onSuccess: (r, p) => {\n invalidateEntryQueries();\n toast(\n message('Restored [one 1 item|other :count items]', {\n values: {count: p.entryIds.length},\n }),\n );\n },\n onError: err => showHttpErrorToast(err, message('Could not restore items')),\n });\n}\n\nfunction restoreEntries(payload: Payload): Promise {\n return apiClient\n .post('file-entries/restore', payload)\n .then(response => response.data);\n}\n","import {message} from '@common/i18n/message';\nimport {PersonAddIcon} from '@common/icons/material/PersonAdd';\nimport {driveState, useDriveStore} from '../drive-store';\nimport {EntryAction} from './entry-action';\nimport {DriveEntry} from '../files/drive-entry';\nimport {RemoveRedEyeIcon} from '@common/icons/material/RemoveRedEye';\nimport {LinkIcon} from '@common/icons/material/Link';\nimport {useCreateShareableLink} from '../shareable-link/queries/create-shareable-link';\nimport {StarIcon} from '@common/icons/material/Star';\nimport {useAddStarToEntries} from '../files/queries/use-add-star-to-entries';\nimport {StarOutlineIcon} from '@common/icons/material/StarOutline';\nimport {useRemoveStarFromEntries} from '../files/queries/use-remove-star-from-entries';\nimport {DriveFileMoveIcon} from '@common/icons/material/DriveFileMove';\nimport {DriveFileRenameOutlineIcon} from '@common/icons/material/DriveFileRenameOutline';\nimport {ContentCopyIcon} from '@common/icons/material/ContentCopy';\nimport {useDuplicateEntries} from '../files/queries/use-duplicate-entries';\nimport {FileDownloadIcon} from '@common/icons/material/FileDownload';\nimport {DeleteIcon} from '@common/icons/material/Delete';\nimport {SharesPage, TrashPage} from '../drive-page/drive-page';\nimport {useDeleteEntries} from '../files/queries/use-delete-entries';\nimport {useUnshareEntries} from '../share-dialog/queries/use-unshare-entries';\nimport {toast} from '@common/ui/toast/toast';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {useFileEntryUrls} from '@common/uploads/hooks/file-entry-urls';\nimport {downloadFileFromUrl} from '@common/uploads/utils/download-file-from-url';\nimport {useRestoreEntries} from '../files/queries/use-restore-entries';\nimport {RestoreIcon} from '@common/icons/material/Restore';\n\nexport function useEntryActions(entries: DriveEntry[]): EntryAction[] {\n const preview = usePreviewAction(entries);\n const share = useShareAction(entries);\n const getLink = useGetLinkAction(entries);\n const addStar = useAddToStarredAction(entries);\n const removeStar = useRemoveFromStarred(entries);\n const moveTo = useMoveToAction(entries);\n const rename = useRenameAction(entries);\n const makeCopy = useMakeCopyAction(entries);\n const download = useDownloadEntriesAction(entries);\n const deleteAction = useDeleteEntriesAction(entries);\n const removeSharedEntries = useRemoveSharedEntriesAction(entries);\n const restoreEntries = useRestoreEntriesAction(entries);\n\n return [\n preview,\n share,\n getLink,\n addStar,\n removeStar,\n moveTo,\n rename,\n makeCopy,\n download,\n deleteAction,\n removeSharedEntries,\n restoreEntries,\n ].filter(action => !!action) as EntryAction[];\n}\n\nexport function usePreviewAction(\n entries: DriveEntry[]\n): EntryAction | undefined {\n if (!entries.some(e => e.type !== 'folder')) return;\n return {\n label: message('Preview'),\n icon: RemoveRedEyeIcon,\n key: 'preview',\n execute: () => {\n driveState().setActiveActionDialog('preview', entries);\n },\n };\n}\n\nexport function useShareAction(entries: DriveEntry[]): EntryAction | undefined {\n const activePage = useDriveStore(s => s.activePage);\n if (\n entries.length > 1 ||\n !entries.every(e => e.permissions['files.update']) ||\n activePage === TrashPage\n )\n return;\n\n return {\n label: message('Share'),\n icon: PersonAddIcon,\n key: 'share',\n execute: () => {\n driveState().setActiveActionDialog('share', entries);\n },\n };\n}\n\nfunction useGetLinkAction(entries: DriveEntry[]): EntryAction | undefined {\n const activePage = useDriveStore(s => s.activePage);\n const createLink = useCreateShareableLink();\n if (\n entries.length > 1 ||\n !entries.every(e => e.permissions['files.update']) ||\n activePage === TrashPage\n ) {\n return;\n }\n return {\n label: message('Get link'),\n icon: LinkIcon,\n key: 'getLink',\n execute: () => {\n createLink.mutate({entryId: entries[0].id});\n driveState().setActiveActionDialog('getLink', entries);\n },\n };\n}\n\nfunction useAddToStarredAction(entries: DriveEntry[]): EntryAction | undefined {\n const activePage = useDriveStore(s => s.activePage);\n const starEntries = useAddStarToEntries();\n if (\n entries.every(e => e.tags?.find(tag => tag.name === 'starred')) ||\n !entries.every(e => e.permissions['files.update']) ||\n activePage === TrashPage\n ) {\n return;\n }\n return {\n label: message('Add to starred'),\n icon: StarIcon,\n key: 'addToStarred',\n execute: () => {\n starEntries.mutate({entryIds: entries.map(e => e.id)});\n driveState().selectEntries([]);\n },\n };\n}\n\nfunction useRemoveFromStarred(entries: DriveEntry[]): EntryAction | undefined {\n const activePage = useDriveStore(s => s.activePage);\n const removeStar = useRemoveStarFromEntries();\n if (\n !entries.every(e => e.tags?.find(tag => tag.name === 'starred')) ||\n activePage === TrashPage\n )\n return;\n return {\n label: message('Remove from starred'),\n icon: StarOutlineIcon,\n key: 'removeFromStarred',\n execute: () => {\n removeStar.mutate({entryIds: entries.map(e => e.id)});\n driveState().selectEntries([]);\n },\n };\n}\n\nfunction useMoveToAction(entries: DriveEntry[]): EntryAction | undefined {\n const activePage = useDriveStore(s => s.activePage);\n if (\n !entries.every(e => e.permissions['files.update']) ||\n activePage === SharesPage ||\n activePage === TrashPage\n ) {\n return;\n }\n\n return {\n label: message('Move to'),\n icon: DriveFileMoveIcon,\n key: 'moveTo',\n execute: () => {\n driveState().setActiveActionDialog('moveTo', entries);\n },\n };\n}\n\nfunction useRenameAction(entries: DriveEntry[]): EntryAction | undefined {\n const activePage = useDriveStore(s => s.activePage);\n if (\n entries.length > 1 ||\n !entries.every(e => e.permissions['files.update']) ||\n activePage === TrashPage\n )\n return;\n return {\n label: message('Rename'),\n icon: DriveFileRenameOutlineIcon,\n key: 'rename',\n execute: () => {\n driveState().setActiveActionDialog('rename', entries);\n },\n };\n}\n\nfunction useMakeCopyAction(entries: DriveEntry[]): EntryAction | undefined {\n const activePage = useDriveStore(s => s.activePage);\n const duplicateEntries = useDuplicateEntries();\n if (\n entries.length > 1 ||\n !entries.every(e => e.permissions['files.update']) ||\n activePage === TrashPage\n )\n return;\n return {\n label: message('Make a copy'),\n icon: ContentCopyIcon,\n key: 'makeCopy',\n execute: () => {\n duplicateEntries.mutate({entryIds: entries.map(e => e.id)});\n driveState().selectEntries([]);\n },\n };\n}\n\nfunction useDownloadEntriesAction(\n entries: DriveEntry[]\n): EntryAction | undefined {\n const {downloadUrl} = useFileEntryUrls(entries[0], {\n downloadHashes: entries.map(e => e.hash),\n });\n if (!entries.every(e => e.permissions['files.download'])) return;\n return {\n label: message('Download'),\n icon: FileDownloadIcon,\n key: 'download',\n execute: () => {\n if (downloadUrl) {\n downloadFileFromUrl(downloadUrl);\n }\n driveState().selectEntries([]);\n },\n };\n}\n\nexport function useDeleteEntriesAction(\n entries: DriveEntry[]\n): EntryAction | undefined {\n const deleteEntries = useDeleteEntries();\n const activePage = useDriveStore(s => s.activePage);\n if (\n activePage === SharesPage ||\n !entries.every(e => e.permissions['files.delete'])\n )\n return;\n return {\n label:\n activePage === TrashPage ? message('Delete forever') : message('Remove'),\n icon: DeleteIcon,\n key: 'delete',\n execute: () => {\n if (activePage === TrashPage) {\n driveState().setActiveActionDialog('confirmAndDeleteForever', entries);\n } else {\n deleteEntries.mutate({\n entryIds: entries.map(e => e.id),\n deleteForever: activePage === TrashPage,\n });\n driveState().selectEntries([]);\n }\n },\n };\n}\n\nexport function useRestoreEntriesAction(\n entries: DriveEntry[]\n): EntryAction | undefined {\n const restoreEntries = useRestoreEntries();\n const activePage = useDriveStore(s => s.activePage);\n if (\n activePage !== TrashPage ||\n !entries.every(e => e.permissions['files.delete'])\n )\n return;\n return {\n label: message('Restore'),\n icon: RestoreIcon,\n key: 'restore',\n execute: () => {\n restoreEntries.mutate({\n entryIds: entries.map(e => e.id),\n });\n driveState().selectEntries([]);\n },\n };\n}\n\nexport function useRemoveSharedEntriesAction(\n entries: DriveEntry[]\n): EntryAction | undefined {\n const unshareEntries = useUnshareEntries();\n const activePage = useDriveStore(s => s.activePage);\n if (activePage !== SharesPage) return;\n return {\n label: message('Remove'),\n icon: DeleteIcon,\n key: 'removeSharedEntry',\n execute: () => {\n unshareEntries.mutate(\n {entryIds: entries.map(e => e.id), userId: 'me'},\n {\n onSuccess: (r, p) => {\n toast(\n message('Removed [one 1 item|other {count} items]', {\n values: {count: p.entryIds.length},\n })\n );\n },\n onError: err =>\n showHttpErrorToast(err, message('Could not remove items')),\n }\n );\n driveState().selectEntries([]);\n },\n };\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {prettyBytes} from '@common/uploads/utils/pretty-bytes';\nimport {DriveQueryKeys} from '../../../drive-query-keys';\nimport {apiClient} from '@common/http/query-client';\n\nexport interface FetchStorageSummaryResponse extends BackendResponse {\n used: number;\n available: number;\n}\n\nexport function useStorageSummary() {\n return useQuery({\n queryKey: DriveQueryKeys.fetchStorageSummary,\n queryFn: fetchStorageSummary,\n select: formatResponse,\n });\n}\n\nfunction fetchStorageSummary(): Promise {\n return apiClient.get(`user/space-usage`).then(response => response.data);\n}\n\nfunction formatResponse(response: FetchStorageSummaryResponse) {\n // null means that user has unlimited space available\n const percentage =\n response.available === null\n ? 0\n : (response.used * 100) / response.available;\n\n return {\n usedFormatted: prettyBytes(response.used, 2),\n availableFormatted: prettyBytes(response.available, 0),\n percentage,\n used: response.used,\n available: response.available,\n };\n}\n","import {useFileUploadStore} from '@common/uploads/uploader/file-upload-provider';\nimport {useCallback} from 'react';\nimport {driveState} from '../drive-store';\nimport {UploadedFile} from '@common/uploads/uploaded-file';\nimport {UploadStrategyConfig} from '@common/uploads/uploader/strategy/upload-strategy';\nimport {queryClient} from '@common/http/query-client';\nimport {DriveQueryKeys, invalidateEntryQueries} from '../drive-query-keys';\nimport {useStorageSummary} from '../layout/sidebar/storage-summary/storage-summary';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {getActiveWorkspaceId} from '@common/workspace/active-workspace-id';\n\nexport type UploadFilesFn = (\n files: (File | UploadedFile)[] | FileList,\n options?: UploadStrategyConfig,\n) => void;\n\nconst EightMB = 8388608;\n\nexport function useDriveUploadQueue() {\n const uploadMultiple = useFileUploadStore(s => s.uploadMultiple);\n const {data: usage} = useStorageSummary();\n\n const {uploads} = useSettings();\n\n const maxFileSize = uploads.max_size || EightMB;\n const allowedFileTypes = uploads.allowed_extensions;\n const blockedFileTypes = uploads.blocked_extensions;\n\n const uploadFiles: UploadFilesFn = useCallback(\n (files, options = {}) => {\n if (!options.metadata) {\n options.metadata = {};\n }\n options.metadata.workspaceId = getActiveWorkspaceId();\n if (!options.metadata.parentId) {\n options.metadata.parentId = driveState().activePage?.folder?.id ?? null;\n }\n\n files = [...files].map(file => {\n return file instanceof UploadedFile ? file : new UploadedFile(file);\n });\n\n // check if this upload will not put user over their allowed storage space\n if (usage) {\n const sizeOfFiles = files.reduce((sum, file) => sum + file.size, 0);\n const currentlyUsing = usage.used;\n const availableSpace = usage.available;\n\n if (sizeOfFiles + currentlyUsing > availableSpace) {\n toast.danger(\n message(\n 'You have exhausted your allowed space of :space. Delete some files or upgrade your plan.',\n {values: {space: usage.availableFormatted}},\n ),\n {action: {action: '/pricing', label: message('Upgrade')}},\n );\n return;\n }\n }\n\n uploadMultiple(files, {\n ...options,\n restrictions: {\n maxFileSize,\n allowedFileTypes,\n blockedFileTypes,\n },\n onSuccess: (entry, file) => {\n options?.onSuccess?.(entry, file);\n invalidateEntryQueries();\n queryClient.invalidateQueries({\n queryKey: DriveQueryKeys.fetchStorageSummary,\n });\n },\n });\n driveState().setUploadQueueIsOpen(true);\n },\n [uploadMultiple, allowedFileTypes, blockedFileTypes, maxFileSize, usage],\n );\n return {uploadFiles};\n}\n","import {EntryAction} from './entry-action';\nimport {message} from '@common/i18n/message';\nimport {driveState, useDriveStore} from '../drive-store';\nimport {DrivePage, TrashPage} from '../drive-page/drive-page';\nimport {CreateNewFolderIcon} from '@common/icons/material/CreateNewFolder';\nimport {useDriveUploadQueue} from '../uploading/use-drive-upload-queue';\nimport {openUploadWindow} from '@common/uploads/utils/open-upload-window';\nimport {FileUploadIcon} from '@common/icons/material/FileUpload';\nimport {DriveFolderUploadIcon} from '@common/icons/material/DriveFolderUpload';\nimport {useDeleteEntries} from '../files/queries/use-delete-entries';\nimport {DeleteForeverIcon} from '@common/icons/material/DeleteForever';\n\nexport function useDrivePageActions(page: DrivePage): EntryAction[] {\n const newFolder = useNewFolderAction(page);\n const uploadFiles = useUploadFilesAction(page);\n const uploadFolder = useUploadFolderAction(page);\n const emptyTrash = useEmptyTrashAction(page);\n return [newFolder, uploadFiles, uploadFolder, emptyTrash].filter(\n action => !!action\n ) as EntryAction[];\n}\n\nfunction useNewFolderAction(page: DrivePage): EntryAction | undefined {\n if (!page.folder || !page.folder.permissions['files.update']) return;\n return {\n label: message('New folder'),\n icon: CreateNewFolderIcon,\n key: 'newFolder',\n execute: () => {\n if (page.folder) {\n driveState().setActiveActionDialog('newFolder', [page.folder]);\n }\n },\n };\n}\n\nfunction useUploadFilesAction(page: DrivePage): EntryAction | undefined {\n const {uploadFiles} = useDriveUploadQueue();\n if (!page.folder || !page.folder.permissions['files.update']) return;\n return {\n label: message('Upload files'),\n icon: FileUploadIcon,\n key: 'uploadFiles',\n execute: async () => {\n uploadFiles(await openUploadWindow({multiple: true}));\n },\n };\n}\n\nfunction useUploadFolderAction(page: DrivePage): EntryAction | undefined {\n const {uploadFiles} = useDriveUploadQueue();\n if (!page.folder || !page.folder.permissions['files.update']) return;\n return {\n label: message('Upload folder'),\n icon: DriveFolderUploadIcon,\n key: 'uploadFolder',\n execute: async () => {\n uploadFiles(await openUploadWindow({directory: true}));\n },\n };\n}\n\nfunction useEmptyTrashAction(page: DrivePage): EntryAction | undefined {\n const deleteEntries = useDeleteEntries();\n const activePage = useDriveStore(s => s.activePage);\n if (activePage !== TrashPage) return;\n return {\n label: message('Empty trash'),\n icon: DeleteForeverIcon,\n key: 'emptyTrash',\n execute: () => {\n deleteEntries.mutate({entryIds: [], emptyTrash: true});\n driveState().selectEntries([]);\n },\n };\n}\n","import React, {createElement, ReactElement} from 'react';\nimport {\n Menu,\n MenuItem,\n MenuTrigger,\n} from '@common/ui/navigation/menu/menu-trigger';\nimport {Trans} from '@common/i18n/trans';\nimport {DriveEntry} from '../files/drive-entry';\nimport {useEntryActions} from './use-entry-actions';\nimport {EntryAction} from './entry-action';\nimport {DrivePage, RootFolderPage, TrashPage} from '../drive-page/drive-page';\nimport {useDrivePageActions} from './use-drive-page-actions';\n\ninterface Props {\n children: ReactElement;\n entries?: DriveEntry[];\n page?: DrivePage;\n}\nexport function EntryActionMenuTrigger({children, entries, page}: Props) {\n if (page?.id === RootFolderPage.id) {\n return {children};\n }\n\n if (page === TrashPage) {\n return {children};\n }\n\n if (page?.folder) {\n return {children};\n }\n\n if (entries?.length) {\n return {children};\n }\n\n return null;\n}\n\ninterface EntriesContextMenuProps extends Omit {\n entries: DriveEntry[];\n}\nfunction EntriesMenu({entries, children}: EntriesContextMenuProps) {\n const actions = useEntryActions(entries);\n return {children};\n}\n\ninterface PageContextMenuProps extends Omit {\n page: DrivePage;\n}\nfunction PageMenu({page, children}: PageContextMenuProps) {\n const actions = useDrivePageActions(page);\n return {children};\n}\n\ninterface BaseMenuProps {\n actions: EntryAction[];\n children: ReactElement;\n}\nfunction BaseMenu({actions, children}: BaseMenuProps) {\n return (\n \n {children}\n \n {actions.map(action => {\n return (\n {\n action.execute();\n }}\n key={action.key}\n value={action.key}\n startIcon={createElement(action.icon)}\n >\n \n \n );\n })}\n \n \n );\n}\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {DriveEntry} from '../../files/drive-entry';\nimport {Trans} from '@common/i18n/trans';\nimport {FileThumbnail} from '@common/uploads/file-type-icon/file-thumbnail';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {prettyBytes} from '@common/uploads/utils/pretty-bytes';\nimport React, {useContext} from 'react';\nimport memoize from 'nano-memoize';\nimport {TableContext} from '@common/ui/tables/table-context';\nimport {Checkbox} from '@common/ui/forms/toggle/checkbox';\nimport {EntryActionMenuTrigger} from '@app/drive/entry-actions/entry-action-menu-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {MoreVertIcon} from '@common/icons/material/MoreVert';\nimport clsx from 'clsx';\n\nconst formatFileSize = memoize(bytes => {\n return prettyBytes(bytes);\n});\n\nexport const fileTableColumns: ColumnConfig[] = [\n {\n key: 'name',\n allowsSorting: true,\n header: () => ,\n visibleInMode: 'all',\n width: 'flex-3 min-w-200',\n body: entry => ,\n },\n {\n key: 'updated_at',\n allowsSorting: true,\n maxWidth: 'max-w-184',\n header: () => ,\n body: user => ,\n },\n {\n key: 'file_size',\n allowsSorting: true,\n header: () => ,\n maxWidth: 'max-w-144',\n body: entry => formatFileSize(entry.file_size) ?? '-',\n },\n {\n key: 'actions',\n hideHeader: true,\n header: () => ,\n align: 'end',\n width: 'w-42 flex-shrink-0',\n visibleInMode: 'all',\n body: entry => ,\n },\n];\n\nfunction FileNameColumn({entry}: {entry: DriveEntry}) {\n const {isCollapsedMode} = useContext(TableContext);\n const sizeClassName = isCollapsedMode ? 'w-30 h-30' : 'w-24 h-24';\n return (\n
\n \n
\n
{entry.name}
\n {isCollapsedMode && (\n
\n \n
·
\n
{formatFileSize(entry.file_size)}
\n
\n )}\n
\n
\n );\n}\n\ninterface ActionsBodyProps {\n entry: DriveEntry;\n}\nfunction ActionsColumn({entry}: ActionsBodyProps) {\n const {selectedRows} = useContext(TableContext);\n return selectedRows.length ? (\n \n ) : (\n \n \n \n \n \n );\n}\n","import {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {DriveSortDescriptor} from '../../../drive-store';\nimport React from 'react';\nimport {Table} from '@common/ui/tables/table';\nimport {linkPageState, useLinkPageStore} from '../link-page-store';\nimport type {FolderPreviewGridProps} from './folder-preview-file-grid';\nimport {fileTableColumns} from '../../../file-view/file-table/file-table-columns';\n\nconst mobileColumns = fileTableColumns.filter(\n config => config.key !== 'updated_at'\n);\n\nexport function FolderPreviewFileTable({\n entries,\n onEntrySelected,\n}: FolderPreviewGridProps) {\n const sortDescriptor = useLinkPageStore(s => s.activeSort);\n const isMobile = useIsMobileMediaQuery();\n\n return (\n {\n linkPageState().setActiveSort(value as DriveSortDescriptor);\n }}\n onAction={(item, index) => {\n onEntrySelected(item, index);\n }}\n enableSelection={false}\n />\n );\n}\n","import {useShareableLinkPage} from '../../queries/use-shareable-link-page';\nimport {useNavigate} from 'react-router-dom';\nimport {ShareableLink} from '../../shareable-link';\n\nfunction buildFolderHash(link: ShareableLink, folderHash?: string) {\n let hash = link.hash;\n if (folderHash && link.entry?.hash !== folderHash) {\n hash = `${hash}:${folderHash}`;\n }\n return hash;\n}\n\nexport function useNavigateToSubfolder() {\n const {link} = useShareableLinkPage();\n const navigate = useNavigate();\n return (hash: string) => {\n if (!link) return;\n navigate(`/drive/s/${buildFolderHash(link, hash)}`);\n };\n}\n","import {AnimatePresence, m} from 'framer-motion';\nimport React, {useEffect, useRef, useState} from 'react';\nimport {ProgressCircle} from '@common/ui/progress/progress-circle';\nimport {useShareableLinkPage} from '../../queries/use-shareable-link-page';\nimport {FilePreviewDialog} from '@common/uploads/preview/file-preview-dialog';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport clsx from 'clsx';\nimport {DriveEntry} from '../../../files/drive-entry';\nimport {FolderPreviewFileGrid} from './folder-preview-file-grid';\nimport {useLinkPageStore} from '../link-page-store';\nimport {FolderPreviewFileTable} from './folder-preview-file-table';\nimport {useNavigateToSubfolder} from './use-navigate-to-subfolder';\nimport {useLocation} from 'react-router-dom';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {AdHost} from '@common/admin/ads/ad-host';\n\ninterface FolderPreviewChildrenProps {\n className?: string;\n}\nexport function FolderPreviewFileView({className}: FolderPreviewChildrenProps) {\n const {pathname} = useLocation();\n const navigateToSubfolder = useNavigateToSubfolder();\n const [activePreviewIndex, setActivePreviewIndex] = useState();\n const viewMode = useLinkPageStore(s => s.viewMode);\n const sentinelRef = useRef(null);\n const {\n link,\n entries,\n isFetchingNextPage,\n hasNextPage,\n fetchNextPage,\n isPlaceholderData,\n } = useShareableLinkPage();\n\n // close preview modal on back/forward navigation\n useEffect(() => {\n setActivePreviewIndex(undefined);\n }, [pathname]);\n\n useEffect(() => {\n const sentinelEl = sentinelRef.current;\n if (!sentinelEl) return;\n const observer = new IntersectionObserver(([entry]) => {\n if (entry.isIntersecting && hasNextPage) {\n fetchNextPage();\n }\n });\n observer.observe(sentinelEl);\n return () => {\n observer.unobserve(sentinelEl);\n };\n }, [hasNextPage, fetchNextPage]);\n\n if (!link || isPlaceholderData) {\n return (\n
\n \n
\n );\n }\n\n const handlePreview = (entry: DriveEntry, index: number) => {\n if (entry.type === 'folder') {\n navigateToSubfolder(entry.hash);\n } else {\n setActivePreviewIndex(index);\n }\n };\n\n const folderEntries = entries || [];\n\n return (\n <>\n \n \n {viewMode === 'grid' ? (\n \n ) : (\n \n )}\n \n \n {isFetchingNextPage && (\n \n \n \n )}\n \n \n setActivePreviewIndex(undefined)}\n >\n \n \n \n );\n}\n","import {ReactNode} from 'react';\nimport clsx from 'clsx';\n\ninterface DashboardContentHeaderProps {\n children: ReactNode;\n className?: string;\n}\nexport function DashboardContentHeader({\n children,\n className,\n}: DashboardContentHeaderProps) {\n return (\n
{children}
\n );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {DriveFolder} from '../drive-entry';\nimport {DriveQueryKeys} from '../../drive-query-keys';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient} from '@common/http/query-client';\n\ninterface FolderPathResponse extends BackendResponse {\n path: DriveFolder[];\n}\n\ntype Params = Record;\n\ninterface Props {\n hash?: string;\n params?: Params;\n isEnabled?: boolean;\n}\nexport function useFolderPath({hash, params, isEnabled = true}: Props) {\n return useQuery({\n queryKey: DriveQueryKeys.fetchFolderPath(hash!, params),\n queryFn: () => fetchFolderPath(hash!, params),\n enabled: !!hash && isEnabled,\n });\n}\n\nfunction fetchFolderPath(\n hash: string,\n params?: Params,\n): Promise {\n return apiClient\n .get(`folders/${hash}/path`, {params})\n .then(response => response.data);\n}\n","import React, {ReactElement, ReactNode} from 'react';\nimport clsx from 'clsx';\nimport {DriveFolder} from '../../../files/drive-entry';\nimport {useFolderPath} from '../../../files/queries/use-folder-path';\nimport {Breadcrumb} from '@common/ui/breadcrumbs/breadcrumb';\nimport {ShareableLink} from '../../shareable-link';\nimport {useLinkPageStore} from '../link-page-store';\nimport {BreadcrumbItem} from '@common/ui/breadcrumbs/breadcrumb-item';\nimport {useNavigateToSubfolder} from './use-navigate-to-subfolder';\n\ninterface Props {\n className?: string;\n folder?: DriveFolder;\n link: ShareableLink;\n}\nexport function FolderPreviewBreadcrumb({className, folder, link}: Props) {\n const navigateToSubfolder = useNavigateToSubfolder();\n const password = useLinkPageStore(s => s.password);\n const query = useFolderPath({\n hash: folder?.hash,\n params: {\n shareable_link: link.id,\n password,\n },\n });\n\n let content: ReactNode;\n\n if (query.isLoading) {\n content = null;\n } else {\n const items: {folder: DriveFolder; label: ReactElement}[] = [];\n if (query.data) {\n query.data.path.forEach(parent => {\n items.push({\n folder: parent,\n label: <>{parent.name},\n });\n });\n }\n\n content = (\n \n {items.map(item => {\n return (\n {\n navigateToSubfolder(item.folder.hash);\n }}\n key={item.folder.hash}\n >\n {item.label}\n \n );\n })}\n \n );\n }\n\n return
{content}
;\n}\n","import {message} from '@common/i18n/message';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\nexport const AVAILABLE_SORTS: DriveSortOption[] = [\n {id: 'file_size', label: message('Size')},\n {id: 'name', label: message('Name')},\n {id: 'updated_at', label: message('Last modified')},\n {id: 'created_at', label: message('Upload date')},\n {id: 'type', label: message('Type')},\n {id: 'extension', label: message('Extension')},\n];\n\nexport interface DriveSortOption {\n id: SortColumn;\n label: MessageDescriptor;\n}\n\nexport type SortColumn =\n | 'file_size'\n | 'name'\n | 'updated_at'\n | 'created_at'\n | 'type'\n | 'extension';\n\nexport type SortDirection = 'desc' | 'asc';\n\nexport interface SortValue {\n column: SortColumn;\n direction: SortDirection;\n}\n","import {AVAILABLE_SORTS, SortColumn} from './available-sorts';\nimport {Button} from '@common/ui/buttons/button';\nimport {SortIcon} from '@common/icons/material/Sort';\nimport {\n Menu,\n MenuItem,\n MenuSection,\n MenuTrigger,\n} from '@common/ui/navigation/menu/menu-trigger';\nimport {Trans} from '@common/i18n/trans';\nimport type {DriveSortDescriptor} from '../../drive-store';\n\ninterface Props {\n descriptor: DriveSortDescriptor;\n onChange: (value: DriveSortDescriptor) => void;\n isDisabled?: boolean;\n}\nexport function EntriesSortButton({\n descriptor,\n onChange,\n isDisabled = false,\n}: Props) {\n const column = descriptor.orderBy;\n const direction = descriptor.orderDir;\n const sort = AVAILABLE_SORTS.find(s => s.id === column);\n\n return (\n {\n if (key === 'asc' || key === 'desc') {\n onChange({\n orderBy: column,\n orderDir: key,\n });\n } else {\n onChange({\n orderBy: key as SortColumn,\n orderDir: direction,\n });\n }\n }}\n >\n }\n disabled={isDisabled}\n >\n {sort ? : null}\n \n \n }>\n \n \n \n \n \n \n \n }>\n {AVAILABLE_SORTS.map(item => (\n \n \n \n ))}\n \n \n \n );\n}\n","import React from 'react';\nimport {FolderPreviewBreadcrumb} from './folder-preview-breadcrumb';\nimport {EntriesSortButton} from '../../../layout/sorting/entries-sort-button';\nimport {linkPageState, useLinkPageStore} from '../link-page-store';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {GridViewIcon} from '@common/icons/material/GridView';\nimport {useShareableLinkPage} from '../../queries/use-shareable-link-page';\nimport {DriveFolder} from '../../../files/drive-entry';\n\nexport function FolderPreviewHeader() {\n const activeSort = useLinkPageStore(s => s.activeSort);\n const {link, isFetching} = useShareableLinkPage();\n const hasEntry = link && link.entry;\n\n return (\n
\n {hasEntry && (\n \n )}\n {hasEntry && (\n
\n {\n linkPageState().setActiveSort(value);\n }}\n />\n
\n {\n linkPageState().setViewMode(\n linkPageState().viewMode === 'grid' ? 'list' : 'grid'\n );\n }}\n >\n \n \n
\n
\n )}\n
\n );\n}\n","import React from 'react';\nimport {useShareableLinkPage} from '../../queries/use-shareable-link-page';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport {FolderPreviewFileView} from './folder-preview-file-view';\nimport {Trans} from '@common/i18n/trans';\nimport {DashboardLayout} from '@common/ui/layout/dashboard-layout';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {DashboardContent} from '@common/ui/layout/dashboard-content';\nimport {DashboardNavbar} from '@common/ui/layout/dashboard-navbar';\nimport {DashboardContentHeader} from '@common/ui/layout/dashboard-content-header';\nimport {ShareableLinkPageActionButtons} from '../shareable-link-page-action-buttons';\nimport {FolderPreviewHeader} from './folder-preview-header';\nimport shareSvg from './share.svg';\nimport clsx from 'clsx';\n\nexport function FolderPreview() {\n const {entries, isFetched} = useShareableLinkPage();\n const showEmptyMessage = isFetched && !entries?.length;\n\n return (\n \n }\n color=\"bg\"\n />\n \n \n \n \n \n {showEmptyMessage ? : }\n \n \n \n );\n}\n\ninterface EmptyMessageProps {\n className?: string;\n}\nfunction EmptyMessage({className}: EmptyMessageProps) {\n return (\n }\n title={}\n description={\n \n }\n />\n );\n}\n","import React from 'react';\nimport {FilePreviewContainer} from '@common/uploads/preview/file-preview-container';\nimport {useShareableLinkPage} from '../queries/use-shareable-link-page';\nimport {ShareableLinkNavbar} from './shareable-link-navbar';\nimport {AdHost} from '@common/admin/ads/ad-host';\n\nexport function ShareableLinkPageFilePreview() {\n const {link} = useShareableLinkPage();\n\n if (!link?.entry) return null;\n\n return (\n
\n \n \n \n
\n );\n}\n","import React, {ReactElement} from 'react';\nimport {useShareableLinkPage} from '../queries/use-shareable-link-page';\nimport {useLinkPageStore} from './link-page-store';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {ProgressCircle} from '@common/ui/progress/progress-circle';\nimport {PasswordPage} from './password-page';\nimport {FolderPreview} from './folder-preview/folder-preview';\nimport {ShareableLinkPageFilePreview} from './shareable-link-page-file-preview';\nimport {FileEntryUrlsContext} from '@common/uploads/hooks/file-entry-urls';\nimport {NotFoundPage} from '@common/ui/not-found-page/not-found-page';\n\nexport function ShareableLinkPage() {\n const {status, link} = useShareableLinkPage();\n const {trans} = useTrans();\n const isPasswordProtected = useLinkPageStore(s => s.isPasswordProtected);\n const password = useLinkPageStore(s => s.password);\n\n let content: ReactElement;\n\n if (status === 'pending') {\n content = (\n
\n \n
\n );\n } else if (!link && !isPasswordProtected) {\n return ;\n } else if (isPasswordProtected && !password) {\n content = ;\n } else if (link?.entry?.type === 'folder') {\n content = ;\n } else {\n content = ;\n }\n\n return (\n \n {content}\n \n );\n}\n","import React from 'react';\nimport {ProgressBarBase, ProgressBarBaseProps} from './progress-bar-base';\n\nexport function Meter(props: ProgressBarBaseProps) {\n return ;\n}\n","import React from 'react';\nimport {useStorageSummary} from './storage-summary';\nimport {StorageIcon} from '@common/icons/material/Storage';\nimport {Meter} from '@common/ui/progress/meter';\nimport {Trans} from '@common/i18n/trans';\nimport clsx from 'clsx';\n\nexport function StorageMeter() {\n const {isLoading, data} = useStorageSummary();\n\n // prevent translation placeholders from showing if summary is not loaded yet\n const label = (\n \n \n \n );\n return (\n
\n \n \n
\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {toast} from '../../ui/toast/toast';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {Workspace} from '../types/workspace';\nimport {onFormQueryError} from '../../errors/on-form-query-error';\nimport {message} from '../../i18n/message';\n\ninterface Response extends BackendResponse {\n workspace: Workspace;\n}\n\ninterface Props {\n name: string;\n}\n\nexport function useCreateWorkspace(form: UseFormReturn) {\n return useMutation({\n mutationFn: (props: Props) => createWorkspace(props),\n onSuccess: () => {\n toast(message('Created workspace'));\n queryClient.invalidateQueries({\n queryKey: WorkspaceQueryKeys.fetchUserWorkspaces,\n });\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n\nfunction createWorkspace(props: Props): Promise {\n return apiClient.post('workspace', props).then(r => r.data);\n}\n","import {useForm} from 'react-hook-form';\nimport {FormTextField} from '../ui/forms/input-field/text-field/text-field';\nimport {Form} from '../ui/forms/form';\nimport {Button} from '../ui/buttons/button';\nimport {useCreateWorkspace} from './requests/create-workspace';\nimport {DialogFooter} from '../ui/overlays/dialog/dialog-footer';\nimport {useDialogContext} from '../ui/overlays/dialog/dialog-context';\nimport {Dialog} from '../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '../ui/overlays/dialog/dialog-body';\nimport {Trans} from '../i18n/trans';\n\nexport function NewWorkspaceDialog() {\n const form = useForm<{name: string}>();\n const {formId, close} = useDialogContext();\n const createWorkspace = useCreateWorkspace(form);\n\n return (\n \n \n \n \n \n {\n createWorkspace.mutate(form.getValues(), {\n onSuccess: response => {\n close(response.workspace.id);\n },\n });\n }}\n >\n }\n minLength={3}\n required\n />\n \n \n \n \n \n \n \n \n \n );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {Workspace} from '../types/workspace';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {apiClient} from '../../http/query-client';\n\nexport interface FetchWorkspaceWithMembersResponse extends BackendResponse {\n workspace: Workspace;\n}\n\nfunction fetchWorkspaceWithMembers(\n workspaceId: number,\n): Promise {\n return apiClient\n .get(`workspace/${workspaceId}`)\n .then(response => response.data);\n}\n\nexport function useWorkspaceWithMembers(workspaceId: number) {\n return useQuery({\n queryKey: WorkspaceQueryKeys.workspaceWithMembers(workspaceId),\n queryFn: () => fetchWorkspaceWithMembers(workspaceId),\n });\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {WorkspaceInvite} from '../types/workspace-invite';\nimport {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n invites: WorkspaceInvite[];\n}\n\ninterface Props {\n workspaceId: number;\n emails: string[];\n roleId: number;\n}\n\nfunction InviteMembers({workspaceId, ...other}: Props): Promise {\n return apiClient\n .post(`workspace/${workspaceId}/invite`, other)\n .then(r => r.data);\n}\n\nexport function useInviteMembers() {\n return useMutation({\n mutationFn: (props: Props) => InviteMembers(props),\n onSuccess: (response, props) => {\n queryClient.invalidateQueries({\n queryKey: WorkspaceQueryKeys.workspaceWithMembers(props.workspaceId),\n });\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {WorkspaceInvite} from '../types/workspace-invite';\nimport {toast} from '../../ui/toast/toast';\nimport {apiClient} from '../../http/query-client';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n invite: WorkspaceInvite;\n}\n\ninterface Props {\n workspaceId: number;\n inviteId: string;\n}\n\nfunction ResendInvite({\n workspaceId,\n inviteId,\n ...other\n}: Props): Promise {\n return apiClient\n .post(`workspace/${workspaceId}/${inviteId}/resend`, other)\n .then(r => r.data);\n}\n\nexport function useResendInvite() {\n return useMutation({\n mutationFn: (props: Props) => ResendInvite(props),\n onSuccess: () => {\n toast('Invite sent');\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n","const matcher =\n /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n\nexport function isEmail(string?: string): boolean {\n if (!string) return false;\n if (string.length > 320) return false;\n return matcher.test(string);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {toast} from '../../ui/toast/toast';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {WorkspaceMember} from '../types/workspace-member';\nimport {WorkspaceInvite} from '../types/workspace-invite';\nimport {message} from '../../i18n/message';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\ninterface Props {\n workspaceId: number;\n member: WorkspaceMember | WorkspaceInvite;\n roleId: number;\n}\n\nfunction ChangeRole({workspaceId, member, ...other}: Props): Promise {\n const modelType = member.model_type;\n const memberId =\n member.model_type === 'invite' ? member.id : member.member_id;\n return apiClient\n .post(\n `workspace/${workspaceId}/${modelType}/${memberId}/change-role`,\n other,\n )\n .then(r => r.data);\n}\n\nexport function useChangeRole() {\n return useMutation({\n mutationFn: (props: Props) => ChangeRole(props),\n onSuccess: (response, props) => {\n toast(message('Role changed'));\n queryClient.invalidateQueries({\n queryKey: WorkspaceQueryKeys.workspaceWithMembers(props.workspaceId),\n });\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {useAuth} from '../../auth/use-auth';\nimport {useActiveWorkspaceId} from '../active-workspace-id-context';\nimport {PersonalWorkspace} from '../user-workspaces';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\ninterface Props {\n workspaceId: number;\n memberId: number | string;\n memberType: 'invite' | 'member';\n}\n\nfunction removeMember({\n workspaceId,\n memberId,\n memberType,\n}: Props): Promise {\n const endpoint =\n memberType === 'invite'\n ? `workspace/invite/${memberId}`\n : `workspace/${workspaceId}/member/${memberId}`;\n return apiClient.delete(endpoint).then(r => r.data);\n}\n\nexport function useRemoveMember() {\n const {workspaceId, setWorkspaceId} = useActiveWorkspaceId();\n const {user} = useAuth();\n return useMutation({\n mutationFn: (props: Props) => removeMember(props),\n onSuccess: (response, props) => {\n queryClient.invalidateQueries({\n queryKey: WorkspaceQueryKeys.fetchUserWorkspaces,\n });\n queryClient.invalidateQueries({\n queryKey: WorkspaceQueryKeys.workspaceWithMembers(props.workspaceId),\n });\n\n // if user left workspace that is currently active, switch to personal workspace\n if (props.memberId === user?.id && workspaceId === props.workspaceId) {\n setWorkspaceId(PersonalWorkspace.id);\n }\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n","import {ConfirmationDialog} from '../ui/overlays/dialog/confirmation-dialog';\nimport {Trans} from '../i18n/trans';\n\ninterface Props {\n onConfirm?: () => void;\n isLoading?: boolean;\n}\nexport function LeaveWorkspaceConfirmation({onConfirm, isLoading}: Props) {\n return (\n }\n isLoading={isLoading}\n onConfirm={onConfirm}\n body={\n
\n \n
\n \n
\n
\n }\n confirm={}\n />\n );\n}\n","import {useEffect, useState} from 'react';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {useWorkspaceWithMembers} from './requests/workspace-with-members';\nimport {ProgressCircle} from '../ui/progress/progress-circle';\nimport {Workspace} from './types/workspace';\nimport {GroupIcon} from '../icons/material/Group';\nimport {WorkspaceMember} from './types/workspace-member';\nimport {useAuth} from '../auth/use-auth';\nimport {\n ChipField,\n ChipValue,\n} from '../ui/forms/input-field/chip-field/chip-field';\nimport {useValueLists} from '../http/value-lists';\nimport {Button} from '../ui/buttons/button';\nimport {ArrowDropDownIcon} from '../icons/material/ArrowDropDown';\nimport {useInviteMembers} from './requests/invite-members';\nimport {WorkspaceInvite} from './types/workspace-invite';\nimport {ConfirmationDialog} from '../ui/overlays/dialog/confirmation-dialog';\nimport {useResendInvite} from './requests/resend-invite';\nimport {isEmail} from '../utils/string/is-email';\nimport {ButtonSize} from '../ui/buttons/button-size';\nimport {useChangeRole} from './requests/change-role';\nimport {IconButton} from '../ui/buttons/icon-button';\nimport {useRemoveMember} from './requests/remove-member';\nimport {CloseIcon} from '../icons/material/Close';\nimport {ExitToAppIcon} from '../icons/material/ExitToApp';\nimport {toast} from '../ui/toast/toast';\nimport {DialogTrigger} from '../ui/overlays/dialog/dialog-trigger';\nimport {Menu, MenuItem, MenuTrigger} from '../ui/navigation/menu/menu-trigger';\nimport {useDialogContext} from '../ui/overlays/dialog/dialog-context';\nimport {Dialog} from '../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '../ui/overlays/dialog/dialog-body';\nimport {Trans} from '../i18n/trans';\nimport {useTrans} from '../i18n/use-trans';\nimport {message} from '../i18n/message';\nimport {LeaveWorkspaceConfirmation} from './leave-workspace-confirmation';\n\ninterface WorkspaceMembersDialogProps {\n workspace: Workspace;\n}\nexport function WorkspaceMembersDialog({\n workspace,\n}: WorkspaceMembersDialogProps) {\n const {data, isLoading} = useWorkspaceWithMembers(workspace.id);\n return (\n \n \n \n \n \n {isLoading ? (\n
\n \n
\n ) : (\n \n )}\n
\n
\n );\n}\n\ninterface ManagerProps {\n workspace: Workspace;\n}\nfunction Manager({workspace}: ManagerProps) {\n const can = usePermissions(workspace);\n const members: (WorkspaceMember | WorkspaceInvite)[] = [\n ...(workspace.members || []),\n ...(workspace.invites || []),\n ];\n\n return (\n
\n {can.invite && }\n
\n \n \n
\n \n {members.map(member => (\n \n ))}\n \n
\n );\n}\n\ninterface MemberListItemProps {\n member: WorkspaceMember | WorkspaceInvite;\n workspace: Workspace;\n}\nfunction MemberListItem({workspace, member}: MemberListItemProps) {\n return (\n \n \n
\n
\n
\n
\n {member.display_name}\n
\n \n
\n
{member.email}
\n
\n \n
\n \n );\n}\n\nfunction usePermissions(workspace: Workspace) {\n const {user: authUser} = useAuth();\n const response = {update: false, invite: false, delete: false};\n const permissions = ['update', 'invite', 'delete'] as const;\n const authMember = workspace.members?.find(mb => mb.id === authUser?.id);\n\n if (authMember) {\n permissions.forEach(permission => {\n response[permission] =\n authMember.is_owner ||\n !!authMember.permissions?.find(\n p => p.name === `workspace_members.${permission}`,\n );\n });\n }\n\n return response;\n}\n\ninterface MemberActionsProps {\n workspace: Workspace;\n member: WorkspaceMember | WorkspaceInvite;\n}\nfunction MemberActions({workspace, member}: MemberActionsProps) {\n const [selectedRole, setSelectedRole] = useState(member.role_id);\n const changeRole = useChangeRole();\n const {user} = useAuth();\n\n const can = usePermissions(workspace);\n const isOwner = member.model_type === 'member' && member.is_owner;\n const isCurrentUser =\n member.model_type === 'member' && user?.id === member.id;\n\n const roleSelector =\n !can.update || isOwner || isCurrentUser ? (\n
\n \n
\n ) : (\n {\n setSelectedRole(roleId);\n changeRole.mutate({\n roleId,\n workspaceId: workspace.id,\n member,\n });\n }}\n />\n );\n\n return (\n <>\n {roleSelector}\n {!isOwner && (isCurrentUser || can.delete) && (\n \n )}\n \n );\n}\n\ninterface InviteChipFieldProps {\n workspace: Workspace;\n}\nfunction InviteChipField({workspace}: InviteChipFieldProps) {\n const {trans} = useTrans();\n const [chips, setChips] = useState([]);\n const allEmailsValid = chips.every(chip => !chip.invalid);\n const displayWith = (chip: ChipValue) => chip.description || chip.name;\n const [selectedRole, setSelectedRole] = useState();\n const inviteMembers = useInviteMembers();\n const {data} = useValueLists(['workspaceRoles']);\n\n useEffect(() => {\n if (!selectedRole && data?.workspaceRoles?.length) {\n setSelectedRole(data.workspaceRoles[0].id);\n }\n }, [data, selectedRole]);\n\n return (\n
\n {\n const invalid = !isEmail(chip.description);\n return {\n ...chip,\n invalid,\n errorMessage: invalid\n ? trans({message: 'Not a valid email'})\n : undefined,\n };\n }}\n placeholder={trans({message: 'Enter email addresses'})}\n label={}\n />\n
\n \n {chips.length && selectedRole ? (\n {\n inviteMembers.mutate(\n {\n emails: chips.map(c => displayWith(c)),\n roleId: selectedRole,\n workspaceId: workspace.id,\n },\n {\n onSuccess: () => {\n setChips([]);\n },\n },\n );\n }}\n >\n \n \n ) : null}\n
\n
\n );\n}\n\ninterface RemoveMemberButtonProps {\n member: WorkspaceMember | WorkspaceInvite;\n workspace: Workspace;\n type: 'leave' | 'remove';\n}\nfunction RemoveMemberButton({\n member,\n workspace,\n type,\n}: RemoveMemberButtonProps) {\n const removeMember = useRemoveMember();\n const {close} = useDialogContext();\n return (\n {\n if (isConfirmed) {\n removeMember.mutate({\n workspaceId: workspace.id,\n memberId: member.id,\n memberType: member.model_type,\n });\n if (type === 'leave') {\n close();\n toast(message('Left workspace'));\n }\n }\n }}\n >\n \n {type === 'leave' ? : }\n \n {type === 'leave' ? (\n \n ) : (\n \n )}\n \n );\n}\n\ninterface RemoveMemberConfirmationProps {\n member: WorkspaceMember | WorkspaceInvite;\n}\nfunction RemoveMemberConfirmation({member}: RemoveMemberConfirmationProps) {\n return (\n }\n body={\n
\n \n
\n \n
\n
\n }\n confirm={}\n />\n );\n}\n\ninterface RoleMenuTriggerProps {\n onChange: (value: number) => void;\n value?: number;\n size?: ButtonSize;\n className?: string;\n isDisabled?: boolean;\n}\nfunction RoleMenuTrigger({\n value,\n onChange,\n size = 'xs',\n className,\n isDisabled,\n}: RoleMenuTriggerProps) {\n const {data} = useValueLists(['workspaceRoles']);\n const role = data?.workspaceRoles?.find(r => r.id === value);\n if (!value || !role || !data?.workspaceRoles) return null;\n\n return (\n {\n onChange(newValue as number);\n }}\n >\n }\n >\n \n \n \n {data.workspaceRoles.map(r => (\n \n \n \n ))}\n \n \n );\n}\n\ninterface MemberDisplayNameAppendProps {\n member: WorkspaceMember | WorkspaceInvite;\n workspace: Workspace;\n}\nfunction MemberDisplayNameAppend({\n member,\n workspace,\n}: MemberDisplayNameAppendProps) {\n const {user} = useAuth();\n const can = usePermissions(workspace);\n\n if (user?.id === member.id) {\n return (\n
\n ()\n
\n );\n }\n if (member.model_type === 'invite') {\n return (\n
\n
·
\n
\n \n
\n {can.invite ? (\n <>\n
·
\n \n \n ) : null}\n
\n );\n }\n return null;\n}\n\nfunction ResendInviteDialogTrigger({\n member,\n workspace,\n}: MemberDisplayNameAppendProps) {\n const resendInvite = useResendInvite();\n return (\n {\n if (isConfirmed) {\n resendInvite.mutate({\n workspaceId: workspace.id,\n inviteId: member.id as string,\n });\n }\n }}\n >\n \n \n \n }\n body={\n \n }\n confirm={}\n />\n \n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {toast} from '../../ui/toast/toast';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {Workspace} from '../types/workspace';\nimport {onFormQueryError} from '../../errors/on-form-query-error';\nimport {useDialogContext} from '../../ui/overlays/dialog/dialog-context';\nimport {message} from '../../i18n/message';\n\ninterface Response extends BackendResponse {\n workspace: Workspace;\n}\n\nexport interface UpdateWorkspacePayload {\n id: number;\n name: string;\n}\n\nfunction updateWorkspace({\n id,\n ...props\n}: UpdateWorkspacePayload): Promise {\n return apiClient.put(`workspace/${id}`, props).then(r => r.data);\n}\n\nexport function useUpdateWorkspace(\n form: UseFormReturn,\n) {\n const {close} = useDialogContext();\n return useMutation({\n mutationFn: (props: UpdateWorkspacePayload) => updateWorkspace(props),\n onSuccess: response => {\n close();\n toast(message('Updated workspace'));\n queryClient.invalidateQueries({\n queryKey: WorkspaceQueryKeys.fetchUserWorkspaces,\n });\n queryClient.invalidateQueries({\n queryKey: WorkspaceQueryKeys.workspaceWithMembers(\n response.workspace.id,\n ),\n });\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n","import {useForm} from 'react-hook-form';\nimport {FormTextField} from '../ui/forms/input-field/text-field/text-field';\nimport {Form} from '../ui/forms/form';\nimport {Button} from '../ui/buttons/button';\nimport {DialogFooter} from '../ui/overlays/dialog/dialog-footer';\nimport {useDialogContext} from '../ui/overlays/dialog/dialog-context';\nimport {Dialog} from '../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '../ui/overlays/dialog/dialog-body';\nimport {\n UpdateWorkspacePayload,\n useUpdateWorkspace,\n} from './requests/update-workspace';\nimport {Workspace} from './types/workspace';\nimport {Trans} from '../i18n/trans';\n\ninterface Props {\n workspace: Workspace;\n}\nexport function RenameWorkspaceDialog({workspace}: Props) {\n const form = useForm({\n defaultValues: {id: workspace.id, name: workspace.name},\n });\n const {formId, close} = useDialogContext();\n const updateWorkspace = useUpdateWorkspace(form);\n\n return (\n \n \n \n \n \n {\n updateWorkspace.mutate(form.getValues());\n }}\n >\n }\n minLength={3}\n required\n />\n \n \n \n \n \n \n \n \n \n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {toast} from '../../ui/toast/toast';\nimport {apiClient, queryClient} from '../../http/query-client';\nimport {WorkspaceQueryKeys} from './workspace-query-keys';\nimport {useActiveWorkspaceId} from '../active-workspace-id-context';\nimport {PersonalWorkspace} from '../user-workspaces';\nimport {message} from '../../i18n/message';\nimport {showHttpErrorToast} from '../../utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\nexport interface DeleteWorkspacePayload {\n id: number;\n}\n\nfunction deleteWorkspace({id}: DeleteWorkspacePayload): Promise {\n return apiClient.delete(`workspace/${id}`).then(r => r.data);\n}\n\nexport function useDeleteWorkspace() {\n const {workspaceId, setWorkspaceId} = useActiveWorkspaceId();\n return useMutation({\n mutationFn: (props: DeleteWorkspacePayload) => deleteWorkspace(props),\n onSuccess: (r, payload) => {\n toast(message('Deleted workspace'));\n queryClient.invalidateQueries({\n queryKey: WorkspaceQueryKeys.fetchUserWorkspaces,\n });\n queryClient.invalidateQueries({\n queryKey: WorkspaceQueryKeys.workspaceWithMembers(payload.id),\n });\n\n // if user deleted workspace that is currently active, switch to personal workspace\n if (workspaceId === payload.id) {\n setWorkspaceId(PersonalWorkspace.id);\n }\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n","import clsx from 'clsx';\nimport {cloneElement, Fragment, ReactElement, useEffect, useState} from 'react';\nimport {ButtonBase} from '../ui/buttons/button-base';\nimport {PersonalWorkspace, useUserWorkspaces} from './user-workspaces';\nimport {UnfoldMoreIcon} from '../icons/material/UnfoldMore';\nimport {AddIcon} from '../icons/material/Add';\nimport {NewWorkspaceDialog} from './new-workspace-dialog';\nimport {WorkspaceMembersDialog} from './workspace-members-dialog';\nimport {useActiveWorkspaceId} from './active-workspace-id-context';\nimport {DialogTrigger} from '../ui/overlays/dialog/dialog-trigger';\nimport {Workspace} from './types/workspace';\nimport {Dialog} from '../ui/overlays/dialog/dialog';\nimport {DialogBody} from '../ui/overlays/dialog/dialog-body';\nimport {Button, ButtonProps} from '../ui/buttons/button';\nimport {CheckIcon} from '../icons/material/Check';\nimport {Menu, MenuItem, MenuTrigger} from '../ui/navigation/menu/menu-trigger';\nimport {KeyboardArrowDownIcon} from '../icons/material/KeyboardArrowDown';\nimport {PersonAddIcon} from '../icons/material/PersonAdd';\nimport {DeleteIcon} from '../icons/material/Delete';\nimport {ExitToAppIcon} from '../icons/material/ExitToApp';\nimport {EditIcon} from '../icons/material/Edit';\nimport {RenameWorkspaceDialog} from './rename-workspace-dialog';\nimport {ConfirmationDialog} from '../ui/overlays/dialog/confirmation-dialog';\nimport {useDeleteWorkspace} from './requests/delete-workspace';\nimport {useRemoveMember} from './requests/remove-member';\nimport {useAuth} from '../auth/use-auth';\nimport {Trans} from '../i18n/trans';\nimport {LeaveWorkspaceConfirmation} from './leave-workspace-confirmation';\nimport {openDialog} from '@common/ui/overlays/store/dialog-store';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\n\ninterface WorkspaceSelectorProps {\n className?: string;\n onChange?: (id: number) => void;\n trigger?: ReactElement;\n}\nexport function WorkspaceSelector({\n onChange,\n className,\n trigger: propsTrigger,\n}: WorkspaceSelectorProps) {\n const {data: workspaces, isFetched, isFetching} = useUserWorkspaces();\n const {workspaceId, setWorkspaceId} = useActiveWorkspaceId();\n const activeWorkspace = workspaces?.find(w => w.id === workspaceId);\n const [selectorIsOpen, setSelectorIsOpen] = useState(false);\n const {hasPermission} = useAuth();\n\n // if user no longer has access to previously selected workspace, select personal one\n useEffect(() => {\n // make sure we don't unset active workspace while user workspaces are being re-fetched\n if (isFetched && !isFetching && !activeWorkspace) {\n setWorkspaceId(PersonalWorkspace.id);\n }\n }, [activeWorkspace, workspaces, setWorkspaceId, isFetched, isFetching]);\n\n if (\n !activeWorkspace ||\n (!hasPermission('workspaces.create') && workspaces?.length === 1)\n ) {\n return null;\n }\n\n const defaultTrigger = (\n \n \n \n {activeWorkspace.default ? (\n \n ) : (\n activeWorkspace.name\n )}\n \n \n {activeWorkspace.default ? (\n \n ) : (\n \n )}\n \n \n \n \n );\n\n const trigger = propsTrigger || defaultTrigger;\n\n return (\n \n {\n setSelectorIsOpen(false);\n }}\n >\n {cloneElement(trigger, {\n onClick: () => setSelectorIsOpen(!selectorIsOpen),\n })}\n \n \n
\n {workspaces?.map(workspace => (\n \n ))}\n
\n
\n {\n e.preventDefault();\n e.stopPropagation();\n setSelectorIsOpen(false);\n const workspaceId = await openDialog(NewWorkspaceDialog);\n if (workspaceId) {\n setWorkspaceId(workspaceId);\n onChange?.(workspaceId);\n }\n }}\n variant=\"outline\"\n startIcon={}\n color=\"primary\"\n className=\"h-40 w-full\"\n >\n \n \n
\n
\n
\n \n
\n );\n}\n\ninterface WorkspaceItemProps {\n workspace: Workspace;\n onChange: WorkspaceSelectorProps['onChange'];\n setSelectorIsOpen: (value: boolean) => void;\n}\nfunction WorkspaceItem({\n workspace,\n onChange,\n setSelectorIsOpen,\n}: WorkspaceItemProps) {\n const {workspaceId, setWorkspaceId} = useActiveWorkspaceId();\n const isActive = workspaceId === workspace.id;\n\n return (\n {\n setWorkspaceId(workspace.id);\n onChange?.(workspace.id);\n setSelectorIsOpen(false);\n }}\n className={clsx(\n 'mb-4 flex cursor-pointer items-center gap-12 rounded-lg p-10 text-left',\n isActive && 'bg-primary/5',\n !isActive && 'hover:bg-hover',\n )}\n >\n \n
\n
\n {workspace.name}\n
\n
\n {workspace.default ? (\n \n ) : (\n \n )}\n
\n
\n {workspace.id !== 0 && (\n \n )}\n \n );\n}\n\ninterface LeaveWorkspaceDialogProps {\n workspace: Workspace;\n onChange?: (id: number) => void;\n}\nfunction LeaveWorkspaceDialog({\n workspace,\n onChange,\n}: LeaveWorkspaceDialogProps) {\n const removeMember = useRemoveMember();\n const {user} = useAuth();\n const {close} = useDialogContext();\n return (\n {\n removeMember.mutate(\n {\n workspaceId: workspace.id,\n memberId: user!.id,\n memberType: 'member',\n },\n {\n onSuccess: () => {\n close();\n onChange?.(PersonalWorkspace.id);\n },\n },\n );\n }}\n />\n );\n}\n\ninterface DeleteWorkspaceConfirmationProps {\n workspace: Workspace;\n onChange?: (id: number) => void;\n}\nfunction DeleteWorkspaceConfirmation({\n workspace,\n onChange,\n}: DeleteWorkspaceConfirmationProps) {\n const deleteWorkspace = useDeleteWorkspace();\n const {close} = useDialogContext();\n return (\n }\n body={\n \n }\n confirm={}\n isLoading={deleteWorkspace.isPending}\n onConfirm={() => {\n deleteWorkspace.mutate(\n {id: workspace.id},\n {\n onSuccess: () => {\n close();\n onChange?.(PersonalWorkspace.id);\n },\n },\n );\n }}\n />\n );\n}\n\ninterface ManageButtonProps {\n setSelectorIsOpen: (value: boolean) => void;\n workspace: Workspace;\n onChange?: (id: number) => void;\n}\nfunction ManageButton({\n setSelectorIsOpen,\n workspace,\n onChange,\n}: ManageButtonProps) {\n const {user} = useAuth();\n\n return (\n setSelectorIsOpen(false)}>\n {\n e.preventDefault();\n e.stopPropagation();\n }}\n color=\"primary\"\n size=\"xs\"\n variant=\"outline\"\n endIcon={}\n >\n \n \n \n {\n e.stopPropagation();\n openDialog(WorkspaceMembersDialog, {workspace});\n }}\n value=\"workspaceMembers\"\n startIcon={}\n >\n \n \n {workspace.owner_id === user?.id && (\n {\n e.stopPropagation();\n openDialog(RenameWorkspaceDialog, {workspace});\n }}\n value=\"updateWorkspace\"\n startIcon={}\n >\n \n \n )}\n {workspace.owner_id !== user?.id && (\n {\n e.stopPropagation();\n openDialog(LeaveWorkspaceDialog, {workspace, onChange});\n }}\n value=\"leaveWorkspace\"\n startIcon={}\n >\n \n \n )}\n {workspace.owner_id === user?.id && (\n {\n e.stopPropagation();\n openDialog(DeleteWorkspaceConfirmation, {workspace, onChange});\n }}\n value=\"deleteWorkspace\"\n startIcon={}\n >\n \n \n )}\n \n \n );\n}\n","export enum MenuPositions {\n DriveSidebar = 'drive-sidebar',\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {DriveFolder} from '../drive-entry';\nimport {useAuth} from '@common/auth/use-auth';\nimport {DriveQueryKeys} from '../../drive-query-keys';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {apiClient} from '@common/http/query-client';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\n\nexport interface UserFoldersApiParams {\n userId: number;\n workspaceId: number | null;\n}\n\ninterface UserFoldersResponse extends BackendResponse {\n folders: DriveFolder[];\n rootFolder: DriveFolder;\n}\n\nfunction fetchUserFolders(\n params: UserFoldersApiParams,\n): Promise {\n return apiClient\n .get(`users/${params.userId}/folders`, {params})\n .then(response => response.data);\n}\n\nexport function useFolders() {\n const {user} = useAuth();\n const {workspaceId} = useActiveWorkspaceId();\n const params: UserFoldersApiParams = {\n userId: user!.id,\n workspaceId,\n };\n return useQuery({\n queryKey: DriveQueryKeys.fetchUserFolders(params),\n queryFn: () => fetchUserFolders(params),\n enabled: !!user,\n });\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {DriveEntry} from '../drive-entry';\nimport {toast} from '@common/ui/toast/toast';\nimport {invalidateEntryQueries} from '../../drive-query-keys';\nimport {message} from '@common/i18n/message';\nimport {FileEntry} from '@common/uploads/file-entry';\nimport {RootFolderPage} from '../../drive-page/drive-page';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n entries: DriveEntry[];\n destination: FileEntry | null;\n}\n\ninterface Payload {\n entryIds: number[];\n destinationId?: number | null;\n}\n\nexport function useMoveEntries() {\n return useMutation({\n mutationFn: (payload: Payload) => {\n toast.loading(\n message('Moving [one 1 item|other :count items]...', {\n values: {\n count: payload.entryIds.length,\n },\n }),\n {disableExitAnimation: true},\n );\n return moveEntries(payload);\n },\n onSuccess: (r, p) => {\n invalidateEntryQueries();\n toast(\n message('Moved [one 1 item|other :count items] to \":destination\"', {\n values: {\n count: p.entryIds.length,\n destination: (r.destination || RootFolderPage.folder).name,\n },\n }),\n {disableEnterAnimation: true},\n );\n },\n onError: err =>\n showHttpErrorToast(err, message('Could not move items'), null, {\n disableEnterAnimation: true,\n }),\n });\n}\n\nfunction moveEntries(payload: Payload): Promise {\n // backend expects null for root folder, it might be zero or empty string on frontend\n payload.destinationId = !payload.destinationId ? null : payload.destinationId;\n return apiClient\n .post('file-entries/move', payload)\n .then(response => response.data);\n}\n","import {FileEntry} from '@common/uploads/file-entry';\n\nexport interface PartialFolder {\n id: number;\n name: string;\n path: string;\n parent_id: number | null;\n type: string;\n}\n\nexport function canMoveEntriesInto(\n targets: FileEntry[],\n destination: PartialFolder\n) {\n if (destination.type !== 'folder') return false;\n\n // should not be able to move folder into its\n // own child or folder it's already in\n return targets.every(target => {\n if (!target) return false;\n // entry is already in this folder\n if (\n destination.id === target.parent_id ||\n // root folder check\n (!target.parent_id && destination.id === 0)\n ) {\n return false;\n }\n\n return !destinationIsInTarget(destination, target);\n });\n}\n\nfunction destinationIsInTarget(destination: PartialFolder, target: FileEntry) {\n const destinationPath = (destination.path || '').split('/');\n const targetPath = (target.path || '').split('/');\n return targetPath.every((part, index) => {\n return destinationPath[index] === part;\n });\n}\n","import {FileEntry} from '@common/uploads/file-entry';\nimport {useMoveEntries} from './queries/use-move-entries';\nimport {useDriveUploadQueue} from '../uploading/use-drive-upload-queue';\nimport {canMoveEntriesInto} from './utils/can-move-entries-into';\nimport {\n ConnectedDraggable,\n MixedDraggable,\n} from '@common/ui/interactions/dnd/use-draggable';\nimport {NativeFileDraggable} from '@common/ui/interactions/dnd/use-droppable';\nimport {driveState} from '@app/drive/drive-store';\n\nexport function useFolderDropAction(folder: FileEntry) {\n const moveEntries = useMoveEntries();\n const {uploadFiles} = useDriveUploadQueue();\n\n const onDrop = async (target: ConnectedDraggable | NativeFileDraggable) => {\n if (folder.type !== 'folder') return;\n if (target.type === 'nativeFile') {\n uploadFiles(await target.getData(), {\n metadata: {parentId: folder.id},\n });\n } else if (target.type === 'fileEntry') {\n const entries = target.getData() as FileEntry[];\n if (entries?.length && canMoveEntriesInto(entries, folder)) {\n moveEntries.mutate({\n destinationId: folder.id,\n entryIds: entries.map(e => e.id),\n });\n driveState().deselectEntries('all');\n }\n }\n };\n\n return {onDrop};\n}\n\nexport function folderAcceptsDrop(target: MixedDraggable, entry: FileEntry) {\n if (target.type === 'fileEntry') {\n const entries = target.getData() as FileEntry[];\n return canMoveEntriesInto(entries, entry);\n }\n return true;\n}\n","import {FileEntry} from '@common/uploads/file-entry';\n\nexport function makeFolderTreeDragId(entry: FileEntry) {\n return `${entry.id}-tree`;\n}\n\nexport function isFolderTreeDragId(id: string | number): boolean {\n return `${id}`.endsWith('-tree');\n}\n","import {useDroppable} from '@common/ui/interactions/dnd/use-droppable';\nimport {driveState} from '../../drive-store';\nimport {RefObject, useState} from 'react';\nimport {\n folderAcceptsDrop,\n useFolderDropAction,\n} from '../../files/use-folder-drop-action';\nimport {DriveFolder} from '../../files/drive-entry';\nimport {makeFolderTreeDragId} from './folder-tree-drag-id';\n\ninterface Props {\n folder: DriveFolder;\n ref: RefObject;\n}\nexport function useSidebarTreeDropTarget({folder, ref}: Props) {\n const [isDragOver, setIsDragOver] = useState(false);\n const {onDrop} = useFolderDropAction(folder);\n\n const dropProps = useDroppable({\n id: makeFolderTreeDragId(folder),\n ref,\n types: ['fileEntry', 'nativeFile'],\n acceptsDrop: draggable => folderAcceptsDrop(draggable, folder),\n onDragEnter: draggable => {\n if (folderAcceptsDrop(draggable, folder)) {\n setIsDragOver(true);\n }\n },\n onDragLeave: () => {\n setIsDragOver(false);\n },\n onDropActivate: () => {\n if (!driveState().sidebarExpandedKeys.includes(folder.id)) {\n driveState().setSidebarExpandedKeys([\n ...driveState().sidebarExpandedKeys,\n folder.id,\n ]);\n }\n },\n onDrop,\n });\n\n return {...dropProps, isDragOver};\n}\n","import {createContext, Key} from 'react';\n\nexport interface TreeContextValue {\n expandedKeys: Key[];\n setExpandedKeys: (value: Key[]) => void;\n selectedKeys: Key[];\n setSelectedKeys: (value: Key[]) => void;\n focusedNode?: Key;\n setFocusedNode: (node?: Key) => void;\n}\n\nexport const TreeContext = createContext(null!);\n","import {TreeItemRenderer} from './tree-item';\nimport {cloneElement} from 'react';\nimport {TreeNode} from './tree';\n\ninterface RenderTreeProps {\n nodes: T[];\n parentNode?: T;\n itemRenderer: TreeItemRenderer;\n level?: number;\n}\nexport function renderTree({\n nodes,\n itemRenderer,\n parentNode,\n level,\n}: RenderTreeProps) {\n return nodes.map((node, index) => {\n return cloneElement(itemRenderer(node), {\n level: level == undefined ? 0 : level + 1,\n index,\n node,\n parentNode,\n key: node.id,\n itemRenderer,\n });\n });\n}\n","import React, {\n forwardRef,\n MouseEventHandler,\n ReactNode,\n useContext,\n} from 'react';\nimport {TreeContext} from './tree-context';\nimport clsx from 'clsx';\nimport {ArrowRightIcon} from '../../icons/material/ArrowRight';\n\ninterface TreeLabelProps {\n level?: number;\n node: any;\n icon?: ReactNode;\n label?: ReactNode;\n className?: string;\n}\nexport const TreeLabel = forwardRef(\n ({icon, label, level = 0, node, className, ...domProps}, ref) => {\n const {expandedKeys, setExpandedKeys, selectedKeys, setSelectedKeys} =\n useContext(TreeContext);\n const isExpanded = expandedKeys.includes(node.id);\n const isSelected = selectedKeys.includes(node.id);\n\n const handleExpandIconClick: MouseEventHandler = e => {\n e.stopPropagation();\n const index = expandedKeys.indexOf(node.id);\n const newExpandedKeys = [...expandedKeys];\n if (index > -1) {\n newExpandedKeys.splice(index, 1);\n } else {\n newExpandedKeys.push(node.id);\n }\n setExpandedKeys(newExpandedKeys);\n };\n\n return (\n {\n e.stopPropagation();\n setSelectedKeys([node.id]);\n }}\n className={clsx(\n 'flex flex-nowrap whitespace-nowrap items-center gap-4 py-6 rounded header cursor-pointer overflow-hidden text-ellipsis tree-label',\n className,\n isSelected && 'bg-primary/selected text-primary font-bold',\n !isSelected && 'hover:bg-hover'\n )}\n >\n {level > 0 && (\n
\n {Array.from({length: level}).map((_, i) => {\n return
;\n })}\n
\n )}\n
\n \n
\n {icon}\n
{label}
\n
\n );\n }\n);\nTreeLabel.displayName = 'TreeLabel';\n","import React, {\n HTMLAttributes,\n ReactElement,\n ReactNode,\n Ref,\n useContext,\n useEffect,\n} from 'react';\nimport {useFocusManager} from '@react-aria/focus';\nimport {TreeContext} from './tree-context';\nimport {createEventHandler} from '../../utils/dom/create-event-handler';\nimport clsx from 'clsx';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {TreeNode} from './tree';\nimport {renderTree} from './render-tree';\nimport {TreeLabel} from './tree-label';\n\nexport type TreeItemRenderer = (\n node: any,\n) => ReactElement>;\n\nexport interface TreeItemProps\n extends HTMLAttributes {\n label: ReactNode;\n icon: ReactNode;\n node?: T;\n parentNode?: T;\n level?: number;\n index?: number;\n itemRenderer?: TreeItemRenderer;\n labelRef?: Ref;\n labelClassName?: string;\n className?: string;\n}\nexport function TreeItem({\n label,\n icon,\n node,\n level,\n index,\n itemRenderer,\n labelRef,\n labelClassName,\n className,\n parentNode,\n ...domProps\n}: TreeItemProps) {\n const focusManager = useFocusManager();\n const {\n expandedKeys,\n selectedKeys,\n focusedNode,\n setFocusedNode,\n setExpandedKeys,\n setSelectedKeys,\n } = useContext(TreeContext);\n\n // clear focused node on unmount\n useEffect(() => {\n return () => {\n if (focusedNode === node?.id) {\n setFocusedNode(undefined);\n }\n };\n }, [focusedNode, node?.id, setFocusedNode]);\n\n if (!node || !itemRenderer) return null;\n\n const hasChildren = node.children.length;\n const isExpanded = hasChildren && expandedKeys.includes(node.id);\n const isSelected = selectedKeys.includes(node.id);\n const isFirstNode = level === 0 && index === 0;\n const isFocused =\n focusedNode == undefined ? isFirstNode : focusedNode === node.id;\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (focusedNode == null) return;\n switch (e.key) {\n // select the node\n case 'Enter':\n case ' ':\n e.stopPropagation();\n e.preventDefault();\n setSelectedKeys([focusedNode]);\n break;\n\n // expand node, or move focus to first (and only first) child\n case 'ArrowRight':\n e.stopPropagation();\n e.preventDefault();\n\n if (!hasChildren) return;\n\n if (!isExpanded) {\n setExpandedKeys([...expandedKeys, focusedNode]);\n } else {\n focusManager?.focusNext();\n }\n break;\n\n // collapse node, or move focus to parent node\n case 'ArrowLeft':\n e.stopPropagation();\n e.preventDefault();\n\n if (isExpanded) {\n const index = expandedKeys.indexOf(focusedNode);\n const newKeys = [...expandedKeys];\n newKeys.splice(index, 1);\n setExpandedKeys(newKeys);\n } else if (parentNode) {\n const parentEl =\n document.activeElement?.parentElement?.closest('[tabindex]');\n if (parentEl) {\n (parentEl as HTMLElement).focus();\n }\n }\n break;\n\n // focus next visible node, recursively\n case 'ArrowDown':\n e.stopPropagation();\n e.preventDefault();\n focusManager?.focusNext();\n break;\n\n // focus previous visible node, recursively\n case 'ArrowUp':\n e.stopPropagation();\n e.preventDefault();\n focusManager?.focusPrevious();\n break;\n\n // focus first visible node\n case 'Home':\n e.stopPropagation();\n e.preventDefault();\n focusManager?.focusFirst();\n break;\n\n // focus last visible node\n case 'End':\n e.stopPropagation();\n e.preventDefault();\n focusManager?.focusLast();\n break;\n\n // expand all sibling nodes\n case '*':\n e.stopPropagation();\n e.preventDefault();\n\n if (parentNode?.children) {\n const newKeys = [...expandedKeys];\n parentNode.children.forEach(childNode => {\n if (\n childNode.children.length &&\n !expandedKeys.includes(childNode.id)\n ) {\n newKeys.push(childNode.id);\n }\n });\n if (newKeys.length !== expandedKeys.length) {\n setExpandedKeys(newKeys);\n }\n }\n break;\n }\n };\n\n return (\n {\n e.stopPropagation();\n setFocusedNode(node.id);\n }}\n onBlur={e => {\n e.stopPropagation();\n // only clear focus state when focus moves outside the tree\n if (!e.currentTarget.contains(e.relatedTarget)) {\n setFocusedNode(undefined);\n }\n }}\n className={clsx(\n 'outline-none',\n // focus direct .tree-label child when this element has :focus-visible\n '[&>.tree-label]:focus-visible:ring [&>.tree-label]:focus-visible:ring-2 [&>.tree-label]:focus-visible:ring-inset',\n className,\n )}\n >\n \n \n {isExpanded ? (\n \n {renderTree({\n nodes: node.children,\n parentNode: node,\n itemRenderer,\n level,\n })}\n \n ) : null}\n \n \n );\n}\n","import React, {Key, useState} from 'react';\nimport {useControlledState} from '@react-stately/utils';\nimport {FocusScope} from '@react-aria/focus';\nimport {TreeContext, TreeContextValue} from './tree-context';\nimport {TreeItemRenderer} from './tree-item';\nimport {renderTree} from './render-tree';\n\nexport interface TreeNode {\n id: number | string;\n children: TreeNode[];\n}\n\ninterface TreeProps {\n children: TreeItemRenderer;\n nodes: T[];\n selectedKeys?: Key[];\n expandedKeys?: Key[];\n defaultExpandedKeys?: Key[];\n onExpandedKeysChange?: (value: Key[]) => void;\n defaultSelectedKeys?: Key[];\n onSelectedKeysChange?: (value: Key[]) => void;\n}\nexport function Tree({\n children,\n nodes,\n ...props\n}: TreeProps) {\n const [expandedKeys, setExpandedKeys] = useControlledState(\n props.expandedKeys,\n props.defaultSelectedKeys,\n props.onExpandedKeysChange\n );\n const [selectedKeys, setSelectedKeys] = useControlledState(\n props.selectedKeys,\n props.defaultSelectedKeys,\n props.onSelectedKeysChange\n );\n const [focusedNode, setFocusedNode] = useState();\n\n const value: TreeContextValue = {\n expandedKeys,\n setExpandedKeys,\n selectedKeys,\n setSelectedKeys,\n focusedNode,\n setFocusedNode,\n };\n\n return (\n \n \n \n \n \n );\n}\n\ninterface TreeRootProps {\n nodes: TreeNode[];\n itemRenderer: TreeItemRenderer;\n}\nfunction TreeRoot(props: TreeRootProps) {\n return (\n
    \n {renderTree(props)}\n
\n );\n}\n","import React, {useMemo, useRef} from 'react';\nimport {arrayToTree} from 'performant-array-to-tree';\nimport {useFolders} from '../../files/queries/use-folders';\nimport {DriveFolder} from '../../files/drive-entry';\nimport {driveState, useDriveStore} from '../../drive-store';\nimport {FolderIcon} from '@common/icons/material/Folder';\nimport {getPathForFolder, RootFolderPage} from '../../drive-page/drive-page';\nimport {mergeProps} from '@react-aria/utils';\nimport {\n ConnectedDraggable,\n useDraggable,\n} from '@common/ui/interactions/dnd/use-draggable';\nimport {useSidebarTreeDropTarget} from './use-sidebar-tree-drop-target';\nimport {makeFolderTreeDragId} from './folder-tree-drag-id';\nimport {FileEntry} from '@common/uploads/file-entry';\nimport clsx from 'clsx';\nimport {BackupIcon} from '@common/icons/material/Backup';\nimport {TreeItem, TreeItemProps} from '@common/ui/tree/tree-item';\nimport {Tree} from '@common/ui/tree/tree';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\n\ninterface TreeFolder extends DriveFolder {\n children: TreeFolder[];\n}\n\nexport function FolderTree() {\n const navigate = useNavigate();\n const {data} = useFolders();\n const expandedKeys = useDriveStore(s => s.sidebarExpandedKeys);\n\n const activePage = useDriveStore(s => s.activePage);\n let selectedKeys: number[] = [];\n if (activePage?.isFolderPage) {\n selectedKeys = activePage.folder ? [activePage.folder.id] : [];\n }\n\n const tree = useMemo(() => {\n const folders = arrayToTree(data?.folders || [], {\n parentId: 'parent_id',\n dataField: null,\n }) as TreeFolder[];\n const rootFolder = {\n ...RootFolderPage.folder,\n children: folders,\n };\n return [rootFolder];\n }, [data?.folders]);\n\n return (\n {\n driveState().setSidebarExpandedKeys(keys);\n }}\n selectedKeys={selectedKeys}\n onSelectedKeysChange={([id]) => {\n const entryHash = findHash(id as number, tree);\n if (entryHash) {\n navigate(getPathForFolder(entryHash));\n } else {\n navigate(RootFolderPage.path);\n }\n }}\n >\n {() => }\n \n );\n}\n\n// props will be passed by tree via cloneElement\nfunction FolderTreeItem(props: Partial>) {\n const {node} = props as Required>;\n const labelRef = useRef(null);\n const isRootFolder = node.id === 0;\n const isDragging = useDriveStore(s =>\n s.entriesBeingDragged.includes(node.id)\n );\n\n const {draggableProps} = useDraggable({\n type: 'fileEntry',\n id: makeFolderTreeDragId(node),\n ref: labelRef,\n disabled: isRootFolder,\n hidePreview: true,\n onDragStart: (e, draggable) => {\n const d = draggable as ConnectedDraggable;\n driveState().setEntriesBeingDragged(d.getData().map(e => e.id));\n driveState().selectEntries([]);\n },\n onDragEnd: () => {\n driveState().setEntriesBeingDragged([]);\n },\n getData: () => [node],\n });\n\n const {droppableProps, isDragOver} = useSidebarTreeDropTarget({\n folder: node,\n ref: labelRef,\n });\n\n return (\n {\n e.preventDefault();\n e.stopPropagation();\n driveState().deselectEntries('all');\n driveState().setContextMenuData({\n x: e.clientX,\n y: e.clientY,\n entry: node,\n });\n }}\n labelRef={labelRef}\n className={isRootFolder ? 'focus-visible:ring-2' : undefined}\n labelClassName={clsx(\n isDragOver && 'bg-primary/selected ring ring-2 ring-inset ring-primary',\n isDragging && 'opacity-30',\n isRootFolder && 'h-40'\n )}\n icon={\n isRootFolder ? (\n \n ) : (\n \n )\n }\n label={node.name}\n />\n );\n}\n\nconst findHash = (id: number, nodes: FileEntry[]): string | undefined => {\n for (const item of nodes) {\n if (item.id === id) {\n return item.hash;\n } else if (item.children) {\n const hash = findHash(id, item.children);\n if (hash) {\n return hash;\n }\n }\n }\n};\n","import {CustomMenu, CustomMenuItem} from '@common/menus/custom-menu';\nimport {MenuPositions} from '../../menu-positions';\nimport React, {\n ComponentPropsWithoutRef,\n forwardRef,\n useRef,\n useState,\n} from 'react';\nimport {MenuItemConfig} from '@common/core/settings/settings';\nimport clsx from 'clsx';\nimport {useDroppable} from '@common/ui/interactions/dnd/use-droppable';\nimport {FileEntry} from '@common/uploads/file-entry';\nimport {FolderTree} from './folder-tree';\nimport {useDeleteEntries} from '../../files/queries/use-delete-entries';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\n\nexport function SidebarMenu() {\n const {workspaceId} = useActiveWorkspaceId();\n return (\n
\n \n \n {item => {\n if (item.action === '/drive/trash') {\n return ;\n }\n return ;\n }}\n \n
\n );\n}\n\ninterface MenuItemProps extends ComponentPropsWithoutRef<'a'> {\n item: MenuItemConfig;\n className?: string;\n}\nexport const MenuItem = forwardRef(\n ({item, className, ...domProps}, ref) => {\n return (\n \n clsx(\n className,\n 'h-40 w-full my-4 px-24 rounded',\n isActive\n ? 'text-primary font-bold bg-primary/selected cursor-default'\n : 'hover:bg-hover'\n )\n }\n item={item}\n ref={ref}\n {...domProps}\n />\n );\n }\n);\n\ninterface TrashMenuItemProps {\n item: MenuItemConfig;\n}\nfunction TrashMenuItem({item}: TrashMenuItemProps) {\n const deleteEntries = useDeleteEntries();\n const [isDragOver, setIsDragOver] = useState(false);\n const ref = useRef(null);\n\n const {droppableProps} = useDroppable({\n id: 'trash',\n types: ['fileEntry'],\n ref,\n onDragEnter: () => {\n setIsDragOver(true);\n },\n onDragLeave: () => {\n setIsDragOver(false);\n },\n onDrop: draggable => {\n const entryIds = (draggable.getData() as FileEntry[]).map(e => e.id);\n deleteEntries.mutate({entryIds, deleteForever: false});\n },\n });\n return (\n \n );\n}\n","import {driveState, useDriveStore} from '../drive-store';\nimport {useDriveUploadQueue} from '../uploading/use-drive-upload-queue';\nimport {\n Menu,\n MenuItem,\n MenuTrigger,\n} from '@common/ui/navigation/menu/menu-trigger';\nimport {openUploadWindow} from '@common/uploads/utils/open-upload-window';\nimport {Button} from '@common/ui/buttons/button';\nimport {FileUploadIcon} from '@common/icons/material/FileUpload';\nimport {Trans} from '@common/i18n/trans';\nimport {CreateNewFolderIcon} from '@common/icons/material/CreateNewFolder';\nimport {UploadFileIcon} from '@common/icons/material/UploadFile';\nimport {DriveFolderUploadIcon} from '@common/icons/material/DriveFolderUpload';\nimport React from 'react';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {AddIcon} from '@common/icons/material/Add';\n\ninterface CreateNewButtonProps {\n isCompact?: boolean;\n className?: string;\n}\nexport function CreateNewButton({isCompact, className}: CreateNewButtonProps) {\n const activePage = useDriveStore(s => s.activePage);\n const {uploadFiles} = useDriveUploadQueue();\n\n const button = isCompact ? (\n \n \n \n ) : (\n }\n disabled={!activePage?.canUpload}\n >\n \n \n );\n\n return (\n
\n {\n if (value === 'uploadFiles') {\n uploadFiles(await openUploadWindow({multiple: true}));\n } else if (value === 'uploadFolder') {\n uploadFiles(await openUploadWindow({directory: true}));\n } else if (value === 'newFolder') {\n const activeFolder = driveState().activePage?.folder;\n driveState().setActiveActionDialog(\n 'newFolder',\n activeFolder ? [activeFolder] : []\n );\n }\n }}\n >\n {button}\n \n }>\n \n \n }>\n \n \n }>\n \n \n \n \n
\n );\n}\n","import React from 'react';\nimport {StorageMeter} from './storage-summary/storage-meter';\nimport {WorkspaceSelector} from '@common/workspace/workspace-selector';\nimport {RootFolderPage} from '../../drive-page/drive-page';\nimport {SidebarMenu} from './sidebar-menu';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {CreateNewButton} from '../create-new-button';\nimport {Button} from '@common/ui/buttons/button';\nimport {Link} from 'react-router-dom';\nimport {Trans} from '@common/i18n/trans';\nimport {useAuth} from '@common/auth/use-auth';\nimport clsx from 'clsx';\nimport {useSettings} from '@common/core/settings/use-settings';\n\ninterface SidebarProps {\n className?: string;\n}\nexport function Sidebar({className}: SidebarProps) {\n const {isSubscribed} = useAuth();\n const {billing} = useSettings();\n return (\n \n
\n \n \n \n {billing.enable ? (\n
\n \n \n \n
\n ) : null}\n
\n \n \n );\n}\n\nfunction WorkspaceSwitcher() {\n const navigate = useNavigate();\n return (\n {\n navigate(RootFolderPage.path);\n }}\n className=\"mt-auto w-full flex-shrink-0 border-t px-24 py-18\"\n />\n );\n}\n","import {InfiniteData, useInfiniteQuery} from '@tanstack/react-query';\nimport {useSearchParams} from 'react-router-dom';\nimport {LengthAwarePaginationResponse} from '@common/http/backend-response/pagination-response';\nimport {DriveEntry, DriveFolder} from '../drive-entry';\nimport {driveState, useDriveStore} from '../../drive-store';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {DriveQueryKeys} from '../../drive-query-keys';\nimport {SortColumn, SortDirection} from '../../layout/sorting/available-sorts';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\nimport {makeFolderPage, SearchPage} from '../../drive-page/drive-page';\nimport {useEffect} from 'react';\nimport {shallowEqual} from '@common/utils/shallow-equal';\n\nexport interface DriveApiIndexParams {\n orderBy?: SortColumn;\n orderDir?: SortDirection;\n folderId?: string | number | null;\n query?: string;\n filters?: string;\n deletedOnly?: boolean;\n starredOnly?: boolean;\n sharedOnly?: boolean;\n perPage?: number;\n page?: number;\n recentOnly?: boolean;\n workspaceId?: number | null;\n pageId?: number | string;\n}\n\ninterface EntriesPaginationResponse\n extends LengthAwarePaginationResponse {\n folder?: DriveFolder;\n}\n\nfunction fetchEntries(\n params: DriveApiIndexParams,\n): Promise {\n return apiClient\n .get('drive/file-entries', {\n params,\n })\n .then(response => response.data);\n}\n\nconst setActiveFolder = (response: InfiniteData) => {\n const firstPage = response.pages[0];\n const newFolder = firstPage.folder;\n const currentPage = driveState().activePage;\n\n if (\n newFolder &&\n currentPage &&\n currentPage.id === newFolder.hash &&\n // only update page if once to set the folder or if permissions change, to keep page reference as stable as possible\n (!currentPage.folder ||\n !shallowEqual(newFolder.permissions, currentPage.folder?.permissions))\n ) {\n driveState().setActivePage(makeFolderPage(newFolder));\n }\n return response;\n};\n\nexport function usePaginatedEntries() {\n const page = useDriveStore(s => s.activePage);\n const sortDescriptor = useDriveStore(s => s.sortDescriptor);\n const [searchParams] = useSearchParams();\n const {workspaceId} = useActiveWorkspaceId();\n const params: DriveApiIndexParams = {\n pageId: page?.id,\n ...page?.queryParams,\n ...Object.fromEntries(searchParams),\n folderId: page?.isFolderPage ? page.id : null,\n workspaceId,\n ...sortDescriptor,\n };\n\n // if we have no search query, there's no need to call the API, show no results message instead\n const isDisabledInSearch =\n page === SearchPage && !params.query && !params.filters;\n\n const query = useInfiniteQuery({\n queryKey: DriveQueryKeys.fetchEntries(params),\n queryFn: ({pageParam = 1}) => {\n return fetchEntries({...params, page: pageParam});\n },\n initialPageParam: 1,\n getNextPageParam: lastResponse => {\n const currentPage = lastResponse.current_page;\n const lastPage = lastResponse.last_page;\n if (currentPage >= lastPage) {\n return undefined;\n }\n return currentPage + 1;\n },\n enabled: page != null && !isDisabledInSearch,\n });\n\n // need to do this in effect, to avoid react errors about\n // multiple components re-rendering at the same time\n useEffect(() => {\n if (query.data?.pages[0].folder) {\n setActiveFolder(query.data);\n }\n }, [query.data]);\n\n return query;\n}\n\nexport function getAllEntries() {\n const caches = queryClient.getQueriesData<\n InfiniteData\n >({queryKey: DriveQueryKeys.fetchEntries()});\n return caches.reduce((all, cache) => {\n const current = cache[1] ? cache[1].pages.flatMap(p => p.data) : [];\n return [...all, ...current];\n }, []);\n}\n","import {\n BackendFilter,\n FilterControlType,\n FilterOperator,\n} from '@common/datatable/filters/backend-filter';\nimport {FILE_ENTRY_TYPE_FILTER} from '@common/admin/file-entry/file-entry-index-filters';\nimport {message} from '@common/i18n/message';\nimport {\n createdAtFilter,\n updatedAtFilter,\n} from '@common/datatable/filters/timestamp-filters';\n\nexport const driveSearchFilters: BackendFilter[] = [\n FILE_ENTRY_TYPE_FILTER,\n {\n key: 'owner_id',\n label: message('Owner'),\n description: message('User file was uploaded by'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n defaultValue: '02',\n options: [\n {\n key: '01',\n label: message('anyone'),\n value: {value: null, operator: '!='},\n },\n {\n key: '02',\n label: message('me'),\n value: '{authId}',\n },\n {\n key: '03',\n label: message('not me'),\n value: {value: '{authId}', operator: '!='},\n },\n ],\n },\n },\n createdAtFilter({\n description: message('Date file was uploaded'),\n }),\n updatedAtFilter({\n description: message('Date file was last changed'),\n }),\n {\n key: 'deleted_at',\n label: message('In trash'),\n description: message('Only show files that are in the trash'),\n defaultOperator: FilterOperator.ne,\n control: {\n type: FilterControlType.BooleanToggle,\n defaultValue: null,\n },\n },\n {\n key: 'shareableLink',\n label: message('Has shareable link'),\n description: message('Only show files that have a shareable link'),\n defaultOperator: FilterOperator.has,\n control: {\n type: FilterControlType.BooleanToggle,\n defaultValue: '*',\n },\n },\n {\n control: {\n type: FilterControlType.BooleanToggle,\n defaultValue: true,\n },\n key: 'sharedByMe',\n label: message('Shared by me'),\n description: message('Only show files that are shared with someone'),\n defaultOperator: FilterOperator.eq,\n },\n];\n","import React, {useContext, useState} from 'react';\nimport {driveSearchFilters} from './drive-search-filters';\nimport {useDriveStore} from '../drive-store';\nimport {SearchPage} from '../drive-page/drive-page';\nimport {TextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {SearchIcon} from '@common/icons/material/Search';\nimport {DashboardLayoutContext} from '@common/ui/layout/dashboard-layout-context';\nimport {FilterList} from '@common/datatable/filters/filter-list/filter-list';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {useSearchParams} from 'react-router-dom';\nimport {message} from '@common/i18n/message';\nimport {IconButton} from '@common/ui/buttons/icon-button';\n\nconst alwaysShownFilters = driveSearchFilters.map(f => f.key);\n\nexport function SearchFilterList() {\n const activePage = useDriveStore(s => s.activePage);\n const {isMobileMode} = useContext(DashboardLayoutContext);\n const {trans} = useTrans();\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const [inputValue, setInputValue] = useState(searchParams.get('query') || '');\n\n if (activePage !== SearchPage) {\n return null;\n }\n\n return (\n
\n {isMobileMode && (\n {\n e.preventDefault();\n // blur input so mobile keyboard is hidden\n if (document.activeElement?.tagName === 'INPUT') {\n (document.activeElement as HTMLInputElement).blur();\n }\n navigate(\n {\n pathname: SearchPage.path,\n search: `?query=${inputValue}`,\n },\n {replace: true}\n );\n }}\n >\n \n \n \n }\n placeholder={trans(message('Type to search'))}\n value={inputValue}\n onChange={e => setInputValue(e.target.value)}\n />\n \n )}\n \n
\n );\n}\n","import {InteractableRect} from '../interactable-event';\n\nexport function restrictResizableWithinBoundary(\n rect: InteractableRect,\n boundaryRect: InteractableRect\n) {\n const boundedRect = {...rect};\n\n // restrict to left edge of boundary\n boundedRect.left = Math.max(0, boundedRect.left);\n // compensate width when left is bounded\n const leftRestriction = boundedRect.left - rect.left;\n if (leftRestriction > 0) {\n boundedRect.width -= leftRestriction;\n }\n\n // restrict to top edge of boundary\n boundedRect.top = Math.max(0, boundedRect.top);\n // compensate height when top is bounded\n const topRestriction = boundedRect.top - rect.top;\n if (topRestriction > 0) {\n boundedRect.height -= topRestriction;\n }\n\n // restrict to right edge of boundary\n boundedRect.width = Math.min(\n boundedRect.width,\n boundaryRect.width - boundedRect.left\n );\n\n // restrict to bottom edge of boundary\n boundedRect.height = Math.min(\n boundedRect.height,\n boundaryRect.height - boundedRect.top\n );\n\n return boundedRect;\n}\n","import {RefObject, useLayoutEffect, useRef} from 'react';\nimport {droppables} from '../drag-state';\nimport {InteractableRect} from '../../interactable-event';\nimport {DraggableId} from '../use-draggable';\n\nexport interface ConnectedMouseSelectable {\n id: DraggableId;\n onSelected?: () => void;\n onDeselected?: () => void;\n ref: RefObject;\n rect?: InteractableRect;\n}\n\nexport const mouseSelectables = new Map<\n DraggableId,\n ConnectedMouseSelectable\n>();\n\nexport function useMouseSelectable(options: ConnectedMouseSelectable) {\n const {id, ref} = options;\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n useLayoutEffect(() => {\n if (!ref.current) return;\n // register droppable regardless if it's enabled or not, it might be used by mouse selection box\n mouseSelectables.set(id, {\n ...mouseSelectables.get(id),\n id,\n ref,\n // avoid stale closures\n onSelected: () => {\n optionsRef.current.onSelected?.();\n },\n onDeselected: () => optionsRef.current.onDeselected?.(),\n });\n return () => {\n droppables.delete(id);\n };\n }, [id, optionsRef, ref]);\n}\n","import {InteractableRect} from '../interactable-event';\n\nexport function rectsIntersect(\n rectA?: InteractableRect,\n rectB?: InteractableRect\n) {\n if (!rectA || !rectB) return false;\n return (\n rectA.left <= rectB.left + rectB.width &&\n rectA.left + rectA.width >= rectB.left &&\n rectA.top <= rectB.top + rectB.height &&\n rectA.top + rectA.height >= rectB.top\n );\n}\n","import React, {RefObject, useRef} from 'react';\nimport {usePointerEvents} from '../../use-pointer-events';\nimport {InteractableRect} from '../../interactable-event';\nimport {restrictResizableWithinBoundary} from '../../utils/restrict-resizable-within-boundary';\nimport {activeInteraction} from '../../active-interaction';\nimport {updateRects} from '../update-rects';\nimport {mouseSelectables} from './use-mouse-selectable';\nimport {rectsIntersect} from '../../utils/rects-intersect';\nimport {DraggableId} from '../use-draggable';\n\ninterface SelectionState {\n startPoint?: {x: number; y: number; scrollTop: number};\n endPoint?: {x: number; y: number};\n boundaryRect?: InteractableRect & {heightWithoutScroll: number};\n scrollListener?: EventListener;\n rafId?: number;\n selectedIds?: Set;\n}\n\ninterface Props {\n onPointerDown?: (e: React.PointerEvent) => void;\n containerRef?: RefObject;\n}\nexport function useMouseSelectionBox({onPointerDown, ...props}: Props = {}) {\n const defaultRef = useRef(null);\n const containerRef = props.containerRef || defaultRef;\n const boxRef = useRef(null);\n\n let state = useRef({}).current;\n\n const drawSelectionBox = () => {\n if (state.rafId) {\n cancelAnimationFrame(state.rafId);\n }\n\n if (!state.startPoint || !state.endPoint || !state.boundaryRect) return;\n\n const startPoint = state.startPoint;\n const endPoint = state.endPoint;\n const initialScrollTop = startPoint.scrollTop || 0;\n const currentScrollTop = containerRef.current?.scrollTop || 0;\n\n const newRect = {\n left: Math.min(startPoint.x, endPoint.x),\n top: Math.min(startPoint.y, endPoint.y),\n width: Math.abs(startPoint.x - endPoint.x),\n height: Math.abs(startPoint.y - endPoint.y),\n };\n\n // convert box coords to be relative to container and not viewport\n newRect.left -= state.boundaryRect.left;\n newRect.top -= state.boundaryRect.top;\n\n // take initial scroll of container into account\n newRect.top += initialScrollTop;\n\n // scroll diff between drag start and now (auto scroll or mouse wheel)\n const scrollDiff = currentScrollTop - initialScrollTop;\n const scrollValue = Math.abs(scrollDiff);\n\n // top needs to be changed only if scroll direction is top\n if (scrollDiff < 0) {\n newRect.top -= scrollValue;\n }\n\n // height needs to be changed regardless of direction and method\n newRect.height += scrollValue;\n\n const boundedRect = state.boundaryRect\n ? restrictResizableWithinBoundary(newRect, state.boundaryRect)\n : {...newRect};\n\n if (boxRef.current) {\n state.rafId = requestAnimationFrame(() => {\n if (boxRef.current) {\n boxRef.current.style.display = `block`;\n boxRef.current.style.transform = `translate(${boundedRect.left}px, ${boundedRect.top}px)`;\n boxRef.current.style.width = `${boundedRect.width}px`;\n boxRef.current.style.height = `${boundedRect.height}px`;\n }\n state.rafId = undefined;\n });\n }\n\n // convert rect back to absolute for intersection testing\n const absoluteRect = {\n ...boundedRect,\n left: boundedRect.left + state.boundaryRect.left,\n top: boundedRect.top + state.boundaryRect.top - currentScrollTop,\n };\n\n for (const [, selectable] of mouseSelectables) {\n const intersect = rectsIntersect(selectable.rect, absoluteRect);\n if (intersect && !state.selectedIds?.has(selectable.id)) {\n state.selectedIds?.add(selectable.id);\n selectable.onSelected?.();\n } else if (!intersect && state.selectedIds?.has(selectable.id)) {\n state.selectedIds?.delete(selectable.id);\n selectable.onDeselected?.();\n }\n }\n };\n\n const pointerEvents = usePointerEvents({\n minimumMovement: 4,\n onPointerDown,\n onMoveStart: e => {\n if (activeInteraction) {\n return false;\n }\n updateRects(mouseSelectables);\n state = {\n selectedIds: new Set(),\n };\n const el = containerRef.current;\n state.startPoint = {\n x: e.clientX,\n y: e.clientY,\n scrollTop: el?.scrollTop || 0,\n };\n\n state.scrollListener = e => {\n if (!state.startPoint) return;\n // update rects on scroll, because we are using relative position\n updateRects(mouseSelectables);\n if (state.boundaryRect?.height) {\n state.boundaryRect.height = (e.target as HTMLElement).scrollHeight;\n }\n // draw selection box (for autoscroll and mousewheel)\n drawSelectionBox();\n };\n\n if (el) {\n const rect = el.getBoundingClientRect();\n el.addEventListener('scroll', state.scrollListener);\n state.boundaryRect = {\n top: rect.top,\n left: rect.left,\n height: el.scrollHeight,\n heightWithoutScroll: rect.height,\n width: el.scrollWidth,\n };\n }\n },\n onMove: e => {\n state.endPoint = {x: e.clientX, y: e.clientY};\n\n if (state.boundaryRect && containerRef.current) {\n const reachedBottomEdge =\n e.clientY + 20 >\n state.boundaryRect.heightWithoutScroll + state.boundaryRect.top;\n const reachedTopEdge = e.clientY - 20 < state.boundaryRect.top;\n\n if (reachedBottomEdge) {\n containerRef.current.scrollBy({top: 10});\n } else if (reachedTopEdge) {\n containerRef.current.scrollBy({top: -10});\n }\n }\n\n drawSelectionBox();\n },\n onMoveEnd: () => {\n if (state.rafId) {\n cancelAnimationFrame(state.rafId);\n }\n if (containerRef.current && state.scrollListener) {\n containerRef.current.removeEventListener(\n 'scroll',\n state.scrollListener\n );\n }\n if (boxRef.current) {\n boxRef.current.style.display = `none`;\n boxRef.current.style.transform = '';\n boxRef.current.style.width = '';\n boxRef.current.style.height = '';\n }\n state = {};\n },\n });\n\n return {\n containerProps: {\n ...pointerEvents.domProps,\n ref: containerRef,\n },\n boxProps: {ref: boxRef},\n };\n}\n","import {DriveEntry} from '../drive-entry';\nimport {usePaginatedEntries} from './use-paginated-entries';\n\nexport function useEntries(): DriveEntry[] {\n const query = usePaginatedEntries();\n if (!query.data) return [];\n return query.data.pages.flatMap(p => p.data);\n}\n","import {driveState, useDriveStore} from '../drive-store';\nimport {getAllEntries} from './queries/use-paginated-entries';\nimport {DriveEntry, DriveFolder} from './drive-entry';\nimport {useEntries} from './queries/use-entries';\nimport {useFolders} from './queries/use-folders';\n\nexport function useSelectedEntries(): DriveEntry[] {\n const ids = useDriveStore(s => s.selectedEntries);\n const entries = useEntries();\n return Array.from(ids)\n .map(id => entries.find(entry => entry.id === id))\n .filter(e => !!e) as DriveEntry[];\n}\n\nexport function useSelectedEntry(): DriveEntry | null {\n const entries = useSelectedEntries();\n return entries[0];\n}\n\nexport function useSelectedEntryParent(): DriveFolder | null | undefined {\n const entry = useSelectedEntry();\n const {data} = useFolders();\n if (!entry || !data) return;\n return data.folders.find(e => e.id === entry.parent_id) as DriveFolder;\n}\n\nexport function getSelectedEntries(): DriveEntry[] {\n const ids = Array.from(driveState().selectedEntries);\n const allEntries = getAllEntries();\n return ids\n .map(id => allEntries.find(entry => entry.id === id))\n .filter(e => !!e) as DriveEntry[];\n}\n","import React, {createElement} from 'react';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {EntryActionMenuTrigger} from './entry-action-menu-trigger';\nimport {MoreVertIcon} from '@common/icons/material/MoreVert';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\nimport {useSelectedEntries} from '../files/use-selected-entries';\nimport {\n useDeleteEntriesAction,\n usePreviewAction,\n useRemoveSharedEntriesAction,\n useShareAction,\n} from './use-entry-actions';\nimport {DriveEntry} from '../files/drive-entry';\nimport {EntryAction} from './entry-action';\n\ninterface EntryActionListProps {\n className?: string;\n}\nexport function EntryActionList({className}: EntryActionListProps) {\n const selectedEntries = useSelectedEntries();\n\n if (!selectedEntries.length) {\n return null;\n }\n\n return (\n
\n \n
\n );\n}\n\ninterface ActionListProps {\n entries: DriveEntry[];\n}\nfunction ActionList({entries}: ActionListProps) {\n const preview = usePreviewAction(entries);\n const share = useShareAction(entries);\n const deleteAction = useDeleteEntriesAction(entries);\n const removeShared = useRemoveSharedEntriesAction(entries);\n\n const actions = [preview, share, deleteAction, removeShared].filter(\n action => !!action\n ) as EntryAction[];\n\n return (\n
\n {actions.map(action => (\n }>\n {\n action.execute();\n }}\n >\n {createElement(action.icon)}\n \n \n ))}\n \n }>\n \n \n \n \n \n
\n );\n}\n","import {useSelectedEntries} from './use-selected-entries';\nimport {DriveEntry} from './drive-entry';\nimport {useEntryActions} from '../entry-actions/use-entry-actions';\nimport {driveState, useDriveStore} from '../drive-store';\nimport {ContextMenu} from '@common/ui/navigation/menu/context-menu';\nimport {MenuItem} from '@common/ui/navigation/menu/menu-trigger';\nimport React, {createElement} from 'react';\nimport {Trans} from '@common/i18n/trans';\nimport {EntryAction} from '../entry-actions/entry-action';\nimport {DrivePage, RootFolderPage} from '../drive-page/drive-page';\nimport {useDrivePageActions} from '../entry-actions/use-drive-page-actions';\n\nexport function DriveContextMenu() {\n const selectedEntries = useSelectedEntries();\n const activePage = useDriveStore(s => s.activePage);\n const data = useDriveStore(s => s.contextMenuData);\n const entries = data?.entry ? [data.entry] : selectedEntries;\n\n // right-clicked root folder\n if (data?.entry?.id === 0) {\n return ;\n }\n\n if (data && entries.length) {\n return ;\n }\n\n if (data && activePage) {\n return ;\n }\n\n return null;\n}\n\ninterface EntriesContextMenuProps {\n position: {x: number; y: number};\n entries: DriveEntry[];\n}\nfunction EntriesContextMenu({entries, position}: EntriesContextMenuProps) {\n const actions = useEntryActions(entries);\n return ;\n}\n\ninterface PageContextMenuProps {\n position: {x: number; y: number};\n page: DrivePage;\n}\nfunction PageContextMenu({page, position}: PageContextMenuProps) {\n const actions = useDrivePageActions(page);\n return ;\n}\n\ninterface BaseContextMenuProps {\n position: {x: number; y: number};\n actions: EntryAction[];\n}\nfunction BaseContextMenu({position, actions}: BaseContextMenuProps) {\n return (\n {\n if (!isOpen) {\n driveState().setContextMenuData(null);\n }\n }}\n >\n {actions.map(action => (\n \n \n \n ))}\n \n );\n}\n","import {useMediaQuery} from './use-media-query';\n\nexport function useIsTouchDevice() {\n return useMediaQuery('((pointer: coarse))');\n}\n","import {\n ConnectedDraggable,\n useDraggable,\n} from '@common/ui/interactions/dnd/use-draggable';\nimport {driveState, useDriveStore} from '../drive-store';\nimport {getSelectedEntries} from '../files/use-selected-entries';\nimport {useDroppable} from '@common/ui/interactions/dnd/use-droppable';\nimport {\n folderAcceptsDrop,\n useFolderDropAction,\n} from '../files/use-folder-drop-action';\nimport {DriveEntry} from '../files/drive-entry';\nimport {useRef, useState} from 'react';\nimport clsx from 'clsx';\nimport {useIsTouchDevice} from '@common/utils/hooks/is-touch-device';\nimport {FileEntry} from '@common/uploads/file-entry';\nimport {useMouseSelectable} from '@common/ui/interactions/dnd/mouse-selection/use-mouse-selectable';\nimport {TrashPage} from '@app/drive/drive-page/drive-page';\n\nexport function useFileViewDnd(\n entry: DriveEntry\n) {\n const isTouchDevice = useIsTouchDevice();\n const ref = useRef(null);\n const {onDrop} = useFolderDropAction(entry);\n const [isDragOver, setIsDragOver] = useState(false);\n const isDragging = useDriveStore(s =>\n s.entriesBeingDragged.includes(entry.id)\n );\n const activePage = useDriveStore(s => s.activePage);\n\n const {draggableProps} = useDraggable({\n disabled: !!isTouchDevice || activePage === TrashPage,\n id: entry.id,\n type: 'fileEntry',\n ref,\n hidePreview: true,\n onDragStart: (e, target: ConnectedDraggable) => {\n if (!driveState().selectedEntries.has(entry.id)) {\n driveState().selectEntries([entry.id]);\n }\n driveState().setEntriesBeingDragged(target.getData().map(e => e.id));\n },\n onDragEnd: () => {\n driveState().setEntriesBeingDragged([]);\n },\n getData: () => getSelectedEntries(),\n });\n\n const {droppableProps} = useDroppable({\n id: entry.id,\n disabled: isTouchDevice || entry.type !== 'folder',\n ref,\n types: ['fileEntry', 'nativeFile'],\n acceptsDrop: target => folderAcceptsDrop(target, entry),\n onDragEnter: () => setIsDragOver(true),\n onDragLeave: () => setIsDragOver(false),\n onDrop,\n });\n\n useMouseSelectable({\n id: entry.id,\n ref,\n onSelected: () => {\n driveState().selectEntries([entry.id], true);\n },\n onDeselected: () => {\n driveState().deselectEntries([entry.id]);\n },\n });\n\n const itemClassName = clsx(\n isDragging && 'opacity-20',\n isDragOver && 'ring ring-offset-4 ring-primary bg-primary-light/10 rounded'\n );\n\n return {\n draggableProps,\n droppableProps,\n isDragOver,\n isDragging,\n itemClassName,\n ref,\n };\n}\n","import {DriveEntry} from '../../files/drive-entry';\nimport {RowElementProps} from '@common/ui/tables/table-row';\nimport {mergeProps} from '@react-aria/utils';\nimport {useFileViewDnd} from '../use-file-view-dnd';\nimport clsx from 'clsx';\nimport React, {useContext} from 'react';\nimport {driveState} from '../../drive-store';\nimport {TableContext} from '@common/ui/tables/table-context';\n\nexport function FileTableRow({\n item,\n children,\n className,\n ...domProps\n}: RowElementProps) {\n const {isCollapsedMode} = useContext(TableContext);\n const {draggableProps, droppableProps, itemClassName, ref} =\n useFileViewDnd(item);\n\n return (\n {\n e.preventDefault();\n e.stopPropagation();\n if (!isCollapsedMode) {\n if (!driveState().selectedEntries.has(item.id)) {\n driveState().selectEntries([item.id]);\n }\n driveState().setContextMenuData({x: e.clientX, y: e.clientY});\n }\n },\n })}\n >\n {children}\n \n );\n}\n","import {useCallback} from 'react';\nimport {getPathForFolder, TrashPage} from '../drive-page/drive-page';\nimport {driveState} from '../drive-store';\nimport {DriveEntry} from '../files/drive-entry';\nimport {getSelectedEntries} from '../files/use-selected-entries';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\n\nexport function useViewItemActionHandler() {\n const navigate = useNavigate();\n\n const performViewItemAction = useCallback(\n (entry: DriveEntry) => {\n if (entry && entry.type === 'folder') {\n if (driveState().activePage === TrashPage) {\n driveState().setActiveActionDialog('trashFolderBlock', [entry]);\n } else {\n navigate(getPathForFolder(entry.hash));\n }\n } else {\n const selectedEntries = getSelectedEntries();\n driveState().setActiveActionDialog(\n 'preview',\n selectedEntries.length ? selectedEntries : [entry]\n );\n }\n },\n [navigate]\n );\n\n return {performViewItemAction};\n}\n","import {DriveEntry} from '../../files/drive-entry';\nimport React, {useMemo} from 'react';\nimport {Table} from '@common/ui/tables/table';\nimport {\n DriveSortDescriptor,\n driveState,\n useDriveStore,\n} from '../../drive-store';\nimport {FileTableRow} from './file-table-row';\nimport {useViewItemActionHandler} from '../use-view-item-action-handler';\nimport {fileTableColumns} from './file-table-columns';\n\ninterface Props {\n entries: DriveEntry[];\n}\nexport function FileTable({entries}: Props) {\n const {performViewItemAction} = useViewItemActionHandler();\n const selectedEntries = useDriveStore(s => s.selectedEntries);\n const sortDescriptor = useDriveStore(s => s.sortDescriptor);\n\n const selectedRows = useMemo(() => {\n return [...selectedEntries];\n }, [selectedEntries]);\n\n return (\n {\n driveState().setSortDescriptor(value as DriveSortDescriptor);\n }}\n onAction={performViewItemAction}\n selectedRows={selectedRows}\n selectionStyle=\"highlight\"\n renderRowAs={FileTableRow}\n onSelectionChange={value => {\n driveState().selectEntries(value as number[]);\n }}\n />\n );\n}\n","import React, {useContext} from 'react';\nimport {DriveEntry} from '../../files/drive-entry';\nimport {driveState, useDriveStore} from '../../drive-store';\nimport {mergeProps} from '@react-aria/utils';\nimport {useFileViewDnd} from '../use-file-view-dnd';\nimport {useViewItemActionHandler} from '../use-view-item-action-handler';\nimport {usePointerEvents} from '@common/ui/interactions/use-pointer-events';\nimport {createEventHandler} from '@common/utils/dom/create-event-handler';\nimport {DashboardLayoutContext} from '@common/ui/layout/dashboard-layout-context';\nimport {BaseFileGridItem} from './base-file-grid-item';\nimport {EntryActionMenuTrigger} from '../../entry-actions/entry-action-menu-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {MoreVertIcon} from '@common/icons/material/MoreVert';\nimport {Checkbox} from '@common/ui/forms/toggle/checkbox';\nimport {isCtrlOrShiftPressed} from '@common/utils/keybinds/is-ctrl-or-shift-pressed';\n\ninterface FileGridItemProps {\n entry: DriveEntry;\n}\nexport function FileGridItem({entry}: FileGridItemProps) {\n const isSelected = useDriveStore(s => s.selectedEntries.has(entry.id));\n const {performViewItemAction} = useViewItemActionHandler();\n const {isMobileMode} = useContext(DashboardLayoutContext);\n\n const {draggableProps, droppableProps, itemClassName, ref} =\n useFileViewDnd(entry);\n\n const toggleEntry = () => {\n if (isSelected) {\n driveState().deselectEntries([entry.id]);\n } else {\n driveState().selectEntries([entry.id], true);\n }\n };\n\n const pressHandler = (e: PointerEvent, el: HTMLElement) => {\n if (isMobileMode) {\n if (driveState().selectedEntries.size) {\n toggleEntry();\n } else {\n performViewItemAction(entry);\n }\n } else {\n if (isCtrlOrShiftPressed(e)) {\n toggleEntry();\n } else {\n driveState().selectEntries([entry.id]);\n }\n }\n };\n\n const {domProps: pressProps} = usePointerEvents({\n onLongPress: isMobileMode ? () => toggleEntry() : undefined,\n onPress: pressHandler,\n });\n\n const keyboardHandler: React.KeyboardEventHandler = e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n performViewItemAction(entry);\n }\n };\n\n const contextMenuHandler: React.MouseEventHandler = e => {\n e.preventDefault();\n e.stopPropagation();\n if (!isMobileMode) {\n if (!driveState().selectedEntries.has(entry.id)) {\n driveState().selectEntries([entry.id]);\n }\n driveState().setContextMenuData({x: e.clientX, y: e.clientY});\n }\n };\n\n return (\n {\n e.preventDefault();\n e.stopPropagation();\n if (!isMobileMode) {\n performViewItemAction(entry);\n }\n }}\n footerAdornment={\n isMobileMode && (\n \n )\n }\n onContextMenu={createEventHandler(contextMenuHandler)}\n className={itemClassName}\n />\n );\n}\n\ninterface FooterProps {\n entry: DriveEntry;\n isSelected?: boolean;\n}\nfunction FooterAdornment({entry, isSelected}: FooterProps) {\n const anySelected = useDriveStore(s => s.selectedEntries.size);\n\n if (anySelected) {\n return ;\n }\n\n return (\n \n {\n e.stopPropagation();\n }}\n >\n \n \n \n );\n}\n","import {FileGridItem} from './file-grid-item';\nimport React from 'react';\nimport {DriveEntry} from '../../files/drive-entry';\n\ninterface FileGridProps {\n entries: DriveEntry[];\n}\nexport function FileGrid({entries}: FileGridProps) {\n return (\n
\n
\n {entries.map(entry => {\n return ;\n })}\n
\n
\n );\n}\n","import {driveState, useDriveStore} from '../../drive-store';\nimport {EntriesSortButton} from './entries-sort-button';\nimport React from 'react';\n\ninterface DriveSortButtonProps {\n isDisabled?: boolean;\n}\nexport function DriveSortButton({isDisabled}: DriveSortButtonProps) {\n const descriptor = useDriveStore(s => s.sortDescriptor);\n return (\n {\n driveState().setSortDescriptor(value);\n }}\n />\n );\n}\n","import React, {ReactNode, useContext} from 'react';\nimport {useDriveStore} from './drive-store';\nimport {\n DrivePage,\n makeFolderPage,\n RootFolderPage,\n SharesPage,\n TrashPage,\n} from './drive-page/drive-page';\nimport {Breadcrumb} from '@common/ui/breadcrumbs/breadcrumb';\nimport {useAuth} from '@common/auth/use-auth';\nimport {useFolderPath} from './files/queries/use-folder-path';\nimport {EntryActionMenuTrigger} from './entry-actions/entry-action-menu-trigger';\nimport {useActiveWorkspace} from '@common/workspace/active-workspace-id-context';\nimport {ButtonBase} from '@common/ui/buttons/button-base';\nimport {BreadcrumbItem} from '@common/ui/breadcrumbs/breadcrumb-item';\nimport {ArrowDropDownIcon} from '@common/icons/material/ArrowDropDown';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {MixedText} from '@common/i18n/mixed-text';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {DashboardLayoutContext} from '@common/ui/layout/dashboard-layout-context';\n\ninterface ItemConfig {\n page: DrivePage;\n label: MessageDescriptor | string;\n}\n\ninterface PageBreadcrumbsProps {\n className?: string;\n}\nexport function PageBreadcrumbs({className}: PageBreadcrumbsProps) {\n const {isMobileMode} = useContext(DashboardLayoutContext);\n const navigate = useNavigate();\n const page = useDriveStore(s => s.activePage);\n const folder = page?.folder;\n const query = useFolderPath({\n hash: folder?.hash,\n isEnabled: folder?.hash !== RootFolderPage.folder.hash,\n });\n const workspace = useActiveWorkspace();\n const rootItem = useRootItem();\n // wait until path, folder and workspace load fully\n const isLoading =\n !page ||\n !workspace ||\n (page.isFolderPage && !folder) ||\n query.fetchStatus !== 'idle';\n\n let content: ReactNode;\n\n if (isLoading) {\n content = null;\n } else {\n const items: ItemConfig[] = rootItem ? [rootItem] : [];\n\n if (query.data) {\n query.data.path.forEach(parent => {\n items.push({\n page: makeFolderPage(parent),\n label: parent.name,\n });\n });\n }\n\n content = (\n \n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n if (!isLast) {\n return (\n {\n navigate(item.page.path);\n }}\n >\n \n \n );\n }\n\n return (\n \n {({isMenuItem}) => {\n if (\n isMenuItem ||\n (!item.page.folder && item.page !== TrashPage)\n )\n return ;\n return (\n \n \n \n \n \n \n );\n }}\n \n );\n })}\n \n );\n }\n\n return content;\n}\n\nfunction useRootItem(): ItemConfig | null {\n const page = useDriveStore(s => s.activePage);\n const workspace = useActiveWorkspace();\n const {user} = useAuth();\n\n if (!page) return null;\n\n // in workspace\n if (workspace && !workspace.default) {\n if (\n page?.isFolderPage &&\n (page?.id === RootFolderPage.id ||\n page.folder?.workspace_id === workspace.id)\n ) {\n return {label: workspace.name, page: RootFolderPage};\n }\n }\n\n if (page?.isFolderPage) {\n const owner = page.folder?.users.find(u => u.owns_entry);\n // inside shared folder\n if (owner?.id !== user?.id) {\n return {label: SharesPage.label, page: SharesPage};\n }\n // if folder is currently active, root item will always be root folder page\n return {label: RootFolderPage.label, page: RootFolderPage};\n }\n\n // if folder page is not active, we are already at the root\n return {label: page.label, page};\n}\n","import React, {ReactNode, useEffect, useRef, useState} from 'react';\nimport clsx from 'clsx';\nimport {UseInfiniteQueryResult} from '@tanstack/react-query/src/types';\nimport {Trans} from '@common/i18n/trans';\nimport {Button} from '@common/ui/buttons/button';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {ProgressCircle} from '@common/ui/progress/progress-circle';\n\nexport interface InfiniteScrollSentinelProps {\n loaderMarginTop?: string;\n children?: ReactNode;\n loadMoreExtraContent?: ReactNode;\n query: UseInfiniteQueryResult;\n style?: React.CSSProperties;\n className?: string;\n variant?: 'infiniteScroll' | 'loadMore';\n size?: 'sm' | 'md';\n}\nexport function InfiniteScrollSentinel({\n query: {isInitialLoading, fetchNextPage, isFetchingNextPage, hasNextPage},\n children,\n loaderMarginTop = 'mt-24',\n style,\n className,\n variant: _variant = 'infiniteScroll',\n loadMoreExtraContent,\n size = 'md',\n}: InfiniteScrollSentinelProps) {\n const sentinelRef = useRef(null);\n const isLoading = isFetchingNextPage || isInitialLoading;\n const [loadMoreClickCount, setLoadMoreClickCount] = useState(0);\n const innerVariant =\n _variant === 'loadMore' && loadMoreClickCount < 3\n ? 'loadMore'\n : 'infiniteScroll';\n\n useEffect(() => {\n const sentinelEl = sentinelRef.current;\n if (!sentinelEl || innerVariant === 'loadMore') return;\n const observer = new IntersectionObserver(([entry]) => {\n if (entry.isIntersecting && hasNextPage && !isLoading) {\n fetchNextPage();\n }\n });\n observer.observe(sentinelEl);\n return () => {\n observer.unobserve(sentinelEl);\n };\n }, [fetchNextPage, hasNextPage, isLoading, innerVariant]);\n\n let content: ReactNode;\n\n if (children) {\n // children might already be wrapped in AnimatePresence, so only wrap default loader with it\n content = isFetchingNextPage ? children : null;\n } else if (innerVariant === 'loadMore') {\n content = !isInitialLoading && hasNextPage && (\n
\n {loadMoreExtraContent}\n {\n fetchNextPage();\n setLoadMoreClickCount(loadMoreClickCount + 1);\n }}\n disabled={isLoading}\n >\n {loadMoreClickCount >= 2 && !isFetchingNextPage ? (\n \n ) : (\n \n )}\n \n
\n );\n } else {\n content = (\n \n {isFetchingNextPage && (\n \n \n \n )}\n \n );\n }\n\n return (\n \n
\n {content}\n
\n );\n}\n","import {AnimatePresence, m} from 'framer-motion';\nimport {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\n\ninterface DropTargetMaskProps {\n isVisible: boolean;\n}\nexport function DropTargetMask({isVisible}: DropTargetMaskProps) {\n const mask = (\n \n \n \n \n \n );\n return {isVisible ? mask : null};\n}\n","import React, {\n KeyboardEventHandler,\n MouseEventHandler,\n ReactNode,\n useContext,\n useRef,\n useState,\n} from 'react';\nimport {usePaginatedEntries} from '../files/queries/use-paginated-entries';\nimport {driveState, useDriveStore} from '../drive-store';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport {SearchFilterList} from '../search/search-filter-list';\nimport {Trans} from '@common/i18n/trans';\nimport {useMouseSelectionBox} from '@common/ui/interactions/dnd/mouse-selection/use-mouse-selection-box';\nimport {useDroppable} from '@common/ui/interactions/dnd/use-droppable';\nimport {mergeProps} from '@react-aria/utils';\nimport {useDriveUploadQueue} from '../uploading/use-drive-upload-queue';\nimport {EntryActionList} from '../entry-actions/entry-action-list';\nimport {DriveContextMenu} from '../files/drive-context-menu';\nimport {FileTable} from './file-table/file-table';\nimport {FileGrid} from './file-grid/file-grid';\nimport {DriveSortButton} from '../layout/sorting/drive-sort-button';\nimport {DashboardLayoutContext} from '@common/ui/layout/dashboard-layout-context';\nimport {PageBreadcrumbs} from '../page-breadcrumbs';\nimport {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\nimport {useEntries} from '../files/queries/use-entries';\nimport {AdHost} from '@common/admin/ads/ad-host';\nimport {DropTargetMask} from '../drop-target-mask';\nimport {useSearchParams} from 'react-router-dom';\nimport clsx from 'clsx';\nimport {MixedDraggable} from '@common/ui/interactions/dnd/use-draggable';\nimport {isCtrlKeyPressed} from '@common/utils/keybinds/is-ctrl-key-pressed';\nimport {useDeleteEntries} from '@app/drive/files/queries/use-delete-entries';\nimport {createEventHandler} from '@common/utils/dom/create-event-handler';\nimport {TrashPage} from '@app/drive/drive-page/drive-page';\nimport {getSelectedEntries} from '@app/drive/files/use-selected-entries';\n\ninterface FileViewProps {\n className?: string;\n}\nexport function FileView({className}: FileViewProps) {\n const [params] = useSearchParams();\n const isSearchingOrFiltering =\n !!params.get('query') || !!params.get('filters');\n const containerRef = useRef(null);\n const query = usePaginatedEntries();\n const entries = useEntries();\n const {uploadFiles} = useDriveUploadQueue();\n const deleteEntries = useDeleteEntries();\n const activePage = useDriveStore(s => s.activePage);\n const [isDragOver, setIsDragOver] = useState(false);\n const viewMode = useDriveStore(s => s.viewMode);\n const {isMobileMode} = useContext(DashboardLayoutContext);\n\n const {containerProps, boxProps} = useMouseSelectionBox({\n containerRef,\n onPointerDown: e => {\n if (!(e.target as HTMLElement).closest('.entry-action-list')) {\n driveState().deselectEntries('all');\n }\n },\n });\n\n const {droppableProps} = useDroppable({\n id: 'driveRoot',\n ref: containerRef,\n types: ['nativeFile'],\n disabled: !activePage?.canUpload,\n onDragEnter: () => {\n setIsDragOver(true);\n },\n onDragLeave: () => {\n setIsDragOver(false);\n },\n onDrop: async (draggable: MixedDraggable) => {\n if (draggable.type === 'nativeFile') {\n uploadFiles(await draggable.getData());\n }\n },\n });\n\n if (!activePage) return null;\n\n let content: ReactNode;\n if (!entries.length && (!query.isLoading || query.fetchStatus === 'idle')) {\n const noContentMessage = activePage.noContentMessage(\n isSearchingOrFiltering,\n );\n content = (\n }\n title={}\n description={}\n />\n );\n } else if (!query.isLoading) {\n content =\n viewMode === 'list' ? (\n \n ) : (\n \n );\n }\n\n const handleContextMenu: MouseEventHandler = e => {\n e.preventDefault();\n e.stopPropagation();\n driveState().deselectEntries('all');\n driveState().setContextMenuData({x: e.clientX, y: e.clientY});\n };\n\n const handleKeybinds: KeyboardEventHandler = e => {\n if (e.key === 'a' && isCtrlKeyPressed(e)) {\n e.preventDefault();\n e.stopPropagation();\n driveState().selectEntries(entries.map(entry => entry.id));\n }\n if (e.key === 'Delete') {\n e.preventDefault();\n e.stopPropagation();\n if (driveState().selectedEntries.size && !deleteEntries.isPending) {\n if (activePage === TrashPage) {\n driveState().setActiveActionDialog(\n 'confirmAndDeleteForever',\n getSelectedEntries(),\n );\n } else {\n deleteEntries.mutate({\n entryIds: [...driveState().selectedEntries],\n deleteForever: activePage === TrashPage,\n });\n driveState().selectEntries([]);\n }\n }\n }\n };\n\n return (\n \n
\n {isMobileMode ? (\n \n ) : (\n \n )}\n \n
\n \n {content}\n \n
\n
\n \n );\n}\n\nfunction Toolbar() {\n const activePage = useDriveStore(s => s.activePage);\n return (\n
\n \n \n
\n );\n}\n","import {\n ComponentPropsWithoutRef,\n CSSProperties,\n memo,\n ReactElement,\n useMemo,\n useState,\n} from 'react';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {FileTypeIcon} from '@common/uploads/file-type-icon/file-type-icon';\nimport {prettyBytes} from '@common/uploads/utils/pretty-bytes';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {ProgressCircle} from '@common/ui/progress/progress-circle';\nimport {CheckCircleIcon} from '@common/icons/material/CheckCircle';\nimport {UploadedFile} from '@common/uploads/uploaded-file';\nimport {useFileUploadStore} from '@common/uploads/uploader/file-upload-provider';\nimport {Trans} from '@common/i18n/trans';\nimport {MixedText} from '@common/i18n/mixed-text';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {ErrorIcon} from '@common/icons/material/Error';\nimport {WarningIcon} from '@common/icons/material/Warning';\nimport {message} from '@common/i18n/message';\n\ninterface UploadQueueProps {\n file: UploadedFile;\n style: CSSProperties;\n}\nexport const UploadQueueItem = memo(({file, style}: UploadQueueProps) => {\n return (\n \n
\n \n
\n
\n
\n
\n {file.name}\n
\n
\n \n
\n
\n \n
\n \n );\n});\n\ninterface SizeInfoProps {\n file: UploadedFile;\n}\nfunction SizeInfo({file}: SizeInfoProps) {\n const fileUpload = useFileUploadStore(s => s.fileUploads.get(file.id));\n const bytesUploaded = fileUpload?.bytesUploaded || 0;\n\n const totalBytes = useMemo(() => prettyBytes(file.size), [file]);\n const uploadedBytes = useMemo(\n () => prettyBytes(bytesUploaded),\n [bytesUploaded]\n );\n\n let statusMessage: ReactElement;\n if (fileUpload?.status === 'completed') {\n statusMessage = ;\n } else if (fileUpload?.status === 'aborted') {\n statusMessage = ;\n } else if (fileUpload?.status === 'failed') {\n statusMessage = ;\n } else {\n statusMessage = (\n \n );\n }\n\n return
{statusMessage}
;\n}\n\ninterface FileStatusProps {\n file: UploadedFile;\n}\nfunction FileStatus({file}: FileStatusProps) {\n const fileUpload = useFileUploadStore(s => s.fileUploads.get(file.id));\n const abortUpload = useFileUploadStore(s => s.abortUpload);\n const percentage = fileUpload?.percentage || 0;\n const status = fileUpload?.status;\n const errorMessage = fileUpload?.errorMessage;\n const [isHovered, setIsHovered] = useState(false);\n\n const abortButton = (\n {\n abortUpload(file.id);\n }}\n >\n \n \n );\n\n const progressButton = (\n \n );\n\n let statusButton: ReactElement;\n if (status === 'failed') {\n const errMessage =\n errorMessage || message('This file could not be uploaded');\n statusButton = (\n \n }>\n \n \n \n );\n } else if (status === 'aborted') {\n statusButton = (\n \n \n \n );\n } else if (status === 'completed') {\n statusButton = (\n \n \n \n );\n } else {\n statusButton = (\n {\n if (e.pointerType === 'mouse') {\n setIsHovered(true);\n }\n }}\n onPointerLeave={e => {\n if (e.pointerType === 'mouse') {\n setIsHovered(false);\n }\n }}\n >\n {isHovered ? abortButton : progressButton}\n \n );\n }\n\n return {statusButton};\n}\n\ninterface AnimatedStatusProps\n extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'onAnimationStart' | 'onDragStart' | 'onDragEnd' | 'onDrag'\n > {\n children: ReactElement;\n}\nfunction AnimatedStatus({children, ...domProps}: AnimatedStatusProps) {\n return (\n \n {children}\n \n );\n}\n","import {ReactElement, useRef} from 'react';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {driveState, useDriveStore} from '../drive-store';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {useFileUploadStore} from '@common/uploads/uploader/file-upload-provider';\nimport {Trans} from '@common/i18n/trans';\nimport {UploadQueueItem} from './upload-queue-item';\nimport {useVirtualizer} from '@tanstack/react-virtual';\n\nexport function UploadQueue() {\n const isOpen = useDriveStore(s => s.uploadQueueIsOpen);\n\n return (\n \n {isOpen && (\n \n
\n \n \n )}\n \n );\n}\n\nexport function Header() {\n const inProgressUploadsCount = useFileUploadStore(s => s.activeUploadsCount);\n const completedUploadsCount = useFileUploadStore(\n s => s.completedUploadsCount\n );\n const clearInactive = useFileUploadStore(s => s.clearInactive);\n\n let message: ReactElement;\n if (inProgressUploadsCount) {\n message = (\n \n );\n } else if (completedUploadsCount) {\n message = (\n \n );\n } else {\n message = ;\n }\n\n // only allow closing upload queue if there are no active uploads\n return (\n
\n {message}\n {inProgressUploadsCount === 0 ? (\n {\n driveState().setUploadQueueIsOpen(false);\n // wait for upload queue panel animation to complete, then clear inactive uploads\n setTimeout(() => {\n clearInactive();\n }, 200);\n }}\n >\n \n \n ) : undefined}\n
\n );\n}\n\nfunction UploadList() {\n const uploads = useFileUploadStore(s => s.fileUploads);\n const uploadsArray = [...uploads.values()];\n const ref = useRef(null);\n const virtualizer = useVirtualizer({\n count: uploads.size,\n getScrollElement: () => ref.current,\n estimateSize: () => 60,\n overscan: 4,\n });\n\n return (\n
\n \n {virtualizer.getVirtualItems().map(virtualItem => {\n const upload = uploadsArray[virtualItem.index];\n return (\n \n );\n })}\n
\n \n );\n}\n","export default \"__VITE_ASSET__6b065fb0__\"","import React, {ReactNode, useContext} from 'react';\nimport {DashboardLayoutContext} from '@common/ui/layout/dashboard-layout-context';\nimport {FileTypeIcon} from '@common/uploads/file-type-icon/file-type-icon';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {CloseIcon} from '@common/icons/material/Close';\n\ninterface HeaderProps {\n entryType: string;\n entryName: ReactNode;\n}\nexport function DetailsSidebarHeader({entryType, entryName}: HeaderProps) {\n const {setRightSidenavStatus} = useContext(DashboardLayoutContext);\n return (\n
\n \n
\n {entryName}\n
\n {\n setRightSidenavStatus('closed');\n }}\n >\n \n \n
\n );\n}\n","import React, {ReactNode} from 'react';\nimport clsx from 'clsx';\n\ninterface Props {\n children: ReactNode;\n margin?: string;\n}\nexport function DetailsSidebarSectionHeader({\n children,\n margin = 'mb-20',\n}: Props) {\n return
{children}
;\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {message} from '@common/i18n/message';\nimport {ChipValue} from '@common/ui/forms/input-field/chip-field/chip-field';\nimport {DriveEntry} from '@app/drive/files/drive-entry';\nimport {invalidateEntryQueries} from '@app/drive/drive-query-keys';\n\ninterface Response extends BackendResponse {\n //\n}\n\ninterface Payload {\n entry: DriveEntry;\n tags: ChipValue[];\n}\n\nexport function useSyncEntryTags() {\n return useMutation({\n mutationFn: (props: Payload) => createComment(props),\n onSuccess: () => {\n invalidateEntryQueries();\n },\n onError: err => showHttpErrorToast(err, message('Failed to save tags.')),\n });\n}\n\nfunction createComment({entry, tags}: Payload): Promise {\n return apiClient\n .post(`file-entries/${entry.id}/sync-tags`, {\n tags: tags.map(tag => tag.name),\n })\n .then(r => r.data);\n}\n","import {keepPreviousData, useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {NormalizedModel} from '@common/datatable/filters/normalized-model';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\n\ninterface Response extends BackendResponse {\n results: NormalizedModel[];\n}\n\nexport function useFileEntryTags(query?: string) {\n return useQuery({\n queryKey: ['file-entry-tags', query],\n queryFn: () => fetchTags(query),\n placeholderData: keepPreviousData,\n });\n}\n\nasync function fetchTags(query?: string) {\n return apiClient\n .get('file-entry-tags', {params: {query}})\n .then(r => r.data);\n}\n","import {DetailsSidebarSectionHeader} from '@app/drive/details-sidebar/details-sidebar-section-header';\nimport {Trans} from '@common/i18n/trans';\nimport {DriveEntry} from '@app/drive/files/drive-entry';\nimport {\n ChipField,\n ChipValue,\n} from '@common/ui/forms/input-field/chip-field/chip-field';\nimport React, {useState} from 'react';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {useSyncEntryTags} from '@app/drive/details-sidebar/requests/use-sync-entry-tags';\nimport {useFileEntryTags} from '@app/drive/details-sidebar/requests/use-file-entry-tags';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\n\ninterface Props {\n entry: DriveEntry;\n}\nexport function DetailsSidebarTags({entry}: Props) {\n // use key={entry.id} to force re-render tag chip field when entry changes\n return (\n
\n \n \n \n \n
\n );\n}\n\nfunction TagChipField({entry}: Props) {\n const {trans} = useTrans();\n const navigate = useNavigate();\n const syncTags = useSyncEntryTags();\n const [inputValue, setInputValue] = useState('');\n const [value, setValue] = useState(entry.tags || []);\n const {data, isLoading} = useFileEntryTags(inputValue);\n\n const handleChange = (newTags: ChipValue[]) => {\n setValue(newTags);\n if (!syncTags.isPending) {\n syncTags.mutate({tags: newTags, entry});\n }\n };\n\n return (\n {\n navigate(`/drive/search?query=${chip.name}`);\n }}\n >\n {data?.results.map(result => (\n \n {result.name}\n \n ))}\n \n );\n}\n","import {useSelectedEntryParent} from '@app/drive/files/use-selected-entries';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport React, {ReactNode, useMemo} from 'react';\nimport {prettyBytes} from '@common/uploads/utils/pretty-bytes';\nimport {Trans} from '@common/i18n/trans';\nimport {Button} from '@common/ui/buttons/button';\nimport {FolderIcon} from '@common/icons/material/Folder';\nimport {\n getPathForFolder,\n RootFolderPage,\n} from '@app/drive/drive-page/drive-page';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {DriveEntry} from '@app/drive/files/drive-entry';\nimport {FileThumbnail} from '@common/uploads/file-type-icon/file-thumbnail';\nimport {GroupsIcon} from '@common/icons/material/Groups';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Avatar} from '@common/ui/images/avatar';\nimport {driveState} from '@app/drive/drive-store';\nimport {DetailsSidebarHeader} from '@app/drive/details-sidebar/details-sidebar-header';\nimport {DetailsSidebarSectionHeader} from '@app/drive/details-sidebar/details-sidebar-section-header';\nimport {DetailsSidebarTags} from '@app/drive/details-sidebar/details-sidebar-tags';\n\ninterface EntryPropertiesProps {\n entry: DriveEntry;\n}\nexport function DetailsSidebarProperties({entry}: EntryPropertiesProps) {\n return (\n
\n \n {entry.type === 'image' && (\n \n )}\n
\n \n \n \n
\n {entry.workspace_id ? (\n
\n \n
\n ) : null}\n {entry.users.map(user => (\n \n \n \n ))}\n
\n {entry.permissions['files.update'] && (\n {\n driveState().setActiveActionDialog('share', [entry]);\n }}\n >\n \n \n )}\n
\n \n \n
\n );\n}\n\ninterface Props {\n entry: DriveEntry;\n}\nfunction PropertyList({entry}: Props) {\n const parent = useSelectedEntryParent();\n const navigate = useNavigate();\n const owner = entry.users.find(user => user.owns_entry);\n const prettySize = useMemo(\n () => prettyBytes(entry.file_size),\n [entry.file_size]\n );\n\n return (\n
\n \n \n \n }\n value={\n \n \n \n }\n />\n }\n value={entry.file_size ? prettySize : '-'}\n />\n }\n value={\n }\n onClick={() => {\n navigate(\n parent ? getPathForFolder(parent.hash) : RootFolderPage.path\n );\n }}\n >\n {parent ? parent.name : }\n \n }\n />\n {owner && (\n }\n value={owner.display_name}\n />\n )}\n }\n value={}\n />\n }\n value={}\n />\n
\n );\n}\n\ninterface PropertyItemProps {\n label: ReactNode;\n value: ReactNode;\n}\nfunction PropertyItem({label, value}: PropertyItemProps) {\n return (\n
\n
{label}
\n
{value}
\n
\n );\n}\n","import React, {Fragment} from 'react';\nimport {useSelectedEntry} from '../files/use-selected-entries';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport {Trans} from '@common/i18n/trans';\nimport detailedExamination from './detailed-examination.svg';\nimport clsx from 'clsx';\nimport {DetailsSidebarHeader} from '@app/drive/details-sidebar/details-sidebar-header';\nimport {DetailsSidebarProperties} from '@app/drive/details-sidebar/details-sidebar-properties';\n\ninterface DetailsSidebarProps {\n className?: string;\n}\nexport function DetailsSidebar({className}: DetailsSidebarProps) {\n const selectedEntry = useSelectedEntry();\n return (\n \n {selectedEntry ? (\n \n ) : (\n \n )}\n \n );\n}\n\nfunction NothingSelected() {\n return (\n \n }\n />\n }\n description={\n \n }\n />\n \n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {FileEntry} from '@common/uploads/file-entry';\nimport {apiClient} from '@common/http/query-client';\nimport {invalidateEntryQueries} from '../../drive-query-keys';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\n\ninterface Response extends BackendResponse {\n fileEntry: FileEntry;\n}\n\ninterface Payload {\n entryId: number;\n name: string;\n initialName: string;\n}\n\nexport function useRenameEntry(form: UseFormReturn) {\n return useMutation({\n mutationFn: (payload: Payload) => renameEntry(payload),\n onSuccess: (r, p) => {\n invalidateEntryQueries();\n toast(\n message(':oldName renamed to :newName', {\n values: {oldName: p.initialName, newName: r.fileEntry.name},\n }),\n );\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction renameEntry({entryId, ...payload}: Payload): Promise {\n return apiClient\n .put(`file-entries/${entryId}`, payload)\n .then(response => response.data);\n}\n","import React from 'react';\nimport {useForm} from 'react-hook-form';\nimport {useRenameEntry} from '../queries/use-rename-entry';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Button} from '@common/ui/buttons/button';\nimport {Form} from '@common/ui/forms/form';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {Trans} from '@common/i18n/trans';\nimport {DriveEntry} from '../drive-entry';\n\ninterface FormValue {\n name?: string;\n}\n\ninterface RenameEntryDialogProps {\n entries: DriveEntry[];\n}\nexport function RenameEntryDialog({entries}: RenameEntryDialogProps) {\n const {close, formId} = useDialogContext();\n const initialName = entries[0]?.name;\n const form = useForm({defaultValues: {name: initialName}});\n const renameEntry = useRenameEntry(form);\n\n const onSubmit = (e: Required) => {\n renameEntry.mutate(\n {\n entryId: entries[0].id,\n name: e.name,\n initialName,\n },\n {onSuccess: close},\n );\n };\n\n return (\n \n \n \n \n \n
\n \n \n
\n \n \n \n \n \n \n
\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {apiClient} from '@common/http/query-client';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {DriveFolder} from '../drive-entry';\nimport {invalidateEntryQueries} from '../../drive-query-keys';\n\ninterface Response extends BackendResponse {\n folder: DriveFolder;\n}\n\ninterface CreateFolderProps {\n name: string;\n parentId?: number | null;\n}\n\nfunction createFolder({name, parentId}: CreateFolderProps): Promise {\n return apiClient\n .post('folders', {\n name,\n parentId: parentId === 0 ? null : parentId,\n })\n .then(response => response.data);\n}\n\nexport function useCreateFolder(form: UseFormReturn) {\n return useMutation({\n mutationFn: ({name, parentId}: CreateFolderProps) => {\n return createFolder({name, parentId});\n },\n onSuccess: () => invalidateEntryQueries(),\n onError: r => onFormQueryError(r, form),\n });\n}\n","import React from 'react';\nimport {useForm} from 'react-hook-form';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Button} from '@common/ui/buttons/button';\nimport {toast} from '@common/ui/toast/toast';\nimport {Form} from '@common/ui/forms/form';\nimport {useCreateFolder} from '../queries/create-folder';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {Trans} from '@common/i18n/trans';\nimport {message} from '@common/i18n/message';\nimport {useTrans} from '@common/i18n/use-trans';\n\ninterface FormValue {\n name?: string;\n}\n\ninterface NewFolderDialogProps {\n parentId: number;\n}\nexport function NewFolderDialog({parentId}: NewFolderDialogProps) {\n const {close, formId} = useDialogContext();\n const {trans} = useTrans();\n const form = useForm({\n defaultValues: {\n name: trans({message: 'Untitled Folder'}),\n },\n });\n const createFolder = useCreateFolder(form);\n\n const onSubmit = (value: Required) => {\n createFolder.mutate(\n {...value, parentId},\n {\n onSuccess: response => {\n close(response.folder);\n toast(message('Folder created'));\n },\n },\n );\n };\n\n return (\n \n \n \n \n \n
\n \n \n
\n \n \n \n \n \n \n
\n );\n}\n","import {FilePreviewDialog} from '@common/uploads/preview/file-preview-dialog';\nimport {DriveEntry} from '../drive-entry';\nimport {createElement, Fragment, useState} from 'react';\nimport {useShareAction} from '../../entry-actions/use-entry-actions';\nimport {Button} from '@common/ui/buttons/button';\nimport {Trans} from '@common/i18n/trans';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {useEntries} from '../queries/use-entries';\n\ninterface EntryPreviewDialogProps {\n selectedEntry: DriveEntry;\n}\nexport function EntryPreviewDialog({selectedEntry}: EntryPreviewDialogProps) {\n const files = useEntries().filter(entry => entry.type !== 'folder');\n const defaultActiveIndex = files.findIndex(\n file => file.id === selectedEntry?.id\n );\n const [activeIndex, setActiveIndex] = useState(defaultActiveIndex);\n return (\n \n }\n activeIndex={activeIndex}\n onActiveIndexChange={setActiveIndex}\n entries={files}\n />\n );\n}\n\ninterface DriveActionsProps {\n activeIndex: number;\n entries: DriveEntry[];\n}\nfunction DriveActions({activeIndex, entries}: DriveActionsProps) {\n const selectedEntry = entries[activeIndex];\n const share = useShareAction([selectedEntry]);\n if (!selectedEntry || !share) return null;\n\n return (\n \n {\n share.execute();\n }}\n >\n {createElement(share.icon)}\n \n {\n share.execute();\n }}\n >\n \n \n \n );\n}\n","import axios from 'axios';\nimport {useMutation} from '@tanstack/react-query';\nimport {DriveEntryPermissions} from '../../files/drive-entry';\nimport {apiClient} from '@common/http/query-client';\nimport {toast} from '@common/ui/toast/toast';\nimport {invalidateEntryQueries} from '../../drive-query-keys';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {BackendErrorResponse} from '@common/errors/backend-error-response';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\nexport interface ShareEntryPayload {\n emails: string[];\n permissions: DriveEntryPermissions;\n entryId: number;\n}\n\nfunction shareEntry({\n entryId,\n ...payload\n}: ShareEntryPayload): Promise {\n return apiClient\n .post(`file-entries/${entryId}/share`, payload)\n .then(response => response.data);\n}\n\nexport function useShareEntry() {\n return useMutation({\n mutationFn: (payload: ShareEntryPayload) => shareEntry(payload),\n onSuccess: () => {\n invalidateEntryQueries();\n },\n onError: err => {\n if (axios.isAxiosError(err) && err.response) {\n const response = err.response.data as BackendErrorResponse;\n if (response.errors?.emails) {\n toast.danger(response.errors?.emails[0]);\n } else {\n showHttpErrorToast(err);\n }\n }\n },\n });\n}\n","import {FileEntry} from '@common/uploads/file-entry';\n\nexport interface DriveEntry extends FileEntry {\n users: DriveEntryUser[];\n workspace_id?: number;\n permissions: {\n 'files.create': boolean;\n 'files.update': boolean;\n 'files.delete': boolean;\n 'files.download': boolean;\n };\n}\n\nexport interface DriveFolder extends DriveEntry {\n type: 'folder';\n model_type?: string;\n}\n\nexport interface DriveEntryUser {\n id: number;\n email: string;\n display_name: string;\n avatar?: string;\n owns_entry: boolean;\n entry_permissions: DriveEntryPermissions;\n}\n\nexport interface DriveEntryPermissions {\n edit?: boolean;\n view?: boolean;\n download?: boolean;\n}\n\nexport const DRIVE_ENTRY_FULL_PERMISSIONS = {\n edit: true,\n view: true,\n download: true,\n};\n","import {Button} from '@common/ui/buttons/button';\nimport {ArrowDropDownIcon} from '@common/icons/material/ArrowDropDown';\nimport {\n DRIVE_ENTRY_FULL_PERMISSIONS,\n DriveEntryPermissions,\n DriveEntryUser,\n} from '../files/drive-entry';\nimport {\n Menu,\n MenuItem,\n MenuTrigger,\n} from '@common/ui/navigation/menu/menu-trigger';\nimport {message} from '@common/i18n/message';\nimport {Trans} from '@common/i18n/trans';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\nexport interface PermissionSelectorItem {\n key: keyof DriveEntryPermissions;\n value: DriveEntryPermissions;\n label: MessageDescriptor;\n}\n\nexport const PermissionSelectorItems: PermissionSelectorItem[] = [\n {\n key: 'view',\n value: {view: true},\n label: message('Can view'),\n },\n {\n key: 'download',\n value: {view: true, download: true},\n label: message('Can Download'),\n },\n {\n key: 'edit',\n value: DRIVE_ENTRY_FULL_PERMISSIONS,\n label: message('Can edit'),\n },\n];\n\ninterface Props {\n onChange: (value: PermissionSelectorItem) => void;\n value: PermissionSelectorItem;\n}\nexport function PermissionSelector({value, onChange}: Props) {\n return (\n {\n if (key !== value.key) {\n onChange(PermissionSelectorItems.find(p => p.key === key)!);\n }\n }}\n >\n }\n >\n \n \n \n {PermissionSelectorItems.map(item => {\n return (\n \n \n \n );\n })}\n \n \n );\n}\n\nexport function getPermissionItemForUser(\n user: DriveEntryUser\n): PermissionSelectorItem {\n const {download, edit} = user.entry_permissions;\n if (edit) {\n return PermissionSelectorItems.find(item => item.key === 'edit')!;\n }\n if (download) {\n return PermissionSelectorItems.find(item => item.key === 'download')!;\n }\n return PermissionSelectorItems.find(item => item.key === 'view')!;\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {DriveEntryPermissions} from '../../files/drive-entry';\nimport {apiClient} from '@common/http/query-client';\nimport {toast} from '@common/ui/toast/toast';\nimport {invalidateEntryQueries} from '../../drive-query-keys';\nimport {message} from '@common/i18n/message';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\nexport interface ChangePermissionsPayload {\n userId: number;\n permissions: DriveEntryPermissions;\n entryId: number;\n}\n\nexport function useChangePermission() {\n return useMutation({\n mutationFn: (payload: ChangePermissionsPayload) =>\n changePermission(payload),\n onSuccess: () => {\n invalidateEntryQueries();\n toast(message('Updated user permissions'));\n },\n onError: err =>\n showHttpErrorToast(err, message('Could not update permissions')),\n });\n}\n\nfunction changePermission({\n entryId,\n ...payload\n}: ChangePermissionsPayload): Promise {\n return apiClient\n .put(`file-entries/${entryId}/change-permissions`, payload)\n .then(response => response.data);\n}\n","import {Avatar, AvatarProps} from '@common/ui/images/avatar';\nimport {User} from '@common/auth/user';\nimport {useContext} from 'react';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\n\ninterface UserAvatarProps extends Omit {\n user?: User;\n}\nexport function UserAvatar({user, ...props}: UserAvatarProps) {\n const {auth} = useContext(SiteConfigContext);\n return (\n \n );\n}\n","import {useState} from 'react';\nimport {AnimatePresence, m} from 'framer-motion';\nimport clsx from 'clsx';\nimport {DriveEntry, DriveEntryUser} from '../files/drive-entry';\nimport {\n getPermissionItemForUser,\n PermissionSelector,\n PermissionSelectorItem,\n} from './permission-selector';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {useChangePermission} from './queries/use-change-permission';\nimport {useUnshareEntries} from './queries/use-unshare-entries';\nimport {Trans} from '@common/i18n/trans';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {UserAvatar} from '@common/ui/images/user-avatar';\n\ninterface MemberListProps {\n className?: string;\n entry: DriveEntry;\n}\n\nexport function MemberList({className, entry}: MemberListProps) {\n if (!entry) return null;\n\n const users = entry.users;\n\n return (\n
\n
\n \n
\n \n {users.map(user => {\n return ;\n })}\n \n
\n );\n}\n\ninterface MemberListItemProps {\n user: DriveEntryUser;\n entry: DriveEntry;\n}\nfunction MemberListItem({user, entry}: MemberListItemProps) {\n return (\n \n \n
\n
{user.display_name}
\n
{user.email}
\n
\n
\n {user.owns_entry ? (\n \n \n \n ) : (\n \n )}\n
\n \n );\n}\n\ninterface ActionButtonsProps {\n user: DriveEntryUser;\n entry: DriveEntry;\n}\nfunction ActionButtons({user, entry}: ActionButtonsProps) {\n const changePermissions = useChangePermission();\n const unshareEntry = useUnshareEntries();\n const [activePermission, setActivePermission] =\n useState(() => {\n return getPermissionItemForUser(user);\n });\n\n return (\n
\n {\n changePermissions.mutate({\n userId: user.id,\n permissions: item.value,\n entryId: entry.id,\n });\n setActivePermission(item);\n }}\n value={activePermission}\n />\n {\n unshareEntry.mutate(\n {userId: user.id, entryIds: [entry.id]},\n {\n onSuccess: () => {\n toast(message('Member removed'));\n },\n onError: err =>\n showHttpErrorToast(err, message('Could not remove member')),\n }\n );\n }}\n >\n \n \n
\n );\n}\n","import {useState} from 'react';\nimport {Button} from '@common/ui/buttons/button';\nimport {useShareEntry} from './queries/use-share-entry';\nimport {\n PermissionSelector,\n PermissionSelectorItem,\n PermissionSelectorItems,\n} from './permission-selector';\nimport {MemberList} from './member-list';\nimport {\n ChipField,\n ChipValue,\n} from '@common/ui/forms/input-field/chip-field/chip-field';\nimport {Avatar} from '@common/ui/images/avatar';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {Trans} from '@common/i18n/trans';\nimport {DriveEntry} from '../files/drive-entry';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {isEmail} from '@common/utils/string/is-email';\nimport {useNormalizedModels} from '@common/users/queries/use-normalized-models';\nimport {useSettings} from '@common/core/settings/use-settings';\n\ninterface SharePanelProps {\n className?: string;\n entry: DriveEntry;\n}\nexport function SharePanel({className, entry}: SharePanelProps) {\n const {trans} = useTrans();\n const {share} = useSettings();\n const shareEntry = useShareEntry();\n const [chips, setChips] = useState([]);\n const [isSharing, setIsSharing] = useState(false);\n const [selectedPermission, setSelectedPermission] =\n useState(PermissionSelectorItems[0]);\n const allEmailsValid = chips.every(chip => !chip.invalid);\n const [inputValue, setInputValue] = useState('');\n const query = useNormalizedModels(\n 'normalized-models/user',\n {perPage: 7, query: inputValue},\n {enabled: share.suggest_emails},\n );\n\n // show user's email, instead of name in the chip\n const displayWith = (chip: ChipValue) => chip.description || chip.name;\n\n return (\n
\n {\n const invalid = !isEmail(chip.description);\n return {\n ...chip,\n invalid,\n errorMessage: invalid\n ? trans({message: 'Not a valid email'})\n : undefined,\n };\n }}\n placeholder={trans({message: 'Enter email addresses'})}\n label={}\n >\n {user => (\n }\n description={user.description}\n >\n {user.name}\n \n )}\n \n
\n \n {chips.length ? (\n {\n setIsSharing(true);\n shareEntry.mutate(\n {\n emails: chips.map(c => displayWith(c)),\n permissions: selectedPermission.value,\n entryId: entry.id,\n },\n {\n onSuccess: () => {\n setChips([]);\n },\n onSettled: () => {\n setIsSharing(false);\n },\n },\n );\n }}\n >\n \n \n ) : null}\n
\n \n
\n );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {ShareableLink} from '../shareable-link';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {DriveQueryKeys} from '../../drive-query-keys';\nimport {apiClient} from '@common/http/query-client';\n\nexport interface FetchShareableLinkResponse extends BackendResponse {\n link: ShareableLink | null;\n}\n\nexport function useEntryShareableLink(entryId: number) {\n return useQuery({\n queryKey: DriveQueryKeys.fetchEntryShareableLink(entryId!),\n queryFn: () => fetchLinkByEntryId(entryId!),\n enabled: !!entryId,\n });\n}\n\nfunction fetchLinkByEntryId(\n entryId: number,\n): Promise {\n return apiClient\n .get(`file-entries/${entryId}/shareable-link`, {\n params: {loader: 'shareableLink'},\n })\n .then(response => response.data);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {FetchShareableLinkResponse} from './use-entry-shareable-link';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {DriveQueryKeys} from '../../drive-query-keys';\nimport {message} from '@common/i18n/message';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface DeleteLinkParams {\n entryId: number;\n}\n\nfunction deleteShareableLink({\n entryId,\n}: DeleteLinkParams): Promise {\n return apiClient\n .delete(`file-entries/${entryId}/shareable-link`)\n .then(r => r.data);\n}\n\ninterface Payload {\n entryId: number;\n}\nexport function useDeleteShareableLink() {\n return useMutation({\n mutationFn: ({entryId}: Payload) => deleteShareableLink({entryId}),\n onSuccess: (response, {entryId}) => {\n queryClient.setQueryData(\n DriveQueryKeys.fetchEntryShareableLink(entryId),\n {...response, link: null},\n );\n },\n onError: err => showHttpErrorToast(err, message('Could not delete link')),\n });\n}\n","export function randomString(length: number = 36) {\n let random = '';\n const possible =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n\n for (let i = 0; i < length; i += 1) {\n random += possible.charAt(Math.floor(Math.random() * possible.length));\n }\n\n return random;\n}\n","import useClipboard from 'react-use-clipboard';\nimport {useEntryShareableLink} from '../../shareable-link/queries/use-entry-shareable-link';\nimport {useCreateShareableLink} from '../../shareable-link/queries/create-shareable-link';\nimport {useDeleteShareableLink} from '../../shareable-link/queries/use-delete-shareable-link';\nimport {Button} from '@common/ui/buttons/button';\nimport {ShareableLink} from '../../shareable-link/shareable-link';\nimport {TextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport type {ShareDialogActivePanel} from '../share-dialog';\nimport {Switch} from '@common/ui/forms/toggle/switch';\nimport {randomString} from '@common/utils/string/random-string';\nimport {Trans} from '@common/i18n/trans';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {useActiveDialogEntry} from '../../drive-store';\nimport {DriveEntry} from '../../files/drive-entry';\nimport {useSettings} from '@common/core/settings/use-settings';\n\ninterface ShareableLinkPanelProps {\n setActivePanel: (name: ShareDialogActivePanel) => void;\n entry: DriveEntry;\n focusInput?: boolean;\n}\nexport function ShareableLinkPanel({\n setActivePanel,\n entry,\n focusInput,\n}: ShareableLinkPanelProps) {\n const query = useEntryShareableLink(entry.id);\n const linkExists = !!query.data?.link;\n const createLink = useCreateShareableLink();\n const deleteLink = useDeleteShareableLink();\n const isLoading =\n query.isLoading || createLink.isPending || deleteLink.isPending;\n return (\n
\n
\n \n
\n
\n {\n if (linkExists) {\n deleteLink.mutate({entryId: entry.id});\n } else {\n createLink.mutate({entryId: entry.id});\n }\n }}\n >\n {linkExists ? (\n \n ) : (\n \n )}\n \n {linkExists && (\n {\n setActivePanel('linkSettings');\n }}\n >\n \n \n )}\n
\n \n
\n );\n}\n\ninterface ShareableLinkInputProps {\n link?: ShareableLink | null;\n autoFocus?: boolean;\n}\nfunction ShareableLinkInput({link, autoFocus}: ShareableLinkInputProps) {\n const {base_url} = useSettings();\n const {trans} = useTrans();\n const entry = useActiveDialogEntry();\n const hash = link?.hash || entry?.hash || randomString();\n const linkUrl = `${base_url}/drive/s/${hash}`;\n const [isCopied, setCopied] = useClipboard(linkUrl, {\n successDuration: 1000,\n });\n return (\n {\n (e.target as HTMLInputElement).select();\n }}\n endAppend={\n \n {isCopied ? : }\n \n }\n />\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {FetchShareableLinkResponse} from './use-entry-shareable-link';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {DriveQueryKeys} from '../../drive-query-keys';\n\nexport interface UpdateShareableLinkPayload {\n allowEdit: boolean;\n allowDownload: boolean;\n expiresAt: string;\n password: string;\n entryId: number;\n}\n\nfunction updateShareableLink({\n entryId,\n ...payload\n}: UpdateShareableLinkPayload): Promise {\n return apiClient\n .put(`file-entries/${entryId}/shareable-link`, payload)\n .then(response => response.data);\n}\n\nexport function useUpdateShareableLink(\n form: UseFormReturn,\n) {\n return useMutation({\n mutationFn: (payload: UpdateShareableLinkPayload) =>\n updateShareableLink(payload),\n onSuccess: (data, {entryId}) => {\n queryClient.setQueryData(\n DriveQueryKeys.fetchEntryShareableLink(entryId),\n data,\n );\n },\n onError: r => onFormQueryError(r, form),\n });\n}\n","import {useForm} from 'react-hook-form';\nimport {Fragment, ReactElement, useState} from 'react';\nimport clsx from 'clsx';\nimport {m} from 'framer-motion';\nimport {getLocalTimeZone, now} from '@internationalized/date';\nimport {Button} from '@common/ui/buttons/button';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport type {ShareDialogActivePanel} from '../share-dialog';\nimport {useEntryShareableLink} from '../../shareable-link/queries/use-entry-shareable-link';\nimport {Form} from '@common/ui/forms/form';\nimport {\n UpdateShareableLinkPayload,\n useUpdateShareableLink,\n} from '../../shareable-link/queries/use-update-shareable-link';\nimport {FormSwitch, Switch} from '@common/ui/forms/toggle/switch';\nimport {toast} from '@common/ui/toast/toast';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {FormDatePicker} from '@common/ui/forms/input-field/date/date-picker/date-picker';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {Trans} from '@common/i18n/trans';\nimport {message} from '@common/i18n/message';\nimport {FileEntry} from '@common/uploads/file-entry';\n\ninterface LinkSettingsDialogProps {\n className?: string;\n setActivePanel: (name: ShareDialogActivePanel) => void;\n entry: FileEntry;\n}\nexport function LinkSettingsDialog({\n className,\n setActivePanel,\n entry,\n}: LinkSettingsDialogProps) {\n const {formId} = useDialogContext();\n const {data} = useEntryShareableLink(entry.id);\n const link = data?.link;\n const form = useForm({\n defaultValues: {\n allowDownload: link?.allow_download,\n allowEdit: link?.allow_edit,\n expiresAt: link?.expires_at,\n entryId: entry.id,\n },\n });\n const updateLink = useUpdateShareableLink(form);\n\n return (\n \n {\n setActivePanel('main');\n }}\n >\n \n \n \n \n {\n updateLink.mutate(value, {\n onSuccess: () => {\n setActivePanel('main');\n toast(message('Link settings saved'));\n },\n });\n }}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {\n setActivePanel('main');\n }}\n >\n \n \n \n \n \n \n \n );\n}\n\nconst minDate = now(getLocalTimeZone());\n\ninterface LinkExpirationOptionProps {\n showField: boolean;\n}\nfunction LinkExpirationOption({\n showField: showFieldDefault,\n}: LinkExpirationOptionProps) {\n const {trans} = useTrans();\n const [showField, setShowField] = useState(showFieldDefault);\n return (\n \n \n
\n {\n setShowField(e.target.checked);\n }}\n >\n \n \n {showField && (\n \n )}\n
\n
\n );\n}\n\ninterface LinkPasswordOptionProps {\n showField: boolean;\n}\nfunction LinkPasswordOption({\n showField: showFieldDefault,\n}: LinkPasswordOptionProps) {\n const {trans} = useTrans();\n const [showField, setShowField] = useState(showFieldDefault);\n return (\n \n \n
\n {\n setShowField(e.target.checked);\n }}\n >\n \n \n {showField && (\n \n }\n placeholder={trans({\n message: 'Enter new password...',\n })}\n />\n )}\n
\n
\n );\n}\n\ninterface LinkOptionProps {\n children: [ReactElement, ReactElement];\n showBorder?: boolean;\n}\nfunction LinkOption({children, showBorder = true}: LinkOptionProps) {\n const [title, content] = children;\n return (\n
\n
{title}
\n {content}\n
\n );\n}\n","import {Fragment, useState} from 'react';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {SharePanel} from './share-panel';\nimport {ShareableLinkPanel} from './link-panel/shareable-link-panel';\nimport {LinkSettingsDialog} from './link-panel/link-settings-dialog';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {Trans} from '@common/i18n/trans';\nimport {DriveEntry} from '../files/drive-entry';\nimport {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {DriveQueryKeys} from '../drive-query-keys';\n\nexport type ShareDialogActivePanel = 'main' | 'linkSettings';\n\ninterface ShareDialogProps {\n entry: DriveEntry;\n focusLinkInput?: boolean;\n}\nexport function ShareDialog({\n entry: initialEntry,\n focusLinkInput,\n}: ShareDialogProps) {\n const {\n data: {fileEntry},\n } = useQuery({\n queryKey: DriveQueryKeys.fetchFileEntry(initialEntry.id),\n queryFn: () =>\n apiClient\n .get(`drive/file-entries/${initialEntry.id}/model`)\n .then(response => response.data as {fileEntry: DriveEntry}),\n initialData: {fileEntry: initialEntry},\n });\n\n const [activePanel, setActivePanel] =\n useState('main');\n\n return (\n \n \n {activePanel === 'linkSettings' ? (\n \n ) : (\n \n )}\n \n \n );\n}\n\ninterface MainDialogProps {\n setActivePanel: (name: ShareDialogActivePanel) => void;\n entry: DriveEntry;\n focusLinkInput?: boolean;\n}\nfunction MainDialog({setActivePanel, entry, focusLinkInput}: MainDialogProps) {\n return (\n \n \n \n \n \n \n \n \n \n \n \n );\n}\n","import React from 'react';\nimport {SearchIcon} from '@common/icons/material/Search';\nimport {ComboBox} from '@common/ui/forms/combobox/combobox';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {PartialFolder} from '../../utils/can-move-entries-into';\n\ninterface SearchComboBoxProps {\n allFolders: PartialFolder[];\n onFolderSelected: (folder: PartialFolder) => void;\n}\nexport function MoveEntriesDialogSearch({\n allFolders,\n onFolderSelected,\n}: SearchComboBoxProps) {\n const {trans} = useTrans();\n const searchLabel = trans({message: 'Search folders'});\n return (\n }\n items={allFolders}\n clearInputOnItemSelection\n onItemSelected={value => {\n const folderId = parseInt(value as string);\n const folder = allFolders.find(f => f.id === folderId);\n if (folder) {\n onFolderSelected(folder);\n }\n }}\n >\n {item => (\n \n {item.name}\n \n )}\n \n );\n}\n","import React from 'react';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {ArrowBackIcon} from '@common/icons/material/ArrowBack';\nimport {Breadcrumb} from '@common/ui/breadcrumbs/breadcrumb';\nimport {FolderIcon} from '@common/icons/material/Folder';\nimport {BreadcrumbItem} from '@common/ui/breadcrumbs/breadcrumb-item';\nimport {PartialFolder} from '../../utils/can-move-entries-into';\n\ninterface FolderBreadCrumbsProps {\n selectedFolder: PartialFolder;\n allFolders: PartialFolder[];\n rootFolder: PartialFolder;\n onFolderSelected: (folder: PartialFolder) => void;\n}\nexport function MoveEntriesDialogBreadcrumbs({\n selectedFolder,\n allFolders,\n rootFolder,\n onFolderSelected,\n}: FolderBreadCrumbsProps) {\n const path: PartialFolder[] = selectedFolder.path\n .split('/')\n .map(part => {\n const folderId = parseInt(part);\n return allFolders.find(folder => folderId === folder.id);\n })\n .filter(f => !!f) as PartialFolder[];\n const fullPath: PartialFolder[] = [rootFolder, ...path];\n\n const previous = path[path.length - 2];\n\n return (\n
\n {\n onFolderSelected(previous || rootFolder);\n }}\n >\n \n \n \n {fullPath.map(item => {\n return (\n {\n onFolderSelected(item);\n }}\n key={item.id || 'root'}\n className=\"flex items-center gap-8\"\n >\n {!item.id && }\n {item.name}\n \n );\n })}\n \n
\n );\n}\n","export default \"__VITE_ASSET__b64d6dd2__\"","import React, {useMemo} from 'react';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport {FileTypeIcon} from '@common/uploads/file-type-icon/file-type-icon';\nimport {ChevronRightIcon} from '@common/icons/material/ChevronRight';\nimport {Trans} from '@common/i18n/trans';\nimport {List, ListItem} from '@common/ui/list/list';\nimport myFilesSvg from './my-files.svg';\nimport {PartialFolder} from '../../utils/can-move-entries-into';\n\ninterface FolderListProps {\n selectedFolder: PartialFolder;\n allFolders: PartialFolder[];\n onFolderSelected: (folder: PartialFolder) => void;\n}\n\nexport function MoveEntriesDialogFolderList(props: FolderListProps) {\n const {onFolderSelected, selectedFolder, allFolders} = props;\n\n const subFolders = useMemo(() => {\n const parentId = selectedFolder.id || null;\n return allFolders.filter(f => f.parent_id === parentId);\n }, [selectedFolder.id, allFolders]);\n\n if (!subFolders.length) {\n return (\n }\n title={\n \n }\n />\n );\n }\n\n return (\n \n {subFolders.map(folder => {\n return (\n {\n onFolderSelected(folder);\n }}\n startIcon={}\n endIcon={}\n >\n {folder.name}\n \n );\n })}\n \n );\n}\n","import React, {useState} from 'react';\nimport {Button} from '@common/ui/buttons/button';\nimport {useFolders} from '../../queries/use-folders';\nimport {useMoveEntries} from '../../queries/use-move-entries';\nimport {NewFolderDialog} from '../new-folder-dialog';\nimport {CreateNewFolderIcon} from '@common/icons/material/CreateNewFolder';\nimport {MoveEntriesDialogSearch} from './move-entries-dialog-search';\nimport {MoveEntriesDialogBreadcrumbs} from './move-entries-dialog-breadcrumbs';\nimport {MoveEntriesDialogFolderList} from './move-entries-dialog-folder-list';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {Trans} from '@common/i18n/trans';\nimport {RootFolderPage} from '../../../drive-page/drive-page';\nimport {DriveEntry} from '../../drive-entry';\nimport {useDriveStore} from '../../../drive-store';\nimport {\n canMoveEntriesInto,\n PartialFolder,\n} from '../../utils/can-move-entries-into';\n\ninterface MoveEntriesDialogProps {\n entries: DriveEntry[];\n}\nexport function MoveEntriesDialog({entries}: MoveEntriesDialogProps) {\n const {data} = useFolders();\n const allFolders = data?.folders || [];\n const activePage = useDriveStore(s => s.activePage);\n const [selectedFolder, setSelectedFolder] = useState(\n activePage?.folder || RootFolderPage.folder,\n );\n\n return (\n \n \n \n \n \n
\n \n
\n \n
\n \n \n
\n
\n \n
\n );\n}\n\ninterface FooterProps {\n selectedFolder: PartialFolder;\n setSelectedFolder: (folder: PartialFolder) => void;\n entries: DriveEntry[];\n}\nfunction Footer({selectedFolder, setSelectedFolder, entries}: FooterProps) {\n const {close} = useDialogContext();\n const moveEntries = useMoveEntries();\n return (\n {\n if (folder) {\n setSelectedFolder(folder);\n }\n }}\n >\n \n \n \n }\n >\n \n {\n moveEntries.mutate(\n {\n destinationId: selectedFolder.id,\n entryIds: entries.map(e => e.id),\n },\n {onSuccess: close},\n );\n }}\n >\n \n \n \n );\n}\n","import {DriveEntry} from '../drive-entry';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport {Trans} from '@common/i18n/trans';\nimport {useDeleteEntries} from '../queries/use-delete-entries';\nimport {driveState} from '../../drive-store';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\n\ninterface DeleteEntriesForeverDialogProps {\n entries: DriveEntry[];\n}\nexport function DeleteEntriesForeverDialog({\n entries,\n}: DeleteEntriesForeverDialogProps) {\n const deleteEntries = useDeleteEntries();\n const {close} = useDialogContext();\n\n const message =\n entries.length === 1 ? (\n \n ) : (\n \n );\n\n return (\n }\n body={message}\n confirm={}\n isLoading={deleteEntries.isPending}\n onConfirm={() => {\n deleteEntries.mutate(\n {\n entryIds: entries.map(e => e.id),\n deleteForever: true,\n },\n {\n onSuccess: () => {\n close();\n driveState().selectEntries([]);\n },\n },\n );\n }}\n />\n );\n}\n","import {DriveEntry} from '../drive-entry';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport {Trans} from '@common/i18n/trans';\nimport {driveState} from '../../drive-store';\nimport {useRestoreEntries} from '../queries/use-restore-entries';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\n\ninterface DeleteEntriesForeverDialogProps {\n entries: DriveEntry[];\n}\nexport function BlockTrashFolderViewDialog({\n entries,\n}: DeleteEntriesForeverDialogProps) {\n const restoreEntries = useRestoreEntries();\n const {close} = useDialogContext();\n\n return (\n }\n body={}\n confirm={}\n isLoading={restoreEntries.isPending}\n onConfirm={() => {\n restoreEntries.mutate(\n {\n entryIds: entries.map(e => e.id),\n },\n {\n onSuccess: () => {\n close();\n driveState().selectEntries([]);\n },\n },\n );\n }}\n />\n );\n}\n","import React, {ReactElement} from 'react';\nimport {ActiveActionDialog, driveState, useDriveStore} from '../../drive-store';\nimport {RenameEntryDialog} from './rename-entry-dialog';\nimport {NewFolderDialog} from './new-folder-dialog';\nimport {EntryPreviewDialog} from './entry-preview-dialog';\nimport {ShareDialog} from '../../share-dialog/share-dialog';\nimport {MoveEntriesDialog} from './move-entries-dialog/move-entries-dialog';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {DeleteEntriesForeverDialog} from './delete-entries-forever-dialog';\nimport {BlockTrashFolderViewDialog} from './block-trash-folder-view-dialog';\n\nexport function DriveDialogsContainer() {\n const activeDialog = useDriveStore(s => s.activeActionDialog);\n const dialog = getDialog(activeDialog);\n\n return (\n {\n driveState().setActiveActionDialog(null);\n }}\n >\n {dialog}\n \n );\n}\n\nfunction getDialog(dialog?: ActiveActionDialog | null): ReactElement | null {\n switch (dialog?.name) {\n case 'rename':\n return ;\n case 'newFolder':\n return ;\n case 'preview':\n return ;\n case 'share':\n return ;\n case 'getLink':\n return ;\n case 'moveTo':\n return ;\n case 'confirmAndDeleteForever':\n return ;\n case 'trashFolderBlock':\n return ;\n default:\n return null;\n }\n}\n","import React, {useState} from 'react';\nimport {SearchIcon} from '@common/icons/material/Search';\nimport {TextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {SearchPage} from '../drive-page/drive-page';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {useDriveStore} from '../drive-store';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {useSearchParams} from 'react-router-dom';\nimport {IconButton} from '@common/ui/buttons/icon-button';\n\nexport function NavbarSearch() {\n const {trans} = useTrans();\n const navigate = useNavigate();\n const activePage = useDriveStore(s => s.activePage);\n const [searchParams] = useSearchParams();\n const [inputValue, setInputValue] = useState(searchParams.get('query') || '');\n\n return (\n {\n e.preventDefault();\n navigate(\n {\n pathname: SearchPage.path,\n search: `?query=${inputValue}`,\n },\n {replace: true}\n );\n }}\n >\n setInputValue(e.target.value)}\n onFocus={() => {\n if (activePage !== SearchPage) {\n navigate(SearchPage.path);\n }\n }}\n startAdornment={\n \n \n \n }\n className=\"flex-auto max-w-620\"\n placeholder={trans({message: 'Search'})}\n aria-label={trans({message: 'Search files and folders'})}\n />\n \n );\n}\n","import {InteractableEvent} from '../interactable-event';\nimport {useEffect, useId, useRef} from 'react';\nimport {dragMonitors, DragSessionStatus} from './drag-state';\nimport {ConnectedDraggable} from './use-draggable';\n\nexport interface DragMonitor {\n type: string;\n onDragStart?: (e: InteractableEvent, dragTarget: ConnectedDraggable) => void;\n onDragMove?: (e: InteractableEvent, dragTarget: ConnectedDraggable) => void;\n onDragEnd?: (\n e: InteractableEvent,\n dragTarget: ConnectedDraggable,\n status: DragSessionStatus\n ) => void;\n}\n\nexport function useDragMonitor(monitor: DragMonitor) {\n const monitorRef = useRef(monitor);\n const id = useId();\n\n useEffect(() => {\n dragMonitors.set(id, monitorRef.current);\n return () => {\n dragMonitors.delete(id);\n };\n }, [id]);\n}\n","import {useDragMonitor} from '@common/ui/interactions/dnd/use-drag-monitor';\nimport React, {memo, useRef, useState} from 'react';\nimport {FileTypeIcon} from '@common/uploads/file-type-icon/file-type-icon';\nimport {FileEntry} from '@common/uploads/file-entry';\nimport {\n DragSessionStatus,\n droppables,\n} from '@common/ui/interactions/dnd/drag-state';\nimport {AnimatePresence, m} from 'framer-motion';\nimport clsx from 'clsx';\nimport {\n isFolderTreeDragId,\n makeFolderTreeDragId,\n} from '../layout/sidebar/folder-tree-drag-id';\nimport {InteractableEvent} from '@common/ui/interactions/interactable-event';\nimport {useDriveStore} from '../drive-store';\nimport {ConnectedDraggable} from '@common/ui/interactions/dnd/use-draggable';\n\ninterface Point {\n x: number;\n y: number;\n}\n\ninterface DragPreviewState {\n entries?: FileEntry[];\n e?: InteractableEvent;\n status?: DragSessionStatus;\n draggingTreeItem?: boolean;\n}\n\nexport function EntryDragPreview() {\n const ref = useRef(null);\n const [points, setPoints] = useState<{start?: Point; end?: Point}>();\n const [state, setState] = useState({});\n\n useDragMonitor({\n type: 'fileEntry',\n onDragStart: (e, dragTarget) => {\n const target = dragTarget as ConnectedDraggable;\n if (target) {\n setState({\n entries: target.getData(),\n e,\n draggingTreeItem: isFolderTreeDragId(target.id as number),\n });\n setPoints({start: e});\n }\n },\n onDragMove: e => {\n setState(prev => {\n return {...prev, e: e};\n });\n setPoints(prev => {\n return {...prev, end: e};\n });\n },\n onDragEnd: (e, dragTarget, status) => {\n setState({status});\n },\n });\n\n let preview = null;\n\n if (state.entries && state.e) {\n preview = (\n \n {state.entries.map((item, index) => (\n \n ))}\n \n );\n }\n\n return {preview};\n}\n\ninterface EntryPreviewProps {\n entry: FileEntry;\n index: number;\n points?: {start?: Point; end?: Point};\n state: DragPreviewState;\n}\nconst EntryPreview = memo(\n ({entry, points, index, state}: EntryPreviewProps) => {\n const viewMode = useDriveStore(s => s.viewMode);\n const droppableId = state.draggingTreeItem\n ? makeFolderTreeDragId(entry)\n : entry.id;\n const target = droppables.get(droppableId);\n if (!target?.rect || !points?.start) return null;\n const rect = target.rect;\n const itemCount = state.entries?.length || 0;\n\n const exitVariant = (status: DragSessionStatus) => {\n if (status === 'dropSuccess') {\n return {\n x: 0,\n y: 0,\n opacity: 0,\n transition: {duration: 0.1, delay: 0},\n };\n }\n return {\n x: rect.left - (points.end?.x || 0),\n y: rect.top - (points.end?.y || 0),\n width: `${state.e?.rect.width}px`,\n };\n };\n\n return (\n 0 && 'top-6 left-6'\n )}\n >\n {itemCount > 1 && index === 0 && }\n
\n \n
\n {entry.name}\n
\n
\n \n );\n }\n);\n\ninterface EntryCountProps {\n count: number;\n}\nconst EntryCount = memo(({count}: EntryCountProps) => {\n return (\n \n {count}\n \n );\n});\n","import {PageBreadcrumbs} from '../page-breadcrumbs';\nimport {DashboardContentHeader} from '@common/ui/layout/dashboard-content-header';\nimport React, {useContext} from 'react';\nimport {driveState, useDriveStore} from '../drive-store';\nimport {Trans} from '@common/i18n/trans';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {ViewListIcon} from '@common/icons/material/ViewList';\nimport {ViewModuleIcon} from '@common/icons/material/ViewModule';\nimport {DashboardLayoutContext} from '@common/ui/layout/dashboard-layout-context';\nimport {InfoIcon} from '@common/icons/material/Info';\nimport {DriveSortButton} from './sorting/drive-sort-button';\n\nexport function DriveContentHeader() {\n const {isMobileMode} = useContext(DashboardLayoutContext);\n const activePage = useDriveStore(s => s.activePage);\n return (\n \n {isMobileMode ? (\n \n ) : (\n \n )}\n
\n \n \n
\n
\n );\n}\n\nfunction ToggleViewModeButton() {\n const viewMode = useDriveStore(s => s.viewMode);\n const tooltip =\n viewMode === 'grid' ? (\n \n ) : (\n \n );\n return (\n \n {\n driveState().setViewMode(\n driveState().viewMode === 'list' ? 'grid' : 'list'\n );\n }}\n >\n {viewMode === 'list' ? : }\n \n \n );\n}\n\nfunction ToggleDetailsButton() {\n const {rightSidenavStatus: status, setRightSidenavStatus} = useContext(\n DashboardLayoutContext\n );\n const tooltip = status ? (\n \n ) : (\n \n );\n return (\n \n {\n setRightSidenavStatus(status === 'open' ? 'closed' : 'open');\n }}\n >\n \n \n \n );\n}\n","import React, {Fragment, useContext, useEffect, useMemo} from 'react';\nimport {Link, useLocation, useParams} from 'react-router-dom';\nimport {Sidebar} from './sidebar/sidebar';\nimport {FileView} from '../file-view/file-view';\nimport {UploadQueue} from '../uploading/upload-queue';\nimport {driveState, useDriveStore} from '../drive-store';\nimport {\n DRIVE_PAGES,\n makePartialFolderPage,\n SearchPage,\n} from '../drive-page/drive-page';\nimport {DetailsSidebar} from '../details-sidebar/details-sidebar';\nimport {DriveDialogsContainer} from '../files/dialogs/drive-dialogs-container';\nimport {NavbarSearch} from '../search/navbar-search';\nimport {useActiveWorkspaceId} from '@common/workspace/active-workspace-id-context';\nimport {FileEntryUrlsContext} from '@common/uploads/hooks/file-entry-urls';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {EntryDragPreview} from '../file-view/entry-drag-preview';\nimport {DashboardLayout} from '@common/ui/layout/dashboard-layout';\nimport {DashboardContent} from '@common/ui/layout/dashboard-content';\nimport {DashboardNavbar} from '@common/ui/layout/dashboard-navbar';\nimport {DriveContentHeader} from './drive-content-header';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {SearchIcon} from '@common/icons/material/Search';\nimport {DashboardLayoutContext} from '@common/ui/layout/dashboard-layout-context';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {Trans} from '@common/i18n/trans';\nimport {EntryActionList} from '../entry-actions/entry-action-list';\nimport {CreateNewButton} from './create-new-button';\nimport {StaticPageTitle} from '@common/seo/static-page-title';\nimport {DashboardSidenav} from '@common/ui/layout/dashboard-sidenav';\n\nexport function DriveLayout() {\n const {pathname} = useLocation();\n const {hash} = useParams();\n const {workspaceId} = useActiveWorkspaceId();\n const activePage = useDriveStore(s => s.activePage);\n\n useEffect(() => {\n driveState().setActivePage(\n DRIVE_PAGES.find(p => p.path === pathname) ||\n makePartialFolderPage(hash!),\n );\n }, [pathname, hash]);\n\n const urlsContextValue = useMemo(() => {\n return {workspaceId};\n }, [workspaceId]);\n\n useEffect(() => {\n return () => {\n driveState().reset();\n };\n }, []);\n\n return (\n \n {activePage?.label && (\n \n \n \n )}\n \n \n {\n e.preventDefault();\n e.stopPropagation();\n e.dataTransfer.dropEffect = 'none';\n }}\n onDrop={e => {\n // prevent files from desktop from blowing away the document\n e.preventDefault();\n }}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n}\n\nfunction Navbar() {\n const {isMobileMode} = useContext(DashboardLayoutContext);\n const activePage = useDriveStore(s => s.activePage);\n\n const children = isMobileMode ? null : ;\n const searchButton = (\n \n \n \n );\n\n const mobileRightChildren = (\n \n {activePage !== SearchPage && searchButton}\n \n \n );\n\n return (\n \n \n {children}\n \n {isMobileMode && }\n \n );\n}\n\nfunction FloatingActionList() {\n const entriesSelected = useDriveStore(s => s.selectedEntries.size);\n if (!entriesSelected) return null;\n return (\n
\n {\n driveState().selectEntries([]);\n }}\n >\n \n \n \n \n
\n );\n}\n","import {RouteObject, useRoutes} from 'react-router-dom';\nimport React from 'react';\nimport {ShareableLinkPage} from './shareable-link/shareable-link-page/shareable-link-page';\nimport {DriveLayout} from './layout/drive-layout';\nimport {AuthRoute} from '@common/auth/guards/auth-route';\nimport {NotFoundPage} from '@common/ui/not-found-page/not-found-page';\n\nconst DriveRouteConfig: RouteObject[] = [\n {\n path: '/',\n element: (\n \n \n \n ),\n },\n {\n path: '/folders/:hash',\n element: (\n \n \n \n ),\n },\n {\n path: '/shares',\n element: (\n \n \n \n ),\n },\n {\n path: '/recent',\n element: (\n \n \n \n ),\n },\n {\n path: '/starred',\n element: (\n \n \n \n ),\n },\n {\n path: '/trash',\n element: (\n \n \n \n ),\n },\n {\n path: '/search',\n element: (\n \n \n \n ),\n },\n {path: 's/:hash', element: },\n {path: '*', element: },\n];\n\nexport default function DriveRoutes() {\n return useRoutes(DriveRouteConfig);\n}\n"],"names":["_a","_b","importIntoOwnDrive","MenuItem","Navbar","Footer","restoreEntries","duplicateEntries","deleteEntries","unshareEntries","Fragment","MenuSection","createWorkspace","MemberListItem","removeMember","updateWorkspace","workspaceId","deleteWorkspace","MenuPositions","moveEntries","index","useNavigate","rootFolder","e","message","renameEntry","createFolder","shareEntry","ComboBox","_c"],"mappings":"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"}