update in link
This commit is contained in:
@@ -1,7 +1,8 @@
|
|||||||
import { useState, useMemo } from "react";
|
import { useState, useMemo, type ComponentType } from "react";
|
||||||
import { useEditorStore, type ToolType } from "@/pages/editor/store/editorStore";
|
import { useEditorStore, type ToolType } from "@/pages/editor/store/editorStore";
|
||||||
import Input from "@/components/Input";
|
import Input from "@/components/Input";
|
||||||
import Button from "@/components/Button";
|
import Button from "@/components/Button";
|
||||||
|
import Select from "@/components/Select";
|
||||||
import {
|
import {
|
||||||
Link,
|
Link,
|
||||||
ArrowCircleRight,
|
ArrowCircleRight,
|
||||||
@@ -17,20 +18,29 @@ type LinkType = "link" | "nextPage" | "prevPage" | "page" | "firstPage" | "lastP
|
|||||||
|
|
||||||
const linkTypesConfig: Record<
|
const linkTypesConfig: Record<
|
||||||
LinkType,
|
LinkType,
|
||||||
{ icon: React.ComponentType<{ size?: number; color?: string }>; label: string }
|
{ icon: ComponentType<{ size?: number; color?: string }>; label: string }
|
||||||
> = {
|
> = {
|
||||||
link: { icon: Link, label: "لینک" },
|
link: { icon: Link, label: "لینک" },
|
||||||
nextPage: { icon: ArrowCircleRight, label: "صفحه بعدی" },
|
nextPage: { icon: ArrowCircleRight, label: "صفحه بعدی" },
|
||||||
prevPage: { icon: ArrowCircleLeft, label: "صفحه قبلی" },
|
prevPage: { icon: ArrowCircleLeft, label: "صفحه قبلی" },
|
||||||
page: { icon: DocumentText, label: "صفحه" },
|
page: { icon: DocumentText, label: "صفحه" },
|
||||||
firstPage: { icon: ArrowLeft, label: "اولین صفحه" },
|
firstPage: { icon: ArrowLeft, label: "اولین صفحه" },
|
||||||
lastPrev: { icon: ArrowRight, label: "آخرین قبلی" },
|
lastPrev: { icon: ArrowRight, label: "آخرین صفحه" },
|
||||||
|
};
|
||||||
|
|
||||||
|
const internalLinkUrls: Partial<Record<LinkType, string>> = {
|
||||||
|
nextPage: "page://next",
|
||||||
|
prevPage: "page://prev",
|
||||||
|
firstPage: "page://first",
|
||||||
|
lastPrev: "page://last",
|
||||||
};
|
};
|
||||||
|
|
||||||
const LinkInput = () => {
|
const LinkInput = () => {
|
||||||
const [selectedLinkType, setSelectedLinkType] = useState<LinkType>("link");
|
const [selectedLinkType, setSelectedLinkType] = useState<LinkType>("link");
|
||||||
const [linkUrl, setLinkUrl] = useState("");
|
const [linkUrl, setLinkUrl] = useState("");
|
||||||
const [linkTitle, setLinkTitle] = useState("");
|
const [linkTitle, setLinkTitle] = useState("");
|
||||||
|
const [targetPageNumber, setTargetPageNumber] = useState("");
|
||||||
|
const pages = useEditorStore((state) => state.pages);
|
||||||
|
|
||||||
const linkTypes = useMemo(
|
const linkTypes = useMemo(
|
||||||
() =>
|
() =>
|
||||||
@@ -42,26 +52,55 @@ const LinkInput = () => {
|
|||||||
[]
|
[]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
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 handleAddLink = () => {
|
const handleAddLink = () => {
|
||||||
if (linkUrl.trim()) {
|
if (!resolvedLinkUrl) return;
|
||||||
const newLink = {
|
|
||||||
id: `link-${Date.now()}`,
|
const newLink = {
|
||||||
type: "link" as ToolType,
|
id: `link-${Date.now()}`,
|
||||||
x: 100,
|
type: "link" as ToolType,
|
||||||
y: 100,
|
x: 100,
|
||||||
text: linkTitle.trim() || linkUrl,
|
y: 100,
|
||||||
linkUrl: linkUrl,
|
text: linkTitle.trim() || defaultLinkText,
|
||||||
fontSize: 24,
|
linkUrl: resolvedLinkUrl,
|
||||||
fill: "#0000ff",
|
fontSize: 24,
|
||||||
fontWeight: "normal",
|
fill: "#0000ff",
|
||||||
};
|
fontWeight: "normal",
|
||||||
const { addObject, setSelectedObjectId, setTool } = useEditorStore.getState();
|
};
|
||||||
addObject(newLink);
|
const { addObject, setSelectedObjectId, setTool } = useEditorStore.getState();
|
||||||
setSelectedObjectId(newLink.id);
|
addObject(newLink);
|
||||||
setTool("select");
|
setSelectedObjectId(newLink.id);
|
||||||
setLinkUrl("");
|
setTool("select");
|
||||||
setLinkTitle("");
|
setLinkUrl("");
|
||||||
}
|
setLinkTitle("");
|
||||||
|
setTargetPageNumber("");
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -99,18 +138,31 @@ const LinkInput = () => {
|
|||||||
placeholder="عنوان لینک"
|
placeholder="عنوان لینک"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="space-y-2">
|
{selectedLinkType === "link" ? (
|
||||||
<h3 className="text-sm font-medium text-right">لینک</h3>
|
<div className="space-y-2">
|
||||||
<Input
|
<h3 className="text-sm font-medium text-right">لینک</h3>
|
||||||
value={linkUrl}
|
<Input
|
||||||
onChange={(e) => setLinkUrl(e.target.value)}
|
value={linkUrl}
|
||||||
placeholder="https://example.com"
|
onChange={(e) => setLinkUrl(e.target.value)}
|
||||||
onEnter={handleAddLink}
|
placeholder="https://example.com"
|
||||||
/>
|
onEnter={handleAddLink}
|
||||||
</div>
|
/>
|
||||||
|
</div>
|
||||||
|
) : null}
|
||||||
|
{selectedLinkType === "page" ? (
|
||||||
|
<div className="space-y-2">
|
||||||
|
<h3 className="text-sm font-medium text-right">انتخاب صفحه</h3>
|
||||||
|
<Select
|
||||||
|
value={targetPageNumber}
|
||||||
|
onChange={(e) => setTargetPageNumber(e.target.value)}
|
||||||
|
placeholder="صفحه مقصد را انتخاب کنید"
|
||||||
|
items={pageOptions}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
) : null}
|
||||||
<Button
|
<Button
|
||||||
onClick={handleAddLink}
|
onClick={handleAddLink}
|
||||||
disabled={!linkUrl.trim()}
|
disabled={isAddDisabled}
|
||||||
className="w-full"
|
className="w-full"
|
||||||
leftIcon={<Add size={20} color="white" />}
|
leftIcon={<Add size={20} color="white" />}
|
||||||
>
|
>
|
||||||
|
|||||||
Reference in New Issue
Block a user