@sqlrooms/kepler 0.26.1-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +3 -0
  3. package/dist/KeplerSlice.d.ts +86 -0
  4. package/dist/KeplerSlice.d.ts.map +1 -0
  5. package/dist/KeplerSlice.js +395 -0
  6. package/dist/KeplerSlice.js.map +1 -0
  7. package/dist/components/CustomDndContext.d.ts +11 -0
  8. package/dist/components/CustomDndContext.d.ts.map +1 -0
  9. package/dist/components/CustomDndContext.js +60 -0
  10. package/dist/components/CustomDndContext.js.map +1 -0
  11. package/dist/components/CustomFilterManager.d.ts +8 -0
  12. package/dist/components/CustomFilterManager.d.ts.map +1 -0
  13. package/dist/components/CustomFilterManager.js +85 -0
  14. package/dist/components/CustomFilterManager.js.map +1 -0
  15. package/dist/components/CustomInteractionManager.d.ts +5 -0
  16. package/dist/components/CustomInteractionManager.d.ts.map +1 -0
  17. package/dist/components/CustomInteractionManager.js +54 -0
  18. package/dist/components/CustomInteractionManager.js.map +1 -0
  19. package/dist/components/CustomLayerManager.d.ts +8 -0
  20. package/dist/components/CustomLayerManager.d.ts.map +1 -0
  21. package/dist/components/CustomLayerManager.js +111 -0
  22. package/dist/components/CustomLayerManager.js.map +1 -0
  23. package/dist/components/CustomMapManager.d.ts +7 -0
  24. package/dist/components/CustomMapManager.d.ts.map +1 -0
  25. package/dist/components/CustomMapManager.js +99 -0
  26. package/dist/components/CustomMapManager.js.map +1 -0
  27. package/dist/components/CustomTooltipConfig.d.ts +30 -0
  28. package/dist/components/CustomTooltipConfig.d.ts.map +1 -0
  29. package/dist/components/CustomTooltipConfig.js +85 -0
  30. package/dist/components/CustomTooltipConfig.js.map +1 -0
  31. package/dist/components/FileDropInput.d.ts +8 -0
  32. package/dist/components/FileDropInput.d.ts.map +1 -0
  33. package/dist/components/FileDropInput.js +35 -0
  34. package/dist/components/FileDropInput.js.map +1 -0
  35. package/dist/components/KeplerAddDataDialog.d.ts +24 -0
  36. package/dist/components/KeplerAddDataDialog.d.ts.map +1 -0
  37. package/dist/components/KeplerAddDataDialog.js +60 -0
  38. package/dist/components/KeplerAddDataDialog.js.map +1 -0
  39. package/dist/components/KeplerAddTileSetDialog.d.ts +14 -0
  40. package/dist/components/KeplerAddTileSetDialog.d.ts.map +1 -0
  41. package/dist/components/KeplerAddTileSetDialog.js +20 -0
  42. package/dist/components/KeplerAddTileSetDialog.js.map +1 -0
  43. package/dist/components/KeplerImageExport.d.ts +10 -0
  44. package/dist/components/KeplerImageExport.d.ts.map +1 -0
  45. package/dist/components/KeplerImageExport.js +30 -0
  46. package/dist/components/KeplerImageExport.js.map +1 -0
  47. package/dist/components/KeplerInjector.d.ts +2 -0
  48. package/dist/components/KeplerInjector.d.ts.map +1 -0
  49. package/dist/components/KeplerInjector.js +17 -0
  50. package/dist/components/KeplerInjector.js.map +1 -0
  51. package/dist/components/KeplerMapContainer.d.ts +5 -0
  52. package/dist/components/KeplerMapContainer.d.ts.map +1 -0
  53. package/dist/components/KeplerMapContainer.js +76 -0
  54. package/dist/components/KeplerMapContainer.js.map +1 -0
  55. package/dist/components/KeplerPlotContainer.d.ts +6 -0
  56. package/dist/components/KeplerPlotContainer.d.ts.map +1 -0
  57. package/dist/components/KeplerPlotContainer.js +33 -0
  58. package/dist/components/KeplerPlotContainer.js.map +1 -0
  59. package/dist/components/KeplerProvider.d.ts +7 -0
  60. package/dist/components/KeplerProvider.d.ts.map +1 -0
  61. package/dist/components/KeplerProvider.js +22 -0
  62. package/dist/components/KeplerProvider.js.map +1 -0
  63. package/dist/components/KeplerS3Browser.d.ts +19 -0
  64. package/dist/components/KeplerS3Browser.d.ts.map +1 -0
  65. package/dist/components/KeplerS3Browser.js +69 -0
  66. package/dist/components/KeplerS3Browser.js.map +1 -0
  67. package/dist/components/KeplerSidePanels.d.ts +9 -0
  68. package/dist/components/KeplerSidePanels.d.ts.map +1 -0
  69. package/dist/components/KeplerSidePanels.js +15 -0
  70. package/dist/components/KeplerSidePanels.js.map +1 -0
  71. package/dist/hooks/useDndEffects.d.ts +10 -0
  72. package/dist/hooks/useDndEffects.d.ts.map +1 -0
  73. package/dist/hooks/useDndEffects.js +52 -0
  74. package/dist/hooks/useDndEffects.js.map +1 -0
  75. package/dist/hooks/useDndLayers.d.ts +10 -0
  76. package/dist/hooks/useDndLayers.d.ts.map +1 -0
  77. package/dist/hooks/useDndLayers.js +53 -0
  78. package/dist/hooks/useDndLayers.js.map +1 -0
  79. package/dist/hooks/useKeplerStateActions.d.ts +17 -0
  80. package/dist/hooks/useKeplerStateActions.d.ts.map +1 -0
  81. package/dist/hooks/useKeplerStateActions.js +14 -0
  82. package/dist/hooks/useKeplerStateActions.js.map +1 -0
  83. package/dist/index.d.ts +17 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +17 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/styles/theme.d.ts +468 -0
  88. package/dist/styles/theme.d.ts.map +1 -0
  89. package/dist/styles/theme.js +78 -0
  90. package/dist/styles/theme.js.map +1 -0
  91. package/package.json +70 -0
