@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 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, options) => {
154
+ async (event) => {
148
155
  const handled = await dispatchClientAction(event);
149
156
  if (handled) return;
150
- const generator = client.sendEvent(event, options);
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.withDefault(initialThreadId)
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
- const newId = service.createThread ? await service.createThread() : client.generateId();
820
- return newId;
829
+ return null;
821
830
  },
822
- onSuccess: async (newId) => {
831
+ onSuccess: async () => {
823
832
  await queryClient.invalidateQueries({ queryKey: ["threads"] });
824
- await setActiveThreadId(newId);
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
- if (event.slot && latestSlotIndexes.get(event.slot) !== index) {
2802
- return null;
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 (event.type === "text-delta") {
2805
- return /* @__PURE__ */ jsxRuntime.jsx("span", { children: event.data?.delta }, index);
2822
+ if (displayEvent.type === "text-delta") {
2823
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { children: displayEvent.data?.delta }, index);
2806
2824
  }
2807
- if (event.type === "text") {
2808
- return /* @__PURE__ */ jsxRuntime.jsx("p", { children: event.data?.content || event.data?.text }, index);
2825
+ if (displayEvent.type === "text") {
2826
+ return /* @__PURE__ */ jsxRuntime.jsx("p", { children: displayEvent.data?.content || displayEvent.data?.text }, index);
2809
2827
  }
2810
- if (event.ui) {
2811
- return /* @__PURE__ */ jsxRuntime.jsx(UIRenderer, { node: event.ui }, index);
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, selectThread, deleteThread, isLoading } = useThreads();
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
- onThreadCreated?.(threadId);
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: `?threadId=${client.generateId()}`
3667
+ url: "?"
3651
3668
  }
3652
3669
  },
3653
3670
  className: cn(className),