@melony/react 0.1.29 → 0.1.38
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.cjs +43 -26
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -5
- package/dist/index.d.ts +2 -5
- package/dist/index.js +44 -27
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -12,7 +12,6 @@ var classVarianceAuthority = require('class-variance-authority');
|
|
|
12
12
|
var ICONS = require('@tabler/icons-react');
|
|
13
13
|
var menu = require('@base-ui/react/menu');
|
|
14
14
|
var separator = require('@base-ui/react/separator');
|
|
15
|
-
var client = require('melony/client');
|
|
16
15
|
var nuqs = require('nuqs');
|
|
17
16
|
var mergeProps = require('@base-ui/react/merge-props');
|
|
18
17
|
var useRender = require('@base-ui/react/use-render');
|
|
@@ -86,6 +85,7 @@ var MelonyContextProviderInner = ({
|
|
|
86
85
|
setContextValue
|
|
87
86
|
}) => {
|
|
88
87
|
const [state, setState] = React11.useState(client.getState());
|
|
88
|
+
const queryClient = reactQuery.useQueryClient();
|
|
89
89
|
const { data: config } = reactQuery.useQuery({
|
|
90
90
|
queryKey: ["melony-config", client.url],
|
|
91
91
|
queryFn: () => client.getConfig(),
|
|
@@ -137,17 +137,24 @@ var MelonyContextProviderInner = ({
|
|
|
137
137
|
reset([]);
|
|
138
138
|
return true;
|
|
139
139
|
}
|
|
140
|
+
case "client:invalidate-query": {
|
|
141
|
+
const { queryKey } = event.data || {};
|
|
142
|
+
if (queryKey) {
|
|
143
|
+
await queryClient.invalidateQueries({ queryKey });
|
|
144
|
+
}
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
140
147
|
default:
|
|
141
148
|
return false;
|
|
142
149
|
}
|
|
143
150
|
},
|
|
144
|
-
[client, reset]
|
|
151
|
+
[client, reset, queryClient]
|
|
145
152
|
);
|
|
146
153
|
const sendEvent = React11.useCallback(
|
|
147
|
-
async (event
|
|
154
|
+
async (event) => {
|
|
148
155
|
const handled = await dispatchClientAction(event);
|
|
149
156
|
if (handled) return;
|
|
150
|
-
const generator = client.sendEvent(event
|
|
157
|
+
const generator = client.sendEvent(event);
|
|
151
158
|
for await (const incomingEvent of generator) {
|
|
152
159
|
await dispatchClientAction(incomingEvent);
|
|
153
160
|
}
|
|
@@ -794,12 +801,15 @@ var ThreadProvider = ({
|
|
|
794
801
|
initialThreadId: providedInitialThreadId
|
|
795
802
|
}) => {
|
|
796
803
|
const queryClient = reactQuery.useQueryClient();
|
|
797
|
-
const defaultInitialThreadId = React11.useMemo(() => client.generateId(), []);
|
|
798
|
-
const initialThreadId = providedInitialThreadId || defaultInitialThreadId;
|
|
799
804
|
const [activeThreadId, setActiveThreadId] = nuqs.useQueryState(
|
|
800
805
|
"threadId",
|
|
801
|
-
nuqs.parseAsString
|
|
806
|
+
nuqs.parseAsString
|
|
802
807
|
);
|
|
808
|
+
React11.useEffect(() => {
|
|
809
|
+
if (!activeThreadId && providedInitialThreadId) {
|
|
810
|
+
setActiveThreadId(providedInitialThreadId);
|
|
811
|
+
}
|
|
812
|
+
}, [activeThreadId, providedInitialThreadId, setActiveThreadId]);
|
|
803
813
|
const {
|
|
804
814
|
data: threads = [],
|
|
805
815
|
isLoading,
|
|
@@ -816,12 +826,11 @@ var ThreadProvider = ({
|
|
|
816
826
|
});
|
|
817
827
|
const createMutation = reactQuery.useMutation({
|
|
818
828
|
mutationFn: async () => {
|
|
819
|
-
|
|
820
|
-
return newId;
|
|
829
|
+
return null;
|
|
821
830
|
},
|
|
822
|
-
onSuccess: async (
|
|
831
|
+
onSuccess: async () => {
|
|
823
832
|
await queryClient.invalidateQueries({ queryKey: ["threads"] });
|
|
824
|
-
await setActiveThreadId(
|
|
833
|
+
await setActiveThreadId(null);
|
|
825
834
|
}
|
|
826
835
|
});
|
|
827
836
|
const deleteMutation = reactQuery.useMutation({
|
|
@@ -2791,24 +2800,33 @@ function UIRenderer({ node }) {
|
|
|
2791
2800
|
return /* @__PURE__ */ jsxRuntime.jsx(Component, { ...componentProps, children: renderedChildren });
|
|
2792
2801
|
}
|
|
2793
2802
|
function MessageContent({ events }) {
|
|
2803
|
+
const firstSlotIndexes = /* @__PURE__ */ new Map();
|
|
2794
2804
|
const latestSlotIndexes = /* @__PURE__ */ new Map();
|
|
2795
2805
|
events.forEach((event, index) => {
|
|
2796
2806
|
if (event.slot) {
|
|
2807
|
+
if (!firstSlotIndexes.has(event.slot)) {
|
|
2808
|
+
firstSlotIndexes.set(event.slot, index);
|
|
2809
|
+
}
|
|
2797
2810
|
latestSlotIndexes.set(event.slot, index);
|
|
2798
2811
|
}
|
|
2799
2812
|
});
|
|
2800
2813
|
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: events.map((event, index) => {
|
|
2801
|
-
|
|
2802
|
-
|
|
2814
|
+
let displayEvent = event;
|
|
2815
|
+
if (event.slot) {
|
|
2816
|
+
if (firstSlotIndexes.get(event.slot) !== index) {
|
|
2817
|
+
return null;
|
|
2818
|
+
}
|
|
2819
|
+
const latestIndex = latestSlotIndexes.get(event.slot);
|
|
2820
|
+
displayEvent = events[latestIndex];
|
|
2803
2821
|
}
|
|
2804
|
-
if (
|
|
2805
|
-
return /* @__PURE__ */ jsxRuntime.jsx("span", { children:
|
|
2822
|
+
if (displayEvent.type === "text-delta") {
|
|
2823
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { children: displayEvent.data?.delta }, index);
|
|
2806
2824
|
}
|
|
2807
|
-
if (
|
|
2808
|
-
return /* @__PURE__ */ jsxRuntime.jsx("p", { children:
|
|
2825
|
+
if (displayEvent.type === "text") {
|
|
2826
|
+
return /* @__PURE__ */ jsxRuntime.jsx("p", { children: displayEvent.data?.content || displayEvent.data?.text }, index);
|
|
2809
2827
|
}
|
|
2810
|
-
if (
|
|
2811
|
-
return /* @__PURE__ */ jsxRuntime.jsx(UIRenderer, { node:
|
|
2828
|
+
if (displayEvent.ui) {
|
|
2829
|
+
return /* @__PURE__ */ jsxRuntime.jsx(UIRenderer, { node: displayEvent.ui }, index);
|
|
2812
2830
|
}
|
|
2813
2831
|
return null;
|
|
2814
2832
|
}) });
|
|
@@ -2920,9 +2938,7 @@ function Thread({
|
|
|
2920
2938
|
{
|
|
2921
2939
|
type: "text",
|
|
2922
2940
|
role: "user",
|
|
2923
|
-
data: { content: text || "" }
|
|
2924
|
-
},
|
|
2925
|
-
{
|
|
2941
|
+
data: { content: text || "" },
|
|
2926
2942
|
state: {
|
|
2927
2943
|
...state,
|
|
2928
2944
|
threadId: activeThreadId ?? void 0
|
|
@@ -3056,7 +3072,7 @@ var Dropdown = ({
|
|
|
3056
3072
|
] });
|
|
3057
3073
|
};
|
|
3058
3074
|
var ThreadList = ({ className }) => {
|
|
3059
|
-
const { threads, activeThreadId,
|
|
3075
|
+
const { threads, activeThreadId, deleteThread } = useThreads();
|
|
3060
3076
|
const sortedThreads = React11__namespace.useMemo(() => {
|
|
3061
3077
|
return [...threads].sort((a, b) => {
|
|
3062
3078
|
const dateA = a.updatedAt ? new Date(a.updatedAt).getTime() : 0;
|
|
@@ -3532,7 +3548,6 @@ var CreateThreadButton = ({
|
|
|
3532
3548
|
className,
|
|
3533
3549
|
variant = "ghost",
|
|
3534
3550
|
size = "default",
|
|
3535
|
-
children,
|
|
3536
3551
|
onThreadCreated
|
|
3537
3552
|
}) => {
|
|
3538
3553
|
const { createThread } = useThreads();
|
|
@@ -3542,7 +3557,9 @@ var CreateThreadButton = ({
|
|
|
3542
3557
|
try {
|
|
3543
3558
|
setIsCreating(true);
|
|
3544
3559
|
const threadId = await createThread();
|
|
3545
|
-
|
|
3560
|
+
if (threadId) {
|
|
3561
|
+
onThreadCreated?.(threadId);
|
|
3562
|
+
}
|
|
3546
3563
|
} catch (error) {
|
|
3547
3564
|
console.error("Failed to create thread:", error);
|
|
3548
3565
|
} finally {
|
|
@@ -3647,7 +3664,7 @@ var CreateThreadNavItem = ({
|
|
|
3647
3664
|
onClickAction: {
|
|
3648
3665
|
type: "client:navigate",
|
|
3649
3666
|
data: {
|
|
3650
|
-
url:
|
|
3667
|
+
url: "?"
|
|
3651
3668
|
}
|
|
3652
3669
|
},
|
|
3653
3670
|
className: cn(className),
|