package/LICENSE.md ADDED
@@ -0,0 +1,9 @@
1
+ MIT License
2
+
3
+ Copyright 2025 Ilya Boyandin
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ SQLRooms integration for [Kepler.gl](http://kepler.gl)
2
+
3
+ Refer to the [Kepler integration example](https://github.com/sqlrooms/examples/tree/main/kepler).
@@ -0,0 +1,86 @@
1
+ import { VectorTileDatasetMetadata } from '@kepler.gl/constants';
2
+ import { Layer } from '@kepler.gl/layers';
3
+ import { KeplerGlState } from '@kepler.gl/reducers';
4
+ import { AddDataToMapPayload } from '@kepler.gl/types';
5
+ import { KeplerApplicationConfig } from '@kepler.gl/utils';
6
+ import { KeplerMapSchema, KeplerSliceConfig } from '@sqlrooms/kepler-config';
7
+ import { RoomShellSliceState, type StateCreator } from '@sqlrooms/room-shell';
8
+ import type { AnyAction, Store as ReduxStore } from 'redux';
9
+ import { Dispatch, Middleware } from 'redux';
10
+ import { ReduxLoggerOptions } from 'redux-logger';
11
+ export type KeplerGLBasicProps = {
12
+ mapboxApiAccessToken?: string;
13
+ };
14
+ export type CreateKeplerSliceOptions = {
15
+ config?: Partial<KeplerSliceConfig>;
16
+ initialKeplerState?: Partial<KeplerGlState>;
17
+ basicKeplerProps?: Partial<KeplerGLBasicProps>;
18
+ actionLogging?: boolean | ReduxLoggerOptions;
19
+ middlewares?: Middleware[];
20
+ applicationConfig?: KeplerApplicationConfig;
21
+ /**
22
+ * Called when a kepler action is dispatched
23
+ * @param mapId - The map id
24
+ * @param action - The action
25
+ */
26
+ onAction?: (mapId: string, action: KeplerAction) => void;
27
+ };
28
+ export declare function createDefaultKeplerConfig(props?: Partial<KeplerSliceConfig>): KeplerSliceConfig;
29
+ export type KeplerAction = {
30
+ type: string;
31
+ payload?: unknown;
32
+ };
33
+ export declare function hasMapId(action: KeplerAction): action is KeplerAction & {
34
+ payload: {
35
+ meta: {
36
+ _id_: string;
37
+ };
38
+ };
39
+ };
40
+ export type KeplerGlReduxState = {
41
+ [id: string]: KeplerGlState;
42
+ };
43
+ export type KeplerSliceState = {
44
+ kepler: {
45
+ config: KeplerSliceConfig;
46
+ map: KeplerGlReduxState;
47
+ basicKeplerProps?: Partial<KeplerGLBasicProps>;
48
+ forwardDispatch: {
49
+ [mapId: string]: Dispatch;
50
+ };
51
+ initialize: () => Promise<void>;
52
+ setConfig: (config: KeplerSliceConfig) => void;
53
+ /**
54
+ * Update the datasets in all the kepler map so that they correspond to
55
+ * the latest table schemas in the database
56
+ */
57
+ syncKeplerDatasets: () => Promise<void>;
58
+ addLayer: (mapId: string, layer: Layer, datasetId: string) => void;
59
+ addTableToMap: (mapId: string, tableName: string, options?: AddDataToMapPayload['options']) => Promise<void>;
60
+ addTileSetToMap: (mapId: string, tableName: string, tileset: {
61
+ name: string;
62
+ type: string;
63
+ metadata: VectorTileDatasetMetadata;
64
+ }, tileMetadata: Record<string, any>) => void;
65
+ addConfigToMap: (mapId: string, config: KeplerMapSchema) => void;
66
+ removeDatasetFromMaps: (datasetId: string) => void;
67
+ dispatchAction: (mapId: string, action: KeplerAction) => void;
68
+ setCurrentMapId: (mapId: string) => void;
69
+ /**
70
+ * Create a new map and return the map id
71
+ * @param name - The name of the map
72
+ * @returns The map id
73
+ */
74
+ createMap: (name?: string) => string;
75
+ deleteMap: (mapId: string) => void;
76
+ renameMap: (mapId: string, name: string) => void;
77
+ getCurrentMap: () => KeplerMapSchema | undefined;
78
+ registerKeplerMapIfNotExists: (mapId: string) => void;
79
+ __reduxProviderStore: ReduxStore<KeplerGlReduxState, AnyAction> | undefined;
80
+ };
81
+ };
82
+ export declare function createKeplerSlice({ basicKeplerProps, config: initialConfigProps, initialKeplerState, actionLogging, middlewares: additionalMiddlewares, applicationConfig, onAction, }?: CreateKeplerSliceOptions): StateCreator<KeplerSliceState>;
83
+ type RoomStateWithDiscuss = RoomShellSliceState & KeplerSliceState;
84
+ export declare function useStoreWithKepler<T>(selector: (state: RoomStateWithDiscuss) => T): T;
85
+ export {};
86
+ //# sourceMappingURL=KeplerSlice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeplerSlice.d.ts","sourceRoot":"","sources":["../src/KeplerSlice.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,395 @@
1
+ import { addDataToMap, deleteEntry, ActionTypes as KeplerActionTypes, registerEntry, removeDataset, requestMapStyles, wrapTo, addLayer as addLayerAction, } from '@kepler.gl/actions';
2
+ import { ALL_FIELD_TYPES } from '@kepler.gl/constants';
3
+ import { castDuckDBTypesForKepler, getDuckDBColumnTypes, getDuckDBColumnTypesMap, restoreGeoarrowMetadata, setGeoArrowWKBExtension, } from '@kepler.gl/duckdb';
4
+ import { arrowSchemaToFields } from '@kepler.gl/processors';
5
+ import { INITIAL_UI_STATE, keplerGlReducer, } from '@kepler.gl/reducers';
6
+ import KeplerGLSchemaManager from '@kepler.gl/schemas';
7
+ import { KeplerTable } from '@kepler.gl/table';
8
+ import { initApplicationConfig, } from '@kepler.gl/utils';
9
+ import { createId } from '@paralleldrive/cuid2';
10
+ import { createSlice, useBaseRoomShellStore, } from '@sqlrooms/room-shell';
11
+ import { produce } from 'immer';
12
+ import { taskMiddleware } from 'react-palm/tasks';
13
+ import { compose } from 'redux';
14
+ import { createLogger } from 'redux-logger';
15
+ class DesktopKeplerTable extends KeplerTable {
16
+ static getInputDataValidator = function () {
17
+ // Default validator accepts only string timestamps
18
+ return (d) => d;
19
+ };
20
+ }
21
+ export function createDefaultKeplerConfig(props) {
22
+ const mapId = createId();
23
+ return {
24
+ maps: [
25
+ {
26
+ id: mapId,
27
+ name: 'Untitled Map',
28
+ config: undefined,
29
+ },
30
+ ],
31
+ currentMapId: mapId,
32
+ ...props,
33
+ };
34
+ }
35
+ export function hasMapId(action) {
36
+ return (typeof action.payload === 'object' &&
37
+ action.payload !== null &&
38
+ 'meta' in action.payload &&
39
+ typeof action.payload.meta === 'object' &&
40
+ action.payload.meta !== null &&
41
+ '_id_' in action.payload.meta);
42
+ }
43
+ // Auto save will be triggered in middleware on every kepler action
44
+ // skip these actions to avoid unnecessary save
45
+ const SKIP_AUTO_SAVE_ACTIONS = [
46
+ KeplerActionTypes.LAYER_HOVER,
47
+ KeplerActionTypes.UPDATE_MAP,
48
+ ];
49
+ export function createKeplerSlice({ basicKeplerProps = {}, config: initialConfigProps, initialKeplerState = {
50
+ mapStyle: { styleType: 'positron' },
51
+ uiState: {
52
+ ...INITIAL_UI_STATE,
53
+ currentModal: null,
54
+ mapControls: {
55
+ visibleLayers: INITIAL_UI_STATE.mapControls.visibleLayers,
56
+ mapLegend: {
57
+ show: true,
58
+ active: false,
59
+ },
60
+ toggle3d: {
61
+ show: true,
62
+ active: false,
63
+ },
64
+ },
65
+ },
66
+ }, actionLogging = false, middlewares: additionalMiddlewares = [], applicationConfig, onAction, } = {}) {
67
+ const initialConfig = createDefaultKeplerConfig(initialConfigProps);
68
+ initApplicationConfig({
69
+ table: DesktopKeplerTable,
70
+ ...applicationConfig,
71
+ });
72
+ return createSlice((set, get) => {
73
+ const keplerReducer = keplerGlReducer.initialState(initialKeplerState);
74
+ const middlewares = [
75
+ taskMiddleware,
76
+ saveKeplerConfigMiddleware,
77
+ ...additionalMiddlewares,
78
+ ];
79
+ if (actionLogging) {
80
+ const logger = createLogger(actionLogging === true ? { collapsed: true } : actionLogging);
81
+ middlewares.push(logger);
82
+ }
83
+ const storeDispatch = (action) => {
84
+ set((state) => ({
85
+ ...state,
86
+ kepler: {
87
+ ...state.kepler,
88
+ map: keplerReducer(state.kepler.map, action),
89
+ },
90
+ }));
91
+ // Call onAction if it's defined
92
+ const mapId = hasMapId(action) ? action.payload.meta._id_ : undefined;
93
+ if (!mapId)
94
+ throw new Error('Map ID not found in action payload');
95
+ onAction?.(mapId, action);
96
+ return action;
97
+ };
98
+ // const forwardDispatch: {[id: string]: Dispatch} = {};
99
+ return {
100
+ kepler: {
101
+ config: initialConfig,
102
+ basicKeplerProps,
103
+ map: {},
104
+ dispatchAction: () => { },
105
+ __reduxProviderStore: undefined,
106
+ forwardDispatch: {},
107
+ setConfig: (config) => {
108
+ set((state) => produce(state, (draft) => {
109
+ draft.kepler.config = config;
110
+ }));
111
+ updateMapReduxStates();
112
+ updateForwardDispatch();
113
+ updateMapConfigs();
114
+ get().kepler.syncKeplerDatasets();
115
+ },
116
+ async initialize() {
117
+ const config = get().kepler.config;
118
+ const currentMapId = config.currentMapId;
119
+ const keplerInitialState = keplerReducer(undefined, registerEntry({ id: currentMapId }));
120
+ set({
121
+ kepler: {
122
+ ...get().kepler,
123
+ map: keplerInitialState,
124
+ dispatchAction: (mid, action) => {
125
+ // wrapDispatch(wrapTo(mapId)(action));
126
+ const dispatchToMap = get().kepler.forwardDispatch[mid];
127
+ if (dispatchToMap) {
128
+ dispatchToMap(wrapTo(mid, action));
129
+ }
130
+ else {
131
+ console.error('dispatchAction: mapId not found', mid);
132
+ }
133
+ },
134
+ __reduxProviderStore: {
135
+ dispatch: storeDispatch,
136
+ getState: () => get().kepler.map || {},
137
+ subscribe: () => () => { },
138
+ replaceReducer: () => { },
139
+ // @ts-ignore
140
+ [Symbol.observable]: () => { },
141
+ },
142
+ },
143
+ });
144
+ updateForwardDispatch();
145
+ updateMapConfigs();
146
+ await get().kepler.syncKeplerDatasets();
147
+ requestMapStyle(config.currentMapId);
148
+ },
149
+ addLayer: (mapId, layer, datasetId) => {
150
+ get().kepler.registerKeplerMapIfNotExists(mapId);
151
+ get().kepler.dispatchAction(mapId, addLayerAction(layer, datasetId));
152
+ },
153
+ addTableToMap: async (mapId, tableName, options = {}) => {
154
+ const connector = await get().db.getConnector();
155
+ const duckDbColumns = await getDuckDBColumnTypes({
156
+ query: (query) => connector.query(query).result,
157
+ }, tableName);
158
+ const tableDuckDBTypes = getDuckDBColumnTypesMap(duckDbColumns);
159
+ const adjustedQuery = castDuckDBTypesForKepler(tableName, duckDbColumns);
160
+ const arrowResult = await connector.query(adjustedQuery).result;
161
+ setGeoArrowWKBExtension(arrowResult, duckDbColumns);
162
+ // TODO remove once DuckDB doesn't drop geoarrow metadata
163
+ restoreGeoarrowMetadata(arrowResult, {});
164
+ const fields = arrowSchemaToFields(arrowResult, tableDuckDBTypes);
165
+ const cols = Array.from({ length: arrowResult.numCols }, (_, i) => arrowResult.getChildAt(i)).filter((col) => col);
166
+ if (fields && cols) {
167
+ const datasets = {
168
+ data: { fields, cols, rows: [], arrowTable: arrowResult },
169
+ info: { label: tableName, id: tableName },
170
+ metadata: { tableName },
171
+ };
172
+ get().kepler.dispatchAction(mapId, addDataToMap({ datasets, options }));
173
+ }
174
+ },
175
+ getCurrentMap: () => {
176
+ return get().kepler.config.maps.find((map) => map.id === get().kepler.config.currentMapId);
177
+ },
178
+ setCurrentMapId: (mapId) => {
179
+ return set((state) => produce(state, (draft) => {
180
+ draft.kepler.config.currentMapId = mapId;
181
+ }));
182
+ },
183
+ createMap: (name) => {
184
+ const mapId = createId();
185
+ set((state) => produce(state, (draft) => {
186
+ draft.kepler.config.maps.push({
187
+ id: mapId,
188
+ name: name ?? 'Untitled Map',
189
+ });
190
+ draft.kepler.map = keplerReducer(draft.kepler.map, registerEntry({ id: mapId }));
191
+ draft.kepler.forwardDispatch[mapId] = getForwardDispatch(mapId);
192
+ }));
193
+ requestMapStyle(mapId);
194
+ get().kepler.syncKeplerDatasets();
195
+ return mapId;
196
+ },
197
+ async syncKeplerDatasets() {
198
+ for (const mapId of Object.keys(get().kepler.map)) {
199
+ const keplerDatasets = get().kepler.map[mapId]?.visState.datasets;
200
+ for (const { table } of get().db.tables) {
201
+ // TODO: remove this once getDuckDBColumnTypesMap can handle qualified table names
202
+ // const qualifiedTable = table.toString();
203
+ if (
204
+ // !table.schema?.startsWith('__') && // skip internal schemas
205
+ // !keplerDatasets?.[qualifiedTable]
206
+ table.schema === 'main' &&
207
+ !keplerDatasets?.[table.table]) {
208
+ await get().kepler.addTableToMap(mapId, table.table, {
209
+ autoCreateLayers: false,
210
+ centerMap: false,
211
+ });
212
+ }
213
+ }
214
+ }
215
+ },
216
+ deleteMap: (mapId) => {
217
+ set((state) => produce(state, (draft) => {
218
+ draft.kepler.config.maps = draft.kepler.config.maps.filter((map) => map.id !== mapId);
219
+ draft.kepler.map = keplerReducer(draft.kepler.map, deleteEntry(mapId));
220
+ delete draft.kepler.forwardDispatch[mapId];
221
+ }));
222
+ },
223
+ renameMap: (mapId, name) => {
224
+ set((state) => produce(state, (draft) => {
225
+ const map = draft.kepler.config.maps.find((map) => map.id === mapId);
226
+ if (map) {
227
+ map.name = name;
228
+ }
229
+ }));
230
+ },
231
+ addDataToMap: (mapId, data) => {
232
+ get().kepler.registerKeplerMapIfNotExists(mapId);
233
+ get().kepler.dispatchAction(mapId, addDataToMap(data));
234
+ },
235
+ addTileSetToMap: (mapId, tableName, tileset, tileMetadata) => {
236
+ get().kepler.registerKeplerMapIfNotExists(mapId);
237
+ const dataset = {
238
+ info: {
239
+ label: tileset.name,
240
+ type: tileset.type,
241
+ format: 'rows',
242
+ // important for kepler to reload this tileset
243
+ id: tableName,
244
+ },
245
+ data: {
246
+ fields: tileMetadata?.fields || [],
247
+ rows: [],
248
+ },
249
+ metadata: {
250
+ // duckdb table name
251
+ tableName,
252
+ ...tileMetadata,
253
+ ...tileset.metadata,
254
+ },
255
+ // vector tile layer only supports gpu filtering for now
256
+ supportedFilterTypes: [
257
+ ALL_FIELD_TYPES.real,
258
+ ALL_FIELD_TYPES.integer,
259
+ ],
260
+ disableDataOperation: true,
261
+ };
262
+ get().kepler.dispatchAction(mapId, addDataToMap({
263
+ datasets: dataset,
264
+ options: {
265
+ autoCreateLayers: true,
266
+ centerMap: true,
267
+ },
268
+ }));
269
+ },
270
+ addConfigToMap: (mapId, config) => {
271
+ // if map not registered, register it
272
+ get().kepler.registerKeplerMapIfNotExists(mapId);
273
+ const parsedConfig = KeplerGLSchemaManager.parseSavedConfig(config);
274
+ if (!parsedConfig) {
275
+ throw new Error('Failed to parse config');
276
+ }
277
+ get().kepler.dispatchAction(mapId, addDataToMap({ config: parsedConfig, datasets: [] }));
278
+ },
279
+ registerKeplerMapIfNotExists(mapId) {
280
+ if (!get().kepler.map[mapId]) {
281
+ set({
282
+ kepler: {
283
+ ...get().kepler,
284
+ map: keplerReducer(get().kepler.map, registerEntry({ id: mapId })),
285
+ forwardDispatch: {
286
+ ...get().kepler.forwardDispatch,
287
+ [mapId]: getForwardDispatch(mapId),
288
+ },
289
+ },
290
+ });
291
+ requestMapStyle(mapId);
292
+ }
293
+ },
294
+ removeDatasetFromMaps: (datasetId) => {
295
+ for (const mapId of Object.keys(get().kepler.map)) {
296
+ const map = get().kepler.map[mapId];
297
+ if (map) {
298
+ get().kepler.dispatchAction(mapId, removeDataset(datasetId));
299
+ }
300
+ }
301
+ },
302
+ },
303
+ };
304
+ function requestMapStyle(mapId) {
305
+ const { mapStyle } = get().kepler.map[mapId] || {};
306
+ const style = mapStyle?.mapStyles[mapStyle.styleType];
307
+ if (style) {
308
+ get().kepler.dispatchAction(mapId, requestMapStyles({ [style.id]: style }));
309
+ }
310
+ }
311
+ function saveKeplerConfigMiddleware() {
312
+ return (next) => (action) => {
313
+ // get id from kepler action payload meta
314
+ const mapId = hasMapId(action) ? action.payload.meta._id_ : undefined;
315
+ if (!mapId)
316
+ throw new Error('Map ID not found in action payload');
317
+ const result = next(action);
318
+ if (!SKIP_AUTO_SAVE_ACTIONS.includes(action.type) && mapId) {
319
+ // save kepler config to store
320
+ set((state) => produce(state, (draft) => {
321
+ const mapToSave = draft.kepler.config.maps.find((map) => map.id === mapId);
322
+ if (mapToSave && state.kepler.map?.[mapId]) {
323
+ mapToSave.config = KeplerGLSchemaManager.getConfigToSave(state.kepler.map[mapId]);
324
+ }
325
+ }));
326
+ }
327
+ // save kepler config to local storage
328
+ return result;
329
+ };
330
+ }
331
+ function updateMapConfigs() {
332
+ const config = get().kepler.config;
333
+ const keplerMaps = config.maps;
334
+ for (const { id, config } of keplerMaps) {
335
+ if (config) {
336
+ get().kepler.addConfigToMap(id, config);
337
+ }
338
+ }
339
+ }
340
+ function updateMapReduxStates() {
341
+ set((state) => produce(state, (draft) => {
342
+ // Delete redux state of maps that are not in the config
343
+ for (const mapId of Object.keys(draft.kepler.map)) {
344
+ if (!draft.kepler.config.maps.some((map) => map.id === mapId)) {
345
+ draft.kepler.map = keplerReducer(draft.kepler.map, deleteEntry(mapId));
346
+ }
347
+ }
348
+ // Register redux state of maps that are not in the config
349
+ for (const map of draft.kepler.config.maps) {
350
+ if (!draft.kepler.map[map.id]) {
351
+ draft.kepler.map = keplerReducer(draft.kepler.map, registerEntry({ id: map.id }));
352
+ draft.kepler.forwardDispatch[map.id] = getForwardDispatch(map.id);
353
+ }
354
+ }
355
+ }));
356
+ }
357
+ function updateForwardDispatch() {
358
+ const config = get().kepler.config;
359
+ const currentMapId = config.currentMapId;
360
+ const forwardDispatch = {
361
+ [currentMapId]: getForwardDispatch(currentMapId),
362
+ };
363
+ if (config) {
364
+ for (const { id } of config.maps) {
365
+ forwardDispatch[id] = getForwardDispatch(id);
366
+ }
367
+ }
368
+ set((state) => produce(state, (draft) => {
369
+ draft.kepler.forwardDispatch = forwardDispatch;
370
+ }));
371
+ }
372
+ function getForwardDispatch(mapId) {
373
+ /** Adapted from applyMiddleware in redux */
374
+ let wrapDispatch = () => {
375
+ throw new Error('Dispatching while constructing your middleware is not allowed. ' +
376
+ 'Other middleware would not be applied to this dispatch.');
377
+ };
378
+ const wrapToMap = wrapTo(mapId);
379
+ const middlewareAPI = {
380
+ getState: get,
381
+ dispatch: (action, ...args) => {
382
+ // need to forward here as well
383
+ return wrapDispatch(wrapToMap(action), ...args);
384
+ },
385
+ };
386
+ const chain = middlewares.map((middleware) => middleware(middlewareAPI));
387
+ wrapDispatch = compose(...chain)(storeDispatch);
388
+ return wrapDispatch;
389
+ }
390
+ });
391
+ }
392
+ export function useStoreWithKepler(selector) {
393
+ return useBaseRoomShellStore((state) => selector(state));
394
+ }
395
+ //# sourceMappingURL=KeplerSlice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeplerSlice.js","sourceRoot":"","sources":["../src/KeplerSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n addDataToMap,\n deleteEntry,\n ActionTypes as KeplerActionTypes,\n registerEntry,\n removeDataset,\n requestMapStyles,\n wrapTo,\n addLayer as addLayerAction,\n} from '@kepler.gl/actions';\nimport {ALL_FIELD_TYPES, VectorTileDatasetMetadata} from '@kepler.gl/constants';\nimport {\n castDuckDBTypesForKepler,\n getDuckDBColumnTypes,\n getDuckDBColumnTypesMap,\n restoreGeoarrowMetadata,\n setGeoArrowWKBExtension,\n} from '@kepler.gl/duckdb';\nimport {Layer} from '@kepler.gl/layers';\nimport {arrowSchemaToFields} from '@kepler.gl/processors';\nimport {\n INITIAL_UI_STATE,\n keplerGlReducer,\n KeplerGlState,\n MapStyle,\n} from '@kepler.gl/reducers';\nimport KeplerGLSchemaManager from '@kepler.gl/schemas';\nimport {KeplerTable} from '@kepler.gl/table';\nimport {AddDataToMapPayload} from '@kepler.gl/types';\nimport {\n DatabaseConnection,\n initApplicationConfig,\n KeplerApplicationConfig,\n} from '@kepler.gl/utils';\nimport {createId} from '@paralleldrive/cuid2';\nimport {DuckDbSliceState} from '@sqlrooms/duckdb';\nimport {KeplerMapSchema, KeplerSliceConfig} from '@sqlrooms/kepler-config';\nimport {\n BaseRoomStoreState,\n createSlice,\n RoomShellSliceState,\n useBaseRoomShellStore,\n type StateCreator,\n} from '@sqlrooms/room-shell';\nimport * as arrow from 'apache-arrow';\nimport {produce} from 'immer';\nimport {taskMiddleware} from 'react-palm/tasks';\nimport type {\n Action,\n AnyAction,\n MiddlewareAPI,\n Store as ReduxStore,\n} from 'redux';\nimport {compose, Dispatch, Middleware} from 'redux';\nimport {createLogger, ReduxLoggerOptions} from 'redux-logger';\n\nclass DesktopKeplerTable extends KeplerTable {\n static getInputDataValidator = function () {\n // Default validator accepts only string timestamps\n return (d: any) => d;\n };\n}\n\nexport type KeplerGLBasicProps = {\n mapboxApiAccessToken?: string;\n};\n\nexport type CreateKeplerSliceOptions = {\n config?: Partial<KeplerSliceConfig>;\n initialKeplerState?: Partial<KeplerGlState>;\n basicKeplerProps?: Partial<KeplerGLBasicProps>;\n actionLogging?: boolean | ReduxLoggerOptions;\n middlewares?: Middleware[];\n applicationConfig?: KeplerApplicationConfig;\n /**\n * Called when a kepler action is dispatched\n * @param mapId - The map id\n * @param action - The action\n */\n onAction?: (mapId: string, action: KeplerAction) => void;\n};\n\nexport function createDefaultKeplerConfig(\n props?: Partial<KeplerSliceConfig>,\n): KeplerSliceConfig {\n const mapId = createId();\n return {\n maps: [\n {\n id: mapId,\n name: 'Untitled Map',\n config: undefined,\n },\n ],\n currentMapId: mapId,\n ...props,\n };\n}\n\nexport type KeplerAction = {\n type: string;\n payload?: unknown;\n};\n\nexport function hasMapId(action: KeplerAction): action is KeplerAction & {\n payload: {meta: {_id_: string}};\n} {\n return (\n typeof action.payload === 'object' &&\n action.payload !== null &&\n 'meta' in action.payload &&\n typeof action.payload.meta === 'object' &&\n action.payload.meta !== null &&\n '_id_' in action.payload.meta\n );\n}\n\n// support multiple kepler maps\nexport type KeplerGlReduxState = {[id: string]: KeplerGlState};\nexport type KeplerSliceState = {\n kepler: {\n config: KeplerSliceConfig;\n map: KeplerGlReduxState;\n basicKeplerProps?: Partial<KeplerGLBasicProps>;\n forwardDispatch: {\n [mapId: string]: Dispatch;\n };\n initialize: () => Promise<void>;\n setConfig: (config: KeplerSliceConfig) => void;\n /**\n * Update the datasets in all the kepler map so that they correspond to\n * the latest table schemas in the database\n */\n syncKeplerDatasets: () => Promise<void>;\n addLayer: (mapId: string, layer: Layer, datasetId: string) => void;\n addTableToMap: (\n mapId: string,\n tableName: string,\n options?: AddDataToMapPayload['options'],\n ) => Promise<void>;\n addTileSetToMap: (\n mapId: string,\n tableName: string,\n tileset: {\n name: string;\n type: string;\n metadata: VectorTileDatasetMetadata;\n },\n tileMetadata: Record<string, any>,\n ) => void;\n addConfigToMap: (mapId: string, config: KeplerMapSchema) => void;\n removeDatasetFromMaps: (datasetId: string) => void;\n dispatchAction: (mapId: string, action: KeplerAction) => void;\n setCurrentMapId: (mapId: string) => void;\n /**\n * Create a new map and return the map id\n * @param name - The name of the map\n * @returns The map id\n */\n createMap: (name?: string) => string;\n deleteMap: (mapId: string) => void;\n renameMap: (mapId: string, name: string) => void;\n getCurrentMap: () => KeplerMapSchema | undefined;\n registerKeplerMapIfNotExists: (mapId: string) => void;\n __reduxProviderStore: ReduxStore<KeplerGlReduxState, AnyAction> | undefined;\n };\n};\n\n// Auto save will be triggered in middleware on every kepler action\n// skip these actions to avoid unnecessary save\nconst SKIP_AUTO_SAVE_ACTIONS: string[] = [\n KeplerActionTypes.LAYER_HOVER,\n KeplerActionTypes.UPDATE_MAP,\n];\n\nexport function createKeplerSlice({\n basicKeplerProps = {},\n config: initialConfigProps,\n initialKeplerState = {\n mapStyle: {styleType: 'positron'} as MapStyle,\n uiState: {\n ...INITIAL_UI_STATE,\n currentModal: null,\n mapControls: {\n visibleLayers: INITIAL_UI_STATE.mapControls.visibleLayers,\n mapLegend: {\n show: true,\n active: false,\n },\n toggle3d: {\n show: true,\n active: false,\n },\n },\n },\n },\n actionLogging = false,\n middlewares: additionalMiddlewares = [],\n applicationConfig,\n onAction,\n}: CreateKeplerSliceOptions = {}): StateCreator<KeplerSliceState> {\n const initialConfig = createDefaultKeplerConfig(initialConfigProps);\n initApplicationConfig({\n table: DesktopKeplerTable,\n ...applicationConfig,\n });\n return createSlice<\n KeplerSliceState,\n BaseRoomStoreState & KeplerSliceState & DuckDbSliceState\n >((set, get) => {\n const keplerReducer = keplerGlReducer.initialState(initialKeplerState);\n const middlewares: Middleware[] = [\n taskMiddleware,\n saveKeplerConfigMiddleware,\n ...additionalMiddlewares,\n ];\n\n if (actionLogging) {\n const logger = createLogger(\n actionLogging === true ? {collapsed: true} : actionLogging,\n ) as Middleware;\n middlewares.push(logger);\n }\n\n const storeDispatch: Dispatch<KeplerAction> = (action) => {\n set((state: KeplerSliceState) => ({\n ...state,\n kepler: {\n ...state.kepler,\n map: keplerReducer(state.kepler.map, action),\n },\n }));\n\n // Call onAction if it's defined\n const mapId = hasMapId(action) ? action.payload.meta._id_ : undefined;\n if (!mapId) throw new Error('Map ID not found in action payload');\n onAction?.(mapId, action);\n return action;\n };\n // const forwardDispatch: {[id: string]: Dispatch} = {};\n return {\n kepler: {\n config: initialConfig,\n basicKeplerProps,\n map: {},\n dispatchAction: () => {},\n __reduxProviderStore: undefined,\n forwardDispatch: {},\n\n setConfig: (config: KeplerSliceConfig) => {\n set((state) =>\n produce(state, (draft) => {\n draft.kepler.config = config;\n }),\n );\n updateMapReduxStates();\n updateForwardDispatch();\n updateMapConfigs();\n get().kepler.syncKeplerDatasets();\n },\n\n async initialize() {\n const config = get().kepler.config;\n const currentMapId = config.currentMapId;\n const keplerInitialState: KeplerGlReduxState = keplerReducer(\n undefined,\n registerEntry({id: currentMapId}),\n );\n set({\n kepler: {\n ...get().kepler,\n map: keplerInitialState,\n dispatchAction: (mid, action) => {\n // wrapDispatch(wrapTo(mapId)(action));\n const dispatchToMap = get().kepler.forwardDispatch[mid];\n if (dispatchToMap) {\n dispatchToMap(wrapTo(mid, action));\n } else {\n console.error('dispatchAction: mapId not found', mid);\n }\n },\n __reduxProviderStore: {\n dispatch: storeDispatch,\n getState: () => get().kepler.map || {},\n subscribe: () => () => {},\n replaceReducer: () => {},\n // @ts-ignore\n [Symbol.observable]: () => {},\n },\n },\n });\n updateForwardDispatch();\n updateMapConfigs();\n await get().kepler.syncKeplerDatasets();\n requestMapStyle(config.currentMapId);\n },\n\n addLayer: (mapId, layer, datasetId) => {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n get().kepler.dispatchAction(mapId, addLayerAction(layer, datasetId));\n },\n\n addTableToMap: async (mapId, tableName, options = {}) => {\n const connector = await get().db.getConnector();\n const duckDbColumns = await getDuckDBColumnTypes(\n {\n query: (query: string) => connector.query(query).result,\n } as DatabaseConnection,\n tableName,\n );\n const tableDuckDBTypes = getDuckDBColumnTypesMap(duckDbColumns);\n const adjustedQuery = castDuckDBTypesForKepler(\n tableName,\n duckDbColumns,\n );\n const arrowResult = await connector.query(adjustedQuery).result;\n setGeoArrowWKBExtension(arrowResult, duckDbColumns);\n // TODO remove once DuckDB doesn't drop geoarrow metadata\n restoreGeoarrowMetadata(arrowResult, {});\n const fields = arrowSchemaToFields(arrowResult, tableDuckDBTypes);\n const cols = Array.from({length: arrowResult.numCols}, (_, i) =>\n arrowResult.getChildAt(i),\n ).filter((col) => col) as arrow.Vector[];\n\n if (fields && cols) {\n const datasets: AddDataToMapPayload['datasets'] = {\n data: {fields, cols, rows: [], arrowTable: arrowResult},\n info: {label: tableName, id: tableName},\n metadata: {tableName},\n };\n get().kepler.dispatchAction(\n mapId,\n addDataToMap({datasets, options}),\n );\n }\n },\n\n getCurrentMap: () => {\n return get().kepler.config.maps.find(\n (map) => map.id === get().kepler.config.currentMapId,\n );\n },\n\n setCurrentMapId: (mapId) => {\n return set((state) =>\n produce(state, (draft) => {\n draft.kepler.config.currentMapId = mapId;\n }),\n );\n },\n\n createMap: (name) => {\n const mapId = createId();\n set((state) =>\n produce(state, (draft) => {\n draft.kepler.config.maps.push({\n id: mapId,\n name: name ?? 'Untitled Map',\n });\n draft.kepler.map = keplerReducer(\n draft.kepler.map,\n registerEntry({id: mapId}),\n );\n draft.kepler.forwardDispatch[mapId] = getForwardDispatch(mapId);\n }),\n );\n requestMapStyle(mapId);\n get().kepler.syncKeplerDatasets();\n return mapId;\n },\n\n async syncKeplerDatasets() {\n for (const mapId of Object.keys(get().kepler.map)) {\n const keplerDatasets = get().kepler.map[mapId]?.visState.datasets;\n for (const {table} of get().db.tables) {\n // TODO: remove this once getDuckDBColumnTypesMap can handle qualified table names\n // const qualifiedTable = table.toString();\n if (\n // !table.schema?.startsWith('__') && // skip internal schemas\n // !keplerDatasets?.[qualifiedTable]\n table.schema === 'main' &&\n !keplerDatasets?.[table.table]\n ) {\n await get().kepler.addTableToMap(mapId, table.table, {\n autoCreateLayers: false,\n centerMap: false,\n });\n }\n }\n }\n },\n\n deleteMap: (mapId) => {\n set((state) =>\n produce(state, (draft) => {\n draft.kepler.config.maps = draft.kepler.config.maps.filter(\n (map) => map.id !== mapId,\n );\n draft.kepler.map = keplerReducer(\n draft.kepler.map,\n deleteEntry(mapId),\n );\n\n delete draft.kepler.forwardDispatch[mapId];\n }),\n );\n },\n\n renameMap: (mapId, name) => {\n set((state) =>\n produce(state, (draft) => {\n const map = draft.kepler.config.maps.find(\n (map) => map.id === mapId,\n );\n if (map) {\n map.name = name;\n }\n }),\n );\n },\n\n addDataToMap: (mapId: string, data: any) => {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n get().kepler.dispatchAction(mapId, addDataToMap(data));\n },\n\n addTileSetToMap: (mapId, tableName, tileset, tileMetadata) => {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n const dataset = {\n info: {\n label: tileset.name,\n type: tileset.type,\n format: 'rows',\n // important for kepler to reload this tileset\n id: tableName,\n },\n data: {\n fields: tileMetadata?.fields || [],\n rows: [],\n },\n metadata: {\n // duckdb table name\n tableName,\n ...tileMetadata,\n ...tileset.metadata,\n },\n // vector tile layer only supports gpu filtering for now\n supportedFilterTypes: [\n ALL_FIELD_TYPES.real,\n ALL_FIELD_TYPES.integer,\n ],\n disableDataOperation: true,\n };\n get().kepler.dispatchAction(\n mapId,\n addDataToMap({\n datasets: dataset,\n options: {\n autoCreateLayers: true,\n centerMap: true,\n },\n }),\n );\n },\n\n addConfigToMap: (mapId: string, config: any) => {\n // if map not registered, register it\n get().kepler.registerKeplerMapIfNotExists(mapId);\n const parsedConfig = KeplerGLSchemaManager.parseSavedConfig(config);\n if (!parsedConfig) {\n throw new Error('Failed to parse config');\n }\n get().kepler.dispatchAction(\n mapId,\n addDataToMap({config: parsedConfig, datasets: []}),\n );\n },\n\n registerKeplerMapIfNotExists(mapId: string) {\n if (!get().kepler.map[mapId]) {\n set({\n kepler: {\n ...get().kepler,\n map: keplerReducer(\n get().kepler.map,\n registerEntry({id: mapId}),\n ),\n forwardDispatch: {\n ...get().kepler.forwardDispatch,\n [mapId]: getForwardDispatch(mapId),\n },\n },\n });\n requestMapStyle(mapId);\n }\n },\n\n removeDatasetFromMaps: (datasetId: string) => {\n for (const mapId of Object.keys(get().kepler.map)) {\n const map = get().kepler.map[mapId];\n if (map) {\n get().kepler.dispatchAction(mapId, removeDataset(datasetId));\n }\n }\n },\n },\n };\n\n function requestMapStyle(mapId: string) {\n const {mapStyle} = get().kepler.map[mapId] || {};\n const style = mapStyle?.mapStyles[mapStyle.styleType];\n if (style) {\n get().kepler.dispatchAction(\n mapId,\n requestMapStyles({[style.id]: style}),\n );\n }\n }\n\n function saveKeplerConfigMiddleware() {\n return (next: (action: KeplerAction) => void) =>\n (action: KeplerAction) => {\n // get id from kepler action payload meta\n const mapId = hasMapId(action) ? action.payload.meta._id_ : undefined;\n if (!mapId) throw new Error('Map ID not found in action payload');\n const result = next(action);\n if (!SKIP_AUTO_SAVE_ACTIONS.includes(action.type) && mapId) {\n // save kepler config to store\n set((state) =>\n produce(state, (draft) => {\n const mapToSave = draft.kepler.config.maps.find(\n (map) => map.id === mapId,\n );\n if (mapToSave && state.kepler.map?.[mapId]) {\n mapToSave.config = KeplerGLSchemaManager.getConfigToSave(\n state.kepler.map[mapId],\n ) as any;\n }\n }),\n );\n }\n // save kepler config to local storage\n return result;\n };\n }\n\n function updateMapConfigs() {\n const config = get().kepler.config;\n const keplerMaps = config.maps;\n for (const {id, config} of keplerMaps) {\n if (config) {\n get().kepler.addConfigToMap(id, config as unknown as KeplerMapSchema);\n }\n }\n }\n\n function updateMapReduxStates() {\n set((state) =>\n produce(state, (draft) => {\n // Delete redux state of maps that are not in the config\n for (const mapId of Object.keys(draft.kepler.map)) {\n if (!draft.kepler.config.maps.some((map) => map.id === mapId)) {\n draft.kepler.map = keplerReducer(\n draft.kepler.map,\n deleteEntry(mapId),\n );\n }\n }\n // Register redux state of maps that are not in the config\n for (const map of draft.kepler.config.maps) {\n if (!draft.kepler.map[map.id]) {\n draft.kepler.map = keplerReducer(\n draft.kepler.map,\n registerEntry({id: map.id}),\n );\n draft.kepler.forwardDispatch[map.id] = getForwardDispatch(map.id);\n }\n }\n }),\n );\n }\n\n function updateForwardDispatch() {\n const config = get().kepler.config;\n const currentMapId = config.currentMapId;\n const forwardDispatch = {\n [currentMapId]: getForwardDispatch(currentMapId),\n };\n if (config) {\n for (const {id} of config.maps) {\n forwardDispatch[id] = getForwardDispatch(id);\n }\n }\n set((state) =>\n produce(state, (draft) => {\n draft.kepler.forwardDispatch = forwardDispatch;\n }),\n );\n }\n\n function getForwardDispatch(mapId: string): Dispatch<KeplerAction> {\n /** Adapted from applyMiddleware in redux */\n let wrapDispatch: (\n action: KeplerAction,\n ...args: any\n ) => KeplerAction = () => {\n throw new Error(\n 'Dispatching while constructing your middleware is not allowed. ' +\n 'Other middleware would not be applied to this dispatch.',\n );\n };\n const wrapToMap = wrapTo(mapId);\n const middlewareAPI: MiddlewareAPI<any, any> = {\n getState: get,\n dispatch: (action: Action, ...args: any) => {\n // need to forward here as well\n return wrapDispatch(wrapToMap(action), ...args);\n },\n };\n\n const chain = middlewares.map((middleware) => middleware(middlewareAPI));\n wrapDispatch = compose<Dispatch>(...chain)(storeDispatch);\n return wrapDispatch as Dispatch<KeplerAction>;\n }\n });\n}\n\ntype RoomStateWithDiscuss = RoomShellSliceState & KeplerSliceState;\n\nexport function useStoreWithKepler<T>(\n selector: (state: RoomStateWithDiscuss) => T,\n): T {\n return useBaseRoomShellStore<RoomStateWithDiscuss, T>((state) =>\n selector(state as RoomStateWithDiscuss),\n );\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import React, { PropsWithChildren } from 'react';
2
+ import { VisState } from '@kepler.gl/schemas';
3
+ import { LayerPanelHeaderFactory } from '@kepler.gl/components';
4
+ export type DndContextProps = PropsWithChildren<{
5
+ visState?: VisState;
6
+ }>;
7
+ export declare function CustomDndContextFactory(LayerPanelHeader: ReturnType<typeof LayerPanelHeaderFactory>): React.FC<DndContextProps>;
8
+ export declare namespace CustomDndContextFactory {
9
+ var deps: (typeof LayerPanelHeaderFactory)[];
10
+ }
11
+ //# sourceMappingURL=CustomDndContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomDndContext.d.ts","sourceRoot":"","sources":["../../src/components/CustomDndContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAuB,iBAAiB,EAAC,MAAM,OAAO,CAAC;AAGrE,OAAO,EAAC,QAAQ,EAAC,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EACL,uBAAuB,EAKxB,MAAM,uBAAuB,CAAC;AAY/B,MAAM,MAAM,eAAe,GAAG,iBAAiB,CAAC;IAC9C,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,CAAC,CAAC;AAEH,wBAAgB,uBAAuB,CACrC,gBAAgB,EAAE,UAAU,CAAC,OAAO,uBAAuB,CAAC,GAC3D,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,CA+G3B;yBAjHe,uBAAuB"}