88 type EditorState ,
99 initialEditorState ,
1010} from "./editor-context" ;
11+ import type { SelectionItem , SelectionMap } from "./selection" ;
1112import { useSyncEditorToSettings } from "./use-sync-editor-to-settings" ;
1213import { UserSettingsContext } from "./user-settings-context" ;
1314
@@ -44,7 +45,22 @@ export const EditorProvider: React.FC<EditorProviderProps> = ({ children }) => {
4445 } , 500 ) ;
4546 } ;
4647
47- const actions : EditorActions = {
48+ const setSelection = (
49+ selectionOrUpdater : SelectionMap | ( ( prev : SelectionMap ) => SelectionMap ) ,
50+ ) =>
51+ setState ( ( prev ) => {
52+ const selection =
53+ typeof selectionOrUpdater === "function"
54+ ? selectionOrUpdater ( prev . selection )
55+ : selectionOrUpdater ;
56+ const hasSelection = selection . size > 0 ;
57+ if ( prev . hasSelection !== hasSelection ) {
58+ triggerPanelAnimation ( ) ;
59+ }
60+ return { ...prev , selection, hasSelection } ;
61+ } ) ;
62+
63+ const actions : Omit < EditorActions , "isSelected" > = {
4864 setGlobalMode : ( mode ) =>
4965 setState ( ( prev ) => ( { ...prev , globalMode : mode } ) ) ,
5066 setEditionMode : ( mode ) =>
@@ -74,26 +90,39 @@ export const EditorProvider: React.FC<EditorProviderProps> = ({ children }) => {
7490 setState ( ( prev ) => ( { ...prev , bottomPanelHeight : height } ) ) ,
7591 setActiveBottomPanelTab : ( tab ) =>
7692 setState ( ( prev ) => ( { ...prev , activeBottomPanelTab : tab } ) ) ,
77- setSelectedResourceId : ( id ) => {
78- triggerPanelAnimation ( ) ;
79- setState ( ( prev ) => ( { ...prev , selectedResourceId : id } ) ) ;
93+ setSelection,
94+ selectItem : ( item : SelectionItem ) => {
95+ setState ( ( prev ) => {
96+ const newSelection : SelectionMap = new Map ( [ [ item . id , item ] ] ) ;
97+ if ( ! prev . hasSelection ) {
98+ triggerPanelAnimation ( ) ;
99+ }
100+ return { ...prev , selection : newSelection , hasSelection : true } ;
101+ } ) ;
80102 } ,
81- setSelectedItemIds : ( ids ) =>
82- setState ( ( prev ) => ( { ...prev , selectedItemIds : ids } ) ) ,
83- addSelectedItemId : ( id ) =>
103+ toggleItem : ( item : SelectionItem ) => {
84104 setState ( ( prev ) => {
85- const newSet = new Set ( prev . selectedItemIds ) ;
86- newSet . add ( id ) ;
87- return { ...prev , selectedItemIds : newSet } ;
88- } ) ,
89- removeSelectedItemId : ( id ) =>
105+ const newSelection = new Map ( prev . selection ) ;
106+ if ( newSelection . has ( item . id ) ) {
107+ newSelection . delete ( item . id ) ;
108+ } else {
109+ newSelection . set ( item . id , item ) ;
110+ }
111+ const hasSelection = newSelection . size > 0 ;
112+ if ( prev . hasSelection !== hasSelection ) {
113+ triggerPanelAnimation ( ) ;
114+ }
115+ return { ...prev , selection : newSelection , hasSelection } ;
116+ } ) ;
117+ } ,
118+ clearSelection : ( ) => {
90119 setState ( ( prev ) => {
91- const newSet = new Set ( prev . selectedItemIds ) ;
92- newSet . delete ( id ) ;
93- return { ... prev , selectedItemIds : newSet } ;
94- } ) ,
95- clearSelection : ( ) =>
96- setState ( ( prev ) => ( { ... prev , selectedItemIds : new Set ( ) } ) ) ,
120+ if ( prev . hasSelection ) {
121+ triggerPanelAnimation ( ) ;
122+ }
123+ return { ... prev , selection : new Map ( ) , hasSelection : false } ;
124+ } ) ;
125+ } ,
97126 setDraggingStateByNodeId : ( draggingState : DraggingStateByNodeId ) =>
98127 setState ( ( prev ) => ( { ...prev , draggingStateByNodeId : draggingState } ) ) ,
99128 updateDraggingStateByNodeId : ( updater ) =>
@@ -109,7 +138,8 @@ export const EditorProvider: React.FC<EditorProviderProps> = ({ children }) => {
109138 ...prev ,
110139 isLeftSidebarOpen : false ,
111140 isBottomPanelOpen : false ,
112- selectedResourceId : null ,
141+ selection : new Map ( ) ,
142+ hasSelection : false ,
113143 } ) ) ;
114144 } ,
115145 setTimelineChartType : ( chartType ) =>
@@ -129,9 +159,13 @@ export const EditorProvider: React.FC<EditorProviderProps> = ({ children }) => {
129159 timelineChartType : state . timelineChartType ,
130160 } ) ;
131161
162+ const { selection } = state ;
163+ const isSelected = ( id : string ) => selection . has ( id ) ;
164+
132165 const contextValue : EditorContextValue = {
133166 ...state ,
134167 ...actions ,
168+ isSelected,
135169 } ;
136170
137171 return (
0 commit comments