-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathCustomContextMenu.tsx
More file actions
114 lines (106 loc) · 3.2 KB
/
Copy pathCustomContextMenu.tsx
File metadata and controls
114 lines (106 loc) · 3.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import {
DefaultContextMenu,
TldrawUiMenuGroup,
TldrawUiMenuSubmenu,
TldrawUiMenuItem,
useEditor,
TLUiContextMenuProps,
DefaultContextMenuContent,
useValue,
} from "tldraw";
import type { TFile } from "obsidian";
import { usePlugin } from "~/components/PluginContext";
import { convertToDiscourseNode } from "./utils/convertToDiscourseNode";
import {
convertArrowToDiscourseRelation,
getValidRelationTypesForArrow,
} from "./utils/convertArrowToDiscourseRelation";
type CustomContextMenuProps = {
canvasFile: TFile;
props: TLUiContextMenuProps;
};
export const CustomContextMenu = ({
canvasFile,
props,
}: CustomContextMenuProps) => {
const editor = useEditor();
const plugin = usePlugin();
const selectedShape = useValue(
"selectedShape",
() => editor.getOnlySelectedShape(),
[editor],
);
const shouldShowConvertTo =
selectedShape &&
(selectedShape.type === "text" || selectedShape.type === "image");
const isReadonly = useValue(
"isReadonly",
() => editor.getInstanceState().isReadonly,
[editor],
);
const validRelationTypes = useValue(
"validRelationTypes",
() => {
if (!selectedShape || selectedShape.type !== "arrow") return [];
return getValidRelationTypesForArrow({
editor,
plugin,
arrowId: selectedShape.id,
});
},
[editor, plugin, selectedShape?.id, selectedShape?.type],
);
const shouldShowRelationMenu =
selectedShape?.type === "arrow" && validRelationTypes.length > 0;
return (
<DefaultContextMenu {...props}>
<DefaultContextMenuContent />
{shouldShowRelationMenu && (
<TldrawUiMenuGroup id="relation">
<TldrawUiMenuSubmenu id="relation-submenu" label="Relation">
{validRelationTypes.map((relationType) => (
<TldrawUiMenuItem
key={relationType.id}
id={`relation-${relationType.id}`}
label={relationType.label}
disabled={isReadonly}
onSelect={() => {
void convertArrowToDiscourseRelation({
editor,
plugin,
canvasFile,
arrowId: selectedShape.id,
relationTypeId: relationType.id,
});
}}
/>
))}
</TldrawUiMenuSubmenu>
</TldrawUiMenuGroup>
)}
{shouldShowConvertTo && (
<TldrawUiMenuGroup id="convert-to">
<TldrawUiMenuSubmenu id="convert-to-submenu" label="Convert To">
{plugin.settings.nodeTypes.map((nodeType) => (
<TldrawUiMenuItem
key={nodeType.id}
id={`convert-to-${nodeType.id}`}
label={"Convert to " + nodeType.name}
icon="file-type"
onSelect={() => {
void convertToDiscourseNode({
editor,
shape: selectedShape,
nodeType,
plugin,
canvasFile,
});
}}
/>
))}
</TldrawUiMenuSubmenu>
</TldrawUiMenuGroup>
)}
</DefaultContextMenu>
);
};