wealth-alpha-chat-widget 1.0.9 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -894,40 +894,48 @@ var CARD_DISCLAIMER = "AI-assisted, educational only. Not financial advice. Cons
894
894
  var SECTOR_TOGGLE_PREFIX = "__portfolio_sector_toggle:::";
895
895
  var SECTORS_DONE_ID = "__portfolio_sectors_done";
896
896
  var escapeHtml = (s) => s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
897
- function collectSelectedSectors(root) {
898
- return Array.from(
899
- root.querySelectorAll(`.srow[data-chip^="${SECTOR_TOGGLE_PREFIX}"]`)
900
- ).filter((row) => row.classList.contains("selected")).map((row) => (row.getAttribute("data-chip") ?? "").slice(SECTOR_TOGGLE_PREFIX.length)).filter(Boolean);
901
- }
897
+ var sectorNameOf = (row) => (row.getAttribute("data-chip") ?? "").slice(SECTOR_TOGGLE_PREFIX.length);
902
898
  function MessageBubble({ message, onChipClick, onFeedback }) {
903
899
  const isBot = message.role === "bot";
904
900
  const [rating, setRating] = react.useState(null);
905
901
  const markdownRef = react.useRef(null);
906
902
  const isSectorCard = isBot && message.content.includes(SECTOR_TOGGLE_PREFIX);
903
+ const [selectedSectors, setSelectedSectors] = react.useState(() => /* @__PURE__ */ new Set());
907
904
  const rate = (value) => {
908
905
  setRating(value);
909
906
  onFeedback?.(message.id, value);
910
907
  };
911
908
  const isCard = isBot && message.content.includes("<div");
912
909
  const bubbleClass = isBot ? `${chat_default.bubble} ${isCard ? chat_default.bubbleCard : chat_default.bubbleBot}` : `${chat_default.bubble} ${chat_default.bubbleUser}`;
913
- const refreshSectorSummary = () => {
910
+ const applySelectionToDom = react.useCallback(() => {
914
911
  const root = markdownRef.current;
915
912
  if (!root) return;
916
- const names = collectSelectedSectors(root);
913
+ root.querySelectorAll(`.srow[data-chip^="${SECTOR_TOGGLE_PREFIX}"]`).forEach((row) => row.classList.toggle("selected", selectedSectors.has(sectorNameOf(row))));
917
914
  const summary = root.querySelector(".wa-sel-summary");
918
915
  if (summary) {
916
+ const names = Array.from(selectedSectors);
919
917
  const list = names.length ? names.map(escapeHtml).join(", ") : "\u2014";
920
918
  summary.innerHTML = `<span class="chk">\u2705</span>Selected (<b>${names.length}</b>): <b>${list}</b>`;
921
919
  }
922
- };
920
+ }, [selectedSectors]);
921
+ react.useLayoutEffect(() => {
922
+ if (isSectorCard) applySelectionToDom();
923
+ }, [isSectorCard, applySelectionToDom, message.content]);
923
924
  const handleMarkdownClick = (e) => {
924
925
  const toggleRow = e.target.closest(
925
926
  `.srow[data-chip^="${SECTOR_TOGGLE_PREFIX}"]`
926
927
  );
927
928
  if (toggleRow) {
928
929
  e.preventDefault();
929
- toggleRow.classList.toggle("selected");
930
- refreshSectorSummary();
930
+ const name = sectorNameOf(toggleRow);
931
+ if (name) {
932
+ setSelectedSectors((prev) => {
933
+ const next = new Set(prev);
934
+ if (next.has(name)) next.delete(name);
935
+ else next.add(name);
936
+ return next;
937
+ });
938
+ }
931
939
  return;
932
940
  }
933
941
  const anchor = e.target.closest("a");
@@ -937,7 +945,7 @@ function MessageBubble({ message, onChipClick, onFeedback }) {
937
945
  };
938
946
  const handleChipClick = (chip) => {
939
947
  if (isSectorCard && chip.id === SECTORS_DONE_ID) {
940
- const names = markdownRef.current ? collectSelectedSectors(markdownRef.current) : [];
948
+ const names = Array.from(selectedSectors);
941
949
  const id = names.length ? `${SECTORS_DONE_ID}:::${names.join(",")}` : SECTORS_DONE_ID;
942
950
  onChipClick({ ...chip, id });
943
951
  return;