Skip to content

Commit e771189

Browse files
authored
Merge pull request #196 from ls1intum/chore/cleanup-of-store-management
Chore/cleanup of store management
2 parents 2b5d85c + a1e2bf7 commit e771189

20 files changed

+225
-277
lines changed

library/lib/App.tsx

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import {
2626
useNodeDragStop,
2727
useConnect,
2828
useReconnect,
29-
useCanvasClickEvents,
3029
useElementInteractions,
3130
} from "./hooks"
3231
import { useDragOver } from "./hooks/useDragOver"
@@ -62,7 +61,6 @@ function App({ onReactFlowInit }: AppProps) {
6261
const { onConnect, onConnectEnd, onConnectStart, onEdgesDelete } =
6362
useConnect()
6463
const { onReconnect } = useReconnect()
65-
const { onNodeClick, onEdgeClick, onPaneClick } = useCanvasClickEvents()
6664
const { onBeforeDelete, onNodeDoubleClick, onEdgeDoubleClick } =
6765
useElementInteractions()
6866

@@ -98,19 +96,13 @@ function App({ onReactFlowInit }: AppProps) {
9896
maxZoom={MAX_SCALE_TO_ZOOM_IN}
9997
snapToGrid
10098
snapGrid={[SNAP_TO_GRID_PX, SNAP_TO_GRID_PX]}
101-
onNodeClick={onNodeClick}
102-
onEdgeClick={onEdgeClick}
10399
onNodeDoubleClick={onNodeDoubleClick}
104100
onEdgeDoubleClick={onEdgeDoubleClick}
105-
onPaneClick={onPaneClick}
106101
onBeforeDelete={onBeforeDelete}
107102
proOptions={proOptions}
108103
edgesReconnectable={isDiagramModifiable}
109104
nodesConnectable={isDiagramModifiable}
110105
nodesDraggable={isDiagramModifiable}
111-
elementsSelectable={isDiagramModifiable}
112-
edgesFocusable={isDiagramModifiable}
113-
nodesFocusable={isDiagramModifiable}
114106
>
115107
<CustomBackground />
116108
<CustomMiniMap />

library/lib/apollon-editor.tsx

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,21 @@ import {
1010
getDiagramBounds,
1111
} from "./utils"
1212
import { UMLDiagramType } from "./types"
13-
import { createDiagramStore, DiagramStore } from "./store/diagramStore"
14-
import { createMetadataStore, MetadataStore } from "./store/metadataStore"
13+
import { createDiagramStore, DiagramStore } from "@/store/diagramStore"
14+
import { createMetadataStore, MetadataStore } from "@/store/metadataStore"
15+
import { createPopoverStore, PopoverStore } from "@/store/popoverStore"
1516
import {
1617
DiagramStoreContext,
1718
MetadataStoreContext,
1819
PopoverStoreContext,
1920
} from "./store/context"
20-
import { YjsSyncClass } from "./store/yjsSync"
21+
import {
22+
MessageType,
23+
SendBroadcastMessage,
24+
YjsSyncClass,
25+
} from "@/sync/yjsSyncClass"
2126
import * as Y from "yjs"
2227
import { StoreApi } from "zustand"
23-
import { createPopoverStore } from "./store"
24-
import { PopoverStore } from "./store/popoverStore"
2528
import * as Apollon from "./typings"
2629

2730
export class ApollonEditor {
@@ -77,10 +80,10 @@ export class ApollonEditor {
7780
if (options?.mode) {
7881
this.metadataStore.getState().setMode(options.mode)
7982
}
80-
if (options?.enablePopups) {
81-
this.metadataStore.getState().setPopupEnabled(options.enablePopups)
83+
if (options?.enablePopups !== undefined) {
84+
this.popoverStore.getState().setPopupEnabled(options.enablePopups)
8285
}
83-
if (options?.readonly) {
86+
if (options?.readonly !== undefined) {
8487
this.metadataStore.getState().setReadonly(options.readonly)
8588
}
8689

@@ -269,8 +272,8 @@ export class ApollonEditor {
269272
}
270273
}
271274

272-
public sendBroadcastMessage(sendFn: (base64Data: string) => void) {
273-
this.syncManager.setSendFunction(sendFn)
275+
public sendBroadcastMessage(sendFn: SendBroadcastMessage) {
276+
this.syncManager.setSendBroadcastMessage(sendFn)
274277
}
275278

276279
public receiveBroadcastedMessage(base64Data: string) {
@@ -314,7 +317,7 @@ export class ApollonEditor {
314317
}
315318

316319
static generateInitialSyncMessage(): string {
317-
const syncMessage = new Uint8Array(new Uint8Array([0]))
320+
const syncMessage = new Uint8Array(new Uint8Array([MessageType.YjsSYNC]))
318321
return YjsSyncClass.uint8ToBase64(syncMessage)
319322
}
320323
}

library/lib/components/popovers/PopoverManager.tsx

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
import { useMetadataStore } from "@/store"
2-
import { useDiagramStore, usePopoverStore } from "@/store/context"
1+
import {
2+
useDiagramStore,
3+
usePopoverStore,
4+
useMetadataStore,
5+
} from "@/store/context"
36
import { ApollonMode } from "@/typings"
47
import { useShallow } from "zustand/shallow"
58
import {
@@ -65,35 +68,33 @@ export const PopoverManager = ({
6568
type,
6669
}: PopoverManagerProps) => {
6770
const viewportCenter = useViewportCenter()
68-
const { nodes, interactiveElementId, setInteractiveElementId } =
69-
useDiagramStore(
70-
useShallow((state) => ({
71-
nodes: state.nodes,
72-
interactiveElementId: state.interactiveElementId,
73-
setInteractiveElementId: state.setInteractiveElementId,
74-
}))
75-
)
76-
const { diagramMode, readonly } = useMetadataStore(
71+
const { nodes } = useDiagramStore(
7772
useShallow((state) => ({
78-
diagramMode: state.mode,
79-
readonly: state.readonly,
73+
nodes: state.nodes,
8074
}))
8175
)
82-
const { popoverElementId, setPopOverElementId } = usePopoverStore(
76+
77+
const { diagramMode, readonly } = useMetadataStore(
8378
useShallow((state) => ({
84-
popoverElementId: state.popoverElementId,
85-
setPopOverElementId: state.setPopOverElementId,
79+
diagramMode: state.mode,
80+
readonly: state.readonly,
8681
}))
8782
)
83+
const { popoverElementId, popupEnabled, setPopOverElementId } =
84+
usePopoverStore(
85+
useShallow((state) => ({
86+
popoverElementId: state.popoverElementId,
87+
popupEnabled: state.popupEnabled,
88+
setPopOverElementId: state.setPopOverElementId,
89+
}))
90+
)
8891

89-
if (!anchorEl) {
92+
if (!anchorEl || !popupEnabled) {
9093
return null
9194
}
9295

93-
const open =
94-
popoverElementId === elementId && elementId === interactiveElementId
96+
const open = popoverElementId === elementId
9597
const onClose = () => {
96-
setInteractiveElementId(null)
9798
setPopOverElementId(null)
9899
}
99100

library/lib/components/toolbars/edgeToolBar/CustomEdgeToolBar.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import { IPoint } from "@/edges"
22
import { useDiagramModifiable } from "@/hooks/useDiagramModifiable"
3-
import { useDiagramStore } from "@/store"
3+
import { useIsOnlyThisElementSelected } from "@/hooks/useIsOnlyThisElementSelected"
44
import DeleteOutlineOutlinedIcon from "@mui/icons-material/DeleteOutlineOutlined"
55
import EditIcon from "@mui/icons-material/Edit"
66
import { Box } from "@mui/material"
77
import { forwardRef, ForwardedRef } from "react"
8-
import { useShallow } from "zustand/shallow"
98

109
interface CustomEdgeToolbarProps {
1110
edgeId: string
@@ -20,12 +19,10 @@ export const CustomEdgeToolbar = forwardRef(
2019
{ edgeId, position, onEditClick, onDeleteClick }: CustomEdgeToolbarProps,
2120
ref: ForwardedRef<SVGForeignObjectElement>
2221
) => {
23-
const interactiveElementId = useDiagramStore(
24-
useShallow((state) => state.interactiveElementId)
25-
)
2622
const isDiagramModifiable = useDiagramModifiable()
2723

28-
const selected = interactiveElementId === edgeId
24+
const selected = useIsOnlyThisElementSelected(edgeId)
25+
2926
const showToolbar = selected && isDiagramModifiable
3027
const foreignObjectStyle = showToolbar
3128
? { borderRadius: 8, boxShadow: "0 0 4px 0 rgb(0 0 0 / .2)" }

library/lib/hooks/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,5 @@ export * from "./useNodeDragStop"
55
export * from "./useHandleOnResize"
66
export * from "./useEdges"
77
export * from "./useEdgeToolbar"
8-
export * from "./useCanvasClickEvents"
98
export * from "./useElementInteractions"
109
export * from "./useGoToNextAssessment"

library/lib/hooks/useCanvasClickEvents.ts

Lines changed: 0 additions & 39 deletions
This file was deleted.

library/lib/hooks/useElementInteractions.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useDiagramStore, usePopoverStore } from "@/store/context"
1+
import { usePopoverStore } from "@/store/context"
22
import {
33
NodeMouseHandler,
44
OnBeforeDelete,
@@ -16,11 +16,6 @@ export const useElementInteractions = () => {
1616
setPopOverElementId: state.setPopOverElementId,
1717
}))
1818
)
19-
const { setInteractiveElementId } = useDiagramStore(
20-
useShallow((state) => ({
21-
setInteractiveElementId: state.setInteractiveElementId,
22-
}))
23-
)
2419

2520
const onBeforeDelete: OnBeforeDelete = () => {
2621
if (isDiagramModifiable) {
@@ -30,12 +25,10 @@ export const useElementInteractions = () => {
3025
}
3126

3227
const onNodeDoubleClick: NodeMouseHandler<Node> = (_event, node) => {
33-
setInteractiveElementId(node.id)
3428
setPopOverElementId(node.id)
3529
}
3630

3731
const onEdgeDoubleClick: EdgeMouseHandler<Edge> = (_event, edge) => {
38-
setInteractiveElementId(edge.id)
3932
setPopOverElementId(edge.id)
4033
}
4134
return {

library/lib/hooks/useGoToNextAssessment.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import { useDiagramStore } from "@/store"
22
import { useShallow } from "zustand/shallow"
33
import { usePopoverStore } from "@/store/context"
4+
import { useReactFlow } from "@xyflow/react"
45

56
export const useGoToNextAssessment = (elementId: string) => {
6-
const { nodes, edges, setInteractiveElementId } = useDiagramStore(
7+
const { updateNode } = useReactFlow()
8+
const { nodes, edges } = useDiagramStore(
79
useShallow((state) => ({
810
nodes: state.nodes,
911
edges: state.edges,
10-
setInteractiveElementId: state.setInteractiveElementId,
1112
}))
1213
)
1314
const setPopOverElementId = usePopoverStore(
@@ -20,7 +21,8 @@ export const useGoToNextAssessment = (elementId: string) => {
2021
const totalElements = elements.length
2122
const nextIndex = (currentIndex + 1) % totalElements
2223
const nextElement = elements[nextIndex]
23-
setInteractiveElementId(nextElement.id)
24+
updateNode(elementId, { selected: false })
25+
updateNode(nextElement.id, { selected: true })
2426
setPopOverElementId(nextElement.id)
2527
}
2628

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { useDiagramStore } from "@/store"
2+
import { useShallow } from "zustand/shallow"
3+
4+
export const useIsOnlyThisElementSelected = (elementId: string) => {
5+
const { selectedElementIds } = useDiagramStore(
6+
useShallow((state) => ({
7+
selectedElementIds: state.selectedElementIds,
8+
}))
9+
)
10+
11+
return selectedElementIds.length === 1 && selectedElementIds[0] === elementId
12+
}

library/lib/nodes/TitleAndDescriptionNode.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,20 @@ export function TitleAndDesctiption({
1919
}
2020

2121
return (
22-
<DefaultNodeWrapper width={width} height={height} elementId={id}>
22+
<DefaultNodeWrapper
23+
width={width}
24+
height={height}
25+
elementId={id}
26+
selected={!!selected}
27+
>
2328
<TitleAndDescriptionSVG
2429
width={width}
2530
height={height}
2631
title={title}
2732
description={description || ""}
2833
/>
2934
<NodeResizer
30-
isVisible={selected}
35+
isVisible={!!selected}
3136
minHeight={200}
3237
handleStyle={{ width: 8, height: 8 }}
3338
/>

0 commit comments

Comments
 (0)