@flows/js
Version:
Flows JS SDK - Build native product growth experiences, your way
2 lines (1 loc) • 11.6 kB
JavaScript
var No=Object.defineProperty,_o=Object.defineProperties;var Uo=Object.getOwnPropertyDescriptors;var J=Object.getOwnPropertySymbols;var Vo=Object.prototype.hasOwnProperty,$o=Object.prototype.propertyIsEnumerable;var X=(o,e,t)=>e in o?No(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t,m=(o,e)=>{for(var t in e||(e={}))Vo.call(e,t)&&X(o,t,e[t]);if(J)for(var t of J(e))$o.call(e,t)&&X(o,t,e[t]);return o},u=(o,e)=>_o(o,Uo(e));var Q=(o,{body:e,method:t,version:n})=>fetch(o,{method:t,headers:{"Content-Type":"application/json","x-flows-version":n},body:e?JSON.stringify(e):void 0}).then(async r=>{var p;let s=await r.text(),i=s?JSON.parse(s):void 0;if(!r.ok){let a=i;throw new Error((p=a==null?void 0:a.message)!=null?p:r.statusText)}return i}),M=(o,e)=>({getBlocks:t=>Q(`${o}/v2/sdk/blocks`,{method:"POST",body:t,version:e}),sendEvent:t=>Q(`${o}/v2/sdk/events`,{method:"POST",body:t,version:e})});var D=(o,e)=>{let t=new Set([...e.exitedBlockIds,...e.updatedBlocks.map(n=>n.id)]);return[...o.filter(n=>!t.has(n.id)),...e.updatedBlocks]};function Y(o){var e;return typeof o=="string"||typeof o=="symbol"?o:Object.is((e=o==null?void 0:o.valueOf)==null?void 0:e.call(o),-0)?"-0":String(o)}function Z(o){let e=[],t=o.length;if(t===0)return e;let n=0,r="",s="",i=!1;for(o.charCodeAt(0)===46&&(e.push(""),n++);n<t;){let p=o[n];s?p==="\\"&&n+1<t?(n++,r+=o[n]):p===s?s="":r+=p:i?p==='"'||p==="'"?s=p:p==="]"?(i=!1,e.push(r),r=""):r+=p:p==="["?(i=!0,r&&(e.push(r),r="")):p==="."?r&&(e.push(r),r=""):r+=p,n++}return r&&e.push(r),e}function W(o){return o!==null&&(typeof o=="object"||typeof o=="function")}function oo(o,e){return o===e||Number.isNaN(o)&&Number.isNaN(e)}var jo=/^(?:0|[1-9]\d*)$/;function eo(o,e=Number.MAX_SAFE_INTEGER){switch(typeof o){case"number":return Number.isInteger(o)&&o>=0&&o<e;case"symbol":return!1;case"string":return jo.test(o)}}function to(o){return typeof o=="symbol"||o instanceof Symbol}var Fo=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,qo=/^\w*$/;function ro(o,e){return Array.isArray(o)?!1:typeof o=="number"||typeof o=="boolean"||o==null||to(o)?!0:typeof o=="string"&&(qo.test(o)||!Fo.test(o))||e!=null&&Object.hasOwn(e,o)}var no=(o,e,t)=>{let n=o[e];(!(Object.hasOwn(o,e)&&oo(n,t))||t===void 0&&!(e in o))&&(o[e]=t)};function so(o,e,t,n){if(o==null&&!W(o))return o;let r=ro(e,o)?[e]:Array.isArray(e)?e:typeof e=="string"?Z(e):[e],s=o;for(let i=0;i<r.length&&s!=null;i++){let p=Y(r[i]),a;if(i===r.length-1)a=t(s[p]);else{let c=s[p],f=n(c);a=f!==void 0?f:W(c)?c:eo(r[i+1])?[]:{}}no(s,p,a),s=s[p]}return o}function L(o,e,t){return so(o,e,()=>t,()=>{})}var io=({block:o,exitNodeCb:e,removeBlock:t,setStateMemory:n})=>{var p,a,c;let r=({properties:f,parentKey:l})=>{var H;let d=m({},f);return Object.entries(f).forEach(([w,R])=>{Array.isArray(R)&&(d[w]=R.map((b,Wo)=>typeof b=="object"?r({properties:b,parentKey:[l,w,Wo].filter(Lo=>Lo!==void 0).join(".")}):b))}),delete d.f__exit_nodes,(H=f.f__exit_nodes)==null||H.forEach(w=>{let R=()=>e([l,w].filter(b=>b!==void 0).join("."));d[w]=R}),d},s=r({properties:o.data});for(let f of(p=o.propertyMeta)!=null?p:[])if(f.type==="state-memory"){let l={value:(a=f.value)!=null?a:!1,setValue:d=>{n(f.key,d)},triggers:(c=f.triggers)!=null?c:[]};L(s,f.key,l)}let i=o.exitNodes.reduce((f,l)=>{let d=()=>(t(o.id),e(l));return f[l]=d,f},{});return m(m({__flows:{id:o.id,key:o.key,workflowId:o.workflowId}},s),i)};var zo="#22262d",Ko="#fff",po="%cFlows%c",ao=`color:${Ko};background:${zo};padding:2px 4px;border-radius:4px`,fo={error:(o,...e)=>{console.error(`${po} ${o}`,ao,"",...e)},warn:(o,...e)=>{console.warn(`${po} ${o}`,ao,"",...e)}};var N=(o,e)=>e?Array.isArray(e)?e.some(t=>N(o,t)):typeof o!="string"?!1:new RegExp(e).test(o):!0,_=(o,e)=>e===void 0?!0:Array.isArray(e)?e.some(t=>_(o,t)):o===e,U=(o,e)=>e===void 0?!0:Array.isArray(e)?e.every(t=>U(o,t)):o!==e;var V=(o,e)=>e?Array.isArray(e)?e.some(t=>V(o,t)):typeof o!="string"?!1:o.includes(e):!0,$=(o,e)=>e?Array.isArray(e)?e.every(t=>$(o,t)):typeof o!="string"?!1:!o.includes(e):!0;var B=({operator:o,pathname:e,value:t})=>o==="eq"?_(e,t):o==="ne"?U(e,t):o==="contains"?V(e,t):o==="notContains"?$(e,t):o==="regex"?N(e,t):!0,mo=({eventTarget:o,value:e})=>e?Array.from(document.querySelectorAll(e)).some(t=>t.contains(o)):!1;var co=()=>window.location.pathname+window.location.search;var lo=o=>{var e;if(!(!o||o==="disabled"))return o==="automatic"?(e=navigator.languages.at(0))!=null?e:navigator.language:o};var j=(o,e)=>new Proxy(o,{get(t,n,r){return n==="props"&&e(o.id),Reflect.get(t,n,r)}});import{effect as Jo}from"@preact/signals-core";import{computed as Go,effect as Ho,signal as I}from"@preact/signals-core";var O=I(),y=I(),v=I(null),g=Go(()=>{var o;return(o=v.value)!=null?o:[]}),A=I([]),P=o=>{v.value=g.value.filter(e=>e.id!==o)},uo=(o,e)=>{v.value=g.value.map(t=>t.id===o?e(t):t)},k=I([]);Ho(()=>{let e=g.value.filter(s=>s.type==="tour"),t=k.peek(),n=new Map(t.map(s=>[s.blockId,s])),r=e.map(s=>{var a,c;let i=n.get(s.id),p=(c=(a=i==null?void 0:i.currentBlockIndex)!=null?a:s.currentTourIndex)!=null?c:0;return{blockId:s.id,currentBlockIndex:p}});k.value=r});var go="@flows/js";var ko="1.10.3";var C=`${go}@${ko}`;var x=async o=>{let e=O.value;if(!e)return;let{environment:t,organizationId:n,userId:r,apiUrl:s}=e;await M(s,C).sendEvent(u(m({},o),{environment:t,organizationId:n,userId:r}))},yo=new Set,F=async o=>{yo.has(o)||(yo.add(o),await x({name:"block-activated",blockId:o}))};var vo=(o,e)=>{k.value=k.value.map(t=>t.blockId===o?e(t):t)},ho=(o,e)=>{if(e===0)return;let n=e-1;vo(o.id,r=>u(m({},r),{currentBlockIndex:n})),x({name:"tour-update",blockId:o.id,properties:{currentTourIndex:n}})},T=(o,e)=>{var n,r;if(e===((r=(n=o.tourBlocks)==null?void 0:n.length)!=null?r:1)-1)P(o.id),x({name:"transition",blockId:o.id,propertyKey:"complete"});else{let s=e+1;vo(o.id,i=>u(m({},i),{currentBlockIndex:s})),x({name:"tour-update",blockId:o.id,properties:{currentTourIndex:s}})}},Bo=o=>{P(o),x({name:"transition",blockId:o,propertyKey:"cancel"})},wo=o=>{let e=co(),t=new Map(g.value.map(n=>[n.id,n]));k.value.forEach(n=>{var p,a,c;let r=t.get(n.blockId);if(!r)return;let s=(p=r.tourBlocks)==null?void 0:p.at(n.currentBlockIndex);if(!s)return;let i=s.tourWait;if(i&&i.interaction==="click"){let f=B({pathname:e,operator:(a=i.page)==null?void 0:a.operator,value:(c=i.page)==null?void 0:c.value});mo({eventTarget:o,value:i.element})&&f&&T(r,n.currentBlockIndex)}})},S=new Map;Jo(()=>{let o=y.value,e=g.value,t=k.value,n=new Map(e.map(r=>[r.id,r]));t.forEach(r=>{var c,f,l;let s=n.get(r.blockId);if(!s)return;let i=(c=s.tourBlocks)==null?void 0:c.at(r.currentBlockIndex);if(!i)return;let p=S.get(r.blockId);p&&p.stepId!==i.id&&(clearTimeout(p.timeoutId),S.delete(r.blockId));let a=i.tourWait;if(a&&(a.interaction==="navigation"&&B({pathname:o,operator:(f=a.page)==null?void 0:f.operator,value:(l=a.page)==null?void 0:l.value})&&T(s,r.currentBlockIndex),a.interaction==="delay"&&a.ms!==void 0&&!S.has(r.blockId))){let d=window.setTimeout(()=>{T(s,r.currentBlockIndex),S.delete(r.blockId)},a.ms);S.set(r.blockId,{timeoutId:d,stepId:i.id})}})});var bo=o=>{let e=o.target;!e||!(e instanceof Element)||wo(e)};var q=0,Io=o=>{let e=()=>{let t=new WebSocket(o.url),n=()=>{o.onOpen(),q=0},r=()=>{setTimeout(()=>{e()},Math.min(1e3*4**q,12e4)),q+=1};return t.addEventListener("message",o.onMessage),t.addEventListener("open",n),t.addEventListener("close",r),{disconnect:()=>{t.removeEventListener("message",o.onMessage),t.removeEventListener("open",n),t.removeEventListener("close",r),t.readyState===WebSocket.CONNECTING?t.addEventListener("open",()=>{t.close()}):t.close()}}};return e()};var h=null,Ao=o=>{let{environment:e,organizationId:t,userId:n,apiUrl:r}=o,s={environment:e,organizationId:t,userId:n},i=`${r.replace("https://","wss://").replace("http://","ws://")}/ws/sdk/block-updates?${new URLSearchParams(s).toString()}`,p=()=>{M(r,C).getBlocks(u(m({},s),{language:lo(o.language),userProperties:o.userProperties})).then(f=>{var d;let l=A.value.reduce(D,f.blocks);v.value=l,A.value=[],(d=f.meta)!=null&&d.usage_limited&&(h==null||h())}).catch(f=>{fo.error("Failed to load blocks",f)})},a=f=>{let l=JSON.parse(f.data);v.value?v.value=D(g.value,l):A.value=[...A.value,l]};h==null||h(),h=Io({url:i,onMessage:a,onOpen:p}).disconnect};var Po=[],So=o=>{Po.forEach(({type:e,handler:t})=>{document.removeEventListener(e,t,!0)}),o.forEach(({type:e,handler:t})=>{document.addEventListener(e,t,!0)}),Po=o};var z=null,ft=o=>{var p;let e=(p=o.apiUrl)!=null?p:"https://api.flows-cloud.com";O.value=u(m({},o),{apiUrl:e});let{environment:t,organizationId:n,userId:r,userProperties:s,language:i}=o;Ao({apiUrl:e,environment:t,organizationId:n,userId:r,userProperties:s,language:i}),z!==null&&clearInterval(z),z=window.setInterval(()=>{y.value!==window.location.pathname&&(y.value=window.location.pathname)},250),So([{type:"click",handler:bo}])};import{computed as E,effect as Eo}from"@preact/signals-core";var K=o=>{if(!o.componentType)return[];let t=io({block:o,removeBlock:P,exitNodeCb:r=>x({name:"transition",blockId:o.id,propertyKey:r}),setStateMemory:async(r,s)=>{uo(o.id,i=>{var p;return u(m({},i),{propertyMeta:(p=i.propertyMeta)==null?void 0:p.map(a=>a.type==="state-memory"&&a.key===r?u(m({},a),{value:s}):a)})}),await x({name:"set-state-memory",blockId:o.id,propertyKey:r,properties:{value:s}})}}),n={id:o.id,type:"component",component:o.componentType,props:t};return j(n,F)},G=(o,e)=>{let t=o.tourBlocks;if(!(t!=null&&t.length))return[];let n=t.at(e);if(!(n!=null&&n.componentType))return[];let r=e===0,s=()=>{ho(o,e)},i=()=>{T(o,e)},p=()=>{Bo(o.id)},a={id:n.id,tourBlockId:o.id,type:"tour-component",component:n.componentType,props:u(m({__flows:{id:n.id,key:n.key,workflowId:n.workflowId}},n.data),{previous:r?void 0:s,continue:i,cancel:p})};return j(a,F)};var Ro=E(()=>g.value.filter(o=>B({pathname:y.value,operator:o.page_targeting_operator,value:o.page_targeting_values}))),Mo=E(()=>{let o=new Map(g.value.map(e=>[e.id,e]));return k.value.filter(e=>{var r;let t=o.get(e.blockId),n=(r=t==null?void 0:t.tourBlocks)==null?void 0:r.at(e.currentBlockIndex);return B({pathname:y.value,operator:n==null?void 0:n.page_targeting_operator,value:n==null?void 0:n.page_targeting_values})}).flatMap(e=>{let t=o.get(e.blockId);return t?u(m({},e),{block:t}):[]})}),Oo=E(()=>{let o=Ro.value.filter(t=>!t.slottable).flatMap(K),e=Mo.value.filter(t=>{var r;let n=(r=t.block.tourBlocks)==null?void 0:r.at(t.currentBlockIndex);return!(n!=null&&n.slottable)}).flatMap(t=>G(t.block,t.currentBlockIndex));return[...o,...e]}),Xo=E(()=>Ro.value.filter(o=>o.slottable)),Co=o=>"type"in o,To=o=>{var t,n,r;if(Co(o))return(t=o.slotIndex)!=null?t:0;let e=(n=o.block.tourBlocks)==null?void 0:n.at(o.currentBlockIndex);return(r=e==null?void 0:e.slotIndex)!=null?r:0},Do=new Map,Qo=o=>{let e=E(()=>{let t=Xo.value.filter(s=>s.slottable&&s.slotId===o),n=Mo.value.filter(s=>{var p;let i=(p=s.block.tourBlocks)==null?void 0:p.at(s.currentBlockIndex);return(i==null?void 0:i.slottable)&&i.slotId===o});return[...t,...n].sort((s,i)=>To(s)-To(i)).flatMap(s=>Co(s)?K(s):G(s.block,s.currentBlockIndex))});return Do.set(o,e),e},bt=()=>Oo.value,Yo=o=>{var e,t;return(t=(e=Do.get(o))==null?void 0:e.value)!=null?t:Qo(o).value},It=o=>Eo(()=>{o(Oo.value)}),At=(o,e)=>Eo(()=>{e(Yo(o))}),Pt=()=>x({name:"reset-progress"}),St=o=>x({name:"reset-progress",workflowId:o}),Tt=o=>x({name:"workflow-start",blockKey:o});export{It as addFloatingBlocksChangeListener,At as addSlotBlocksChangeListener,bt as getCurrentFloatingBlocks,Yo as getCurrentSlotBlocks,ft as init,Pt as resetAllWorkflowsProgress,St as resetWorkflowProgress,Tt as startWorkflow};