@motiadev/plugin-states 0.17.6-beta.188-583581 → 0.17.6-beta.188-710084
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.
- package/dist/index.js +176 -546
- package/dist/index.js.map +1 -1
- package/dist/plugin.js.map +1 -1
- package/package.json +5 -4
package/dist/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { c } from "react/compiler-runtime";
|
|
2
1
|
import { Button, Checkbox, Input, Sidebar, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, cn, useThemeStore } from "@motiadev/ui";
|
|
3
2
|
import { AlertCircle, Check, Loader2, RefreshCw, Save, Search, Trash, X } from "lucide-react";
|
|
4
3
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
@@ -9,70 +8,29 @@ import Editor, { useMonaco } from "@monaco-editor/react";
|
|
|
9
8
|
|
|
10
9
|
//#region src/hooks/states-hooks.ts
|
|
11
10
|
const useGetStateItems = () => {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
fetch("/__motia/state/delete", {
|
|
35
|
-
method: "POST",
|
|
36
|
-
headers: { "Content-Type": "application/json" },
|
|
37
|
-
body: JSON.stringify({ ids })
|
|
38
|
-
}).then(() => refetch());
|
|
39
|
-
};
|
|
40
|
-
$[3] = t2;
|
|
41
|
-
} else t2 = $[3];
|
|
42
|
-
const deleteItems = t2;
|
|
43
|
-
let t3;
|
|
44
|
-
let t4;
|
|
45
|
-
if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
|
|
46
|
-
t3 = () => {
|
|
47
|
-
refetch();
|
|
48
|
-
};
|
|
49
|
-
t4 = [refetch];
|
|
50
|
-
$[4] = t3;
|
|
51
|
-
$[5] = t4;
|
|
52
|
-
} else {
|
|
53
|
-
t3 = $[4];
|
|
54
|
-
t4 = $[5];
|
|
55
|
-
}
|
|
56
|
-
useEffect(t3, t4);
|
|
57
|
-
let t5;
|
|
58
|
-
if ($[6] !== items) {
|
|
59
|
-
t5 = {
|
|
60
|
-
items,
|
|
61
|
-
deleteItems,
|
|
62
|
-
refetch
|
|
63
|
-
};
|
|
64
|
-
$[6] = items;
|
|
65
|
-
$[7] = t5;
|
|
66
|
-
} else t5 = $[7];
|
|
67
|
-
return t5;
|
|
11
|
+
const [items, setItems] = useState([]);
|
|
12
|
+
const refetch = useCallback(() => {
|
|
13
|
+
fetch("/__motia/state").then(async (res) => {
|
|
14
|
+
if (res.ok) return res.json();
|
|
15
|
+
else throw await res.json();
|
|
16
|
+
}).then(setItems).catch((err) => console.error(err));
|
|
17
|
+
}, []);
|
|
18
|
+
const deleteItems = (ids) => {
|
|
19
|
+
fetch("/__motia/state/delete", {
|
|
20
|
+
method: "POST",
|
|
21
|
+
headers: { "Content-Type": "application/json" },
|
|
22
|
+
body: JSON.stringify({ ids })
|
|
23
|
+
}).then(() => refetch());
|
|
24
|
+
};
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
refetch();
|
|
27
|
+
}, [refetch]);
|
|
28
|
+
return {
|
|
29
|
+
items,
|
|
30
|
+
deleteItems,
|
|
31
|
+
refetch
|
|
32
|
+
};
|
|
68
33
|
};
|
|
69
|
-
async function _temp$2(res) {
|
|
70
|
-
if (res.ok) return res.json();
|
|
71
|
-
else throw await res.json();
|
|
72
|
-
}
|
|
73
|
-
function _temp2$1(err) {
|
|
74
|
-
return console.error(err);
|
|
75
|
-
}
|
|
76
34
|
|
|
77
35
|
//#endregion
|
|
78
36
|
//#region src/stores/use-states-store.ts
|
|
@@ -83,124 +41,48 @@ const useStatesStore = create()((set) => ({
|
|
|
83
41
|
|
|
84
42
|
//#endregion
|
|
85
43
|
//#region src/components/state-details.tsx
|
|
86
|
-
const StateDetails = (
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
$[0] = "5995831aa1bc747830da5e0bb4a1d2bc36c1eaf62fb9c2f142532ffec8710bf4";
|
|
91
|
-
}
|
|
92
|
-
const { state } = t0;
|
|
93
|
-
let t1;
|
|
94
|
-
if ($[1] !== state.value) {
|
|
95
|
-
t1 = /* @__PURE__ */ jsx(JsonView, {
|
|
96
|
-
src: state.value,
|
|
97
|
-
theme: "default"
|
|
98
|
-
});
|
|
99
|
-
$[1] = state.value;
|
|
100
|
-
$[2] = t1;
|
|
101
|
-
} else t1 = $[2];
|
|
102
|
-
return t1;
|
|
103
|
-
};
|
|
44
|
+
const StateDetails = ({ state }) => /* @__PURE__ */ jsx(JsonView, {
|
|
45
|
+
src: state.value,
|
|
46
|
+
theme: "default"
|
|
47
|
+
});
|
|
104
48
|
|
|
105
49
|
//#endregion
|
|
106
50
|
//#region src/components/json-editor.tsx
|
|
107
|
-
const JsonEditor = (
|
|
108
|
-
const $ = c(24);
|
|
109
|
-
if ($[0] !== "d1386dfeba00fe12241776daa47cf42300103748d5dcfe271adcb17c673326c6") {
|
|
110
|
-
for (let $i = 0; $i < 24; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
|
|
111
|
-
$[0] = "d1386dfeba00fe12241776daa47cf42300103748d5dcfe271adcb17c673326c6";
|
|
112
|
-
}
|
|
113
|
-
const { value, height: t1, schema, onChange, onValidate, language: t2, readOnly: t3 } = t0;
|
|
114
|
-
const height = t1 === void 0 ? 300 : t1;
|
|
115
|
-
const language = t2 === void 0 ? "json" : t2;
|
|
116
|
-
const readOnly = t3 === void 0 ? false : t3;
|
|
51
|
+
const JsonEditor = ({ value, height = 300, schema, onChange, onValidate, language = "json", readOnly = false }) => {
|
|
117
52
|
const monaco = useMonaco();
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
} else t5 = $[7];
|
|
146
|
-
useEffect(t4, t5);
|
|
147
|
-
let t6;
|
|
148
|
-
if ($[8] !== onChange || $[9] !== onValidate) {
|
|
149
|
-
t6 = (value_0) => {
|
|
150
|
-
if (!value_0) onValidate?.(false);
|
|
151
|
-
onChange?.(value_0 ?? "");
|
|
152
|
-
};
|
|
153
|
-
$[8] = onChange;
|
|
154
|
-
$[9] = onValidate;
|
|
155
|
-
$[10] = t6;
|
|
156
|
-
} else t6 = $[10];
|
|
157
|
-
let t7;
|
|
158
|
-
if ($[11] !== onValidate) {
|
|
159
|
-
t7 = (markers) => onValidate?.(markers.length === 0);
|
|
160
|
-
$[11] = onValidate;
|
|
161
|
-
$[12] = t7;
|
|
162
|
-
} else t7 = $[12];
|
|
163
|
-
let t8;
|
|
164
|
-
if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
|
|
165
|
-
t8 = { enabled: false };
|
|
166
|
-
$[13] = t8;
|
|
167
|
-
} else t8 = $[13];
|
|
168
|
-
let t9;
|
|
169
|
-
if ($[14] !== readOnly) {
|
|
170
|
-
t9 = {
|
|
53
|
+
const theme = useThemeStore((state) => state.theme);
|
|
54
|
+
const editorTheme = useMemo(() => theme === "dark" ? "vs-dark" : "light", [theme]);
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
if (!monaco) return;
|
|
57
|
+
monaco.languages.typescript.javascriptDefaults.setCompilerOptions({ isolatedModules: true });
|
|
58
|
+
monaco.languages.json.jsonDefaults.setDiagnosticsOptions({ schemas: schema ? [{
|
|
59
|
+
uri: window.location.href,
|
|
60
|
+
fileMatch: ["*"],
|
|
61
|
+
schema
|
|
62
|
+
}] : [] });
|
|
63
|
+
}, [
|
|
64
|
+
monaco,
|
|
65
|
+
schema,
|
|
66
|
+
language
|
|
67
|
+
]);
|
|
68
|
+
return /* @__PURE__ */ jsx(Editor, {
|
|
69
|
+
"data-testid": "json-editor",
|
|
70
|
+
height,
|
|
71
|
+
language,
|
|
72
|
+
value,
|
|
73
|
+
theme: editorTheme,
|
|
74
|
+
onChange: (value$1) => {
|
|
75
|
+
if (!value$1) onValidate?.(false);
|
|
76
|
+
onChange?.(value$1 ?? "");
|
|
77
|
+
},
|
|
78
|
+
onValidate: (markers) => onValidate?.(markers.length === 0),
|
|
79
|
+
options: {
|
|
171
80
|
readOnly,
|
|
172
81
|
scrollBeyondLastLine: false,
|
|
173
|
-
minimap:
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
$[15] = t9;
|
|
177
|
-
} else t9 = $[15];
|
|
178
|
-
let t10;
|
|
179
|
-
if ($[16] !== editorTheme || $[17] !== height || $[18] !== language || $[19] !== t6 || $[20] !== t7 || $[21] !== t9 || $[22] !== value) {
|
|
180
|
-
t10 = /* @__PURE__ */ jsx(Editor, {
|
|
181
|
-
"data-testid": "json-editor",
|
|
182
|
-
height,
|
|
183
|
-
language,
|
|
184
|
-
value,
|
|
185
|
-
theme: editorTheme,
|
|
186
|
-
onChange: t6,
|
|
187
|
-
onValidate: t7,
|
|
188
|
-
options: t9
|
|
189
|
-
});
|
|
190
|
-
$[16] = editorTheme;
|
|
191
|
-
$[17] = height;
|
|
192
|
-
$[18] = language;
|
|
193
|
-
$[19] = t6;
|
|
194
|
-
$[20] = t7;
|
|
195
|
-
$[21] = t9;
|
|
196
|
-
$[22] = value;
|
|
197
|
-
$[23] = t10;
|
|
198
|
-
} else t10 = $[23];
|
|
199
|
-
return t10;
|
|
82
|
+
minimap: { enabled: false }
|
|
83
|
+
}
|
|
84
|
+
});
|
|
200
85
|
};
|
|
201
|
-
function _temp$1(state) {
|
|
202
|
-
return state.theme;
|
|
203
|
-
}
|
|
204
86
|
|
|
205
87
|
//#endregion
|
|
206
88
|
//#region src/components/state-editor.tsx
|
|
@@ -324,402 +206,150 @@ const StateEditor = ({ state }) => {
|
|
|
324
206
|
|
|
325
207
|
//#endregion
|
|
326
208
|
//#region src/components/state-sidebar.tsx
|
|
327
|
-
const StateSidebar = (
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
const { state, onClose } = t0;
|
|
334
|
-
let t1;
|
|
335
|
-
if ($[1] !== state) {
|
|
336
|
-
t1 = {
|
|
209
|
+
const StateSidebar = ({ state, onClose }) => {
|
|
210
|
+
return /* @__PURE__ */ jsx(Sidebar, {
|
|
211
|
+
onClose,
|
|
212
|
+
title: "State Details",
|
|
213
|
+
initialWidth: 500,
|
|
214
|
+
tabs: [{
|
|
337
215
|
label: "Overview",
|
|
338
216
|
content: /* @__PURE__ */ jsx(StateDetails, { state })
|
|
339
|
-
}
|
|
340
|
-
$[1] = state;
|
|
341
|
-
$[2] = t1;
|
|
342
|
-
} else t1 = $[2];
|
|
343
|
-
let t2;
|
|
344
|
-
if ($[3] !== state) {
|
|
345
|
-
t2 = {
|
|
217
|
+
}, {
|
|
346
218
|
label: "Editor",
|
|
347
219
|
content: /* @__PURE__ */ jsx(StateEditor, { state })
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
} else t2 = $[4];
|
|
352
|
-
let t3;
|
|
353
|
-
if ($[5] !== t1 || $[6] !== t2) {
|
|
354
|
-
t3 = [t1, t2];
|
|
355
|
-
$[5] = t1;
|
|
356
|
-
$[6] = t2;
|
|
357
|
-
$[7] = t3;
|
|
358
|
-
} else t3 = $[7];
|
|
359
|
-
let t4;
|
|
360
|
-
if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
|
|
361
|
-
t4 = /* @__PURE__ */ jsx(X, {});
|
|
362
|
-
$[8] = t4;
|
|
363
|
-
} else t4 = $[8];
|
|
364
|
-
let t5;
|
|
365
|
-
if ($[9] !== onClose) {
|
|
366
|
-
t5 = [{
|
|
367
|
-
icon: t4,
|
|
220
|
+
}],
|
|
221
|
+
actions: [{
|
|
222
|
+
icon: /* @__PURE__ */ jsx(X, {}),
|
|
368
223
|
onClick: onClose,
|
|
369
224
|
label: "Close"
|
|
370
|
-
}]
|
|
371
|
-
|
|
372
|
-
$[10] = t5;
|
|
373
|
-
} else t5 = $[10];
|
|
374
|
-
let t6;
|
|
375
|
-
if ($[11] !== onClose || $[12] !== t3 || $[13] !== t5) {
|
|
376
|
-
t6 = /* @__PURE__ */ jsx(Sidebar, {
|
|
377
|
-
onClose,
|
|
378
|
-
title: "State Details",
|
|
379
|
-
initialWidth: 500,
|
|
380
|
-
tabs: t3,
|
|
381
|
-
actions: t5
|
|
382
|
-
});
|
|
383
|
-
$[11] = onClose;
|
|
384
|
-
$[12] = t3;
|
|
385
|
-
$[13] = t5;
|
|
386
|
-
$[14] = t6;
|
|
387
|
-
} else t6 = $[14];
|
|
388
|
-
return t6;
|
|
225
|
+
}]
|
|
226
|
+
});
|
|
389
227
|
};
|
|
390
228
|
|
|
391
229
|
//#endregion
|
|
392
230
|
//#region src/components/states-page.tsx
|
|
393
231
|
const StatesPage = () => {
|
|
394
|
-
const
|
|
395
|
-
|
|
396
|
-
for (let $i = 0; $i < 71; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
|
|
397
|
-
$[0] = "8ce039bfe0442ab4fc42929a358dacc664184bfe41f3767f703d231a71f688eb";
|
|
398
|
-
}
|
|
399
|
-
const selectedStateId = useStatesStore(_temp);
|
|
400
|
-
const selectStateId = useStatesStore(_temp2);
|
|
232
|
+
const selectedStateId = useStatesStore((state) => state.selectedStateId);
|
|
233
|
+
const selectStateId = useStatesStore((state) => state.selectStateId);
|
|
401
234
|
const { items, deleteItems, refetch } = useGetStateItems();
|
|
402
235
|
const [search, setSearch] = useState("");
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
if ($[4] !== search) {
|
|
407
|
-
t1$1 = (item) => item.groupId.toLowerCase().includes(search.toLowerCase()) || item.key.toLowerCase().includes(search.toLowerCase());
|
|
408
|
-
$[4] = search;
|
|
409
|
-
$[5] = t1$1;
|
|
410
|
-
} else t1$1 = $[5];
|
|
411
|
-
t0 = items.filter(t1$1);
|
|
412
|
-
$[1] = items;
|
|
413
|
-
$[2] = search;
|
|
414
|
-
$[3] = t0;
|
|
415
|
-
} else t0 = $[3];
|
|
416
|
-
const filteredItems = t0;
|
|
417
|
-
let t1;
|
|
418
|
-
if ($[6] !== filteredItems || $[7] !== selectedStateId) {
|
|
419
|
-
t1 = selectedStateId ? filteredItems.find((item_0) => `${item_0.groupId}:${item_0.key}` === selectedStateId) : null;
|
|
420
|
-
$[6] = filteredItems;
|
|
421
|
-
$[7] = selectedStateId;
|
|
422
|
-
$[8] = t1;
|
|
423
|
-
} else t1 = $[8];
|
|
424
|
-
const selectedItem = t1;
|
|
425
|
-
let t2;
|
|
426
|
-
if ($[9] === Symbol.for("react.memo_cache_sentinel")) {
|
|
427
|
-
t2 = /* @__PURE__ */ new Set();
|
|
428
|
-
$[9] = t2;
|
|
429
|
-
} else t2 = $[9];
|
|
430
|
-
const [checkedItems, setCheckedItems] = useState(t2);
|
|
431
|
-
let t3;
|
|
432
|
-
if ($[10] !== selectStateId) {
|
|
433
|
-
t3 = (item_1) => selectStateId(`${item_1.groupId}:${item_1.key}`);
|
|
434
|
-
$[10] = selectStateId;
|
|
435
|
-
$[11] = t3;
|
|
436
|
-
} else t3 = $[11];
|
|
437
|
-
const handleRowClick = t3;
|
|
438
|
-
let t4;
|
|
439
|
-
if ($[12] !== selectStateId) {
|
|
440
|
-
t4 = () => selectStateId(void 0);
|
|
441
|
-
$[12] = selectStateId;
|
|
442
|
-
$[13] = t4;
|
|
443
|
-
} else t4 = $[13];
|
|
444
|
-
const onClose = t4;
|
|
445
|
-
let t5;
|
|
446
|
-
if ($[14] !== checkedItems || $[15] !== deleteItems) {
|
|
447
|
-
t5 = () => {
|
|
448
|
-
deleteItems(Array.from(checkedItems));
|
|
449
|
-
setCheckedItems(/* @__PURE__ */ new Set());
|
|
450
|
-
};
|
|
451
|
-
$[14] = checkedItems;
|
|
452
|
-
$[15] = deleteItems;
|
|
453
|
-
$[16] = t5;
|
|
454
|
-
} else t5 = $[16];
|
|
455
|
-
const deleteStates = t5;
|
|
456
|
-
let t6;
|
|
457
|
-
if ($[17] !== checkedItems) {
|
|
458
|
-
t6 = (item_2) => {
|
|
459
|
-
const isChecked = checkedItems.has(`${item_2.groupId}:${item_2.key}`);
|
|
460
|
-
setCheckedItems((prev) => {
|
|
461
|
-
const newSet = new Set(prev);
|
|
462
|
-
if (isChecked) newSet.delete(`${item_2.groupId}:${item_2.key}`);
|
|
463
|
-
else newSet.add(`${item_2.groupId}:${item_2.key}`);
|
|
464
|
-
return newSet;
|
|
465
|
-
});
|
|
466
|
-
};
|
|
467
|
-
$[17] = checkedItems;
|
|
468
|
-
$[18] = t6;
|
|
469
|
-
} else t6 = $[18];
|
|
470
|
-
const handleCheckboxChange = t6;
|
|
471
|
-
let t7;
|
|
472
|
-
if ($[19] !== filteredItems) {
|
|
473
|
-
t7 = (checked) => {
|
|
474
|
-
setCheckedItems((prev_0) => {
|
|
475
|
-
const newSet_0 = new Set(prev_0);
|
|
476
|
-
if (checked) filteredItems.forEach((item_3) => {
|
|
477
|
-
newSet_0.add(`${item_3.groupId}:${item_3.key}`);
|
|
478
|
-
});
|
|
479
|
-
else filteredItems.forEach((item_4) => {
|
|
480
|
-
newSet_0.delete(`${item_4.groupId}:${item_4.key}`);
|
|
481
|
-
});
|
|
482
|
-
return newSet_0;
|
|
483
|
-
});
|
|
484
|
-
};
|
|
485
|
-
$[19] = filteredItems;
|
|
486
|
-
$[20] = t7;
|
|
487
|
-
} else t7 = $[20];
|
|
488
|
-
const toggleSelectAll = t7;
|
|
489
|
-
let t8;
|
|
490
|
-
if ($[21] !== onClose || $[22] !== selectedItem) {
|
|
491
|
-
t8 = selectedItem && /* @__PURE__ */ jsx(StateSidebar, {
|
|
492
|
-
state: selectedItem,
|
|
493
|
-
onClose
|
|
494
|
-
});
|
|
495
|
-
$[21] = onClose;
|
|
496
|
-
$[22] = selectedItem;
|
|
497
|
-
$[23] = t8;
|
|
498
|
-
} else t8 = $[23];
|
|
499
|
-
let t9;
|
|
500
|
-
if ($[24] === Symbol.for("react.memo_cache_sentinel")) {
|
|
501
|
-
t9 = (e) => setSearch(e.target.value);
|
|
502
|
-
$[24] = t9;
|
|
503
|
-
} else t9 = $[24];
|
|
504
|
-
let t10;
|
|
505
|
-
if ($[25] !== search) {
|
|
506
|
-
t10 = /* @__PURE__ */ jsx(Input, {
|
|
507
|
-
variant: "shade",
|
|
508
|
-
value: search,
|
|
509
|
-
onChange: t9,
|
|
510
|
-
className: "px-9! font-medium",
|
|
511
|
-
placeholder: "Search by Group ID or Key"
|
|
512
|
-
});
|
|
513
|
-
$[25] = search;
|
|
514
|
-
$[26] = t10;
|
|
515
|
-
} else t10 = $[26];
|
|
516
|
-
let t11;
|
|
517
|
-
if ($[27] === Symbol.for("react.memo_cache_sentinel")) {
|
|
518
|
-
t11 = /* @__PURE__ */ jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground/50" });
|
|
519
|
-
$[27] = t11;
|
|
520
|
-
} else t11 = $[27];
|
|
521
|
-
let t12;
|
|
522
|
-
if ($[28] === Symbol.for("react.memo_cache_sentinel")) {
|
|
523
|
-
t12 = /* @__PURE__ */ jsx(X, {
|
|
524
|
-
className: "cursor-pointer absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground/50 hover:text-muted-foreground",
|
|
525
|
-
onClick: () => setSearch("")
|
|
236
|
+
const filteredItems = useMemo(() => {
|
|
237
|
+
return items.filter((item) => {
|
|
238
|
+
return item.groupId.toLowerCase().includes(search.toLowerCase()) || item.key.toLowerCase().includes(search.toLowerCase());
|
|
526
239
|
});
|
|
527
|
-
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
let t15;
|
|
544
|
-
if ($[31] === Symbol.for("react.memo_cache_sentinel")) {
|
|
545
|
-
t15 = /* @__PURE__ */ jsx(Trash, {});
|
|
546
|
-
$[31] = t15;
|
|
547
|
-
} else t15 = $[31];
|
|
548
|
-
let t16;
|
|
549
|
-
if ($[32] !== deleteStates || $[33] !== t14) {
|
|
550
|
-
t16 = /* @__PURE__ */ jsxs(Button, {
|
|
551
|
-
variant: "default",
|
|
552
|
-
className: "h-[34px]",
|
|
553
|
-
disabled: t14,
|
|
554
|
-
onClick: deleteStates,
|
|
555
|
-
children: [t15, " Delete"]
|
|
240
|
+
}, [items, search]);
|
|
241
|
+
const selectedItem = useMemo(() => selectedStateId ? filteredItems.find((item) => `${item.groupId}:${item.key}` === selectedStateId) : null, [filteredItems, selectedStateId]);
|
|
242
|
+
const [checkedItems, setCheckedItems] = useState(/* @__PURE__ */ new Set());
|
|
243
|
+
const handleRowClick = (item) => selectStateId(`${item.groupId}:${item.key}`);
|
|
244
|
+
const onClose = () => selectStateId(void 0);
|
|
245
|
+
const deleteStates = () => {
|
|
246
|
+
deleteItems(Array.from(checkedItems));
|
|
247
|
+
setCheckedItems(/* @__PURE__ */ new Set());
|
|
248
|
+
};
|
|
249
|
+
const handleCheckboxChange = (item) => {
|
|
250
|
+
const isChecked = checkedItems.has(`${item.groupId}:${item.key}`);
|
|
251
|
+
setCheckedItems((prev) => {
|
|
252
|
+
const newSet = new Set(prev);
|
|
253
|
+
if (isChecked) newSet.delete(`${item.groupId}:${item.key}`);
|
|
254
|
+
else newSet.add(`${item.groupId}:${item.key}`);
|
|
255
|
+
return newSet;
|
|
556
256
|
});
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
t18 = /* @__PURE__ */ jsx(Button, {
|
|
569
|
-
variant: "default",
|
|
570
|
-
className: "h-[34px]",
|
|
571
|
-
onClick: refetch,
|
|
572
|
-
children: t17
|
|
257
|
+
};
|
|
258
|
+
const toggleSelectAll = (checked) => {
|
|
259
|
+
setCheckedItems((prev) => {
|
|
260
|
+
const newSet = new Set(prev);
|
|
261
|
+
if (checked) filteredItems.forEach((item) => {
|
|
262
|
+
newSet.add(`${item.groupId}:${item.key}`);
|
|
263
|
+
});
|
|
264
|
+
else filteredItems.forEach((item) => {
|
|
265
|
+
newSet.delete(`${item.groupId}:${item.key}`);
|
|
266
|
+
});
|
|
267
|
+
return newSet;
|
|
573
268
|
});
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
269
|
+
};
|
|
270
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [selectedItem && /* @__PURE__ */ jsx(StateSidebar, {
|
|
271
|
+
state: selectedItem,
|
|
272
|
+
onClose
|
|
273
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
274
|
+
className: "grid grid-rows-[auto_1fr] h-full",
|
|
275
|
+
"data-testid": "states-container",
|
|
276
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
580
277
|
className: "flex p-2 border-b gap-2",
|
|
581
278
|
"data-testid": "logs-search-container",
|
|
582
279
|
children: [
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
280
|
+
/* @__PURE__ */ jsxs("div", {
|
|
281
|
+
className: "flex-1 relative",
|
|
282
|
+
children: [
|
|
283
|
+
/* @__PURE__ */ jsx(Input, {
|
|
284
|
+
variant: "shade",
|
|
285
|
+
value: search,
|
|
286
|
+
onChange: (e) => setSearch(e.target.value),
|
|
287
|
+
className: "px-9! font-medium",
|
|
288
|
+
placeholder: "Search by Group ID or Key"
|
|
289
|
+
}),
|
|
290
|
+
/* @__PURE__ */ jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground/50" }),
|
|
291
|
+
/* @__PURE__ */ jsx(X, {
|
|
292
|
+
className: "cursor-pointer absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground/50 hover:text-muted-foreground",
|
|
293
|
+
onClick: () => setSearch("")
|
|
294
|
+
})
|
|
295
|
+
]
|
|
296
|
+
}),
|
|
297
|
+
/* @__PURE__ */ jsxs(Button, {
|
|
298
|
+
variant: "default",
|
|
299
|
+
className: "h-[34px]",
|
|
300
|
+
disabled: checkedItems.size === 0,
|
|
301
|
+
onClick: deleteStates,
|
|
302
|
+
children: [/* @__PURE__ */ jsx(Trash, {}), " Delete"]
|
|
303
|
+
}),
|
|
304
|
+
/* @__PURE__ */ jsx(Button, {
|
|
305
|
+
variant: "default",
|
|
306
|
+
className: "h-[34px]",
|
|
307
|
+
onClick: refetch,
|
|
308
|
+
children: /* @__PURE__ */ jsx(RefreshCw, { className: "w-4 h-4 text-muted-foreground" })
|
|
309
|
+
})
|
|
586
310
|
]
|
|
587
|
-
})
|
|
588
|
-
$[38] = t13;
|
|
589
|
-
$[39] = t16;
|
|
590
|
-
$[40] = t18;
|
|
591
|
-
$[41] = t19;
|
|
592
|
-
} else t19 = $[41];
|
|
593
|
-
let t20;
|
|
594
|
-
if ($[42] !== toggleSelectAll) {
|
|
595
|
-
t20 = /* @__PURE__ */ jsx(TableHead, { children: /* @__PURE__ */ jsx(Checkbox, {
|
|
596
|
-
onClick: _temp3,
|
|
597
|
-
onCheckedChange: toggleSelectAll
|
|
598
|
-
}) });
|
|
599
|
-
$[42] = toggleSelectAll;
|
|
600
|
-
$[43] = t20;
|
|
601
|
-
} else t20 = $[43];
|
|
602
|
-
let t21;
|
|
603
|
-
let t22;
|
|
604
|
-
let t23;
|
|
605
|
-
if ($[44] === Symbol.for("react.memo_cache_sentinel")) {
|
|
606
|
-
t21 = /* @__PURE__ */ jsx(TableHead, {
|
|
607
|
-
className: "rounded-0",
|
|
608
|
-
children: "Group ID"
|
|
609
|
-
});
|
|
610
|
-
t22 = /* @__PURE__ */ jsx(TableHead, { children: "Key" });
|
|
611
|
-
t23 = /* @__PURE__ */ jsx(TableHead, { children: "Type" });
|
|
612
|
-
$[44] = t21;
|
|
613
|
-
$[45] = t22;
|
|
614
|
-
$[46] = t23;
|
|
615
|
-
} else {
|
|
616
|
-
t21 = $[44];
|
|
617
|
-
t22 = $[45];
|
|
618
|
-
t23 = $[46];
|
|
619
|
-
}
|
|
620
|
-
let t24;
|
|
621
|
-
if ($[47] !== t20) {
|
|
622
|
-
t24 = /* @__PURE__ */ jsx(TableHeader, {
|
|
311
|
+
}), /* @__PURE__ */ jsxs(Table, { children: [/* @__PURE__ */ jsx(TableHeader, {
|
|
623
312
|
className: "sticky top-0 bg-background/20 backdrop-blur-sm",
|
|
624
313
|
children: /* @__PURE__ */ jsxs(TableRow, { children: [
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
314
|
+
/* @__PURE__ */ jsx(TableHead, { children: /* @__PURE__ */ jsx(Checkbox, {
|
|
315
|
+
onClick: (evt) => evt.stopPropagation(),
|
|
316
|
+
onCheckedChange: toggleSelectAll
|
|
317
|
+
}) }),
|
|
318
|
+
/* @__PURE__ */ jsx(TableHead, {
|
|
319
|
+
className: "rounded-0",
|
|
320
|
+
children: "Group ID"
|
|
321
|
+
}),
|
|
322
|
+
/* @__PURE__ */ jsx(TableHead, { children: "Key" }),
|
|
323
|
+
/* @__PURE__ */ jsx(TableHead, { children: "Type" })
|
|
629
324
|
] })
|
|
630
|
-
})
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
onClick: () => handleRowClick(item_5),
|
|
641
|
-
className: cn("font-mono font-semibold cursor-pointer border-0", selectedItem === item_5 ? "bg-muted-foreground/10 hover:bg-muted-foreground/20" : "hover:bg-muted-foreground/10"),
|
|
642
|
-
children: [
|
|
643
|
-
/* @__PURE__ */ jsx(TableCell, {
|
|
644
|
-
onClick: _temp4,
|
|
645
|
-
children: /* @__PURE__ */ jsx(Checkbox, {
|
|
646
|
-
checked: checkedItems.has(`${item_5.groupId}:${item_5.key}`),
|
|
647
|
-
onClick: () => handleCheckboxChange(item_5)
|
|
648
|
-
})
|
|
649
|
-
}),
|
|
650
|
-
/* @__PURE__ */ jsx(TableCell, {
|
|
651
|
-
className: "hover:bg-transparent",
|
|
652
|
-
children: item_5.groupId
|
|
653
|
-
}),
|
|
654
|
-
/* @__PURE__ */ jsx(TableCell, {
|
|
655
|
-
className: "hover:bg-transparent",
|
|
656
|
-
children: item_5.key
|
|
657
|
-
}),
|
|
658
|
-
/* @__PURE__ */ jsx(TableCell, {
|
|
659
|
-
className: "hover:bg-transparent",
|
|
660
|
-
children: item_5.type
|
|
325
|
+
}), /* @__PURE__ */ jsx(TableBody, { children: filteredItems.map((item) => /* @__PURE__ */ jsxs(TableRow, {
|
|
326
|
+
"data-testid": `item-${item}`,
|
|
327
|
+
onClick: () => handleRowClick(item),
|
|
328
|
+
className: cn("font-mono font-semibold cursor-pointer border-0", selectedItem === item ? "bg-muted-foreground/10 hover:bg-muted-foreground/20" : "hover:bg-muted-foreground/10"),
|
|
329
|
+
children: [
|
|
330
|
+
/* @__PURE__ */ jsx(TableCell, {
|
|
331
|
+
onClick: (evt) => evt.stopPropagation(),
|
|
332
|
+
children: /* @__PURE__ */ jsx(Checkbox, {
|
|
333
|
+
checked: checkedItems.has(`${item.groupId}:${item.key}`),
|
|
334
|
+
onClick: () => handleCheckboxChange(item)
|
|
661
335
|
})
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
}
|
|
678
|
-
let t26;
|
|
679
|
-
if ($[60] !== t25) {
|
|
680
|
-
t26 = /* @__PURE__ */ jsx(TableBody, { children: t25 });
|
|
681
|
-
$[60] = t25;
|
|
682
|
-
$[61] = t26;
|
|
683
|
-
} else t26 = $[61];
|
|
684
|
-
let t27;
|
|
685
|
-
if ($[62] !== t24 || $[63] !== t26) {
|
|
686
|
-
t27 = /* @__PURE__ */ jsxs(Table, { children: [t24, t26] });
|
|
687
|
-
$[62] = t24;
|
|
688
|
-
$[63] = t26;
|
|
689
|
-
$[64] = t27;
|
|
690
|
-
} else t27 = $[64];
|
|
691
|
-
let t28;
|
|
692
|
-
if ($[65] !== t19 || $[66] !== t27) {
|
|
693
|
-
t28 = /* @__PURE__ */ jsxs("div", {
|
|
694
|
-
className: "grid grid-rows-[auto_1fr] h-full",
|
|
695
|
-
"data-testid": "states-container",
|
|
696
|
-
children: [t19, t27]
|
|
697
|
-
});
|
|
698
|
-
$[65] = t19;
|
|
699
|
-
$[66] = t27;
|
|
700
|
-
$[67] = t28;
|
|
701
|
-
} else t28 = $[67];
|
|
702
|
-
let t29;
|
|
703
|
-
if ($[68] !== t28 || $[69] !== t8) {
|
|
704
|
-
t29 = /* @__PURE__ */ jsxs(Fragment, { children: [t8, t28] });
|
|
705
|
-
$[68] = t28;
|
|
706
|
-
$[69] = t8;
|
|
707
|
-
$[70] = t29;
|
|
708
|
-
} else t29 = $[70];
|
|
709
|
-
return t29;
|
|
336
|
+
}),
|
|
337
|
+
/* @__PURE__ */ jsx(TableCell, {
|
|
338
|
+
className: "hover:bg-transparent",
|
|
339
|
+
children: item.groupId
|
|
340
|
+
}),
|
|
341
|
+
/* @__PURE__ */ jsx(TableCell, {
|
|
342
|
+
className: "hover:bg-transparent",
|
|
343
|
+
children: item.key
|
|
344
|
+
}),
|
|
345
|
+
/* @__PURE__ */ jsx(TableCell, {
|
|
346
|
+
className: "hover:bg-transparent",
|
|
347
|
+
children: item.type
|
|
348
|
+
})
|
|
349
|
+
]
|
|
350
|
+
}, `${item.groupId}:${item.key}`)) })] })]
|
|
351
|
+
})] });
|
|
710
352
|
};
|
|
711
|
-
function _temp(state) {
|
|
712
|
-
return state.selectedStateId;
|
|
713
|
-
}
|
|
714
|
-
function _temp2(state_0) {
|
|
715
|
-
return state_0.selectStateId;
|
|
716
|
-
}
|
|
717
|
-
function _temp3(evt) {
|
|
718
|
-
return evt.stopPropagation();
|
|
719
|
-
}
|
|
720
|
-
function _temp4(evt_0) {
|
|
721
|
-
return evt_0.stopPropagation();
|
|
722
|
-
}
|
|
723
353
|
|
|
724
354
|
//#endregion
|
|
725
355
|
export { StatesPage };
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["useCallback","useEffect","useState","StateItem","Output","items","deleteItems","ids","refetch","useGetStateItems","$","_c","$i","Symbol","for","t0","setItems","t1","fetch","then","_temp","catch","_temp2","t2","method","headers","body","JSON","stringify","t3","t4","t5","res","ok","json","err","console","error","create","StatesState","selectedStateId","selectStateId","stateId","useStatesStore","set","undefined","React","JsonView","StateItem","Props","state","StateDetails","FC","t0","$","_c","$i","Symbol","for","t1","value","Editor","useMonaco","useThemeStore","FC","useEffect","useMemo","JsonEditorProps","value","height","schema","Record","onChange","onValidate","isValid","language","readOnly","JsonEditor","t0","$","_c","$i","Symbol","for","t1","t2","t3","undefined","monaco","theme","_temp","editorTheme","t4","languages","typescript","javascriptDefaults","setCompilerOptions","isolatedModules","json","jsonDefaults","setDiagnosticsOptions","schemas","uri","window","location","href","fileMatch","t5","t6","value_0","t7","markers","length","t8","enabled","t9","scrollBeyondLastLine","minimap","t10","state","Button","AlertCircle","Check","Loader2","Save","React","useCallback","useEffect","useMemo","useRef","useState","StateItem","JsonEditor","Props","state","StateEditor","FC","isRequestLoading","setIsRequestLoading","isValid","setIsValid","jsonValue","setJsonValue","JSON","stringify","value","hasChanges","setHasChanges","saveStatus","setSaveStatus","lastSavedValue","handleJsonChange","current","handleSave","response","fetch","method","headers","body","key","groupId","parse","ok","Error","status","setTimeout","error","console","resetChanges","statusView","Sidebar","X","React","StateItem","StateDetails","StateEditor","Props","state","onClose","StateSidebar","FC","t0","$","_c","$i","Symbol","for","t1","label","content","t2","t3","t4","t5","icon","onClick","t6","Button","Checkbox","cn","Input","Table","TableBody","TableCell","TableHead","TableHeader","TableRow","RefreshCw","Search","Trash","X","useMemo","useState","useGetStateItems","useStatesStore","StateItem","StateSidebar","StatesPage","$","_c","$i","Symbol","for","selectedStateId","_temp","selectStateId","_temp2","items","deleteItems","refetch","search","setSearch","t0","t1","item","groupId","toLowerCase","includes","key","filter","filteredItems","find","item_0","selectedItem","t2","Set","checkedItems","setCheckedItems","t3","item_1","handleRowClick","t4","undefined","onClose","t5","Array","from","deleteStates","t6","item_2","isChecked","has","prev","newSet","delete","add","handleCheckboxChange","t7","checked","prev_0","newSet_0","forEach","item_3","item_4","toggleSelectAll","t8","t9","e","target","value","t10","t11","t12","t13","t14","size","t15","t16","t17","t18","t19","t20","_temp3","t21","t22","t23","t24","t25","t26","item_5","_temp4","type","map","t27","t28","t29","state","state_0","evt","stopPropagation","evt_0"],"sources":["../src/hooks/states-hooks.ts","../src/stores/use-states-store.ts","../src/components/state-details.tsx","../src/components/json-editor.tsx","../src/components/state-editor.tsx","../src/components/state-sidebar.tsx","../src/components/states-page.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react'\nimport type { StateItem } from '../types/state'\n\ntype Output = {\n items: StateItem[]\n deleteItems: (ids: string[]) => void\n refetch: () => void\n}\n\nexport const useGetStateItems = (): Output => {\n const [items, setItems] = useState<StateItem[]>([])\n\n const refetch = useCallback(() => {\n fetch('/__motia/state')\n .then(async (res) => {\n if (res.ok) {\n return res.json()\n } else {\n throw await res.json()\n }\n })\n .then(setItems)\n .catch((err) => console.error(err))\n }, [])\n\n const deleteItems = (ids: string[]) => {\n fetch('/__motia/state/delete', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ ids }),\n }).then(() => refetch())\n }\n\n useEffect(() => {\n refetch()\n }, [refetch])\n\n return { items, deleteItems, refetch }\n}\n","import { create } from 'zustand'\n\nexport type StatesState = {\n selectedStateId?: string\n selectStateId: (stateId?: string) => void\n}\n\nexport const useStatesStore = create<StatesState>()((set) => ({\n selectedStateId: undefined,\n selectStateId: (stateId) => set({ selectedStateId: stateId }),\n}))\n","import type React from 'react'\nimport JsonView from 'react18-json-view'\nimport type { StateItem } from '../types/state'\n\ntype Props = {\n state: StateItem\n}\n\nexport const StateDetails: React.FC<Props> = ({ state }) => <JsonView src={state.value} theme=\"default\" />\n","import Editor, { useMonaco } from '@monaco-editor/react'\nimport { useThemeStore } from '@motiadev/ui'\nimport { type FC, useEffect, useMemo } from 'react'\n\ntype JsonEditorProps = {\n value: string\n height?: number | string\n schema?: Record<string, unknown>\n onChange?: (value: string) => void\n onValidate?: (isValid: boolean) => void\n language?: string\n readOnly?: boolean\n}\n\nexport const JsonEditor: FC<JsonEditorProps> = ({\n value,\n height = 300,\n schema,\n onChange,\n onValidate,\n language = 'json',\n readOnly = false,\n}) => {\n const monaco = useMonaco()\n const theme = useThemeStore((state) => state.theme)\n const editorTheme = useMemo(() => (theme === 'dark' ? 'vs-dark' : 'light'), [theme])\n\n useEffect(() => {\n if (!monaco) return\n\n monaco.languages.typescript.javascriptDefaults.setCompilerOptions({ isolatedModules: true })\n monaco.languages.json.jsonDefaults.setDiagnosticsOptions({\n schemas: schema\n ? [\n {\n uri: window.location.href,\n fileMatch: ['*'],\n schema,\n },\n ]\n : [],\n })\n }, [monaco, schema, language])\n\n return (\n <Editor\n data-testid=\"json-editor\"\n height={height}\n language={language}\n value={value}\n theme={editorTheme}\n onChange={(value) => {\n if (!value) {\n onValidate?.(false)\n }\n onChange?.(value ?? '')\n }}\n onValidate={(markers) => onValidate?.(markers.length === 0)}\n options={{\n readOnly,\n scrollBeyondLastLine: false,\n minimap: { enabled: false },\n }}\n />\n )\n}\n","import { Button } from '@motiadev/ui'\nimport { AlertCircle, Check, Loader2, Save } from 'lucide-react'\nimport type React from 'react'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { StateItem } from '../types/state'\nimport { JsonEditor } from './json-editor'\n\ntype Props = {\n state: StateItem\n}\n\nexport const StateEditor: React.FC<Props> = ({ state }) => {\n const [isRequestLoading, setIsRequestLoading] = useState(false)\n const [isValid, setIsValid] = useState(true)\n const [jsonValue, setJsonValue] = useState(JSON.stringify(state.value, null, 2))\n const [hasChanges, setHasChanges] = useState(false)\n const [saveStatus, setSaveStatus] = useState<'idle' | 'success' | 'error'>('idle')\n const lastSavedValue = useRef(JSON.stringify(state.value, null, 2))\n useEffect(() => {\n setJsonValue(JSON.stringify(state.value, null, 2))\n }, [state.value])\n\n const handleJsonChange = useCallback((value: string) => {\n setHasChanges(value !== lastSavedValue.current)\n setJsonValue(value)\n setSaveStatus('idle')\n }, [])\n\n const handleSave = async () => {\n if (!isValid || !hasChanges) return\n\n try {\n setIsRequestLoading(true)\n setSaveStatus('idle')\n\n const response = await fetch('/__motia/state', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n key: state.key,\n groupId: state.groupId,\n value: JSON.parse(jsonValue),\n }),\n })\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`)\n }\n\n lastSavedValue.current = jsonValue\n setSaveStatus('success')\n setHasChanges(false)\n\n setTimeout(() => {\n setSaveStatus('idle')\n }, 3000)\n } catch (error) {\n console.error('Failed to save state:', error)\n setSaveStatus('error')\n } finally {\n setIsRequestLoading(false)\n }\n }\n\n const resetChanges = useCallback(() => {\n setJsonValue(JSON.stringify(state.value, null, 2))\n setHasChanges(false)\n setSaveStatus('idle')\n }, [state.value])\n\n const statusView = useMemo(() => {\n if (saveStatus === 'success') {\n return (\n <div className=\"bg-green-50 dark:bg-green-950/20 border border-green-200 dark:border-green-800 rounded-lg p-2\">\n <div className=\"flex items-center gap-2 text-green-700 dark:text-green-400 text-sm\">\n <Check className=\"w-4 h-4\" />\n State saved successfully!\n </div>\n </div>\n )\n }\n\n if (saveStatus === 'error') {\n return (\n <div className=\"bg-red-50 dark:bg-red-950/20 border border-red-200 dark:border-red-800 rounded-lg p-2\">\n <div className=\"flex items-center gap-2 text-red-700 dark:text-red-400 text-sm\">\n <AlertCircle className=\"w-4 h-4\" />\n Failed to save state. Please try again.\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"text-xs text-muted-foreground\">\n {hasChanges ? (\n <span className=\"flex items-center gap-1\">\n <div className=\"w-2 h-2 bg-orange-500 rounded-full\"></div>\n Unsaved changes\n </span>\n ) : (\n <span className=\"flex items-center gap-1\">\n <div className=\"w-2 h-2 bg-green-500 rounded-full\"></div>\n Up to date\n </span>\n )}\n </div>\n )\n }, [saveStatus, hasChanges])\n\n return (\n <div className=\"flex flex-col gap-2 h-full\">\n <p className=\"text-xs text-muted-foreground\">Modify the state value using the JSON editor below.</p>\n <div className=\"space-y-3 pt-2 flex flex-col\">\n <div className=\"relative flex-1\">\n <JsonEditor\n value={jsonValue}\n onChange={handleJsonChange}\n onValidate={setIsValid}\n height={'calc(100vh - 300px)'}\n />\n\n {!isValid && (\n <div className=\"absolute top-2 right-2 bg-destructive/90 text-destructive-foreground px-2 py-1 rounded text-xs flex items-center gap-1\">\n <AlertCircle className=\"w-3 h-3\" />\n Invalid JSON\n </div>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center justify-between pt-2\">\n {statusView}\n\n <div className=\"flex items-center gap-2\">\n {hasChanges && (\n <Button variant=\"secondary\" onClick={resetChanges} disabled={isRequestLoading}>\n Reset\n </Button>\n )}\n\n <Button\n onClick={handleSave}\n variant=\"accent\"\n disabled={isRequestLoading || !isValid || !hasChanges}\n data-testid=\"state-save-button\"\n >\n {isRequestLoading ? (\n <>\n <Loader2 className=\"w-3 h-3 animate-spin mr-1\" />\n Saving...\n </>\n ) : (\n <>\n <Save className=\"w-3 h-3 mr-1\" />\n Save Changes\n </>\n )}\n </Button>\n </div>\n </div>\n </div>\n )\n}\n","import { Sidebar } from '@motiadev/ui'\nimport { X } from 'lucide-react'\nimport type React from 'react'\nimport type { StateItem } from '../types/state'\nimport { StateDetails } from './state-details'\nimport { StateEditor } from './state-editor'\n\ntype Props = {\n state: StateItem\n onClose: () => void\n}\n\nexport const StateSidebar: React.FC<Props> = ({ state, onClose }) => {\n return (\n <Sidebar\n onClose={onClose}\n title=\"State Details\"\n initialWidth={500}\n tabs={[\n {\n label: 'Overview',\n content: <StateDetails state={state} />,\n },\n {\n label: 'Editor',\n content: <StateEditor state={state} />,\n },\n ]}\n actions={[{ icon: <X />, onClick: onClose, label: 'Close' }]}\n />\n )\n}\n","import {\n Button,\n Checkbox,\n cn,\n Input,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@motiadev/ui'\nimport { RefreshCw, Search, Trash, X } from 'lucide-react'\nimport { useMemo, useState } from 'react'\nimport { useGetStateItems } from '../hooks/states-hooks'\nimport { useStatesStore } from '../stores/use-states-store'\nimport type { StateItem } from '../types/state'\nimport { StateSidebar } from './state-sidebar'\n\nexport const StatesPage = () => {\n const selectedStateId = useStatesStore((state) => state.selectedStateId)\n const selectStateId = useStatesStore((state) => state.selectStateId)\n const { items, deleteItems, refetch } = useGetStateItems()\n const [search, setSearch] = useState('')\n const filteredItems = useMemo(() => {\n return items.filter((item) => {\n return (\n item.groupId.toLowerCase().includes(search.toLowerCase()) ||\n item.key.toLowerCase().includes(search.toLowerCase())\n )\n })\n }, [items, search])\n const selectedItem = useMemo(\n () => (selectedStateId ? filteredItems.find((item) => `${item.groupId}:${item.key}` === selectedStateId) : null),\n [filteredItems, selectedStateId],\n )\n\n const [checkedItems, setCheckedItems] = useState<Set<string>>(new Set())\n const handleRowClick = (item: StateItem) => selectStateId(`${item.groupId}:${item.key}`)\n const onClose = () => selectStateId(undefined)\n const deleteStates = () => {\n deleteItems(Array.from(checkedItems))\n setCheckedItems(new Set())\n }\n\n const handleCheckboxChange = (item: StateItem) => {\n const isChecked = checkedItems.has(`${item.groupId}:${item.key}`)\n\n setCheckedItems((prev) => {\n const newSet = new Set(prev)\n if (isChecked) {\n newSet.delete(`${item.groupId}:${item.key}`)\n } else {\n newSet.add(`${item.groupId}:${item.key}`)\n }\n return newSet\n })\n }\n\n const toggleSelectAll = (checked: boolean) => {\n setCheckedItems((prev) => {\n const newSet = new Set(prev)\n\n if (checked) {\n filteredItems.forEach((item) => {\n newSet.add(`${item.groupId}:${item.key}`)\n })\n } else {\n filteredItems.forEach((item) => {\n newSet.delete(`${item.groupId}:${item.key}`)\n })\n }\n return newSet\n })\n }\n\n return (\n <>\n {selectedItem && <StateSidebar state={selectedItem} onClose={onClose} />}\n <div className=\"grid grid-rows-[auto_1fr] h-full\" data-testid=\"states-container\">\n <div className=\"flex p-2 border-b gap-2\" data-testid=\"logs-search-container\">\n <div className=\"flex-1 relative\">\n <Input\n variant=\"shade\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"px-9! font-medium\"\n placeholder=\"Search by Group ID or Key\"\n />\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground/50\" />\n <X\n className=\"cursor-pointer absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground/50 hover:text-muted-foreground\"\n onClick={() => setSearch('')}\n />\n </div>\n <Button variant=\"default\" className=\"h-[34px]\" disabled={checkedItems.size === 0} onClick={deleteStates}>\n <Trash /> Delete\n </Button>\n <Button variant=\"default\" className=\"h-[34px]\" onClick={refetch}>\n <RefreshCw className=\"w-4 h-4 text-muted-foreground\" />\n </Button>\n </div>\n\n <Table>\n <TableHeader className=\"sticky top-0 bg-background/20 backdrop-blur-sm\">\n <TableRow>\n <TableHead>\n <Checkbox onClick={(evt) => evt.stopPropagation()} onCheckedChange={toggleSelectAll} />\n </TableHead>\n <TableHead className=\"rounded-0\">Group ID</TableHead>\n <TableHead>Key</TableHead>\n <TableHead>Type</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {filteredItems.map((item) => (\n <TableRow\n data-testid={`item-${item}`}\n key={`${item.groupId}:${item.key}`}\n onClick={() => handleRowClick(item)}\n className={cn(\n 'font-mono font-semibold cursor-pointer border-0',\n selectedItem === item\n ? 'bg-muted-foreground/10 hover:bg-muted-foreground/20'\n : 'hover:bg-muted-foreground/10',\n )}\n >\n <TableCell onClick={(evt) => evt.stopPropagation()}>\n <Checkbox\n checked={checkedItems.has(`${item.groupId}:${item.key}`)}\n onClick={() => handleCheckboxChange(item)}\n />\n </TableCell>\n <TableCell className=\"hover:bg-transparent\">{item.groupId}</TableCell>\n <TableCell className=\"hover:bg-transparent\">{item.key}</TableCell>\n <TableCell className=\"hover:bg-transparent\">{item.type}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["StateDetails: React.FC<Props>","JsonEditor: FC<JsonEditorProps>","value","StateEditor: React.FC<Props>","StateSidebar: React.FC<Props>"],"sources":["../src/hooks/states-hooks.ts","../src/stores/use-states-store.ts","../src/components/state-details.tsx","../src/components/json-editor.tsx","../src/components/state-editor.tsx","../src/components/state-sidebar.tsx","../src/components/states-page.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react'\nimport type { StateItem } from '../types/state'\n\ntype Output = {\n items: StateItem[]\n deleteItems: (ids: string[]) => void\n refetch: () => void\n}\n\nexport const useGetStateItems = (): Output => {\n const [items, setItems] = useState<StateItem[]>([])\n\n const refetch = useCallback(() => {\n fetch('/__motia/state')\n .then(async (res) => {\n if (res.ok) {\n return res.json()\n } else {\n throw await res.json()\n }\n })\n .then(setItems)\n .catch((err) => console.error(err))\n }, [])\n\n const deleteItems = (ids: string[]) => {\n fetch('/__motia/state/delete', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ ids }),\n }).then(() => refetch())\n }\n\n useEffect(() => {\n refetch()\n }, [refetch])\n\n return { items, deleteItems, refetch }\n}\n","import { create } from 'zustand'\n\nexport type StatesState = {\n selectedStateId?: string\n selectStateId: (stateId?: string) => void\n}\n\nexport const useStatesStore = create<StatesState>()((set) => ({\n selectedStateId: undefined,\n selectStateId: (stateId) => set({ selectedStateId: stateId }),\n}))\n","import type React from 'react'\nimport JsonView from 'react18-json-view'\nimport type { StateItem } from '../types/state'\n\ntype Props = {\n state: StateItem\n}\n\nexport const StateDetails: React.FC<Props> = ({ state }) => <JsonView src={state.value} theme=\"default\" />\n","import Editor, { useMonaco } from '@monaco-editor/react'\nimport { useThemeStore } from '@motiadev/ui'\nimport { type FC, useEffect, useMemo } from 'react'\n\ntype JsonEditorProps = {\n value: string\n height?: number | string\n schema?: Record<string, unknown>\n onChange?: (value: string) => void\n onValidate?: (isValid: boolean) => void\n language?: string\n readOnly?: boolean\n}\n\nexport const JsonEditor: FC<JsonEditorProps> = ({\n value,\n height = 300,\n schema,\n onChange,\n onValidate,\n language = 'json',\n readOnly = false,\n}) => {\n const monaco = useMonaco()\n const theme = useThemeStore((state) => state.theme)\n const editorTheme = useMemo(() => (theme === 'dark' ? 'vs-dark' : 'light'), [theme])\n\n useEffect(() => {\n if (!monaco) return\n\n monaco.languages.typescript.javascriptDefaults.setCompilerOptions({ isolatedModules: true })\n monaco.languages.json.jsonDefaults.setDiagnosticsOptions({\n schemas: schema\n ? [\n {\n uri: window.location.href,\n fileMatch: ['*'],\n schema,\n },\n ]\n : [],\n })\n }, [monaco, schema, language])\n\n return (\n <Editor\n data-testid=\"json-editor\"\n height={height}\n language={language}\n value={value}\n theme={editorTheme}\n onChange={(value) => {\n if (!value) {\n onValidate?.(false)\n }\n onChange?.(value ?? '')\n }}\n onValidate={(markers) => onValidate?.(markers.length === 0)}\n options={{\n readOnly,\n scrollBeyondLastLine: false,\n minimap: { enabled: false },\n }}\n />\n )\n}\n","import { Button } from '@motiadev/ui'\nimport { AlertCircle, Check, Loader2, Save } from 'lucide-react'\nimport type React from 'react'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { StateItem } from '../types/state'\nimport { JsonEditor } from './json-editor'\n\ntype Props = {\n state: StateItem\n}\n\nexport const StateEditor: React.FC<Props> = ({ state }) => {\n const [isRequestLoading, setIsRequestLoading] = useState(false)\n const [isValid, setIsValid] = useState(true)\n const [jsonValue, setJsonValue] = useState(JSON.stringify(state.value, null, 2))\n const [hasChanges, setHasChanges] = useState(false)\n const [saveStatus, setSaveStatus] = useState<'idle' | 'success' | 'error'>('idle')\n const lastSavedValue = useRef(JSON.stringify(state.value, null, 2))\n useEffect(() => {\n setJsonValue(JSON.stringify(state.value, null, 2))\n }, [state.value])\n\n const handleJsonChange = useCallback((value: string) => {\n setHasChanges(value !== lastSavedValue.current)\n setJsonValue(value)\n setSaveStatus('idle')\n }, [])\n\n const handleSave = async () => {\n if (!isValid || !hasChanges) return\n\n try {\n setIsRequestLoading(true)\n setSaveStatus('idle')\n\n const response = await fetch('/__motia/state', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n key: state.key,\n groupId: state.groupId,\n value: JSON.parse(jsonValue),\n }),\n })\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`)\n }\n\n lastSavedValue.current = jsonValue\n setSaveStatus('success')\n setHasChanges(false)\n\n setTimeout(() => {\n setSaveStatus('idle')\n }, 3000)\n } catch (error) {\n console.error('Failed to save state:', error)\n setSaveStatus('error')\n } finally {\n setIsRequestLoading(false)\n }\n }\n\n const resetChanges = useCallback(() => {\n setJsonValue(JSON.stringify(state.value, null, 2))\n setHasChanges(false)\n setSaveStatus('idle')\n }, [state.value])\n\n const statusView = useMemo(() => {\n if (saveStatus === 'success') {\n return (\n <div className=\"bg-green-50 dark:bg-green-950/20 border border-green-200 dark:border-green-800 rounded-lg p-2\">\n <div className=\"flex items-center gap-2 text-green-700 dark:text-green-400 text-sm\">\n <Check className=\"w-4 h-4\" />\n State saved successfully!\n </div>\n </div>\n )\n }\n\n if (saveStatus === 'error') {\n return (\n <div className=\"bg-red-50 dark:bg-red-950/20 border border-red-200 dark:border-red-800 rounded-lg p-2\">\n <div className=\"flex items-center gap-2 text-red-700 dark:text-red-400 text-sm\">\n <AlertCircle className=\"w-4 h-4\" />\n Failed to save state. Please try again.\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"text-xs text-muted-foreground\">\n {hasChanges ? (\n <span className=\"flex items-center gap-1\">\n <div className=\"w-2 h-2 bg-orange-500 rounded-full\"></div>\n Unsaved changes\n </span>\n ) : (\n <span className=\"flex items-center gap-1\">\n <div className=\"w-2 h-2 bg-green-500 rounded-full\"></div>\n Up to date\n </span>\n )}\n </div>\n )\n }, [saveStatus, hasChanges])\n\n return (\n <div className=\"flex flex-col gap-2 h-full\">\n <p className=\"text-xs text-muted-foreground\">Modify the state value using the JSON editor below.</p>\n <div className=\"space-y-3 pt-2 flex flex-col\">\n <div className=\"relative flex-1\">\n <JsonEditor\n value={jsonValue}\n onChange={handleJsonChange}\n onValidate={setIsValid}\n height={'calc(100vh - 300px)'}\n />\n\n {!isValid && (\n <div className=\"absolute top-2 right-2 bg-destructive/90 text-destructive-foreground px-2 py-1 rounded text-xs flex items-center gap-1\">\n <AlertCircle className=\"w-3 h-3\" />\n Invalid JSON\n </div>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center justify-between pt-2\">\n {statusView}\n\n <div className=\"flex items-center gap-2\">\n {hasChanges && (\n <Button variant=\"secondary\" onClick={resetChanges} disabled={isRequestLoading}>\n Reset\n </Button>\n )}\n\n <Button\n onClick={handleSave}\n variant=\"accent\"\n disabled={isRequestLoading || !isValid || !hasChanges}\n data-testid=\"state-save-button\"\n >\n {isRequestLoading ? (\n <>\n <Loader2 className=\"w-3 h-3 animate-spin mr-1\" />\n Saving...\n </>\n ) : (\n <>\n <Save className=\"w-3 h-3 mr-1\" />\n Save Changes\n </>\n )}\n </Button>\n </div>\n </div>\n </div>\n )\n}\n","import { Sidebar } from '@motiadev/ui'\nimport { X } from 'lucide-react'\nimport type React from 'react'\nimport type { StateItem } from '../types/state'\nimport { StateDetails } from './state-details'\nimport { StateEditor } from './state-editor'\n\ntype Props = {\n state: StateItem\n onClose: () => void\n}\n\nexport const StateSidebar: React.FC<Props> = ({ state, onClose }) => {\n return (\n <Sidebar\n onClose={onClose}\n title=\"State Details\"\n initialWidth={500}\n tabs={[\n {\n label: 'Overview',\n content: <StateDetails state={state} />,\n },\n {\n label: 'Editor',\n content: <StateEditor state={state} />,\n },\n ]}\n actions={[{ icon: <X />, onClick: onClose, label: 'Close' }]}\n />\n )\n}\n","import {\n Button,\n Checkbox,\n cn,\n Input,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@motiadev/ui'\nimport { RefreshCw, Search, Trash, X } from 'lucide-react'\nimport { useMemo, useState } from 'react'\nimport { useGetStateItems } from '../hooks/states-hooks'\nimport { useStatesStore } from '../stores/use-states-store'\nimport type { StateItem } from '../types/state'\nimport { StateSidebar } from './state-sidebar'\n\nexport const StatesPage = () => {\n const selectedStateId = useStatesStore((state) => state.selectedStateId)\n const selectStateId = useStatesStore((state) => state.selectStateId)\n const { items, deleteItems, refetch } = useGetStateItems()\n const [search, setSearch] = useState('')\n const filteredItems = useMemo(() => {\n return items.filter((item) => {\n return (\n item.groupId.toLowerCase().includes(search.toLowerCase()) ||\n item.key.toLowerCase().includes(search.toLowerCase())\n )\n })\n }, [items, search])\n const selectedItem = useMemo(\n () => (selectedStateId ? filteredItems.find((item) => `${item.groupId}:${item.key}` === selectedStateId) : null),\n [filteredItems, selectedStateId],\n )\n\n const [checkedItems, setCheckedItems] = useState<Set<string>>(new Set())\n const handleRowClick = (item: StateItem) => selectStateId(`${item.groupId}:${item.key}`)\n const onClose = () => selectStateId(undefined)\n const deleteStates = () => {\n deleteItems(Array.from(checkedItems))\n setCheckedItems(new Set())\n }\n\n const handleCheckboxChange = (item: StateItem) => {\n const isChecked = checkedItems.has(`${item.groupId}:${item.key}`)\n\n setCheckedItems((prev) => {\n const newSet = new Set(prev)\n if (isChecked) {\n newSet.delete(`${item.groupId}:${item.key}`)\n } else {\n newSet.add(`${item.groupId}:${item.key}`)\n }\n return newSet\n })\n }\n\n const toggleSelectAll = (checked: boolean) => {\n setCheckedItems((prev) => {\n const newSet = new Set(prev)\n\n if (checked) {\n filteredItems.forEach((item) => {\n newSet.add(`${item.groupId}:${item.key}`)\n })\n } else {\n filteredItems.forEach((item) => {\n newSet.delete(`${item.groupId}:${item.key}`)\n })\n }\n return newSet\n })\n }\n\n return (\n <>\n {selectedItem && <StateSidebar state={selectedItem} onClose={onClose} />}\n <div className=\"grid grid-rows-[auto_1fr] h-full\" data-testid=\"states-container\">\n <div className=\"flex p-2 border-b gap-2\" data-testid=\"logs-search-container\">\n <div className=\"flex-1 relative\">\n <Input\n variant=\"shade\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"px-9! font-medium\"\n placeholder=\"Search by Group ID or Key\"\n />\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground/50\" />\n <X\n className=\"cursor-pointer absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground/50 hover:text-muted-foreground\"\n onClick={() => setSearch('')}\n />\n </div>\n <Button variant=\"default\" className=\"h-[34px]\" disabled={checkedItems.size === 0} onClick={deleteStates}>\n <Trash /> Delete\n </Button>\n <Button variant=\"default\" className=\"h-[34px]\" onClick={refetch}>\n <RefreshCw className=\"w-4 h-4 text-muted-foreground\" />\n </Button>\n </div>\n\n <Table>\n <TableHeader className=\"sticky top-0 bg-background/20 backdrop-blur-sm\">\n <TableRow>\n <TableHead>\n <Checkbox onClick={(evt) => evt.stopPropagation()} onCheckedChange={toggleSelectAll} />\n </TableHead>\n <TableHead className=\"rounded-0\">Group ID</TableHead>\n <TableHead>Key</TableHead>\n <TableHead>Type</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {filteredItems.map((item) => (\n <TableRow\n data-testid={`item-${item}`}\n key={`${item.groupId}:${item.key}`}\n onClick={() => handleRowClick(item)}\n className={cn(\n 'font-mono font-semibold cursor-pointer border-0',\n selectedItem === item\n ? 'bg-muted-foreground/10 hover:bg-muted-foreground/20'\n : 'hover:bg-muted-foreground/10',\n )}\n >\n <TableCell onClick={(evt) => evt.stopPropagation()}>\n <Checkbox\n checked={checkedItems.has(`${item.groupId}:${item.key}`)}\n onClick={() => handleCheckboxChange(item)}\n />\n </TableCell>\n <TableCell className=\"hover:bg-transparent\">{item.groupId}</TableCell>\n <TableCell className=\"hover:bg-transparent\">{item.key}</TableCell>\n <TableCell className=\"hover:bg-transparent\">{item.type}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </>\n )\n}\n"],"mappings":"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"}
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","names":["
|
|
1
|
+
{"version":3,"file":"plugin.js","names":["error: unknown"],"sources":["../src/api.ts","../src/plugin.ts"],"sourcesContent":["import type { ApiRequest, ApiResponse, FlowContext, MotiaPluginContext } from '@motiadev/core'\n\nexport const api = (motia: MotiaPluginContext): void => {\n motia.registerApi(\n {\n method: 'GET',\n path: '/__motia/state',\n },\n async (req: ApiRequest): Promise<ApiResponse> => {\n try {\n const groupId = req.queryParams.groupId as string | undefined\n const filter = req.queryParams.filter ? JSON.parse(req.queryParams.filter as string) : undefined\n const items = await motia.state.items({ groupId, filter })\n\n return {\n status: 200,\n body: items as unknown as Record<string, unknown>,\n }\n } catch (error: unknown) {\n return {\n status: 500,\n body: { error: error instanceof Error ? error.message : 'Unknown error' },\n }\n }\n },\n )\n\n motia.registerApi(\n {\n method: 'POST',\n path: '/__motia/state',\n },\n async (req: ApiRequest, ctx: FlowContext): Promise<ApiResponse> => {\n try {\n const { key, groupId, value } = req.body as { key: string; groupId: string; value: any }\n await ctx.state.set(groupId, key, value)\n return {\n status: 200,\n body: { key, groupId, value },\n }\n } catch (error: unknown) {\n return {\n status: 500,\n body: { error: error instanceof Error ? error.message : 'Unknown error' },\n }\n }\n },\n )\n\n motia.registerApi(\n {\n method: 'POST',\n path: '/__motia/state/delete',\n },\n async (req: ApiRequest, ctx: FlowContext): Promise<ApiResponse> => {\n try {\n for (const id of (req.body as { ids: string[] }).ids) {\n const [groupId, ...keyParts] = id.split(':')\n const key = keyParts.join(':')\n await ctx.state.delete(groupId, key)\n }\n\n return {\n status: 204,\n body: '',\n }\n } catch (error: unknown) {\n return {\n status: 500,\n body: { error: error instanceof Error ? error.message : 'Unknown error' },\n }\n }\n },\n )\n}\n","import type { MotiaPlugin, MotiaPluginContext } from '@motiadev/core'\nimport { api } from './api'\n\nexport default function plugin(motia: MotiaPluginContext): MotiaPlugin {\n api(motia)\n\n return {\n workbench: [\n {\n packageName: '@motiadev/plugin-states',\n cssImports: ['@motiadev/plugin-states/dist/styles.css'],\n label: 'States',\n position: 'bottom',\n componentName: 'StatesPage',\n labelIcon: 'file',\n },\n ],\n }\n}\n"],"mappings":";AAEA,MAAa,OAAO,UAAoC;AACtD,OAAM,YACJ;EACE,QAAQ;EACR,MAAM;EACP,EACD,OAAO,QAA0C;AAC/C,MAAI;GACF,MAAM,UAAU,IAAI,YAAY;GAChC,MAAM,SAAS,IAAI,YAAY,SAAS,KAAK,MAAM,IAAI,YAAY,OAAiB,GAAG;AAGvF,UAAO;IACL,QAAQ;IACR,MAJY,MAAM,MAAM,MAAM,MAAM;KAAE;KAAS;KAAQ,CAAC;IAKzD;WACMA,OAAgB;AACvB,UAAO;IACL,QAAQ;IACR,MAAM,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,iBAAiB;IAC1E;;GAGN;AAED,OAAM,YACJ;EACE,QAAQ;EACR,MAAM;EACP,EACD,OAAO,KAAiB,QAA2C;AACjE,MAAI;GACF,MAAM,EAAE,KAAK,SAAS,UAAU,IAAI;AACpC,SAAM,IAAI,MAAM,IAAI,SAAS,KAAK,MAAM;AACxC,UAAO;IACL,QAAQ;IACR,MAAM;KAAE;KAAK;KAAS;KAAO;IAC9B;WACMA,OAAgB;AACvB,UAAO;IACL,QAAQ;IACR,MAAM,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,iBAAiB;IAC1E;;GAGN;AAED,OAAM,YACJ;EACE,QAAQ;EACR,MAAM;EACP,EACD,OAAO,KAAiB,QAA2C;AACjE,MAAI;AACF,QAAK,MAAM,MAAO,IAAI,KAA2B,KAAK;IACpD,MAAM,CAAC,SAAS,GAAG,YAAY,GAAG,MAAM,IAAI;IAC5C,MAAM,MAAM,SAAS,KAAK,IAAI;AAC9B,UAAM,IAAI,MAAM,OAAO,SAAS,IAAI;;AAGtC,UAAO;IACL,QAAQ;IACR,MAAM;IACP;WACMA,OAAgB;AACvB,UAAO;IACL,QAAQ;IACR,MAAM,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,iBAAiB;IAC1E;;GAGN;;;;;ACtEH,SAAwB,OAAO,OAAwC;AACrE,KAAI,MAAM;AAEV,QAAO,EACL,WAAW,CACT;EACE,aAAa;EACb,YAAY,CAAC,0CAA0C;EACvD,OAAO;EACP,UAAU;EACV,eAAe;EACf,WAAW;EACZ,CACF,EACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@motiadev/plugin-states",
|
|
3
|
-
"version": "0.17.6-beta.188-
|
|
3
|
+
"version": "0.17.6-beta.188-710084",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -16,14 +16,15 @@
|
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"@monaco-editor/react": "^4.7.0",
|
|
18
18
|
"lucide-react": "^0.555.0",
|
|
19
|
+
"react": "^19.2.3",
|
|
19
20
|
"react18-json-view": "^0.2.9",
|
|
20
21
|
"zustand": "^5.0.8"
|
|
21
22
|
},
|
|
22
23
|
"peerDependencies": {
|
|
23
24
|
"react": "^19.2.3",
|
|
24
|
-
"@motiadev/
|
|
25
|
-
"
|
|
26
|
-
"
|
|
25
|
+
"@motiadev/ui": "0.17.6-beta.188-710084",
|
|
26
|
+
"motia": "0.17.6-beta.188-710084",
|
|
27
|
+
"@motiadev/core": "0.17.6-beta.188-710084"
|
|
27
28
|
},
|
|
28
29
|
"devDependencies": {
|
|
29
30
|
"@bosh-code/tsdown-plugin-inject-css": "^2.0.0",
|