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