From 121852ab20bc49e12b3ff645c9922d130e5549ad Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Sat, 13 Jun 2026 10:34:09 +0330 Subject: [PATCH] fix design links --- .../sidebar/instructions/LinkInput.tsx | 257 +++++++----------- 1 file changed, 105 insertions(+), 152 deletions(-) diff --git a/src/pages/editor/components/sidebar/instructions/LinkInput.tsx b/src/pages/editor/components/sidebar/instructions/LinkInput.tsx index 09894c5..604095d 100644 --- a/src/pages/editor/components/sidebar/instructions/LinkInput.tsx +++ b/src/pages/editor/components/sidebar/instructions/LinkInput.tsx @@ -1,177 +1,130 @@ -import { useState, useMemo, type ComponentType } from "react"; -import { useEditorStore, type ToolType } from "@/pages/editor/store/editorStore"; -import Input from "@/components/Input"; import Button from "@/components/Button"; +import Input from "@/components/Input"; import Select from "@/components/Select"; -import { - Link, - ArrowCircleRight, - ArrowCircleLeft, - DocumentText, - ArrowLeft, - ArrowRight, - Add, -} from "iconsax-react"; import { clx } from "@/helpers/utils"; +import { useEditorStore, type ToolType } from "@/pages/editor/store/editorStore"; +import { Add, ArrowCircleLeft, ArrowCircleRight, ArrowLeft, ArrowRight, DocumentText, Link } from "iconsax-react"; +import { useMemo, useState, type ComponentType } from "react"; type LinkType = "link" | "nextPage" | "prevPage" | "page" | "firstPage" | "lastPrev"; -const linkTypesConfig: Record< - LinkType, - { icon: ComponentType<{ size?: number; color?: string }>; label: string } -> = { - link: { icon: Link, label: "لینک" }, - nextPage: { icon: ArrowCircleRight, label: "صفحه بعدی" }, - prevPage: { icon: ArrowCircleLeft, label: "صفحه قبلی" }, - page: { icon: DocumentText, label: "صفحه" }, - firstPage: { icon: ArrowLeft, label: "اولین صفحه" }, - lastPrev: { icon: ArrowRight, label: "آخرین صفحه" }, +const linkTypesConfig: Record; label: string }> = { + link: { icon: Link, label: "لینک" }, + nextPage: { icon: ArrowCircleRight, label: "صفحه بعدی" }, + prevPage: { icon: ArrowCircleLeft, label: "صفحه قبلی" }, + page: { icon: DocumentText, label: "صفحه" }, + firstPage: { icon: ArrowLeft, label: "اولین صفحه" }, + lastPrev: { icon: ArrowRight, label: "آخرین صفحه" }, }; const internalLinkUrls: Partial> = { - nextPage: "page://next", - prevPage: "page://prev", - firstPage: "page://first", - lastPrev: "page://last", + nextPage: "page://next", + prevPage: "page://prev", + firstPage: "page://first", + lastPrev: "page://last", }; const LinkInput = () => { - const [selectedLinkType, setSelectedLinkType] = useState("link"); - const [linkUrl, setLinkUrl] = useState(""); - const [linkTitle, setLinkTitle] = useState(""); - const [targetPageNumber, setTargetPageNumber] = useState(""); - const pages = useEditorStore((state) => state.pages); + const [selectedLinkType, setSelectedLinkType] = useState("link"); + const [linkUrl, setLinkUrl] = useState(""); + const [linkTitle, setLinkTitle] = useState(""); + const [targetPageNumber, setTargetPageNumber] = useState(""); + const pages = useEditorStore((state) => state.pages); - const linkTypes = useMemo( - () => - (Object.entries(linkTypesConfig) as [LinkType, typeof linkTypesConfig[LinkType]][]) - .map(([type, config]) => ({ - type, - ...config, - })), - [] - ); + const linkTypes = useMemo( + () => + (Object.entries(linkTypesConfig) as [LinkType, (typeof linkTypesConfig)[LinkType]][]).map(([type, config]) => ({ + type, + ...config, + })), + [], + ); - const pageOptions = useMemo( - () => - pages.map((page, index) => ({ - value: String(index + 1), - label: page.name || `صفحه ${index + 1}`, - })), - [pages] - ); + const pageOptions = useMemo( + () => + pages.map((page, index) => ({ + value: String(index + 1), + label: page.name || `صفحه ${index + 1}`, + })), + [pages], + ); - const selectedLinkConfig = linkTypesConfig[selectedLinkType]; - const selectedPage = targetPageNumber - ? pageOptions.find((page) => page.value === targetPageNumber) - : undefined; - const resolvedLinkUrl = - selectedLinkType === "link" - ? linkUrl.trim() - : internalLinkUrls[selectedLinkType] ?? (targetPageNumber ? `page://${targetPageNumber}` : ""); - const defaultLinkText = - selectedLinkType === "link" - ? resolvedLinkUrl - : selectedLinkType === "page" - ? selectedPage?.label || selectedLinkConfig.label - : selectedLinkConfig.label; - const isAddDisabled = - selectedLinkType === "link" - ? !linkUrl.trim() - : selectedLinkType === "page" && !targetPageNumber; + const selectedLinkConfig = linkTypesConfig[selectedLinkType]; + const selectedPage = targetPageNumber ? pageOptions.find((page) => page.value === targetPageNumber) : undefined; + const resolvedLinkUrl = selectedLinkType === "link" ? linkUrl.trim() : (internalLinkUrls[selectedLinkType] ?? (targetPageNumber ? `page://${targetPageNumber}` : "")); + const defaultLinkText = selectedLinkType === "link" ? resolvedLinkUrl : selectedLinkType === "page" ? selectedPage?.label || selectedLinkConfig.label : selectedLinkConfig.label; + const isAddDisabled = selectedLinkType === "link" ? !linkUrl.trim() : selectedLinkType === "page" && !targetPageNumber; - const handleAddLink = () => { - if (!resolvedLinkUrl) return; + const handleAddLink = () => { + if (!resolvedLinkUrl) return; - const newLink = { - id: `link-${Date.now()}`, - type: "link" as ToolType, - x: 100, - y: 100, - text: linkTitle.trim() || defaultLinkText, - linkUrl: resolvedLinkUrl, - fontSize: 24, - fill: "#0000ff", - fontWeight: "normal", - }; - const { addObject, setSelectedObjectId, setTool } = useEditorStore.getState(); - addObject(newLink); - setSelectedObjectId(newLink.id); - setTool("select"); - setLinkUrl(""); - setLinkTitle(""); - setTargetPageNumber(""); + const newLink = { + id: `link-${Date.now()}`, + type: "link" as ToolType, + x: 100, + y: 100, + text: linkTitle.trim() || defaultLinkText, + linkUrl: resolvedLinkUrl, + fontSize: 24, + fill: "#0000ff", + fontWeight: "normal", }; + const { addObject, setSelectedObjectId, setTool } = useEditorStore.getState(); + addObject(newLink); + setSelectedObjectId(newLink.id); + setTool("select"); + setLinkUrl(""); + setLinkTitle(""); + setTargetPageNumber(""); + }; - return ( -
-

لینک ها

+ return ( +
+

لینک ها

-
- {linkTypes.map((item) => { - const isSelected = selectedLinkType === item.type; - const Icon = item.icon; - return ( - - ); - })} -
+
+ {linkTypes.map((item) => { + const isSelected = selectedLinkType === item.type; + const Icon = item.icon; + return ( + + ); + })} +
-
-
-

عنوان لینک

- setLinkTitle(e.target.value)} - placeholder="عنوان لینک" - /> -
- {selectedLinkType === "link" ? ( -
-

لینک

- setLinkUrl(e.target.value)} - placeholder="https://example.com" - onEnter={handleAddLink} - /> -
- ) : null} - {selectedLinkType === "page" ? ( -
-

انتخاب صفحه

- setLinkTitle(e.target.value)} placeholder="عنوان لینک" />
- ); + {selectedLinkType === "link" ? ( +
+

لینک

+ setLinkUrl(e.target.value)} placeholder="https://example.com" onEnter={handleAddLink} /> +
+ ) : null} + {selectedLinkType === "page" ? ( +
+

انتخاب صفحه

+