@clivly/chat-widget 0.9.6 → 0.9.7

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.
@@ -376,7 +376,7 @@ function isSendKey(event) {
376
376
  }
377
377
  function generateId() {
378
378
  if (typeof crypto !== "undefined" && "randomUUID" in crypto) return crypto.randomUUID();
379
- return `msg_${Math.random().toString(36).slice(2, 10)}`;
379
+ return `msg_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;
380
380
  }
381
381
  function mergeMessage(messages, nextMessage) {
382
382
  const existingIndex = messages.findIndex((message) => message.id === nextMessage.id);
@@ -375,7 +375,7 @@ function isSendKey(event) {
375
375
  }
376
376
  function generateId() {
377
377
  if (typeof crypto !== "undefined" && "randomUUID" in crypto) return crypto.randomUUID();
378
- return `msg_${Math.random().toString(36).slice(2, 10)}`;
378
+ return `msg_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;
379
379
  }
380
380
  function mergeMessage(messages, nextMessage) {
381
381
  const existingIndex = messages.findIndex((message) => message.id === nextMessage.id);
package/dist/browser.cjs CHANGED
@@ -376,7 +376,7 @@ function isSendKey(event) {
376
376
  }
377
377
  function generateId() {
378
378
  if (typeof crypto !== "undefined" && "randomUUID" in crypto) return crypto.randomUUID();
379
- return `msg_${Math.random().toString(36).slice(2, 10)}`;
379
+ return `msg_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;
380
380
  }
381
381
  function mergeMessage(messages, nextMessage) {
382
382
  const existingIndex = messages.findIndex((message) => message.id === nextMessage.id);
package/dist/browser.mjs CHANGED
@@ -375,7 +375,7 @@ function isSendKey(event) {
375
375
  }
376
376
  function generateId() {
377
377
  if (typeof crypto !== "undefined" && "randomUUID" in crypto) return crypto.randomUUID();
378
- return `msg_${Math.random().toString(36).slice(2, 10)}`;
378
+ return `msg_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;
379
379
  }
380
380
  function mergeMessage(messages, nextMessage) {
381
381
  const existingIndex = messages.findIndex((message) => message.id === nextMessage.id);
package/dist/index.cjs CHANGED
@@ -376,7 +376,7 @@ function isSendKey(event) {
376
376
  }
377
377
  function generateId() {
378
378
  if (typeof crypto !== "undefined" && "randomUUID" in crypto) return crypto.randomUUID();
379
- return `msg_${Math.random().toString(36).slice(2, 10)}`;
379
+ return `msg_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;
380
380
  }
381
381
  function mergeMessage(messages, nextMessage) {
382
382
  const existingIndex = messages.findIndex((message) => message.id === nextMessage.id);
package/dist/index.mjs CHANGED
@@ -375,7 +375,7 @@ function isSendKey(event) {
375
375
  }
376
376
  function generateId() {
377
377
  if (typeof crypto !== "undefined" && "randomUUID" in crypto) return crypto.randomUUID();
378
- return `msg_${Math.random().toString(36).slice(2, 10)}`;
378
+ return `msg_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;
379
379
  }
380
380
  function mergeMessage(messages, nextMessage) {
381
381
  const existingIndex = messages.findIndex((message) => message.id === nextMessage.id);
@@ -344,7 +344,7 @@ process.env.NODE_ENV!==`production`&&(function(){function t(e){if(e==null)return
344
344
  <%s {...props} />
345
345
  React keys must be passed directly to JSX without using spread:
346
346
  let props = %s;
347
- <%s key={someKey} {...props} />`,o,f,m,f),ue[f+o]=!0)}if(f=null,i!==void 0&&(r(i),f=``+i),c(n)&&(r(n.key),f=``+n.key),`key`in n)for(var h in i={},n)h!==`key`&&(i[h]=n[h]);else i=n;return f&&l(i,typeof e==`function`?e.displayName||e.name||`Unknown`:e),d(e,f,i,a(),s,u)}function p(e){m(e)?e._store&&(e._store.validated=1):typeof e==`object`&&e&&e.$$typeof===ie&&(e._payload.status===`fulfilled`?m(e._payload.value)&&e._payload.value._store&&(e._payload.value._store.validated=1):e._store&&(e._store.validated=1))}function m(e){return typeof e==`object`&&!!e&&e.$$typeof===g}var h=o(),g=Symbol.for(`react.transitional.element`),_=Symbol.for(`react.portal`),v=Symbol.for(`react.fragment`),y=Symbol.for(`react.strict_mode`),b=Symbol.for(`react.profiler`),x=Symbol.for(`react.consumer`),ee=Symbol.for(`react.context`),te=Symbol.for(`react.forward_ref`),S=Symbol.for(`react.suspense`),ne=Symbol.for(`react.suspense_list`),re=Symbol.for(`react.memo`),ie=Symbol.for(`react.lazy`),C=Symbol.for(`react.activity`),ae=Symbol.for(`react.client.reference`),w=h.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,oe=Object.prototype.hasOwnProperty,se=Array.isArray,T=console.createTask?console.createTask:function(){return null};h={react_stack_bottom_frame:function(e){return e()}};var ce,le={},E=h.react_stack_bottom_frame.bind(h,s)(),D=T(i(s)),ue={};e.Fragment=v,e.jsx=function(e,t,n){var r=1e4>w.recentlyCreatedOwnerStacks++;return f(e,t,n,!1,r?Error(`react-stack-top-frame`):E,r?T(i(e)):D)},e.jsxs=function(e,t,n){var r=1e4>w.recentlyCreatedOwnerStacks++;return f(e,t,n,!0,r?Error(`react-stack-top-frame`):E,r?T(i(e)):D)}})()})),C=e(((e,t)=>{process.env.NODE_ENV===`production`?t.exports=re():t.exports=ie()}))();let ae={failed:`Failed to send`,pending:`Sending…`,sent:null},w=typeof window>`u`?void 0:window.localStorage;function oe(e){return e.contact?.name??`You`}function se(e,t){return e?e.contact?`${e.contact.name} • ${e.contact.email}`:`Verified visitor`:t}function T(e,t=`sent`){return{...e,delivery:t}}function ce(e){return`clivly-chat-widget:${e}:visitor-token`}function le(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:new Intl.DateTimeFormat(void 0,{hour:`numeric`,minute:`2-digit`,month:`short`,day:`numeric`}).format(t)}function E(e){return e.key===`Enter`&&!(e.shiftKey||e.nativeEvent.isComposing)}function D(){return typeof crypto<`u`&&`randomUUID`in crypto?crypto.randomUUID():`msg_${Math.random().toString(36).slice(2,10)}`}function ue(e,t){let n=e.findIndex(e=>e.id===t.id);if(n===-1)return[...e,T(t)];let r=[...e];return r[n]=T(t),r}function de(e,t,n){return e.map(e=>e.id===t?T(n):e)}function fe(e,t){return e.map(e=>e.id===t?{...e,delivery:`failed`}:e)}function pe(e){return[...e].sort((e,t)=>e.createdAt.localeCompare(t.createdAt))}function me(e,t){return(0,p.useMemo)(()=>{let n=e?.widget.config.brandColor??null;return n?{"--clivly-chat-accent":n,...t}:t},[e?.widget.config.brandColor,t])}function he(e){let[t,n]=(0,p.useState)(()=>te(e));return(0,p.useEffect)(()=>(n(te(e)),S(e,n)),[e]),t}function ge(e,{setError:t,setIsReady:n,setMessages:r}){switch(e.type){case`conversation.snapshot`:r(pe(e.messages.map(e=>T(e))));return;case`error`:t(e.message);return;case`message.ack`:r(t=>pe(de(t,e.clientMessageId,e.message)));return;case`message.created`:{let t=e.clientMessageId;r(n=>pe(t?de(n,t,e.message):ue(n,e.message)));return}case`session.ready`:n(!0);return;default:return}}function _e({message:e}){return(0,C.jsxs)(`article`,{className:`clivly-chat-widget__message`,"data-sender":e.senderType,children:[(0,C.jsxs)(`div`,{className:`clivly-chat-widget__message-meta`,children:[(0,C.jsx)(`span`,{children:e.author??`Clivly`}),(0,C.jsx)(`span`,{children:le(e.createdAt)})]}),(0,C.jsx)(`div`,{children:e.body}),e.delivery===`sent`?null:(0,C.jsx)(`div`,{className:`clivly-chat-widget__status`,children:ae[e.delivery]})]})}function ve({greeting:e,hasSession:t,messages:n}){return t?n.length===0?(0,C.jsx)(`p`,{className:`clivly-chat-widget__empty`,children:`No messages yet. Say hello to get the conversation started.`}):(0,C.jsx)(C.Fragment,{children:n.map(e=>(0,C.jsx)(_e,{message:e},e.id))}):(0,C.jsx)(`p`,{className:`clivly-chat-widget__empty`,children:e})}function ye({className:e,createTransport:t,getSession:n,initiallyOpen:r=!1,launcherLabel:i=`Chat with us`,storage:a=w,style:o,theme:s=`auto`,widgetId:c}){let[l,u]=(0,p.useState)(r),[d,f]=(0,p.useState)(null),[m,h]=(0,p.useState)(!1),[g,_]=(0,p.useState)(!1),[v,y]=(0,p.useState)(``),[b,x]=(0,p.useState)([]),[ee,te]=(0,p.useState)(null),[S,ne]=(0,p.useState)({email:``,name:``}),re=(0,p.useRef)(null),ie=(0,p.useRef)(null),ae=me(ee,o),le=he(s);(0,p.useEffect)(()=>()=>{re.current?.close(),re.current=null},[]),(0,p.useEffect)(()=>{ie.current&&(ie.current.scrollTop=ie.current.scrollHeight)},[b]),(0,p.useEffect)(()=>{if(re.current?.close(),re.current=null,_(!1),!(ee&&t))return;let e=t({handlers:{onClose:()=>{_(!1)},onError:e=>{f(e.message)},onEvent:e=>{ge(e,{setError:f,setIsReady:_,setMessages:x})},onOpen:()=>{_(!0)}},session:ee});return re.current=e,()=>{e.close(),re.current===e&&(re.current=null)}},[t,ee]);let ue=async e=>{e.preventDefault(),f(null),h(!0);try{let e=a?.getItem(ce(c))??null,t=await n({visitor:S,visitorToken:e,widgetId:c});a?.setItem(ce(c),t.visitorToken),te(t),x(pe(t.messages.map(e=>T(e))))}catch(e){let t=e instanceof Error?e:Error(`Failed to start the conversation.`);f(t.message)}finally{h(!1)}},de=e=>{if(e?.preventDefault(),!(ee&&re.current)){f(`Chat is not connected yet.`);return}let t=v.trim();if(!t)return;let n=D(),r={author:oe(ee),body:t,createdAt:new Date().toISOString(),id:n,senderType:`visitor`};x(e=>pe([...e,T(r,`pending`)])),y(``),f(null);try{re.current.sendMessage({body:t,id:n,type:`message.create`})}catch(e){let t=e instanceof Error?e:Error(`Failed to send your message.`);x(e=>fe(e,n)),f(t.message)}},_e=ee?.widget.config.greeting??`Tell us a little about yourself and we’ll pick up the conversation from there.`,ye=ee?.widget.name??`Start a conversation`,be=se(ee,_e);return(0,C.jsxs)(`div`,{className:`clivly-chat-widget ${e??``}`.trim(),"data-clivly-theme":le,style:ae,children:[(0,C.jsx)(`style`,{children:`
347
+ <%s key={someKey} {...props} />`,o,f,m,f),ue[f+o]=!0)}if(f=null,i!==void 0&&(r(i),f=``+i),c(n)&&(r(n.key),f=``+n.key),`key`in n)for(var h in i={},n)h!==`key`&&(i[h]=n[h]);else i=n;return f&&l(i,typeof e==`function`?e.displayName||e.name||`Unknown`:e),d(e,f,i,a(),s,u)}function p(e){m(e)?e._store&&(e._store.validated=1):typeof e==`object`&&e&&e.$$typeof===ie&&(e._payload.status===`fulfilled`?m(e._payload.value)&&e._payload.value._store&&(e._payload.value._store.validated=1):e._store&&(e._store.validated=1))}function m(e){return typeof e==`object`&&!!e&&e.$$typeof===g}var h=o(),g=Symbol.for(`react.transitional.element`),_=Symbol.for(`react.portal`),v=Symbol.for(`react.fragment`),y=Symbol.for(`react.strict_mode`),b=Symbol.for(`react.profiler`),x=Symbol.for(`react.consumer`),ee=Symbol.for(`react.context`),te=Symbol.for(`react.forward_ref`),S=Symbol.for(`react.suspense`),ne=Symbol.for(`react.suspense_list`),re=Symbol.for(`react.memo`),ie=Symbol.for(`react.lazy`),C=Symbol.for(`react.activity`),ae=Symbol.for(`react.client.reference`),w=h.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,oe=Object.prototype.hasOwnProperty,se=Array.isArray,T=console.createTask?console.createTask:function(){return null};h={react_stack_bottom_frame:function(e){return e()}};var ce,le={},E=h.react_stack_bottom_frame.bind(h,s)(),D=T(i(s)),ue={};e.Fragment=v,e.jsx=function(e,t,n){var r=1e4>w.recentlyCreatedOwnerStacks++;return f(e,t,n,!1,r?Error(`react-stack-top-frame`):E,r?T(i(e)):D)},e.jsxs=function(e,t,n){var r=1e4>w.recentlyCreatedOwnerStacks++;return f(e,t,n,!0,r?Error(`react-stack-top-frame`):E,r?T(i(e)):D)}})()})),C=e(((e,t)=>{process.env.NODE_ENV===`production`?t.exports=re():t.exports=ie()}))();let ae={failed:`Failed to send`,pending:`Sending…`,sent:null},w=typeof window>`u`?void 0:window.localStorage;function oe(e){return e.contact?.name??`You`}function se(e,t){return e?e.contact?`${e.contact.name} • ${e.contact.email}`:`Verified visitor`:t}function T(e,t=`sent`){return{...e,delivery:t}}function ce(e){return`clivly-chat-widget:${e}:visitor-token`}function le(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:new Intl.DateTimeFormat(void 0,{hour:`numeric`,minute:`2-digit`,month:`short`,day:`numeric`}).format(t)}function E(e){return e.key===`Enter`&&!(e.shiftKey||e.nativeEvent.isComposing)}function D(){return typeof crypto<`u`&&`randomUUID`in crypto?crypto.randomUUID():`msg_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,10)}`}function ue(e,t){let n=e.findIndex(e=>e.id===t.id);if(n===-1)return[...e,T(t)];let r=[...e];return r[n]=T(t),r}function de(e,t,n){return e.map(e=>e.id===t?T(n):e)}function fe(e,t){return e.map(e=>e.id===t?{...e,delivery:`failed`}:e)}function pe(e){return[...e].sort((e,t)=>e.createdAt.localeCompare(t.createdAt))}function me(e,t){return(0,p.useMemo)(()=>{let n=e?.widget.config.brandColor??null;return n?{"--clivly-chat-accent":n,...t}:t},[e?.widget.config.brandColor,t])}function he(e){let[t,n]=(0,p.useState)(()=>te(e));return(0,p.useEffect)(()=>(n(te(e)),S(e,n)),[e]),t}function ge(e,{setError:t,setIsReady:n,setMessages:r}){switch(e.type){case`conversation.snapshot`:r(pe(e.messages.map(e=>T(e))));return;case`error`:t(e.message);return;case`message.ack`:r(t=>pe(de(t,e.clientMessageId,e.message)));return;case`message.created`:{let t=e.clientMessageId;r(n=>pe(t?de(n,t,e.message):ue(n,e.message)));return}case`session.ready`:n(!0);return;default:return}}function _e({message:e}){return(0,C.jsxs)(`article`,{className:`clivly-chat-widget__message`,"data-sender":e.senderType,children:[(0,C.jsxs)(`div`,{className:`clivly-chat-widget__message-meta`,children:[(0,C.jsx)(`span`,{children:e.author??`Clivly`}),(0,C.jsx)(`span`,{children:le(e.createdAt)})]}),(0,C.jsx)(`div`,{children:e.body}),e.delivery===`sent`?null:(0,C.jsx)(`div`,{className:`clivly-chat-widget__status`,children:ae[e.delivery]})]})}function ve({greeting:e,hasSession:t,messages:n}){return t?n.length===0?(0,C.jsx)(`p`,{className:`clivly-chat-widget__empty`,children:`No messages yet. Say hello to get the conversation started.`}):(0,C.jsx)(C.Fragment,{children:n.map(e=>(0,C.jsx)(_e,{message:e},e.id))}):(0,C.jsx)(`p`,{className:`clivly-chat-widget__empty`,children:e})}function ye({className:e,createTransport:t,getSession:n,initiallyOpen:r=!1,launcherLabel:i=`Chat with us`,storage:a=w,style:o,theme:s=`auto`,widgetId:c}){let[l,u]=(0,p.useState)(r),[d,f]=(0,p.useState)(null),[m,h]=(0,p.useState)(!1),[g,_]=(0,p.useState)(!1),[v,y]=(0,p.useState)(``),[b,x]=(0,p.useState)([]),[ee,te]=(0,p.useState)(null),[S,ne]=(0,p.useState)({email:``,name:``}),re=(0,p.useRef)(null),ie=(0,p.useRef)(null),ae=me(ee,o),le=he(s);(0,p.useEffect)(()=>()=>{re.current?.close(),re.current=null},[]),(0,p.useEffect)(()=>{ie.current&&(ie.current.scrollTop=ie.current.scrollHeight)},[b]),(0,p.useEffect)(()=>{if(re.current?.close(),re.current=null,_(!1),!(ee&&t))return;let e=t({handlers:{onClose:()=>{_(!1)},onError:e=>{f(e.message)},onEvent:e=>{ge(e,{setError:f,setIsReady:_,setMessages:x})},onOpen:()=>{_(!0)}},session:ee});return re.current=e,()=>{e.close(),re.current===e&&(re.current=null)}},[t,ee]);let ue=async e=>{e.preventDefault(),f(null),h(!0);try{let e=a?.getItem(ce(c))??null,t=await n({visitor:S,visitorToken:e,widgetId:c});a?.setItem(ce(c),t.visitorToken),te(t),x(pe(t.messages.map(e=>T(e))))}catch(e){let t=e instanceof Error?e:Error(`Failed to start the conversation.`);f(t.message)}finally{h(!1)}},de=e=>{if(e?.preventDefault(),!(ee&&re.current)){f(`Chat is not connected yet.`);return}let t=v.trim();if(!t)return;let n=D(),r={author:oe(ee),body:t,createdAt:new Date().toISOString(),id:n,senderType:`visitor`};x(e=>pe([...e,T(r,`pending`)])),y(``),f(null);try{re.current.sendMessage({body:t,id:n,type:`message.create`})}catch(e){let t=e instanceof Error?e:Error(`Failed to send your message.`);x(e=>fe(e,n)),f(t.message)}},_e=ee?.widget.config.greeting??`Tell us a little about yourself and we’ll pick up the conversation from there.`,ye=ee?.widget.name??`Start a conversation`,be=se(ee,_e);return(0,C.jsxs)(`div`,{className:`clivly-chat-widget ${e??``}`.trim(),"data-clivly-theme":le,style:ae,children:[(0,C.jsx)(`style`,{children:`
348
348
  .clivly-chat-widget, .clivly-chat-widget * { box-sizing: border-box; }
349
349
  .clivly-chat-widget {
350
350
  --clivly-chat-accent: #185adb;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clivly/chat-widget",
3
- "version": "0.9.6",
3
+ "version": "0.9.7",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Clivly chat widget — embeddable React and script-tag entrypoints for Clivly conversations.",