Skip to content

Commit 59b8368

Browse files
authored
Block Header should use waveEnv for context menu (for mocking) (#3041)
1 parent 52dd0a2 commit 59b8368

File tree

3 files changed

+24
-6
lines changed

3 files changed

+24
-6
lines changed

frontend/app/block/blockenv.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export type BlockEnv = WaveEnvSubset<{
1616
| "window:magnifiedblockblurprimarypx"
1717
| "window:magnifiedblockopacity"
1818
>;
19+
showContextMenu: WaveEnv["showContextMenu"];
1920
atoms: {
2021
modalOpen: WaveEnv["atoms"]["modalOpen"];
2122
controlShiftDelayAtom: WaveEnv["atoms"]["controlShiftDelayAtom"];

frontend/app/block/blockframe-header.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,26 @@ import {
1111
import { ConnectionButton } from "@/app/block/connectionbutton";
1212
import { DurableSessionFlyover } from "@/app/block/durable-session-flyover";
1313
import { getBlockBadgeAtom } from "@/app/store/badge";
14-
import { ContextMenuModel } from "@/app/store/contextmenu";
1514
import { recordTEvent, refocusNode } from "@/app/store/global";
1615
import { globalStore } from "@/app/store/jotaiStore";
1716
import { uxCloseBlock } from "@/app/store/keymodel";
1817
import { TabRpcClient } from "@/app/store/wshrpcutil";
1918
import { useWaveEnv } from "@/app/waveenv/waveenv";
20-
import { BlockEnv } from "./blockenv";
2119
import { IconButton } from "@/element/iconbutton";
2220
import { NodeModel } from "@/layout/index";
2321
import * as util from "@/util/util";
2422
import { cn, makeIconClass } from "@/util/util";
2523
import * as jotai from "jotai";
2624
import * as React from "react";
25+
import { BlockEnv } from "./blockenv";
2726
import { BlockFrameProps } from "./blocktypes";
2827

2928
function handleHeaderContextMenu(
3029
e: React.MouseEvent<HTMLDivElement>,
3130
blockId: string,
3231
viewModel: ViewModel,
33-
nodeModel: NodeModel
32+
nodeModel: NodeModel,
33+
blockEnv: BlockEnv
3434
) {
3535
e.preventDefault();
3636
e.stopPropagation();
@@ -59,7 +59,7 @@ function handleHeaderContextMenu(
5959
click: () => uxCloseBlock(blockId),
6060
}
6161
);
62-
ContextMenuModel.getInstance().showContextMenu(menu, e);
62+
blockEnv.showContextMenu(menu, e);
6363
}
6464

6565
type HeaderTextElemsProps = {
@@ -113,6 +113,7 @@ type HeaderEndIconsProps = {
113113
};
114114

115115
const HeaderEndIcons = React.memo(({ viewModel, nodeModel, blockId }: HeaderEndIconsProps) => {
116+
const blockEnv = useWaveEnv<BlockEnv>();
116117
const endIconButtons = util.useAtomValueSafe(viewModel?.endIconButtons);
117118
const magnified = jotai.useAtomValue(nodeModel.isMagnified);
118119
const ephemeral = jotai.useAtomValue(nodeModel.isEphemeral);
@@ -128,7 +129,7 @@ const HeaderEndIcons = React.memo(({ viewModel, nodeModel, blockId }: HeaderEndI
128129
elemtype: "iconbutton",
129130
icon: "cog",
130131
title: "Settings",
131-
click: (e) => handleHeaderContextMenu(e, blockId, viewModel, nodeModel),
132+
click: (e) => handleHeaderContextMenu(e, blockId, viewModel, nodeModel, blockEnv),
132133
};
133134
endIconsElem.push(<IconButton key="settings" decl={settingsDecl} className="block-frame-settings" />);
134135
if (ephemeral) {
@@ -211,7 +212,7 @@ const BlockFrame_Header = ({
211212
className={cn("block-frame-default-header", useTermHeader && "!pl-[2px]")}
212213
data-role="block-header"
213214
ref={dragHandleRef}
214-
onContextMenu={(e) => handleHeaderContextMenu(e, nodeModel.blockId, viewModel, nodeModel)}
215+
onContextMenu={(e) => handleHeaderContextMenu(e, nodeModel.blockId, viewModel, nodeModel, waveEnv)}
215216
>
216217
{!useTermHeader && (
217218
<>

frontend/preview/mock/mockwaveenv.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { previewElectronApi } from "./preview-electron-api";
2020
// is purely FE-based (registered via WPS on the frontend)
2121
// - rpc.GetMetaCommand -- reads .meta from the mock WOS atom for the given oref
2222
// - rpc.SetMetaCommand -- writes .meta to the mock WOS atom (null values delete keys)
23+
// - rpc.SetConfigCommand -- merges settings into fullConfigAtom (null values delete keys)
2324
// - rpc.UpdateTabNameCommand -- updates .name on the Tab WaveObj in the mock WOS
2425
// - rpc.UpdateWorkspaceTabIdsCommand -- updates .tabids on the Workspace WaveObj in the mock WOS
2526
//
@@ -173,6 +174,7 @@ function makeMockGlobalAtoms(
173174
type MockWosFns = {
174175
getWaveObjectAtom: <T extends WaveObj>(oref: string) => PrimitiveAtom<T>;
175176
mockSetWaveObj: <T extends WaveObj>(oref: string, obj: T) => void;
177+
fullConfigAtom: PrimitiveAtom<FullConfigType>;
176178
};
177179

178180
export function makeMockRpc(overrides: RpcOverrides, wos: MockWosFns): RpcApiType {
@@ -211,6 +213,19 @@ export function makeMockRpc(overrides: RpcOverrides, wos: MockWosFns): RpcApiTyp
211213
wos.mockSetWaveObj(tabORef, updated);
212214
return null;
213215
});
216+
dispatchMap.set("setconfig", async (_client, data: SettingsType) => {
217+
const current = globalStore.get(wos.fullConfigAtom);
218+
const updatedSettings = { ...(current?.settings ?? {}) };
219+
for (const [key, value] of Object.entries(data)) {
220+
if (value === null) {
221+
delete (updatedSettings as any)[key];
222+
} else {
223+
(updatedSettings as any)[key] = value;
224+
}
225+
}
226+
globalStore.set(wos.fullConfigAtom, { ...current, settings: updatedSettings as SettingsType });
227+
return null;
228+
});
214229
dispatchMap.set("updateworkspacetabids", async (_client, data: { args: [string, string[]] }) => {
215230
const [workspaceId, tabIds] = data.args;
216231
const wsORef = "workspace:" + workspaceId;
@@ -280,6 +295,7 @@ export function makeMockWaveEnv(mockEnv?: MockEnv): MockWaveEnv {
280295
});
281296
const mockWosFns: MockWosFns = {
282297
getWaveObjectAtom,
298+
fullConfigAtom: atoms.fullConfigAtom,
283299
mockSetWaveObj: <T extends WaveObj>(oref: string, obj: T) => {
284300
if (!waveObjectValueAtomCache.has(oref)) {
285301
waveObjectValueAtomCache.set(oref, atom(null as WaveObj));

0 commit comments

Comments
 (0)