2021-08-11 07:35:40 +00:00
|
|
|
import React, {
|
|
|
|
createContext,
|
|
|
|
useContext,
|
|
|
|
useEffect,
|
|
|
|
useRef,
|
|
|
|
useState,
|
|
|
|
} from 'react';
|
2021-05-30 16:56:48 +00:00
|
|
|
import { useRouter } from 'next/router';
|
|
|
|
import { clearKeys, getKey, SESSION_KEYS } from 'utils/storage/sessionStorage';
|
2021-04-25 15:16:58 +00:00
|
|
|
import {
|
2021-04-27 09:17:38 +00:00
|
|
|
File,
|
2021-04-25 15:16:58 +00:00
|
|
|
getLocalFiles,
|
2021-04-27 08:40:37 +00:00
|
|
|
syncFiles,
|
2021-09-21 10:38:03 +00:00
|
|
|
updateMagicMetadata,
|
2021-09-22 08:28:23 +00:00
|
|
|
VISIBILITY_STATE,
|
2021-09-28 07:09:59 +00:00
|
|
|
trashFiles,
|
2021-10-04 05:22:12 +00:00
|
|
|
deleteFromTrash,
|
2021-04-25 15:16:58 +00:00
|
|
|
} from 'services/fileService';
|
2020-09-20 15:18:35 +00:00
|
|
|
import styled from 'styled-components';
|
2021-02-08 17:15:13 +00:00
|
|
|
import LoadingBar from 'react-top-loading-bar';
|
2021-01-31 12:11:21 +00:00
|
|
|
import {
|
2021-04-23 07:12:56 +00:00
|
|
|
Collection,
|
2021-02-08 16:15:21 +00:00
|
|
|
syncCollections,
|
2021-02-09 06:04:19 +00:00
|
|
|
CollectionAndItsLatestFile,
|
2021-04-27 07:37:42 +00:00
|
|
|
getCollectionsAndTheirLatestFile,
|
2021-01-31 12:11:21 +00:00
|
|
|
getFavItemIds,
|
2021-02-08 17:15:13 +00:00
|
|
|
getLocalCollections,
|
2021-03-15 17:30:49 +00:00
|
|
|
getNonEmptyCollections,
|
2021-09-28 08:03:32 +00:00
|
|
|
createCollection,
|
|
|
|
CollectionType,
|
2021-01-31 12:11:21 +00:00
|
|
|
} from 'services/collectionService';
|
2021-01-24 20:59:58 +00:00
|
|
|
import constants from 'utils/strings/constants';
|
2021-04-23 05:59:09 +00:00
|
|
|
import billingService from 'services/billingService';
|
2021-05-30 16:56:48 +00:00
|
|
|
import { checkSubscriptionPurchase } from 'utils/billingUtil';
|
2020-09-20 15:18:35 +00:00
|
|
|
|
2021-03-18 20:16:18 +00:00
|
|
|
import FullScreenDropZone from 'components/FullScreenDropZone';
|
2021-03-22 10:20:15 +00:00
|
|
|
import Sidebar from 'components/Sidebar';
|
2021-05-30 16:56:48 +00:00
|
|
|
import { checkConnectivity } from 'utils/common';
|
2021-04-22 14:30:07 +00:00
|
|
|
import {
|
|
|
|
isFirstLogin,
|
|
|
|
justSignedUp,
|
|
|
|
setIsFirstLogin,
|
|
|
|
setJustSignedUp,
|
|
|
|
} from 'utils/storage';
|
2021-05-30 16:56:48 +00:00
|
|
|
import { isTokenValid, logoutUser } from 'services/userService';
|
|
|
|
import MessageDialog, { MessageAttributes } from 'components/MessageDialog';
|
|
|
|
import { useDropzone } from 'react-dropzone';
|
2021-04-19 09:44:51 +00:00
|
|
|
import EnteSpinner from 'components/EnteSpinner';
|
2021-05-30 16:56:48 +00:00
|
|
|
import { LoadingOverlay } from 'components/LoadingOverlay';
|
2021-05-29 06:27:52 +00:00
|
|
|
import PhotoFrame from 'components/PhotoFrame';
|
2021-09-21 10:38:03 +00:00
|
|
|
import {
|
2021-09-22 08:28:23 +00:00
|
|
|
changeFilesVisibility,
|
2021-09-28 07:09:59 +00:00
|
|
|
getSelectedFiles,
|
2021-10-29 12:40:02 +00:00
|
|
|
mergeMetadata,
|
2021-11-02 05:43:35 +00:00
|
|
|
sortFiles,
|
2021-09-21 10:38:03 +00:00
|
|
|
sortFilesIntoCollections,
|
|
|
|
} from 'utils/file';
|
2021-05-30 16:56:48 +00:00
|
|
|
import SearchBar, { DateValue } from 'components/SearchBar';
|
|
|
|
import { Bbox } from 'services/searchService';
|
2021-06-06 17:28:08 +00:00
|
|
|
import SelectedFileOptions from 'components/pages/gallery/SelectedFileOptions';
|
2021-04-27 05:50:03 +00:00
|
|
|
import CollectionSelector, {
|
|
|
|
CollectionSelectorAttributes,
|
2021-06-06 17:28:08 +00:00
|
|
|
} from 'components/pages/gallery/CollectionSelector';
|
2021-05-29 06:27:52 +00:00
|
|
|
import CollectionNamer, {
|
|
|
|
CollectionNamerAttributes,
|
2021-06-06 17:28:08 +00:00
|
|
|
} from 'components/pages/gallery/CollectionNamer';
|
|
|
|
import AlertBanner from 'components/pages/gallery/AlertBanner';
|
|
|
|
import UploadButton from 'components/pages/gallery/UploadButton';
|
|
|
|
import PlanSelector from 'components/pages/gallery/PlanSelector';
|
|
|
|
import Upload from 'components/pages/gallery/Upload';
|
2021-09-30 06:39:28 +00:00
|
|
|
import Collections, {
|
|
|
|
ALL_SECTION,
|
|
|
|
ARCHIVE_SECTION,
|
2021-10-04 13:30:23 +00:00
|
|
|
TRASH_SECTION,
|
2021-09-30 06:39:28 +00:00
|
|
|
} from 'components/pages/gallery/Collections';
|
2021-06-04 07:57:48 +00:00
|
|
|
import { AppContext } from 'pages/_app';
|
2021-08-06 07:38:09 +00:00
|
|
|
import { CustomError, ServerErrorCodes } from 'utils/common/errorUtil';
|
2021-08-31 04:58:58 +00:00
|
|
|
import { PAGES } from 'types';
|
2021-09-20 11:35:36 +00:00
|
|
|
import {
|
|
|
|
COLLECTION_OPS_TYPE,
|
2021-09-20 13:46:08 +00:00
|
|
|
isSharedCollection,
|
2021-09-28 08:03:32 +00:00
|
|
|
handleCollectionOps,
|
2021-09-28 08:14:45 +00:00
|
|
|
getSelectedCollection,
|
2021-09-30 07:55:49 +00:00
|
|
|
isFavoriteCollection,
|
2021-09-20 11:35:36 +00:00
|
|
|
} from 'utils/collection';
|
2021-09-20 12:51:40 +00:00
|
|
|
import { logError } from 'utils/sentry';
|
2021-10-01 06:45:14 +00:00
|
|
|
import {
|
2021-10-26 11:19:46 +00:00
|
|
|
clearLocalTrash,
|
2021-10-26 07:35:12 +00:00
|
|
|
emptyTrash,
|
2021-10-01 06:45:14 +00:00
|
|
|
getLocalTrash,
|
|
|
|
getTrashedFiles,
|
|
|
|
syncTrash,
|
2021-10-26 11:12:32 +00:00
|
|
|
Trash,
|
2021-10-01 06:45:14 +00:00
|
|
|
} from 'services/trashService';
|
2021-10-26 07:35:12 +00:00
|
|
|
import DeleteBtn from 'components/DeleteBtn';
|
2021-11-16 06:57:23 +00:00
|
|
|
import FixCreationTime, {
|
|
|
|
FixCreationTimeAttributes,
|
|
|
|
} from 'components/FixCreationTime';
|
2021-04-27 08:40:37 +00:00
|
|
|
|
2021-04-19 08:29:12 +00:00
|
|
|
export const DeadCenter = styled.div`
|
2021-01-24 20:22:12 +00:00
|
|
|
flex: 1;
|
|
|
|
display: flex;
|
|
|
|
justify-content: center;
|
|
|
|
align-items: center;
|
|
|
|
text-align: center;
|
|
|
|
flex-direction: column;
|
2020-11-28 18:11:24 +00:00
|
|
|
`;
|
2021-05-27 08:27:32 +00:00
|
|
|
const AlertContainer = styled.div`
|
|
|
|
background-color: #111;
|
|
|
|
padding: 5px 0;
|
|
|
|
font-size: 14px;
|
|
|
|
text-align: center;
|
|
|
|
`;
|
2020-11-28 18:11:24 +00:00
|
|
|
|
2021-09-20 11:16:48 +00:00
|
|
|
export type SelectedState = {
|
2021-03-21 06:54:40 +00:00
|
|
|
[k: number]: boolean;
|
2021-03-20 14:58:12 +00:00
|
|
|
count: number;
|
2021-09-20 11:16:48 +00:00
|
|
|
collectionID: number;
|
2021-03-21 06:54:40 +00:00
|
|
|
};
|
2021-05-18 14:20:38 +00:00
|
|
|
export type SetFiles = React.Dispatch<React.SetStateAction<File[]>>;
|
|
|
|
export type SetCollections = React.Dispatch<React.SetStateAction<Collection[]>>;
|
2021-04-28 06:38:52 +00:00
|
|
|
export type SetLoading = React.Dispatch<React.SetStateAction<Boolean>>;
|
2021-05-27 08:27:32 +00:00
|
|
|
export type setSearchStats = React.Dispatch<React.SetStateAction<SearchStats>>;
|
|
|
|
|
2021-05-26 20:36:02 +00:00
|
|
|
export type Search = {
|
2021-05-28 16:25:19 +00:00
|
|
|
date?: DateValue;
|
2021-05-26 20:36:02 +00:00
|
|
|
location?: Bbox;
|
2021-10-06 05:54:05 +00:00
|
|
|
fileIndex?: number;
|
2021-05-27 08:27:32 +00:00
|
|
|
};
|
|
|
|
export interface SearchStats {
|
|
|
|
resultCount: number;
|
|
|
|
timeTaken: number;
|
2021-05-26 20:36:02 +00:00
|
|
|
}
|
2021-03-20 14:58:12 +00:00
|
|
|
|
2021-05-30 16:35:12 +00:00
|
|
|
type GalleryContextType = {
|
|
|
|
thumbs: Map<number, string>;
|
2021-05-30 18:02:57 +00:00
|
|
|
files: Map<number, string>;
|
2021-08-29 08:49:08 +00:00
|
|
|
showPlanSelectorModal: () => void;
|
2021-09-21 11:29:24 +00:00
|
|
|
setActiveCollection: (collection: number) => void;
|
2021-10-29 12:11:59 +00:00
|
|
|
syncWithRemote: (force?: boolean, silent?: boolean) => Promise<void>;
|
2021-08-11 07:35:40 +00:00
|
|
|
};
|
2021-05-30 16:35:12 +00:00
|
|
|
|
|
|
|
const defaultGalleryContext: GalleryContextType = {
|
|
|
|
thumbs: new Map(),
|
|
|
|
files: new Map(),
|
2021-08-29 08:49:08 +00:00
|
|
|
showPlanSelectorModal: () => null,
|
2021-09-21 11:29:24 +00:00
|
|
|
setActiveCollection: () => null,
|
2021-10-29 12:11:59 +00:00
|
|
|
syncWithRemote: () => null,
|
2021-05-30 16:35:12 +00:00
|
|
|
};
|
|
|
|
|
2021-08-11 07:35:40 +00:00
|
|
|
export const GalleryContext = createContext<GalleryContextType>(
|
2021-08-13 02:38:38 +00:00
|
|
|
defaultGalleryContext
|
2021-08-11 07:35:40 +00:00
|
|
|
);
|
2021-05-30 16:35:12 +00:00
|
|
|
|
2021-04-27 05:50:03 +00:00
|
|
|
export default function Gallery() {
|
2021-01-13 05:31:02 +00:00
|
|
|
const router = useRouter();
|
2021-04-23 07:12:56 +00:00
|
|
|
const [collections, setCollections] = useState<Collection[]>([]);
|
2021-08-11 07:35:40 +00:00
|
|
|
const [collectionsAndTheirLatestFile, setCollectionsAndTheirLatestFile] =
|
|
|
|
useState<CollectionAndItsLatestFile[]>([]);
|
2021-04-27 09:17:38 +00:00
|
|
|
const [files, setFiles] = useState<File[]>(null);
|
2021-01-20 12:05:04 +00:00
|
|
|
const [favItemIds, setFavItemIds] = useState<Set<number>>();
|
2021-09-13 03:43:34 +00:00
|
|
|
const [bannerMessage, setBannerMessage] = useState<JSX.Element | string>(
|
|
|
|
null
|
|
|
|
);
|
2021-02-17 09:47:26 +00:00
|
|
|
const [isFirstLoad, setIsFirstLoad] = useState(false);
|
2021-05-26 16:48:29 +00:00
|
|
|
const [isFirstFetch, setIsFirstFetch] = useState(false);
|
2021-09-20 11:16:48 +00:00
|
|
|
const [selected, setSelected] = useState<SelectedState>({
|
|
|
|
count: 0,
|
|
|
|
collectionID: 0,
|
|
|
|
});
|
2021-04-07 07:18:45 +00:00
|
|
|
const [dialogMessage, setDialogMessage] = useState<MessageAttributes>();
|
2021-04-25 15:16:58 +00:00
|
|
|
const [dialogView, setDialogView] = useState(false);
|
2021-08-01 11:31:07 +00:00
|
|
|
const [planModalView, setPlanModalView] = useState(false);
|
2021-04-19 09:36:50 +00:00
|
|
|
const [loading, setLoading] = useState(false);
|
2021-08-11 07:35:40 +00:00
|
|
|
const [collectionSelectorAttributes, setCollectionSelectorAttributes] =
|
|
|
|
useState<CollectionSelectorAttributes>(null);
|
2021-04-27 05:35:49 +00:00
|
|
|
const [collectionSelectorView, setCollectionSelectorView] = useState(false);
|
2021-08-11 07:35:40 +00:00
|
|
|
const [collectionNamerAttributes, setCollectionNamerAttributes] =
|
|
|
|
useState<CollectionNamerAttributes>(null);
|
2021-04-27 05:35:49 +00:00
|
|
|
const [collectionNamerView, setCollectionNamerView] = useState(false);
|
2021-05-26 20:36:02 +00:00
|
|
|
const [search, setSearch] = useState<Search>({
|
|
|
|
date: null,
|
|
|
|
location: null,
|
2021-10-06 05:54:05 +00:00
|
|
|
fileIndex: null,
|
2021-05-26 20:36:02 +00:00
|
|
|
});
|
2021-05-27 17:04:43 +00:00
|
|
|
const [uploadInProgress, setUploadInProgress] = useState(false);
|
2021-04-27 05:35:49 +00:00
|
|
|
const {
|
|
|
|
getRootProps,
|
|
|
|
getInputProps,
|
|
|
|
open: openFileUploader,
|
|
|
|
acceptedFiles,
|
2021-07-24 14:55:12 +00:00
|
|
|
fileRejections,
|
2021-04-27 05:35:49 +00:00
|
|
|
} = useDropzone({
|
|
|
|
noClick: true,
|
|
|
|
noKeyboard: true,
|
2021-05-27 17:04:43 +00:00
|
|
|
disabled: uploadInProgress,
|
2021-04-27 05:35:49 +00:00
|
|
|
});
|
2021-04-07 07:18:45 +00:00
|
|
|
|
2021-02-17 08:35:19 +00:00
|
|
|
const loadingBar = useRef(null);
|
2021-10-07 08:22:25 +00:00
|
|
|
const [isInSearchMode, setIsInSearchMode] = useState(false);
|
2021-05-27 08:27:32 +00:00
|
|
|
const [searchStats, setSearchStats] = useState(null);
|
2021-07-26 18:55:27 +00:00
|
|
|
const syncInProgress = useRef(true);
|
2021-07-21 08:47:21 +00:00
|
|
|
const resync = useRef(false);
|
2021-06-02 20:25:46 +00:00
|
|
|
const [deleted, setDeleted] = useState<number[]>([]);
|
2021-06-04 07:57:48 +00:00
|
|
|
const appContext = useContext(AppContext);
|
2021-08-11 07:35:40 +00:00
|
|
|
const [collectionFilesCount, setCollectionFilesCount] =
|
|
|
|
useState<Map<number, number>>();
|
2021-09-30 13:24:29 +00:00
|
|
|
const [activeCollection, setActiveCollection] = useState<number>(undefined);
|
2021-10-26 11:12:32 +00:00
|
|
|
const [trash, setTrash] = useState<Trash>([]);
|
2021-11-16 06:57:23 +00:00
|
|
|
const [fixCreationTimeView, setFixCreationTimeView] = useState(false);
|
|
|
|
const [fixCreationTimeAttributes, setFixCreationTimeAttributes] =
|
|
|
|
useState<FixCreationTimeAttributes>(null);
|
2021-01-13 05:31:02 +00:00
|
|
|
useEffect(() => {
|
|
|
|
const key = getKey(SESSION_KEYS.ENCRYPTION_KEY);
|
|
|
|
if (!key) {
|
2021-08-31 04:58:58 +00:00
|
|
|
router.push(PAGES.ROOT);
|
2021-02-17 09:16:20 +00:00
|
|
|
return;
|
2021-01-13 05:31:02 +00:00
|
|
|
}
|
|
|
|
const main = async () => {
|
2021-09-30 13:24:29 +00:00
|
|
|
setActiveCollection(ALL_SECTION);
|
2021-04-03 04:22:57 +00:00
|
|
|
setIsFirstLoad(isFirstLogin());
|
2021-05-26 17:17:12 +00:00
|
|
|
setIsFirstFetch(true);
|
2021-04-20 05:34:19 +00:00
|
|
|
if (justSignedUp()) {
|
2021-04-20 09:30:45 +00:00
|
|
|
setPlanModalView(true);
|
2021-04-20 05:34:19 +00:00
|
|
|
}
|
2021-04-03 04:22:57 +00:00
|
|
|
setIsFirstLogin(false);
|
2021-11-02 05:43:35 +00:00
|
|
|
const files = mergeMetadata(await getLocalFiles());
|
2021-01-31 12:11:21 +00:00
|
|
|
const collections = await getLocalCollections();
|
2021-10-01 06:45:14 +00:00
|
|
|
const trash = await getLocalTrash();
|
|
|
|
const trashedFile = getTrashedFiles(trash);
|
2021-11-02 05:43:35 +00:00
|
|
|
setFiles(sortFiles([...files, ...trashedFile]));
|
2021-07-17 07:39:29 +00:00
|
|
|
setCollections(collections);
|
2021-10-26 11:12:32 +00:00
|
|
|
setTrash(trash);
|
2021-08-31 11:31:33 +00:00
|
|
|
await setDerivativeState(collections, files);
|
2021-08-18 09:23:04 +00:00
|
|
|
await checkSubscriptionPurchase(
|
|
|
|
setDialogMessage,
|
|
|
|
router,
|
|
|
|
setLoading
|
|
|
|
);
|
2021-06-06 20:26:31 +00:00
|
|
|
await syncWithRemote(true);
|
2021-02-17 09:47:26 +00:00
|
|
|
setIsFirstLoad(false);
|
2021-04-22 14:30:07 +00:00
|
|
|
setJustSignedUp(false);
|
2021-05-26 16:48:29 +00:00
|
|
|
setIsFirstFetch(false);
|
2021-01-13 05:31:02 +00:00
|
|
|
};
|
|
|
|
main();
|
2021-06-04 07:57:48 +00:00
|
|
|
appContext.showNavBar(true);
|
2021-01-27 06:14:02 +00:00
|
|
|
}, []);
|
2020-09-12 21:53:41 +00:00
|
|
|
|
2021-04-25 15:16:58 +00:00
|
|
|
useEffect(() => setDialogView(true), [dialogMessage]);
|
2021-09-20 07:32:06 +00:00
|
|
|
|
2021-11-16 06:57:23 +00:00
|
|
|
useEffect(
|
|
|
|
() => setCollectionSelectorView(true),
|
|
|
|
[collectionSelectorAttributes]
|
|
|
|
);
|
2021-09-20 07:32:06 +00:00
|
|
|
|
2021-04-27 06:36:56 +00:00
|
|
|
useEffect(() => setCollectionNamerView(true), [collectionNamerAttributes]);
|
2021-11-16 06:57:23 +00:00
|
|
|
useEffect(() => setFixCreationTimeView(true), [fixCreationTimeAttributes]);
|
2021-04-25 15:16:58 +00:00
|
|
|
|
2021-09-20 07:32:06 +00:00
|
|
|
useEffect(() => {
|
2021-09-30 13:24:29 +00:00
|
|
|
if (typeof activeCollection === 'undefined') {
|
|
|
|
return;
|
|
|
|
}
|
2021-09-30 06:39:28 +00:00
|
|
|
let collectionURL = '';
|
|
|
|
if (activeCollection !== ALL_SECTION) {
|
|
|
|
collectionURL += '?collection=';
|
|
|
|
if (activeCollection === ARCHIVE_SECTION) {
|
|
|
|
collectionURL += constants.ARCHIVE;
|
2021-10-04 13:30:23 +00:00
|
|
|
} else if (activeCollection === TRASH_SECTION) {
|
|
|
|
collectionURL += constants.TRASH;
|
2021-09-30 06:39:28 +00:00
|
|
|
} else {
|
|
|
|
collectionURL += activeCollection;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
const href = `/gallery${collectionURL}`;
|
2021-09-20 07:32:06 +00:00
|
|
|
router.push(href, undefined, { shallow: true });
|
|
|
|
}, [activeCollection]);
|
|
|
|
|
2021-08-11 07:35:40 +00:00
|
|
|
const syncWithRemote = async (force = false, silent = false) => {
|
2021-07-21 08:47:21 +00:00
|
|
|
if (syncInProgress.current && !force) {
|
2021-08-11 07:35:40 +00:00
|
|
|
resync.current = true;
|
2021-06-02 18:25:35 +00:00
|
|
|
return;
|
|
|
|
}
|
2021-08-11 07:35:40 +00:00
|
|
|
syncInProgress.current = true;
|
2021-07-26 18:55:27 +00:00
|
|
|
try {
|
|
|
|
checkConnectivity();
|
|
|
|
if (!(await isTokenValid())) {
|
2021-08-06 07:38:09 +00:00
|
|
|
throw new Error(ServerErrorCodes.SESSION_EXPIRED);
|
2021-05-24 13:11:08 +00:00
|
|
|
}
|
2021-07-27 01:58:23 +00:00
|
|
|
!silent && loadingBar.current?.continuousStart();
|
2021-07-26 18:55:27 +00:00
|
|
|
await billingService.syncSubscription();
|
|
|
|
const collections = await syncCollections();
|
2021-08-31 11:31:33 +00:00
|
|
|
setCollections(collections);
|
2021-10-01 06:45:14 +00:00
|
|
|
const files = await syncFiles(collections, setFiles);
|
2021-08-31 11:31:33 +00:00
|
|
|
await setDerivativeState(collections, files);
|
2021-10-26 11:12:32 +00:00
|
|
|
const trash = await syncTrash(collections, setFiles, files);
|
|
|
|
setTrash(trash);
|
2021-07-26 18:55:27 +00:00
|
|
|
} catch (e) {
|
|
|
|
switch (e.message) {
|
2021-08-06 07:38:09 +00:00
|
|
|
case ServerErrorCodes.SESSION_EXPIRED:
|
2021-07-26 18:55:27 +00:00
|
|
|
setBannerMessage(constants.SESSION_EXPIRED_MESSAGE);
|
|
|
|
setDialogMessage({
|
|
|
|
title: constants.SESSION_EXPIRED,
|
|
|
|
content: constants.SESSION_EXPIRED_MESSAGE,
|
|
|
|
staticBackdrop: true,
|
2021-08-11 12:47:52 +00:00
|
|
|
nonClosable: true,
|
2021-07-26 18:55:27 +00:00
|
|
|
proceed: {
|
|
|
|
text: constants.LOGIN,
|
|
|
|
action: logoutUser,
|
|
|
|
variant: 'success',
|
2021-08-11 07:35:40 +00:00
|
|
|
},
|
|
|
|
});
|
2021-07-26 18:55:27 +00:00
|
|
|
break;
|
2021-08-06 07:38:09 +00:00
|
|
|
case CustomError.KEY_MISSING:
|
2021-07-26 18:55:27 +00:00
|
|
|
clearKeys();
|
2021-08-31 04:58:58 +00:00
|
|
|
router.push(PAGES.CREDENTIALS);
|
2021-07-26 18:55:27 +00:00
|
|
|
break;
|
2021-03-29 10:30:20 +00:00
|
|
|
}
|
2021-07-26 18:55:27 +00:00
|
|
|
} finally {
|
2021-07-27 01:58:23 +00:00
|
|
|
!silent && loadingBar.current?.complete();
|
2021-07-26 18:55:27 +00:00
|
|
|
}
|
2021-08-11 07:35:40 +00:00
|
|
|
syncInProgress.current = false;
|
2021-07-26 18:55:27 +00:00
|
|
|
if (resync.current) {
|
2021-08-11 07:35:40 +00:00
|
|
|
resync.current = false;
|
2021-07-26 18:55:27 +00:00
|
|
|
syncWithRemote();
|
|
|
|
}
|
2021-02-08 17:15:13 +00:00
|
|
|
};
|
2021-01-05 02:40:59 +00:00
|
|
|
|
2021-09-20 13:46:08 +00:00
|
|
|
const setDerivativeState = async (
|
|
|
|
collections: Collection[],
|
|
|
|
files: File[]
|
|
|
|
) => {
|
2021-10-29 12:40:02 +00:00
|
|
|
const favItemIds = await getFavItemIds(files);
|
|
|
|
setFavItemIds(favItemIds);
|
2021-09-21 06:01:47 +00:00
|
|
|
const nonEmptyCollections = getNonEmptyCollections(collections, files);
|
2021-10-29 12:40:02 +00:00
|
|
|
setCollections(nonEmptyCollections);
|
2021-09-20 13:46:08 +00:00
|
|
|
const collectionsAndTheirLatestFile = getCollectionsAndTheirLatestFile(
|
|
|
|
nonEmptyCollections,
|
|
|
|
files
|
|
|
|
);
|
2021-10-29 12:40:02 +00:00
|
|
|
setCollectionsAndTheirLatestFile(collectionsAndTheirLatestFile);
|
2021-07-17 07:39:29 +00:00
|
|
|
const collectionWiseFiles = sortFilesIntoCollections(files);
|
|
|
|
const collectionFilesCount = new Map<number, number>();
|
|
|
|
for (const [id, files] of collectionWiseFiles) {
|
|
|
|
collectionFilesCount.set(id, files.length);
|
|
|
|
}
|
|
|
|
setCollectionFilesCount(collectionFilesCount);
|
|
|
|
};
|
|
|
|
|
2021-06-08 09:53:11 +00:00
|
|
|
const clearSelection = function () {
|
2021-09-20 11:16:48 +00:00
|
|
|
setSelected({ count: 0, collectionID: 0 });
|
2021-04-22 12:56:06 +00:00
|
|
|
};
|
2021-03-20 14:58:12 +00:00
|
|
|
|
2021-04-27 08:40:37 +00:00
|
|
|
if (!files) {
|
|
|
|
return <div />;
|
|
|
|
}
|
2021-09-28 08:03:32 +00:00
|
|
|
const collectionOpsHelper =
|
|
|
|
(ops: COLLECTION_OPS_TYPE) => async (collection: Collection) => {
|
|
|
|
loadingBar.current?.continuousStart();
|
|
|
|
try {
|
|
|
|
await handleCollectionOps(
|
|
|
|
ops,
|
|
|
|
setCollectionSelectorView,
|
|
|
|
selected,
|
|
|
|
files,
|
|
|
|
setActiveCollection,
|
|
|
|
collection
|
|
|
|
);
|
2021-09-28 08:33:39 +00:00
|
|
|
clearSelection();
|
2021-09-28 08:03:32 +00:00
|
|
|
} catch (e) {
|
2021-09-28 08:50:05 +00:00
|
|
|
logError(e, 'collection ops failed', { ops });
|
2021-09-28 08:03:32 +00:00
|
|
|
setDialogMessage({
|
|
|
|
title: constants.ERROR,
|
|
|
|
staticBackdrop: true,
|
|
|
|
close: { variant: 'danger' },
|
|
|
|
content: constants.UNKNOWN_ERROR,
|
|
|
|
});
|
2021-09-28 08:33:39 +00:00
|
|
|
} finally {
|
|
|
|
await syncWithRemote(false, true);
|
|
|
|
loadingBar.current.complete();
|
2021-09-28 08:03:32 +00:00
|
|
|
}
|
|
|
|
};
|
2021-09-27 03:56:29 +00:00
|
|
|
|
2021-09-22 12:21:52 +00:00
|
|
|
const changeFilesVisibilityHelper = async (
|
|
|
|
visibility: VISIBILITY_STATE
|
|
|
|
) => {
|
2021-09-22 08:28:23 +00:00
|
|
|
loadingBar.current?.continuousStart();
|
|
|
|
try {
|
2021-09-22 12:21:52 +00:00
|
|
|
const updatedFiles = await changeFilesVisibility(
|
2021-09-22 08:28:23 +00:00
|
|
|
files,
|
|
|
|
selected,
|
2021-09-22 12:21:52 +00:00
|
|
|
visibility
|
2021-09-22 08:28:23 +00:00
|
|
|
);
|
2021-09-22 12:21:52 +00:00
|
|
|
await updateMagicMetadata(updatedFiles);
|
2021-09-28 04:59:43 +00:00
|
|
|
clearSelection();
|
2021-09-10 04:04:38 +00:00
|
|
|
} catch (e) {
|
2021-09-28 08:50:05 +00:00
|
|
|
logError(e, 'change file visibility failed');
|
2021-09-22 08:28:23 +00:00
|
|
|
switch (e.status?.toString()) {
|
|
|
|
case ServerErrorCodes.FORBIDDEN:
|
|
|
|
setDialogMessage({
|
|
|
|
title: constants.ERROR,
|
|
|
|
staticBackdrop: true,
|
|
|
|
close: { variant: 'danger' },
|
|
|
|
content: constants.NOT_FILE_OWNER,
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
2021-09-10 04:04:38 +00:00
|
|
|
setDialogMessage({
|
|
|
|
title: constants.ERROR,
|
|
|
|
staticBackdrop: true,
|
|
|
|
close: { variant: 'danger' },
|
|
|
|
content: constants.UNKNOWN_ERROR,
|
|
|
|
});
|
2021-09-22 08:28:23 +00:00
|
|
|
} finally {
|
2021-09-27 04:53:17 +00:00
|
|
|
await syncWithRemote(false, true);
|
2021-09-22 08:28:23 +00:00
|
|
|
loadingBar.current.complete();
|
2021-09-10 04:04:38 +00:00
|
|
|
}
|
2021-05-07 09:37:12 +00:00
|
|
|
};
|
2021-04-27 11:58:55 +00:00
|
|
|
|
2021-09-28 08:03:32 +00:00
|
|
|
const showCreateCollectionModal = (ops: COLLECTION_OPS_TYPE) => {
|
|
|
|
const callback = async (collectionName: string) => {
|
|
|
|
try {
|
|
|
|
const collection = await createCollection(
|
|
|
|
collectionName,
|
|
|
|
CollectionType.album,
|
|
|
|
collections
|
|
|
|
);
|
|
|
|
|
|
|
|
await collectionOpsHelper(ops)(collection);
|
|
|
|
} catch (e) {
|
|
|
|
logError(e, 'create and collection ops failed');
|
|
|
|
setDialogMessage({
|
|
|
|
title: constants.ERROR,
|
|
|
|
staticBackdrop: true,
|
|
|
|
close: { variant: 'danger' },
|
|
|
|
content: constants.UNKNOWN_ERROR,
|
2021-09-20 12:51:40 +00:00
|
|
|
});
|
2021-09-28 08:03:32 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
return () =>
|
|
|
|
setCollectionNamerAttributes({
|
|
|
|
title: constants.CREATE_COLLECTION,
|
|
|
|
buttonText: constants.CREATE,
|
|
|
|
autoFilledName: '',
|
|
|
|
callback,
|
2021-09-20 12:51:40 +00:00
|
|
|
});
|
|
|
|
};
|
2021-04-27 11:58:55 +00:00
|
|
|
|
2021-10-04 05:22:12 +00:00
|
|
|
const deleteFileHelper = async (permanent?: boolean) => {
|
2021-05-07 12:11:20 +00:00
|
|
|
loadingBar.current?.continuousStart();
|
2021-05-31 10:58:33 +00:00
|
|
|
try {
|
2021-09-28 07:09:59 +00:00
|
|
|
const selectedFiles = getSelectedFiles(selected, files);
|
2021-10-04 05:22:12 +00:00
|
|
|
if (permanent) {
|
|
|
|
await deleteFromTrash(selectedFiles.map((file) => file.id));
|
2021-10-04 06:09:47 +00:00
|
|
|
setDeleted([
|
|
|
|
...deleted,
|
|
|
|
...selectedFiles.map((file) => file.id),
|
|
|
|
]);
|
2021-10-04 05:22:12 +00:00
|
|
|
} else {
|
|
|
|
await trashFiles(selectedFiles);
|
|
|
|
}
|
2021-09-28 04:59:43 +00:00
|
|
|
clearSelection();
|
2021-05-31 10:58:33 +00:00
|
|
|
} catch (e) {
|
|
|
|
switch (e.status?.toString()) {
|
2021-08-06 07:38:09 +00:00
|
|
|
case ServerErrorCodes.FORBIDDEN:
|
2021-06-03 08:46:54 +00:00
|
|
|
setDialogMessage({
|
|
|
|
title: constants.ERROR,
|
|
|
|
staticBackdrop: true,
|
|
|
|
close: { variant: 'danger' },
|
|
|
|
content: constants.NOT_FILE_OWNER,
|
|
|
|
});
|
2021-05-31 10:58:33 +00:00
|
|
|
}
|
|
|
|
setDialogMessage({
|
|
|
|
title: constants.ERROR,
|
|
|
|
staticBackdrop: true,
|
|
|
|
close: { variant: 'danger' },
|
|
|
|
content: constants.UNKNOWN_ERROR,
|
|
|
|
});
|
2021-09-21 10:39:04 +00:00
|
|
|
} finally {
|
2021-09-27 04:53:17 +00:00
|
|
|
await syncWithRemote(false, true);
|
2021-09-21 10:39:04 +00:00
|
|
|
loadingBar.current.complete();
|
2021-05-31 10:58:33 +00:00
|
|
|
}
|
2021-05-07 09:37:12 +00:00
|
|
|
};
|
2021-05-26 20:36:02 +00:00
|
|
|
|
2021-10-07 08:32:07 +00:00
|
|
|
const updateSearch = (newSearch: Search) => {
|
2021-10-07 15:10:41 +00:00
|
|
|
setActiveCollection(ALL_SECTION);
|
|
|
|
setSearch(newSearch);
|
2021-05-27 08:27:32 +00:00
|
|
|
setSearchStats(null);
|
|
|
|
};
|
2021-06-06 20:26:31 +00:00
|
|
|
|
|
|
|
const closeCollectionSelector = (closeBtnClick?: boolean) => {
|
|
|
|
if (closeBtnClick === true) {
|
2021-06-08 09:53:11 +00:00
|
|
|
appContext.resetSharedFiles();
|
2021-06-06 20:26:31 +00:00
|
|
|
}
|
|
|
|
setCollectionSelectorView(false);
|
|
|
|
};
|
|
|
|
|
2021-10-26 07:35:12 +00:00
|
|
|
const emptyTrashHandler = () =>
|
|
|
|
setDialogMessage({
|
|
|
|
title: constants.CONFIRM_EMPTY_TRASH,
|
|
|
|
content: constants.EMPTY_TRASH_MESSAGE,
|
|
|
|
staticBackdrop: true,
|
|
|
|
proceed: {
|
|
|
|
action: emptyTrashHelper,
|
|
|
|
text: constants.EMPTY_TRASH,
|
|
|
|
variant: 'danger',
|
|
|
|
},
|
|
|
|
close: { text: constants.CANCEL },
|
|
|
|
});
|
|
|
|
const emptyTrashHelper = async () => {
|
|
|
|
loadingBar.current?.continuousStart();
|
|
|
|
try {
|
|
|
|
await emptyTrash();
|
2021-10-26 11:12:32 +00:00
|
|
|
if (selected.collectionID === TRASH_SECTION) {
|
|
|
|
clearSelection();
|
|
|
|
}
|
2021-10-26 11:19:46 +00:00
|
|
|
await clearLocalTrash();
|
2021-11-03 11:33:24 +00:00
|
|
|
setActiveCollection(ALL_SECTION);
|
2021-10-26 07:35:12 +00:00
|
|
|
} catch (e) {
|
|
|
|
setDialogMessage({
|
|
|
|
title: constants.ERROR,
|
|
|
|
staticBackdrop: true,
|
|
|
|
close: { variant: 'danger' },
|
|
|
|
content: constants.UNKNOWN_ERROR,
|
|
|
|
});
|
|
|
|
} finally {
|
|
|
|
await syncWithRemote(false, true);
|
|
|
|
loadingBar.current.complete();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2021-11-16 06:57:23 +00:00
|
|
|
const fixTimeHelper = async () => {
|
|
|
|
const selectedFiles = getSelectedFiles(selected, files);
|
|
|
|
setFixCreationTimeAttributes({ files: selectedFiles });
|
|
|
|
};
|
|
|
|
|
2021-01-13 05:31:02 +00:00
|
|
|
return (
|
2021-09-21 11:29:24 +00:00
|
|
|
<GalleryContext.Provider
|
|
|
|
value={{
|
|
|
|
...defaultGalleryContext,
|
|
|
|
showPlanSelectorModal: () => setPlanModalView(true),
|
|
|
|
setActiveCollection,
|
2021-10-29 12:11:59 +00:00
|
|
|
syncWithRemote,
|
2021-09-21 11:29:24 +00:00
|
|
|
}}>
|
2021-05-30 16:35:12 +00:00
|
|
|
<FullScreenDropZone
|
|
|
|
getRootProps={getRootProps}
|
2021-09-21 06:07:03 +00:00
|
|
|
getInputProps={getInputProps}>
|
2021-05-30 16:35:12 +00:00
|
|
|
{loading && (
|
|
|
|
<LoadingOverlay>
|
|
|
|
<EnteSpinner />
|
|
|
|
</LoadingOverlay>
|
|
|
|
)}
|
2021-08-27 08:52:04 +00:00
|
|
|
<LoadingBar color="#51cd7c" ref={loadingBar} />
|
2021-05-30 16:35:12 +00:00
|
|
|
{isFirstLoad && (
|
|
|
|
<AlertContainer>
|
|
|
|
{constants.INITIAL_LOAD_DELAY_WARNING}
|
|
|
|
</AlertContainer>
|
2021-04-27 07:08:58 +00:00
|
|
|
)}
|
2021-05-30 16:35:12 +00:00
|
|
|
<PlanSelector
|
|
|
|
modalView={planModalView}
|
|
|
|
closeModal={() => setPlanModalView(false)}
|
|
|
|
setDialogMessage={setDialogMessage}
|
|
|
|
setLoading={setLoading}
|
|
|
|
/>
|
|
|
|
<AlertBanner bannerMessage={bannerMessage} />
|
|
|
|
<MessageDialog
|
|
|
|
size="lg"
|
|
|
|
show={dialogView}
|
|
|
|
onHide={() => setDialogView(false)}
|
|
|
|
attributes={dialogMessage}
|
|
|
|
/>
|
|
|
|
<SearchBar
|
2021-10-07 08:22:25 +00:00
|
|
|
isOpen={isInSearchMode}
|
|
|
|
setOpen={setIsInSearchMode}
|
2021-05-30 16:35:12 +00:00
|
|
|
loadingBar={loadingBar}
|
|
|
|
isFirstFetch={isFirstFetch}
|
2021-09-22 18:51:55 +00:00
|
|
|
collections={collections}
|
2021-10-06 05:54:05 +00:00
|
|
|
files={files}
|
2021-09-22 18:51:55 +00:00
|
|
|
setActiveCollection={setActiveCollection}
|
2021-05-30 16:35:12 +00:00
|
|
|
setSearch={updateSearch}
|
|
|
|
searchStats={searchStats}
|
|
|
|
/>
|
|
|
|
<Collections
|
|
|
|
collections={collections}
|
2021-09-27 06:21:26 +00:00
|
|
|
collectionAndTheirLatestFile={collectionsAndTheirLatestFile}
|
2021-10-07 08:22:25 +00:00
|
|
|
isInSearchMode={isInSearchMode}
|
2021-09-22 06:03:07 +00:00
|
|
|
activeCollection={activeCollection}
|
2021-09-20 07:32:06 +00:00
|
|
|
setActiveCollection={setActiveCollection}
|
2021-05-30 16:35:12 +00:00
|
|
|
syncWithRemote={syncWithRemote}
|
2021-04-27 11:58:55 +00:00
|
|
|
setDialogMessage={setDialogMessage}
|
2021-05-30 16:35:12 +00:00
|
|
|
setCollectionNamerAttributes={setCollectionNamerAttributes}
|
|
|
|
startLoadingBar={loadingBar.current?.continuousStart}
|
2021-07-16 13:38:42 +00:00
|
|
|
collectionFilesCount={collectionFilesCount}
|
2021-05-30 16:35:12 +00:00
|
|
|
/>
|
|
|
|
<CollectionNamer
|
|
|
|
show={collectionNamerView}
|
|
|
|
onHide={setCollectionNamerView.bind(null, false)}
|
|
|
|
attributes={collectionNamerAttributes}
|
|
|
|
/>
|
|
|
|
<CollectionSelector
|
2021-10-04 07:00:14 +00:00
|
|
|
show={collectionSelectorView}
|
2021-06-06 20:26:31 +00:00
|
|
|
onHide={closeCollectionSelector}
|
2021-08-11 07:35:40 +00:00
|
|
|
collectionsAndTheirLatestFile={
|
|
|
|
collectionsAndTheirLatestFile
|
|
|
|
}
|
2021-05-30 16:35:12 +00:00
|
|
|
attributes={collectionSelectorAttributes}
|
|
|
|
/>
|
2021-11-16 06:57:23 +00:00
|
|
|
<FixCreationTime
|
|
|
|
isOpen={fixCreationTimeView}
|
|
|
|
hide={() => setFixCreationTimeView(false)}
|
|
|
|
show={() => setFixCreationTimeView(true)}
|
|
|
|
attributes={fixCreationTimeAttributes}
|
|
|
|
/>
|
2021-05-30 16:35:12 +00:00
|
|
|
<Upload
|
|
|
|
syncWithRemote={syncWithRemote}
|
|
|
|
setBannerMessage={setBannerMessage}
|
2021-06-08 09:53:11 +00:00
|
|
|
acceptedFiles={acceptedFiles}
|
2021-08-11 07:35:40 +00:00
|
|
|
showCollectionSelector={setCollectionSelectorView.bind(
|
|
|
|
null,
|
2021-08-13 02:38:38 +00:00
|
|
|
true
|
2021-08-11 07:35:40 +00:00
|
|
|
)}
|
|
|
|
setCollectionSelectorAttributes={
|
|
|
|
setCollectionSelectorAttributes
|
|
|
|
}
|
2021-05-30 16:35:12 +00:00
|
|
|
closeCollectionSelector={setCollectionSelectorView.bind(
|
|
|
|
null,
|
2021-08-13 02:38:38 +00:00
|
|
|
false
|
2021-05-30 16:35:12 +00:00
|
|
|
)}
|
|
|
|
setLoading={setLoading}
|
|
|
|
setCollectionNamerAttributes={setCollectionNamerAttributes}
|
|
|
|
setDialogMessage={setDialogMessage}
|
|
|
|
setUploadInProgress={setUploadInProgress}
|
2021-07-24 14:55:12 +00:00
|
|
|
fileRejections={fileRejections}
|
2021-07-25 07:56:05 +00:00
|
|
|
setFiles={setFiles}
|
2021-09-12 08:36:16 +00:00
|
|
|
isFirstUpload={collectionsAndTheirLatestFile?.length === 0}
|
2021-05-30 16:35:12 +00:00
|
|
|
/>
|
|
|
|
<Sidebar
|
|
|
|
collections={collections}
|
|
|
|
setDialogMessage={setDialogMessage}
|
2021-06-24 08:32:29 +00:00
|
|
|
setLoading={setLoading}
|
2021-04-27 11:58:55 +00:00
|
|
|
/>
|
2021-08-11 07:35:40 +00:00
|
|
|
<UploadButton
|
|
|
|
isFirstFetch={isFirstFetch}
|
|
|
|
openFileUploader={openFileUploader}
|
|
|
|
/>
|
2021-05-30 16:35:12 +00:00
|
|
|
<PhotoFrame
|
|
|
|
files={files}
|
|
|
|
setFiles={setFiles}
|
|
|
|
syncWithRemote={syncWithRemote}
|
|
|
|
favItemIds={favItemIds}
|
|
|
|
setSelected={setSelected}
|
|
|
|
selected={selected}
|
|
|
|
isFirstLoad={isFirstLoad}
|
|
|
|
openFileUploader={openFileUploader}
|
|
|
|
loadingBar={loadingBar}
|
2021-10-07 08:22:25 +00:00
|
|
|
isInSearchMode={isInSearchMode}
|
2021-05-30 16:35:12 +00:00
|
|
|
search={search}
|
|
|
|
setSearchStats={setSearchStats}
|
2021-06-02 20:25:46 +00:00
|
|
|
deleted={deleted}
|
2021-06-02 21:13:32 +00:00
|
|
|
setDialogMessage={setDialogMessage}
|
2021-09-20 11:16:48 +00:00
|
|
|
activeCollection={activeCollection}
|
2021-10-05 09:48:05 +00:00
|
|
|
isSharedCollection={isSharedCollection(
|
|
|
|
activeCollection,
|
|
|
|
collections
|
|
|
|
)}
|
2021-05-30 16:35:12 +00:00
|
|
|
/>
|
2021-09-20 11:16:48 +00:00
|
|
|
{selected.count > 0 &&
|
|
|
|
selected.collectionID === activeCollection && (
|
|
|
|
<SelectedFileOptions
|
2021-09-28 08:03:32 +00:00
|
|
|
addToCollectionHelper={collectionOpsHelper(
|
|
|
|
COLLECTION_OPS_TYPE.ADD
|
|
|
|
)}
|
2021-09-22 12:21:52 +00:00
|
|
|
archiveFilesHelper={() =>
|
|
|
|
changeFilesVisibilityHelper(
|
|
|
|
VISIBILITY_STATE.ARCHIVED
|
|
|
|
)
|
|
|
|
}
|
|
|
|
unArchiveFilesHelper={() =>
|
|
|
|
changeFilesVisibilityHelper(
|
|
|
|
VISIBILITY_STATE.VISIBLE
|
|
|
|
)
|
|
|
|
}
|
2021-09-28 08:03:32 +00:00
|
|
|
moveToCollectionHelper={collectionOpsHelper(
|
2021-09-28 08:40:14 +00:00
|
|
|
COLLECTION_OPS_TYPE.MOVE
|
2021-09-28 08:03:32 +00:00
|
|
|
)}
|
2021-10-04 07:01:05 +00:00
|
|
|
restoreToCollectionHelper={collectionOpsHelper(
|
|
|
|
COLLECTION_OPS_TYPE.RESTORE
|
|
|
|
)}
|
2021-09-20 11:16:48 +00:00
|
|
|
showCreateCollectionModal={
|
|
|
|
showCreateCollectionModal
|
|
|
|
}
|
|
|
|
setDialogMessage={setDialogMessage}
|
|
|
|
setCollectionSelectorAttributes={
|
|
|
|
setCollectionSelectorAttributes
|
|
|
|
}
|
|
|
|
deleteFileHelper={deleteFileHelper}
|
2021-09-28 08:14:45 +00:00
|
|
|
removeFromCollectionHelper={() =>
|
|
|
|
collectionOpsHelper(COLLECTION_OPS_TYPE.REMOVE)(
|
|
|
|
getSelectedCollection(
|
|
|
|
activeCollection,
|
|
|
|
collections
|
|
|
|
)
|
|
|
|
)
|
|
|
|
}
|
2021-11-16 06:57:23 +00:00
|
|
|
fixTimeHelper={fixTimeHelper}
|
2021-09-20 11:16:48 +00:00
|
|
|
count={selected.count}
|
|
|
|
clearSelection={clearSelection}
|
2021-09-20 13:14:05 +00:00
|
|
|
activeCollection={activeCollection}
|
2021-10-05 09:48:05 +00:00
|
|
|
isFavoriteCollection={isFavoriteCollection(
|
|
|
|
activeCollection,
|
|
|
|
collections
|
|
|
|
)}
|
2021-09-20 11:16:48 +00:00
|
|
|
/>
|
|
|
|
)}
|
2021-10-26 11:12:32 +00:00
|
|
|
{activeCollection === TRASH_SECTION && trash?.length > 0 && (
|
2021-10-26 07:35:12 +00:00
|
|
|
<DeleteBtn onClick={emptyTrashHandler} />
|
|
|
|
)}
|
2021-05-30 16:35:12 +00:00
|
|
|
</FullScreenDropZone>
|
|
|
|
</GalleryContext.Provider>
|
2021-01-13 05:31:02 +00:00
|
|
|
);
|
2020-09-12 21:53:41 +00:00
|
|
|
}
|