import { useState } from "react"; import { Button, Popover, Input, Toast } from "@douyinfe/semi-ui"; import { IconEdit, IconCheckboxTick, IconDeleteStroked, } from "@douyinfe/semi-icons"; import { Tab, Action, ObjectType, tableThemes, defaultBlue, State, } from "../../data/constants"; import { useLayout, useSettings, useUndoRedo, useSelect, useAreas, useSaveState, useTransform, } from "../../hooks"; export default function Area({ data, onMouseDown, setResize, setInitCoords }) { const [hovered, setHovered] = useState(false); const { layout } = useLayout(); const { settings } = useSettings(); const { transform } = useTransform(); const { setSaveState } = useSaveState(); const { selectedElement, setSelectedElement } = useSelect(); const handleResize = (e, dir) => { setResize({ id: data.id, dir: dir }); setInitCoords({ x: data.x, y: data.y, width: data.width, height: data.height, mouseX: e.clientX / transform.zoom, mouseY: e.clientY / transform.zoom, }); }; const edit = () => { if (layout.sidebar) { setSelectedElement((prev) => ({ ...prev, element: ObjectType.AREA, id: data.id, currentTab: Tab.AREAS, open: true, })); if (selectedElement.currentTab !== Tab.AREAS) return; document .getElementById(`scroll_area_${data.id}`) .scrollIntoView({ behavior: "smooth" }); } else { setSelectedElement((prev) => ({ ...prev, element: ObjectType.AREA, id: data.id, open: true, })); } }; const onClickOutSide = () => { if (selectedElement.editFromToolbar) { setSelectedElement((prev) => ({ ...prev, editFromToolbar: false, })); return; } setSelectedElement((prev) => ({ ...prev, open: false, })); setSaveState(State.SAVING); }; const areaIsSelected = () => selectedElement.element === ObjectType.AREA && selectedElement.id === data.id && selectedElement.open; return ( setHovered(true)} onMouseLeave={() => setHovered(false)} > 0 ? data.width : 0} height={data.height > 0 ? data.height : 0} onMouseDown={onMouseDown} >
{data.name}
{(hovered || (areaIsSelected() && !layout.sidebar)) && (
} trigger="custom" position="rightTop" showArrow >
)} {hovered && ( <> handleResize(e, "tl")} /> handleResize(e, "tr")} /> handleResize(e, "bl")} /> handleResize(e, "br")} /> )} ); } function EditPopoverContent({ data }) { const [editField, setEditField] = useState({}); const { setSaveState } = useSaveState(); const { updateArea, deleteArea } = useAreas(); const { setUndoStack, setRedoStack } = useUndoRedo(); return (
Edit subject area
updateArea(data.id, { name: value })} onFocus={(e) => setEditField({ name: e.target.value })} onBlur={(e) => { if (e.target.value === editField.name) return; setUndoStack((prev) => [ ...prev, { action: Action.EDIT, element: ObjectType.AREA, aid: data.id, undo: editField, redo: { name: e.target.value }, message: `Edit area name to ${e.target.value}`, }, ]); setRedoStack([]); }} />
Theme

{tableThemes .slice(0, Math.ceil(tableThemes.length / 2)) .map((c) => ( ))}
{tableThemes .slice(Math.ceil(tableThemes.length / 2)) .map((c) => ( ))}
} position="rightTop" showArrow >
); }