@pushmesh/sdk 0.7.4 → 0.7.5

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.
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true}),exports.PushMeshInApp=void 0,exports.HostInApp=HostInApp,exports.PushMeshInAppHost=PushMeshInAppHost;const jsx_runtime_1=require("react/jsx-runtime"),react_1=require("react"),react_native_1=require("react-native"),engine_1=require("./engine"),imageCache_1=require("./imageCache"),index_1=require("./index"),lifecycle_1=require("./lifecycle"),normalize_1=require("./normalize"),registro_1=require("./registro"),SkeletonShimmer_1=require("./SkeletonShimmer"),FUNDO_PADRAO="#ffffff",TEXTO_PADRAO="#111111",BOTAO_FUNDO_PADRAO="#1565c0",BOTAO_TEXTO_PADRAO="#ffffff",RAIO_PADRAO=12,PADDING_PADRAO=16,ESCURECER_PADRAO=.5,BOTAO_PESO_PADRAO="600",BOTAO_TAMANHO_PADRAO=15,CLOSE_CLARO="#ffffff",CLOSE_ESCURO="#111111",LIMIAR_FUNDO=.179,LIMIAR_GLIFO=.5,CHIP_ESCURO="rgba(0,0,0,0.5)",CHIP_CLARO="rgba(255,255,255,0.7)",HALO_ESCURO="rgba(0,0,0,0.75)",HALO_CLARO="rgba(255,255,255,0.85)",CLOSE_RESPIRO=6;function haloDe(cor){return(luminancia(cor)??0)>=.5?HALO_ESCURO:HALO_CLARO}function pesoRN(peso){return"negrito"===peso?"700":"medio"===peso?"500":"400"}function fonteRN(fonte){return"serifada"===fonte?"ios"===react_native_1.Platform.OS?"Georgia":"serif":"monoespacada"===fonte?"ios"===react_native_1.Platform.OS?"Menlo":"monospace":void 0}function alinhamentoRN(a){return"centro"===a?"center":"direita"===a?"right":"left"}function glifoClose(icone){return"seta"===icone?"⌄":"✕"}function corValida(v){return"string"==typeof v&&""!==v.trim()?v.trim():null}function rgbDaCor(cor){if(!cor||"#"!==cor.charAt(0))return null;const h=cor.slice(1),curto=3===h.length||4===h.length;if(!curto&&6!==h.length&&8!==h.length)return null;if(!/^[0-9a-fA-F]+$/.test(h))return null;const canal=i=>parseInt(curto?h.charAt(i)+h.charAt(i):h.slice(2*i,2*i+2),16);return[canal(0),canal(1),canal(2)]}function luminancia(cor){const rgb=rgbDaCor(cor);if(!rgb)return null;const canal=c=>{const v=c/255;return v<=.03928?v/12.92:Math.pow((v+.055)/1.055,2.4)};return.2126*canal(rgb[0])+.7152*canal(rgb[1])+.0722*canal(rgb[2])}function arteAtrasDoClose(estilo,blocos){if(corValida(estilo.fundo_imagem))return true;const primeiro=blocos[0];return!!primeiro&&"imagem"===primeiro.tipo}function resolverClose(estilo,blocos){const close=estilo.close??{},arte=arteAtrasDoClose(estilo,blocos);let cor=corValida(close.cor);if(!cor)if(arte)cor="#ffffff";else{const l=luminancia(corValida(estilo.fundo));cor=null===l?corValida(estilo.texto)??"#111111":l<.179?"#ffffff":"#111111"}if(null===close.fundo)return{cor:cor,chip:null,halo:arte?haloDe(cor):null};const declarado=corValida(close.fundo);if(declarado)return{cor:cor,chip:declarado,halo:null};const glifoClaro=(luminancia(cor)??0)>=.5;return"x_circulo"===close.icone?{cor:cor,chip:glifoClaro?CHIP_ESCURO:CHIP_CLARO,halo:null}:{cor:cor,chip:null,halo:arte?haloDe(cor):null}}function ImagemBloco({bloco:bloco,estilo:estilo,padding:padding,primeiro:primeiro,ultimo:ultimo,onPress:onPress,testID:testID}){const[pronta,setPronta]=(0,react_1.useState)(null),[proporcao,setProporcao]=(0,react_1.useState)(null);(0,react_1.useEffect)(()=>{let vivo=true;return(0,imageCache_1.ensureImage)(bloco.url).then(ok=>{vivo&&(ok?react_native_1.Image.getSize(bloco.url,(w,h)=>{vivo&&(setProporcao(w>0&&h>0?w/h:2),setPronta(true))},()=>{vivo&&(setProporcao(2),setPronta(true))}):setPronta(false))}),()=>{vivo=false}},[bloco.url]);const sangra=true===bloco.sangra,m=bloco.margens??{},mTopo=m.topo??0,mDir=m.direita??0,mBaixo=m.baixo??0,mEsq=m.esquerda??0,raioCartao=estilo.raio??12,dims={alignSelf:"stretch",aspectRatio:proporcao??2,marginTop:(sangra&&primeiro?-padding:0)+mTopo,marginBottom:(sangra&&ultimo?-padding:8)+mBaixo,marginLeft:(sangra?-padding:0)+mEsq,marginRight:(sangra?-padding:0)+mDir};if(sangra?(dims.borderTopLeftRadius=primeiro?raioCartao:0,dims.borderTopRightRadius=primeiro?raioCartao:0,dims.borderBottomLeftRadius=ultimo?raioCartao:0,dims.borderBottomRightRadius=ultimo?raioCartao:0):dims.borderRadius=bloco.raio??0,null===pronta)return(0,jsx_runtime_1.jsx)(SkeletonShimmer_1.SkeletonShimmer,{style:dims});if(false===pronta)return null;const img=(0,jsx_runtime_1.jsx)(react_native_1.Image,{source:{uri:bloco.url},style:[dims,{overflow:"hidden"}],resizeMode:"cover",testID:testID});return onPress?(0,jsx_runtime_1.jsx)(react_native_1.TouchableOpacity,{activeOpacity:.85,onPress:onPress,testID:`${testID}-acao`,children:img}):img}function TextoBloco({bloco:bloco,estilo:estilo}){return(0,jsx_runtime_1.jsx)(react_native_1.Text,{style:{color:bloco.cor??estilo.texto??"#111111",fontSize:bloco.tamanho??16,fontWeight:pesoRN(bloco.peso),fontStyle:bloco.italico?"italic":"normal",textDecorationLine:bloco.sublinhado?"underline":"none",fontFamily:fonteRN(bloco.fonte),textAlign:alinhamentoRN(bloco.alinhamento),marginBottom:8},children:bloco.texto})}function BotaoBloco({bloco:bloco,estilo:estilo,onPress:onPress,testID:testID}){const alinhado=bloco.alinhamento?alinhamentoRN(bloco.alinhamento):null;return(0,jsx_runtime_1.jsx)(react_native_1.TouchableOpacity,{style:{backgroundColor:bloco.cor_fundo??estilo.botao_fundo??"#1565c0",borderRadius:bloco.raio??estilo.raio??8,paddingVertical:12,alignItems:alinhado?"stretch":"center",marginTop:8},onPress:onPress,testID:testID,children:(0,jsx_runtime_1.jsx)(react_native_1.Text,{style:{color:bloco.cor_texto??estilo.botao_texto??"#ffffff",fontSize:bloco.tamanho??15,fontWeight:bloco.peso?pesoRN(bloco.peso):"600",fontStyle:bloco.italico?"italic":"normal",textDecorationLine:bloco.sublinhado?"underline":"none",fontFamily:fonteRN(bloco.fonte),textAlign:alinhado??void 0},children:bloco.texto})})}function MessageView({message:message,blocos:blocos,estilo:estilo,oc:oc,onClose:onClose}){const reportar=(0,react_1.useCallback)((evento,botao)=>{(0,engine_1.enviarRecibo)(message.id,message.prova,evento,oc,botao).catch(()=>{})},[message.id,message.prova,oc]);(0,react_1.useEffect)(()=>{reportar("impressao");const ms=message.regras?.fechar_apos_ms??0;if(ms>0){const t=setTimeout(()=>onClose(),ms);return()=>clearTimeout(t)}},[]);const fechar=(0,react_1.useCallback)(comRecibo=>{comRecibo&&reportar("fechou"),onClose()},[reportar,onClose]),executarEFechar=(0,react_1.useCallback)((acao,botao)=>{reportar("clique",botao),(0,index_1.executeAction)(acao,message.id).catch(()=>{}),onClose()},[reportar,onClose,message.id]);let ordinalBotao=0;const filhos=blocos.map((b,i)=>{switch(b.tipo){case"texto":return(0,jsx_runtime_1.jsx)(TextoBloco,{bloco:b,estilo:estilo},i);case"imagem":{const img=b,acao=img.acao_click??null;return(0,jsx_runtime_1.jsx)(ImagemBloco,{bloco:img,estilo:estilo,padding:estilo.padding_px??16,primeiro:0===i,ultimo:i===blocos.length-1,onPress:acao?()=>executarEFechar(acao):void 0,testID:`rp-inapp-imagem-${i}`},i)}case"botao":{const bt=b,papel=0===ordinalBotao?"principal":"secundario";return ordinalBotao+=1,(0,jsx_runtime_1.jsx)(BotaoBloco,{bloco:bt,estilo:estilo,onPress:()=>executarEFechar(bt.acao,papel),testID:`rp-inapp-botao-${papel}`},i)}case"espacador":return(0,jsx_runtime_1.jsx)(react_native_1.View,{style:{height:b.altura}},i);default:return null}}),padding=estilo.padding_px??16,raio=estilo.raio??12,acaoCard=estilo.acao_card??null,close=resolverClose(estilo,blocos),ladoDoClose=(estilo.close?.tamanho??24)+12,card=(0,jsx_runtime_1.jsxs)(react_native_1.TouchableOpacity,{activeOpacity:acaoCard?.9:1,onPress:acaoCard?()=>executarEFechar(acaoCard):()=>{},style:[styles.card,{backgroundColor:estilo.fundo??"#ffffff",borderRadius:raio,padding:padding}],testID:"rp-inapp-card",children:["string"==typeof estilo.fundo_imagem?(0,jsx_runtime_1.jsx)(FundoImagem,{url:estilo.fundo_imagem,raio:raio}):null,filhos,false===estilo.close?.mostrar?null:(0,jsx_runtime_1.jsx)(react_native_1.TouchableOpacity,{style:[styles.close,close.chip?{backgroundColor:close.chip,width:ladoDoClose,height:ladoDoClose,borderRadius:ladoDoClose/2,padding:0,alignItems:"center",justifyContent:"center"}:null],onPress:()=>fechar(true),testID:"rp-inapp-close",accessibilityLabel:"Fechar",children:(0,jsx_runtime_1.jsx)(react_native_1.Text,{style:{color:close.cor,fontSize:estilo.close?.tamanho??24,fontWeight:"600",...close.halo?{textShadowColor:close.halo,textShadowOffset:{width:0,height:0},textShadowRadius:4}:null},children:glifoClose(estilo.close?.icone)})})]});if("modal"===message.formato)return(0,jsx_runtime_1.jsx)(react_native_1.Modal,{visible:true,transparent:true,animationType:"fade",onRequestClose:()=>fechar(true),children:(0,jsx_runtime_1.jsx)(react_native_1.TouchableOpacity,{activeOpacity:1,onPress:()=>fechar(true),style:[styles.veil,{backgroundColor:`rgba(0,0,0,${estilo.escurecer??.5})`}],testID:"rp-inapp-veil",children:card})});if("fullscreen"===message.formato)return(0,jsx_runtime_1.jsx)(react_native_1.Modal,{visible:true,animationType:"fade",onRequestClose:()=>fechar(true),children:(0,jsx_runtime_1.jsx)(react_native_1.View,{style:[styles.full,{backgroundColor:estilo.fundo??"#ffffff"}],children:card})});const posicao="banner_bottom"===message.formato?styles.bannerBottom:styles.bannerTop;return(0,jsx_runtime_1.jsx)(react_native_1.View,{style:[styles.banner,posicao],children:card})}function FundoImagem({url:url,raio:raio}){const[ok,setOk]=(0,react_1.useState)(null);(0,react_1.useEffect)(()=>{let vivo=true;return(0,imageCache_1.ensureImage)(url).then(r=>vivo&&setOk(r)),()=>{vivo=false}},[url]);const preencher={position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:raio};return null===ok?(0,jsx_runtime_1.jsx)(SkeletonShimmer_1.SkeletonShimmer,{style:preencher}):false===ok?null:(0,jsx_runtime_1.jsx)(react_native_1.Image,{source:{uri:url},resizeMode:"cover",style:preencher})}function HostInApp({auto:auto,onDisplayed:onDisplayed}){const dono=(0,registro_1.useDonoDoHost)(auto),[visivel,setVisivel]=(0,react_1.useState)(null),visivelRef=(0,react_1.useRef)(false),canceladoRef=(0,react_1.useRef)(false),reagendarRef=(0,react_1.useRef)(null);(0,react_1.useEffect)(()=>{if(!dono)return;let timer,timerSessao;canceladoRef.current=false;const agendarSessao=async()=>{timerSessao&&clearTimeout(timerSessao),timerSessao=void 0;const falta=await(0,engine_1.proximoDisparoSessaoMs)(Date.now());null===falta||canceladoRef.current||visivelRef.current||(timerSessao=setTimeout(()=>rodarSeguro("durante"),falta+50))},rodarSeguro=momento=>{(async momento=>{if(canceladoRef.current||visivelRef.current)return;const r=await(0,engine_1.avaliar)(momento);if(canceladoRef.current||visivelRef.current)return;if(!r)return void await agendarSessao();const{message:message}=r,{blocos:blocos,estilo:estilo}=(0,normalize_1.normalizar)(message),artes=[];for(const b of blocos)"imagem"===b.tipo&&"string"==typeof b.url&&artes.push((0,imageCache_1.ensureImage)(b.url).catch(()=>false));if("string"==typeof estilo.fundo_imagem&&artes.push((0,imageCache_1.ensureImage)(estilo.fundo_imagem).catch(()=>false)),!blocos.some(b=>"texto"===b.tipo&&""!==String(b.texto??"").trim()||"botao"===b.tipo)&&artes.length>0){const prontas=await Promise.all(artes);if(canceladoRef.current||visivelRef.current)return;if(!prontas.some(Boolean))return}const atraso=Math.max(0,Math.min(6e4,message.gatilho?.atraso_ms??0));timer=setTimeout(()=>{(async()=>{if(canceladoRef.current||visivelRef.current)return;const oc=await(0,engine_1.comprometerExibicao)(message.id,Date.now());canceladoRef.current||(visivelRef.current=true,setVisivel({message:message,blocos:blocos,estilo:estilo,oc:oc}),onDisplayed?.(message))})()},atraso)})(momento).catch(()=>{})};reagendarRef.current=()=>{agendarSessao().catch(()=>{})},rodarSeguro("sessao");const desinscrever=(0,lifecycle_1.inscreverInApp)(rodarSeguro);return()=>{canceladoRef.current=true,reagendarRef.current=null,timer&&clearTimeout(timer),timerSessao&&clearTimeout(timerSessao),desinscrever()}},[dono]);const fechar=(0,react_1.useCallback)(()=>{visivelRef.current=false,setVisivel(null),reagendarRef.current?.()},[]);return visivel?(0,jsx_runtime_1.jsx)(MessageView,{message:visivel.message,blocos:visivel.blocos,estilo:visivel.estilo,oc:visivel.oc,onClose:fechar}):null}function PushMeshInAppHost({onDisplayed:onDisplayed}){return(0,jsx_runtime_1.jsx)(HostInApp,{auto:false,onDisplayed:onDisplayed})}exports.PushMeshInApp=PushMeshInAppHost;const styles=react_native_1.StyleSheet.create({veil:{flex:1,justifyContent:"center",padding:24},full:{flex:1,justifyContent:"center",padding:24},banner:{position:"absolute",left:0,right:0,zIndex:9999,elevation:10,padding:8},bannerTop:{top:0},bannerBottom:{bottom:0},card:{overflow:"hidden",shadowColor:"#000",shadowOpacity:.2,shadowRadius:8,shadowOffset:{width:0,height:2},elevation:6},close:{position:"absolute",top:6,right:8,padding:6}});
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true}),exports.PushMeshInApp=void 0,exports.HostInApp=HostInApp,exports.PushMeshInAppHost=PushMeshInAppHost;const jsx_runtime_1=require("react/jsx-runtime"),react_1=require("react"),react_native_1=require("react-native"),engine_1=require("./engine"),imageCache_1=require("./imageCache"),index_1=require("./index"),lifecycle_1=require("./lifecycle"),normalize_1=require("./normalize"),registro_1=require("./registro"),SkeletonShimmer_1=require("./SkeletonShimmer"),FUNDO_PADRAO="#ffffff",TEXTO_PADRAO="#111111",BOTAO_FUNDO_PADRAO="#1565c0",BOTAO_TEXTO_PADRAO="#ffffff",RAIO_PADRAO=12,PADDING_PADRAO=16,ESCURECER_PADRAO=.5,BOTAO_PESO_PADRAO="600",BOTAO_TAMANHO_PADRAO=15,CLOSE_CLARO="#ffffff",CLOSE_ESCURO="#111111",LIMIAR_FUNDO=.179,LIMIAR_GLIFO=.5,CHIP_ESCURO="rgba(0,0,0,0.5)",CHIP_CLARO="rgba(255,255,255,0.7)",HALO_ESCURO="rgba(0,0,0,0.75)",HALO_CLARO="rgba(255,255,255,0.85)",CLOSE_RESPIRO=6;function haloDe(cor){return(luminancia(cor)??0)>=.5?HALO_ESCURO:HALO_CLARO}function pesoRN(peso){return"negrito"===peso?"700":"medio"===peso?"500":"400"}function fonteRN(fonte){return"serifada"===fonte?"ios"===react_native_1.Platform.OS?"Georgia":"serif":"monoespacada"===fonte?"ios"===react_native_1.Platform.OS?"Menlo":"monospace":void 0}function alinhamentoRN(a){return"centro"===a?"center":"direita"===a?"right":"left"}function glifoClose(icone){return"seta"===icone?"⌄":"✕"}function corValida(v){return"string"==typeof v&&""!==v.trim()?v.trim():null}function rgbDaCor(cor){if(!cor||"#"!==cor.charAt(0))return null;const h=cor.slice(1),curto=3===h.length||4===h.length;if(!curto&&6!==h.length&&8!==h.length)return null;if(!/^[0-9a-fA-F]+$/.test(h))return null;const canal=i=>parseInt(curto?h.charAt(i)+h.charAt(i):h.slice(2*i,2*i+2),16);return[canal(0),canal(1),canal(2)]}function luminancia(cor){const rgb=rgbDaCor(cor);if(!rgb)return null;const canal=c=>{const v=c/255;return v<=.03928?v/12.92:Math.pow((v+.055)/1.055,2.4)};return.2126*canal(rgb[0])+.7152*canal(rgb[1])+.0722*canal(rgb[2])}function arteAtrasDoClose(estilo,blocos){if(corValida(estilo.fundo_imagem))return true;const primeiro=blocos[0];return!!primeiro&&"imagem"===primeiro.tipo}function resolverClose(estilo,blocos){const close=estilo.close??{},arte=arteAtrasDoClose(estilo,blocos);let cor=corValida(close.cor);if(!cor)if(arte)cor="#ffffff";else{const l=luminancia(corValida(estilo.fundo));cor=null===l?corValida(estilo.texto)??"#111111":l<.179?"#ffffff":"#111111"}if(null===close.fundo)return{cor:cor,chip:null,halo:arte?haloDe(cor):null};const declarado=corValida(close.fundo);if(declarado)return{cor:cor,chip:declarado,halo:null};const glifoClaro=(luminancia(cor)??0)>=.5;return"x_circulo"===close.icone?{cor:cor,chip:glifoClaro?CHIP_ESCURO:CHIP_CLARO,halo:null}:{cor:cor,chip:null,halo:arte?haloDe(cor):null}}function ImagemBloco({bloco:bloco,estilo:estilo,padding:padding,primeiro:primeiro,ultimo:ultimo,onPress:onPress,testID:testID}){const[pronta,setPronta]=(0,react_1.useState)(null),[proporcao,setProporcao]=(0,react_1.useState)(null);(0,react_1.useEffect)(()=>{let vivo=true;return(0,imageCache_1.ensureImage)(bloco.url).then(ok=>{vivo&&(ok?react_native_1.Image.getSize(bloco.url,(w,h)=>{vivo&&(setProporcao(w>0&&h>0?w/h:2),setPronta(true))},()=>{vivo&&(setProporcao(2),setPronta(true))}):setPronta(false))}),()=>{vivo=false}},[bloco.url]);const sangra=true===bloco.sangra,m=bloco.margens??{},mTopo=m.topo??0,mDir=m.direita??0,mBaixo=m.baixo??0,mEsq=m.esquerda??0,raioCartao=estilo.raio??12,dims={alignSelf:"stretch",aspectRatio:proporcao??2,marginTop:(sangra&&primeiro?-padding:0)+mTopo,marginBottom:(sangra&&ultimo?-padding:8)+mBaixo,marginLeft:(sangra?-padding:0)+mEsq,marginRight:(sangra?-padding:0)+mDir};if(sangra?(dims.borderTopLeftRadius=primeiro?raioCartao:0,dims.borderTopRightRadius=primeiro?raioCartao:0,dims.borderBottomLeftRadius=ultimo?raioCartao:0,dims.borderBottomRightRadius=ultimo?raioCartao:0):dims.borderRadius=bloco.raio??0,null===pronta)return(0,jsx_runtime_1.jsx)(SkeletonShimmer_1.SkeletonShimmer,{style:dims});if(false===pronta)return null;const img=(0,jsx_runtime_1.jsx)(react_native_1.Image,{source:{uri:bloco.url},style:[dims,{overflow:"hidden"}],resizeMode:"cover",testID:testID});return onPress?(0,jsx_runtime_1.jsx)(react_native_1.TouchableOpacity,{activeOpacity:.85,onPress:onPress,testID:`${testID}-acao`,children:img}):img}function TextoBloco({bloco:bloco,estilo:estilo}){return(0,jsx_runtime_1.jsx)(react_native_1.Text,{style:{color:bloco.cor??estilo.texto??"#111111",fontSize:bloco.tamanho??16,fontWeight:pesoRN(bloco.peso),fontStyle:bloco.italico?"italic":"normal",textDecorationLine:bloco.sublinhado?"underline":"none",fontFamily:fonteRN(bloco.fonte),textAlign:alinhamentoRN(bloco.alinhamento),marginBottom:8},children:bloco.texto})}function BotaoBloco({bloco:bloco,estilo:estilo,onPress:onPress,testID:testID}){const alinhado=bloco.alinhamento?alinhamentoRN(bloco.alinhamento):null;return(0,jsx_runtime_1.jsx)(react_native_1.TouchableOpacity,{style:{backgroundColor:bloco.cor_fundo??estilo.botao_fundo??"#1565c0",borderRadius:bloco.raio??estilo.raio??8,paddingVertical:12,alignItems:alinhado?"stretch":"center",marginTop:8},onPress:onPress,testID:testID,children:(0,jsx_runtime_1.jsx)(react_native_1.Text,{style:{color:bloco.cor_texto??estilo.botao_texto??"#ffffff",fontSize:bloco.tamanho??15,fontWeight:bloco.peso?pesoRN(bloco.peso):"600",fontStyle:bloco.italico?"italic":"normal",textDecorationLine:bloco.sublinhado?"underline":"none",fontFamily:fonteRN(bloco.fonte),textAlign:alinhado??void 0},children:bloco.texto})})}function MessageView({message:message,blocos:blocos,estilo:estilo,oc:oc,onClose:onClose}){const reportar=(0,react_1.useCallback)((evento,botao)=>{(0,engine_1.enviarRecibo)(message.id,message.prova,evento,oc,botao).catch(()=>{})},[message.id,message.prova,oc]);(0,react_1.useEffect)(()=>{reportar("impressao");const ms=message.regras?.fechar_apos_ms??0;if(ms>0){const t=setTimeout(()=>onClose(),ms);return()=>clearTimeout(t)}},[]);const fechar=(0,react_1.useCallback)(comRecibo=>{comRecibo&&reportar("fechou"),onClose()},[reportar,onClose]),executarEFechar=(0,react_1.useCallback)((acao,botao)=>{reportar("clique",botao),(0,index_1.executeAction)(acao,message.id).catch(()=>{}),onClose()},[reportar,onClose,message.id]);let ordinalBotao=0;const filhos=blocos.map((b,i)=>{switch(b.tipo){case"texto":return(0,jsx_runtime_1.jsx)(TextoBloco,{bloco:b,estilo:estilo},i);case"imagem":{const img=b,acao=img.acao_click??null;return(0,jsx_runtime_1.jsx)(ImagemBloco,{bloco:img,estilo:estilo,padding:estilo.padding_px??16,primeiro:0===i,ultimo:i===blocos.length-1,onPress:acao?()=>executarEFechar(acao):void 0,testID:`rp-inapp-imagem-${i}`},i)}case"botao":{const bt=b,papel=0===ordinalBotao?"principal":"secundario";return ordinalBotao+=1,(0,jsx_runtime_1.jsx)(BotaoBloco,{bloco:bt,estilo:estilo,onPress:()=>executarEFechar(bt.acao,papel),testID:`rp-inapp-botao-${papel}`},i)}case"espacador":return(0,jsx_runtime_1.jsx)(react_native_1.View,{style:{height:b.altura}},i);default:return null}}),padding=estilo.padding_px??16,raio=estilo.raio??12,acaoCard=estilo.acao_card??null,close=resolverClose(estilo,blocos),ladoDoClose=(estilo.close?.tamanho??24)+12,card=(0,jsx_runtime_1.jsxs)(react_native_1.TouchableOpacity,{activeOpacity:acaoCard?.9:1,onPress:acaoCard?()=>executarEFechar(acaoCard):()=>{},style:[styles.card,{backgroundColor:estilo.fundo??"#ffffff",borderRadius:raio,padding:padding}],testID:"rp-inapp-card",children:["string"==typeof estilo.fundo_imagem?(0,jsx_runtime_1.jsx)(FundoImagem,{url:estilo.fundo_imagem,raio:raio}):null,filhos,false===estilo.close?.mostrar?null:(0,jsx_runtime_1.jsx)(react_native_1.TouchableOpacity,{style:[styles.close,close.chip?{backgroundColor:close.chip,width:ladoDoClose,height:ladoDoClose,borderRadius:ladoDoClose/2,padding:0,alignItems:"center",justifyContent:"center"}:null],onPress:()=>fechar(true),testID:"rp-inapp-close",accessibilityLabel:"Fechar",children:(0,jsx_runtime_1.jsx)(react_native_1.Text,{style:{color:close.cor,fontSize:estilo.close?.tamanho??24,fontWeight:"600",...close.halo?{textShadowColor:close.halo,textShadowOffset:{width:0,height:0},textShadowRadius:4}:null},children:glifoClose(estilo.close?.icone)})})]});if("modal"===message.formato)return(0,jsx_runtime_1.jsx)(react_native_1.Modal,{visible:true,transparent:true,animationType:"fade",onRequestClose:()=>fechar(true),children:(0,jsx_runtime_1.jsx)(react_native_1.TouchableOpacity,{activeOpacity:1,onPress:()=>fechar(true),style:[styles.veil,{backgroundColor:`rgba(0,0,0,${estilo.escurecer??.5})`}],testID:"rp-inapp-veil",children:card})});if("fullscreen"===message.formato)return(0,jsx_runtime_1.jsx)(react_native_1.Modal,{visible:true,animationType:"fade",onRequestClose:()=>fechar(true),children:(0,jsx_runtime_1.jsx)(react_native_1.View,{style:[styles.full,{backgroundColor:estilo.fundo??"#ffffff"}],children:card})});const posicao="banner_bottom"===message.formato?styles.bannerBottom:styles.bannerTop;return(0,jsx_runtime_1.jsx)(react_native_1.View,{style:[styles.banner,posicao],children:card})}function FundoImagem({url:url,raio:raio}){const[ok,setOk]=(0,react_1.useState)(null);(0,react_1.useEffect)(()=>{let vivo=true;return(0,imageCache_1.ensureImage)(url).then(r=>vivo&&setOk(r)),()=>{vivo=false}},[url]);const preencher={position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:raio};return null===ok?(0,jsx_runtime_1.jsx)(SkeletonShimmer_1.SkeletonShimmer,{style:preencher}):false===ok?null:(0,jsx_runtime_1.jsx)(react_native_1.Image,{source:{uri:url},resizeMode:"cover",style:preencher})}function HostInApp({auto:auto,onDisplayed:onDisplayed}){const dono=(0,registro_1.useDonoDoHost)(auto),[visivel,setVisivel]=(0,react_1.useState)(null),visivelRef=(0,react_1.useRef)(false),canceladoRef=(0,react_1.useRef)(false),reagendarRef=(0,react_1.useRef)(null),sessaoComPlayerRef=(0,react_1.useRef)(false);(0,react_1.useEffect)(()=>{if(!dono)return;let timer,timerSessao;canceladoRef.current=false;const agendarSessao=async()=>{timerSessao&&clearTimeout(timerSessao),timerSessao=void 0;const falta=await(0,engine_1.proximoDisparoSessaoMs)(Date.now());null===falta||canceladoRef.current||visivelRef.current||(timerSessao=setTimeout(()=>rodarSeguro("durante"),falta+50))},rodar=async(momento,reaproveitarSessao=false)=>{if(canceladoRef.current||visivelRef.current)return;"sessao"!==momento||reaproveitarSessao||(sessaoComPlayerRef.current=false);const r=await(0,engine_1.avaliar)(momento,{reaproveitarSessao:reaproveitarSessao});if("sessao"===momento&&(sessaoComPlayerRef.current=await(0,engine_1.temPlayer)()),canceladoRef.current||visivelRef.current)return;if(!r)return void await agendarSessao();const{message:message}=r,{blocos:blocos,estilo:estilo}=(0,normalize_1.normalizar)(message),artes=[];for(const b of blocos)"imagem"===b.tipo&&"string"==typeof b.url&&artes.push((0,imageCache_1.ensureImage)(b.url).catch(()=>false));if("string"==typeof estilo.fundo_imagem&&artes.push((0,imageCache_1.ensureImage)(estilo.fundo_imagem).catch(()=>false)),!blocos.some(b=>"texto"===b.tipo&&""!==String(b.texto??"").trim()||"botao"===b.tipo)&&artes.length>0){const prontas=await Promise.all(artes);if(canceladoRef.current||visivelRef.current)return;if(!prontas.some(Boolean))return}const atraso=Math.max(0,Math.min(6e4,message.gatilho?.atraso_ms??0));timer=setTimeout(()=>{(async()=>{if(canceladoRef.current||visivelRef.current)return;const oc=await(0,engine_1.comprometerExibicao)(message.id,Date.now());canceladoRef.current||(visivelRef.current=true,setVisivel({message:message,blocos:blocos,estilo:estilo,oc:oc}),onDisplayed?.(message))})()},atraso)},rodarSeguro=momento=>{rodar(momento).catch(()=>{})};reagendarRef.current=()=>{agendarSessao().catch(()=>{})},rodarSeguro("sessao");const desinscrever=(0,lifecycle_1.inscreverInApp)(rodarSeguro),desinscreverPlayer=(0,lifecycle_1.inscreverPlayerPronto)(()=>{sessaoComPlayerRef.current||rodar("sessao",true).catch(()=>{})});return()=>{canceladoRef.current=true,reagendarRef.current=null,timer&&clearTimeout(timer),timerSessao&&clearTimeout(timerSessao),desinscrever(),desinscreverPlayer()}},[dono]);const fechar=(0,react_1.useCallback)(()=>{visivelRef.current=false,setVisivel(null),reagendarRef.current?.()},[]);return visivel?(0,jsx_runtime_1.jsx)(MessageView,{message:visivel.message,blocos:visivel.blocos,estilo:visivel.estilo,oc:visivel.oc,onClose:fechar}):null}function PushMeshInAppHost({onDisplayed:onDisplayed}){return(0,jsx_runtime_1.jsx)(HostInApp,{auto:false,onDisplayed:onDisplayed})}exports.PushMeshInApp=PushMeshInAppHost;const styles=react_native_1.StyleSheet.create({veil:{flex:1,justifyContent:"center",padding:24},full:{flex:1,justifyContent:"center",padding:24},banner:{position:"absolute",left:0,right:0,zIndex:9999,elevation:10,padding:8},bannerTop:{top:0},bannerBottom:{bottom:0},card:{overflow:"hidden",shadowColor:"#000",shadowOpacity:.2,shadowRadius:8,shadowOffset:{width:0,height:2},elevation:6},close:{position:"absolute",top:6,right:8,padding:6}});
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true}),exports.lerCache=lerCache,exports.lerEstado=lerEstado,exports.comprometerExibicao=comprometerExibicao,exports.buscarPacote=buscarPacote,exports.casaGatilho=casaGatilho,exports.decidir=decidir,exports.avaliar=avaliar,exports.proximoDisparoSessaoMs=proximoDisparoSessaoMs,exports.enviarRecibo=enviarRecibo;const http_1=require("../http"),queue_1=require("../queue"),state_1=require("../state"),storage_1=require("../storage"),triggers_1=require("../triggers"),sessao_1=require("./sessao"),VALIDADE_S_PADRAO=86400,H_MS=36e5,FORMATOS=["banner_top","banner_bottom","modal","fullscreen"],SCHEMA=3;async function lerCache(){const c=await(0,storage_1.getJson)(storage_1.KEYS.inappPacote,null);return c&&c.pacote&&Array.isArray(c.pacote.messages)&&"number"==typeof c.recebido_em?c:null}async function gravarCache(pacote,recebido_em){await(0,storage_1.setJson)(storage_1.KEYS.inappPacote,{pacote:pacote,recebido_em:recebido_em})}async function lerEstado(){const e=await(0,storage_1.getJson)(storage_1.KEYS.inappEstado,null);return{global_ultima_em:e?.global_ultima_em??0,campanhas:{...e?.campanhas??{}}}}async function comprometerExibicao(campanhaId,agora){const estado=await lerEstado(),oc=(estado.campanhas[campanhaId]??{exibicoes:0,ultima_em:0,ocorrencia_n:0}).exibicoes+1;return estado.campanhas[campanhaId]={exibicoes:oc,ultima_em:agora,ocorrencia_n:oc},estado.global_ultima_em=agora,await(0,storage_1.setJson)(storage_1.KEYS.inappEstado,estado),oc}function sanear(body){const validade="number"==typeof body.validade_s&&body.validade_s>0?body.validade_s:86400,cap="number"==typeof body.cap_global_h&&body.cap_global_h>=0?body.cap_global_h:0;return{pacote_id:"string"==typeof body.pacote_id?body.pacote_id:null,messages:Array.isArray(body.messages)?body.messages:[],validade_s:validade,cap_global_h:cap,etag:"string"==typeof body.etag?body.etag:null}}function pacoteValido(cache,agora){return!!cache&&agora<=cache.recebido_em+1e3*cache.pacote.validade_s}async function buscarPacote(){const config=(0,state_1.requireConfig)(),playerId=state_1.state.playerId??await(0,storage_1.getItem)(storage_1.KEYS.playerId),agora=Date.now(),cache=await lerCache();if(!playerId)return pacoteValido(cache,agora)?cache:null;const usarEtag=pacoteValido(cache,agora)&&cache.pacote.etag?cache.pacote.etag:null,rota=`/api/v1/inapp/pending?app_id=${encodeURIComponent(config.appId)}&player_id=${encodeURIComponent(playerId)}&schema=${SCHEMA}`;try{const res=await(0,http_1.get)(rota,usarEtag?{"If-None-Match":usarEtag}:void 0);if(304===res.status)return pacoteValido(cache,agora)?cache:null;if(!res.ok)return pacoteValido(cache,agora)?cache:null;const body=res.json;if(!body||!Array.isArray(body.messages))return pacoteValido(cache,agora)?cache:null;const pacote=sanear(body);return await gravarCache(pacote,agora),{pacote:pacote,recebido_em:agora}}catch{return pacoteValido(cache,agora)?cache:null}}function acharChave(mapa,chave){const chaves=Object.keys(mapa);if(chaves.indexOf(chave)>=0)return{achou:true,valor:mapa[chave]};const alvo=chave.toLowerCase();for(const k of chaves)if(k.toLowerCase()===alvo)return{achou:true,valor:mapa[k]};return{achou:false}}function paraNumero(v){if("number"==typeof v)return Number.isFinite(v)?v:null;if("string"!=typeof v)return null;const t=v.trim();if(!t)return null;const n=Number(t);return Number.isFinite(n)?n:null}function paraTexto(v){return String(v).trim().toLowerCase()}function casaEvento(g,mapa){const chave=g.chave;if("string"!=typeof chave||!chave)return false;const{achou:achou,valor:valor}=acharChave(mapa,chave),comp=g.comparador;if("nao_existe"===comp)return!achou;if(!achou)return false;if("existe"===comp)return true;const alvo=g.valor;if("number"==typeof alvo){const local=paraNumero(valor);return null!==local&&("igual"===comp?local===alvo:"diferente"===comp?local!==alvo:"maior"===comp?local>alvo:"menor"===comp&&local<alvo)}if("string"==typeof alvo){const local=paraTexto(valor),esperado=alvo.trim().toLowerCase();return"igual"===comp?local===esperado:"diferente"===comp&&local!==esperado}return false}function casaGatilho(gatilho,ctx,agora){const tipo=gatilho?.tipo??"ao_abrir";if("ao_abrir"===tipo)return"sessao"===ctx.momento;if("inatividade"===tipo){if("sessao"!==ctx.momento||null===ctx.inatividade_h)return false;const horas=gatilho?.horas;return"number"==typeof horas&&horas>0&&ctx.inatividade_h>=horas}if("sessao_duracao"===tipo){const segundos=gatilho?.segundos;return"number"==typeof segundos&&segundos>0&&agora-ctx.inicio_em>=1e3*segundos}return"evento"===tipo&&!!gatilho&&casaEvento(gatilho,ctx.gatilhos)}function decidir(cache,estado,agora,ctx){const c=ctx??{momento:"sessao",inicio_em:agora,inatividade_h:null,gatilhos:{}},{pacote:pacote,recebido_em:recebido_em}=cache;if(agora>recebido_em+1e3*pacote.validade_s)return null;if(pacote.cap_global_h>0&&estado.global_ultima_em>0&&agora-estado.global_ultima_em<pacote.cap_global_h*H_MS)return null;for(const m of pacote.messages){if(!m||"string"!=typeof m.id)continue;if(!FORMATOS.includes(m.formato))continue;if(!casaGatilho(m.gatilho,c,agora))continue;const regras=m.regras??{};if(regras.inicia_em){const t=Date.parse(regras.inicia_em);if(Number.isFinite(t)&&agora<t)continue}if(regras.expira_em){const t=Date.parse(regras.expira_em);if(Number.isFinite(t)&&agora>t)continue}const ec=estado.campanhas[m.id],capTotal=regras.cap_total??0;if(capTotal>0&&(ec?.exibicoes??0)>=capTotal)continue;const cooldownMs=(regras.cooldown_h??0)*H_MS;if(!(ec&&ec.ultima_em>0&&agora-ec.ultima_em<cooldownMs))return m}return null}async function cacheValido(agora){const c=await lerCache();return pacoteValido(c,agora)?c:null}async function avaliar(momento="sessao"){const inicio=Date.now(),sessao="sessao"===momento?await(0,sessao_1.abrirSessao)(inicio):(0,sessao_1.sessaoAtual)();if(!sessao)return null;const cache="sessao"===momento?await buscarPacote():await cacheValido(inicio);if(!cache)return null;const[estado,gatilhos]=await Promise.all([lerEstado(),(0,triggers_1.lerGatilhos)()]),message=decidir(cache,estado,Date.now(),{momento:momento,inicio_em:sessao.inicio_em,inatividade_h:sessao.inatividade_h,gatilhos:gatilhos});return message?{message:message}:null}async function proximoDisparoSessaoMs(agora){const sessao=(0,sessao_1.sessaoAtual)();if(!sessao)return null;const cache=await cacheValido(agora);if(!cache)return null;let menor=null;for(const m of cache.pacote.messages){const g=m?.gatilho;if(!g||"sessao_duracao"!==g.tipo||"number"!=typeof g.segundos)continue;const falta=sessao.inicio_em+1e3*g.segundos-agora;falta>0&&(null===menor||falta<menor)&&(menor=falta)}return menor}async function enviarRecibo(campanhaId,prova,evento,ocorrenciaN,botao){if(!prova)return;const config=(0,state_1.requireConfig)(),playerId=state_1.state.playerId??await(0,storage_1.getItem)(storage_1.KEYS.playerId),item={campanha_id:campanhaId,prova:prova,evento:evento,ocorrencia_n:ocorrenciaN,em:(new Date).toISOString()};"clique"===evento&&botao&&(item.botao=botao),await(0,queue_1.sendOrQueue)("POST","/api/v1/inapp/eventos",{app_id:config.appId,player_id:playerId,eventos:[item]})}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true}),exports.lerCache=lerCache,exports.lerEstado=lerEstado,exports.comprometerExibicao=comprometerExibicao,exports.buscarPacote=buscarPacote,exports.casaGatilho=casaGatilho,exports.decidir=decidir,exports.temPlayer=temPlayer,exports.avaliar=avaliar,exports.proximoDisparoSessaoMs=proximoDisparoSessaoMs,exports.enviarRecibo=enviarRecibo;const http_1=require("../http"),queue_1=require("../queue"),state_1=require("../state"),storage_1=require("../storage"),triggers_1=require("../triggers"),sessao_1=require("./sessao"),VALIDADE_S_PADRAO=86400,H_MS=36e5,FORMATOS=["banner_top","banner_bottom","modal","fullscreen"],SCHEMA=3;async function lerCache(){const c=await(0,storage_1.getJson)(storage_1.KEYS.inappPacote,null);return c&&c.pacote&&Array.isArray(c.pacote.messages)&&"number"==typeof c.recebido_em?c:null}async function gravarCache(pacote,recebido_em){await(0,storage_1.setJson)(storage_1.KEYS.inappPacote,{pacote:pacote,recebido_em:recebido_em})}async function lerEstado(){const e=await(0,storage_1.getJson)(storage_1.KEYS.inappEstado,null);return{global_ultima_em:e?.global_ultima_em??0,campanhas:{...e?.campanhas??{}}}}async function comprometerExibicao(campanhaId,agora){const estado=await lerEstado(),oc=(estado.campanhas[campanhaId]??{exibicoes:0,ultima_em:0,ocorrencia_n:0}).exibicoes+1;return estado.campanhas[campanhaId]={exibicoes:oc,ultima_em:agora,ocorrencia_n:oc},estado.global_ultima_em=agora,await(0,storage_1.setJson)(storage_1.KEYS.inappEstado,estado),oc}function sanear(body){const validade="number"==typeof body.validade_s&&body.validade_s>0?body.validade_s:86400,cap="number"==typeof body.cap_global_h&&body.cap_global_h>=0?body.cap_global_h:0;return{pacote_id:"string"==typeof body.pacote_id?body.pacote_id:null,messages:Array.isArray(body.messages)?body.messages:[],validade_s:validade,cap_global_h:cap,etag:"string"==typeof body.etag?body.etag:null}}function pacoteValido(cache,agora){return!!cache&&agora<=cache.recebido_em+1e3*cache.pacote.validade_s}async function buscarPacote(){const config=(0,state_1.requireConfig)(),playerId=state_1.state.playerId??await(0,storage_1.getItem)(storage_1.KEYS.playerId),agora=Date.now(),cache=await lerCache();if(!playerId)return pacoteValido(cache,agora)?cache:null;const usarEtag=pacoteValido(cache,agora)&&cache.pacote.etag?cache.pacote.etag:null,rota=`/api/v1/inapp/pending?app_id=${encodeURIComponent(config.appId)}&player_id=${encodeURIComponent(playerId)}&schema=${SCHEMA}`;try{const res=await(0,http_1.get)(rota,usarEtag?{"If-None-Match":usarEtag}:void 0);if(304===res.status)return pacoteValido(cache,agora)?cache:null;if(!res.ok)return pacoteValido(cache,agora)?cache:null;const body=res.json;if(!body||!Array.isArray(body.messages))return pacoteValido(cache,agora)?cache:null;const pacote=sanear(body);return await gravarCache(pacote,agora),{pacote:pacote,recebido_em:agora}}catch{return pacoteValido(cache,agora)?cache:null}}function acharChave(mapa,chave){const chaves=Object.keys(mapa);if(chaves.indexOf(chave)>=0)return{achou:true,valor:mapa[chave]};const alvo=chave.toLowerCase();for(const k of chaves)if(k.toLowerCase()===alvo)return{achou:true,valor:mapa[k]};return{achou:false}}function paraNumero(v){if("number"==typeof v)return Number.isFinite(v)?v:null;if("string"!=typeof v)return null;const t=v.trim();if(!t)return null;const n=Number(t);return Number.isFinite(n)?n:null}function paraTexto(v){return String(v).trim().toLowerCase()}function casaEvento(g,mapa){const chave=g.chave;if("string"!=typeof chave||!chave)return false;const{achou:achou,valor:valor}=acharChave(mapa,chave),comp=g.comparador;if("nao_existe"===comp)return!achou;if(!achou)return false;if("existe"===comp)return true;const alvo=g.valor;if("number"==typeof alvo){const local=paraNumero(valor);return null!==local&&("igual"===comp?local===alvo:"diferente"===comp?local!==alvo:"maior"===comp?local>alvo:"menor"===comp&&local<alvo)}if("string"==typeof alvo){const local=paraTexto(valor),esperado=alvo.trim().toLowerCase();return"igual"===comp?local===esperado:"diferente"===comp&&local!==esperado}return false}function casaGatilho(gatilho,ctx,agora){const tipo=gatilho?.tipo??"ao_abrir";if("ao_abrir"===tipo)return"sessao"===ctx.momento;if("inatividade"===tipo){if("sessao"!==ctx.momento||null===ctx.inatividade_h)return false;const horas=gatilho?.horas;return"number"==typeof horas&&horas>0&&ctx.inatividade_h>=horas}if("sessao_duracao"===tipo){const segundos=gatilho?.segundos;return"number"==typeof segundos&&segundos>0&&agora-ctx.inicio_em>=1e3*segundos}return"evento"===tipo&&!!gatilho&&casaEvento(gatilho,ctx.gatilhos)}function decidir(cache,estado,agora,ctx){const c=ctx??{momento:"sessao",inicio_em:agora,inatividade_h:null,gatilhos:{}},{pacote:pacote,recebido_em:recebido_em}=cache;if(agora>recebido_em+1e3*pacote.validade_s)return null;if(pacote.cap_global_h>0&&estado.global_ultima_em>0&&agora-estado.global_ultima_em<pacote.cap_global_h*H_MS)return null;for(const m of pacote.messages){if(!m||"string"!=typeof m.id)continue;if(!FORMATOS.includes(m.formato))continue;if(!casaGatilho(m.gatilho,c,agora))continue;const regras=m.regras??{};if(regras.inicia_em){const t=Date.parse(regras.inicia_em);if(Number.isFinite(t)&&agora<t)continue}if(regras.expira_em){const t=Date.parse(regras.expira_em);if(Number.isFinite(t)&&agora>t)continue}const ec=estado.campanhas[m.id],capTotal=regras.cap_total??0;if(capTotal>0&&(ec?.exibicoes??0)>=capTotal)continue;const cooldownMs=(regras.cooldown_h??0)*H_MS;if(!(ec&&ec.ultima_em>0&&agora-ec.ultima_em<cooldownMs))return m}return null}async function temPlayer(){return!!(state_1.state.playerId??await(0,storage_1.getItem)(storage_1.KEYS.playerId))}async function cacheValido(agora){const c=await lerCache();return pacoteValido(c,agora)?c:null}async function avaliar(momento="sessao",opcoes){const inicio=Date.now(),sessao="sessao"===momento?(opcoes?.reaproveitarSessao?(0,sessao_1.sessaoAtual)():null)??await(0,sessao_1.abrirSessao)(inicio):(0,sessao_1.sessaoAtual)();if(!sessao)return null;const cache="sessao"===momento?await buscarPacote():await cacheValido(inicio);if(!cache)return null;const[estado,gatilhos]=await Promise.all([lerEstado(),(0,triggers_1.lerGatilhos)()]),message=decidir(cache,estado,Date.now(),{momento:momento,inicio_em:sessao.inicio_em,inatividade_h:sessao.inatividade_h,gatilhos:gatilhos});return message?{message:message}:null}async function proximoDisparoSessaoMs(agora){const sessao=(0,sessao_1.sessaoAtual)();if(!sessao)return null;const cache=await cacheValido(agora);if(!cache)return null;let menor=null;for(const m of cache.pacote.messages){const g=m?.gatilho;if(!g||"sessao_duracao"!==g.tipo||"number"!=typeof g.segundos)continue;const falta=sessao.inicio_em+1e3*g.segundos-agora;falta>0&&(null===menor||falta<menor)&&(menor=falta)}return menor}async function enviarRecibo(campanhaId,prova,evento,ocorrenciaN,botao){if(!prova)return;const config=(0,state_1.requireConfig)(),playerId=state_1.state.playerId??await(0,storage_1.getItem)(storage_1.KEYS.playerId),item={campanha_id:campanhaId,prova:prova,evento:evento,ocorrencia_n:ocorrenciaN,em:(new Date).toISOString()};"clique"===evento&&botao&&(item.botao=botao),await(0,queue_1.sendOrQueue)("POST","/api/v1/inapp/eventos",{app_id:config.appId,player_id:playerId,eventos:[item]})}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true}),exports.SESSAO_FOREGROUND_MS=void 0,exports.inscreverInApp=inscreverInApp,exports.aoVoltarAoForeground=aoVoltarAoForeground,exports.aoMudarGatilhos=aoMudarGatilhos,exports.__resetLifecycleForTests=__resetLifecycleForTests,exports.SESSAO_FOREGROUND_MS=3e4;const ouvintes=new Set;function inscreverInApp(cb){return ouvintes.add(cb),()=>{ouvintes.delete(cb)}}function notificar(momento){for(const cb of ouvintes)try{cb(momento)}catch{}}function aoVoltarAoForeground(emBackgroundDesde){null!==emBackgroundDesde&&(Date.now()-emBackgroundDesde<exports.SESSAO_FOREGROUND_MS||notificar("sessao"))}function aoMudarGatilhos(){notificar("durante")}function __resetLifecycleForTests(){ouvintes.clear()}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true}),exports.SESSAO_FOREGROUND_MS=void 0,exports.inscreverInApp=inscreverInApp,exports.aoVoltarAoForeground=aoVoltarAoForeground,exports.aoMudarGatilhos=aoMudarGatilhos,exports.inscreverPlayerPronto=inscreverPlayerPronto,exports.aoPlayerPronto=aoPlayerPronto,exports.__resetLifecycleForTests=__resetLifecycleForTests,exports.SESSAO_FOREGROUND_MS=3e4;const ouvintes=new Set;function inscreverInApp(cb){return ouvintes.add(cb),()=>{ouvintes.delete(cb)}}function notificar(momento){for(const cb of ouvintes)try{cb(momento)}catch{}}function aoVoltarAoForeground(emBackgroundDesde){null!==emBackgroundDesde&&(Date.now()-emBackgroundDesde<exports.SESSAO_FOREGROUND_MS||notificar("sessao"))}function aoMudarGatilhos(){notificar("durante")}const ouvintesPlayer=new Set;function inscreverPlayerPronto(cb){return ouvintesPlayer.add(cb),()=>{ouvintesPlayer.delete(cb)}}function aoPlayerPronto(){for(const cb of ouvintesPlayer)try{cb()}catch{}}function __resetLifecycleForTests(){ouvintes.clear(),ouvintesPlayer.clear()}
@@ -20,7 +20,7 @@
20
20
  * linha sozinho (script `version` → scripts/sync-versao.mjs); editando à mão,
