@assistant-ui/react 0.0.2 → 0.0.3

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.d.mts CHANGED
@@ -35,8 +35,13 @@ declare const ThreadViewport: react.ForwardRefExoticComponent<Pick<Omit<react.De
35
35
  type ThreadMessagesProps = {
36
36
  components: {
37
37
  Message: React.ComponentType;
38
+ UserMessage?: React.ComponentType;
39
+ EditingUserMessage?: React.ComponentType;
40
+ AssistantMessage?: React.ComponentType;
38
41
  } | {
42
+ Message?: React.ComponentType;
39
43
  UserMessage: React.ComponentType;
44
+ EditingUserMessage?: React.ComponentType;
40
45
  AssistantMessage: React.ComponentType;
41
46
  };
42
47
  };
@@ -137,9 +142,7 @@ declare const ActionBarRoot: react.ForwardRefExoticComponent<Pick<Omit<react.Det
137
142
  ref?: ((instance: HTMLDivElement | null) => void) | react.RefObject<HTMLDivElement> | null | undefined;
138
143
  } & {
139
144
  asChild?: boolean;
140
- }, "key" | keyof react.HTMLAttributes<HTMLDivElement> | "asChild"> & {
141
- hideWhenEditing?: boolean;
142
- } & react.RefAttributes<HTMLDivElement>>;
145
+ }, "key" | keyof react.HTMLAttributes<HTMLDivElement> | "asChild"> & react.RefAttributes<HTMLDivElement>>;
143
146
 
144
147
  type ActionBarCopyProps = {
145
148
  copiedDuration?: number;
@@ -170,9 +173,7 @@ declare const EditBarRoot: react.ForwardRefExoticComponent<Pick<Omit<react.Detai
170
173
  ref?: ((instance: HTMLDivElement | null) => void) | react.RefObject<HTMLDivElement> | null | undefined;
171
174
  } & {
172
175
  asChild?: boolean;
173
- }, "key" | keyof react.HTMLAttributes<HTMLDivElement> | "asChild"> & {
174
- hideWhenNotEditing?: boolean;
175
- } & react.RefAttributes<HTMLDivElement>>;
176
+ }, "key" | keyof react.HTMLAttributes<HTMLDivElement> | "asChild"> & react.RefAttributes<HTMLDivElement>>;
176
177
 
177
178
  declare const EditBarSave: react.ForwardRefExoticComponent<Pick<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & {
178
179
  ref?: ((instance: HTMLButtonElement | null) => void) | react.RefObject<HTMLButtonElement> | null | undefined;
@@ -221,7 +222,7 @@ declare const useMessageContext: <Selection>(consumerName: string, selector: (s:
221
222
 
222
223
  declare const useCopyMessage: ({ copiedDuration }: {
223
224
  copiedDuration?: number | undefined;
224
- }) => () => void;
225
+ }) => (() => void) | null;
225
226
 
226
227
  declare const useReloadMessage: () => (() => Promise<void>) | null;
227
228
 
package/dist/index.d.ts CHANGED
@@ -35,8 +35,13 @@ declare const ThreadViewport: react.ForwardRefExoticComponent<Pick<Omit<react.De
35
35
  type ThreadMessagesProps = {
36
36
  components: {
37
37
  Message: React.ComponentType;
38
+ UserMessage?: React.ComponentType;
39
+ EditingUserMessage?: React.ComponentType;
40
+ AssistantMessage?: React.ComponentType;
38
41
  } | {
42
+ Message?: React.ComponentType;
39
43
  UserMessage: React.ComponentType;
44
+ EditingUserMessage?: React.ComponentType;
40
45
  AssistantMessage: React.ComponentType;
41
46
  };
42
47
  };
@@ -137,9 +142,7 @@ declare const ActionBarRoot: react.ForwardRefExoticComponent<Pick<Omit<react.Det
137
142
  ref?: ((instance: HTMLDivElement | null) => void) | react.RefObject<HTMLDivElement> | null | undefined;
138
143
  } & {
139
144
  asChild?: boolean;
140
- }, "key" | keyof react.HTMLAttributes<HTMLDivElement> | "asChild"> & {
141
- hideWhenEditing?: boolean;
142
- } & react.RefAttributes<HTMLDivElement>>;
145
+ }, "key" | keyof react.HTMLAttributes<HTMLDivElement> | "asChild"> & react.RefAttributes<HTMLDivElement>>;
143
146
 
