@growth-rail/react-native 2.0.3 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +47 -42
package/CHANGELOG.md
CHANGED
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var Ce=Object.create;var Y=Object.defineProperty;var xe=Object.getOwnPropertyDescriptor;var Te=Object.getOwnPropertyNames;var ve=Object.getPrototypeOf,Le=Object.prototype.hasOwnProperty;var Se=(i,e,r)=>e in i?Y(i,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):i[e]=r;var Ie=(i,e)=>{for(var r in e)Y(i,r,{get:e[r],enumerable:!0})},ge=(i,e,r,l)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Te(e))!Le.call(i,n)&&n!==r&&Y(i,n,{get:()=>e[n],enumerable:!(l=xe(e,n))||l.enumerable});return i};var N=(i,e,r)=>(r=i!=null?Ce(ve(i)):{},ge(e||!i||!i.__esModule?Y(r,"default",{value:i,enumerable:!0}):r,i)),De=i=>ge(Y({},"__esModule",{value:!0}),i);var re=(i,e,r)=>Se(i,typeof e!="symbol"?e+"":e,r);var Ve={};Ie(Ve,{GrowthRailProvider:()=>be,ReferralDashboard:()=>ie,TriggerButton:()=>ae,useGrowthRail:()=>me});module.exports=De(Ve);var s=N(require("react")),T=require("react-native"),pe=N(require("react-native-play-install-referrer"));var Be="[GrowthRail]",g={log(i,e,r,l){let n=`${Be} [${e}] ${r}`;switch(i){case"error":console.error(n,l||"");break;case"warn":console.warn(n,l||"");break;default:console.log(n,l||"");break}}};var te=class{constructor(e){re(this,"baseUrl");re(this,"projectSecretKey");re(this,"_debug",!1);let r=typeof process<"u"&&process.env?.ENV_BASE_URL;this.baseUrl=r||"https://api.growthrail.dev",this.projectSecretKey=e.projectSecretKey}setDebug(e){this._debug=e}async request(e,r,l){let n={"Content-Type":"application/json","X-GrowthRail-ProjectSecret":this.projectSecretKey,Origin:this.baseUrl},R=Date.now();this._debug&&g.log("api","APIClient",`${r} ${e}`,{method:r,endpoint:e,body:l??null});try{let p=await fetch(`${this.baseUrl}${e}`,{method:r,headers:n,body:l?JSON.stringify(l):void 0}),y=Date.now()-R;if(!p.ok){let c="";try{c=await p.text()}catch{}let k=`GrowthRail API Error ${p.status} (${this.baseUrl}${e}): ${p.statusText} - ${c}`;throw this._debug&&g.log("api","APIClient",`\u2717 ${r} ${e}`,{method:r,endpoint:e,status:p.status,duration:y,error:c}),new Error(k)}return this._debug&&g.log("api","APIClient",`\u2713 ${r} ${e}`,{method:r,endpoint:e,status:p.status,duration:y}),p.json()}catch(p){let y=Date.now()-R;throw this._debug&&g.log("api","APIClient",`\u2717 ${r} ${e} \u2014 Network error`,{method:r,endpoint:e,duration:y,error:String(p)}),console.error("GrowthRail SDK Error:",p),p}}async getNewUserExperience(){return this.request("/api/v1/sdk/new-user-experience","POST")}async initAppUser(e){return this.request("/api/v1/sdk/init-app-user","POST",{clientProvidedId:e})}async trackReferral(e,r){return this.request("/api/v1/sdk/track-referral","POST",{referralCode:e,rewardEventName:r})}async trackRewardEvent(e,r,l){return this.request("/api/v1/sdk/track-reward-event","POST",{refereeId:e,referralTrackingId:r,eventName:l})}async checkDeferredDeepLink(e){return this.request("/api/v1/sdk/match-link","POST",{fingerprint:e})}};var X=N(require("@react-native-async-storage/async-storage")),oe={TRACKED_REFERRAL:"growth-rail-tracked-referral",IS_FIRST_LAUNCH:"growth-rail-is-first-launch"},B=class{static async setTrackedReferral(e){await X.default.setItem(oe.TRACKED_REFERRAL,e)}static async getTrackedReferral(){return await X.default.getItem(oe.TRACKED_REFERRAL)}static async isFirstLaunch(){return await X.default.getItem(oe.IS_FIRST_LAUNCH)===null?(await X.default.setItem(oe.IS_FIRST_LAUNCH,"false"),!0):!1}};var o=N(require("react")),t=require("react-native");var{width:We,height:ue}=t.Dimensions.get("window"),ie=({visible:i,options:e,onClose:r})=>{let l=ne(),[n,R]=(0,o.useState)(null),[p,y]=(0,o.useState)(!1),[c,k]=(0,o.useState)(!1),h=(0,o.useRef)(new t.Animated.Value(0)).current,O=(0,o.useRef)(new t.Animated.Value(0)).current,D=(0,t.useColorScheme)(),v=(e?.appearance||D||"light")==="dark",_=e?.title||"Invite Friends & Earn",V=e?.theme?.primaryColor||"#2563eb",E=(e?.componentType||"modal")==="drawer",G=e?.position||"bottom-right",d={background:v?"#111827":"#ffffff",text:v?"#f9fafb":"#111827",textSecondary:v?"#9ca3af":"#6b7280",border:v?"#374151":"#e5e7eb",inputBg:v?"#1f2937":"#f9fafb",closeBtnBg:v?"#1f2937":"#f3f4f6",closeIcon:v?"#6b7280":"#9ca3af",drawerHandle:v?"#4b5563":"#e5e7eb",overlay:"#000000",overlayOpacity:.5};(0,o.useEffect)(()=>{i?(n||Z(),t.Animated.parallel([t.Animated.timing(O,{toValue:1,duration:300,useNativeDriver:!0}),t.Animated.spring(h,{toValue:1,useNativeDriver:!0,tension:50,friction:8})]).start()):(h.setValue(0),O.setValue(0))},[i]);let $=()=>{t.Animated.parallel([t.Animated.timing(O,{toValue:0,duration:250,useNativeDriver:!0}),t.Animated.timing(h,{toValue:0,duration:250,useNativeDriver:!0})]).start(()=>{r()})},Z=async()=>{y(!0);try{if(l.isUserReady){let A=await l.getReferralLink();R(A||null)}}catch(A){console.error("GrowthRail: Failed to load referral link",A)}finally{y(!1)}},se=()=>{n&&(t.Clipboard.setString(n),k(!0),setTimeout(()=>k(!1),2e3))},z=A=>{if(!n)return;let U="",F=encodeURIComponent(n),W=encodeURIComponent("Check this out!");switch(A){case"twitter":U=`https://twitter.com/intent/tweet?url=${F}&text=${W}`;break;case"facebook":U=`https://www.facebook.com/sharer/sharer.php?u=${F}`;break;case"linkedin":U=`https://www.linkedin.com/sharing/share-offsite/?url=${F}`;break;case"whatsapp":U=`whatsapp://send?text=${W}%20${F}`;break;case"email":U=`mailto:?subject=Check this out&body=${W}%20${F}`;break}U&&t.Linking.openURL(U).catch(()=>{})},ee=()=>d.overlay,P=[];E?P=[{translateY:h.interpolate({inputRange:[0,1],outputRange:[ue,0]})}]:P=[{scale:h.interpolate({inputRange:[0,1],outputRange:[.9,1]})},{translateY:h.interpolate({inputRange:[0,1],outputRange:[20,0]})}];let le=G.includes("top"),H=G.includes("right"),ye=G.includes("left"),K=E?{position:"absolute",bottom:0,left:0,right:0,width:"100%",maxHeight:"90%"}:{};return o.default.createElement(t.Modal,{visible:i,transparent:!0,animationType:"none",onRequestClose:$},o.default.createElement(t.View,{style:a.fullScreen},o.default.createElement(t.Animated.View,{style:[a.overlay,{backgroundColor:ee(),opacity:O.interpolate({inputRange:[0,1],outputRange:[0,d.overlayOpacity]})}]},o.default.createElement(t.TouchableOpacity,{style:a.fullScreen,activeOpacity:1,onPress:$})),o.default.createElement(t.Animated.View,{style:[E?K:a.centeredModalContainer,{backgroundColor:d.background,transform:P},E&&{borderTopLeftRadius:24,borderTopRightRadius:24,borderBottomLeftRadius:0,borderBottomRightRadius:0},!E&&{borderRadius:24,opacity:h,borderColor:d.border,borderWidth:v?1:0}]},o.default.createElement(t.View,{style:a.contentWrapper},E&&o.default.createElement(t.View,{style:[a.drawerHandle,{backgroundColor:d.drawerHandle}]}),o.default.createElement(t.TouchableOpacity,{style:[a.closeBtn,{backgroundColor:d.closeBtnBg}],onPress:$},o.default.createElement(t.Text,{style:[a.closeIcon,{color:d.closeIcon}]},"\u2715")),o.default.createElement(t.ScrollView,{contentContainerStyle:a.scrollContent,showsVerticalScrollIndicator:!1},o.default.createElement(t.View,{style:a.header},o.default.createElement(t.View,{style:a.iconLgContainer},o.default.createElement(t.View,{style:a.bowContainerLg},o.default.createElement(t.View,{style:[a.bowLoopLg,a.bowLeftLg,{borderColor:V}]}),o.default.createElement(t.View,{style:[a.bowLoopLg,a.bowRightLg,{borderColor:V}]})),o.default.createElement(t.View,{style:[a.giftLidLg,{backgroundColor:V}]}),o.default.createElement(t.View,{style:[a.giftBodyLg,{borderColor:V}]},o.default.createElement(t.View,{style:[a.ribbonVerticalLg,{backgroundColor:"#fff",opacity:.3}]}))),o.default.createElement(t.Text,{style:[a.title,{color:d.text}]},_),o.default.createElement(t.Text,{style:[a.subtitle,{color:d.textSecondary}]},e?.description||"Share your unique link and earn rewards for every friend who signs up.")),l.isUserReady?p?o.default.createElement(t.ActivityIndicator,{size:"large",color:V,style:a.loader}):o.default.createElement(t.View,{style:a.mainContent},o.default.createElement(t.Text,{style:[a.label,{color:d.textSecondary}]},"YOUR UNIQUE LINK"),o.default.createElement(t.View,{style:[a.inputGroup,{backgroundColor:d.inputBg,borderColor:d.border}]},o.default.createElement(t.Text,{numberOfLines:1,style:[a.input,{color:d.text}]},n||"Initializing..."),o.default.createElement(t.TouchableOpacity,{style:[a.copyBtn,{backgroundColor:c?"#10b981":V}],onPress:se},o.default.createElement(t.Text,{style:a.copyBtnText},c?"Copied!":"Copy"))),o.default.createElement(t.View,{style:a.shareLabelContainer},o.default.createElement(t.View,{style:[a.divider,{backgroundColor:d.border}]}),o.default.createElement(t.Text,{style:[a.shareLabel,{color:d.textSecondary}]},"Share via"),o.default.createElement(t.View,{style:[a.divider,{backgroundColor:d.border}]})),o.default.createElement(t.View,{style:a.socialContainer},o.default.createElement(J,{platform:"twitter",color:v?"#FFFFFF":"#000000",onPress:()=>z("twitter"),icon:"\u{1D54F}",borderColor:d.border,bgColor:d.background}),o.default.createElement(J,{platform:"facebook",color:"#1877F2",onPress:()=>z("facebook"),icon:"f",borderColor:d.border,bgColor:d.background}),o.default.createElement(J,{platform:"linkedin",color:"#0A66C2",onPress:()=>z("linkedin"),icon:"in",borderColor:d.border,bgColor:d.background}),o.default.createElement(J,{platform:"whatsapp",color:"#25D366",onPress:()=>z("whatsapp"),icon:"W",borderColor:d.border,bgColor:d.background}),o.default.createElement(J,{platform:"email",color:d.textSecondary,onPress:()=>z("email"),icon:"\u2709",borderColor:d.border,bgColor:d.background}))):o.default.createElement(t.View,{style:[a.loadingBox,{backgroundColor:d.inputBg,borderColor:d.border}]},o.default.createElement(t.Text,{style:{color:d.textSecondary,textAlign:"center"}},"Please log in to view your referral dashboard.")),o.default.createElement(t.View,{style:a.footer},o.default.createElement(t.Text,{style:[a.poweredBy,{color:d.textSecondary}]},"Powered by ",o.default.createElement(t.Text,{style:[a.brand,{color:V}],onPress:()=>t.Linking.openURL("https://growthrail.com")},"Growth Rail"))))))))},J=({color:i,onPress:e,icon:r,borderColor:l,bgColor:n})=>o.default.createElement(t.TouchableOpacity,{style:[a.socialBtn,{borderColor:l,backgroundColor:n}],onPress:e},o.default.createElement(t.Text,{style:[a.socialIcon,{color:i}]},r)),a=t.StyleSheet.create({fullScreen:{flex:1},overlay:{...t.StyleSheet.absoluteFillObject},centeredModalContainer:{width:"90%",maxWidth:400,alignSelf:"center",marginTop:ue*.15,overflow:"hidden",shadowColor:"#000",shadowOffset:{width:0,height:20},shadowOpacity:.25,shadowRadius:30,elevation:20},contentWrapper:{paddingTop:t.Platform.OS==="ios"?20:0},drawerHandle:{width:40,height:4,backgroundColor:"#e5e7eb",borderRadius:2,alignSelf:"center",marginTop:12},scrollContent:{padding:32,alignItems:"center"},closeBtn:{position:"absolute",top:20,right:20,zIndex:10,width:32,height:32,borderRadius:16,backgroundColor:"#f3f4f6",justifyContent:"center",alignItems:"center"},closeIcon:{fontSize:14,color:"#9ca3af"},header:{alignItems:"center",marginBottom:28,width:"100%"},socialIcon:{fontSize:18,fontWeight:"bold"},title:{fontSize:22,fontWeight:"700",letterSpacing:-.5,marginBottom:8,textAlign:"center"},subtitle:{fontSize:14,lineHeight:20,textAlign:"center",paddingHorizontal:10},loadingBox:{padding:16,backgroundColor:"#f9fafb",borderRadius:12,width:"100%",alignItems:"center",borderWidth:1,borderColor:"#e5e7eb",marginTop:20},loader:{marginVertical:20},mainContent:{width:"100%"},label:{fontSize:12,fontWeight:"600",color:"#6b7280",marginBottom:8,letterSpacing:.5},inputGroup:{flexDirection:"row",alignItems:"center",backgroundColor:"#f9fafb",borderWidth:1,borderColor:"#e5e7eb",borderRadius:12,padding:6,marginBottom:24},input:{flex:1,paddingHorizontal:12,fontSize:14,color:"#111827",fontFamily:t.Platform.OS==="ios"?"Menlo":"monospace"},copyBtn:{paddingVertical:8,paddingHorizontal:16,borderRadius:8,justifyContent:"center",alignItems:"center"},copyBtnText:{color:"#fff",fontSize:13,fontWeight:"600"},shareLabelContainer:{flexDirection:"row",alignItems:"center",marginBottom:16,marginTop:8},divider:{flex:1,height:1,backgroundColor:"#e5e7eb"},shareLabel:{marginHorizontal:12,fontSize:13,fontWeight:"500",color:"#6b7280"},socialContainer:{flexDirection:"row",justifyContent:"center",gap:12},socialBtn:{width:44,height:44,borderRadius:22,backgroundColor:"#fff",borderWidth:1,justifyContent:"center",alignItems:"center"},iconLgContainer:{width:60,height:60,justifyContent:"center",alignItems:"center",marginBottom:16},bowContainerLg:{flexDirection:"row",position:"absolute",top:2,zIndex:2},bowLoopLg:{width:20,height:16,borderWidth:3,borderColor:"#e5e7eb",borderRadius:10},bowLeftLg:{marginRight:-2,transform:[{rotate:"-15deg"}]},bowRightLg:{marginLeft:-2,transform:[{rotate:"15deg"}]},giftLidLg:{width:44,height:10,backgroundColor:"#f3f4f6",borderRadius:2,marginTop:12,zIndex:3},giftBodyLg:{width:36,height:24,borderWidth:3,borderTopWidth:0,borderBottomLeftRadius:4,borderBottomRightRadius:4,justifyContent:"center",alignItems:"center",marginTop:-2},ribbonVerticalLg:{width:4,height:"100%",opacity:.1},footer:{marginTop:32,alignItems:"center"},poweredBy:{fontSize:11,color:"#9ca3af"},brand:{fontWeight:"600",textDecorationLine:"underline"}});var x=N(require("react")),b=require("react-native"),ae=({onPress:i,options:e})=>{let r=e?.modal?.theme?.primaryColor||"#2563eb",l=e?.trigger?.position||"bottom-right",R=(e?.trigger?.displayMode||"floating")==="edge",p=l.includes("right"),y=l.includes("top"),c=(0,x.useRef)(new b.Animated.Value(-1)).current;(0,x.useEffect)(()=>{let D=()=>{c.setValue(-1),b.Animated.timing(c,{toValue:2,duration:3e3,easing:b.Easing.linear,useNativeDriver:!0}).start(()=>{setTimeout(D,1e3)})};D()},[]);let k=c.interpolate({inputRange:[-1,2],outputRange:R?[-50,100]:[-60,120]}),h={"bottom-right":{bottom:100,right:0},"bottom-left":{bottom:100,left:0},"top-right":{top:100,right:0},"top-left":{top:100,left:0}};R||(h["bottom-right"]={bottom:30,right:20},h["bottom-left"]={bottom:30,left:20},h["top-right"]={top:60,right:20},h["top-left"]={top:60,left:20});let O=()=>x.default.createElement(b.View,{style:C.iconContainer},x.default.createElement(b.View,{style:C.bowContainer},x.default.createElement(b.View,{style:[C.bowLoop,C.bowLeft]}),x.default.createElement(b.View,{style:[C.bowLoop,C.bowRight]})),x.default.createElement(b.View,{style:C.giftLid}),x.default.createElement(b.View,{style:C.giftBody},x.default.createElement(b.View,{style:C.ribbonVertical})));return x.default.createElement(b.TouchableOpacity,{style:[R?C.edgeButton:C.floatingButton,{backgroundColor:r},h[l],R&&(p?C.edgeRight:C.edgeLeft)],onPress:i,activeOpacity:.9},x.default.createElement(b.View,{style:C.content},O()),x.default.createElement(b.Animated.View,{style:[C.shimmer,{transform:[{translateX:k},{skewX:"-15deg"}]}]}))},C=b.StyleSheet.create({floatingButton:{position:"absolute",width:60,height:60,borderRadius:30,justifyContent:"center",alignItems:"center",overflow:"hidden",shadowColor:"#000",shadowOffset:{width:0,height:8},shadowOpacity:.2,shadowRadius:12,elevation:8,zIndex:2147483646},edgeButton:{position:"absolute",width:50,height:50,justifyContent:"center",alignItems:"center",overflow:"hidden",shadowColor:"#000",shadowOffset:{width:0,height:4},shadowOpacity:.1,shadowRadius:8,elevation:4,zIndex:2147483646},edgeRight:{borderTopLeftRadius:8,borderBottomLeftRadius:8,paddingLeft:4},edgeLeft:{borderTopRightRadius:8,borderBottomRightRadius:8,paddingRight:4},content:{justifyContent:"center",alignItems:"center"},iconContainer:{width:28,height:28,justifyContent:"center",alignItems:"center"},bowContainer:{flexDirection:"row",position:"absolute",top:0,zIndex:2},bowLoop:{width:10,height:8,borderWidth:2,borderColor:"#fff",borderRadius:5},bowLeft:{marginRight:-1,transform:[{rotate:"-15deg"}]},bowRight:{marginLeft:-1,transform:[{rotate:"15deg"}]},giftLid:{width:22,height:5,backgroundColor:"#fff",borderRadius:1,marginTop:6,zIndex:3},giftBody:{width:18,height:12,borderWidth:2,borderColor:"#fff",borderTopWidth:0,borderBottomLeftRadius:2,borderBottomRightRadius:2,justifyContent:"center",alignItems:"center",marginTop:-1},ribbonVertical:{width:2,height:"100%",backgroundColor:"#fff",opacity:.8},shimmer:{position:"absolute",top:0,left:0,width:50,height:"100%",backgroundColor:"rgba(255, 255, 255, 0.25)"}});var I=N(require("react")),m=require("react-native"),{width:Oe}=m.Dimensions.get("window"),he=({visible:i,options:e,onClose:r})=>{let l=(0,I.useRef)(new m.Animated.Value(0)).current,[n,R]=(0,I.useState)(i),p=e.position.includes("bottom")?"bottom":"top",y=e.position.includes("left")?"left":e.position.includes("right")?"right":"center";if((0,I.useEffect)(()=>{i?(R(!0),m.Animated.spring(l,{toValue:1,useNativeDriver:!0,tension:50,friction:8}).start()):m.Animated.timing(l,{toValue:0,duration:250,useNativeDriver:!0}).start(()=>{R(!1)})},[i]),!n)return null;let c=l.interpolate({inputRange:[0,1],outputRange:[p==="top"?-100:100,0]}),k=l.interpolate({inputRange:[0,1],outputRange:[0,1]}),h={position:"absolute",[p]:m.Platform.OS==="ios"?60:40,zIndex:9999};return y==="center"?(h.left=20,h.right=20,h.alignItems="center"):h[y]=20,I.default.createElement(m.Animated.View,{style:[h,{transform:[{translateY:c}],opacity:k}]},I.default.createElement(m.View,{style:[Q.banner,{backgroundColor:e.themeColor||"#2563eb"}]},I.default.createElement(m.Text,{style:Q.icon},"\u{1F381}"),I.default.createElement(m.Text,{style:Q.text},e.text),I.default.createElement(m.TouchableOpacity,{onPress:r,style:Q.closeBtn},I.default.createElement(m.Text,{style:Q.closeIcon},"\u2715"))))},Q=m.StyleSheet.create({banner:{flexDirection:"row",alignItems:"center",padding:12,paddingHorizontal:16,borderRadius:12,shadowColor:"#000",shadowOffset:{width:0,height:4},shadowOpacity:.15,shadowRadius:10,elevation:5,maxWidth:Oe-40},icon:{fontSize:18,marginRight:10},text:{color:"#fff",fontSize:14,fontWeight:"600",flex:1},closeBtn:{marginLeft:10,padding:4},closeIcon:{color:"rgba(255, 255, 255, 0.8)",fontSize:14,fontWeight:"bold"}});var we=(0,s.createContext)(void 0),be=({children:i,userId:e,debug:r=!1,...l})=>{let[n,R]=(0,s.useState)(!1),[p,y]=(0,s.useState)(!1),[c,k]=(0,s.useState)(null),h=(0,s.useRef)(new te(l)),O=(0,s.useRef)(!1),D=(0,s.useRef)(null),[de,v]=(0,s.useState)(!1),[_,V]=(0,s.useState)(),[fe,E]=(0,s.useState)(!1),[G,d]=(0,s.useState)(),[$,Z]=(0,s.useState)(!1),[se,z]=(0,s.useState)();(0,s.useEffect)(()=>{h.current.setDebug(r),r&&g.log("info","Provider","Debug mode enabled")},[r]);let ee=(0,s.useCallback)(()=>{let{width:u,height:f}=T.Dimensions.get("window"),w=Intl.DateTimeFormat().resolvedOptions().locale,S=T.PixelRatio.get(),L,M;if(T.Platform.OS==="android"){let ce=T.Platform.constants;L=ce.Model,M=ce.Brand||ce.Manufacturer}return{os:T.Platform.OS,platform:T.Platform.OS,osVersion:String(T.Platform.Version),screenWidth:u,screenHeight:f,timezoneOffsetInMinutes:String(new Date().getTimezoneOffset()),locale:w,language:w,deviceModel:L,deviceBrand:M,pixelRatio:S}},[]),P=(0,s.useCallback)(async(u,f)=>{r&&g.log("info","Referral",`Tracking referral code: ${u}`,{referralCode:u,rewardEventName:f});let w=await h.current.trackReferral(u,f);return await B.setTrackedReferral(w.referralTrackingId),r&&g.log("success","Referral",`Referral tracked \u2192 ${w.referralTrackingId}`,w),w},[r]),le=(0,s.useCallback)(async u=>{try{r&&g.log("info","DeepLink",`Received deep link: ${u}`);let f=u.match(/[?&]referralCode=([^&]+)/);f&&(console.log("GrowthRail: Tracking referral from deep link",f[1]),r&&g.log("info","DeepLink",`Found referral code in deep link: ${f[1]}`),await P(f[1]))}catch(f){console.warn("GrowthRail: Error handling deep link",f),r&&g.log("error","DeepLink","Deep link handling failed",{error:String(f)})}},[P,r]),H=(0,s.useCallback)(async()=>{try{r&&g.log("info","Deferred","Checking deferred deep link via fingerprint");let u=ee(),{referralTrackingId:f}=await h.current.checkDeferredDeepLink(u);f?(console.log("GrowthRail: Found deferred referral via fingerprinting",f),r&&g.log("success","Deferred",`Deferred referral matched \u2192 ${f}`),await B.setTrackedReferral(f)):r&&g.log("info","Deferred","No deferred referral match found")}catch(u){console.warn("GrowthRail: Fingerprint check failed",u),r&&g.log("error","Deferred","Fingerprint check failed",{error:String(u)})}},[ee,r]),ye=(0,s.useCallback)(()=>new Promise(u=>{pe.default.getInstallReferrerInfo(async(f,w)=>{if(!w&&f&&f.installReferrer)try{let L=decodeURIComponent(f.installReferrer).match(/[?&]referralCode=([^&]+)/);if(L){let{referralTrackingId:M}=await P(L[1]);await B.setTrackedReferral(M),console.log("GrowthRail: Tracked referral via Install Referrer")}}catch(S){console.warn("GrowthRail: Failed to process install referrer",S)}else await H();u()})}),[P,H]),K=(0,s.useCallback)(async u=>{if(c?.id===u&&p)return r&&g.log("info","User",`User ${u} already initialized, skipping`),c;r&&g.log("info","User",`Initializing user: ${u}`);let f=(async()=>{try{let w=await h.current.initAppUser(u),S={...w,id:u};return k(S),y(!0),r&&g.log("success","User",`User initialized: ${u}`,{referralCode:w.referralCode,referralLink:w.referralLink}),w.referrerExperience?.trigger?.displayMode!=="none"&&(E(!0),r&&g.log("info","UI","Trigger button shown (server-configured)")),S}catch(w){throw D.current=null,r&&g.log("error","User",`User init failed for ${u}`,{error:String(w)}),w}})();return D.current=f,f},[c,p,r]),A=(0,s.useCallback)(async u=>{r&&g.log("info","Reward",`Tracking reward event: ${u||"(default)"}`);let f=c;!f&&D.current&&(f=await D.current);let w=f?.id||e;if(!w)throw r&&g.log("error","Reward","Cannot track reward \u2014 user not initialized"),new Error("GrowthRail: User must be initialized before tracking a reward event.");let S=await B.getTrackedReferral();if(!S){console.warn("GrowthRail: No referral tracking ID found. Reward event not attributed."),r&&g.log("warn","Reward","No referral tracking ID in storage \u2014 reward not attributed");return}let L=await h.current.trackRewardEvent(w,S,u);return r&&g.log("success","Reward",`Reward event tracked for user ${w}`),L},[c,e,r]),U=(0,s.useCallback)(async()=>await B.getTrackedReferral(),[]),F=(0,s.useCallback)(async()=>{if(c)return c.referralLink;if(D.current)return(await D.current).referralLink},[c]);(0,s.useEffect)(()=>{if(O.current)return;O.current=!0,r&&g.log("info","Provider","SDK initializing\u2026",{platform:T.Platform.OS}),(async()=>{let f=await T.Linking.getInitialURL();r&&g.log("info","DeepLink",`Initial URL: ${f??"(none)"}`),f&&await le(f);let w=T.Linking.addEventListener("url",({url:L})=>le(L)),S=await B.isFirstLaunch();r&&g.log("info","Provider",`First launch: ${S}`),S&&(T.Platform.OS==="android"?await H():await H()),e&&await K(e);try{let L=await h.current.getNewUserExperience(),M=await B.getTrackedReferral();L.banner?.show&&M&&(z(L.banner),Z(!0),r&&g.log("info","UI","Banner shown for new user experience"))}catch(L){r&&g.log("warn","Provider","New user experience fetch failed",{error:String(L)})}return R(!0),r&&g.log("success","Provider","SDK initialization complete \u2713"),()=>w.remove()})()},[]),(0,s.useEffect)(()=>{n&&e&&c?.id!==e&&K(e)},[e,n]);let W={isInitialized:n,isUserReady:p,currentUser:c,referralCode:c?.referralCode,referralLink:c?.referralLink,showDashboard:u=>{V(u),v(!0)},hideDashboard:()=>v(!1),initUser:K,trackReward:A,getReferralTrackingId:U,getReferralLink:F,isDebugEnabled:r};if(!n)return null;let q=c?.referrerExperience,Re={...q?.modal,..._,appearance:_?.appearance||q?.modal?.appearance||l.appearance,theme:{...q?.modal?.theme||{},..._?.theme||{}}},ke={...q,...G,trigger:{...q?.trigger||{},...G?.trigger||{}}};return s.default.createElement(we.Provider,{value:W},i,s.default.createElement(ie,{visible:de,options:Re,onClose:()=>v(!1)}),fe&&s.default.createElement(ae,{options:ke,onPress:()=>W.showDashboard()}),$&&s.default.createElement(he,{visible:$,options:se,onClose:()=>Z(!1)}))},ne=()=>{let i=(0,s.useContext)(we);if(!i)throw new Error("useGrowthRail must be used within a GrowthRailProvider");return i};var j=require("react");var me=()=>{let[i,e]=(0,j.useState)(!1),[r,l]=(0,j.useState)(null),n=ne(),R=(0,j.useCallback)(async y=>{e(!0),l(null);try{return await n.initUser(y)}catch(c){let k=c instanceof Error?c:new Error(String(c));throw l(k),k}finally{e(!1)}},[n]),p=(0,j.useCallback)(async y=>{e(!0),l(null);try{await n.trackReward(y)}catch(c){let k=c instanceof Error?c:new Error(String(c));throw l(k),k}finally{e(!1)}},[n]);return{initAppUser:R,trackRewardEvent:p,showReferralDashboard:n.showDashboard,hideReferralDashboard:n.hideDashboard,getReferralTrackingId:n.getReferralTrackingId,getReferralLink:n.getReferralLink,isLoading:i,isInitialized:n.isInitialized,isUserReady:n.isUserReady,error:r,isDebugEnabled:n.isDebugEnabled}};0&&(module.exports={GrowthRailProvider,ReferralDashboard,TriggerButton,useGrowthRail});
|
|
1
|
+
"use strict";var Te=Object.create;var q=Object.defineProperty;var ve=Object.getOwnPropertyDescriptor;var Le=Object.getOwnPropertyNames;var Se=Object.getPrototypeOf,Ie=Object.prototype.hasOwnProperty;var De=(n,e,r)=>e in n?q(n,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):n[e]=r;var Be=(n,e)=>{for(var r in e)q(n,r,{get:e[r],enumerable:!0})},he=(n,e,r,l)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Le(e))!Ie.call(n,i)&&i!==r&&q(n,i,{get:()=>e[i],enumerable:!(l=ve(e,i))||l.enumerable});return n};var H=(n,e,r)=>(r=n!=null?Te(Se(n)):{},he(e||!n||!n.__esModule?q(r,"default",{value:n,enumerable:!0}):r,n)),Oe=n=>he(q({},"__esModule",{value:!0}),n);var te=(n,e,r)=>De(n,typeof e!="symbol"?e+"":e,r);var Ee={};Be(Ee,{GrowthRailProvider:()=>ye,ReferralDashboard:()=>ne,TriggerButton:()=>se,useGrowthRail:()=>Re});module.exports=Oe(Ee);var a=H(require("react")),L=require("react-native"),be=H(require("react-native-play-install-referrer"));var Ve="[GrowthRail]",g={log(n,e,r,l){let i=`${Ve} [${e}] ${r}`;switch(n){case"error":console.error(i,l||"");break;case"warn":console.warn(i,l||"");break;default:console.log(i,l||"");break}}};var oe=class{constructor(e){te(this,"baseUrl");te(this,"projectSecretKey");te(this,"_debug",!1);let r=typeof process<"u"&&process.env?.ENV_BASE_URL;this.baseUrl=r||"https://api.growthrail.dev",this.projectSecretKey=e.projectSecretKey}setDebug(e){this._debug=e}async request(e,r,l){let i={"Content-Type":"application/json","X-GrowthRail-ProjectSecret":this.projectSecretKey,Origin:this.baseUrl},R=Date.now();this._debug&&g.log("api","APIClient",`${r} ${e}`,{method:r,endpoint:e,body:l??null});try{let p=await fetch(`${this.baseUrl}${e}`,{method:r,headers:i,body:l?JSON.stringify(l):void 0}),k=Date.now()-R;if(!p.ok){let c="";try{c=await p.text()}catch{}let C=`GrowthRail API Error ${p.status} (${this.baseUrl}${e}): ${p.statusText} - ${c}`;throw this._debug&&g.log("api","APIClient",`\u2717 ${r} ${e}`,{method:r,endpoint:e,status:p.status,duration:k,error:c}),new Error(C)}return this._debug&&g.log("api","APIClient",`\u2713 ${r} ${e}`,{method:r,endpoint:e,status:p.status,duration:k}),p.json()}catch(p){let k=Date.now()-R;throw this._debug&&g.log("api","APIClient",`\u2717 ${r} ${e} \u2014 Network error`,{method:r,endpoint:e,duration:k,error:String(p)}),console.error("GrowthRail SDK Error:",p),p}}async getNewUserExperience(){return this.request("/api/v1/sdk/new-user-experience","POST")}async initAppUser(e){return this.request("/api/v1/sdk/init-app-user","POST",{clientProvidedId:e})}async trackReferral(e,r){return this.request("/api/v1/sdk/track-referral","POST",{referralCode:e,rewardEventName:r})}async trackRewardEvent(e,r,l){return this.request("/api/v1/sdk/track-reward-event","POST",{refereeId:e,referralTrackingId:r,eventName:l})}async checkDeferredDeepLink(e){return this.request("/api/v1/sdk/match-link","POST",{fingerprint:e})}};var Y=H(require("@react-native-async-storage/async-storage")),ie={TRACKED_REFERRAL:"growth-rail-tracked-referral",IS_FIRST_LAUNCH:"growth-rail-is-first-launch"},B=class{static async setTrackedReferral(e){await Y.default.setItem(ie.TRACKED_REFERRAL,e)}static async getTrackedReferral(){return await Y.default.getItem(ie.TRACKED_REFERRAL)}static async isFirstLaunch(){return await Y.default.getItem(ie.IS_FIRST_LAUNCH)===null?(await Y.default.setItem(ie.IS_FIRST_LAUNCH,"false"),!0):!1}};var o=H(require("react")),t=require("react-native");var{width:Ne,height:pe}=t.Dimensions.get("window"),ne=({visible:n,options:e,onClose:r})=>{let l=ae(),[i,R]=(0,o.useState)(null),[p,k]=(0,o.useState)(!1),[c,C]=(0,o.useState)(!1),h=(0,o.useRef)(new t.Animated.Value(0)).current,O=(0,o.useRef)(new t.Animated.Value(0)).current,I=(0,t.useColorScheme)(),v=(e?.appearance||I||"light")==="dark",N=e?.title||"Invite Friends & Earn",V=e?.theme?.primaryColor||"#2563eb",E=(e?.componentType||"modal")==="drawer",F=e?.position||"bottom-right",f={background:v?"#111827":"#ffffff",text:v?"#f9fafb":"#111827",textSecondary:v?"#9ca3af":"#6b7280",border:v?"#374151":"#e5e7eb",inputBg:v?"#1f2937":"#f9fafb",closeBtnBg:v?"#1f2937":"#f3f4f6",closeIcon:v?"#6b7280":"#9ca3af",drawerHandle:v?"#4b5563":"#e5e7eb",overlay:"#000000",overlayOpacity:.5};(0,o.useEffect)(()=>{n?(i||Q(),t.Animated.parallel([t.Animated.timing(O,{toValue:1,duration:300,useNativeDriver:!0}),t.Animated.spring(h,{toValue:1,useNativeDriver:!0,tension:50,friction:8})]).start()):(h.setValue(0),O.setValue(0))},[n]);let j=()=>{t.Animated.parallel([t.Animated.timing(O,{toValue:0,duration:250,useNativeDriver:!0}),t.Animated.timing(h,{toValue:0,duration:250,useNativeDriver:!0})]).start(()=>{r()})},Q=async()=>{k(!0);try{if(l.isUserReady){let P=await l.getReferralLink();R(P||null)}}catch(P){console.error("GrowthRail: Failed to load referral link",P)}finally{k(!1)}},le=()=>{i&&(t.Clipboard.setString(i),C(!0),setTimeout(()=>C(!1),2e3))},$=P=>{if(!i)return;let D="",A=encodeURIComponent(i),_=encodeURIComponent("Check this out!");switch(P){case"twitter":D=`https://twitter.com/intent/tweet?url=${A}&text=${_}`;break;case"facebook":D=`https://www.facebook.com/sharer/sharer.php?u=${A}`;break;case"linkedin":D=`https://www.linkedin.com/sharing/share-offsite/?url=${A}`;break;case"whatsapp":D=`whatsapp://send?text=${_}%20${A}`;break;case"email":D=`mailto:?subject=Check this out&body=${_}%20${A}`;break}D&&t.Linking.openURL(D).catch(()=>{})},Z=()=>f.overlay,z=[];E?z=[{translateY:h.interpolate({inputRange:[0,1],outputRange:[pe,0]})}]:z=[{scale:h.interpolate({inputRange:[0,1],outputRange:[.9,1]})},{translateY:h.interpolate({inputRange:[0,1],outputRange:[20,0]})}];let ee=F.includes("top"),K=F.includes("right"),ke=F.includes("left"),M=E?{position:"absolute",bottom:0,left:0,right:0,width:"100%",maxHeight:"90%"}:{};return o.default.createElement(t.Modal,{visible:n,transparent:!0,animationType:"none",onRequestClose:j},o.default.createElement(t.View,{style:s.fullScreen},o.default.createElement(t.Animated.View,{style:[s.overlay,{backgroundColor:Z(),opacity:O.interpolate({inputRange:[0,1],outputRange:[0,f.overlayOpacity]})}]},o.default.createElement(t.TouchableOpacity,{style:s.fullScreen,activeOpacity:1,onPress:j})),o.default.createElement(t.Animated.View,{style:[E?M:s.centeredModalContainer,{backgroundColor:f.background,transform:z},E&&{borderTopLeftRadius:24,borderTopRightRadius:24,borderBottomLeftRadius:0,borderBottomRightRadius:0},!E&&{borderRadius:24,opacity:h,borderColor:f.border,borderWidth:v?1:0}]},o.default.createElement(t.View,{style:s.contentWrapper},E&&o.default.createElement(t.View,{style:[s.drawerHandle,{backgroundColor:f.drawerHandle}]}),o.default.createElement(t.TouchableOpacity,{style:[s.closeBtn,{backgroundColor:f.closeBtnBg}],onPress:j},o.default.createElement(t.Text,{style:[s.closeIcon,{color:f.closeIcon}]},"\u2715")),o.default.createElement(t.ScrollView,{contentContainerStyle:s.scrollContent,showsVerticalScrollIndicator:!1},o.default.createElement(t.View,{style:s.header},o.default.createElement(t.View,{style:s.iconLgContainer},o.default.createElement(t.View,{style:s.bowContainerLg},o.default.createElement(t.View,{style:[s.bowLoopLg,s.bowLeftLg,{borderColor:V}]}),o.default.createElement(t.View,{style:[s.bowLoopLg,s.bowRightLg,{borderColor:V}]})),o.default.createElement(t.View,{style:[s.giftLidLg,{backgroundColor:V}]}),o.default.createElement(t.View,{style:[s.giftBodyLg,{borderColor:V}]},o.default.createElement(t.View,{style:[s.ribbonVerticalLg,{backgroundColor:"#fff",opacity:.3}]}))),o.default.createElement(t.Text,{style:[s.title,{color:f.text}]},N),o.default.createElement(t.Text,{style:[s.subtitle,{color:f.textSecondary}]},e?.description||"Share your unique link and earn rewards for every friend who signs up.")),l.isUserReady?p?o.default.createElement(t.ActivityIndicator,{size:"large",color:V,style:s.loader}):o.default.createElement(t.View,{style:s.mainContent},o.default.createElement(t.Text,{style:[s.label,{color:f.textSecondary}]},"YOUR UNIQUE LINK"),o.default.createElement(t.View,{style:[s.inputGroup,{backgroundColor:f.inputBg,borderColor:f.border}]},o.default.createElement(t.Text,{numberOfLines:1,style:[s.input,{color:f.text}]},i||"Initializing..."),o.default.createElement(t.TouchableOpacity,{style:[s.copyBtn,{backgroundColor:c?"#10b981":V}],onPress:le},o.default.createElement(t.Text,{style:s.copyBtnText},c?"Copied!":"Copy"))),o.default.createElement(t.View,{style:s.shareLabelContainer},o.default.createElement(t.View,{style:[s.divider,{backgroundColor:f.border}]}),o.default.createElement(t.Text,{style:[s.shareLabel,{color:f.textSecondary}]},"Share via"),o.default.createElement(t.View,{style:[s.divider,{backgroundColor:f.border}]})),o.default.createElement(t.View,{style:s.socialContainer},o.default.createElement(X,{platform:"twitter",color:v?"#FFFFFF":"#000000",onPress:()=>$("twitter"),icon:"\u{1D54F}",borderColor:f.border,bgColor:f.background}),o.default.createElement(X,{platform:"facebook",color:"#1877F2",onPress:()=>$("facebook"),icon:"f",borderColor:f.border,bgColor:f.background}),o.default.createElement(X,{platform:"linkedin",color:"#0A66C2",onPress:()=>$("linkedin"),icon:"in",borderColor:f.border,bgColor:f.background}),o.default.createElement(X,{platform:"whatsapp",color:"#25D366",onPress:()=>$("whatsapp"),icon:"W",borderColor:f.border,bgColor:f.background}),o.default.createElement(X,{platform:"email",color:f.textSecondary,onPress:()=>$("email"),icon:"\u2709",borderColor:f.border,bgColor:f.background}))):o.default.createElement(t.View,{style:[s.loadingBox,{backgroundColor:f.inputBg,borderColor:f.border}]},o.default.createElement(t.Text,{style:{color:f.textSecondary,textAlign:"center"}},"Please log in to view your referral dashboard.")),o.default.createElement(t.View,{style:s.footer},o.default.createElement(t.Text,{style:[s.poweredBy,{color:f.textSecondary}]},"Powered by ",o.default.createElement(t.Text,{style:[s.brand,{color:V}],onPress:()=>t.Linking.openURL("https://growthrail.com")},"Growth Rail"))))))))},X=({color:n,onPress:e,icon:r,borderColor:l,bgColor:i})=>o.default.createElement(t.TouchableOpacity,{style:[s.socialBtn,{borderColor:l,backgroundColor:i}],onPress:e},o.default.createElement(t.Text,{style:[s.socialIcon,{color:n}]},r)),s=t.StyleSheet.create({fullScreen:{flex:1},overlay:{...t.StyleSheet.absoluteFillObject},centeredModalContainer:{width:"90%",maxWidth:400,alignSelf:"center",marginTop:pe*.15,overflow:"hidden",shadowColor:"#000",shadowOffset:{width:0,height:20},shadowOpacity:.25,shadowRadius:30,elevation:20},contentWrapper:{paddingTop:t.Platform.OS==="ios"?20:0},drawerHandle:{width:40,height:4,backgroundColor:"#e5e7eb",borderRadius:2,alignSelf:"center",marginTop:12},scrollContent:{padding:32,alignItems:"center"},closeBtn:{position:"absolute",top:20,right:20,zIndex:10,width:32,height:32,borderRadius:16,backgroundColor:"#f3f4f6",justifyContent:"center",alignItems:"center"},closeIcon:{fontSize:14,color:"#9ca3af"},header:{alignItems:"center",marginBottom:28,width:"100%"},socialIcon:{fontSize:18,fontWeight:"bold"},title:{fontSize:22,fontWeight:"700",letterSpacing:-.5,marginBottom:8,textAlign:"center"},subtitle:{fontSize:14,lineHeight:20,textAlign:"center",paddingHorizontal:10},loadingBox:{padding:16,backgroundColor:"#f9fafb",borderRadius:12,width:"100%",alignItems:"center",borderWidth:1,borderColor:"#e5e7eb",marginTop:20},loader:{marginVertical:20},mainContent:{width:"100%"},label:{fontSize:12,fontWeight:"600",color:"#6b7280",marginBottom:8,letterSpacing:.5},inputGroup:{flexDirection:"row",alignItems:"center",backgroundColor:"#f9fafb",borderWidth:1,borderColor:"#e5e7eb",borderRadius:12,padding:6,marginBottom:24},input:{flex:1,paddingHorizontal:12,fontSize:14,color:"#111827",fontFamily:t.Platform.OS==="ios"?"Menlo":"monospace"},copyBtn:{paddingVertical:8,paddingHorizontal:16,borderRadius:8,justifyContent:"center",alignItems:"center"},copyBtnText:{color:"#fff",fontSize:13,fontWeight:"600"},shareLabelContainer:{flexDirection:"row",alignItems:"center",marginBottom:16,marginTop:8},divider:{flex:1,height:1,backgroundColor:"#e5e7eb"},shareLabel:{marginHorizontal:12,fontSize:13,fontWeight:"500",color:"#6b7280"},socialContainer:{flexDirection:"row",justifyContent:"center",gap:12},socialBtn:{width:44,height:44,borderRadius:22,backgroundColor:"#fff",borderWidth:1,justifyContent:"center",alignItems:"center"},iconLgContainer:{width:60,height:60,justifyContent:"center",alignItems:"center",marginBottom:16},bowContainerLg:{flexDirection:"row",position:"absolute",top:2,zIndex:2},bowLoopLg:{width:20,height:16,borderWidth:3,borderColor:"#e5e7eb",borderRadius:10},bowLeftLg:{marginRight:-2,transform:[{rotate:"-15deg"}]},bowRightLg:{marginLeft:-2,transform:[{rotate:"15deg"}]},giftLidLg:{width:44,height:10,backgroundColor:"#f3f4f6",borderRadius:2,marginTop:12,zIndex:3},giftBodyLg:{width:36,height:24,borderWidth:3,borderTopWidth:0,borderBottomLeftRadius:4,borderBottomRightRadius:4,justifyContent:"center",alignItems:"center",marginTop:-2},ribbonVerticalLg:{width:4,height:"100%",opacity:.1},footer:{marginTop:32,alignItems:"center"},poweredBy:{fontSize:11,color:"#9ca3af"},brand:{fontWeight:"600",textDecorationLine:"underline"}});var T=H(require("react")),m=require("react-native"),se=({onPress:n,options:e})=>{let r=e?.modal?.theme?.primaryColor||"#2563eb",l=e?.trigger?.position||"bottom-right",R=(e?.trigger?.displayMode||"floating")==="edge",p=l.includes("right"),k=l.includes("top"),c=(0,T.useRef)(new m.Animated.Value(-1)).current;(0,T.useEffect)(()=>{let I=()=>{c.setValue(-1),m.Animated.timing(c,{toValue:2,duration:3e3,easing:m.Easing.linear,useNativeDriver:!0}).start(()=>{setTimeout(I,1e3)})};I()},[]);let C=c.interpolate({inputRange:[-1,2],outputRange:R?[-50,100]:[-60,120]}),h={"bottom-right":{bottom:100,right:0},"bottom-left":{bottom:100,left:0},"top-right":{top:100,right:0},"top-left":{top:100,left:0}};R||(h["bottom-right"]={bottom:30,right:20},h["bottom-left"]={bottom:30,left:20},h["top-right"]={top:60,right:20},h["top-left"]={top:60,left:20});let O=()=>T.default.createElement(m.View,{style:x.iconContainer},T.default.createElement(m.View,{style:x.bowContainer},T.default.createElement(m.View,{style:[x.bowLoop,x.bowLeft]}),T.default.createElement(m.View,{style:[x.bowLoop,x.bowRight]})),T.default.createElement(m.View,{style:x.giftLid}),T.default.createElement(m.View,{style:x.giftBody},T.default.createElement(m.View,{style:x.ribbonVertical})));return T.default.createElement(m.TouchableOpacity,{style:[R?x.edgeButton:x.floatingButton,{backgroundColor:r},h[l],R&&(p?x.edgeRight:x.edgeLeft)],onPress:n,activeOpacity:.9},T.default.createElement(m.View,{style:x.content},O()),T.default.createElement(m.Animated.View,{style:[x.shimmer,{transform:[{translateX:C},{skewX:"-15deg"}]}]}))},x=m.StyleSheet.create({floatingButton:{position:"absolute",width:60,height:60,borderRadius:30,justifyContent:"center",alignItems:"center",overflow:"hidden",shadowColor:"#000",shadowOffset:{width:0,height:8},shadowOpacity:.2,shadowRadius:12,elevation:8,zIndex:2147483646},edgeButton:{position:"absolute",width:50,height:50,justifyContent:"center",alignItems:"center",overflow:"hidden",shadowColor:"#000",shadowOffset:{width:0,height:4},shadowOpacity:.1,shadowRadius:8,elevation:4,zIndex:2147483646},edgeRight:{borderTopLeftRadius:8,borderBottomLeftRadius:8,paddingLeft:4},edgeLeft:{borderTopRightRadius:8,borderBottomRightRadius:8,paddingRight:4},content:{justifyContent:"center",alignItems:"center"},iconContainer:{width:28,height:28,justifyContent:"center",alignItems:"center"},bowContainer:{flexDirection:"row",position:"absolute",top:0,zIndex:2},bowLoop:{width:10,height:8,borderWidth:2,borderColor:"#fff",borderRadius:5},bowLeft:{marginRight:-1,transform:[{rotate:"-15deg"}]},bowRight:{marginLeft:-1,transform:[{rotate:"15deg"}]},giftLid:{width:22,height:5,backgroundColor:"#fff",borderRadius:1,marginTop:6,zIndex:3},giftBody:{width:18,height:12,borderWidth:2,borderColor:"#fff",borderTopWidth:0,borderBottomLeftRadius:2,borderBottomRightRadius:2,justifyContent:"center",alignItems:"center",marginTop:-1},ribbonVertical:{width:2,height:"100%",backgroundColor:"#fff",opacity:.8},shimmer:{position:"absolute",top:0,left:0,width:50,height:"100%",backgroundColor:"rgba(255, 255, 255, 0.25)"}});var S=H(require("react")),y=require("react-native"),{width:Ue}=y.Dimensions.get("window"),we=({visible:n,options:e,onClose:r})=>{let l=(0,S.useRef)(new y.Animated.Value(0)).current,[i,R]=(0,S.useState)(n),p=e.position.includes("bottom")?"bottom":"top",k=e.position.includes("left")?"left":e.position.includes("right")?"right":"center";if((0,S.useEffect)(()=>{n?(R(!0),y.Animated.spring(l,{toValue:1,useNativeDriver:!0,tension:50,friction:8}).start()):y.Animated.timing(l,{toValue:0,duration:250,useNativeDriver:!0}).start(()=>{R(!1)})},[n]),!i)return null;let c=l.interpolate({inputRange:[0,1],outputRange:[p==="top"?-100:100,0]}),C=l.interpolate({inputRange:[0,1],outputRange:[0,1]}),h={position:"absolute",[p]:y.Platform.OS==="ios"?60:40,zIndex:9999};return k==="center"?(h.left=20,h.right=20,h.alignItems="center"):h[k]=20,S.default.createElement(y.Animated.View,{style:[h,{transform:[{translateY:c}],opacity:C}]},S.default.createElement(y.View,{style:[J.banner,{backgroundColor:e.themeColor||"#2563eb"}]},S.default.createElement(y.Text,{style:J.icon},"\u{1F381}"),S.default.createElement(y.Text,{style:J.text},e.text),S.default.createElement(y.TouchableOpacity,{onPress:r,style:J.closeBtn},S.default.createElement(y.Text,{style:J.closeIcon},"\u2715"))))},J=y.StyleSheet.create({banner:{flexDirection:"row",alignItems:"center",padding:12,paddingHorizontal:16,borderRadius:12,shadowColor:"#000",shadowOffset:{width:0,height:4},shadowOpacity:.15,shadowRadius:10,elevation:5,maxWidth:Ue-40},icon:{fontSize:18,marginRight:10},text:{color:"#fff",fontSize:14,fontWeight:"600",flex:1},closeBtn:{marginLeft:10,padding:4},closeIcon:{color:"rgba(255, 255, 255, 0.8)",fontSize:14,fontWeight:"bold"}});var me=(0,a.createContext)(void 0),ye=({children:n,userId:e,debug:r=!1,...l})=>{let[i,R]=(0,a.useState)(!1),[p,k]=(0,a.useState)(!1),[c,C]=(0,a.useState)(null),h=(0,a.useRef)(new oe(l)),O=(0,a.useRef)(!1),I=(0,a.useRef)(null),[de,v]=(0,a.useState)(!1),[N,V]=(0,a.useState)(),[fe,E]=(0,a.useState)(!1),[F,f]=(0,a.useState)(),[j,Q]=(0,a.useState)(!1),[le,$]=(0,a.useState)();(0,a.useEffect)(()=>{h.current.setDebug(r),r&&g.log("info","Provider","Debug mode enabled")},[r]);let Z=(0,a.useCallback)(()=>{let{width:d,height:u}=L.Dimensions.get("window"),w=Intl.DateTimeFormat().resolvedOptions().locale,b=L.PixelRatio.get(),U,re;if(L.Platform.OS==="android"){let ce=L.Platform.constants;U=ce.Model,re=ce.Brand||ce.Manufacturer}return{os:L.Platform.OS,platform:L.Platform.OS,osVersion:String(L.Platform.Version),screenWidth:d,screenHeight:u,timezoneOffsetInMinutes:String(new Date().getTimezoneOffset()),locale:w,language:w,deviceModel:U,deviceBrand:re,pixelRatio:b}},[]),z=(0,a.useCallback)(async(d,u)=>{r&&g.log("info","Referral",`Tracking referral code: ${d}`,{referralCode:d,rewardEventName:u});let w=await h.current.trackReferral(d,u);return await B.setTrackedReferral(w.referralTrackingId),r&&g.log("success","Referral",`Referral tracked \u2192 ${w.referralTrackingId}`,w),w},[r]),ee=(0,a.useCallback)(async d=>{try{r&&g.log("info","DeepLink",`Received deep link: ${d}`);let u=d.match(/[?&]referralCode=([^&]+)/);u&&(console.log("GrowthRail: Tracking referral from deep link",u[1]),r&&g.log("info","DeepLink",`Found referral code in deep link: ${u[1]}`),await z(u[1]))}catch(u){console.warn("GrowthRail: Error handling deep link",u),r&&g.log("error","DeepLink","Deep link handling failed",{error:String(u)})}},[z,r]),K=(0,a.useCallback)(async()=>{try{r&&g.log("info","Deferred","Checking deferred deep link via fingerprint");let d=Z(),{referralTrackingId:u}=await h.current.checkDeferredDeepLink(d);u?(console.log("GrowthRail: Found deferred referral via fingerprinting",u),r&&g.log("success","Deferred",`Deferred referral matched \u2192 ${u}`),await B.setTrackedReferral(u)):r&&g.log("info","Deferred","No deferred referral match found")}catch(d){console.warn("GrowthRail: Fingerprint check failed",d),r&&g.log("error","Deferred","Fingerprint check failed",{error:String(d)})}},[Z,r]),ke=(0,a.useCallback)(()=>new Promise(d=>{be.default.getInstallReferrerInfo(async(u,w)=>{if(!w&&u&&u.installReferrer)try{let U=decodeURIComponent(u.installReferrer).match(/[?&]referralCode=([^&]+)/);if(U){let{referralTrackingId:re}=await z(U[1]);await B.setTrackedReferral(re),console.log("GrowthRail: Tracked referral via Install Referrer")}}catch(b){console.warn("GrowthRail: Failed to process install referrer",b)}else await K();d()})}),[z,K]),M=(0,a.useCallback)(async d=>{if(c?.id===d&&p)return r&&g.log("info","User",`User ${d} already initialized, skipping`),c;r&&g.log("info","User",`Initializing user: ${d}`);let u=(async()=>{try{let w=await h.current.initAppUser(d),b={...w,id:d};return C(b),k(!0),r&&g.log("success","User",`User initialized: ${d}`,{referralCode:w.referralCode,referralLink:w.referralLink}),w.referrerExperience?.trigger?.displayMode!=="none"&&(E(!0),r&&g.log("info","UI","Trigger button shown (server-configured)")),b}catch(w){throw I.current=null,r&&g.log("error","User",`User init failed for ${d}`,{error:String(w)}),w}})();return I.current=u,u},[c,p,r]),P=(0,a.useCallback)(async d=>{r&&g.log("info","Reward",`Tracking reward event: ${d||"(default)"}`);let u=c;!u&&I.current&&(u=await I.current);let w=u?.id||e;if(!w)throw r&&g.log("error","Reward","Cannot track reward \u2014 user not initialized"),new Error("GrowthRail: User must be initialized before tracking a reward event.");let b=await B.getTrackedReferral();if(!b){console.warn("GrowthRail: No referral tracking ID found. Reward event not attributed."),r&&g.log("warn","Reward","No referral tracking ID in storage \u2014 reward not attributed");return}let U=await h.current.trackRewardEvent(w,b,d);return r&&g.log("success","Reward",`Reward event tracked for user ${w}`),U},[c,e,r]),D=(0,a.useCallback)(async()=>await B.getTrackedReferral(),[]),A=(0,a.useCallback)(async()=>{if(c)return c.referralLink;if(I.current)return(await I.current).referralLink},[c]);(0,a.useEffect)(()=>{if(O.current)return;O.current=!0,r&&g.log("info","Provider","SDK initializing\u2026",{platform:L.Platform.OS});let d;return(async()=>{try{let b=await L.Linking.getInitialURL();r&&g.log("info","DeepLink",`Initial URL: ${b??"(none)"}`),b&&await ee(b)}catch(b){console.warn("GrowthRail: Error getting initial URL",b)}d=L.Linking.addEventListener("url",({url:b})=>ee(b));let w=await B.isFirstLaunch();r&&g.log("info","Provider",`First launch: ${w}`),w&&await K(),e&&await M(e);try{let b=await h.current.getNewUserExperience(),U=await B.getTrackedReferral();b.banner?.show&&U&&($(b.banner),Q(!0),r&&g.log("info","UI","Banner shown for new user experience"))}catch(b){r&&g.log("warn","Provider","New user experience fetch failed",{error:String(b)})}R(!0),r&&g.log("success","Provider","SDK initialization complete \u2713")})(),()=>{d&&d.remove()}},[r,ee,K,M,e]),(0,a.useEffect)(()=>{i&&e&&c?.id!==e&&M(e)},[e,i]);let _=(0,a.useCallback)(d=>{V(d),v(!0)},[]),ge=(0,a.useCallback)(()=>{v(!1)},[]),ue=(0,a.useMemo)(()=>({isInitialized:i,isUserReady:p,currentUser:c,referralCode:c?.referralCode,referralLink:c?.referralLink,showDashboard:_,hideDashboard:ge,initUser:M,trackReward:P,getReferralTrackingId:D,getReferralLink:A,isDebugEnabled:r}),[i,p,c,_,ge,M,P,D,A,r]);if(!i)return null;let W=c?.referrerExperience,Ce=(0,a.useMemo)(()=>({...W?.modal,...N,appearance:N?.appearance||W?.modal?.appearance||l.appearance,theme:{...W?.modal?.theme||{},...N?.theme||{}}}),[W?.modal,N,l.appearance]),xe=(0,a.useMemo)(()=>({...W,...F,trigger:{...W?.trigger||{},...F?.trigger||{}}}),[W,F]);return a.default.createElement(me.Provider,{value:ue},n,a.default.createElement(ne,{visible:de,options:Ce,onClose:()=>v(!1)}),fe&&a.default.createElement(se,{options:xe,onPress:()=>ue.showDashboard()}),j&&a.default.createElement(we,{visible:j,options:le,onClose:()=>Q(!1)}))},ae=()=>{let n=(0,a.useContext)(me);if(!n)throw new Error("useGrowthRail must be used within a GrowthRailProvider");return n};var G=require("react");var Re=()=>{let[n,e]=(0,G.useState)(!1),[r,l]=(0,G.useState)(null),i=ae(),R=(0,G.useCallback)(async k=>{e(!0),l(null);try{return await i.initUser(k)}catch(c){let C=c instanceof Error?c:new Error(String(c));throw l(C),C}finally{e(!1)}},[i]),p=(0,G.useCallback)(async k=>{e(!0),l(null);try{await i.trackReward(k)}catch(c){let C=c instanceof Error?c:new Error(String(c));throw l(C),C}finally{e(!1)}},[i]);return(0,G.useMemo)(()=>({initAppUser:R,trackRewardEvent:p,showReferralDashboard:i.showDashboard,hideReferralDashboard:i.hideDashboard,getReferralTrackingId:i.getReferralTrackingId,getReferralLink:i.getReferralLink,isLoading:n,isInitialized:i.isInitialized,isUserReady:i.isUserReady,error:r,isDebugEnabled:i.isDebugEnabled}),[R,p,i.showDashboard,i.hideDashboard,i.getReferralTrackingId,i.getReferralLink,n,i.isInitialized,i.isUserReady,r,i.isDebugEnabled])};0&&(module.exports={GrowthRailProvider,ReferralDashboard,TriggerButton,useGrowthRail});
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var Ve=Object.defineProperty;var Ue=(f,e,r)=>e in f?Ve(f,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):f[e]=r;var Z=(f,e,r)=>Ue(f,typeof e!="symbol"?e+"":e,r);import ae,{createContext as tr,useContext as or,useEffect as pe,useState as O,useRef as we,useCallback as V}from"react";import{Linking as ve,Platform as G,Dimensions as ir,PixelRatio as nr}from"react-native";import ar from"react-native-play-install-referrer";var Ee="[GrowthRail]",c={log(f,e,r,a){let n=`${Ee} [${e}] ${r}`;switch(f){case"error":console.error(n,a||"");break;case"warn":console.warn(n,a||"");break;default:console.log(n,a||"");break}}};var ee=class{constructor(e){Z(this,"baseUrl");Z(this,"projectSecretKey");Z(this,"_debug",!1);let r=typeof process<"u"&&process.env?.ENV_BASE_URL;this.baseUrl=r||"https://api.growthrail.dev",this.projectSecretKey=e.projectSecretKey}setDebug(e){this._debug=e}async request(e,r,a){let n={"Content-Type":"application/json","X-GrowthRail-ProjectSecret":this.projectSecretKey,Origin:this.baseUrl},b=Date.now();this._debug&&c.log("api","APIClient",`${r} ${e}`,{method:r,endpoint:e,body:a??null});try{let u=await fetch(`${this.baseUrl}${e}`,{method:r,headers:n,body:a?JSON.stringify(a):void 0}),w=Date.now()-b;if(!u.ok){let i="";try{i=await u.text()}catch{}let m=`GrowthRail API Error ${u.status} (${this.baseUrl}${e}): ${u.statusText} - ${i}`;throw this._debug&&c.log("api","APIClient",`\u2717 ${r} ${e}`,{method:r,endpoint:e,status:u.status,duration:w,error:i}),new Error(m)}return this._debug&&c.log("api","APIClient",`\u2713 ${r} ${e}`,{method:r,endpoint:e,status:u.status,duration:w}),u.json()}catch(u){let w=Date.now()-b;throw this._debug&&c.log("api","APIClient",`\u2717 ${r} ${e} \u2014 Network error`,{method:r,endpoint:e,duration:w,error:String(u)}),console.error("GrowthRail SDK Error:",u),u}}async getNewUserExperience(){return this.request("/api/v1/sdk/new-user-experience","POST")}async initAppUser(e){return this.request("/api/v1/sdk/init-app-user","POST",{clientProvidedId:e})}async trackReferral(e,r){return this.request("/api/v1/sdk/track-referral","POST",{referralCode:e,rewardEventName:r})}async trackRewardEvent(e,r,a){return this.request("/api/v1/sdk/track-reward-event","POST",{refereeId:e,referralTrackingId:r,eventName:a})}async checkDeferredDeepLink(e){return this.request("/api/v1/sdk/match-link","POST",{fingerprint:e})}};import re from"@react-native-async-storage/async-storage";var te={TRACKED_REFERRAL:"growth-rail-tracked-referral",IS_FIRST_LAUNCH:"growth-rail-is-first-launch"},v=class{static async setTrackedReferral(e){await re.setItem(te.TRACKED_REFERRAL,e)}static async getTrackedReferral(){return await re.getItem(te.TRACKED_REFERRAL)}static async isFirstLaunch(){return await re.getItem(te.IS_FIRST_LAUNCH)===null?(await re.setItem(te.IS_FIRST_LAUNCH,"false"),!0):!1}};import t,{useEffect as Pe,useState as de,useRef as ye}from"react";import{Modal as ze,View as p,Text as T,StyleSheet as Re,TouchableOpacity as oe,Clipboard as Ae,ActivityIndicator as Fe,Linking as ke,ScrollView as Ge,Platform as Ce,Animated as L,Dimensions as $e,useColorScheme as We}from"react-native";var{width:Rr,height:xe}=$e.get("window"),fe=({visible:f,options:e,onClose:r})=>{let a=ie(),[n,b]=de(null),[u,w]=de(!1),[i,m]=de(!1),g=ye(new L.Value(0)).current,I=ye(new L.Value(0)).current,x=We(),R=(e?.appearance||x||"light")==="dark",_=e?.title||"Invite Friends & Earn",D=e?.theme?.primaryColor||"#2563eb",U=(e?.componentType||"modal")==="drawer",$=e?.position||"bottom-right",s={background:R?"#111827":"#ffffff",text:R?"#f9fafb":"#111827",textSecondary:R?"#9ca3af":"#6b7280",border:R?"#374151":"#e5e7eb",inputBg:R?"#1f2937":"#f9fafb",closeBtnBg:R?"#1f2937":"#f3f4f6",closeIcon:R?"#6b7280":"#9ca3af",drawerHandle:R?"#4b5563":"#e5e7eb",overlay:"#000000",overlayOpacity:.5};Pe(()=>{f?(n||J(),L.parallel([L.timing(I,{toValue:1,duration:300,useNativeDriver:!0}),L.spring(g,{toValue:1,useNativeDriver:!0,tension:50,friction:8})]).start()):(g.setValue(0),I.setValue(0))},[f]);let W=()=>{L.parallel([L.timing(I,{toValue:0,duration:250,useNativeDriver:!0}),L.timing(g,{toValue:0,duration:250,useNativeDriver:!0})]).start(()=>{r()})},J=async()=>{w(!0);try{if(a.isUserReady){let A=await a.getReferralLink();b(A||null)}}catch(A){console.error("GrowthRail: Failed to load referral link",A)}finally{w(!1)}},se=()=>{n&&(Ae.setString(n),m(!0),setTimeout(()=>m(!1),2e3))},z=A=>{if(!n)return;let B="",F=encodeURIComponent(n),M=encodeURIComponent("Check this out!");switch(A){case"twitter":B=`https://twitter.com/intent/tweet?url=${F}&text=${M}`;break;case"facebook":B=`https://www.facebook.com/sharer/sharer.php?u=${F}`;break;case"linkedin":B=`https://www.linkedin.com/sharing/share-offsite/?url=${F}`;break;case"whatsapp":B=`whatsapp://send?text=${M}%20${F}`;break;case"email":B=`mailto:?subject=Check this out&body=${M}%20${F}`;break}B&&ke.openURL(B).catch(()=>{})},Q=()=>s.overlay,E=[];U?E=[{translateY:g.interpolate({inputRange:[0,1],outputRange:[xe,0]})}]:E=[{scale:g.interpolate({inputRange:[0,1],outputRange:[.9,1]})},{translateY:g.interpolate({inputRange:[0,1],outputRange:[20,0]})}];let le=$.includes("top"),H=$.includes("right"),De=$.includes("left"),K=U?{position:"absolute",bottom:0,left:0,right:0,width:"100%",maxHeight:"90%"}:{};return t.createElement(ze,{visible:f,transparent:!0,animationType:"none",onRequestClose:W},t.createElement(p,{style:o.fullScreen},t.createElement(L.View,{style:[o.overlay,{backgroundColor:Q(),opacity:I.interpolate({inputRange:[0,1],outputRange:[0,s.overlayOpacity]})}]},t.createElement(oe,{style:o.fullScreen,activeOpacity:1,onPress:W})),t.createElement(L.View,{style:[U?K:o.centeredModalContainer,{backgroundColor:s.background,transform:E},U&&{borderTopLeftRadius:24,borderTopRightRadius:24,borderBottomLeftRadius:0,borderBottomRightRadius:0},!U&&{borderRadius:24,opacity:g,borderColor:s.border,borderWidth:R?1:0}]},t.createElement(p,{style:o.contentWrapper},U&&t.createElement(p,{style:[o.drawerHandle,{backgroundColor:s.drawerHandle}]}),t.createElement(oe,{style:[o.closeBtn,{backgroundColor:s.closeBtnBg}],onPress:W},t.createElement(T,{style:[o.closeIcon,{color:s.closeIcon}]},"\u2715")),t.createElement(Ge,{contentContainerStyle:o.scrollContent,showsVerticalScrollIndicator:!1},t.createElement(p,{style:o.header},t.createElement(p,{style:o.iconLgContainer},t.createElement(p,{style:o.bowContainerLg},t.createElement(p,{style:[o.bowLoopLg,o.bowLeftLg,{borderColor:D}]}),t.createElement(p,{style:[o.bowLoopLg,o.bowRightLg,{borderColor:D}]})),t.createElement(p,{style:[o.giftLidLg,{backgroundColor:D}]}),t.createElement(p,{style:[o.giftBodyLg,{borderColor:D}]},t.createElement(p,{style:[o.ribbonVerticalLg,{backgroundColor:"#fff",opacity:.3}]}))),t.createElement(T,{style:[o.title,{color:s.text}]},_),t.createElement(T,{style:[o.subtitle,{color:s.textSecondary}]},e?.description||"Share your unique link and earn rewards for every friend who signs up.")),a.isUserReady?u?t.createElement(Fe,{size:"large",color:D,style:o.loader}):t.createElement(p,{style:o.mainContent},t.createElement(T,{style:[o.label,{color:s.textSecondary}]},"YOUR UNIQUE LINK"),t.createElement(p,{style:[o.inputGroup,{backgroundColor:s.inputBg,borderColor:s.border}]},t.createElement(T,{numberOfLines:1,style:[o.input,{color:s.text}]},n||"Initializing..."),t.createElement(oe,{style:[o.copyBtn,{backgroundColor:i?"#10b981":D}],onPress:se},t.createElement(T,{style:o.copyBtnText},i?"Copied!":"Copy"))),t.createElement(p,{style:o.shareLabelContainer},t.createElement(p,{style:[o.divider,{backgroundColor:s.border}]}),t.createElement(T,{style:[o.shareLabel,{color:s.textSecondary}]},"Share via"),t.createElement(p,{style:[o.divider,{backgroundColor:s.border}]})),t.createElement(p,{style:o.socialContainer},t.createElement(Y,{platform:"twitter",color:R?"#FFFFFF":"#000000",onPress:()=>z("twitter"),icon:"\u{1D54F}",borderColor:s.border,bgColor:s.background}),t.createElement(Y,{platform:"facebook",color:"#1877F2",onPress:()=>z("facebook"),icon:"f",borderColor:s.border,bgColor:s.background}),t.createElement(Y,{platform:"linkedin",color:"#0A66C2",onPress:()=>z("linkedin"),icon:"in",borderColor:s.border,bgColor:s.background}),t.createElement(Y,{platform:"whatsapp",color:"#25D366",onPress:()=>z("whatsapp"),icon:"W",borderColor:s.border,bgColor:s.background}),t.createElement(Y,{platform:"email",color:s.textSecondary,onPress:()=>z("email"),icon:"\u2709",borderColor:s.border,bgColor:s.background}))):t.createElement(p,{style:[o.loadingBox,{backgroundColor:s.inputBg,borderColor:s.border}]},t.createElement(T,{style:{color:s.textSecondary,textAlign:"center"}},"Please log in to view your referral dashboard.")),t.createElement(p,{style:o.footer},t.createElement(T,{style:[o.poweredBy,{color:s.textSecondary}]},"Powered by ",t.createElement(T,{style:[o.brand,{color:D}],onPress:()=>ke.openURL("https://growthrail.com")},"Growth Rail"))))))))},Y=({color:f,onPress:e,icon:r,borderColor:a,bgColor:n})=>t.createElement(oe,{style:[o.socialBtn,{borderColor:a,backgroundColor:n}],onPress:e},t.createElement(T,{style:[o.socialIcon,{color:f}]},r)),o=Re.create({fullScreen:{flex:1},overlay:{...Re.absoluteFillObject},centeredModalContainer:{width:"90%",maxWidth:400,alignSelf:"center",marginTop:xe*.15,overflow:"hidden",shadowColor:"#000",shadowOffset:{width:0,height:20},shadowOpacity:.25,shadowRadius:30,elevation:20},contentWrapper:{paddingTop:Ce.OS==="ios"?20:0},drawerHandle:{width:40,height:4,backgroundColor:"#e5e7eb",borderRadius:2,alignSelf:"center",marginTop:12},scrollContent:{padding:32,alignItems:"center"},closeBtn:{position:"absolute",top:20,right:20,zIndex:10,width:32,height:32,borderRadius:16,backgroundColor:"#f3f4f6",justifyContent:"center",alignItems:"center"},closeIcon:{fontSize:14,color:"#9ca3af"},header:{alignItems:"center",marginBottom:28,width:"100%"},socialIcon:{fontSize:18,fontWeight:"bold"},title:{fontSize:22,fontWeight:"700",letterSpacing:-.5,marginBottom:8,textAlign:"center"},subtitle:{fontSize:14,lineHeight:20,textAlign:"center",paddingHorizontal:10},loadingBox:{padding:16,backgroundColor:"#f9fafb",borderRadius:12,width:"100%",alignItems:"center",borderWidth:1,borderColor:"#e5e7eb",marginTop:20},loader:{marginVertical:20},mainContent:{width:"100%"},label:{fontSize:12,fontWeight:"600",color:"#6b7280",marginBottom:8,letterSpacing:.5},inputGroup:{flexDirection:"row",alignItems:"center",backgroundColor:"#f9fafb",borderWidth:1,borderColor:"#e5e7eb",borderRadius:12,padding:6,marginBottom:24},input:{flex:1,paddingHorizontal:12,fontSize:14,color:"#111827",fontFamily:Ce.OS==="ios"?"Menlo":"monospace"},copyBtn:{paddingVertical:8,paddingHorizontal:16,borderRadius:8,justifyContent:"center",alignItems:"center"},copyBtnText:{color:"#fff",fontSize:13,fontWeight:"600"},shareLabelContainer:{flexDirection:"row",alignItems:"center",marginBottom:16,marginTop:8},divider:{flex:1,height:1,backgroundColor:"#e5e7eb"},shareLabel:{marginHorizontal:12,fontSize:13,fontWeight:"500",color:"#6b7280"},socialContainer:{flexDirection:"row",justifyContent:"center",gap:12},socialBtn:{width:44,height:44,borderRadius:22,backgroundColor:"#fff",borderWidth:1,justifyContent:"center",alignItems:"center"},iconLgContainer:{width:60,height:60,justifyContent:"center",alignItems:"center",marginBottom:16},bowContainerLg:{flexDirection:"row",position:"absolute",top:2,zIndex:2},bowLoopLg:{width:20,height:16,borderWidth:3,borderColor:"#e5e7eb",borderRadius:10},bowLeftLg:{marginRight:-2,transform:[{rotate:"-15deg"}]},bowRightLg:{marginLeft:-2,transform:[{rotate:"15deg"}]},giftLidLg:{width:44,height:10,backgroundColor:"#f3f4f6",borderRadius:2,marginTop:12,zIndex:3},giftBodyLg:{width:36,height:24,borderWidth:3,borderTopWidth:0,borderBottomLeftRadius:4,borderBottomRightRadius:4,justifyContent:"center",alignItems:"center",marginTop:-2},ribbonVerticalLg:{width:4,height:"100%",opacity:.1},footer:{marginTop:32,alignItems:"center"},poweredBy:{fontSize:11,color:"#9ca3af"},brand:{fontWeight:"600",textDecorationLine:"underline"}});import S,{useEffect as Me,useRef as Ne}from"react";import{TouchableOpacity as je,View as P,StyleSheet as _e,Animated as ge,Easing as He}from"react-native";var ue=({onPress:f,options:e})=>{let r=e?.modal?.theme?.primaryColor||"#2563eb",a=e?.trigger?.position||"bottom-right",b=(e?.trigger?.displayMode||"floating")==="edge",u=a.includes("right"),w=a.includes("top"),i=Ne(new ge.Value(-1)).current;Me(()=>{let x=()=>{i.setValue(-1),ge.timing(i,{toValue:2,duration:3e3,easing:He.linear,useNativeDriver:!0}).start(()=>{setTimeout(x,1e3)})};x()},[]);let m=i.interpolate({inputRange:[-1,2],outputRange:b?[-50,100]:[-60,120]}),g={"bottom-right":{bottom:100,right:0},"bottom-left":{bottom:100,left:0},"top-right":{top:100,right:0},"top-left":{top:100,left:0}};b||(g["bottom-right"]={bottom:30,right:20},g["bottom-left"]={bottom:30,left:20},g["top-right"]={top:60,right:20},g["top-left"]={top:60,left:20});let I=()=>S.createElement(P,{style:y.iconContainer},S.createElement(P,{style:y.bowContainer},S.createElement(P,{style:[y.bowLoop,y.bowLeft]}),S.createElement(P,{style:[y.bowLoop,y.bowRight]})),S.createElement(P,{style:y.giftLid}),S.createElement(P,{style:y.giftBody},S.createElement(P,{style:y.ribbonVertical})));return S.createElement(je,{style:[b?y.edgeButton:y.floatingButton,{backgroundColor:r},g[a],b&&(u?y.edgeRight:y.edgeLeft)],onPress:f,activeOpacity:.9},S.createElement(P,{style:y.content},I()),S.createElement(ge.View,{style:[y.shimmer,{transform:[{translateX:m},{skewX:"-15deg"}]}]}))},y=_e.create({floatingButton:{position:"absolute",width:60,height:60,borderRadius:30,justifyContent:"center",alignItems:"center",overflow:"hidden",shadowColor:"#000",shadowOffset:{width:0,height:8},shadowOpacity:.2,shadowRadius:12,elevation:8,zIndex:2147483646},edgeButton:{position:"absolute",width:50,height:50,justifyContent:"center",alignItems:"center",overflow:"hidden",shadowColor:"#000",shadowOffset:{width:0,height:4},shadowOpacity:.1,shadowRadius:8,elevation:4,zIndex:2147483646},edgeRight:{borderTopLeftRadius:8,borderBottomLeftRadius:8,paddingLeft:4},edgeLeft:{borderTopRightRadius:8,borderBottomRightRadius:8,paddingRight:4},content:{justifyContent:"center",alignItems:"center"},iconContainer:{width:28,height:28,justifyContent:"center",alignItems:"center"},bowContainer:{flexDirection:"row",position:"absolute",top:0,zIndex:2},bowLoop:{width:10,height:8,borderWidth:2,borderColor:"#fff",borderRadius:5},bowLeft:{marginRight:-1,transform:[{rotate:"-15deg"}]},bowRight:{marginLeft:-1,transform:[{rotate:"15deg"}]},giftLid:{width:22,height:5,backgroundColor:"#fff",borderRadius:1,marginTop:6,zIndex:3},giftBody:{width:18,height:12,borderWidth:2,borderColor:"#fff",borderTopWidth:0,borderBottomLeftRadius:2,borderBottomRightRadius:2,justifyContent:"center",alignItems:"center",marginTop:-1},ribbonVertical:{width:2,height:"100%",backgroundColor:"#fff",opacity:.8},shimmer:{position:"absolute",top:0,left:0,width:50,height:"100%",backgroundColor:"rgba(255, 255, 255, 0.25)"}});import j,{useEffect as Ke,useRef as qe,useState as Ye}from"react";import{View as Xe,Text as he,StyleSheet as Je,Animated as ne,Dimensions as Qe,TouchableOpacity as Ze,Platform as er}from"react-native";var{width:rr}=Qe.get("window"),Te=({visible:f,options:e,onClose:r})=>{let a=qe(new ne.Value(0)).current,[n,b]=Ye(f),u=e.position.includes("bottom")?"bottom":"top",w=e.position.includes("left")?"left":e.position.includes("right")?"right":"center";if(Ke(()=>{f?(b(!0),ne.spring(a,{toValue:1,useNativeDriver:!0,tension:50,friction:8}).start()):ne.timing(a,{toValue:0,duration:250,useNativeDriver:!0}).start(()=>{b(!1)})},[f]),!n)return null;let i=a.interpolate({inputRange:[0,1],outputRange:[u==="top"?-100:100,0]}),m=a.interpolate({inputRange:[0,1],outputRange:[0,1]}),g={position:"absolute",[u]:er.OS==="ios"?60:40,zIndex:9999};return w==="center"?(g.left=20,g.right=20,g.alignItems="center"):g[w]=20,j.createElement(ne.View,{style:[g,{transform:[{translateY:i}],opacity:m}]},j.createElement(Xe,{style:[X.banner,{backgroundColor:e.themeColor||"#2563eb"}]},j.createElement(he,{style:X.icon},"\u{1F381}"),j.createElement(he,{style:X.text},e.text),j.createElement(Ze,{onPress:r,style:X.closeBtn},j.createElement(he,{style:X.closeIcon},"\u2715"))))},X=Je.create({banner:{flexDirection:"row",alignItems:"center",padding:12,paddingHorizontal:16,borderRadius:12,shadowColor:"#000",shadowOffset:{width:0,height:4},shadowOpacity:.15,shadowRadius:10,elevation:5,maxWidth:rr-40},icon:{fontSize:18,marginRight:10},text:{color:"#fff",fontSize:14,fontWeight:"600",flex:1},closeBtn:{marginLeft:10,padding:4},closeIcon:{color:"rgba(255, 255, 255, 0.8)",fontSize:14,fontWeight:"bold"}});var Le=tr(void 0),sr=({children:f,userId:e,debug:r=!1,...a})=>{let[n,b]=O(!1),[u,w]=O(!1),[i,m]=O(null),g=we(new ee(a)),I=we(!1),x=we(null),[be,R]=O(!1),[_,D]=O(),[me,U]=O(!1),[$,s]=O(),[W,J]=O(!1),[se,z]=O();pe(()=>{g.current.setDebug(r),r&&c.log("info","Provider","Debug mode enabled")},[r]);let Q=V(()=>{let{width:d,height:l}=ir.get("window"),h=Intl.DateTimeFormat().resolvedOptions().locale,C=nr.get(),k,N;if(G.OS==="android"){let ce=G.constants;k=ce.Model,N=ce.Brand||ce.Manufacturer}return{os:G.OS,platform:G.OS,osVersion:String(G.Version),screenWidth:d,screenHeight:l,timezoneOffsetInMinutes:String(new Date().getTimezoneOffset()),locale:h,language:h,deviceModel:k,deviceBrand:N,pixelRatio:C}},[]),E=V(async(d,l)=>{r&&c.log("info","Referral",`Tracking referral code: ${d}`,{referralCode:d,rewardEventName:l});let h=await g.current.trackReferral(d,l);return await v.setTrackedReferral(h.referralTrackingId),r&&c.log("success","Referral",`Referral tracked \u2192 ${h.referralTrackingId}`,h),h},[r]),le=V(async d=>{try{r&&c.log("info","DeepLink",`Received deep link: ${d}`);let l=d.match(/[?&]referralCode=([^&]+)/);l&&(console.log("GrowthRail: Tracking referral from deep link",l[1]),r&&c.log("info","DeepLink",`Found referral code in deep link: ${l[1]}`),await E(l[1]))}catch(l){console.warn("GrowthRail: Error handling deep link",l),r&&c.log("error","DeepLink","Deep link handling failed",{error:String(l)})}},[E,r]),H=V(async()=>{try{r&&c.log("info","Deferred","Checking deferred deep link via fingerprint");let d=Q(),{referralTrackingId:l}=await g.current.checkDeferredDeepLink(d);l?(console.log("GrowthRail: Found deferred referral via fingerprinting",l),r&&c.log("success","Deferred",`Deferred referral matched \u2192 ${l}`),await v.setTrackedReferral(l)):r&&c.log("info","Deferred","No deferred referral match found")}catch(d){console.warn("GrowthRail: Fingerprint check failed",d),r&&c.log("error","Deferred","Fingerprint check failed",{error:String(d)})}},[Q,r]),De=V(()=>new Promise(d=>{ar.getInstallReferrerInfo(async(l,h)=>{if(!h&&l&&l.installReferrer)try{let k=decodeURIComponent(l.installReferrer).match(/[?&]referralCode=([^&]+)/);if(k){let{referralTrackingId:N}=await E(k[1]);await v.setTrackedReferral(N),console.log("GrowthRail: Tracked referral via Install Referrer")}}catch(C){console.warn("GrowthRail: Failed to process install referrer",C)}else await H();d()})}),[E,H]),K=V(async d=>{if(i?.id===d&&u)return r&&c.log("info","User",`User ${d} already initialized, skipping`),i;r&&c.log("info","User",`Initializing user: ${d}`);let l=(async()=>{try{let h=await g.current.initAppUser(d),C={...h,id:d};return m(C),w(!0),r&&c.log("success","User",`User initialized: ${d}`,{referralCode:h.referralCode,referralLink:h.referralLink}),h.referrerExperience?.trigger?.displayMode!=="none"&&(U(!0),r&&c.log("info","UI","Trigger button shown (server-configured)")),C}catch(h){throw x.current=null,r&&c.log("error","User",`User init failed for ${d}`,{error:String(h)}),h}})();return x.current=l,l},[i,u,r]),A=V(async d=>{r&&c.log("info","Reward",`Tracking reward event: ${d||"(default)"}`);let l=i;!l&&x.current&&(l=await x.current);let h=l?.id||e;if(!h)throw r&&c.log("error","Reward","Cannot track reward \u2014 user not initialized"),new Error("GrowthRail: User must be initialized before tracking a reward event.");let C=await v.getTrackedReferral();if(!C){console.warn("GrowthRail: No referral tracking ID found. Reward event not attributed."),r&&c.log("warn","Reward","No referral tracking ID in storage \u2014 reward not attributed");return}let k=await g.current.trackRewardEvent(h,C,d);return r&&c.log("success","Reward",`Reward event tracked for user ${h}`),k},[i,e,r]),B=V(async()=>await v.getTrackedReferral(),[]),F=V(async()=>{if(i)return i.referralLink;if(x.current)return(await x.current).referralLink},[i]);pe(()=>{if(I.current)return;I.current=!0,r&&c.log("info","Provider","SDK initializing\u2026",{platform:G.OS}),(async()=>{let l=await ve.getInitialURL();r&&c.log("info","DeepLink",`Initial URL: ${l??"(none)"}`),l&&await le(l);let h=ve.addEventListener("url",({url:k})=>le(k)),C=await v.isFirstLaunch();r&&c.log("info","Provider",`First launch: ${C}`),C&&(G.OS==="android"?await H():await H()),e&&await K(e);try{let k=await g.current.getNewUserExperience(),N=await v.getTrackedReferral();k.banner?.show&&N&&(z(k.banner),J(!0),r&&c.log("info","UI","Banner shown for new user experience"))}catch(k){r&&c.log("warn","Provider","New user experience fetch failed",{error:String(k)})}return b(!0),r&&c.log("success","Provider","SDK initialization complete \u2713"),()=>h.remove()})()},[]),pe(()=>{n&&e&&i?.id!==e&&K(e)},[e,n]);let M={isInitialized:n,isUserReady:u,currentUser:i,referralCode:i?.referralCode,referralLink:i?.referralLink,showDashboard:d=>{D(d),R(!0)},hideDashboard:()=>R(!1),initUser:K,trackReward:A,getReferralTrackingId:B,getReferralLink:F,isDebugEnabled:r};if(!n)return null;let q=i?.referrerExperience,Be={...q?.modal,..._,appearance:_?.appearance||q?.modal?.appearance||a.appearance,theme:{...q?.modal?.theme||{},..._?.theme||{}}},Oe={...q,...$,trigger:{...q?.trigger||{},...$?.trigger||{}}};return ae.createElement(Le.Provider,{value:M},f,ae.createElement(fe,{visible:be,options:Be,onClose:()=>R(!1)}),me&&ae.createElement(ue,{options:Oe,onPress:()=>M.showDashboard()}),W&&ae.createElement(Te,{visible:W,options:se,onClose:()=>J(!1)}))},ie=()=>{let f=or(Le);if(!f)throw new Error("useGrowthRail must be used within a GrowthRailProvider");return f};import{useState as Se,useCallback as Ie}from"react";var lr=()=>{let[f,e]=Se(!1),[r,a]=Se(null),n=ie(),b=Ie(async w=>{e(!0),a(null);try{return await n.initUser(w)}catch(i){let m=i instanceof Error?i:new Error(String(i));throw a(m),m}finally{e(!1)}},[n]),u=Ie(async w=>{e(!0),a(null);try{await n.trackReward(w)}catch(i){let m=i instanceof Error?i:new Error(String(i));throw a(m),m}finally{e(!1)}},[n]);return{initAppUser:b,trackRewardEvent:u,showReferralDashboard:n.showDashboard,hideReferralDashboard:n.hideDashboard,getReferralTrackingId:n.getReferralTrackingId,getReferralLink:n.getReferralLink,isLoading:f,isInitialized:n.isInitialized,isUserReady:n.isUserReady,error:r,isDebugEnabled:n.isDebugEnabled}};export{sr as GrowthRailProvider,fe as ReferralDashboard,ue as TriggerButton,lr as useGrowthRail};
|
|
1
|
+
var ze=Object.defineProperty;var Pe=(d,e,r)=>e in d?ze(d,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):d[e]=r;var ee=(d,e,r)=>Pe(d,typeof e!="symbol"?e+"":e,r);import se,{createContext as nr,useContext as ar,useEffect as pe,useState as V,useRef as we,useCallback as T,useMemo as be}from"react";import{Linking as Ie,Platform as H,Dimensions as sr,PixelRatio as lr}from"react-native";import cr from"react-native-play-install-referrer";var Ae="[GrowthRail]",c={log(d,e,r,a){let o=`${Ae} [${e}] ${r}`;switch(d){case"error":console.error(o,a||"");break;case"warn":console.warn(o,a||"");break;default:console.log(o,a||"");break}}};var re=class{constructor(e){ee(this,"baseUrl");ee(this,"projectSecretKey");ee(this,"_debug",!1);let r=typeof process<"u"&&process.env?.ENV_BASE_URL;this.baseUrl=r||"https://api.growthrail.dev",this.projectSecretKey=e.projectSecretKey}setDebug(e){this._debug=e}async request(e,r,a){let o={"Content-Type":"application/json","X-GrowthRail-ProjectSecret":this.projectSecretKey,Origin:this.baseUrl},b=Date.now();this._debug&&c.log("api","APIClient",`${r} ${e}`,{method:r,endpoint:e,body:a??null});try{let u=await fetch(`${this.baseUrl}${e}`,{method:r,headers:o,body:a?JSON.stringify(a):void 0}),m=Date.now()-b;if(!u.ok){let n="";try{n=await u.text()}catch{}let y=`GrowthRail API Error ${u.status} (${this.baseUrl}${e}): ${u.statusText} - ${n}`;throw this._debug&&c.log("api","APIClient",`\u2717 ${r} ${e}`,{method:r,endpoint:e,status:u.status,duration:m,error:n}),new Error(y)}return this._debug&&c.log("api","APIClient",`\u2713 ${r} ${e}`,{method:r,endpoint:e,status:u.status,duration:m}),u.json()}catch(u){let m=Date.now()-b;throw this._debug&&c.log("api","APIClient",`\u2717 ${r} ${e} \u2014 Network error`,{method:r,endpoint:e,duration:m,error:String(u)}),console.error("GrowthRail SDK Error:",u),u}}async getNewUserExperience(){return this.request("/api/v1/sdk/new-user-experience","POST")}async initAppUser(e){return this.request("/api/v1/sdk/init-app-user","POST",{clientProvidedId:e})}async trackReferral(e,r){return this.request("/api/v1/sdk/track-referral","POST",{referralCode:e,rewardEventName:r})}async trackRewardEvent(e,r,a){return this.request("/api/v1/sdk/track-reward-event","POST",{refereeId:e,referralTrackingId:r,eventName:a})}async checkDeferredDeepLink(e){return this.request("/api/v1/sdk/match-link","POST",{fingerprint:e})}};import te from"@react-native-async-storage/async-storage";var oe={TRACKED_REFERRAL:"growth-rail-tracked-referral",IS_FIRST_LAUNCH:"growth-rail-is-first-launch"},L=class{static async setTrackedReferral(e){await te.setItem(oe.TRACKED_REFERRAL,e)}static async getTrackedReferral(){return await te.getItem(oe.TRACKED_REFERRAL)}static async isFirstLaunch(){return await te.getItem(oe.IS_FIRST_LAUNCH)===null?(await te.setItem(oe.IS_FIRST_LAUNCH,"false"),!0):!1}};import t,{useEffect as Ge,useState as de,useRef as Ce}from"react";import{Modal as Fe,View as w,Text as x,StyleSheet as xe,TouchableOpacity as ie,Clipboard as $e,ActivityIndicator as Me,Linking as Te,ScrollView as We,Platform as ve,Animated as S,Dimensions as Ne,useColorScheme as je}from"react-native";var{width:Tr,height:Le}=Ne.get("window"),fe=({visible:d,options:e,onClose:r})=>{let a=ne(),[o,b]=de(null),[u,m]=de(!1),[n,y]=de(!1),g=Ce(new S.Value(0)).current,D=Ce(new S.Value(0)).current,C=je(),k=(e?.appearance||C||"light")==="dark",W=e?.title||"Invite Friends & Earn",B=e?.theme?.primaryColor||"#2563eb",U=(e?.componentType||"modal")==="drawer",G=e?.position||"bottom-right",l={background:k?"#111827":"#ffffff",text:k?"#f9fafb":"#111827",textSecondary:k?"#9ca3af":"#6b7280",border:k?"#374151":"#e5e7eb",inputBg:k?"#1f2937":"#f9fafb",closeBtnBg:k?"#1f2937":"#f3f4f6",closeIcon:k?"#6b7280":"#9ca3af",drawerHandle:k?"#4b5563":"#e5e7eb",overlay:"#000000",overlayOpacity:.5};Ge(()=>{d?(o||X(),S.parallel([S.timing(D,{toValue:1,duration:300,useNativeDriver:!0}),S.spring(g,{toValue:1,useNativeDriver:!0,tension:50,friction:8})]).start()):(g.setValue(0),D.setValue(0))},[d]);let N=()=>{S.parallel([S.timing(D,{toValue:0,duration:250,useNativeDriver:!0}),S.timing(g,{toValue:0,duration:250,useNativeDriver:!0})]).start(()=>{r()})},X=async()=>{m(!0);try{if(a.isUserReady){let z=await a.getReferralLink();b(z||null)}}catch(z){console.error("GrowthRail: Failed to load referral link",z)}finally{m(!1)}},le=()=>{o&&($e.setString(o),y(!0),setTimeout(()=>y(!1),2e3))},F=z=>{if(!o)return;let v="",P=encodeURIComponent(o),j=encodeURIComponent("Check this out!");switch(z){case"twitter":v=`https://twitter.com/intent/tweet?url=${P}&text=${j}`;break;case"facebook":v=`https://www.facebook.com/sharer/sharer.php?u=${P}`;break;case"linkedin":v=`https://www.linkedin.com/sharing/share-offsite/?url=${P}`;break;case"whatsapp":v=`whatsapp://send?text=${j}%20${P}`;break;case"email":v=`mailto:?subject=Check this out&body=${j}%20${P}`;break}v&&Te.openURL(v).catch(()=>{})},J=()=>l.overlay,E=[];U?E=[{translateY:g.interpolate({inputRange:[0,1],outputRange:[Le,0]})}]:E=[{scale:g.interpolate({inputRange:[0,1],outputRange:[.9,1]})},{translateY:g.interpolate({inputRange:[0,1],outputRange:[20,0]})}];let Q=G.includes("top"),K=G.includes("right"),Ve=G.includes("left"),$=U?{position:"absolute",bottom:0,left:0,right:0,width:"100%",maxHeight:"90%"}:{};return t.createElement(Fe,{visible:d,transparent:!0,animationType:"none",onRequestClose:N},t.createElement(w,{style:i.fullScreen},t.createElement(S.View,{style:[i.overlay,{backgroundColor:J(),opacity:D.interpolate({inputRange:[0,1],outputRange:[0,l.overlayOpacity]})}]},t.createElement(ie,{style:i.fullScreen,activeOpacity:1,onPress:N})),t.createElement(S.View,{style:[U?$:i.centeredModalContainer,{backgroundColor:l.background,transform:E},U&&{borderTopLeftRadius:24,borderTopRightRadius:24,borderBottomLeftRadius:0,borderBottomRightRadius:0},!U&&{borderRadius:24,opacity:g,borderColor:l.border,borderWidth:k?1:0}]},t.createElement(w,{style:i.contentWrapper},U&&t.createElement(w,{style:[i.drawerHandle,{backgroundColor:l.drawerHandle}]}),t.createElement(ie,{style:[i.closeBtn,{backgroundColor:l.closeBtnBg}],onPress:N},t.createElement(x,{style:[i.closeIcon,{color:l.closeIcon}]},"\u2715")),t.createElement(We,{contentContainerStyle:i.scrollContent,showsVerticalScrollIndicator:!1},t.createElement(w,{style:i.header},t.createElement(w,{style:i.iconLgContainer},t.createElement(w,{style:i.bowContainerLg},t.createElement(w,{style:[i.bowLoopLg,i.bowLeftLg,{borderColor:B}]}),t.createElement(w,{style:[i.bowLoopLg,i.bowRightLg,{borderColor:B}]})),t.createElement(w,{style:[i.giftLidLg,{backgroundColor:B}]}),t.createElement(w,{style:[i.giftBodyLg,{borderColor:B}]},t.createElement(w,{style:[i.ribbonVerticalLg,{backgroundColor:"#fff",opacity:.3}]}))),t.createElement(x,{style:[i.title,{color:l.text}]},W),t.createElement(x,{style:[i.subtitle,{color:l.textSecondary}]},e?.description||"Share your unique link and earn rewards for every friend who signs up.")),a.isUserReady?u?t.createElement(Me,{size:"large",color:B,style:i.loader}):t.createElement(w,{style:i.mainContent},t.createElement(x,{style:[i.label,{color:l.textSecondary}]},"YOUR UNIQUE LINK"),t.createElement(w,{style:[i.inputGroup,{backgroundColor:l.inputBg,borderColor:l.border}]},t.createElement(x,{numberOfLines:1,style:[i.input,{color:l.text}]},o||"Initializing..."),t.createElement(ie,{style:[i.copyBtn,{backgroundColor:n?"#10b981":B}],onPress:le},t.createElement(x,{style:i.copyBtnText},n?"Copied!":"Copy"))),t.createElement(w,{style:i.shareLabelContainer},t.createElement(w,{style:[i.divider,{backgroundColor:l.border}]}),t.createElement(x,{style:[i.shareLabel,{color:l.textSecondary}]},"Share via"),t.createElement(w,{style:[i.divider,{backgroundColor:l.border}]})),t.createElement(w,{style:i.socialContainer},t.createElement(q,{platform:"twitter",color:k?"#FFFFFF":"#000000",onPress:()=>F("twitter"),icon:"\u{1D54F}",borderColor:l.border,bgColor:l.background}),t.createElement(q,{platform:"facebook",color:"#1877F2",onPress:()=>F("facebook"),icon:"f",borderColor:l.border,bgColor:l.background}),t.createElement(q,{platform:"linkedin",color:"#0A66C2",onPress:()=>F("linkedin"),icon:"in",borderColor:l.border,bgColor:l.background}),t.createElement(q,{platform:"whatsapp",color:"#25D366",onPress:()=>F("whatsapp"),icon:"W",borderColor:l.border,bgColor:l.background}),t.createElement(q,{platform:"email",color:l.textSecondary,onPress:()=>F("email"),icon:"\u2709",borderColor:l.border,bgColor:l.background}))):t.createElement(w,{style:[i.loadingBox,{backgroundColor:l.inputBg,borderColor:l.border}]},t.createElement(x,{style:{color:l.textSecondary,textAlign:"center"}},"Please log in to view your referral dashboard.")),t.createElement(w,{style:i.footer},t.createElement(x,{style:[i.poweredBy,{color:l.textSecondary}]},"Powered by ",t.createElement(x,{style:[i.brand,{color:B}],onPress:()=>Te.openURL("https://growthrail.com")},"Growth Rail"))))))))},q=({color:d,onPress:e,icon:r,borderColor:a,bgColor:o})=>t.createElement(ie,{style:[i.socialBtn,{borderColor:a,backgroundColor:o}],onPress:e},t.createElement(x,{style:[i.socialIcon,{color:d}]},r)),i=xe.create({fullScreen:{flex:1},overlay:{...xe.absoluteFillObject},centeredModalContainer:{width:"90%",maxWidth:400,alignSelf:"center",marginTop:Le*.15,overflow:"hidden",shadowColor:"#000",shadowOffset:{width:0,height:20},shadowOpacity:.25,shadowRadius:30,elevation:20},contentWrapper:{paddingTop:ve.OS==="ios"?20:0},drawerHandle:{width:40,height:4,backgroundColor:"#e5e7eb",borderRadius:2,alignSelf:"center",marginTop:12},scrollContent:{padding:32,alignItems:"center"},closeBtn:{position:"absolute",top:20,right:20,zIndex:10,width:32,height:32,borderRadius:16,backgroundColor:"#f3f4f6",justifyContent:"center",alignItems:"center"},closeIcon:{fontSize:14,color:"#9ca3af"},header:{alignItems:"center",marginBottom:28,width:"100%"},socialIcon:{fontSize:18,fontWeight:"bold"},title:{fontSize:22,fontWeight:"700",letterSpacing:-.5,marginBottom:8,textAlign:"center"},subtitle:{fontSize:14,lineHeight:20,textAlign:"center",paddingHorizontal:10},loadingBox:{padding:16,backgroundColor:"#f9fafb",borderRadius:12,width:"100%",alignItems:"center",borderWidth:1,borderColor:"#e5e7eb",marginTop:20},loader:{marginVertical:20},mainContent:{width:"100%"},label:{fontSize:12,fontWeight:"600",color:"#6b7280",marginBottom:8,letterSpacing:.5},inputGroup:{flexDirection:"row",alignItems:"center",backgroundColor:"#f9fafb",borderWidth:1,borderColor:"#e5e7eb",borderRadius:12,padding:6,marginBottom:24},input:{flex:1,paddingHorizontal:12,fontSize:14,color:"#111827",fontFamily:ve.OS==="ios"?"Menlo":"monospace"},copyBtn:{paddingVertical:8,paddingHorizontal:16,borderRadius:8,justifyContent:"center",alignItems:"center"},copyBtnText:{color:"#fff",fontSize:13,fontWeight:"600"},shareLabelContainer:{flexDirection:"row",alignItems:"center",marginBottom:16,marginTop:8},divider:{flex:1,height:1,backgroundColor:"#e5e7eb"},shareLabel:{marginHorizontal:12,fontSize:13,fontWeight:"500",color:"#6b7280"},socialContainer:{flexDirection:"row",justifyContent:"center",gap:12},socialBtn:{width:44,height:44,borderRadius:22,backgroundColor:"#fff",borderWidth:1,justifyContent:"center",alignItems:"center"},iconLgContainer:{width:60,height:60,justifyContent:"center",alignItems:"center",marginBottom:16},bowContainerLg:{flexDirection:"row",position:"absolute",top:2,zIndex:2},bowLoopLg:{width:20,height:16,borderWidth:3,borderColor:"#e5e7eb",borderRadius:10},bowLeftLg:{marginRight:-2,transform:[{rotate:"-15deg"}]},bowRightLg:{marginLeft:-2,transform:[{rotate:"15deg"}]},giftLidLg:{width:44,height:10,backgroundColor:"#f3f4f6",borderRadius:2,marginTop:12,zIndex:3},giftBodyLg:{width:36,height:24,borderWidth:3,borderTopWidth:0,borderBottomLeftRadius:4,borderBottomRightRadius:4,justifyContent:"center",alignItems:"center",marginTop:-2},ribbonVerticalLg:{width:4,height:"100%",opacity:.1},footer:{marginTop:32,alignItems:"center"},poweredBy:{fontSize:11,color:"#9ca3af"},brand:{fontWeight:"600",textDecorationLine:"underline"}});import I,{useEffect as _e,useRef as He}from"react";import{TouchableOpacity as Ke,View as A,StyleSheet as qe,Animated as ge,Easing as Ye}from"react-native";var ue=({onPress:d,options:e})=>{let r=e?.modal?.theme?.primaryColor||"#2563eb",a=e?.trigger?.position||"bottom-right",b=(e?.trigger?.displayMode||"floating")==="edge",u=a.includes("right"),m=a.includes("top"),n=He(new ge.Value(-1)).current;_e(()=>{let C=()=>{n.setValue(-1),ge.timing(n,{toValue:2,duration:3e3,easing:Ye.linear,useNativeDriver:!0}).start(()=>{setTimeout(C,1e3)})};C()},[]);let y=n.interpolate({inputRange:[-1,2],outputRange:b?[-50,100]:[-60,120]}),g={"bottom-right":{bottom:100,right:0},"bottom-left":{bottom:100,left:0},"top-right":{top:100,right:0},"top-left":{top:100,left:0}};b||(g["bottom-right"]={bottom:30,right:20},g["bottom-left"]={bottom:30,left:20},g["top-right"]={top:60,right:20},g["top-left"]={top:60,left:20});let D=()=>I.createElement(A,{style:R.iconContainer},I.createElement(A,{style:R.bowContainer},I.createElement(A,{style:[R.bowLoop,R.bowLeft]}),I.createElement(A,{style:[R.bowLoop,R.bowRight]})),I.createElement(A,{style:R.giftLid}),I.createElement(A,{style:R.giftBody},I.createElement(A,{style:R.ribbonVertical})));return I.createElement(Ke,{style:[b?R.edgeButton:R.floatingButton,{backgroundColor:r},g[a],b&&(u?R.edgeRight:R.edgeLeft)],onPress:d,activeOpacity:.9},I.createElement(A,{style:R.content},D()),I.createElement(ge.View,{style:[R.shimmer,{transform:[{translateX:y},{skewX:"-15deg"}]}]}))},R=qe.create({floatingButton:{position:"absolute",width:60,height:60,borderRadius:30,justifyContent:"center",alignItems:"center",overflow:"hidden",shadowColor:"#000",shadowOffset:{width:0,height:8},shadowOpacity:.2,shadowRadius:12,elevation:8,zIndex:2147483646},edgeButton:{position:"absolute",width:50,height:50,justifyContent:"center",alignItems:"center",overflow:"hidden",shadowColor:"#000",shadowOffset:{width:0,height:4},shadowOpacity:.1,shadowRadius:8,elevation:4,zIndex:2147483646},edgeRight:{borderTopLeftRadius:8,borderBottomLeftRadius:8,paddingLeft:4},edgeLeft:{borderTopRightRadius:8,borderBottomRightRadius:8,paddingRight:4},content:{justifyContent:"center",alignItems:"center"},iconContainer:{width:28,height:28,justifyContent:"center",alignItems:"center"},bowContainer:{flexDirection:"row",position:"absolute",top:0,zIndex:2},bowLoop:{width:10,height:8,borderWidth:2,borderColor:"#fff",borderRadius:5},bowLeft:{marginRight:-1,transform:[{rotate:"-15deg"}]},bowRight:{marginLeft:-1,transform:[{rotate:"15deg"}]},giftLid:{width:22,height:5,backgroundColor:"#fff",borderRadius:1,marginTop:6,zIndex:3},giftBody:{width:18,height:12,borderWidth:2,borderColor:"#fff",borderTopWidth:0,borderBottomLeftRadius:2,borderBottomRightRadius:2,justifyContent:"center",alignItems:"center",marginTop:-1},ribbonVertical:{width:2,height:"100%",backgroundColor:"#fff",opacity:.8},shimmer:{position:"absolute",top:0,left:0,width:50,height:"100%",backgroundColor:"rgba(255, 255, 255, 0.25)"}});import _,{useEffect as Xe,useRef as Je,useState as Qe}from"react";import{View as Ze,Text as he,StyleSheet as er,Animated as ae,Dimensions as rr,TouchableOpacity as tr,Platform as or}from"react-native";var{width:ir}=rr.get("window"),Se=({visible:d,options:e,onClose:r})=>{let a=Je(new ae.Value(0)).current,[o,b]=Qe(d),u=e.position.includes("bottom")?"bottom":"top",m=e.position.includes("left")?"left":e.position.includes("right")?"right":"center";if(Xe(()=>{d?(b(!0),ae.spring(a,{toValue:1,useNativeDriver:!0,tension:50,friction:8}).start()):ae.timing(a,{toValue:0,duration:250,useNativeDriver:!0}).start(()=>{b(!1)})},[d]),!o)return null;let n=a.interpolate({inputRange:[0,1],outputRange:[u==="top"?-100:100,0]}),y=a.interpolate({inputRange:[0,1],outputRange:[0,1]}),g={position:"absolute",[u]:or.OS==="ios"?60:40,zIndex:9999};return m==="center"?(g.left=20,g.right=20,g.alignItems="center"):g[m]=20,_.createElement(ae.View,{style:[g,{transform:[{translateY:n}],opacity:y}]},_.createElement(Ze,{style:[Y.banner,{backgroundColor:e.themeColor||"#2563eb"}]},_.createElement(he,{style:Y.icon},"\u{1F381}"),_.createElement(he,{style:Y.text},e.text),_.createElement(tr,{onPress:r,style:Y.closeBtn},_.createElement(he,{style:Y.closeIcon},"\u2715"))))},Y=er.create({banner:{flexDirection:"row",alignItems:"center",padding:12,paddingHorizontal:16,borderRadius:12,shadowColor:"#000",shadowOffset:{width:0,height:4},shadowOpacity:.15,shadowRadius:10,elevation:5,maxWidth:ir-40},icon:{fontSize:18,marginRight:10},text:{color:"#fff",fontSize:14,fontWeight:"600",flex:1},closeBtn:{marginLeft:10,padding:4},closeIcon:{color:"rgba(255, 255, 255, 0.8)",fontSize:14,fontWeight:"bold"}});var De=nr(void 0),dr=({children:d,userId:e,debug:r=!1,...a})=>{let[o,b]=V(!1),[u,m]=V(!1),[n,y]=V(null),g=we(new re(a)),D=we(!1),C=we(null),[me,k]=V(!1),[W,B]=V(),[ye,U]=V(!1),[G,l]=V(),[N,X]=V(!1),[le,F]=V();pe(()=>{g.current.setDebug(r),r&&c.log("info","Provider","Debug mode enabled")},[r]);let J=T(()=>{let{width:s,height:f}=sr.get("window"),h=Intl.DateTimeFormat().resolvedOptions().locale,p=lr.get(),O,Z;if(H.OS==="android"){let ce=H.constants;O=ce.Model,Z=ce.Brand||ce.Manufacturer}return{os:H.OS,platform:H.OS,osVersion:String(H.Version),screenWidth:s,screenHeight:f,timezoneOffsetInMinutes:String(new Date().getTimezoneOffset()),locale:h,language:h,deviceModel:O,deviceBrand:Z,pixelRatio:p}},[]),E=T(async(s,f)=>{r&&c.log("info","Referral",`Tracking referral code: ${s}`,{referralCode:s,rewardEventName:f});let h=await g.current.trackReferral(s,f);return await L.setTrackedReferral(h.referralTrackingId),r&&c.log("success","Referral",`Referral tracked \u2192 ${h.referralTrackingId}`,h),h},[r]),Q=T(async s=>{try{r&&c.log("info","DeepLink",`Received deep link: ${s}`);let f=s.match(/[?&]referralCode=([^&]+)/);f&&(console.log("GrowthRail: Tracking referral from deep link",f[1]),r&&c.log("info","DeepLink",`Found referral code in deep link: ${f[1]}`),await E(f[1]))}catch(f){console.warn("GrowthRail: Error handling deep link",f),r&&c.log("error","DeepLink","Deep link handling failed",{error:String(f)})}},[E,r]),K=T(async()=>{try{r&&c.log("info","Deferred","Checking deferred deep link via fingerprint");let s=J(),{referralTrackingId:f}=await g.current.checkDeferredDeepLink(s);f?(console.log("GrowthRail: Found deferred referral via fingerprinting",f),r&&c.log("success","Deferred",`Deferred referral matched \u2192 ${f}`),await L.setTrackedReferral(f)):r&&c.log("info","Deferred","No deferred referral match found")}catch(s){console.warn("GrowthRail: Fingerprint check failed",s),r&&c.log("error","Deferred","Fingerprint check failed",{error:String(s)})}},[J,r]),Ve=T(()=>new Promise(s=>{cr.getInstallReferrerInfo(async(f,h)=>{if(!h&&f&&f.installReferrer)try{let O=decodeURIComponent(f.installReferrer).match(/[?&]referralCode=([^&]+)/);if(O){let{referralTrackingId:Z}=await E(O[1]);await L.setTrackedReferral(Z),console.log("GrowthRail: Tracked referral via Install Referrer")}}catch(p){console.warn("GrowthRail: Failed to process install referrer",p)}else await K();s()})}),[E,K]),$=T(async s=>{if(n?.id===s&&u)return r&&c.log("info","User",`User ${s} already initialized, skipping`),n;r&&c.log("info","User",`Initializing user: ${s}`);let f=(async()=>{try{let h=await g.current.initAppUser(s),p={...h,id:s};return y(p),m(!0),r&&c.log("success","User",`User initialized: ${s}`,{referralCode:h.referralCode,referralLink:h.referralLink}),h.referrerExperience?.trigger?.displayMode!=="none"&&(U(!0),r&&c.log("info","UI","Trigger button shown (server-configured)")),p}catch(h){throw C.current=null,r&&c.log("error","User",`User init failed for ${s}`,{error:String(h)}),h}})();return C.current=f,f},[n,u,r]),z=T(async s=>{r&&c.log("info","Reward",`Tracking reward event: ${s||"(default)"}`);let f=n;!f&&C.current&&(f=await C.current);let h=f?.id||e;if(!h)throw r&&c.log("error","Reward","Cannot track reward \u2014 user not initialized"),new Error("GrowthRail: User must be initialized before tracking a reward event.");let p=await L.getTrackedReferral();if(!p){console.warn("GrowthRail: No referral tracking ID found. Reward event not attributed."),r&&c.log("warn","Reward","No referral tracking ID in storage \u2014 reward not attributed");return}let O=await g.current.trackRewardEvent(h,p,s);return r&&c.log("success","Reward",`Reward event tracked for user ${h}`),O},[n,e,r]),v=T(async()=>await L.getTrackedReferral(),[]),P=T(async()=>{if(n)return n.referralLink;if(C.current)return(await C.current).referralLink},[n]);pe(()=>{if(D.current)return;D.current=!0,r&&c.log("info","Provider","SDK initializing\u2026",{platform:H.OS});let s;return(async()=>{try{let p=await Ie.getInitialURL();r&&c.log("info","DeepLink",`Initial URL: ${p??"(none)"}`),p&&await Q(p)}catch(p){console.warn("GrowthRail: Error getting initial URL",p)}s=Ie.addEventListener("url",({url:p})=>Q(p));let h=await L.isFirstLaunch();r&&c.log("info","Provider",`First launch: ${h}`),h&&await K(),e&&await $(e);try{let p=await g.current.getNewUserExperience(),O=await L.getTrackedReferral();p.banner?.show&&O&&(F(p.banner),X(!0),r&&c.log("info","UI","Banner shown for new user experience"))}catch(p){r&&c.log("warn","Provider","New user experience fetch failed",{error:String(p)})}b(!0),r&&c.log("success","Provider","SDK initialization complete \u2713")})(),()=>{s&&s.remove()}},[r,Q,K,$,e]),pe(()=>{o&&e&&n?.id!==e&&$(e)},[e,o]);let j=T(s=>{B(s),k(!0)},[]),Re=T(()=>{k(!1)},[]),ke=be(()=>({isInitialized:o,isUserReady:u,currentUser:n,referralCode:n?.referralCode,referralLink:n?.referralLink,showDashboard:j,hideDashboard:Re,initUser:$,trackReward:z,getReferralTrackingId:v,getReferralLink:P,isDebugEnabled:r}),[o,u,n,j,Re,$,z,v,P,r]);if(!o)return null;let M=n?.referrerExperience,Ue=be(()=>({...M?.modal,...W,appearance:W?.appearance||M?.modal?.appearance||a.appearance,theme:{...M?.modal?.theme||{},...W?.theme||{}}}),[M?.modal,W,a.appearance]),Ee=be(()=>({...M,...G,trigger:{...M?.trigger||{},...G?.trigger||{}}}),[M,G]);return se.createElement(De.Provider,{value:ke},d,se.createElement(fe,{visible:me,options:Ue,onClose:()=>k(!1)}),ye&&se.createElement(ue,{options:Ee,onPress:()=>ke.showDashboard()}),N&&se.createElement(Se,{visible:N,options:le,onClose:()=>X(!1)}))},ne=()=>{let d=ar(De);if(!d)throw new Error("useGrowthRail must be used within a GrowthRailProvider");return d};import{useState as Be,useCallback as Oe,useMemo as fr}from"react";var gr=()=>{let[d,e]=Be(!1),[r,a]=Be(null),o=ne(),b=Oe(async m=>{e(!0),a(null);try{return await o.initUser(m)}catch(n){let y=n instanceof Error?n:new Error(String(n));throw a(y),y}finally{e(!1)}},[o]),u=Oe(async m=>{e(!0),a(null);try{await o.trackReward(m)}catch(n){let y=n instanceof Error?n:new Error(String(n));throw a(y),y}finally{e(!1)}},[o]);return fr(()=>({initAppUser:b,trackRewardEvent:u,showReferralDashboard:o.showDashboard,hideReferralDashboard:o.hideDashboard,getReferralTrackingId:o.getReferralTrackingId,getReferralLink:o.getReferralLink,isLoading:d,isInitialized:o.isInitialized,isUserReady:o.isUserReady,error:r,isDebugEnabled:o.isDebugEnabled}),[b,u,o.showDashboard,o.hideDashboard,o.getReferralTrackingId,o.getReferralLink,d,o.isInitialized,o.isUserReady,r,o.isDebugEnabled])};export{dr as GrowthRailProvider,fe as ReferralDashboard,ue as TriggerButton,gr as useGrowthRail};
|
package/package.json
CHANGED
|
@@ -1,45 +1,50 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
},
|
|
15
|
-
"files": [
|
|
16
|
-
"dist",
|
|
17
|
-
"README.md",
|
|
18
|
-
"CHANGELOG.md"
|
|
19
|
-
],
|
|
20
|
-
"scripts": {
|
|
21
|
-
"build": "tsup",
|
|
22
|
-
"dev": "tsup --watch",
|
|
23
|
-
"lint": "eslint src/",
|
|
24
|
-
"type-check": "tsc --noEmit"
|
|
25
|
-
},
|
|
26
|
-
"dependencies": {
|
|
27
|
-
"@react-native-async-storage/async-storage": "^2.1.0",
|
|
28
|
-
"react-native-play-install-referrer": "^1.1.9"
|
|
29
|
-
},
|
|
30
|
-
"peerDependencies": {
|
|
31
|
-
"react": ">=16.8.0",
|
|
32
|
-
"react-native": ">=0.60.0"
|
|
33
|
-
},
|
|
34
|
-
"devDependencies": {
|
|
35
|
-
"@growth-rail/eslint-config": "*",
|
|
36
|
-
"@growth-rail/tsconfig": "*",
|
|
37
|
-
"@types/react": "^18.0.0",
|
|
38
|
-
"@types/react-native": "^0.72.0",
|
|
39
|
-
"tsup": "^8.0.0",
|
|
40
|
-
"typescript": "^5.0.0"
|
|
41
|
-
},
|
|
42
|
-
"publishConfig": {
|
|
43
|
-
"access": "public"
|
|
2
|
+
"name": "@growth-rail/react-native",
|
|
3
|
+
"version": "2.0.4",
|
|
4
|
+
"description": "Growth Rail SDK for React Native",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"require": "./dist/index.js",
|
|
12
|
+
"import": "./dist/index.mjs"
|
|
44
13
|
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md",
|
|
18
|
+
"CHANGELOG.md"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsup",
|
|
22
|
+
"dev": "tsup --watch",
|
|
23
|
+
"lint": "eslint src/",
|
|
24
|
+
"type-check": "tsc --noEmit",
|
|
25
|
+
"android": "expo run:android",
|
|
26
|
+
"ios": "expo run:ios"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@react-native-async-storage/async-storage": "^2.1.0",
|
|
30
|
+
"expo": "~54.0.33",
|
|
31
|
+
"react": "19.1.0",
|
|
32
|
+
"react-native": "0.81.5",
|
|
33
|
+
"react-native-play-install-referrer": "^1.1.9"
|
|
34
|
+
},
|
|
35
|
+
"peerDependencies": {
|
|
36
|
+
"react": ">=16.8.0",
|
|
37
|
+
"react-native": ">=0.60.0"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@growth-rail/eslint-config": "*",
|
|
41
|
+
"@growth-rail/tsconfig": "*",
|
|
42
|
+
"@types/react": "^18.0.0",
|
|
43
|
+
"@types/react-native": "^0.72.0",
|
|
44
|
+
"tsup": "^8.0.0",
|
|
45
|
+
"typescript": "^5.0.0"
|
|
46
|
+
},
|
|
47
|
+
"publishConfig": {
|
|
48
|
+
"access": "public"
|
|
49
|
+
}
|
|
45
50
|
}
|