21
21
  * suba as duas.
22
22
  */
23
- export declare const SDK_VERSAO = "0.7.4";
23
+ export declare const SDK_VERSAO = "0.7.5";
24
24
  export interface PerfilDispositivo {
25
25
  device_os?: string;
26
26
  fabricante?: string;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true}),exports.SDK_VERSAO=void 0,exports.coletarPerfil=coletarPerfil;const react_native_1=require("react-native"),storage_1=require("./storage");function moduloPerfil(){const mods=react_native_1.NativeModules;return"ios"===react_native_1.Platform.OS?mods.PushMeshApns:mods.PushMeshFirebase}function timezoneId(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone||void 0}catch{return}}function pais(){try{const loc=Intl.DateTimeFormat().resolvedOptions().locale,m=/[-_]([A-Za-z]{2})(?:[-_]|$)/.exec(loc);return m?m[1].toUpperCase():void 0}catch{return}}async function proximaSessao(){const atual=Number(await(0,storage_1.getItem)(storage_1.KEYS.sessoes)??"0"),proxima=Number.isFinite(atual)&&atual>=0?atual+1:1;return await(0,storage_1.setItem)(storage_1.KEYS.sessoes,String(proxima)),proxima}function semVazios(p){const out={};for(const[k,v]of Object.entries(p))null!=v&&""!==v&&(out[k]=v);return out}async function coletarPerfil(){const perfil={sdk_versao:exports.SDK_VERSAO,timezone_id:timezoneId(),pais:pais()};try{perfil.sessoes=await proximaSessao()}catch{}try{const nativo=moduloPerfil();if(nativo?.perfilDispositivo){const n=await nativo.perfilDispositivo();Object.assign(perfil,{device_os:n.device_os,fabricante:n.fabricante,modelo:n.modelo,net_type:n.net_type,carrier:n.carrier,rooted:n.rooted,standby_bucket:n.standby_bucket,bateria_irrestrita:n.bateria_irrestrita,notif_permissoes:n.notif_permissoes,instalacao_id:n.instalacao_id})}}catch{}if(!perfil.device_os){const v=react_native_1.Platform.Version;perfil.device_os="string"==typeof v?v:String(v)}if(!perfil.fabricante){const c=react_native_1.Platform.constants;perfil.fabricante="ios"===react_native_1.Platform.OS?"Apple":c?.Manufacturer}return semVazios(perfil)}exports.SDK_VERSAO="0.7.4";
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true}),exports.SDK_VERSAO=void 0,exports.coletarPerfil=coletarPerfil;const react_native_1=require("react-native"),storage_1=require("./storage");function moduloPerfil(){const mods=react_native_1.NativeModules;return"ios"===react_native_1.Platform.OS?mods.PushMeshApns:mods.PushMeshFirebase}function timezoneId(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone||void 0}catch{return}}function pais(){try{const loc=Intl.DateTimeFormat().resolvedOptions().locale,m=/[-_]([A-Za-z]{2})(?:[-_]|$)/.exec(loc);return m?m[1].toUpperCase():void 0}catch{return}}async function proximaSessao(){const atual=Number(await(0,storage_1.getItem)(storage_1.KEYS.sessoes)??"0"),proxima=Number.isFinite(atual)&&atual>=0?atual+1:1;return await(0,storage_1.setItem)(storage_1.KEYS.sessoes,String(proxima)),proxima}function semVazios(p){const out={};for(const[k,v]of Object.entries(p))null!=v&&""!==v&&(out[k]=v);return out}async function coletarPerfil(){const perfil={sdk_versao:exports.SDK_VERSAO,timezone_id:timezoneId(),pais:pais()};try{perfil.sessoes=await proximaSessao()}catch{}try{const nativo=moduloPerfil();if(nativo?.perfilDispositivo){const n=await nativo.perfilDispositivo();Object.assign(perfil,{device_os:n.device_os,fabricante:n.fabricante,modelo:n.modelo,net_type:n.net_type,carrier:n.carrier,rooted:n.rooted,standby_bucket:n.standby_bucket,bateria_irrestrita:n.bateria_irrestrita,notif_permissoes:n.notif_permissoes,instalacao_id:n.instalacao_id})}}catch{}if(!perfil.device_os){const v=react_native_1.Platform.Version;perfil.device_os="string"==typeof v?v:String(v)}if(!perfil.fabricante){const c=react_native_1.Platform.constants;perfil.fabricante="ios"===react_native_1.Platform.OS?"Apple":c?.Manufacturer}return semVazios(perfil)}exports.SDK_VERSAO="0.7.5";
@@ -1 +1 @@
1
- "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(o,m,k,k2){void 0===k2&&(k2=k);var desc=Object.getOwnPropertyDescriptor(m,k);desc&&!("get"in desc?!m.__esModule:desc.writable||desc.configurable)||(desc={enumerable:true,get:function(){return m[k]}}),Object.defineProperty(o,k2,desc)}:function(o,m,k,k2){void 0===k2&&(k2=k),o[k2]=m[k]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(o,v){Object.defineProperty(o,"default",{enumerable:true,value:v})}:function(o,v){o.default=v}),__importStar=this&&this.__importStar||function(){var ownKeys=function(o){return ownKeys=Object.getOwnPropertyNames||function(o){var ar=[];for(var k in o)Object.prototype.hasOwnProperty.call(o,k)&&(ar[ar.length]=k);return ar},ownKeys(o)};return function(mod){if(mod&&mod.__esModule)return mod;var result={};if(null!=mod)for(var k=ownKeys(mod),i=0;i<k.length;i++)"default"!==k[i]&&__createBinding(result,mod,k[i]);return __setModuleDefault(result,mod),result}}();Object.defineProperty(exports,"__esModule",{value:true}),exports.payloadHash=payloadHash,exports.buildRegisterPayload=buildRegisterPayload,exports.__resetRegistroForTests=__resetRegistroForTests,exports.registroPerdido=registroPerdido,exports.__resetRegistroPerdidoForTests=__resetRegistroPerdidoForTests,exports.register=register,exports.login=login,exports.logout=logout,exports.init=init,exports.setToken=setToken,exports.getPlayerId=getPlayerId;const react_native_1=require("react-native"),http_1=require("./http"),perfil_1=require("./perfil"),queue_1=require("./queue"),state_1=require("./state"),storage_1=require("./storage"),types_1=require("./types"),GERACAO_REGISTRO=5;function payloadHash(payload){const{sessoes:_sessoes,...semSessoes}=payload,dia=(new Date).toISOString().slice(0,10),s=`g${GERACAO_REGISTRO}|d${dia}|${JSON.stringify(semSessoes,Object.keys(semSessoes).sort())}`;let h=2166136261;for(let i=0;i<s.length;i++)h^=s.charCodeAt(i),h=Math.imul(h,16777619);return(h>>>0).toString(16)}function resolveDeviceType(config){return config.deviceType&&"auto"!==config.deviceType?config.deviceType:"ios"===react_native_1.Platform.OS?types_1.RpDeviceType.IOS:types_1.RpDeviceType.Android}function resolveDeviceModel(config){if(config.deviceModel)return config.deviceModel;const constants=react_native_1.Platform.constants;return constants?.Model}function resolveLanguage(){try{return Intl.DateTimeFormat().resolvedOptions().locale}catch{return}}function resolveTimezoneOffsetSegundos(){try{const off=60*-(new Date).getTimezoneOffset();return Number.isFinite(off)?off:void 0}catch{return}}function buildRegisterPayload(){const config=(0,state_1.requireConfig)();if(!state_1.state.token)throw new Error("[PushMesh] sem token de push. Como corrigir: passe config.getToken no init ou chame PushMesh.setToken(token) quando o Firebase entregar o token.");const payload={app_id:config.appId,identifier:state_1.state.token,device_type:resolveDeviceType(config)};state_1.state.transporte&&(payload.transporte=state_1.state.transporte),state_1.state.externalUserId?payload.external_user_id=state_1.state.externalUserId:state_1.state.logoutPendente&&(payload.external_user_id=null),config.appVersion&&(payload.app_version=config.appVersion);const model=resolveDeviceModel(config);model&&(payload.device_model=model);const language=resolveLanguage();language&&(payload.language=language);const timezone=resolveTimezoneOffsetSegundos();void 0!==timezone&&(payload.timezone=timezone);const{modelo:modeloPerfil,...perfilSemModelo}=state_1.state.perfil;return Object.assign(payload,perfilSemModelo),!payload.device_model&&modeloPerfil&&(payload.device_model=modeloPerfil),payload}let registroEmVoo=null;function __resetRegistroForTests(){registroEmVoo=null}let registroPerdidoTratado=false;async function registroPerdido(origem){registroPerdidoTratado||(registroPerdidoTratado=true,console.warn(`[PushMesh] o servidor não conhece mais este aparelho (404 em ${origem}) — o registro local será refeito agora. Se a audiência foi apagada no painel, isto é o aparelho voltando sozinho.`),state_1.state.playerId=null,await(0,storage_1.removeItem)(storage_1.KEYS.playerId),await(0,storage_1.removeItem)(storage_1.KEYS.regHash),await register())}function __resetRegistroPerdidoForTests(){registroPerdidoTratado=false}async function register(){const hash=payloadHash(buildRegisterPayload());if(registroEmVoo?.hash===hash)return registroEmVoo.promessa;const entrada={hash:hash,promessa:(registroEmVoo?.promessa??Promise.resolve(null)).then(registrarAgora,registrarAgora)};registroEmVoo=entrada;const liberar=()=>{registroEmVoo===entrada&&(registroEmVoo=null)};return entrada.promessa.then(liberar,liberar),entrada.promessa}async function registrarAgora(){const payload=buildRegisterPayload(),hash=payloadHash(payload),cachedHash=await(0,storage_1.getItem)(storage_1.KEYS.regHash),cachedPlayerId=await(0,storage_1.getItem)(storage_1.KEYS.playerId);if(cachedHash===hash&&cachedPlayerId)return state_1.state.playerId=cachedPlayerId,cachedPlayerId;const res=await(0,http_1.post)("/api/v1/players",payload);if(!res.ok)return console.warn(`[PushMesh] POST /players respondeu ${res.status}`),null;const body=res.json;if(!body?.id)return console.warn("[PushMesh] POST /players sem id na resposta"),null;state_1.state.playerId=body.id,await(0,storage_1.setItem)(storage_1.KEYS.playerId,body.id),await(0,storage_1.setItem)(storage_1.KEYS.regHash,hash),state_1.state.logoutPendente&&(state_1.state.logoutPendente=false,await(0,storage_1.removeItem)(storage_1.KEYS.logoutPendente));const{sincronizarReciboNativo:sincronizarReciboNativo}=await Promise.resolve().then(()=>__importStar(require("./zeroconfig")));await sincronizarReciboNativo(body.id).catch(()=>{});const{syncTagsPendentes:syncTagsPendentes}=await Promise.resolve().then(()=>__importStar(require("./tags")));return await syncTagsPendentes().catch(()=>{}),body.id}async function login(externalUserId){(0,state_1.requireConfig)(),state_1.state.externalUserId=externalUserId,await(0,storage_1.setItem)(storage_1.KEYS.externalUserId,externalUserId),state_1.state.logoutPendente=false,await(0,storage_1.removeItem)(storage_1.KEYS.logoutPendente);const playerId=await ensurePlayerId();playerId&&await(0,queue_1.sendOrQueue)("PUT",`/api/v1/players/${playerId}`,{app_id:(0,state_1.requireConfig)().appId,external_user_id:externalUserId})}async function logout(){(0,state_1.requireConfig)(),state_1.state.externalUserId=null,await(0,storage_1.removeItem)(storage_1.KEYS.externalUserId),state_1.state.logoutPendente=true,await(0,storage_1.setItem)(storage_1.KEYS.logoutPendente,"1");const playerId=state_1.state.playerId??await(0,storage_1.getItem)(storage_1.KEYS.playerId);playerId&&await(0,queue_1.sendOrQueue)("PUT",`/api/v1/players/${playerId}`,{app_id:(0,state_1.requireConfig)().appId,external_user_id:null})}async function ensurePlayerId(){if(state_1.state.playerId)return state_1.state.playerId;const cached=await(0,storage_1.getItem)(storage_1.KEYS.playerId);return cached&&(state_1.state.playerId=cached),cached}function textoOutroAppId(anterior,novo){return`[PushMesh] init com appId ${novo}, mas o SDK já está inicializado com ${anterior}. Como corrigir: o SDK é singleton do processo — use UM appId no boot do app.`}async function init(config){if(!config.appId)throw new Error("[PushMesh] config.appId é obrigatório.");if(state_1.state.initEmVoo){if(state_1.state.config&&state_1.state.config.appId!==config.appId)throw new Error(textoOutroAppId(state_1.state.config.appId,config.appId));return state_1.state.initEmVoo}const promessa=bootstrap(config);state_1.state.initEmVoo=promessa;try{await promessa}finally{state_1.state.initEmVoo=null}}async function bootstrap(config){state_1.state.config&&state_1.state.config.appId!==config.appId&&console.warn(textoOutroAppId(state_1.state.config.appId,config.appId));const baseUrl=config.baseUrl?.trim()||state_1.BASE_URL_PADRAO;if((0,state_1.validarBaseUrl)(baseUrl),state_1.state.config={...config,baseUrl:baseUrl},config=state_1.state.config,state_1.state.perfil=await(0,perfil_1.coletarPerfil)(),state_1.state.playerId=await(0,storage_1.getItem)(storage_1.KEYS.playerId),state_1.state.token=await(0,storage_1.getItem)(storage_1.KEYS.token),state_1.state.transporte="apns"===await(0,storage_1.getItem)(storage_1.KEYS.transporte)?"apns":null,state_1.state.externalUserId=await(0,storage_1.getItem)(storage_1.KEYS.externalUserId),state_1.state.logoutPendente="1"===await(0,storage_1.getItem)(storage_1.KEYS.logoutPendente),config.externalUserId&&config.externalUserId!==state_1.state.externalUserId&&await login(config.externalUserId).catch(e=>console.warn("[PushMesh] externalUserId do init não propagou agora — vai no registro",e)),config.getToken){state_1.state.transporte&&(state_1.state.transporte=null,await(0,storage_1.removeItem)(storage_1.KEYS.transporte));try{const token=await config.getToken();token&&token!==state_1.state.token&&(state_1.state.token=token,await(0,storage_1.setItem)(storage_1.KEYS.token,token))}catch(e){console.warn("[PushMesh] config.getToken falhou",e)}}else if("android"===react_native_1.Platform.OS){const{bootZeroConfigAndroid:bootZeroConfigAndroid}=await Promise.resolve().then(()=>__importStar(require("./zeroconfig")));await bootZeroConfigAndroid()}else{const{bootZeroConfigIos:bootZeroConfigIos}=await Promise.resolve().then(()=>__importStar(require("./zeroconfig")));await bootZeroConfigIos()}if(state_1.state.token)try{await register()}catch(e){console.warn("[PushMesh] registro falhou (rede?) — retenta no próximo boot",e)}if(!config.getToken)try{const zc=await Promise.resolve().then(()=>__importStar(require("./zeroconfig")));"android"===react_native_1.Platform.OS?(await zc.drenarMensagensPendentes(),await zc.processarCliqueInicial()):await zc.processarCliquePendenteIos()}catch(e){console.warn("[PushMesh] falha no pós-registro do zero-config (buffer/clique)",e)}await(0,queue_1.flushQueue)().catch(()=>{})}async function setToken(token){if(token&&token!==state_1.state.token&&(state_1.state.token=token,await(0,storage_1.setItem)(storage_1.KEYS.token,token),state_1.state.config))try{await register()}catch(e){console.warn("[PushMesh] registro pós-setToken falhou",e)}}async function getPlayerId(){return ensurePlayerId()}
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(o,m,k,k2){void 0===k2&&(k2=k);var desc=Object.getOwnPropertyDescriptor(m,k);desc&&!("get"in desc?!m.__esModule:desc.writable||desc.configurable)||(desc={enumerable:true,get:function(){return m[k]}}),Object.defineProperty(o,k2,desc)}:function(o,m,k,k2){void 0===k2&&(k2=k),o[k2]=m[k]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(o,v){Object.defineProperty(o,"default",{enumerable:true,value:v})}:function(o,v){o.default=v}),__importStar=this&&this.__importStar||function(){var ownKeys=function(o){return ownKeys=Object.getOwnPropertyNames||function(o){var ar=[];for(var k in o)Object.prototype.hasOwnProperty.call(o,k)&&(ar[ar.length]=k);return ar},ownKeys(o)};return function(mod){if(mod&&mod.__esModule)return mod;var result={};if(null!=mod)for(var k=ownKeys(mod),i=0;i<k.length;i++)"default"!==k[i]&&__createBinding(result,mod,k[i]);return __setModuleDefault(result,mod),result}}();Object.defineProperty(exports,"__esModule",{value:true}),exports.payloadHash=payloadHash,exports.buildRegisterPayload=buildRegisterPayload,exports.__resetRegistroForTests=__resetRegistroForTests,exports.registroPerdido=registroPerdido,exports.__resetRegistroPerdidoForTests=__resetRegistroPerdidoForTests,exports.register=register,exports.login=login,exports.logout=logout,exports.init=init,exports.setToken=setToken,exports.getPlayerId=getPlayerId;const react_native_1=require("react-native"),http_1=require("./http"),lifecycle_1=require("./inapp/lifecycle"),perfil_1=require("./perfil"),queue_1=require("./queue"),state_1=require("./state"),storage_1=require("./storage"),types_1=require("./types"),GERACAO_REGISTRO=5;function payloadHash(payload){const{sessoes:_sessoes,...semSessoes}=payload,dia=(new Date).toISOString().slice(0,10),s=`g${GERACAO_REGISTRO}|d${dia}|${JSON.stringify(semSessoes,Object.keys(semSessoes).sort())}`;let h=2166136261;for(let i=0;i<s.length;i++)h^=s.charCodeAt(i),h=Math.imul(h,16777619);return(h>>>0).toString(16)}function resolveDeviceType(config){return config.deviceType&&"auto"!==config.deviceType?config.deviceType:"ios"===react_native_1.Platform.OS?types_1.RpDeviceType.IOS:types_1.RpDeviceType.Android}function resolveDeviceModel(config){if(config.deviceModel)return config.deviceModel;const constants=react_native_1.Platform.constants;return constants?.Model}function resolveLanguage(){try{return Intl.DateTimeFormat().resolvedOptions().locale}catch{return}}function resolveTimezoneOffsetSegundos(){try{const off=60*-(new Date).getTimezoneOffset();return Number.isFinite(off)?off:void 0}catch{return}}function buildRegisterPayload(){const config=(0,state_1.requireConfig)();if(!state_1.state.token)throw new Error("[PushMesh] sem token de push. Como corrigir: passe config.getToken no init ou chame PushMesh.setToken(token) quando o Firebase entregar o token.");const payload={app_id:config.appId,identifier:state_1.state.token,device_type:resolveDeviceType(config)};state_1.state.transporte&&(payload.transporte=state_1.state.transporte),state_1.state.externalUserId?payload.external_user_id=state_1.state.externalUserId:state_1.state.logoutPendente&&(payload.external_user_id=null),config.appVersion&&(payload.app_version=config.appVersion);const model=resolveDeviceModel(config);model&&(payload.device_model=model);const language=resolveLanguage();language&&(payload.language=language);const timezone=resolveTimezoneOffsetSegundos();void 0!==timezone&&(payload.timezone=timezone);const{modelo:modeloPerfil,...perfilSemModelo}=state_1.state.perfil;return Object.assign(payload,perfilSemModelo),!payload.device_model&&modeloPerfil&&(payload.device_model=modeloPerfil),payload}let registroEmVoo=null;function __resetRegistroForTests(){registroEmVoo=null}let registroPerdidoTratado=false;async function registroPerdido(origem){registroPerdidoTratado||(registroPerdidoTratado=true,console.warn(`[PushMesh] o servidor não conhece mais este aparelho (404 em ${origem}) — o registro local será refeito agora. Se a audiência foi apagada no painel, isto é o aparelho voltando sozinho.`),state_1.state.playerId=null,await(0,storage_1.removeItem)(storage_1.KEYS.playerId),await(0,storage_1.removeItem)(storage_1.KEYS.regHash),await register())}function __resetRegistroPerdidoForTests(){registroPerdidoTratado=false}async function register(){const hash=payloadHash(buildRegisterPayload());if(registroEmVoo?.hash===hash)return registroEmVoo.promessa;const entrada={hash:hash,promessa:(registroEmVoo?.promessa??Promise.resolve(null)).then(registrarAgora,registrarAgora)};registroEmVoo=entrada;const liberar=()=>{registroEmVoo===entrada&&(registroEmVoo=null)};return entrada.promessa.then(liberar,liberar),entrada.promessa}async function registrarAgora(){const payload=buildRegisterPayload(),hash=payloadHash(payload),cachedHash=await(0,storage_1.getItem)(storage_1.KEYS.regHash),cachedPlayerId=await(0,storage_1.getItem)(storage_1.KEYS.playerId);if(cachedHash===hash&&cachedPlayerId)return state_1.state.playerId=cachedPlayerId,(0,lifecycle_1.aoPlayerPronto)(),cachedPlayerId;const res=await(0,http_1.post)("/api/v1/players",payload);if(!res.ok)return console.warn(`[PushMesh] POST /players respondeu ${res.status}`),null;const body=res.json;if(!body?.id)return console.warn("[PushMesh] POST /players sem id na resposta"),null;state_1.state.playerId=body.id,await(0,storage_1.setItem)(storage_1.KEYS.playerId,body.id),await(0,storage_1.setItem)(storage_1.KEYS.regHash,hash),(0,lifecycle_1.aoPlayerPronto)(),state_1.state.logoutPendente&&(state_1.state.logoutPendente=false,await(0,storage_1.removeItem)(storage_1.KEYS.logoutPendente));const{sincronizarReciboNativo:sincronizarReciboNativo}=await Promise.resolve().then(()=>__importStar(require("./zeroconfig")));await sincronizarReciboNativo(body.id).catch(()=>{});const{syncTagsPendentes:syncTagsPendentes}=await Promise.resolve().then(()=>__importStar(require("./tags")));return await syncTagsPendentes().catch(()=>{}),body.id}async function login(externalUserId){(0,state_1.requireConfig)(),state_1.state.externalUserId=externalUserId,await(0,storage_1.setItem)(storage_1.KEYS.externalUserId,externalUserId),state_1.state.logoutPendente=false,await(0,storage_1.removeItem)(storage_1.KEYS.logoutPendente);const playerId=await ensurePlayerId();playerId&&await(0,queue_1.sendOrQueue)("PUT",`/api/v1/players/${playerId}`,{app_id:(0,state_1.requireConfig)().appId,external_user_id:externalUserId})}async function logout(){(0,state_1.requireConfig)(),state_1.state.externalUserId=null,await(0,storage_1.removeItem)(storage_1.KEYS.externalUserId),state_1.state.logoutPendente=true,await(0,storage_1.setItem)(storage_1.KEYS.logoutPendente,"1");const playerId=state_1.state.playerId??await(0,storage_1.getItem)(storage_1.KEYS.playerId);playerId&&await(0,queue_1.sendOrQueue)("PUT",`/api/v1/players/${playerId}`,{app_id:(0,state_1.requireConfig)().appId,external_user_id:null})}async function ensurePlayerId(){if(state_1.state.playerId)return state_1.state.playerId;const cached=await(0,storage_1.getItem)(storage_1.KEYS.playerId);return cached&&(state_1.state.playerId=cached),cached}function textoOutroAppId(anterior,novo){return`[PushMesh] init com appId ${novo}, mas o SDK já está inicializado com ${anterior}. Como corrigir: o SDK é singleton do processo — use UM appId no boot do app.`}async function init(config){if(!config.appId)throw new Error("[PushMesh] config.appId é obrigatório.");if(state_1.state.initEmVoo){if(state_1.state.config&&state_1.state.config.appId!==config.appId)throw new Error(textoOutroAppId(state_1.state.config.appId,config.appId));return state_1.state.initEmVoo}const promessa=bootstrap(config);state_1.state.initEmVoo=promessa;try{await promessa}finally{state_1.state.initEmVoo=null}}async function bootstrap(config){state_1.state.config&&state_1.state.config.appId!==config.appId&&console.warn(textoOutroAppId(state_1.state.config.appId,config.appId));const baseUrl=config.baseUrl?.trim()||state_1.BASE_URL_PADRAO;if((0,state_1.validarBaseUrl)(baseUrl),state_1.state.config={...config,baseUrl:baseUrl},config=state_1.state.config,state_1.state.perfil=await(0,perfil_1.coletarPerfil)(),state_1.state.playerId=await(0,storage_1.getItem)(storage_1.KEYS.playerId),state_1.state.token=await(0,storage_1.getItem)(storage_1.KEYS.token),state_1.state.transporte="apns"===await(0,storage_1.getItem)(storage_1.KEYS.transporte)?"apns":null,state_1.state.externalUserId=await(0,storage_1.getItem)(storage_1.KEYS.externalUserId),state_1.state.logoutPendente="1"===await(0,storage_1.getItem)(storage_1.KEYS.logoutPendente),config.externalUserId&&config.externalUserId!==state_1.state.externalUserId&&await login(config.externalUserId).catch(e=>console.warn("[PushMesh] externalUserId do init não propagou agora — vai no registro",e)),config.getToken){state_1.state.transporte&&(state_1.state.transporte=null,await(0,storage_1.removeItem)(storage_1.KEYS.transporte));try{const token=await config.getToken();token&&token!==state_1.state.token&&(state_1.state.token=token,await(0,storage_1.setItem)(storage_1.KEYS.token,token))}catch(e){console.warn("[PushMesh] config.getToken falhou",e)}}else if("android"===react_native_1.Platform.OS){const{bootZeroConfigAndroid:bootZeroConfigAndroid}=await Promise.resolve().then(()=>__importStar(require("./zeroconfig")));await bootZeroConfigAndroid()}else{const{bootZeroConfigIos:bootZeroConfigIos}=await Promise.resolve().then(()=>__importStar(require("./zeroconfig")));await bootZeroConfigIos()}if(state_1.state.token)try{await register()}catch(e){console.warn("[PushMesh] registro falhou (rede?) — retenta no próximo boot",e)}if(!config.getToken)try{const zc=await Promise.resolve().then(()=>__importStar(require("./zeroconfig")));"android"===react_native_1.Platform.OS?(await zc.drenarMensagensPendentes(),await zc.processarCliqueInicial()):await zc.processarCliquePendenteIos()}catch(e){console.warn("[PushMesh] falha no pós-registro do zero-config (buffer/clique)",e)}await(0,queue_1.flushQueue)().catch(()=>{})}async function setToken(token){if(token&&token!==state_1.state.token&&(state_1.state.token=token,await(0,storage_1.setItem)(storage_1.KEYS.token,token),state_1.state.config))try{await register()}catch(e){console.warn("[PushMesh] registro pós-setToken falhou",e)}}async function getPlayerId(){return ensurePlayerId()}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pushmesh/sdk",
3
- "version": "0.7.4",
3
+ "version": "0.7.5",
4
4
  "description": "React Native SDK for PushMesh — push notifications with real delivery receipts, permission re-activation and in-app banners. Classic API included. (Guia em português: README.pt-BR.md)",
5
5
  "license": "MIT",
6
6
  "private": false,