From febca55f25e748af2fd1f36dd91f67bd57812ce5 Mon Sep 17 00:00:00 2001 From: Aman Harwara Date: Sat, 2 Jul 2022 01:48:30 +0530 Subject: [PATCH] feat(web): file view auto-rename on title change(#1192) --- .../FileView/FileViewWithoutProtection.tsx | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/packages/web/src/javascripts/Components/FileView/FileViewWithoutProtection.tsx b/packages/web/src/javascripts/Components/FileView/FileViewWithoutProtection.tsx index ce5d0af52..cfe0e61f1 100644 --- a/packages/web/src/javascripts/Components/FileView/FileViewWithoutProtection.tsx +++ b/packages/web/src/javascripts/Components/FileView/FileViewWithoutProtection.tsx @@ -1,31 +1,32 @@ import { ElementIds } from '@/Constants/ElementIDs' import { observer } from 'mobx-react-lite' -import { ChangeEventHandler, FormEventHandler, useCallback, useEffect, useState } from 'react' +import { ChangeEventHandler, useCallback, useRef } from 'react' import AttachedFilesButton from '@/Components/AttachedFilesPopover/AttachedFilesButton' import FileOptionsPanel from '@/Components/FileContextMenu/FileOptionsPanel' import FilePreview from '@/Components/FilePreview/FilePreview' import { FileViewProps } from './FileViewProps' +const SyncTimeoutNoDebounceMs = 100 +const SyncTimeoutDebounceMs = 350 + const FileViewWithoutProtection = ({ application, viewControllerManager, file }: FileViewProps) => { - const [name, setName] = useState(file.name) + const syncTimeoutRef = useRef() - useEffect(() => { - setName(file.name) - }, [file.name]) - - const onTitleChange: ChangeEventHandler = useCallback(async (event) => { - setName(event.target.value) - }, []) - - const onFormSubmit: FormEventHandler = useCallback( + const onTitleChange: ChangeEventHandler = useCallback( async (event) => { - event.preventDefault() + if (syncTimeoutRef.current) { + clearTimeout(syncTimeoutRef.current) + } - await application.items.renameFile(file, name) + const shouldNotDebounce = application.noAccount() + const syncDebounceMs = shouldNotDebounce ? SyncTimeoutNoDebounceMs : SyncTimeoutDebounceMs - void application.sync.sync() + syncTimeoutRef.current = window.setTimeout(async () => { + await application.items.renameFile(file, event.target.value) + void application.sync.sync() + }, syncDebounceMs) }, - [application.items, application.sync, file, name], + [application, file], ) return ( @@ -37,7 +38,7 @@ const FileViewWithoutProtection = ({ application, viewControllerManager, file }: >
-
+
- +