From 5393eb71fecdafab524766612d7244c64625c25e Mon Sep 17 00:00:00 2001 From: Aman Harwara Date: Sat, 9 Jul 2022 16:07:20 +0530 Subject: [PATCH] feat: release Files view (#1236) --- .../javascripts/Application/Application.ts | 3 +-- .../ContentListView/FileListItem.tsx | 14 ++++++++++--- .../ContentListView/NoteListItem.tsx | 12 +++++++++-- .../FileContextMenu/FileMenuOptions.tsx | 19 ++++++++++++------ .../Components/FilePreview/ImagePreview.tsx | 1 + .../NotesContextMenu/NotesContextMenu.tsx | 2 +- .../Components/NotesOptions/NotesOptions.tsx | 15 ++++++++------ .../NotesOptions/NotesOptionsPanel.tsx | 2 +- .../Preferences/Panes/General/Labs/Labs.tsx | 20 ------------------- 9 files changed, 47 insertions(+), 41 deletions(-) diff --git a/packages/web/src/javascripts/Application/Application.ts b/packages/web/src/javascripts/Application/Application.ts index 76dac1fde..1de3a3dba 100644 --- a/packages/web/src/javascripts/Application/Application.ts +++ b/packages/web/src/javascripts/Application/Application.ts @@ -26,7 +26,6 @@ import { makeObservable, observable } from 'mobx' import { PanelResizedData } from '@/Types/PanelResizedData' import { WebAppEvent } from './WebAppEvent' import { isDesktopApplication } from '@/Utils' -import { storage, StorageKey } from '@/Services/LocalStorage' type WebServices = { viewControllerManager: ViewControllerManager @@ -63,7 +62,7 @@ export class WebApplication extends SNApplication { defaultHost: defaultSyncServerHost, appVersion: deviceInterface.appVersion, webSocketUrl: webSocketUrl, - supportsFileNavigation: storage.get(StorageKey.FilesNavigationEnabled) || false, + supportsFileNavigation: true, }) makeObservable(this, { diff --git a/packages/web/src/javascripts/Components/ContentListView/FileListItem.tsx b/packages/web/src/javascripts/Components/ContentListView/FileListItem.tsx index 8cc157c48..1788f187a 100644 --- a/packages/web/src/javascripts/Components/ContentListView/FileListItem.tsx +++ b/packages/web/src/javascripts/Components/ContentListView/FileListItem.tsx @@ -37,12 +37,20 @@ const FileListItem: FunctionComponent = ({ const openContextMenu = useCallback( async (posX: number, posY: number) => { - const { didSelect } = await selectionController.selectItem(item.uuid) - if (didSelect) { + let shouldOpenContextMenu = selected + + if (!selected) { + const { didSelect } = await selectionController.selectItem(item.uuid) + if (didSelect) { + shouldOpenContextMenu = true + } + } + + if (shouldOpenContextMenu) { openFileContextMenu(posX, posY) } }, - [selectionController, item.uuid, openFileContextMenu], + [selected, selectionController, item.uuid, openFileContextMenu], ) const onClick = useCallback(async () => { diff --git a/packages/web/src/javascripts/Components/ContentListView/NoteListItem.tsx b/packages/web/src/javascripts/Components/ContentListView/NoteListItem.tsx index 75a366f16..589a8d178 100644 --- a/packages/web/src/javascripts/Components/ContentListView/NoteListItem.tsx +++ b/packages/web/src/javascripts/Components/ContentListView/NoteListItem.tsx @@ -41,8 +41,16 @@ const NoteListItem: FunctionComponent = ({ } const openContextMenu = async (posX: number, posY: number) => { - const { didSelect } = await selectionController.selectItem(item.uuid, true) - if (didSelect) { + let shouldOpenContextMenu = selected + + if (!selected) { + const { didSelect } = await selectionController.selectItem(item.uuid) + if (didSelect) { + shouldOpenContextMenu = true + } + } + + if (shouldOpenContextMenu) { openNoteContextMenu(posX, posY) } } diff --git a/packages/web/src/javascripts/Components/FileContextMenu/FileMenuOptions.tsx b/packages/web/src/javascripts/Components/FileContextMenu/FileMenuOptions.tsx index 4c47fda79..7db3e5c84 100644 --- a/packages/web/src/javascripts/Components/FileContextMenu/FileMenuOptions.tsx +++ b/packages/web/src/javascripts/Components/FileContextMenu/FileMenuOptions.tsx @@ -34,6 +34,12 @@ const FileMenuOptions: FunctionComponent = ({ const { handleFileAction } = filesController const hasProtectedFiles = useMemo(() => selectedFiles.some((file) => file.protected), [selectedFiles]) + const hasSelectedMultipleFiles = useMemo(() => selectedFiles.length > 1, [selectedFiles.length]) + + const totalFileSize = useMemo( + () => selectedFiles.map((file) => file.decryptedSize).reduce((prev, next) => prev + next, 0), + [selectedFiles], + ) const onPreview = useCallback(() => { void handleFileAction({ @@ -149,16 +155,17 @@ const FileMenuOptions: FunctionComponent = ({ Delete permanently - {selectedFiles.length === 1 && ( -
+
+ {!hasSelectedMultipleFiles && (
File ID: {selectedFiles[0].uuid}
-
- Size: {formatSizeToReadableString(selectedFiles[0].decryptedSize)} -
+ )} +
+ {hasSelectedMultipleFiles ? 'Total Size:' : 'Size:'}{' '} + {formatSizeToReadableString(totalFileSize)}
- )} +
) } diff --git a/packages/web/src/javascripts/Components/FilePreview/ImagePreview.tsx b/packages/web/src/javascripts/Components/FilePreview/ImagePreview.tsx index b59bfa60a..4a725c1ec 100644 --- a/packages/web/src/javascripts/Components/FilePreview/ImagePreview.tsx +++ b/packages/web/src/javascripts/Components/FilePreview/ImagePreview.tsx @@ -28,6 +28,7 @@ const ImagePreview: FunctionComponent = ({ objectUrl }) => { top: 0, left: 0, margin: 'auto', + maxWidth: 'none', }), }} ref={(imgElement) => { diff --git a/packages/web/src/javascripts/Components/NotesContextMenu/NotesContextMenu.tsx b/packages/web/src/javascripts/Components/NotesContextMenu/NotesContextMenu.tsx index de57c139d..cafc4194a 100644 --- a/packages/web/src/javascripts/Components/NotesContextMenu/NotesContextMenu.tsx +++ b/packages/web/src/javascripts/Components/NotesContextMenu/NotesContextMenu.tsx @@ -45,7 +45,7 @@ const NotesContextMenu = ({ return contextMenuOpen ? (
+
{typeof words === 'number' && (format === 'txt' || format === 'md') ? ( <>
@@ -159,12 +159,15 @@ const NoteSizeWarning: FunctionComponent<{ note: SNNote }> = ({ note }) => { return new Blob([note.text]).size > NOTE_SIZE_WARNING_THRESHOLD ? ( -
- -
- This note may have trouble syncing to the mobile application due to its size. + <> + +
+ +
+ This note may have trouble syncing to the mobile application due to its size. +
-
+ ) : null } diff --git a/packages/web/src/javascripts/Components/NotesOptions/NotesOptionsPanel.tsx b/packages/web/src/javascripts/Components/NotesOptions/NotesOptionsPanel.tsx index 01a0da2a0..ca4cd173c 100644 --- a/packages/web/src/javascripts/Components/NotesOptions/NotesOptionsPanel.tsx +++ b/packages/web/src/javascripts/Components/NotesOptions/NotesOptionsPanel.tsx @@ -90,7 +90,7 @@ const NotesOptionsPanel = ({ }} className={`${ open ? 'flex' : 'hidden' - } max-h-120 slide-down-animation fixed min-w-80 max-w-xs flex-col overflow-y-auto rounded bg-default pt-2 shadow-main transition-transform duration-150`} + } max-h-120 slide-down-animation fixed min-w-80 max-w-xs flex-col overflow-y-auto rounded bg-default py-2 shadow-main transition-transform duration-150`} onBlur={closeOnBlur} tabIndex={FOCUSABLE_BUT_NOT_TABBABLE} > diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/General/Labs/Labs.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/General/Labs/Labs.tsx index ee77c0bcc..7e5b85c86 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/General/Labs/Labs.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/General/Labs/Labs.tsx @@ -6,7 +6,6 @@ import { usePremiumModal } from '@/Hooks/usePremiumModal' import PreferencesGroup from '../../../PreferencesComponents/PreferencesGroup' import PreferencesSegment from '../../../PreferencesComponents/PreferencesSegment' import LabsFeature from './LabsFeature' -import { StorageKey, useLocalStorageItem } from '@/Services/LocalStorage' import HorizontalSeparator from '@/Components/Shared/HorizontalSeparator' type ExperimentalFeatureItem = { @@ -25,7 +24,6 @@ type Props = { const LabsPane: FunctionComponent = ({ application }) => { const [experimentalFeatures, setExperimentalFeatures] = useState([]) - const [isFilesNavigationEnabled, setFilesNavigation] = useLocalStorageItem(StorageKey.FilesNavigationEnabled) const reloadExperimentalFeatures = useCallback(() => { const experimentalFeatures = application.features.getExperimentalFeatures().map((featureIdentifier) => { @@ -47,17 +45,6 @@ const LabsPane: FunctionComponent = ({ application }) => { const premiumModal = usePremiumModal() - const toggleFilesNavigation = useCallback(() => { - const isEntitled = application.features.getFeatureStatus(FeatureIdentifier.Files) === FeatureStatus.Entitled - - if (!isEntitled) { - premiumModal.activate('Files navigation') - return - } - - setFilesNavigation(!isFilesNavigationEnabled) - }, [application.features, isFilesNavigationEnabled, premiumModal, setFilesNavigation]) - return ( @@ -88,13 +75,6 @@ const LabsPane: FunctionComponent = ({ application }) => { ) })} - - {experimentalFeatures.length === 0 && (