From fcb9e377c10923071177e7dedd9449f2c1e7b02c Mon Sep 17 00:00:00 2001 From: Johnny Date: Thu, 29 Jan 2026 23:34:40 +0800 Subject: [PATCH] chore: streamline memo editor insert menu --- .../MemoEditor/Toolbar/InsertMenu.tsx | 87 ++++++++++++------- 1 file changed, 55 insertions(+), 32 deletions(-) diff --git a/web/src/components/MemoEditor/Toolbar/InsertMenu.tsx b/web/src/components/MemoEditor/Toolbar/InsertMenu.tsx index 02d3ed893..d28c19b78 100644 --- a/web/src/components/MemoEditor/Toolbar/InsertMenu.tsx +++ b/web/src/components/MemoEditor/Toolbar/InsertMenu.tsx @@ -1,7 +1,7 @@ import { LatLng } from "leaflet"; import { uniqBy } from "lodash-es"; -import { FileIcon, LinkIcon, LoaderIcon, MapPinIcon, Maximize2Icon, MoreHorizontalIcon, PlusIcon } from "lucide-react"; -import { useEffect, useState } from "react"; +import { FileIcon, LinkIcon, LoaderIcon, MapPinIcon, Maximize2Icon, MoreHorizontalIcon, PlusIcon, type LucideIcon } from "lucide-react"; +import { useCallback, useEffect, useMemo, useState } from "react"; import { useDebounce } from "react-use"; import { useReverseGeocoding } from "@/components/map"; import { Button } from "@/components/ui/button"; @@ -26,6 +26,7 @@ import type { LocalFile } from "../types/attachment"; const InsertMenu = (props: InsertMenuProps) => { const t = useTranslate(); const { state, actions, dispatch } = useEditorContext(); + const { location: initialLocation, onLocationChange, onToggleFocusMode, isUploading: isUploadingProp } = props; const [linkDialogOpen, setLinkDialogOpen] = useState(false); const [locationDialogOpen, setLocationDialogOpen] = useState(false); @@ -70,11 +71,15 @@ const InsertMenu = (props: InsertMenuProps) => { } }, [displayName]); - const isUploading = selectingFlag || props.isUploading; + const isUploading = selectingFlag || isUploadingProp; - const handleLocationClick = () => { + const handleOpenLinkDialog = useCallback(() => { + setLinkDialogOpen(true); + }, []); + + const handleLocationClick = useCallback(() => { setLocationDialogOpen(true); - if (!props.location && !location.locationInitialized) { + if (!initialLocation && !location.locationInitialized) { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( (position) => { @@ -86,24 +91,54 @@ const InsertMenu = (props: InsertMenuProps) => { ); } } - }; + }, [initialLocation, location]); - const handleLocationConfirm = () => { + const handleLocationConfirm = useCallback(() => { const newLocation = location.getLocation(); if (newLocation) { - props.onLocationChange(newLocation); + onLocationChange(newLocation); setLocationDialogOpen(false); } - }; + }, [location, onLocationChange]); - const handleLocationCancel = () => { + const handleLocationCancel = useCallback(() => { location.reset(); setLocationDialogOpen(false); - }; + }, [location]); - const handlePositionChange = (position: LatLng) => { + const handlePositionChange = useCallback((position: LatLng) => { location.handlePositionChange(position); - }; + }, [location]); + + const handleToggleFocusMode = useCallback(() => { + onToggleFocusMode?.(); + setMoreSubmenuOpen(false); + }, [onToggleFocusMode]); + + const menuItems = useMemo( + () => + [ + { + key: "upload", + label: t("common.upload"), + icon: FileIcon, + onClick: handleUploadClick, + }, + { + key: "link", + label: t("tooltip.link-memo"), + icon: LinkIcon, + onClick: handleOpenLinkDialog, + }, + { + key: "location", + label: t("tooltip.select-location"), + icon: MapPinIcon, + onClick: handleLocationClick, + }, + ] satisfies Array<{ key: string; label: string; icon: LucideIcon; onClick: () => void }>, + [handleLocationClick, handleOpenLinkDialog, handleUploadClick, t], + ); return ( <> @@ -114,18 +149,12 @@ const InsertMenu = (props: InsertMenuProps) => { - - - {t("common.upload")} - - setLinkDialogOpen(true)}> - - {t("tooltip.link-memo")} - - - - {t("tooltip.select-location")} - + {menuItems.map((item) => ( + + + {item.label} + + ))} {/* View submenu with Focus Mode */} @@ -133,15 +162,9 @@ const InsertMenu = (props: InsertMenuProps) => { {t("common.more")} - { - props.onToggleFocusMode?.(); - setMoreSubmenuOpen(false); - }} - > + {t("editor.focus-mode")} - ⌘⇧F