144
147
  type ActionBarCopyProps = {
145
148
  copiedDuration?: number;
@@ -170,9 +173,7 @@ declare const EditBarRoot: react.ForwardRefExoticComponent<Pick<Omit<react.Detai
170
173
  ref?: ((instance: HTMLDivElement | null) => void) | react.RefObject<HTMLDivElement> | null | undefined;
171
174
  } & {
172
175
  asChild?: boolean;
173
- }, "key" | keyof react.HTMLAttributes<HTMLDivElement> | "asChild"> & {
174
- hideWhenNotEditing?: boolean;
175
- } & react.RefAttributes<HTMLDivElement>>;
176
+ }, "key" | keyof react.HTMLAttributes<HTMLDivElement> | "asChild"> & react.RefAttributes<HTMLDivElement>>;
176
177
 
177
178
  declare const EditBarSave: react.ForwardRefExoticComponent<Pick<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & {
178
179
  ref?: ((instance: HTMLButtonElement | null) => void) | react.RefObject<HTMLButtonElement> | null | undefined;
@@ -221,7 +222,7 @@ declare const useMessageContext: <Selection>(consumerName: string, selector: (s:
221
222
 
222
223
  declare const useCopyMessage: ({ copiedDuration }: {
223
224
  copiedDuration?: number | undefined;
224
- }) => () => void;
225
+ }) => (() => void) | null;
225
226
 
226
227
  declare const useReloadMessage: () => (() => Promise<void>) | null;
227
228
 
package/dist/index.js CHANGED
@@ -186,7 +186,6 @@ var useOnResizeContent = (ref, callback) => {
186
186
  return;
187
187
  const resizeObserver = new ResizeObserver(() => {
188
188
  callbackRef.current();
189
- console.log("resize observed");
190
189
  });
191
190
  const mutationObserver = new MutationObserver((mutations) => {
192
191
  for (const mutation of mutations) {
@@ -203,6 +202,7 @@ var useOnResizeContent = (ref, callback) => {
203
202
  }
204
203
  callbackRef.current();
205
204
  });
205
+ resizeObserver.observe(el);
206
206
  mutationObserver.observe(el, { childList: true });
207
207
  for (const child of el.children) {
208
208
  resizeObserver.observe(child);
@@ -514,22 +514,23 @@ var MessageEditableContent = (0, import_react8.forwardRef)(({ onChange, value, .
514
514
 
515
515
  // src/primitives/thread/ThreadMessages.tsx
516
516
  var getComponents = (components) => {
517
- if ("Message" in components) {
518
- return {
519
- UserMessage: components.Message,
520
- AssistantMessage: components.Message
521
- };
522
- }
523
- return components;
517
+ return {
518
+ EditingUserMessage: components.EditingUserMessage ?? components.UserMessage ?? components.Message,
519
+ UserMessage: components.UserMessage ?? components.Message,
520
+ AssistantMessage: components.AssistantMessage ?? components.Message
521
+ };
524
522
  };
525
523
  var ThreadMessages = ({ components }) => {
526
524
  const chat = useThreadContext("Thread.Messages", (s) => s.chat);
527
525
  const messages = chat.messages;
528
- const { UserMessage, AssistantMessage } = getComponents(components);
526
+ const { UserMessage, EditingUserMessage, AssistantMessage } = getComponents(components);
529
527
  if (messages.length === 0)
530
528
  return null;
531
- return /* @__PURE__ */ React.createElement(React.Fragment, null, messages.map((message) => {
532
- return /* @__PURE__ */ React.createElement(MessageProvider, { key: message.id, message }, message.role === "assistant" ? /* @__PURE__ */ React.createElement(AssistantMessage, null) : /* @__PURE__ */ React.createElement(UserMessage, null));
529
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, messages.map((message, idx) => {
530
+ return (
531
+ // biome-ignore lint/suspicious/noArrayIndexKey: fixes a11y issues with branch navigation
532
+ /* @__PURE__ */ React.createElement(MessageProvider, { key: idx, message }, /* @__PURE__ */ React.createElement(MessageIf, { user: true, editing: false }, /* @__PURE__ */ React.createElement(UserMessage, null)), /* @__PURE__ */ React.createElement(MessageIf, { user: true, editing: true }, /* @__PURE__ */ React.createElement(EditingUserMessage, null)), /* @__PURE__ */ React.createElement(MessageIf, { assistant: true }, /* @__PURE__ */ React.createElement(AssistantMessage, null)))
533
+ );
533
534
  }), chat.isLoading && chat.messages[chat.messages.length - 1]?.role !== "assistant" && /* @__PURE__ */ React.createElement(
534
535
  MessageProvider,
535
536
  {
@@ -698,12 +699,19 @@ var useGoToNextBranch = () => {
698
699
  "BranchPicker.Next",
699
700
  (s) => s.chat.switchToBranch
700
701
  );
701
- const [message, { branchId, branchCount }] = useMessageContext(
702
- "BranchPicker.Next",
703
- (s) => [s.message, s.branchState]
704
- );
705
- if (branchCount <= 1 || branchId + 1 >= branchCount)
702
+ const context = useMessageContext("BranchPicker.Next", (s) => {
703
+ const {
704
+ message: message2,
705
+ editState: { isEditing },
706
+ branchState: { branchId: branchId2, branchCount }
707
+ } = s;
708
+ if (isEditing || branchCount <= 1 || branchId2 + 1 >= branchCount)
709
+ return null;
710
+ return { message: message2, branchId: branchId2 };
711
+ });
712
+ if (!context)
706
713
  return null;
714
+ const { message, branchId } = context;
707
715
  return () => {
708
716
  switchToBranch(message, branchId + 1);
709
717
  };
@@ -718,12 +726,19 @@ var useGoToPreviousBranch = () => {
718
726
  "BranchPicker.Previous",
719
727
  (s) => s.chat.switchToBranch
720
728
  );
721
- const [message, { branchId, branchCount }] = useMessageContext(
722
- "BranchPicker.Previous",
723
- (s) => [s.message, s.branchState]
724
- );
725
- if (branchCount <= 1 || branchId <= 0)
729
+ const context = useMessageContext("BranchPicker.Previous", (s) => {
730
+ const {
731
+ message: message2,
732
+ editState: { isEditing },
733
+ branchState: { branchId: branchId2, branchCount }
734
+ } = s;
735
+ if (isEditing || branchCount <= 1 || branchId2 <= 0)
736
+ return null;
737
+ return { message: message2, branchId: branchId2 };
738
+ });
739
+ if (!context)
726
740
  return null;
741
+ const { message, branchId } = context;
727
742
  return () => {
728
743
  switchToBranch(message, branchId - 1);
729
744
  };
@@ -769,18 +784,27 @@ __export(actionBar_exports, {
769
784
  // src/primitives/actionBar/ActionBarRoot.tsx
770
785
  var import_react_primitive8 = require("@radix-ui/react-primitive");
771
786
  var import_react14 = require("react");
772
- var ActionBarRoot = (0, import_react14.forwardRef)(({ hideWhenEditing = false, ...rest }, ref) => {
773
- return /* @__PURE__ */ React.createElement(MessageIf, { editing: hideWhenEditing ? false : void 0 }, /* @__PURE__ */ React.createElement(import_react_primitive8.Primitive.div, { ...rest, ref }));
787
+ var ActionBarRoot = (0, import_react14.forwardRef)(({ ...rest }, ref) => {
788
+ return /* @__PURE__ */ React.createElement(import_react_primitive8.Primitive.div, { ...rest, ref });
774
789
  });
775
790
 
776
791
  // src/actions/useCopyMessage.tsx
777
792
  var useCopyMessage = ({ copiedDuration = 3e3 }) => {
778
- const [messageContent, setIsCopied] = useMessageContext(
779
- "ActionBar.Copy",
780
- (s) => [s.message.content, s.setIsCopied]
781
- );
793
+ const context = useMessageContext("ActionBar.Copy", (s) => {
794
+ const {
795
+ editState: { isEditing },
796
+ message: { content: content2 },
797
+ setIsCopied: setIsCopied2
798
+ } = s;
799
+ if (isEditing)
800
+ return null;
801
+ return { content: content2, setIsCopied: setIsCopied2 };
802
+ });
803
+ if (!context)
804
+ return null;
805
+ const { content, setIsCopied } = context;
782
806
  return () => {
783
- navigator.clipboard.writeText(messageContent);
807
+ navigator.clipboard.writeText(content);
784
808
  setIsCopied(true);
785
809
  setTimeout(() => setIsCopied(false), copiedDuration);
786
810
  };
@@ -795,8 +819,13 @@ var useReloadMessage = () => {
795
819
  s.chat.isLoading,
796
820
  s.chat.reloadAt
797
821
  ]);
798
- const message = useMessageContext("ActionBar.Reload", (s) => s.message);
799
- if (message.role !== "assistant" || isLoading)
822
+ const message = useMessageContext("ActionBar.Reload", (s) => {
823
+ const message2 = s.message;
824
+ if (message2.role !== "assistant" || isLoading)
825
+ return null;
826
+ return message2;
827
+ });
828
+ if (!message)
800
829
  return null;
801
830
  return () => reloadAt(message);
802
831
  };
@@ -806,14 +835,21 @@ var ActionBarReload = createActionButton(useReloadMessage);
806
835
 
807
836
  // src/actions/useBeginMessageEdit.tsx
808
837
  var useBeginMessageEdit = () => {
809
- const [editState, messageContent, setEditState] = useMessageContext(
810
- "ActionBar.Edit",
811
- (s) => [s.editState, s.message.content, s.setEditState]
812
- );
813
- if (editState.isEditing)
838
+ const context = useMessageContext("ActionBar.Edit", (s) => {
839
+ const {
840
+ message: { content: content2 },
841
+ editState: { isEditing },
842
+ setEditState: setEditState2
843
+ } = s;
844
+ if (isEditing)
845
+ return null;
846
+ return { content: content2, setEditState: setEditState2 };
847
+ });
848
+ if (!context)
814
849
  return null;
850
+ const { content, setEditState } = context;
815
851
  return () => {
816
- setEditState({ isEditing: true, value: messageContent });
852
+ setEditState({ isEditing: true, value: content });
817
853
  };
818
854
  };
819
855
 
@@ -832,28 +868,29 @@ __export(editBar_exports, {
832
868
  var import_react_primitive9 = require("@radix-ui/react-primitive");
833
869
  var import_react15 = require("react");
834
870
  var EditBarRoot = (0, import_react15.forwardRef)(
835
- ({ hideWhenNotEditing, ...rest }, ref) => {
836
- return /* @__PURE__ */ React.createElement(MessageIf, { editing: hideWhenNotEditing ? true : void 0 }, /* @__PURE__ */ React.createElement(import_react_primitive9.Primitive.div, { ...rest, ref }));
871
+ ({ ...rest }, ref) => {
872
+ return /* @__PURE__ */ React.createElement(import_react_primitive9.Primitive.div, { ...rest, ref });
837
873
  }
838
874
  );
839
875
 
840
876
  // src/actions/useSaveMessageEdit.tsx
841
877
  var useSaveMessageEdit = () => {
842
878
  const chat = useThreadContext("EditBar.Save", (s) => s.chat);
843
- const [editState, message, setEditState] = useMessageContext(
844
- "EditBar.Save",
845
- (s) => [s.editState, s.message, s.setEditState]
846
- );
847
- if (!editState.isEditing)
879
+ const context = useMessageContext("EditBar.Save", (s) => {
880
+ const { message: message2, editState, setEditState: setEditState2 } = s;
881
+ if (!editState.isEditing)
882
+ return null;
883
+ return { message: message2, content: editState.value, setEditState: setEditState2 };
884
+ });
885
+ if (!context)
848
886
  return null;
887
+ const { message, content, setEditState } = context;
849
888
  return () => {
850
- if (!editState.isEditing)
851
- return;
852
889
  chat.editAt(message, {
853
890
  ...message,
854
891
  id: void 0,
855
892
  // remove id to create a new message
856
- content: editState.value
893
+ content
857
894
  });
858
895
  setEditState({ isEditing: false });
859
896
  };
@@ -864,12 +901,18 @@ var EditBarSave = createActionButton(useSaveMessageEdit);
864
901
 
865
902
  // src/actions/useCancelMessageEdit.tsx
866
903
  var useCancelMessageEdit = () => {
867
- const [isEditing, setEditState] = useMessageContext("EditBar.Cancel", (s) => [
868
- s.editState.isEditing,
869
- s.setEditState
870
- ]);
871
- if (!isEditing)
904
+ const context = useMessageContext("EditBar.Cancel", (s) => {
905
+ const {
906
+ editState: { isEditing },
907
+ setEditState: setEditState2
908
+ } = s;
909
+ if (!isEditing)
910
+ return null;
911
+ return { setEditState: setEditState2 };
912
+ });
913
+ if (!context)
872
914
  return null;
915
+ const { setEditState } = context;
873
916
  return () => {
874
917
  setEditState({ isEditing: false });
875
918
  };
package/dist/index.mjs CHANGED
@@ -151,7 +151,6 @@ var useOnResizeContent = (ref, callback) => {
151
151
  return;
152
152
  const resizeObserver = new ResizeObserver(() => {
153
153
  callbackRef.current();
154
- console.log("resize observed");
155
154
  });
156
155
  const mutationObserver = new MutationObserver((mutations) => {
157
156
  for (const mutation of mutations) {
@@ -168,6 +167,7 @@ var useOnResizeContent = (ref, callback) => {
168
167
  }
169
168
  callbackRef.current();
170
169
  });
170
+ resizeObserver.observe(el);
171
171
  mutationObserver.observe(el, { childList: true });
172
172
  for (const child of el.children) {
173
173
  resizeObserver.observe(child);
@@ -481,22 +481,23 @@ var MessageEditableContent = forwardRef4(({ onChange, value, ...rest }, forwarde
481
481
 
482
482
  // src/primitives/thread/ThreadMessages.tsx
483
483
  var getComponents = (components) => {
484
- if ("Message" in components) {
485
- return {
486
- UserMessage: components.Message,
487
- AssistantMessage: components.Message
488
- };
489
- }
490
- return components;
484
+ return {
485
+ EditingUserMessage: components.EditingUserMessage ?? components.UserMessage ?? components.Message,
486
+ UserMessage: components.UserMessage ?? components.Message,
487
+ AssistantMessage: components.AssistantMessage ?? components.Message
488
+ };
491
489
  };
492
490
  var ThreadMessages = ({ components }) => {
493
491
  const chat = useThreadContext("Thread.Messages", (s) => s.chat);
494
492
  const messages = chat.messages;
495
- const { UserMessage, AssistantMessage } = getComponents(components);
493
+ const { UserMessage, EditingUserMessage, AssistantMessage } = getComponents(components);
496
494
  if (messages.length === 0)
497
495
  return null;
498
- return /* @__PURE__ */ React.createElement(React.Fragment, null, messages.map((message) => {
499
- return /* @__PURE__ */ React.createElement(MessageProvider, { key: message.id, message }, message.role === "assistant" ? /* @__PURE__ */ React.createElement(AssistantMessage, null) : /* @__PURE__ */ React.createElement(UserMessage, null));
496
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, messages.map((message, idx) => {
497
+ return (
498
+ // biome-ignore lint/suspicious/noArrayIndexKey: fixes a11y issues with branch navigation
499
+ /* @__PURE__ */ React.createElement(MessageProvider, { key: idx, message }, /* @__PURE__ */ React.createElement(MessageIf, { user: true, editing: false }, /* @__PURE__ */ React.createElement(UserMessage, null)), /* @__PURE__ */ React.createElement(MessageIf, { user: true, editing: true }, /* @__PURE__ */ React.createElement(EditingUserMessage, null)), /* @__PURE__ */ React.createElement(MessageIf, { assistant: true }, /* @__PURE__ */ React.createElement(AssistantMessage, null)))
500
+ );
500
501
  }), chat.isLoading && chat.messages[chat.messages.length - 1]?.role !== "assistant" && /* @__PURE__ */ React.createElement(
501
502
  MessageProvider,
502
503
  {
@@ -671,12 +672,19 @@ var useGoToNextBranch = () => {
671
672
  "BranchPicker.Next",
672
673
  (s) => s.chat.switchToBranch
673
674
  );
674
- const [message, { branchId, branchCount }] = useMessageContext(
675
- "BranchPicker.Next",
676
- (s) => [s.message, s.branchState]
677
- );
678
- if (branchCount <= 1 || branchId + 1 >= branchCount)
675
+ const context = useMessageContext("BranchPicker.Next", (s) => {
676
+ const {
677
+ message: message2,
678
+ editState: { isEditing },
679
+ branchState: { branchId: branchId2, branchCount }
680
+ } = s;
681
+ if (isEditing || branchCount <= 1 || branchId2 + 1 >= branchCount)
682
+ return null;
683
+ return { message: message2, branchId: branchId2 };
684
+ });
685
+ if (!context)
679
686
  return null;
687
+ const { message, branchId } = context;
680
688
  return () => {
681
689
  switchToBranch(message, branchId + 1);
682
690
  };
@@ -691,12 +699,19 @@ var useGoToPreviousBranch = () => {
691
699
  "BranchPicker.Previous",
692
700
  (s) => s.chat.switchToBranch
693
701
  );
694
- const [message, { branchId, branchCount }] = useMessageContext(
695
- "BranchPicker.Previous",
696
- (s) => [s.message, s.branchState]
697
- );
698
- if (branchCount <= 1 || branchId <= 0)
702
+ const context = useMessageContext("BranchPicker.Previous", (s) => {
703
+ const {
704
+ message: message2,
705
+ editState: { isEditing },
706
+ branchState: { branchId: branchId2, branchCount }
707
+ } = s;
708
+ if (isEditing || branchCount <= 1 || branchId2 <= 0)
709
+ return null;
710
+ return { message: message2, branchId: branchId2 };
711
+ });
712
+ if (!context)
699
713
  return null;
714
+ const { message, branchId } = context;
700
715
  return () => {
701
716
  switchToBranch(message, branchId - 1);
702
717
  };
@@ -746,18 +761,27 @@ import {
746
761
  Primitive as Primitive8
747
762
  } from "@radix-ui/react-primitive";
748
763
  import { forwardRef as forwardRef10 } from "react";
749
- var ActionBarRoot = forwardRef10(({ hideWhenEditing = false, ...rest }, ref) => {
750
- return /* @__PURE__ */ React.createElement(MessageIf, { editing: hideWhenEditing ? false : void 0 }, /* @__PURE__ */ React.createElement(Primitive8.div, { ...rest, ref }));
764
+ var ActionBarRoot = forwardRef10(({ ...rest }, ref) => {
765
+ return /* @__PURE__ */ React.createElement(Primitive8.div, { ...rest, ref });
751
766
  });
752
767
 
753
768
  // src/actions/useCopyMessage.tsx
754
769
  var useCopyMessage = ({ copiedDuration = 3e3 }) => {
755
- const [messageContent, setIsCopied] = useMessageContext(
756
- "ActionBar.Copy",
757
- (s) => [s.message.content, s.setIsCopied]
758
- );
770
+ const context = useMessageContext("ActionBar.Copy", (s) => {
771
+ const {
772
+ editState: { isEditing },
773
+ message: { content: content2 },
774
+ setIsCopied: setIsCopied2
775
+ } = s;
776
+ if (isEditing)
777
+ return null;
778
+ return { content: content2, setIsCopied: setIsCopied2 };
779
+ });
780
+ if (!context)
781
+ return null;
782
+ const { content, setIsCopied } = context;
759
783
  return () => {
760
- navigator.clipboard.writeText(messageContent);
784
+ navigator.clipboard.writeText(content);
761
785
  setIsCopied(true);
762
786
  setTimeout(() => setIsCopied(false), copiedDuration);
763
787
  };
@@ -772,8 +796,13 @@ var useReloadMessage = () => {
772
796
  s.chat.isLoading,
773
797
  s.chat.reloadAt
774
798
  ]);
775
- const message = useMessageContext("ActionBar.Reload", (s) => s.message);
776
- if (message.role !== "assistant" || isLoading)
799
+ const message = useMessageContext("ActionBar.Reload", (s) => {
800
+ const message2 = s.message;
801
+ if (message2.role !== "assistant" || isLoading)
802
+ return null;
803
+ return message2;
804
+ });
805
+ if (!message)
777
806
  return null;
778
807
  return () => reloadAt(message);
779
808
  };
@@ -783,14 +812,21 @@ var ActionBarReload = createActionButton(useReloadMessage);
783
812
 
784
813
  // src/actions/useBeginMessageEdit.tsx
785
814
  var useBeginMessageEdit = () => {
786
- const [editState, messageContent, setEditState] = useMessageContext(
787
- "ActionBar.Edit",
788
- (s) => [s.editState, s.message.content, s.setEditState]
789
- );
790
- if (editState.isEditing)
815
+ const context = useMessageContext("ActionBar.Edit", (s) => {
816
+ const {
817
+ message: { content: content2 },
818
+ editState: { isEditing },
819
+ setEditState: setEditState2
820
+ } = s;
821
+ if (isEditing)
822
+ return null;
823
+ return { content: content2, setEditState: setEditState2 };
824
+ });
825
+ if (!context)
791
826
  return null;
827
+ const { content, setEditState } = context;
792
828
  return () => {
793
- setEditState({ isEditing: true, value: messageContent });
829
+ setEditState({ isEditing: true, value: content });
794
830
  };
795
831
  };
796
832
 
@@ -811,28 +847,29 @@ import {
811
847
  } from "@radix-ui/react-primitive";
812
848
  import { forwardRef as forwardRef11 } from "react";
813
849
  var EditBarRoot = forwardRef11(
814
- ({ hideWhenNotEditing, ...rest }, ref) => {
815
- return /* @__PURE__ */ React.createElement(MessageIf, { editing: hideWhenNotEditing ? true : void 0 }, /* @__PURE__ */ React.createElement(Primitive9.div, { ...rest, ref }));
850
+ ({ ...rest }, ref) => {
851
+ return /* @__PURE__ */ React.createElement(Primitive9.div, { ...rest, ref });
816
852
  }
817
853
  );
818
854
 
819
855
  // src/actions/useSaveMessageEdit.tsx
820
856
  var useSaveMessageEdit = () => {
821
857
  const chat = useThreadContext("EditBar.Save", (s) => s.chat);
822
- const [editState, message, setEditState] = useMessageContext(
823
- "EditBar.Save",
824
- (s) => [s.editState, s.message, s.setEditState]
825
- );
826
- if (!editState.isEditing)
858
+ const context = useMessageContext("EditBar.Save", (s) => {
859
+ const { message: message2, editState, setEditState: setEditState2 } = s;
860
+ if (!editState.isEditing)
861
+ return null;
862
+ return { message: message2, content: editState.value, setEditState: setEditState2 };
863
+ });
864
+ if (!context)
827
865
  return null;
866
+ const { message, content, setEditState } = context;
828
867
  return () => {
829
- if (!editState.isEditing)
830
- return;
831
868
  chat.editAt(message, {
832
869
  ...message,
833
870
  id: void 0,
834
871
  // remove id to create a new message
835
- content: editState.value
872
+ content
836
873
  });
837
874
  setEditState({ isEditing: false });
838
875
  };
@@ -843,12 +880,18 @@ var EditBarSave = createActionButton(useSaveMessageEdit);
843
880
 
844
881
  // src/actions/useCancelMessageEdit.tsx
845
882
  var useCancelMessageEdit = () => {
846
- const [isEditing, setEditState] = useMessageContext("EditBar.Cancel", (s) => [
847
- s.editState.isEditing,
848
- s.setEditState
849
- ]);
850
- if (!isEditing)
883
+ const context = useMessageContext("EditBar.Cancel", (s) => {
884
+ const {
885
+ editState: { isEditing },
886
+ setEditState: setEditState2
887
+ } = s;
888
+ if (!isEditing)
889
+ return null;
890
+ return { setEditState: setEditState2 };
891
+ });
892
+ if (!context)
851
893
  return null;
894
+ const { setEditState } = context;
852
895
  return () => {
853
896
  setEditState({ isEditing: false });
854
897
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@assistant-ui/react",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "license": "MIT",
5
5
  "exports": {
6
6
  ".": {
@@ -31,7 +31,7 @@
31
31
  "@radix-ui/react-compose-refs": "^1.0.1",
32
32
  "@radix-ui/react-primitive": "^1.0.3",
33
33
  "@radix-ui/react-slot": "^1.0.2",
34
- "ai": "^3.1.1",
34
+ "ai": "^3.1.8",
35
35
  "react-textarea-autosize": "^8.5.3",
36
36
  "use-sync-external-store": "^1.2.2"
37
37
  },