diff --git a/apps/client/src/layouts/desktop_layout.tsx b/apps/client/src/layouts/desktop_layout.tsx index 0e9a39caa..e2481fc55 100644 --- a/apps/client/src/layouts/desktop_layout.tsx +++ b/apps/client/src/layouts/desktop_layout.tsx @@ -123,8 +123,8 @@ export default class DesktopLayout { .child() .child() .child(new SpacerWidget(0, 1)) - .child(new MovePaneButton(true)) - .child(new MovePaneButton(false)) + .child() + .child() .child(new ClosePaneButton()) .child(new CreatePaneButton()) ) diff --git a/apps/client/src/widgets/buttons/move_pane_button.ts b/apps/client/src/widgets/buttons/move_pane_button.ts deleted file mode 100644 index b1df66991..000000000 --- a/apps/client/src/widgets/buttons/move_pane_button.ts +++ /dev/null @@ -1,55 +0,0 @@ -import OnClickButtonWidget from "./onclick_button.js"; -import appContext from "../../components/app_context.js"; -import { t } from "../../services/i18n.js"; - -export default class MovePaneButton extends OnClickButtonWidget { - - private isMovingLeft: boolean; - - constructor(isMovingLeft: boolean) { - super(); - - this.isMovingLeft = isMovingLeft; - - this.icon(isMovingLeft ? "bx-chevron-left" : "bx-chevron-right") - .title(isMovingLeft ? t("move_pane_button.move_left") : t("move_pane_button.move_right")) - .titlePlacement("bottom") - .onClick(async (widget, e) => { - e.stopPropagation(); - widget.triggerCommand("moveThisNoteSplit", { ntxId: widget.getClosestNtxId(), isMovingLeft: this.isMovingLeft }); - }) - .class("icon-action"); - } - - isEnabled() { - if (!super.isEnabled()) { - return false; - } - - if (this.isMovingLeft) { - // movable if the current context is not a main context, i.e. non-null mainNtxId - return !!this.noteContext?.mainNtxId; - } else { - const currentIndex = appContext.tabManager.noteContexts.findIndex((c) => c.ntxId === this.ntxId); - const nextContext = appContext.tabManager.noteContexts[currentIndex + 1]; - // movable if the next context is not null and not a main context, i.e. non-null mainNtxId - return !!nextContext?.mainNtxId; - } - } - - async noteContextRemovedEvent() { - this.refresh(); - } - - async newNoteContextCreatedEvent() { - this.refresh(); - } - - async noteContextReorderEvent() { - this.refresh(); - } - - async contextsReopenedEvent() { - this.refresh(); - } -} diff --git a/apps/client/src/widgets/buttons/move_pane_button.tsx b/apps/client/src/widgets/buttons/move_pane_button.tsx new file mode 100644 index 000000000..c6aecba5b --- /dev/null +++ b/apps/client/src/widgets/buttons/move_pane_button.tsx @@ -0,0 +1,44 @@ +import { useContext, useState } from "preact/hooks"; +import { t } from "../../services/i18n"; +import ActionButton from "../react/ActionButton"; +import { ParentComponent } from "../react/react_utils"; +import BasicWidget from "../basic_widget"; +import { useNoteContext, useTriliumEvents } from "../react/hooks"; +import appContext from "../../components/app_context"; + +interface MovePaneButtonProps { + direction: "left" | "right"; +} + +export default function MovePaneButton({ direction }: MovePaneButtonProps) { + const parentWidget = useContext(ParentComponent) as BasicWidget | undefined; + const { noteContext, ntxId } = useNoteContext(); + const [ refreshCounter, setRefreshCounter ] = useState(0); + + function isEnabled() { + if (direction === "left") { + // movable if the current context is not a main context, i.e. non-null mainNtxId + return !!noteContext?.mainNtxId; + } else { + const currentIndex = appContext.tabManager.noteContexts.findIndex((c) => c.ntxId === ntxId); + const nextContext = appContext.tabManager.noteContexts[currentIndex + 1]; + // movable if the next context is not null and not a main context, i.e. non-null mainNtxId + return !!nextContext?.mainNtxId; + } + } + + useTriliumEvents([ "noteContextRemoved", "newNoteContextCreated", "noteContextReorder", "contextsReopened" ], () => { + setRefreshCounter(refreshCounter + 1); + }); + + console.log("Refresh with ", isEnabled()); + + return ( + parentWidget?.triggerCommand("moveThisNoteSplit", { ntxId: parentWidget.getClosestNtxId(), isMovingLeft: direction === "left" }))} + className={!isEnabled() ? "hidden-ext" : ""} + /> + ); +}