From f13115113d2c4d51b3d27a662ad59a74114485bb Mon Sep 17 00:00:00 2001 From: sawka Date: Thu, 1 Aug 2024 15:51:38 -0700 Subject: [PATCH] more refactoring (block header) --- frontend/app/block/blockframe.tsx | 246 +++++++++++++++--------------- 1 file changed, 125 insertions(+), 121 deletions(-) diff --git a/frontend/app/block/blockframe.tsx b/frontend/app/block/blockframe.tsx index 83329d9f..8bdb259e 100644 --- a/frontend/app/block/blockframe.tsx +++ b/frontend/app/block/blockframe.tsx @@ -13,7 +13,7 @@ import * as util from "@/util/util"; import clsx from "clsx"; import * as jotai from "jotai"; import * as React from "react"; -import { BlockFrameProps } from "./blocktypes"; +import { BlockFrameProps, LayoutComponentModel } from "./blocktypes"; function handleHeaderContextMenu( e: React.MouseEvent, @@ -62,55 +62,22 @@ function handleHeaderContextMenu( ContextMenuModel.showContextMenu(menu, e); } -const BlockFrame_Default_Component = ({ - blockId, - layoutModel, - viewModel, - blockModel, - preview, - numBlocksInTab, - children, -}: BlockFrameProps) => { - const [blockData] = WOS.useWaveObjectValue(WOS.makeORef("block", blockId)); - const settingsConfig = jotai.useAtomValue(atoms.settingsConfigAtom); - const isFocusedAtom = useBlockAtom(blockId, "isFocused", () => { - return jotai.atom((get) => { - const winData = get(atoms.waveWindow); - return winData?.activeblockid === blockId; - }); - }); - let isFocused = jotai.useAtomValue(isFocusedAtom); - const viewIconUnion = util.useAtomValueSafe(viewModel.viewIcon) ?? blockViewToIcon(blockData?.meta?.view); - const viewName = util.useAtomValueSafe(viewModel.viewName) ?? blockViewToName(blockData?.meta?.view); - const headerTextUnion = util.useAtomValueSafe(viewModel.viewText); - const preIconButton = util.useAtomValueSafe(viewModel.preIconButton); +function getViewIconElem(viewIconUnion: string | HeaderIconButton, blockData: Block): JSX.Element { + if (viewIconUnion == null || typeof viewIconUnion === "string") { + const viewIcon = viewIconUnion as string; + return
{getBlockHeaderIcon(viewIcon, blockData)}
; + } else { + return ; + } +} + +function computeEndIcons(blockData: Block, viewModel: ViewModel, layoutModel: LayoutComponentModel): JSX.Element[] { + const endIconsElem: JSX.Element[] = []; const endIconButtons = util.useAtomValueSafe(viewModel.endIconButtons); - const customBg = util.useAtomValueSafe(viewModel.blockBg); const tabId = globalStore.get(atoms.activeTabId); const tabAtom = WOS.getWaveObjectAtom(WOS.makeORef("tab", tabId)); const layoutTreeState = util.useAtomValueSafe(getLayoutStateAtomForTab(tabId, tabAtom)); - if (preview) { - isFocused = true; - } - const style: React.CSSProperties = {}; - if (!isFocused && blockData?.meta?.["frame:bordercolor"]) { - style.borderColor = blockData.meta["frame:bordercolor"]; - } - if (isFocused && blockData?.meta?.["frame:bordercolor:focused"]) { - style.borderColor = blockData.meta["frame:bordercolor:focused"]; - } - let viewIconElem: JSX.Element = null; - if (viewIconUnion == null || typeof viewIconUnion === "string") { - const viewIcon = viewIconUnion as string; - viewIconElem =
{getBlockHeaderIcon(viewIcon, blockData)}
; - } else { - viewIconElem = ; - } - let preIconButtonElem: JSX.Element = null; - if (preIconButton) { - preIconButtonElem = ; - } - const endIconsElem: JSX.Element[] = []; + if (endIconButtons && endIconButtons.length > 0) { endIconsElem.push( ...endIconButtons.map((button, idx) => ( @@ -128,7 +95,7 @@ const BlockFrame_Default_Component = ({ endIconsElem.push( ); - if (isBlockMagnified(layoutTreeState, blockId)) { + if (isBlockMagnified(layoutTreeState, blockData.oid)) { const magnifyDecl: HeaderIconButton = { elemtype: "iconbutton", icon: "regular@magnifying-glass-minus", @@ -148,57 +115,27 @@ const BlockFrame_Default_Component = ({ endIconsElem.push( ); + return endIconsElem; +} - function renderHeaderElements(headerTextUnion: HeaderElem[]): JSX.Element[] { - const headerTextElems: JSX.Element[] = []; +const BlockFrame_Header = ({ blockId, layoutModel, viewModel }: BlockFrameProps) => { + const [blockData] = WOS.useWaveObjectValue(WOS.makeORef("block", blockId)); + const viewName = util.useAtomValueSafe(viewModel.viewName) ?? blockViewToName(blockData?.meta?.view); + const settingsConfig = jotai.useAtomValue(atoms.settingsConfigAtom); + const viewIconUnion = util.useAtomValueSafe(viewModel.viewIcon) ?? blockViewToIcon(blockData?.meta?.view); + const preIconButton = util.useAtomValueSafe(viewModel.preIconButton); + const headerTextUnion = util.useAtomValueSafe(viewModel.viewText); - function renderElement(elem: HeaderElem, key: number): JSX.Element { - if (elem.elemtype == "iconbutton") { - return ( - - ); - } else if (elem.elemtype == "input") { - return ; - } else if (elem.elemtype == "text") { - return ( -
- {elem.text} -
- ); - } else if (elem.elemtype == "textbutton") { - return ( - - ); - } else if (elem.elemtype == "div") { - return ( -
- {elem.children.map((child, childIdx) => renderElement(child, childIdx))} -
- ); - } - return null; - } + const endIconsElem = computeEndIcons(blockData, viewModel, layoutModel); - for (let idx = 0; idx < headerTextUnion.length; idx++) { - const elem = headerTextUnion[idx]; - const renderedElement = renderElement(elem, idx); - if (renderedElement) { - headerTextElems.push(renderedElement); - } - } + const viewIconElem = getViewIconElem(viewIconUnion, blockData); + let preIconButtonElem: JSX.Element = null; + if (preIconButton) { + preIconButtonElem = ; + } - return headerTextElems; + function handleDoubleClick() { + layoutModel?.onMagnifyToggle(); } const headerTextElems: JSX.Element[] = []; @@ -214,10 +151,101 @@ const BlockFrame_Default_Component = ({ headerTextElems.push(...renderHeaderElements(headerTextUnion)); } - function handleDoubleClick() { - layoutModel?.onMagnifyToggle(); + return ( +
+ handleHeaderContextMenu(e, blockData, viewModel, layoutModel?.onMagnifyToggle, layoutModel?.onClose) + } + > + {preIconButtonElem} +
+ {viewIconElem} +
{viewName}
+ {settingsConfig?.blockheader?.showblockids && ( +
[{blockId.substring(0, 8)}]
+ )} +
+
{headerTextElems}
+
{endIconsElem}
+
+ ); +}; + +function renderHeaderElements(headerTextUnion: HeaderElem[]): JSX.Element[] { + const headerTextElems: JSX.Element[] = []; + + function renderElement(elem: HeaderElem, key: number): JSX.Element { + if (elem.elemtype == "iconbutton") { + return ( + + ); + } else if (elem.elemtype == "input") { + return ; + } else if (elem.elemtype == "text") { + return ( +
+ {elem.text} +
+ ); + } else if (elem.elemtype == "textbutton") { + return ( + + ); + } else if (elem.elemtype == "div") { + return ( +
+ {elem.children.map((child, childIdx) => renderElement(child, childIdx))} +
+ ); + } + return null; } + for (let idx = 0; idx < headerTextUnion.length; idx++) { + const elem = headerTextUnion[idx]; + const renderedElement = renderElement(elem, idx); + if (renderedElement) { + headerTextElems.push(renderedElement); + } + } + + return headerTextElems; +} + +const BlockFrame_Default_Component = (props: BlockFrameProps) => { + const { blockId, layoutModel, viewModel, blockModel, preview, numBlocksInTab, children } = props; + const [blockData] = WOS.useWaveObjectValue(WOS.makeORef("block", blockId)); + const isFocusedAtom = useBlockAtom(blockId, "isFocused", () => { + return jotai.atom((get) => { + const winData = get(atoms.waveWindow); + return winData?.activeblockid === blockId; + }); + }); + let isFocused = jotai.useAtomValue(isFocusedAtom); + const viewIconUnion = util.useAtomValueSafe(viewModel.viewIcon) ?? blockViewToIcon(blockData?.meta?.view); + const customBg = util.useAtomValueSafe(viewModel.blockBg); + if (preview) { + isFocused = true; + } + const style: React.CSSProperties = {}; + if (!isFocused && blockData?.meta?.["frame:bordercolor"]) { + style.borderColor = blockData.meta["frame:bordercolor"]; + } + if (isFocused && blockData?.meta?.["frame:bordercolor:focused"]) { + style.borderColor = blockData.meta["frame:bordercolor:focused"]; + } + const viewIconElem = getViewIconElem(viewIconUnion, blockData); + function handleKeyDown(e: React.KeyboardEvent) { const waveEvent = adaptFromReactOrNativeKeyEvent(e); if (checkKeyPressed(waveEvent, "Cmd:m")) { @@ -256,31 +284,7 @@ const BlockFrame_Default_Component = ({ >
-
- handleHeaderContextMenu( - e, - blockData, - viewModel, - layoutModel?.onMagnifyToggle, - layoutModel?.onClose - ) - } - > - {preIconButtonElem} -
- {viewIconElem} -
{viewName}
- {settingsConfig?.blockheader?.showblockids && ( -
[{blockId.substring(0, 8)}]
- )} -
-
{headerTextElems}
-
{endIconsElem}
-
+ {preview ? previewElem : children}