universal-portability
Version:
Universal Portability Framework for Web3 Applications
3 lines (2 loc) • 12.7 kB
JavaScript
import e,{useRef as r,useCallback as n,useEffect as t,createContext as a,useState as o,useContext as i}from"react";import{StyleSheet as s,View as c,AppState as u}from"react-native";import{WebView as l}from"react-native-webview";var d=function(){return d=Object.assign||function(e){for(var r,n=1,t=arguments.length;n<t;n++)for(var a in r=arguments[n])Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a]);return e},d.apply(this,arguments)};function f(e,r,n,t){return new(n||(n=Promise))((function(a,o){function i(e){try{c(t.next(e))}catch(e){o(e)}}function s(e){try{c(t.throw(e))}catch(e){o(e)}}function c(e){var r;e.done?a(e.value):(r=e.value,r instanceof n?r:new n((function(e){e(r)}))).then(i,s)}c((t=t.apply(e,r||[])).next())}))}function p(e,r){var n,t,a,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},i=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return i.next=s(0),i.throw=s(1),i.return=s(2),"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(s){return function(c){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;i&&(i=0,s[0]&&(o=0)),o;)try{if(n=1,t&&(a=2&s[0]?t.return:s[0]?t.throw||((a=t.return)&&a.call(t),0):t.next)&&!(a=a.call(t,s[1])).done)return a;switch(t=0,a&&(s=[2&s[0],a.value]),s[0]){case 0:case 1:a=s;break;case 4:return o.label++,{value:s[1],done:!1};case 5:o.label++,t=s[1],s=[0];continue;case 7:s=o.ops.pop(),o.trys.pop();continue;default:if(!(a=o.trys,(a=a.length>0&&a[a.length-1])||6!==s[0]&&2!==s[0])){o=0;continue}if(3===s[0]&&(!a||s[1]>a[0]&&s[1]<a[3])){o.label=s[1];break}if(6===s[0]&&o.label<a[1]){o.label=a[1],a=s;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(s);break}a[2]&&o.ops.pop(),o.trys.pop();continue}s=r.call(e,o)}catch(e){s=[6,e],t=0}finally{n=a=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,c])}}}function h(e,r,n){if(n||2===arguments.length)for(var t,a=0,o=r.length;a<o;a++)!t&&a in r||(t||(t=Array.prototype.slice.call(r,0,a)),t[a]=r[a]);return e.concat(t||Array.prototype.slice.call(r))}"function"==typeof SuppressedError&&SuppressedError;var g=function(){return"undefined"!=typeof navigator&&"ReactNative"===navigator.product},w=function(e,r,n){void 0===r&&(r="*");try{if(g()){if(null==n?void 0:n.current){var t=JSON.stringify(e).replace(/"/g,'\\"');n.current.injectJavaScript("\n (function() {\n window.postMessage(".concat(t,", '*');\n return true;\n })();\n "))}}else window.parent.postMessage(e,r)}catch(e){console.error("Failed to send message:",e)}},v={encode:function(e){try{return g()?"function"==typeof global.btoa?global.btoa(e):function(e){for(var r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n="",t=0,a=[],o=0;o<e.length;o++){var i=e.charCodeAt(o);if(i<128)a.push(i);else if(i<2048)a.push(192|i>>6,128|63&i);else if(i<55296||i>=57344)a.push(224|i>>12,128|i>>6&63,128|63&i);else{o++;var s=65536+((1023&i)<<10|1023&e.charCodeAt(o));a.push(240|s>>18,128|s>>12&63,128|s>>6&63,128|63&s)}}for(t=0;t<a.length;t+=3)for(var c=a[t]<<16|a[t+1]<<8|a[t+2],u=0;u<4;u++)t+.75*u<a.length?n+=r[c>>6*(3-u)&63]:n+="=";return n}(e):window.btoa(e)}catch(e){return console.error("Base64 encoding error:",e),""}},decode:function(e){try{return g()?"function"==typeof global.atob?global.atob(e):function(e){var r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";e=e.replace(/[^A-Za-z0-9+/=]/g,"");var n="",t=0,a=[];for(t=0;t<e.length;t+=4){var o=r.indexOf(e.charAt(t)),i=r.indexOf(e.charAt(t+1)),s=r.indexOf(e.charAt(t+2)),c=r.indexOf(e.charAt(t+3)),u=o<<2|i>>4,l=(15&i)<<4|s>>2,d=(3&s)<<6|c;a.push(u),64!==s&&a.push(l),64!==c&&a.push(d)}var f=0;for(;f<a.length;){var p=a[f++];p<128?n+=String.fromCharCode(p):p>191&&p<224?(p=(31&p)<<6|63&a[f++],n+=String.fromCharCode(p)):p>223&&p<240?(p=(15&p)<<12|(63&a[f++])<<6|63&a[f++],n+=String.fromCharCode(p)):(p=(7&p)<<18|(63&a[f++])<<12|(63&a[f++])<<6|63&a[f++],p-=65536,n+=String.fromCharCode(p>>10|55296,1023&p|56320))}return n}(e):window.atob(e)}catch(e){return console.error("Base64 decoding error:",e),""}}};var b=function(e,r){try{if(!e.current)return void console.warn("WebView reference is not available");w(r,"*",e)}catch(e){console.error("Failed to send message to WebView:",e)}},y=function(e){try{return"string"==typeof e.nativeEvent.data?JSON.parse(e.nativeEvent.data):null}catch(e){return console.error("Failed to parse WebView message:",e),null}},E=function(a){var o=a.source,i=a.address,s=a.rpcUrl,u=a.chainId,f=a.style,p=a.onMessage,h=a.onLoad,g=a.onError,w=a.injectedJavaScript,v=function(e,r){var n={};for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&r.indexOf(t)<0&&(n[t]=e[t]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(t=Object.getOwnPropertySymbols(e);a<t.length;a++)r.indexOf(t[a])<0&&Object.prototype.propertyIsEnumerable.call(e,t[a])&&(n[t[a]]=e[t[a]])}return n}(a,["source","address","rpcUrl","chainId","style","onMessage","onLoad","onError","injectedJavaScript"]),y=r(null),E='\n window.ethereum = {\n isMetaMask: true,\n address: "'.concat(i||"",'",\n chainId: ').concat(u||1,',\n rpcUrl: "').concat(s||"","\",\n // Add placeholder methods that will be replaced by message handlers\n request: function(payload) {\n return new Promise((resolve, reject) => {\n window.postMessage(\n {\n type: 'RPC_REQUEST',\n payload,\n id: Date.now().toString()\n },\n '*'\n );\n });\n }\n };\n\n // Let the host know the WebView is ready\n window.postMessage(\n { \n type: 'WALLET_WEBVIEW_READY', \n payload: {}, \n id: Date.now().toString() \n }, \n '*'\n );\n true;\n "),m="\n ".concat(E,"\n ").concat(w||"","\n "),A=n((function(e){try{var r=JSON.parse(e.nativeEvent.data);if("INTERSPACE_CONNECT_REQUEST"===r.type)if(i&&u){var n={type:"INTERSPACE_CONNECT_RESPONSE",payload:{address:i,chainId:u,isConnected:!0},id:r.id||Date.now().toString()};b(y,n)}p&&p(e)}catch(e){console.error("Error handling WebView message:",e)}}),[i,u,p]),C=n((function(e){b(y,e)}),[]);return t((function(){y.current&&(y.current.sendMessageToWebView=C)}),[C]),e.createElement(c,{style:[S.container,f]},e.createElement(l,d({ref:y,source:o,onMessage:A,onLoad:h,onError:g,injectedJavaScript:m,javaScriptEnabled:!0,domStorageEnabled:!0,startInLoadingState:!0,allowFileAccess:!0,allowUniversalAccessFromFileURLs:!0,allowFileAccessFromFileURLs:!0},v)))},S=s.create({container:{flex:1,overflow:"hidden"}}),m=a({sendMessageToWebView:function(){},registerWebView:function(){},unregisterWebView:function(){},webViews:[],isConnected:!1,walletAddress:null,chainId:null}),A=function(a){var i=a.children,s=a.walletAddress,c=a.chainId,l=a.isConnected,d=void 0!==l&&l,f=a.onError,p=a.config,g=void 0===p?{allowedOrigins:["*"],debug:!1}:p,w=o(s||null),v=w[0],b=w[1],y=o(c||null),E=y[0],S=y[1],A=o(d),C=A[0],T=A[1],I=r([]),N=r(u.currentState),O=n((function(e,r){g.debug&&console.log("[NativePortability]: ".concat(e),r||"")}),[g.debug]),V=n((function(e,r){try{r.current&&r.current.sendMessageToWebView?(r.current.sendMessageToWebView(e),O("Sent message to WebView",e)):O("WebView reference is not available",r)}catch(e){O("Failed to send message to WebView",e),null==f||f(e instanceof Error?e:new Error("Failed to send message to WebView"))}}),[O,f]),W=n((function(e){I.current.forEach((function(r){V(e,r)}))}),[V]),R=n((function(e){I.current.includes(e)||(I.current=h(h([],I.current,!0),[e],!1),O("WebView registered",I.current.length))}),[O]),P=n((function(e){I.current=I.current.filter((function(r){return r!==e})),O("WebView unregistered",I.current.length)}),[O]),M=n((function(e){N.current.match(/inactive|background/)&&"active"===e&&(O("App has come to foreground, refreshing WebViews"),C&&v&&E&&W({type:"WALLET_INFO",payload:{address:v,chainId:E,isConnected:C},id:Date.now().toString()})),N.current=e}),[C,v,E,O,W]);t((function(){v!==s&&s&&b(s),E!==c&&c&&S(c),C!==d&&T(d)}),[s,c,d,v,E,C]),t((function(){v&&E&&C&&W({type:"WALLET_INFO",payload:{address:v,chainId:E,isConnected:C},id:Date.now().toString()})}),[v,E,C,W]),t((function(){var e=u.addEventListener("change",M);return function(){e.remove()}}),[M]);var x={sendMessageToWebView:V,registerWebView:R,unregisterWebView:P,webViews:I.current,isConnected:C,walletAddress:v,chainId:E};return e.createElement(m.Provider,{value:x},i)},C=function(){return i(m)};function T(e){var t=this,a=e.walletAddress,o=e.chainId,i=e.signer,s=C().sendMessageToWebView,c=r(null),u=n((function(e,r,n){c.current&&s({type:e,payload:r,id:n},c)}),[s]);return{handleWebViewMessage:n((function(e){return f(t,void 0,void 0,(function(){var r,n,t,s,c,l,d,f,h,g,w;return p(this,(function(p){switch(p.label){case 0:if(p.trys.push([0,12,,13]),!(r=y(e)))return[2];switch(n=r.type,t=r.payload,s=r.id,n){case"INTERSPACE_CONNECT_REQUEST":return[3,1];case"SIGN_MESSAGE_REQUEST":return[3,2];case"TRANSACTION_REQUEST":return[3,6];case"SWITCH_CHAIN_REQUEST":return[3,10]}return[3,11];case 1:return u("INTERSPACE_CONNECT_RESPONSE",{address:a,chainId:o,isConnected:!0},s),[3,11];case 2:if(p.trys.push([2,4,,5]),!i)throw new Error("Signer is not available");return c=t,[4,i.signMessage(c.message)];case 3:return l=p.sent(),u("SIGNATURE_RESPONSE",{signature:l,success:!0},s),[3,5];case 4:return d=p.sent(),u("SIGNATURE_RESPONSE",{error:d.message,success:!1},s),[3,5];case 5:case 9:case 10:return[3,11];case 6:if(p.trys.push([6,8,,9]),!i)throw new Error("Signer is not available");return u("TRANSACTION_INITIATED",{txId:s,status:"pending"},s),f=t,[4,i.sendTransaction({to:f.to,data:f.data,value:f.value,chainId:f.chainId||o})];case 7:return h=p.sent(),u("TRANSACTION_SIGNED",{txId:s,hash:h.hash,status:"success"},s),[3,9];case 8:return g=p.sent(),u("TRANSACTION_SIGNED",{txId:s,error:g.message,status:"error"},s),[3,9];case 11:return[3,13];case 12:return w=p.sent(),console.error("Error handling WebView message:",w),[3,13];case 13:return[2]}}))}))}),[a,o,i,u]),webViewRef:c}}function I(e){void 0===e&&(e={});var r=e.address,n=e.chainId,t=T({walletAddress:r||"",chainId:n||1,signer:e.signer});return{handleWebViewMessage:t.handleWebViewMessage,webViewRef:t.webViewRef,isReady:Boolean(r&&n)}}var N=function(e){var r=o([]),n=r[0],a=r[1],i=o(!0),s=i[0],c=i[1],u=o(null),l=u[0],d=u[1];return t((function(){f(void 0,void 0,void 0,(function(){var r,n,t,o;return p(this,(function(i){switch(i.label){case 0:return i.trys.push([0,3,4,5]),c(!0),[4,fetch("https://api.intersend.io/v1/intersend/interspace/apps",{headers:{"x-api-key":"Yeu1WVC1qOCYVOaVsusFlgal5m1i7e8B8duMJsix8WxnDauvo70cZ8soQfGqrfwyw69PsjUidM8FQBTUSfSAYx2COVD1a0elJXGKccv4D9eYx6f4U4vPhRAbvVFbhD6P","Content-Type":"application/json",Accept:"application/json"},method:"GET"})];case 1:if(!(r=i.sent()).ok)throw new Error("Failed to fetch apps: ".concat(r.status));return[4,r.json()];case 2:return n=i.sent(),t=O(n,e),a(t),[3,5];case 3:return o=i.sent(),d(o instanceof Error?o:new Error("Unknown error occurred")),console.error("Error fetching portable apps:",o),[3,5];case 4:return c(!1),[7];case 5:return[2]}}))}))}),[e]),{apps:n,loading:s,error:l}},O=function(e,r){if(!r)return e;if("string"==typeof r)return"popular"===r?e.sort((function(e,r){return new Date(r.createdAt).getTime()-new Date(e.createdAt).getTime()})).slice(0,10):e.filter((function(e){return e.category.includes(r)||e.developer===r}));if(Array.isArray(r))return e.filter((function(e){return r.includes(e.slug)||r.includes(e.name.toLowerCase())}));switch(r.type){case"category":return e.filter((function(e){return"string"==typeof r.value?e.category.includes(r.value):r.value.some((function(r){return e.category.includes(r)}))}));case"wallet":return e.filter((function(e){return"string"==typeof r.value?e.developer===r.value:r.value.includes(e.developer)}));case"popular":return e.sort((function(e,r){return new Date(r.createdAt).getTime()-new Date(e.createdAt).getTime()})).slice(0,Number(r.value)||10);case"apps":return e.filter((function(e){return"string"==typeof r.value?e.slug===r.value||e.name.toLowerCase()===r.value.toLowerCase():r.value.includes(e.slug)||r.value.some((function(r){return e.name.toLowerCase()===r.toLowerCase()}))}));default:return e}};const V="1.3.1";export{E as NativePort,A as NativePortabilityProvider,V as PORTABILITY_VERSION,E as Port,A as UniversalPortabilityProvider,v as base64,g as isReactNative,y as parseWebViewMessage,w as postMessageSafe,b as sendPortabilityMessageToWebView,T as useMessageHandler,I as usePortHandler,N as usePortableApps,C as useUniversalPortability};
//# sourceMappingURL=react-native.esm.js.map