diff --git a/dist/_expo/static/js/web/index-88190fe3c7e11f155ccc52a72d821e73.js b/dist/_expo/static/js/web/index-88190fe3c7e11f155ccc52a72d821e73.js new file mode 100644 index 0000000..1233ba1 --- /dev/null +++ b/dist/_expo/static/js/web/index-88190fe3c7e11f155ccc52a72d821e73.js @@ -0,0 +1,256 @@ +var __BUNDLE_START_TIME__=globalThis.nativePerformanceNow?nativePerformanceNow():Date.now(),__DEV__=false,process=globalThis.process||{},__METRO_GLOBAL_PREFIX__='';process.env=process.env||{};process.env.NODE_ENV=process.env.NODE_ENV||"production"; +!(function(e){'use strict';e[`${__METRO_GLOBAL_PREFIX__}__d`]||(e.__r=i,e[`${__METRO_GLOBAL_PREFIX__}__d`]=function(e,n,o){if(t.has(n))return;const i={dependencyMap:o,factory:e,hasError:!1,importedAll:r,importedDefault:r,isInitialized:!1,publicModule:{exports:{}}};t.set(n,i)},e.__c=o,e.__registerSegment=function(e,r,n){c[e]=r,n&&n.forEach(r=>{t.has(r)||s.has(r)||s.set(r,e)})});var t=o();const r={},{hasOwnProperty:n}={};function o(){return t=new Map}function i(e,r){if(null===e)throw new Error('Cannot find module');const n=t.get(e);return n&&n.isInitialized?n.publicModule.exports:a(e,n,r)}function l(e){var n;if(t.has(e)&&(null==(n=t.get(e))?void 0:n.importedDefault)!==r)return t.get(e).importedDefault;const o=i(e),l=o&&o.__esModule?o.default:o;return t.get(e).importedDefault=l}function u(e){var o;if(t.has(e)&&(null==(o=t.get(e))?void 0:o.importedAll)!==r)return t.get(e).importedAll;const l=i(e);let u;if(l&&l.__esModule)u=l;else{if(u={},l)for(const e in l)n.call(l,e)&&(u[e]=l[e]);u.default=l}return t.get(e).importedAll=u}i.importDefault=l,i[Symbol.for('expo.require')]=!0,i.importAll=u,i.context=function(){throw new Error('The experimental Metro feature `require.context` is not enabled in your project.')},i.resolveWeak=function(){throw new Error('require.resolveWeak cannot be called dynamically.')},i.unguarded=function(e,r){const n=t.get(e);return n&&n.isInitialized?n.publicModule.exports:f(e,n,r)};let d=!1;function a(t,r,n){if(!d&&e.ErrorUtils){let o;d=!0;try{o=f(t,r,n)}catch(t){e.ErrorUtils.reportFatalError(t)}return d=!1,o}return f(t,r,n)}i.unpackModuleId=function(e){if('number'!=typeof e)throw new Error('Module ID must be a number in unpackModuleId.');return{segmentId:e>>>16,localId:65535&e}},i.packModuleId=function(e){return(e.segmentId<<16)+e.localId};const c=[],s=new Map;function f(r,n,o){if(!n&&c.length>0){const e=s.get(r)??0,o=c[e];null!=o&&(o(r),n=t.get(r),s.delete(r))}if(!n)throw p(r,o);if(n.hasError)throw n.error;n.isInitialized=!0;const{factory:d,dependencyMap:a}=n;try{const t=n.publicModule;return t.id=r,null==d||d(e,i,l,u,t,t.exports,a),n.factory=void 0,n.dependencyMap=void 0,t.exports}catch(e){throw n.hasError=!0,n.error=e,n.isInitialized=!1,n.publicModule.exports=void 0,e}}function p(e,t){return Error('Requiring unknown module "'+(e??t??"[unknown optional import]")+'".')}})('undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window?window:this); +!(function(e){e.$$require_external="undefined"!=typeof require?require:()=>null})('undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window?window:this); +'undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window&&window; +!(function(n){const e=(function(){function n(n,e){return n}function e(n){var e={};return n.forEach(function(n,t){e[n]=!0}),e}function t(n,t,u){if(n.formatValueCalls++,n.formatValueCalls>200)return`[TOO BIG formatValueCalls ${n.formatValueCalls} exceeded limit of 200]`;var c=r(n,t);if(c)return c;var s=Object.keys(t),f=e(s);if(d(t)&&(s.indexOf('message')>=0||s.indexOf('description')>=0))return o(t);if(0===s.length){if(h(t)){var g=t.name?': '+t.name:'';return n.stylize('[Function'+g+']','special')}if(p(t))return n.stylize(RegExp.prototype.toString.call(t),'regexp');if(y(t))return n.stylize(Date.prototype.toString.call(t),'date');if(d(t))return o(t)}var m,v,b='',j=!1,O=['{','}'];(m=t,Array.isArray(m)&&(j=!0,O=['[',']']),h(t))&&(b=' [Function'+(t.name?': '+t.name:'')+']');return p(t)&&(b=' '+RegExp.prototype.toString.call(t)),y(t)&&(b=' '+Date.prototype.toUTCString.call(t)),d(t)&&(b=' '+o(t)),0!==s.length||j&&0!=t.length?u<0?p(t)?n.stylize(RegExp.prototype.toString.call(t),'regexp'):n.stylize('[Object]','special'):(n.seen.push(t),v=j?i(n,t,u,f,s):s.map(function(e){return l(n,t,u,f,e,j)}),n.seen.pop(),a(v,b,O)):O[0]+b+O[1]}function r(n,e){if(f(e))return n.stylize('undefined','undefined');if('string'==typeof e){var t="'"+JSON.stringify(e).replace(/^"|"$/g,'').replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return n.stylize(t,'string')}return s(e)?n.stylize(''+e,'number'):u(e)?n.stylize(''+e,'boolean'):c(e)?n.stylize('null','null'):void 0}function o(n){return'['+Error.prototype.toString.call(n)+']'}function i(n,e,t,r,o){for(var i=[],a=0,u=e.length;a-1&&(u=l?u.split('\n').map(function(n){return' '+n}).join('\n').slice(2):'\n'+u.split('\n').map(function(n){return' '+n}).join('\n')):u=n.stylize('[Circular]','special')),f(a)){if(l&&i.match(/^\d+$/))return u;(a=JSON.stringify(''+i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(a=a.slice(1,a.length-1),a=n.stylize(a,'name')):(a=a.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),a=n.stylize(a,'string'))}return a+': '+u}function a(n,e,t){return n.reduce(function(n,e){return e.indexOf('\n')>=0&&0,n+e.replace(/\u001b\[\d\d?m/g,'').length+1},0)>60?t[0]+(''===e?'':e+'\n ')+' '+n.join(',\n ')+' '+t[1]:t[0]+e+' '+n.join(', ')+' '+t[1]}function u(n){return'boolean'==typeof n}function c(n){return null===n}function s(n){return'number'==typeof n}function f(n){return void 0===n}function p(n){return g(n)&&'[object RegExp]'===m(n)}function g(n){return'object'==typeof n&&null!==n}function y(n){return g(n)&&'[object Date]'===m(n)}function d(n){return g(n)&&('[object Error]'===m(n)||n instanceof Error)}function h(n){return'function'==typeof n}function m(n){return Object.prototype.toString.call(n)}function v(n,e){return Object.prototype.hasOwnProperty.call(n,e)}return function(e,r){return t({seen:[],formatValueCalls:0,stylize:n},e,r.depth)}})(),t='(index)',r=0,o=1,i=2,l=3;function a(t){return function(){let r;r=1===arguments.length&&'string'==typeof arguments[0]?arguments[0]:Array.prototype.map.call(arguments,function(n){return e(n,{depth:10})}).join(', ');const o=arguments[0];let a=t;'string'==typeof o&&'Warning: '===o.slice(0,9)&&a>=l&&(a=i),s.length&&(r=f('',r)),n.nativeLoggingHook(r,a)}}function u(n,e){return Array.apply(null,Array(e)).map(function(){return n})}function c(n,e){if(e===t)return n[e];if(n.hasOwnProperty(e)){var r=n[e];switch(typeof r){case'function':return'\u0192';case'string':return"'"+r+"'";case'object':return null==r?'null':'{\u2026}'}return String(r)}return''}const s=[];function f(n,e){return s.join('')+n+' '+(e||'')}if(n.nativeLoggingHook){const y=n.console;if(n.console=Object.assign({timeStamp:function(){}},y??{},{error:a(l),info:a(o),log:a(o),warn:a(i),trace:a(r),debug:a(r),table:function(e,r){var i;if(Array.isArray(e))i=e.map((n,e)=>{var r={};return r[t]=String(e),Object.assign(r,n),r});else for(var l in i=[],e)if(e.hasOwnProperty(l)){var a={};a[t]=l,Object.assign(a,e[l]),i.push(a)}if(0!==i.length){r=Array.isArray(r)?[t].concat(r):Array.from(i.reduce((n,e)=>(Object.keys(e).forEach(e=>n.add(e)),n),new Set));var s=[],f=[];r.forEach(function(n,e){f[e]=n.length;for(var t=0;t'string'==typeof n?n:p(n)).join(' ');t=new Error(n),t.name='console.error'}n.RN$handleException(t,!1,!1)}}Object.defineProperty(console,'_isPolyfilled',{value:!0,enumerable:!1})}else if(!n.console){function g(){}const h=n.print||g;n.console={debug:h,error:h,info:h,log:h,trace:h,warn:h,assert(n,e){n||h('Assertion failed: '+e)},clear:g,dir:g,dirxml:g,group:g,groupCollapsed:g,groupEnd:g,profile:g,profileEnd:g,table:g,timeStamp:g},Object.defineProperty(console,'_isPolyfilled',{value:!0,enumerable:!1})}})('undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window?window:this); +!(function(r){let l=0,n=!0===r.RN$useAlwaysAvailableJSErrorHandling?r.RN$handleException:(r,l)=>{throw r};const t={setGlobalHandler(r){n=r},getGlobalHandler:()=>n,reportError(r){n&&n(r,!1)},reportFatalError(r){n&&n(r,!0)},applyWithGuard(r,n,e,a,o){try{return l++,r.apply(n,e)}catch(r){t.reportError(r)}finally{l--}return null},applyWithGuardIfNeeded:(r,l,n)=>t.inGuard()?r.apply(l,n):(t.applyWithGuard(r,l,n),null),inGuard:()=>!!l,guard(r,l,n){if('function'!=typeof r)return console.warn('A function must be passed to ErrorUtils.guard, got ',r),null;const e=l??r.name??'';return function(...l){return t.applyWithGuard(r,n??this,l,null,e)}}};r.ErrorUtils=t})('undefined'!=typeof globalThis?globalThis:'undefined'!=typeof global?global:'undefined'!=typeof window?window:this); +__d(function(g,r,i,a,m,_e,d){"use strict";var e,t=r(d[0]),o=r(d[1]),u=(e=o)&&e.__esModule?e:{default:e};(0,t.registerRootComponent)(u.default)},0,[1,141]); +__d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"disableErrorHandling",{enumerable:!0,get:function(){return t.disableErrorHandling}}),Object.defineProperty(_e,"registerRootComponent",{enumerable:!0,get:function(){return u.default}}),Object.defineProperty(_e,"isRunningInExpoGo",{enumerable:!0,get:function(){return o.isRunningInExpoGo}}),Object.defineProperty(_e,"getExpoGoProjectConfig",{enumerable:!0,get:function(){return o.getExpoGoProjectConfig}}),Object.defineProperty(_e,"EventEmitter",{enumerable:!0,get:function(){return c.EventEmitter}}),Object.defineProperty(_e,"SharedObject",{enumerable:!0,get:function(){return c.SharedObject}}),Object.defineProperty(_e,"SharedRef",{enumerable:!0,get:function(){return c.SharedRef}}),Object.defineProperty(_e,"NativeModule",{enumerable:!0,get:function(){return c.NativeModule}}),Object.defineProperty(_e,"requireNativeModule",{enumerable:!0,get:function(){return c.requireNativeModule}}),Object.defineProperty(_e,"requireOptionalNativeModule",{enumerable:!0,get:function(){return c.requireOptionalNativeModule}}),Object.defineProperty(_e,"requireNativeView",{enumerable:!0,get:function(){return c.requireNativeViewManager}}),Object.defineProperty(_e,"registerWebModule",{enumerable:!0,get:function(){return c.registerWebModule}}),Object.defineProperty(_e,"reloadAppAsync",{enumerable:!0,get:function(){return c.reloadAppAsync}}),Object.defineProperty(_e,"useEvent",{enumerable:!0,get:function(){return f.useEvent}}),Object.defineProperty(_e,"useEventListener",{enumerable:!0,get:function(){return f.useEventListener}}),r(d[0]);var e,t=r(d[1]),n=r(d[2]),u=(e=n)&&e.__esModule?e:{default:e},o=r(d[3]),c=r(d[4]),f=r(d[5])},1,[2,18,19,98,99,140]); +__d(function(g,r,i,a,m,e,d){"use strict";r(d[0]),r(d[1]),r(d[2])},2,[3,8,17]); +__d(function(g,r,i,a,m,e,d){"use strict";r(d[0])},3,[4]); +__d(function(g,r,i,a,m,e,d){"use strict";r(d[0]),Object.defineProperty(globalThis,'__ExpoImportMetaRegistry',{value:r(d[1]).ImportMetaRegistry,enumerable:!1,writable:!0})},4,[5,6]); +__d(function(g,r,i,a,m,e,d){},5,[]); +__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"ImportMetaRegistry",{enumerable:!0,get:function(){return n}});var t=r(d[0]);const n={get url(){return(0,t.getBundleUrl)()}}},6,[7]); +__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.getBundleUrl=function(){let n=null;n='undefined'==typeof window?'file://'+__filename:document.currentScript?.src;if(null==n)return null;const t=new URL(n);return`${t.protocol}//${t.host}${t.pathname}`}},7,[]); +__d(function(g,r,i,a,m,e,d){"use strict";var _=r(d[0]);g[`${g.__METRO_GLOBAL_PREFIX__??''}__loadBundleAsync`]=(0,_.buildAsyncRequire)()},8,[9]); +__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.buildAsyncRequire=function(){const t=new Map;return async function(c){if(t.has(c))return t.get(c);const u=(0,n.loadBundleAsync)(c).catch(n=>{throw t.delete(c),n});return t.set(c,u),u}};var n=r(d[0])},9,[10]); +__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.loadBundleAsync=async function(t){const u=(0,n.buildUrlForBundle)(t);return(0,c.fetchThenEvalAsync)(u)};var n=r(d[0]),c=r(d[1])},10,[11,13]); +__d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),_e.buildUrlForBundle=function(e){if(/^https?:\/\//.test(e))return e;const{url:t}=(0,u.default)();return t?new URL(e,t).toString():`//${e.replace(/^\/+/,'')}`};var e,t=r(d[0]),u=(e=t)&&e.__esModule?e:{default:e}},11,[12]); +__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t}});var t=()=>'undefined'==typeof window?{bundleLoadedFromServer:!0,fullBundleUrl:'',url:''}:{bundleLoadedFromServer:!0,get fullBundleUrl(){if(document?.currentScript&&'src'in document.currentScript)return document.currentScript.src;const t=new URL(location.href);return t.searchParams.set('platform','web'),t.toString()},url:location.origin+location.pathname}},12,[]); +__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.fetchThenEvalAsync=function(o,{scriptType:c,nonce:s,crossOrigin:u}={}){if('undefined'==typeof window)return r(d[0]).fetchThenEvalAsync(o);return new Promise((p,l)=>{const f=document.createElement('script');c&&(f.type=c),s&&f.setAttribute('nonce',s),f.src=o,u&&0!==f.src.indexOf(window.location.origin+'/')&&(f.crossOrigin=u),f.onload=()=>{f.parentNode&&f.parentNode.removeChild(f),p()};const y=new t;f.onerror=n=>{let t;t='string'==typeof n?{type:'error',target:{src:t}}:n;const c=t&&('load'===t.type?'missing':t.type),s=t?.target?.src;y.message='Loading module '+o+' failed.\n('+c+': '+s+')',y.type=c,y.request=s,f.parentNode&&f.parentNode.removeChild(f),l(y)},f.src===n?p():document.head.appendChild(f)})};const n='undefined'!=typeof document&&document.currentScript&&'src'in document.currentScript&&document.currentScript.src||null;class t extends Error{name='AsyncRequireError'}},13,[14]); +__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.fetchThenEvalAsync=fetchThenEvalAsync;var _errors=r(d[0]),_fetchAsync=r(d[1]);function fetchThenEvalAsync(url){return(0,_fetchAsync.fetchAsync)(url).then(({body:body,status:status,headers:headers})=>{if(null!=headers?.has?.('Content-Type')&&headers.get('Content-Type').includes('application/json'))throw new Error(JSON.parse(body).message||`Unknown error fetching '${url}'`);if(200===status)return eval(body);throw new Error(`Failed to load split bundle from URL: ${url}\n${body}`)})}},14,[15,16]); +__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),Object.defineProperty(e,"MetroServerError",{enumerable:!0,get:function(){return t}});class t extends Error{code='METRO_SERVER_ERROR';constructor(t,o){super(t.message),this.name='MetroServerError',this.url=o;for(const o in t)this[o]=t[o]}}},15,[]); +__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.fetchAsync=async function(t){const s=await fetch(t,{method:'GET',headers:{'expo-platform':'web'}});return{body:await s.text(),status:s.status,headers:s.headers}}},16,[]); +__d(function(g,r,i,a,m,e,d){},17,[]); +__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,'__esModule',{value:!0}),e.createErrorHandler=function(n){return(t,o)=>n(t,o)},e.disableErrorHandling=function(){}},18,[]); +__d(function(g,r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"default",{enumerable:!0,get:function(){return o}}),r(d[0]);var e,t=r(d[1]),n=(e=t)&&e.__esModule?e:{default:e};function o(e){let t=e;if(n.default.registerComponent('main',()=>t),'undefined'!=typeof window){const e=document.getElementById('root');n.default.runApplication('main',{rootTag:e,hydrate:globalThis.__EXPO_ROUTER_HYDRATE__})}}r(d[2])},19,[2,20,97]); +__d(function(g,r,i,a,m,_e,d){"use strict";function t(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"default",{enumerable:!0,get:function(){return f}});t(r(d[0]));var e,n=t(r(d[1])),o=t(r(d[2])),p=r(d[3]),s=t(p),u={},l={},c=t=>t();class f{static getAppKeys(){return Object.keys(l)}static getApplication(t,e){return(0,n.default)(l[t]&&l[t].getApplication,"Application "+t+" has not been registered. This is either due to an import error during initialization or failure to call AppRegistry.registerComponent."),l[t].getApplication(e)}static registerComponent(t,n){return l[t]={getApplication:t=>(0,p.getApplication)(c(n),t?t.initialProps:u,e&&e(t)),run:t=>(0,s.default)(c(n),e&&e(t),t.callback,{hydrate:t.hydrate||!1,initialProps:t.initialProps||u,mode:t.mode||'concurrent',rootTag:t.rootTag})},t}static registerConfig(t){t.forEach(t=>{var e=t.appKey,o=t.component,p=t.run;p?f.registerRunnable(e,p):((0,n.default)(o,'No component provider passed in'),f.registerComponent(e,o))})}static registerRunnable(t,e){return l[t]={run:e},t}static runApplication(t,e){return(0,n.default)(l[t]&&l[t].run,"Application \""+t+"\" has not been registered. This is either due to an import error during initialization or failure to call AppRegistry.registerComponent."),l[t].run(e)}static setComponentProviderInstrumentationHook(t){c=t}static setWrapperComponentProvider(t){e=t}static unmountApplicationComponentAtRootTag(t){(0,o.default)(t)}}},20,[21,26,27,28]); +__d(function(g,_r,i,a,m,_e,d){"use strict";Object.defineProperty(_e,'__esModule',{value:!0}),Object.defineProperty(_e,"default",{enumerable:!0,get:function(){return o}});var e,t=_r(d[0]),r=(e=t)&&e.__esModule?e:{default:e};function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function o(e){for(var t=1;t2?t-2:0),s=2;s{var n=f.default.getSheet();return c.default.createElement("style",(0,t.default)({},e,{dangerouslySetInnerHTML:{__html:n.textContent},id:n.id}))}}};var t=e(r(d[0])),n=e(r(d[1])),l=e(r(d[2])),u=r(d[3]),o=e(u),f=e(r(d[4])),c=e(r(d[5]));function p(e,t,f,p){var s=p.hydrate,_=p.initialProps,y=p.rootTag,E=s?u.hydrate:o.default;return(0,l.default)(y,'Expect to have a valid rootTag, instead got ',y),E(c.default.createElement(n.default,{WrapperComponent:t,ref:f,rootTag:y},c.default.createElement(e,_)),y)}},28,[29,30,26,31,44,36]); +__d(function(g,_r,i,a,m,_e,d){"use strict";function e(){return e=Object.assign?Object.assign.bind():function(e){for(var n=1;nQ||(e.current=H[Q],H[Q]=null,Q--)}function W(e,n){Q++,H[Q]=e.current,e.current=n}var q=$(null),K=$(null),Y=$(null),X=$(null);function G(e,n){switch(W(Y,n),W(K,e),W(q,null),n.nodeType){case 9:case 11:e=(e=n.documentElement)&&(e=e.namespaceURI)?xf(e):0;break;default:if(e=n.tagName,n=n.namespaceURI)e=Cf(n=xf(n),e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}B(q),W(q,e)}function Z(){B(q),B(K),B(Y)}function J(e){null!==e.memoizedState&&W(X,e);var n=q.current,t=Cf(n,e.type);n!==t&&(W(K,e),W(q,t))}function ee(e){K.current===e&&(B(q),B(K)),X.current===e&&(B(X),wd._currentValue=V)}var ne=Object.prototype.hasOwnProperty,te=u.unstable_scheduleCallback,re=u.unstable_cancelCallback,le=u.unstable_shouldYield,ae=u.unstable_requestPaint,oe=u.unstable_now,ue=u.unstable_getCurrentPriorityLevel,ie=u.unstable_ImmediatePriority,se=u.unstable_UserBlockingPriority,ce=u.unstable_NormalPriority,fe=u.unstable_LowPriority,de=u.unstable_IdlePriority,pe=u.log,me=u.unstable_setDisableYieldValue,he=null,ge=null;function ve(e){if("function"==typeof pe&&me(e),ge&&"function"==typeof ge.setStrictMode)try{ge.setStrictMode(he,e)}catch(e){}}var ye=Math.clz32?Math.clz32:function(e){return 0===(e>>>=0)?32:31-(be(e)/ke|0)|0},be=Math.log,ke=Math.LN2;var we=256,Se=4194304;function Ee(e){var n=42&e;if(0!==n)return n;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194048&e;case 4194304:case 8388608:case 16777216:case 33554432:return 62914560&e;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function xe(e,n,t){var r=e.pendingLanes;if(0===r)return 0;var l=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var u=134217727&r;return 0!==u?0!==(r=u&~a)?l=Ee(r):0!==(o&=u)?l=Ee(o):t||0!==(t=u&~e)&&(l=Ee(t)):0!==(u=r&~a)?l=Ee(u):0!==o?l=Ee(o):t||0!==(t=r&~e)&&(l=Ee(t)),0===l?0:0!==n&&n!==l&&0===(n&a)&&((a=l&-l)>=(t=n&-n)||32===a&&4194048&t)?n:l}function Ce(e,n){return 0===(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&n)}function ze(e,n){switch(e){case 1:case 2:case 4:case 8:case 64:return n+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return n+5e3;default:return-1}}function Pe(){var e=we;return!(4194048&(we<<=1))&&(we=256),e}function Ne(){var e=Se;return!(62914560&(Se<<=1))&&(Se=4194304),e}function Le(e){for(var n=[],t=0;31>t;t++)n.push(e);return n}function Te(e,n){e.pendingLanes|=n,268435456!==n&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function _e(e,n,t,r,l,a){var o=e.pendingLanes;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=t,e.entangledLanes&=t,e.errorRecoveryDisabledLanes&=t,e.shellSuspendCounter=0;var u=e.entanglements,i=e.expirationTimes,s=e.hiddenUpdates;for(t=o&~t;0)":-1--l||i[r]!==s[l]){var c="\n"+i[r].replace(" at new "," at ");return e.displayName&&c.includes("")&&(c=c.replace("",e.displayName)),c}}while(1<=r&&0<=l);break}}}finally{pn=!1,Error.prepareStackTrace=t}return(t=e?e.displayName||e.name:"")?dn(t):""}function hn(e){switch(e.tag){case 26:case 27:case 5:return dn(e.type);case 16:return dn("Lazy");case 13:return dn("Suspense");case 19:return dn("SuspenseList");case 0:case 15:return mn(e.type,!1);case 11:return mn(e.type.render,!1);case 1:return mn(e.type,!0);case 31:return dn("Activity");default:return""}}function gn(e){try{var n="";do{n+=hn(e),e=e.return}while(e);return n}catch(e){return"\nError generating stack: "+e.message+"\n"+e.stack}}function vn(e){switch(typeof e){case"bigint":case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function yn(e){var n=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===n||"radio"===n)}function bn(e){var n=yn(e)?"checked":"value",t=Object.getOwnPropertyDescriptor(e.constructor.prototype,n),r=""+e[n];if(!e.hasOwnProperty(n)&&void 0!==t&&"function"==typeof t.get&&"function"==typeof t.set){var l=t.get,a=t.set;return Object.defineProperty(e,n,{configurable:!0,get:function(){return l.call(this)},set:function(e){r=""+e,a.call(this,e)}}),Object.defineProperty(e,n,{enumerable:t.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[n]}}}}function kn(e){e._valueTracker||(e._valueTracker=bn(e))}function wn(e){if(!e)return!1;var n=e._valueTracker;if(!n)return!0;var t=n.getValue(),r="";return e&&(r=yn(e)?e.checked?"true":"false":e.value),(e=r)!==t&&(n.setValue(e),!0)}function Sn(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(n){return e.body}}var En=/[\n"\\]/g;function xn(e){return e.replace(En,function(e){return"\\"+e.charCodeAt(0).toString(16)+" "})}function Cn(e,n,t,r,l,a,o,u){e.name="",null!=o&&"function"!=typeof o&&"symbol"!=typeof o&&"boolean"!=typeof o?e.type=o:e.removeAttribute("type"),null!=n?"number"===o?(0===n&&""===e.value||e.value!=n)&&(e.value=""+vn(n)):e.value!==""+vn(n)&&(e.value=""+vn(n)):"submit"!==o&&"reset"!==o||e.removeAttribute("value"),null!=n?Pn(e,o,vn(n)):null!=t?Pn(e,o,vn(t)):null!=r&&e.removeAttribute("value"),null==l&&null!=a&&(e.defaultChecked=!!a),null!=l&&(e.checked=l&&"function"!=typeof l&&"symbol"!=typeof l),null!=u&&"function"!=typeof u&&"symbol"!=typeof u&&"boolean"!=typeof u?e.name=""+vn(u):e.removeAttribute("name")}function zn(e,n,t,r,l,a,o,u){if(null!=a&&"function"!=typeof a&&"symbol"!=typeof a&&"boolean"!=typeof a&&(e.type=a),null!=n||null!=t){if(("submit"===a||"reset"===a)&&null==n)return;t=null!=t?""+vn(t):"",n=null!=n?""+vn(n):t,u||n===e.value||(e.value=n),e.defaultValue=n}r="function"!=typeof(r=null!=r?r:l)&&"symbol"!=typeof r&&!!r,e.checked=u?e.checked:!!r,e.defaultChecked=!!r,null!=o&&"function"!=typeof o&&"symbol"!=typeof o&&"boolean"!=typeof o&&(e.name=o)}function Pn(e,n,t){"number"===n&&Sn(e.ownerDocument)===e||e.defaultValue===""+t||(e.defaultValue=""+t)}function Nn(e,n,t,r){if(e=e.options,n){n={};for(var l=0;l=_t),Mt=String.fromCharCode(32),Ot=!1;function At(e,n){switch(e){case"keyup":return-1!==Lt.indexOf(n.keyCode);case"keydown":return 229!==n.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Rt(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var It=!1;function Ut(e,n){switch(e){case"compositionend":return Rt(n);case"keypress":return 32!==n.which?null:(Ot=!0,Mt);case"textInput":return(e=n.data)===Mt&&Ot?null:e;default:return null}}function jt(e,n){if(It)return"compositionend"===e||!Tt&&At(e,n)?(e=Jn(),Zn=Gn=Xn=null,It=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(n.ctrlKey||n.altKey||n.metaKey)||n.ctrlKey&&n.altKey){if(n.char&&1=n)return{node:r,offset:n-e};e=t}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=ur(r)}}function sr(e,n){return!(!e||!n)&&(e===n||(!e||3!==e.nodeType)&&(n&&3===n.nodeType?sr(e,n.parentNode):"contains"in e?e.contains(n):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(n))))}function cr(e){for(var n=Sn((e=null!=e&&null!=e.ownerDocument&&null!=e.ownerDocument.defaultView?e.ownerDocument.defaultView:window).document);n instanceof e.HTMLIFrameElement;){try{var t="string"==typeof n.contentWindow.location.href}catch(e){t=!1}if(!t)break;n=Sn((e=n.contentWindow).document)}return n}function fr(e){var n=e&&e.nodeName&&e.nodeName.toLowerCase();return n&&("input"===n&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===n||"true"===e.contentEditable)}var dr=qn&&"documentMode"in document&&11>=document.documentMode,pr=null,mr=null,hr=null,gr=!1;function vr(e,n,t){var r=t.window===t?t.document:9===t.nodeType?t:t.ownerDocument;gr||null==pr||pr!==Sn(r)||("selectionStart"in(r=pr)&&fr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},hr&&or(hr,r)||(hr=r,0<(r=sf(mr,"onSelect")).length&&(n=new it("onSelect","select",null,n,t),e.push({event:n,listeners:r}),n.target=pr)))}function yr(e,n){var t={};return t[e.toLowerCase()]=n.toLowerCase(),t["Webkit"+e]="webkit"+n,t["Moz"+e]="moz"+n,t}var br={animationend:yr("Animation","AnimationEnd"),animationiteration:yr("Animation","AnimationIteration"),animationstart:yr("Animation","AnimationStart"),transitionrun:yr("Transition","TransitionRun"),transitionstart:yr("Transition","TransitionStart"),transitioncancel:yr("Transition","TransitionCancel"),transitionend:yr("Transition","TransitionEnd")},kr={},wr={};function Sr(e){if(kr[e])return kr[e];if(!br[e])return e;var n,t=br[e];for(n in t)if(t.hasOwnProperty(n)&&n in wr)return kr[e]=t[n];return e}qn&&(wr=document.createElement("div").style,"AnimationEvent"in window||(delete br.animationend.animation,delete br.animationiteration.animation,delete br.animationstart.animation),"TransitionEvent"in window||delete br.transitionend.transition);var Er=Sr("animationend"),xr=Sr("animationiteration"),Cr=Sr("animationstart"),zr=Sr("transitionrun"),Pr=Sr("transitionstart"),Nr=Sr("transitioncancel"),Lr=Sr("transitionend"),Tr=new Map,_r="abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Fr(e,n){Tr.set(e,n),nn(n,[e])}_r.push("scrollEnd");var Dr=new WeakMap;function Mr(e,n){if("object"==typeof e&&null!==e){var t=Dr.get(e);return void 0!==t?t:(n={value:e,source:n,stack:gn(n)},Dr.set(e,n),n)}return{value:e,source:n,stack:gn(n)}}var Or=[],Ar=0,Rr=0;function Ir(){for(var e=Ar,n=Rr=Ar=0;n>=o,l-=o,ul=1<<32-ye(n)+l|t<a?a:8;var o,u,i,s=U.T,c={};U.T=c,Jo(e,!1,n,t);try{var f=l(),d=U.S;if(null!==d&&d(c,f),null!==f&&"object"==typeof f&&"function"==typeof f.then)Zo(e,n,(o=r,u=[],i={status:"pending",value:null,reason:null,then:function(e){u.push(e)}},f.then(function(){i.status="fulfilled",i.value=o;for(var e=0;eh?(g=f,f=null):g=f.sibling;var v=p(l,f,u[h],i);if(null===v){null===f&&(f=g);break}e&&f&&null===v.alternate&&n(l,f),o=a(v,o,h),null===c?s=v:c.sibling=v,c=v,f=g}if(h===u.length)return t(l,f),hl&&sl(l,h),s;if(null===f){for(;hg?(v=h,h=null):v=h.sibling;var b=p(l,h,y.value,i);if(null===b){null===h&&(h=v);break}e&&h&&null===b.alternate&&n(l,h),o=a(b,o,g),null===f?s=b:f.sibling=b,f=b,h=v}if(y.done)return t(l,h),hl&&sl(l,g),s;if(null===h){for(;!y.done;g++,y=u.next())null!==(y=d(l,y.value,i))&&(o=a(y,o,g),null===f?s=y:f.sibling=y,f=y);return hl&&sl(l,g),s}for(h=r(h);!y.done;g++,y=u.next())null!==(y=m(h,l,g,y.value,i))&&(e&&null!==y.alternate&&h.delete(null===y.key?g:y.key),o=a(y,o,g),null===f?s=y:f.sibling=y,f=y);return e&&h.forEach(function(e){return n(l,e)}),hl&&sl(l,g),s}function v(e,r,a,u){if("object"==typeof a&&null!==a&&a.type===w&&null===a.key&&(a=a.props.children),"object"==typeof a&&null!==a){switch(a.$$typeof){case b:e:{for(var i=a.key;null!==r;){if(r.key===i){if((i=a.type)===w){if(7===r.tag){t(e,r.sibling),(u=l(r,a.props.children)).return=e,e=u;break e}}else if(r.elementType===i||"object"==typeof i&&null!==i&&i.$$typeof===_&&du(i)===r.type){t(e,r.sibling),cu(u=l(r,a.props),a),u.return=e,e=u;break e}t(e,r);break}n(e,r),r=r.sibling}a.type===w?((u=Gr(a.props.children,e.mode,u,a.key)).return=e,e=u):(cu(u=Xr(a.type,a.key,a.props,null,e.mode,u),a),u.return=e,e=u)}return o(e);case k:e:{for(i=a.key;null!==r;){if(r.key===i){if(4===r.tag&&r.stateNode.containerInfo===a.containerInfo&&r.stateNode.implementation===a.implementation){t(e,r.sibling),(u=l(r,a.children||[])).return=e,e=u;break e}t(e,r);break}n(e,r),r=r.sibling}(u=Jr(a,e.mode,u)).return=e,e=u}return o(e);case _:return v(e,r,a=(i=a._init)(a._payload),u)}if(I(a))return h(e,r,a,u);if(O(a)){if("function"!=typeof(i=O(a)))throw Error(c(150));return g(e,r,a=i.call(a),u)}if("function"==typeof a.then)return v(e,r,su(a),u);if(a.$$typeof===z)return v(e,r,Rl(e,a),u);fu(e,a)}return"string"==typeof a&&""!==a||"number"==typeof a||"bigint"==typeof a?(a=""+a,null!==r&&6===r.tag?(t(e,r.sibling),(u=l(r,a)).return=e,e=u):(t(e,r),(u=Zr(a,e.mode,u)).return=e,e=u),o(e)):t(e,r)}return function(e,n,t,r){try{iu=0;var l=v(e,n,t,r);return uu=null,l}catch(n){if(n===ta||n===la)throw n;var a=Wr(29,n,null,e.mode);return a.lanes=r,a.return=e,a}}}var mu=pu(!0),hu=pu(!1),gu=$(null),vu=null;function yu(e){var n=e.alternate;W(Su,1&Su.current),W(gu,e),null===vu&&(null===n||null!==xa.current||null!==n.memoizedState)&&(vu=e)}function bu(e){if(22===e.tag){if(W(Su,Su.current),W(gu,e),null===vu){var n=e.alternate;null!==n&&null!==n.memoizedState&&(vu=e)}}else ku()}function ku(){W(Su,Su.current),W(gu,gu.current)}function wu(e){B(gu),vu===e&&(vu=null),B(Su)}var Su=$(0);function Eu(e){for(var n=e;null!==n;){if(13===n.tag){var t=n.memoizedState;if(null!==t&&(null===(t=t.dehydrated)||"$?"===t.data||Uf(t)))return n}else if(19===n.tag&&void 0!==n.memoizedProps.revealOrder){if(128&n.flags)return n}else if(null!==n.child){n.child.return=n,n=n.child;continue}if(n===e)break;for(;null===n.sibling;){if(null===n.return||n.return===e)return null;n=n.return}n.sibling.return=n.return,n=n.sibling}return null}function xu(e,n,t,r){t=null==(t=t(r,n=e.memoizedState))?n:v({},n,t),e.memoizedState=t,0===e.lanes&&(e.updateQueue.baseState=t)}var Cu={enqueueSetState:function(e,n,t){e=e._reactInternals;var r=Xs(),l=ha(r);l.payload=n,null!=t&&(l.callback=t),null!==(n=ga(e,l,r))&&(Zs(n,e,r),va(n,e,r))},enqueueReplaceState:function(e,n,t){e=e._reactInternals;var r=Xs(),l=ha(r);l.tag=1,l.payload=n,null!=t&&(l.callback=t),null!==(n=ga(e,l,r))&&(Zs(n,e,r),va(n,e,r))},enqueueForceUpdate:function(e,n){e=e._reactInternals;var t=Xs(),r=ha(t);r.tag=2,null!=n&&(r.callback=n),null!==(n=ga(e,r,t))&&(Zs(n,e,t),va(n,e,t))}};function zu(e,n,t,r,l,a,o){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,a,o):!n.prototype||!n.prototype.isPureReactComponent||(!or(t,r)||!or(l,a))}function Pu(e,n,t,r){e=n.state,"function"==typeof n.componentWillReceiveProps&&n.componentWillReceiveProps(t,r),"function"==typeof n.UNSAFE_componentWillReceiveProps&&n.UNSAFE_componentWillReceiveProps(t,r),n.state!==e&&Cu.enqueueReplaceState(n,n.state,null)}function Nu(e,n){var t=n;if("ref"in n)for(var r in t={},n)"ref"!==r&&(t[r]=n[r]);if(e=e.defaultProps)for(var l in t===n&&(t=v({},t)),e)void 0===t[l]&&(t[l]=e[l]);return t}var Lu="function"==typeof reportError?reportError:function(e){if("object"==typeof window&&"function"==typeof window.ErrorEvent){var n=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:"object"==typeof e&&null!==e&&"string"==typeof e.message?String(e.message):String(e),error:e});if(!window.dispatchEvent(n))return}else if("object"==typeof process&&"function"==typeof process.emit)return void process.emit("uncaughtException",e);console.error(e)};function Tu(e){Lu(e)}function _u(e){console.error(e)}function Fu(e){Lu(e)}function Du(e,n){try{(0,e.onUncaughtError)(n.value,{componentStack:n.stack})}catch(e){setTimeout(function(){throw e})}}function Mu(e,n,t){try{(0,e.onCaughtError)(t.value,{componentStack:t.stack,errorBoundary:1===n.tag?n.stateNode:null})}catch(e){setTimeout(function(){throw e})}}function Ou(e,n,t){return(t=ha(t)).tag=3,t.payload={element:null},t.callback=function(){Du(e,n)},t}function Au(e){return(e=ha(e)).tag=3,e}function Ru(e,n,t,r){var l=t.type.getDerivedStateFromError;if("function"==typeof l){var a=r.value;e.payload=function(){return l(a)},e.callback=function(){Mu(n,t,r)}}var o=t.stateNode;null!==o&&"function"==typeof o.componentDidCatch&&(e.callback=function(){Mu(n,t,r),"function"!=typeof l&&(null===js?js=new Set([this]):js.add(this));var e=r.stack;this.componentDidCatch(r.value,{componentStack:null!==e?e:""})})}function Iu(e,n,t,r,l){if(t.flags|=32768,null!==r&&"object"==typeof r&&"function"==typeof r.then){if(null!==(n=t.alternate)&&Dl(n,t,l,!0),null!==(t=gu.current)){switch(t.tag){case 13:return null===vu?sc():null===t.alternate&&0===Ns&&(Ns=3),t.flags&=-257,t.flags|=65536,t.lanes=l,r===aa?t.flags|=16384:(null===(n=t.updateQueue)?t.updateQueue=new Set([r]):n.add(r),Nc(e,r,l)),!1;case 22:return t.flags|=65536,r===aa?t.flags|=16384:(null===(n=t.updateQueue)?(n={transitions:null,markerInstances:null,retryQueue:new Set([r])},t.updateQueue=n):null===(t=n.retryQueue)?n.retryQueue=new Set([r]):t.add(r),Nc(e,r,l)),!1}throw Error(c(435,t.tag))}return Nc(e,r,l),sc(),!1}if(hl)return null!==(n=gu.current)?(!(65536&n.flags)&&(n.flags|=256),n.flags|=65536,n.lanes=l,r!==yl&&Cl(Mr(e=Error(c(422),{cause:r}),t))):(r!==yl&&Cl(Mr(n=Error(c(423),{cause:r}),t)),(e=e.current.alternate).flags|=65536,l&=-l,e.lanes|=l,r=Mr(r,t),ya(e,l=Ou(e.stateNode,r,l)),4!==Ns&&(Ns=2)),!1;var a=Error(c(520),{cause:r});if(a=Mr(a,t),null===Ms?Ms=[a]:Ms.push(a),4!==Ns&&(Ns=2),null===n)return!0;r=Mr(r,t),t=n;do{switch(t.tag){case 3:return t.flags|=65536,e=l&-l,t.lanes|=e,ya(t,e=Ou(t.stateNode,r,e)),!1;case 1:if(n=t.type,a=t.stateNode,!(128&t.flags||"function"!=typeof n.getDerivedStateFromError&&(null===a||"function"!=typeof a.componentDidCatch||null!==js&&js.has(a))))return t.flags|=65536,l&=-l,t.lanes|=l,Ru(l=Au(l),e,t,r),ya(t,l),!1}t=t.return}while(null!==t);return!1}var Uu=Error(c(461)),ju=!1;function Vu(e,n,t,r){n.child=null===e?hu(n,null,t,r):mu(n,e.child,t,r)}function Hu(e,n,t,r,l){t=t.render;var a=n.ref;if("ref"in r){var o={};for(var u in r)"ref"!==u&&(o[u]=r[u])}else o=r;return Ol(n),r=Ha(e,n,t,o,a,l),u=Wa(),null===e||ju?(hl&&u&&fl(n),n.flags|=1,Vu(e,n,r,l),n.child):(qa(e,n,l),ii(e,n,l))}function Qu(e,n,t,r,l){if(null===e){var a=t.type;return"function"!=typeof a||qr(a)||void 0!==a.defaultProps||null!==t.compare?((e=Xr(t.type,null,r,n,n.mode,l)).ref=n.ref,e.return=n,n.child=e):(n.tag=15,n.type=a,$u(e,n,a,r,l))}if(a=e.child,!si(e,l)){var o=a.memoizedProps;if((t=null!==(t=t.compare)?t:or)(o,r)&&e.ref===n.ref)return ii(e,n,l)}return n.flags|=1,(e=Kr(a,r)).ref=n.ref,e.return=n,n.child=e}function $u(e,n,t,r,l){if(null!==e){var a=e.memoizedProps;if(or(a,r)&&e.ref===n.ref){if(ju=!1,n.pendingProps=r=a,!si(e,l))return n.lanes=e.lanes,ii(e,n,l);131072&e.flags&&(ju=!0)}}return Ku(e,n,t,r,l)}function Bu(e,n,t){var r=n.pendingProps,l=r.children,a=null!==e?e.memoizedState:null;if("hidden"===r.mode){if(128&n.flags){if(r=null!==a?a.baseLanes|t:t,null!==e){for(l=n.child=e.child,a=0;null!==l;)a=a|l.lanes|l.childLanes,l=l.sibling;n.childLanes=a&~r}else n.childLanes=0,n.child=null;return Wu(e,n,r,t)}if(!(536870912&t))return n.lanes=n.childLanes=536870912,Wu(e,n,null!==a?a.baseLanes|t:t,t);n.memoizedState={baseLanes:0,cachePool:null},null!==e&&ea(0,null!==a?a.cachePool:null),null!==a?za(n,a):Pa(),bu(n)}else null!==a?(ea(0,a.cachePool),za(n,a),ku(),n.memoizedState=null):(null!==e&&ea(0,null),Pa(),ku());return Vu(e,n,l,t),n.child}function Wu(e,n,t,r){var l=Jl();return l=null===l?null:{parent:Hl._currentValue,pool:l},n.memoizedState={baseLanes:t,cachePool:l},null!==e&&ea(0,null),Pa(),bu(n),null!==e&&Dl(e,n,r,!0),null}function qu(e,n){var t=n.ref;if(null===t)null!==e&&null!==e.ref&&(n.flags|=4194816);else{if("function"!=typeof t&&"object"!=typeof t)throw Error(c(284));null!==e&&e.ref===t||(n.flags|=4194816)}}function Ku(e,n,t,r,l){return Ol(n),t=Ha(e,n,t,r,void 0,l),r=Wa(),null===e||ju?(hl&&r&&fl(n),n.flags|=1,Vu(e,n,t,l),n.child):(qa(e,n,l),ii(e,n,l))}function Yu(e,n,t,r,l,a){return Ol(n),n.updateQueue=null,t=$a(n,r,t,l),Qa(e),r=Wa(),null===e||ju?(hl&&r&&fl(n),n.flags|=1,Vu(e,n,t,a),n.child):(qa(e,n,a),ii(e,n,a))}function Xu(e,n,t,r,l){if(Ol(n),null===n.stateNode){var a=$r,o=t.contextType;"object"==typeof o&&null!==o&&(a=Al(o)),a=new t(r,a),n.memoizedState=null!==a.state&&void 0!==a.state?a.state:null,a.updater=Cu,n.stateNode=a,a._reactInternals=n,(a=n.stateNode).props=r,a.state=n.memoizedState,a.refs={},pa(n),o=t.contextType,a.context="object"==typeof o&&null!==o?Al(o):$r,a.state=n.memoizedState,"function"==typeof(o=t.getDerivedStateFromProps)&&(xu(n,t,o,r),a.state=n.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof a.getSnapshotBeforeUpdate||"function"!=typeof a.UNSAFE_componentWillMount&&"function"!=typeof a.componentWillMount||(o=a.state,"function"==typeof a.componentWillMount&&a.componentWillMount(),"function"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount(),o!==a.state&&Cu.enqueueReplaceState(a,a.state,null),wa(n,r,a,l),ka(),a.state=n.memoizedState),"function"==typeof a.componentDidMount&&(n.flags|=4194308),r=!0}else if(null===e){a=n.stateNode;var u=n.memoizedProps,i=Nu(t,u);a.props=i;var s=a.context,c=t.contextType;o=$r,"object"==typeof c&&null!==c&&(o=Al(c));var f=t.getDerivedStateFromProps;c="function"==typeof f||"function"==typeof a.getSnapshotBeforeUpdate,u=n.pendingProps!==u,c||"function"!=typeof a.UNSAFE_componentWillReceiveProps&&"function"!=typeof a.componentWillReceiveProps||(u||s!==o)&&Pu(n,a,r,o),da=!1;var d=n.memoizedState;a.state=d,wa(n,r,a,l),ka(),s=n.memoizedState,u||d!==s||da?("function"==typeof f&&(xu(n,t,f,r),s=n.memoizedState),(i=da||zu(n,t,i,r,d,s,o))?(c||"function"!=typeof a.UNSAFE_componentWillMount&&"function"!=typeof a.componentWillMount||("function"==typeof a.componentWillMount&&a.componentWillMount(),"function"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount()),"function"==typeof a.componentDidMount&&(n.flags|=4194308)):("function"==typeof a.componentDidMount&&(n.flags|=4194308),n.memoizedProps=r,n.memoizedState=s),a.props=r,a.state=s,a.context=o,r=i):("function"==typeof a.componentDidMount&&(n.flags|=4194308),r=!1)}else{a=n.stateNode,ma(e,n),c=Nu(t,o=n.memoizedProps),a.props=c,f=n.pendingProps,d=a.context,s=t.contextType,i=$r,"object"==typeof s&&null!==s&&(i=Al(s)),(s="function"==typeof(u=t.getDerivedStateFromProps)||"function"==typeof a.getSnapshotBeforeUpdate)||"function"!=typeof a.UNSAFE_componentWillReceiveProps&&"function"!=typeof a.componentWillReceiveProps||(o!==f||d!==i)&&Pu(n,a,r,i),da=!1,d=n.memoizedState,a.state=d,wa(n,r,a,l),ka();var p=n.memoizedState;o!==f||d!==p||da||null!==e&&null!==e.dependencies&&Ml(e.dependencies)?("function"==typeof u&&(xu(n,t,u,r),p=n.memoizedState),(c=da||zu(n,t,c,r,d,p,i)||null!==e&&null!==e.dependencies&&Ml(e.dependencies))?(s||"function"!=typeof a.UNSAFE_componentWillUpdate&&"function"!=typeof a.componentWillUpdate||("function"==typeof a.componentWillUpdate&&a.componentWillUpdate(r,p,i),"function"==typeof a.UNSAFE_componentWillUpdate&&a.UNSAFE_componentWillUpdate(r,p,i)),"function"==typeof a.componentDidUpdate&&(n.flags|=4),"function"==typeof a.getSnapshotBeforeUpdate&&(n.flags|=1024)):("function"!=typeof a.componentDidUpdate||o===e.memoizedProps&&d===e.memoizedState||(n.flags|=4),"function"!=typeof a.getSnapshotBeforeUpdate||o===e.memoizedProps&&d===e.memoizedState||(n.flags|=1024),n.memoizedProps=r,n.memoizedState=p),a.props=r,a.state=p,a.context=i,r=c):("function"!=typeof a.componentDidUpdate||o===e.memoizedProps&&d===e.memoizedState||(n.flags|=4),"function"!=typeof a.getSnapshotBeforeUpdate||o===e.memoizedProps&&d===e.memoizedState||(n.flags|=1024),r=!1)}return a=r,qu(e,n),r=!!(128&n.flags),a||r?(a=n.stateNode,t=r&&"function"!=typeof t.getDerivedStateFromError?null:a.render(),n.flags|=1,null!==e&&r?(n.child=mu(n,e.child,null,l),n.child=mu(n,null,t,l)):Vu(e,n,t,l),n.memoizedState=a.state,e=n.child):e=ii(e,n,l),e}function Gu(e,n,t,r){return El(),n.flags|=256,Vu(e,n,t,r),n.child}var Zu={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function Ju(e){return{baseLanes:e,cachePool:na()}}function ei(e,n,t){return e=null!==e?e.childLanes&~t:0,n&&(e|=Fs),e}function ni(e,n,t){var r,l=n.pendingProps,a=!1,o=!!(128&n.flags);if((r=o)||(r=(null===e||null!==e.memoizedState)&&!!(2&Su.current)),r&&(a=!0,n.flags&=-129),r=!!(32&n.flags),n.flags&=-33,null===e){if(hl){if(a?yu(n):ku(),hl){var u,i=ml;if(u=i){e:{for(u=i,i=vl;8!==u.nodeType;){if(!i){i=null;break e}if(null===(u=Vf(u.nextSibling))){i=null;break e}}i=u}null!==i?(n.memoizedState={dehydrated:i,treeContext:null!==ol?{id:ul,overflow:il}:null,retryLane:536870912,hydrationErrors:null},(u=Wr(18,null,null,0)).stateNode=i,u.return=n,n.child=u,pl=n,ml=null,u=!0):u=!1}u||bl(n)}if(null!==(i=n.memoizedState)&&null!==(i=i.dehydrated))return Uf(i)?n.lanes=32:n.lanes=536870912,null;wu(n)}return i=l.children,l=l.fallback,a?(ku(),i=ri({mode:"hidden",children:i},a=n.mode),l=Gr(l,a,t,null),i.return=n,l.return=n,i.sibling=l,n.child=i,(a=n.child).memoizedState=Ju(t),a.childLanes=ei(e,r,t),n.memoizedState=Zu,l):(yu(n),ti(n,i))}if(null!==(u=e.memoizedState)&&null!==(i=u.dehydrated)){if(o)256&n.flags?(yu(n),n.flags&=-257,n=li(e,n,t)):null!==n.memoizedState?(ku(),n.child=e.child,n.flags|=128,n=null):(ku(),a=l.fallback,i=n.mode,l=ri({mode:"visible",children:l.children},i),(a=Gr(a,i,t,null)).flags|=2,l.return=n,a.return=n,l.sibling=a,n.child=l,mu(n,e.child,null,t),(l=n.child).memoizedState=Ju(t),l.childLanes=ei(e,r,t),n.memoizedState=Zu,n=a);else if(yu(n),Uf(i)){if(r=i.nextSibling&&i.nextSibling.dataset)var s=r.dgst;r=s,(l=Error(c(419))).stack="",l.digest=r,Cl({value:l,source:null,stack:null}),n=li(e,n,t)}else if(ju||Dl(e,n,t,!1),r=0!==(t&e.childLanes),ju||r){if(null!==(r=bs)&&(0!==(l=0!==((l=42&(l=t&-t)?1:Me(l))&(r.suspendedLanes|t))?0:l)&&l!==u.retryLane))throw u.retryLane=l,Vr(e,l),Zs(r,e,l),Uu;"$?"===i.data||sc(),n=li(e,n,t)}else"$?"===i.data?(n.flags|=192,n.child=e.child,n=null):(e=u.treeContext,ml=Vf(i.nextSibling),pl=n,hl=!0,gl=null,vl=!1,null!==e&&(ll[al++]=ul,ll[al++]=il,ll[al++]=ol,ul=e.id,il=e.overflow,ol=n),(n=ti(n,l.children)).flags|=4096);return n}return a?(ku(),a=l.fallback,i=n.mode,s=(u=e.child).sibling,(l=Kr(u,{mode:"hidden",children:l.children})).subtreeFlags=65011712&u.subtreeFlags,null!==s?a=Kr(s,a):(a=Gr(a,i,t,null)).flags|=2,a.return=n,l.return=n,l.sibling=a,n.child=l,l=a,a=n.child,null===(i=e.child.memoizedState)?i=Ju(t):(null!==(u=i.cachePool)?(s=Hl._currentValue,u=u.parent!==s?{parent:s,pool:s}:u):u=na(),i={baseLanes:i.baseLanes|t,cachePool:u}),a.memoizedState=i,a.childLanes=ei(e,r,t),n.memoizedState=Zu,l):(yu(n),e=(t=e.child).sibling,(t=Kr(t,{mode:"visible",children:l.children})).return=n,t.sibling=null,null!==e&&(null===(r=n.deletions)?(n.deletions=[e],n.flags|=16):r.push(e)),n.child=t,n.memoizedState=null,t)}function ti(e,n){return(n=ri({mode:"visible",children:n},e.mode)).return=e,e.child=n}function ri(e,n){return(e=Wr(22,e,null,n)).lanes=0,e.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},e}function li(e,n,t){return mu(n,e.child,null,t),(e=ti(n,n.pendingProps.children)).flags|=2,n.memoizedState=null,e}function ai(e,n,t){e.lanes|=n;var r=e.alternate;null!==r&&(r.lanes|=n),_l(e.return,n,t)}function oi(e,n,t,r,l){var a=e.memoizedState;null===a?e.memoizedState={isBackwards:n,rendering:null,renderingStartTime:0,last:r,tail:t,tailMode:l}:(a.isBackwards=n,a.rendering=null,a.renderingStartTime=0,a.last=r,a.tail=t,a.tailMode=l)}function ui(e,n,t){var r=n.pendingProps,l=r.revealOrder,a=r.tail;if(Vu(e,n,r.children,t),2&(r=Su.current))r=1&r|2,n.flags|=128;else{if(null!==e&&128&e.flags)e:for(e=n.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&ai(e,t,n);else if(19===e.tag)ai(e,t,n);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===n)break e;for(;null===e.sibling;){if(null===e.return||e.return===n)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}switch(W(Su,r),l){case"forwards":for(t=n.child,l=null;null!==t;)null!==(e=t.alternate)&&null===Eu(e)&&(l=t),t=t.sibling;null===(t=l)?(l=n.child,n.child=null):(l=t.sibling,t.sibling=null),oi(n,!1,l,t,a);break;case"backwards":for(t=null,l=n.child,n.child=null;null!==l;){if(null!==(e=l.alternate)&&null===Eu(e)){n.child=l;break}e=l.sibling,l.sibling=t,t=l,l=e}oi(n,!0,t,null,a);break;case"together":oi(n,!1,null,null,void 0);break;default:n.memoizedState=null}return n.child}function ii(e,n,t){if(null!==e&&(n.dependencies=e.dependencies),Ls|=n.lanes,0===(t&n.childLanes)){if(null===e)return null;if(Dl(e,n,t,!1),0===(t&n.childLanes))return null}if(null!==e&&n.child!==e.child)throw Error(c(153));if(null!==n.child){for(t=Kr(e=n.child,e.pendingProps),n.child=t,t.return=n;null!==e.sibling;)e=e.sibling,(t=t.sibling=Kr(e,e.pendingProps)).return=n;t.sibling=null}return n.child}function si(e,n){return 0!==(e.lanes&n)||!(null===(e=e.dependencies)||!Ml(e))}function ci(e,n,t){switch(n.tag){case 3:G(n,n.stateNode.containerInfo),Ll(0,Hl,e.memoizedState.cache),El();break;case 27:case 5:J(n);break;case 4:G(n,n.stateNode.containerInfo);break;case 10:Ll(0,n.type,n.memoizedProps.value);break;case 13:var r=n.memoizedState;if(null!==r)return null!==r.dehydrated?(yu(n),n.flags|=128,null):0!==(t&n.child.childLanes)?ni(e,n,t):(yu(n),null!==(e=ii(e,n,t))?e.sibling:null);yu(n);break;case 19:var l=!!(128&e.flags);if((r=0!==(t&n.childLanes))||(Dl(e,n,t,!1),r=0!==(t&n.childLanes)),l){if(r)return ui(e,n,t);n.flags|=128}if(null!==(l=n.memoizedState)&&(l.rendering=null,l.tail=null,l.lastEffect=null),W(Su,Su.current),r)break;return null;case 22:case 23:return n.lanes=0,Bu(e,n,t);case 24:Ll(0,Hl,e.memoizedState.cache)}return ii(e,n,t)}function fi(e,n,t){if(null!==e)if(e.memoizedProps!==n.pendingProps)ju=!0;else{if(!(si(e,t)||128&n.flags))return ju=!1,ci(e,n,t);ju=!!(131072&e.flags)}else ju=!1,hl&&1048576&n.flags&&cl(n,rl,n.index);switch(n.lanes=0,n.tag){case 16:e:{e=n.pendingProps;var r=n.elementType,l=r._init;if(r=l(r._payload),n.type=r,"function"!=typeof r){if(null!=r){if((l=r.$$typeof)===P){n.tag=11,n=Hu(null,n,r,e,t);break e}if(l===T){n.tag=14,n=Qu(null,n,r,e,t);break e}}throw n=R(r)||r,Error(c(306,n,""))}qr(r)?(e=Nu(r,e),n.tag=1,n=Xu(null,n,r,e,t)):(n.tag=0,n=Ku(null,n,r,e,t))}return n;case 0:return Ku(e,n,n.type,n.pendingProps,t);case 1:return Xu(e,n,r=n.type,l=Nu(r,n.pendingProps),t);case 3:e:{if(G(n,n.stateNode.containerInfo),null===e)throw Error(c(387));r=n.pendingProps;var a=n.memoizedState;l=a.element,ma(e,n),wa(n,r,null,t);var o=n.memoizedState;if(r=o.cache,Ll(0,Hl,r),r!==a.cache&&Fl(n,[Hl],t,!0),ka(),r=o.element,a.isDehydrated){if(a={element:r,isDehydrated:!1,cache:o.cache},n.updateQueue.baseState=a,n.memoizedState=a,256&n.flags){n=Gu(e,n,r,t);break e}if(r!==l){Cl(l=Mr(Error(c(424)),n)),n=Gu(e,n,r,t);break e}if(9===(e=n.stateNode.containerInfo).nodeType)e=e.body;else e="HTML"===e.nodeName?e.ownerDocument.body:e;for(ml=Vf(e.firstChild),pl=n,hl=!0,gl=null,vl=!0,t=hu(n,null,r,t),n.child=t;t;)t.flags=-3&t.flags|4096,t=t.sibling}else{if(El(),r===l){n=ii(e,n,t);break e}Vu(e,n,r,t)}n=n.child}return n;case 26:return qu(e,n),null===e?(t=Zf(n.type,null,n.pendingProps,null))?n.memoizedState=t:hl||(t=n.type,e=n.pendingProps,(r=Ef(Y.current).createElement(t))[Ue]=n,r[je]=e,bf(r,t,e),Ze(r),n.stateNode=r):n.memoizedState=Zf(n.type,e.memoizedProps,n.pendingProps,e.memoizedState),null;case 27:return J(n),null===e&&hl&&(r=n.stateNode=$f(n.type,n.pendingProps,Y.current),pl=n,vl=!0,l=ml,Mf(n.type)?(Hf=l,ml=Vf(r.firstChild)):ml=l),Vu(e,n,n.pendingProps.children,t),qu(e,n),null===e&&(n.flags|=4194304),n.child;case 5:return null===e&&hl&&((l=r=ml)&&(null!==(r=Rf(r,n.type,n.pendingProps,vl))?(n.stateNode=r,pl=n,ml=Vf(r.firstChild),vl=!1,l=!0):l=!1),l||bl(n)),J(n),l=n.type,a=n.pendingProps,o=null!==e?e.memoizedProps:null,r=a.children,zf(l,a)?r=null:null!==o&&zf(l,o)&&(n.flags|=32),null!==n.memoizedState&&(l=Ha(e,n,Ba,null,null,t),wd._currentValue=l),qu(e,n),Vu(e,n,r,t),n.child;case 6:return null===e&&hl&&((e=t=ml)&&(null!==(t=If(t,n.pendingProps,vl))?(n.stateNode=t,pl=n,ml=null,e=!0):e=!1),e||bl(n)),null;case 13:return ni(e,n,t);case 4:return G(n,n.stateNode.containerInfo),r=n.pendingProps,null===e?n.child=mu(n,null,r,t):Vu(e,n,r,t),n.child;case 11:return Hu(e,n,n.type,n.pendingProps,t);case 7:return Vu(e,n,n.pendingProps,t),n.child;case 8:case 12:return Vu(e,n,n.pendingProps.children,t),n.child;case 10:return r=n.pendingProps,Ll(0,n.type,r.value),Vu(e,n,r.children,t),n.child;case 9:return l=n.type._context,r=n.pendingProps.children,Ol(n),r=r(l=Al(l)),n.flags|=1,Vu(e,n,r,t),n.child;case 14:return Qu(e,n,n.type,n.pendingProps,t);case 15:return $u(e,n,n.type,n.pendingProps,t);case 19:return ui(e,n,t);case 31:return r=n.pendingProps,t=n.mode,r={mode:r.mode,children:r.children},null===e?((t=ri(r,t)).ref=n.ref,n.child=t,t.return=n,n=t):((t=Kr(e.child,r)).ref=n.ref,n.child=t,t.return=n,n=t),n;case 22:return Bu(e,n,t);case 24:return Ol(n),r=Al(Hl),null===e?(null===(l=Jl())&&(l=bs,a=Ql(),l.pooledCache=a,a.refCount++,null!==a&&(l.pooledCacheLanes|=t),l=a),n.memoizedState={parent:r,cache:l},pa(n),Ll(0,Hl,l)):(0!==(e.lanes&t)&&(ma(e,n),wa(n,null,null,t),ka()),l=e.memoizedState,a=n.memoizedState,l.parent!==r?(l={parent:r,cache:r},n.memoizedState=l,0===n.lanes&&(n.memoizedState=n.updateQueue.baseState=l),Ll(0,Hl,r)):(r=a.cache,Ll(0,Hl,r),r!==l.cache&&Fl(n,[Hl],t,!0))),Vu(e,n,n.pendingProps.children,t),n.child;case 29:throw n.pendingProps}throw Error(c(156,n.tag))}function di(e){e.flags|=4}function pi(e,n){if("stylesheet"!==n.type||4&n.state.loading)e.flags&=-16777217;else if(e.flags|=16777216,!dd(n)){if(null!==(n=gu.current)&&((4194048&ws)===ws?null!==vu:(62914560&ws)!==ws&&!(536870912&ws)||n!==vu))throw sa=aa,ra;e.flags|=8192}}function mi(e,n){null!==n&&(e.flags|=4),16384&e.flags&&(n=22!==e.tag?Ne():536870912,e.lanes|=n,Ds|=n)}function hi(e,n){if(!hl)switch(e.tailMode){case"hidden":n=e.tail;for(var t=null;null!==n;)null!==n.alternate&&(t=n),n=n.sibling;null===t?e.tail=null:t.sibling=null;break;case"collapsed":t=e.tail;for(var r=null;null!==t;)null!==t.alternate&&(r=t),t=t.sibling;null===r?n||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function gi(e){var n=null!==e.alternate&&e.alternate.child===e.child,t=0,r=0;if(n)for(var l=e.child;null!==l;)t|=l.lanes|l.childLanes,r|=65011712&l.subtreeFlags,r|=65011712&l.flags,l.return=e,l=l.sibling;else for(l=e.child;null!==l;)t|=l.lanes|l.childLanes,r|=l.subtreeFlags,r|=l.flags,l.return=e,l=l.sibling;return e.subtreeFlags|=r,e.childLanes=t,n}function vi(e,n,t){var r=n.pendingProps;switch(dl(n),n.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:case 1:return gi(n),null;case 3:return t=n.stateNode,r=null,null!==e&&(r=e.memoizedState.cache),n.memoizedState.cache!==r&&(n.flags|=2048),Tl(Hl),Z(),t.pendingContext&&(t.context=t.pendingContext,t.pendingContext=null),null!==e&&null!==e.child||(Sl(n)?di(n):null===e||e.memoizedState.isDehydrated&&!(256&n.flags)||(n.flags|=1024,xl())),gi(n),null;case 26:return t=n.memoizedState,null===e?(di(n),null!==t?(gi(n),pi(n,t)):(gi(n),n.flags&=-16777217)):t?t!==e.memoizedState?(di(n),gi(n),pi(n,t)):(gi(n),n.flags&=-16777217):(e.memoizedProps!==r&&di(n),gi(n),n.flags&=-16777217),null;case 27:ee(n),t=Y.current;var l=n.type;if(null!==e&&null!=n.stateNode)e.memoizedProps!==r&&di(n);else{if(!r){if(null===n.stateNode)throw Error(c(166));return gi(n),null}e=q.current,Sl(n)?kl(n):(e=$f(l,r,t),n.stateNode=e,di(n))}return gi(n),null;case 5:if(ee(n),t=n.type,null!==e&&null!=n.stateNode)e.memoizedProps!==r&&di(n);else{if(!r){if(null===n.stateNode)throw Error(c(166));return gi(n),null}if(e=q.current,Sl(n))kl(n);else{switch(l=Ef(Y.current),e){case 1:e=l.createElementNS("http://www.w3.org/2000/svg",t);break;case 2:e=l.createElementNS("http://www.w3.org/1998/Math/MathML",t);break;default:switch(t){case"svg":e=l.createElementNS("http://www.w3.org/2000/svg",t);break;case"math":e=l.createElementNS("http://www.w3.org/1998/Math/MathML",t);break;case"script":(e=l.createElement("div")).innerHTML=" + + diff --git a/dist/metadata.json b/dist/metadata.json new file mode 100644 index 0000000..8a878a6 --- /dev/null +++ b/dist/metadata.json @@ -0,0 +1 @@ +{"version":0,"bundler":"metro","fileMetadata":{}} \ No newline at end of file diff --git a/modules/my-native-module/android/build.gradle b/modules/my-native-module/android/build.gradle index bead289..8f282ae 100644 --- a/modules/my-native-module/android/build.gradle +++ b/modules/my-native-module/android/build.gradle @@ -31,6 +31,12 @@ if (useManagedAndroidSdkVersions) { } } +allprojects { + repositories { + mavenCentral() + } +} + android { namespace "expo.modules.mynativemodule" defaultConfig { @@ -43,6 +49,5 @@ android { } dependencies { - // 添加Twilio AAR文件依赖 - implementation(files("libs/twilio-conversations-android-6.0.4.aar")) + implementation 'com.twilio:conversations-android:6.2.0' } diff --git a/modules/my-native-module/android/libs/twilio-conversations-android-6.2.0.aar b/modules/my-native-module/android/libs/twilio-conversations-android-6.2.0.aar new file mode 100644 index 0000000..9dac78a Binary files /dev/null and b/modules/my-native-module/android/libs/twilio-conversations-android-6.2.0.aar differ diff --git a/modules/my-native-module/android/src/main/java/expo/modules/mynativemodule/MyNativeModule.kt b/modules/my-native-module/android/src/main/java/expo/modules/mynativemodule/MyNativeModule.kt index 70fcfd0..a0c6e4a 100644 --- a/modules/my-native-module/android/src/main/java/expo/modules/mynativemodule/MyNativeModule.kt +++ b/modules/my-native-module/android/src/main/java/expo/modules/mynativemodule/MyNativeModule.kt @@ -3,14 +3,32 @@ package expo.modules.mynativemodule import expo.modules.kotlin.modules.Module import expo.modules.kotlin.modules.ModuleDefinition import expo.modules.kotlin.Promise -import java.net.URL +import expo.modules.kotlin.AppContext +import android.content.Context +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +// Twilio SDK 6.2.0 导入 +import com.twilio.conversations.ConversationsClient +import com.twilio.conversations.Conversation +import com.twilio.conversations.ErrorInfo +import com.twilio.conversations.CallbackListener +import com.twilio.conversations.ConversationsClientListener +import com.twilio.conversations.User +import com.twilio.conversations.StatusListener class MyNativeModule : Module() { - // 模拟初始化状态 + // Twilio Conversations 客户端 + private var conversationsClient: ConversationsClient? = null + // 初始化状态 private var isInitialized = false - // 模拟对话列表 - private val mockConversations = mutableListOf>() + // 应用上下文 + private val context: Context + get() = appContext.reactContext ?: throw IllegalStateException("React Application Context is not available") + // 协程作用域,用于异步操作 + private val coroutineScope = CoroutineScope(Dispatchers.IO) // Each module class must implement the definition function. The definition consists of components // that describes the module's functionality and behavior. @@ -43,78 +61,195 @@ class MyNativeModule : Module() { )) } - // 模拟初始化方法 + // 初始化 Twilio Conversations 客户端 AsyncFunction("initialize") { token: String, promise: Promise -> try { - // 模拟初始化延迟 - Thread.sleep(1000) - - // 模拟初始化成功 - isInitialized = true - - // 添加一些模拟对话 - mockConversations.clear() - mockConversations.add(mapOf( - "sid" to "CH001", - "friendlyName" to "示例对话1" - )) - mockConversations.add(mapOf( - "sid" to "CH002", - "friendlyName" to "示例对话2" - )) - - promise.resolve("客户端已成功初始化(模拟)") - } catch (e: Exception) { - // 忽略异常 - } - } - - // 模拟获取会话列表方法 - AsyncFunction("getConversations") { promise: Promise -> - try { - if (!isInitialized) { + if (token.isEmpty()) { + promise.reject("INVALID_TOKEN", "Token cannot be empty", null) return@AsyncFunction } - // 模拟获取对话延迟 - Thread.sleep(500) - - // 返回模拟对话列表 - promise.resolve(mockConversations) + // 使用 Twilio SDK 6.2.0 兼容的 API 创建客户端 + ConversationsClient.create(context, token, object : CallbackListener() { + override fun onSuccess(client: ConversationsClient) { + conversationsClient = client + isInitialized = true + + // 注册客户端监听器 + client.addListener(object : ConversationsClientListener { + override fun onClientSynchronization(status: ConversationsClient.SynchronizationStatus) { + if (status == ConversationsClient.SynchronizationStatus.COMPLETED) { + sendEvent("onClientSynchronized", mapOf("status" to "synchronized")) + } + } + + override fun onError(errorInfo: ErrorInfo) { + sendEvent("onClientFailed", mapOf( + "errorCode" to errorInfo.code, + "errorMessage" to errorInfo.message + )) + } + + override fun onConversationAdded(conversation: Conversation) { + sendEvent("onConversationAdded", mapOf( + "sid" to conversation.sid, + "friendlyName" to (conversation.friendlyName ?: conversation.sid) + )) + } + + override fun onConversationUpdated(conversation: Conversation, reason: Conversation.UpdateReason) { + sendEvent("onConversationUpdated", mapOf( + "sid" to conversation.sid, + "friendlyName" to (conversation.friendlyName ?: conversation.sid) + )) + } + + override fun onConversationDeleted(conversation: Conversation) { + sendEvent("onConversationDeleted", mapOf("sid" to conversation.sid)) + } + + // 实现所有必需的接口方法 + override fun onConversationSynchronizationChange(conversation: Conversation) {} + override fun onUserSubscribed(user: User) {} + override fun onUserUnsubscribed(user: User) {} + override fun onUserUpdated(user: User, reason: User.UpdateReason) {} + override fun onNewMessageNotification(conversationSid: String, messageSid: String, messageIndex: Long) {} + override fun onAddedToConversationNotification(conversationSid: String) {} + override fun onRemovedFromConversationNotification(conversationSid: String) {} + override fun onNotificationSubscribed() {} + override fun onNotificationFailed(errorInfo: ErrorInfo) {} + override fun onConnectionStateChange(state: ConversationsClient.ConnectionState) {} + override fun onTokenExpired() {} + override fun onTokenAboutToExpire() {} + }) + + promise.resolve("Twilio Conversations 客户端已成功初始化") + } + + override fun onError(errorInfo: ErrorInfo) { + // 初始化失败 + promise.reject("INITIALIZATION_FAILED", "初始化失败: ${errorInfo.message}", null) + } + }) } catch (e: Exception) { - // 忽略异常 + promise.reject("INITIALIZATION_EXCEPTION", "初始化异常: ${e.message}", e) } } - // 模拟创建对话方法 + // 获取所有对话列表 + AsyncFunction("getConversations") { promise: Promise -> + try { + if (!isInitialized || conversationsClient == null) { + promise.reject("NOT_INITIALIZED", "Twilio Conversations 客户端未初始化", null) + return@AsyncFunction + } + + // 使用 Twilio SDK 6.2.0 兼容的 API 获取对话列表 + conversationsClient!!.getConversations(object : CallbackListener>() { + override fun onSuccess(conversationList: List) { + val conversations = mutableListOf>() + + // 遍历对话列表并转换为可序列化的格式 + for (conversation in conversationList) { + val convData = mapOf( + "sid" to conversation.sid, + "friendlyName" to (conversation.friendlyName ?: conversation.sid), + "dateCreated" to conversation.dateCreated.toString(), + "dateUpdated" to conversation.dateUpdated.toString() + ) + conversations.add(convData) + } + + promise.resolve(conversations) + } + + override fun onError(errorInfo: ErrorInfo) { + promise.reject("GET_CONVERSATIONS_FAILED", "获取对话列表失败: ${errorInfo.message}", null) + } + }) + } catch (e: Exception) { + promise.reject("GET_CONVERSATIONS_EXCEPTION", "获取对话列表异常: ${e.message}", e) + } + } + + // 创建对话方法 AsyncFunction("createConversation") { name: String, promise: Promise -> try { - if (!isInitialized) { + if (!isInitialized || conversationsClient == null) { + promise.reject("NOT_INITIALIZED", "客户端未初始化", null) return@AsyncFunction } if (name.trim().isEmpty()) { + promise.reject("INVALID_NAME", "对话名称不能为空", null) return@AsyncFunction } - // 模拟创建对话延迟 - Thread.sleep(800) + // 使用 Twilio SDK 6.2.0 的兼容 API 创建对话 + conversationsClient!!.createConversation(name, object : CallbackListener() { + override fun onSuccess(conversation: Conversation) { + promise.resolve(mapOf( + "status" to "success", + "friendlyName" to name, + "sid" to conversation.sid + )) + } + + override fun onError(errorInfo: ErrorInfo) { + promise.reject("CREATE_CONVERSATION_ERROR", "创建对话失败: ${errorInfo.message}", null) + } + }) + } catch (e: Exception) { + promise.reject("CREATE_CONVERSATION_EXCEPTION", "创建对话异常: ${e.message}", e) + } + } + + // 获取客户端连接状态 + AsyncFunction("getClientStatus") { promise: Promise -> + try { + if (!isInitialized || conversationsClient == null) { + promise.reject("NOT_INITIALIZED", "Twilio Conversations 客户端未初始化", null) + return@AsyncFunction + } - // 生成随机SID - val newSid = "CH${System.currentTimeMillis()}" + // 使用 Twilio SDK 6.2.0 兼容的 API 获取连接状态 + val connectionState = conversationsClient!!.connectionState + val status = when (connectionState) { + ConversationsClient.ConnectionState.CONNECTING -> "connecting" + ConversationsClient.ConnectionState.CONNECTED -> "connected" + ConversationsClient.ConnectionState.DISCONNECTING -> "disconnecting" + ConversationsClient.ConnectionState.DISCONNECTED -> "disconnected" + ConversationsClient.ConnectionState.ERROR -> "error" + else -> "unknown" + } - // 创建新对话 - val newConversation = mapOf( - "sid" to newSid, - "friendlyName" to name + val result = mapOf( + "status" to status, + "connectionState" to connectionState.toString() ) - // 添加到模拟对话列表 - mockConversations.add(newConversation) - - promise.resolve(newConversation) + promise.resolve(result) } catch (e: Exception) { - // 忽略异常 + promise.reject("GET_CLIENT_STATUS_EXCEPTION", "获取客户端状态异常: ${e.message}", e) + } + } + + // 断开客户端连接 + AsyncFunction("disconnect") { promise: Promise -> + try { + if (!isInitialized || conversationsClient == null) { + promise.resolve("already_disconnected") + return@AsyncFunction + } + + // 断开连接 + conversationsClient!!.shutdown() + isInitialized = false + conversationsClient = null + + promise.resolve("disconnected") + } catch (e: Exception) { + promise.reject("DISCONNECT_EXCEPTION", "断开连接异常: ${e.message}", e) } } diff --git a/modules/my-native-module/expo-module.config.json b/modules/my-native-module/expo-module.config.json index b61a884..15252ac 100644 --- a/modules/my-native-module/expo-module.config.json +++ b/modules/my-native-module/expo-module.config.json @@ -4,12 +4,6 @@ "modules": ["MyNativeModule"] }, "android": { - "gradleAarProjects": [ - { - "name": "twilio-conversations-android", - "aarFilePath": "android/libs/twilio-conversations-android-6.0.4.aar" - } - ], "modules": ["expo.modules.mynativemodule.MyNativeModule"] } } diff --git a/modules/my-native-module/ios/MyNativeModule.swift b/modules/my-native-module/ios/MyNativeModule.swift index 317b9aa..b76ca25 100644 --- a/modules/my-native-module/ios/MyNativeModule.swift +++ b/modules/my-native-module/ios/MyNativeModule.swift @@ -1,41 +1,205 @@ import ExpoModulesCore -public class MyNativeModule: Module { - // Each module class must implement the definition function. The definition consists of components - // that describes the module's functionality and behavior. - // See https://docs.expo.dev/modules/module-api for more details about available components. +// 导入Twilio Conversations SDK +import TwilioConversationsClient + +public class MyNativeModule: Module, TwilioConversationsClientDelegate { + // 存储Twilio客户端实例 + private var conversationsClient: TwilioConversationsClient? + + // 初始化时创建的Promise解析器,用于异步操作 + private var initCompletion: PromiseCompletionBlock? + private var createConversationCompletion: PromiseCompletionBlock? + + // Each module class must implement the definition function. public func definition() -> ModuleDefinition { - // Sets the name of the module that JavaScript code will use to refer to the module. Takes a string as an argument. - // Can be inferred from module's class name, but it's recommended to set it explicitly for clarity. - // The module will be accessible from `requireNativeModule('MyNativeModule')` in JavaScript. + // 设置模块名称 Name("MyNativeModule") - // Defines constant property on the module. + // 定义常量 Constant("PI") { Double.pi } - // Defines event names that the module can send to JavaScript. - Events("onChange") + // 定义模块可以发送到JavaScript的事件 + Events( + "onChange", + "onClientSynchronized", + "onClientError", + "onConnectionStateChanged", + "onConversationAdded", + "onConversationUpdated", + "onConversationDeleted", + "onMessageAdded", + "onMessageUpdated", + "onMessageDeleted", + "onParticipantAdded", + "onParticipantUpdated", + "onParticipantDeleted" + ) - // Defines a JavaScript synchronous function that runs the native code on the JavaScript thread. + // 同步函数 Function("hello") { return "Hello world! 👋" } - // Defines a JavaScript function that always returns a Promise and whose native code - // is by default dispatched on the different thread than the JavaScript runtime runs on. + // 原有异步函数 AsyncFunction("setValueAsync") { (value: String) in // Send an event to JavaScript. self.sendEvent("onChange", [ "value": value ]) } + + // Twilio Conversations 客户端初始化 + AsyncFunction("initialize") { (token: String, completion: @escaping PromiseCompletionBlock) -> Void in + if token.isEmpty { + completion(["error": "Token cannot be empty"]) + return + } + + // 保存完成回调 + self.initCompletion = completion + + // 创建Twilio客户端实例 + TwilioConversationsClient.conversationsClient(withToken: token, properties: nil, delegate: self) { + result, error in + + if let error = error { + self.sendEvent("onClientError", ["error": error.localizedDescription]) + self.initCompletion?(nil, error) + return + } + + if let client = result { + self.conversationsClient = client + + // 发送成功消息 + self.initCompletion?("Twilio Conversations 客户端已成功初始化", nil) + } else { + self.initCompletion?(["error": "Failed to initialize client"]) + } + } + } + + // 获取所有对话列表 + AsyncFunction("getConversations") { (completion: @escaping PromiseCompletionBlock) -> Void in + guard let client = self.conversationsClient else { + completion(["error": "客户端未初始化"]) + return + } + + // 获取对话列表 + client.conversations() { result, error in + if let error = error { + completion(nil, error) + return + } + + if let conversations = result { + // 转换为JS友好的格式 + let jsConversations = conversations.map { conversation -> [String: Any] in + var conversationDict: [String: Any] = [ + "sid": conversation.sid, + "friendlyName": conversation.friendlyName ?? "未命名对话" + ] + + // 添加时间戳信息(如果可用) + if let dateCreated = conversation.dateCreated { + conversationDict["dateCreated"] = Int(dateCreated.timeIntervalSince1970 * 1000) + } + if let dateUpdated = conversation.dateUpdated { + conversationDict["dateUpdated"] = Int(dateUpdated.timeIntervalSince1970 * 1000) + } + + return conversationDict + } + + completion(jsConversations, nil) + } else { + completion([], nil) + } + } + } + + // 创建新对话 + AsyncFunction("createConversation") { (friendlyName: String, completion: @escaping PromiseCompletionBlock) -> Void in + guard let client = self.conversationsClient else { + completion(["error": "客户端未初始化"]) + return + } + + if friendlyName.isEmpty { + completion(["error": "对话名称不能为空"]) + return + } + + // 保存完成回调 + self.createConversationCompletion = completion + + // 创建对话 + client.createConversation(options: ["friendlyName": friendlyName]) { result, error in + if let error = error { + completion(nil, error) + return + } + + if let conversation = result { + // 返回创建状态和名称 + completion(["status": "creating", "friendlyName": conversation.friendlyName ?? friendlyName], nil) + + // 发送事件通知 + self.sendEvent("onConversationAdded", [ + "sid": conversation.sid, + "friendlyName": conversation.friendlyName ?? friendlyName + ]) + } else { + completion(["error": "创建对话失败"]) + } + } + } + + // 获取客户端状态 + AsyncFunction("getClientStatus") { (completion: @escaping PromiseCompletionBlock) -> Void in + guard let client = self.conversationsClient else { + completion("not_initialized") + return + } + + // 根据连接状态返回相应的状态字符串 + switch client.connectionState { + case .connecting: + completion("connecting") + case .connected: + completion("connected") + case .disconnected: + completion("disconnected") + case .denied: + completion("denied") + case .error: + completion("error") + @unknown default: + completion("unknown") + } + } + + // 断开客户端连接 + AsyncFunction("disconnect") { (completion: @escaping PromiseCompletionBlock) -> Void in + guard let client = self.conversationsClient else { + completion("already_disconnected") + return + } + + // 断开连接 + client.shutdown() + self.conversationsClient = nil + + completion("disconnected") + } - // Enables the module to be used as a native view. Definition components that are accepted as part of the - // view definition: Prop, Events. + // 原生视图定义 View(MyNativeModuleView.self) { - // Defines a setter for the `url` prop. + // 定义url属性的setter Prop("url") { (view: MyNativeModuleView, url: URL) in if view.webView.url != url { view.webView.load(URLRequest(url: url)) @@ -45,4 +209,121 @@ public class MyNativeModule: Module { Events("onLoad") } } + + // MARK: - TwilioConversationsClientDelegate方法 + + // 客户端同步完成 + public func conversationsClientDidSynchronize(_ client: TwilioConversationsClient) { + sendEvent("onClientSynchronized", ["status": "synchronized"]) + } + + // 客户端连接状态变化 + public func conversationsClient(_ client: TwilioConversationsClient, connectionStateChanged state: TwilioConversationsClient.ConnectionState) { + var stateString: String + + switch state { + case .connecting: + stateString = "connecting" + case .connected: + stateString = "connected" + case .disconnected: + stateString = "disconnected" + case .denied: + stateString = "denied" + case .error: + stateString = "error" + @unknown default: + stateString = "unknown" + } + + sendEvent("onConnectionStateChanged", ["state": stateString]) + } + + // 对话添加 + public func conversationsClient(_ client: TwilioConversationsClient, conversationAdded conversation: TCHConversation) { + sendEvent("onConversationAdded", [ + "sid": conversation.sid, + "friendlyName": conversation.friendlyName ?? "未命名对话" + ]) + } + + // 对话更新 + public func conversationsClient(_ client: TwilioConversationsClient, conversationUpdated conversation: TCHConversation) { + sendEvent("onConversationUpdated", [ + "sid": conversation.sid, + "friendlyName": conversation.friendlyName ?? "未命名对话" + ]) + } + + // 对话删除 + public func conversationsClient(_ client: TwilioConversationsClient, conversationDeleted conversation: TCHConversation) { + sendEvent("onConversationDeleted", ["sid": conversation.sid]) + } + + // 消息添加 + public func conversationsClient(_ client: TwilioConversationsClient, conversation: TCHConversation, messageAdded message: TCHMessage) { + sendEvent("onMessageAdded", [ + "conversationSid": conversation.sid, + "messageSid": message.sid + ]) + } + + // 消息更新 + public func conversationsClient(_ client: TwilioConversationsClient, conversation: TCHConversation, messageUpdated message: TCHMessage) { + sendEvent("onMessageUpdated", [ + "conversationSid": conversation.sid, + "messageSid": message.sid + ]) + } + + // 消息删除 + public func conversationsClient(_ client: TwilioConversationsClient, conversation: TCHConversation, messageDeleted message: TCHMessage) { + sendEvent("onMessageDeleted", [ + "conversationSid": conversation.sid, + "messageSid": message.sid + ]) + } + + // 参与者添加 + public func conversationsClient(_ client: TwilioConversationsClient, conversation: TCHConversation, participantAdded participant: TCHParticipant) { + sendEvent("onParticipantAdded", [ + "conversationSid": conversation.sid, + "participantIdentity": participant.identity ?? "" + ]) + } + + // 参与者更新 + public func conversationsClient(_ client: TwilioConversationsClient, conversation: TCHConversation, participantUpdated participant: TCHParticipant) { + sendEvent("onParticipantUpdated", [ + "conversationSid": conversation.sid, + "participantIdentity": participant.identity ?? "" + ]) + } + + // 参与者删除 + public func conversationsClient(_ client: TwilioConversationsClient, conversation: TCHConversation, participantDeleted participant: TCHParticipant) { + sendEvent("onParticipantDeleted", [ + "conversationSid": conversation.sid, + "participantIdentity": participant.identity ?? "" + ]) + } + + // 客户端错误 + public func conversationsClient(_ client: TwilioConversationsClient, synchronizationStatusChanged status: TCHClientSynchronizationStatus) { + // 同步状态变化事件处理 + var statusString: String + + switch status { + case .started: + statusString = "started" + case .completed: + statusString = "completed" + case .failed: + statusString = "failed" + @unknown default: + statusString = "unknown" + } + + sendEvent("onClientSynchronized", ["status": statusString]) + } } diff --git a/modules/my-native-module/src/MyNativeModule.ts b/modules/my-native-module/src/MyNativeModule.ts index 708e59a..4a197ff 100644 --- a/modules/my-native-module/src/MyNativeModule.ts +++ b/modules/my-native-module/src/MyNativeModule.ts @@ -1,6 +1,6 @@ import { NativeModule, requireNativeModule } from 'expo'; -import { MyNativeModuleEvents, ConversationOptions, Conversation, TwilioConversationsOptions } from './MyNativeModule.types'; +import { MyNativeModuleEvents, ConversationOptions, Conversation, TwilioConversationsOptions, CreateConversationResponse, ClientStatus } from './MyNativeModule.types'; declare class MyNativeModule extends NativeModule { PI: number; @@ -11,19 +11,34 @@ declare class MyNativeModule extends NativeModule { /** * 初始化Twilio Conversations客户端 * @param token Twilio访问令牌 + * @returns 初始化结果消息 */ - initialize(token: string): Promise<{ status: string }>; + initialize(token: string): Promise; /** * 创建新对话 * @param friendlyName 对话的友好名称 + * @returns 创建对话的响应对象 */ - createConversation(friendlyName: string): Promise; + createConversation(friendlyName: string): Promise; /** * 获取所有对话 + * @returns 对话列表 */ getConversations(): Promise; + + /** + * 获取客户端连接状态 + * @returns 客户端状态 + */ + getClientStatus(): Promise; + + /** + * 断开客户端连接 + * @returns 断开连接结果 + */ + disconnect(): Promise; } // This call loads the native module object from the JSI. diff --git a/modules/my-native-module/src/MyNativeModule.types.ts b/modules/my-native-module/src/MyNativeModule.types.ts index f31d7dd..9fd140c 100644 --- a/modules/my-native-module/src/MyNativeModule.types.ts +++ b/modules/my-native-module/src/MyNativeModule.types.ts @@ -4,8 +4,46 @@ export type OnLoadEventPayload = { url: string; }; +// Twilio Conversations相关事件类型 export type MyNativeModuleEvents = { onChange: (params: ChangeEventPayload) => void; + onClientSynchronized: (params: { status: string }) => void; + onClientFailed: (params: { errorCode: number; errorMessage: string }) => void; + onConversationAdded: (params: { sid: string; friendlyName: string }) => void; + onConversationUpdated: (params: { sid: string; friendlyName: string }) => void; + onConversationDeleted: (params: { sid: string }) => void; + onNotificationNewMessage: (params: { + conversationSid: string; + messageSid: string; + author: string; + body: string; + }) => void; + onNotificationAddedToConversation: (params: { + sid: string; + friendlyName: string; + }) => void; + onNotificationRemovedFromConversation: (params: { + sid: string; + friendlyName: string; + }) => void; + onNotificationInvitedToConversation: (params: { + sid: string; + friendlyName: string; + }) => void; + onNotificationParticipantJoined: (params: { + conversationSid: string; + participantSid: string; + identity: string; + }) => void; + onNotificationParticipantLeft: (params: { + conversationSid: string; + participantSid: string; + identity: string; + }) => void; + onUserUpdated: (params: { + identity: string; + friendlyName: string; + }) => void; }; export type ChangeEventPayload = { @@ -26,8 +64,17 @@ export interface ConversationOptions { export interface Conversation { sid: string; friendlyName: string; + dateCreated?: number; + dateUpdated?: number; } +export interface CreateConversationResponse { + status: string; + friendlyName: string; +} + +export type ClientStatus = 'connected' | 'connecting' | 'disconnected' | 'disconnecting' | 'not_initialized' | 'unknown'; + export interface TwilioConversationsOptions { // 未来可能的配置选项 } diff --git a/modules/my-native-module/src/MyNativeModule.web.ts b/modules/my-native-module/src/MyNativeModule.web.ts index d6fe3e8..c67eab4 100644 --- a/modules/my-native-module/src/MyNativeModule.web.ts +++ b/modules/my-native-module/src/MyNativeModule.web.ts @@ -1,19 +1,109 @@ import { registerWebModule, NativeModule } from 'expo'; -import { ChangeEventPayload } from './MyNativeModule.types'; - -type MyNativeModuleEvents = { - onChange: (params: ChangeEventPayload) => void; -} +import { MyNativeModuleEvents, Conversation, CreateConversationResponse, ClientStatus } from './MyNativeModule.types'; class MyNativeModule extends NativeModule { PI = Math.PI; + private isInitialized = false; + private mockConversations: Conversation[] = []; + async setValueAsync(value: string): Promise { this.emit('onChange', { value }); } + hello() { return 'Hello world! 👋'; } + + // Twilio Conversations相关方法的Web模拟实现 + async initialize(token: string): Promise { + if (!token || token.trim() === '') { + throw new Error('Token cannot be empty'); + } + + // 模拟初始化延迟 + await new Promise(resolve => setTimeout(resolve, 1000)); + + // 模拟初始化成功 + this.isInitialized = true; + + // 添加一些模拟对话 + this.mockConversations = [ + { sid: 'CH001', friendlyName: '示例对话1', dateCreated: Date.now() - 86400000, dateUpdated: Date.now() - 3600000 }, + { sid: 'CH002', friendlyName: '示例对话2', dateCreated: Date.now() - 172800000, dateUpdated: Date.now() - 7200000 } + ]; + + // 模拟事件 + setTimeout(() => { + this.emit('onClientSynchronized', { status: 'synchronized' }); + }, 500); + + return 'Twilio Conversations 客户端已成功初始化'; + } + + async createConversation(friendlyName: string): Promise { + if (!this.isInitialized) { + throw new Error('客户端未初始化'); + } + + if (!friendlyName || friendlyName.trim() === '') { + throw new Error('对话名称不能为空'); + } + + // 模拟创建对话延迟 + await new Promise(resolve => setTimeout(resolve, 800)); + + // 模拟创建对话 + const newConversation: Conversation = { + sid: `CH${Date.now()}`, + friendlyName, + dateCreated: Date.now(), + dateUpdated: Date.now() + }; + + // 添加到模拟对话列表 + this.mockConversations.push(newConversation); + + // 模拟事件 + setTimeout(() => { + this.emit('onConversationAdded', { + sid: newConversation.sid, + friendlyName: newConversation.friendlyName + }); + }, 300); + + return { status: 'creating', friendlyName }; + } + + async getConversations(): Promise { + if (!this.isInitialized) { + throw new Error('客户端未初始化'); + } + + // 模拟获取对话延迟 + await new Promise(resolve => setTimeout(resolve, 500)); + + return [...this.mockConversations]; + } + + async getClientStatus(): Promise { + if (!this.isInitialized) { + return 'not_initialized'; + } + + return 'connected'; + } + + async disconnect(): Promise { + if (!this.isInitialized) { + return 'already_disconnected'; + } + + this.isInitialized = false; + this.mockConversations = []; + + return 'disconnected'; + } }; export default registerWebModule(MyNativeModule, 'MyNativeModule'); diff --git a/package-lock.json b/package-lock.json index 7e81e04..ef7b230 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,9 @@ "expo-status-bar": "~3.0.8", "my-native-module": "file:./modules/my-native-module", "react": "19.1.0", - "react-native": "0.81.5" + "react-dom": "19.1.0", + "react-native": "0.81.5", + "react-native-web": "^0.21.0" }, "devDependencies": { "@types/react": "~19.1.0", @@ -4197,6 +4199,15 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -4220,6 +4231,15 @@ "node": ">=8" } }, + "node_modules/css-in-js-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", + "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==", + "license": "MIT", + "dependencies": { + "hyphenate-style-name": "^1.0.3" + } + }, "node_modules/csstype": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.2.tgz", @@ -5103,6 +5123,36 @@ "bser": "2.1.1" } }, + "node_modules/fbjs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", + "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", + "license": "MIT", + "dependencies": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^1.0.35" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", + "license": "MIT" + }, + "node_modules/fbjs/node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "license": "MIT", + "dependencies": { + "asap": "~2.0.3" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -5402,6 +5452,12 @@ "node": ">= 14" } }, + "node_modules/hyphenate-style-name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", + "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", + "license": "BSD-3-Clause" + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -5478,6 +5534,15 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "license": "ISC" }, + "node_modules/inline-style-prefixer": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-7.0.1.tgz", + "integrity": "sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==", + "license": "MIT", + "dependencies": { + "css-in-js-utils": "^3.1.0" + } + }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -6973,6 +7038,26 @@ "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", "license": "MIT" }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -7352,6 +7437,12 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -7499,6 +7590,18 @@ "ws": "^7" } }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -7572,6 +7675,38 @@ "react-native": "*" } }, + "node_modules/react-native-web": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.21.2.tgz", + "integrity": "sha512-SO2t9/17zM4iEnFvlu2DA9jqNbzNhoUP+AItkoCOyFmDMOhUnBBznBDCYN92fGdfAkfQlWzPoez6+zLxFNsZEg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.6", + "@react-native/normalize-colors": "^0.74.1", + "fbjs": "^3.0.4", + "inline-style-prefixer": "^7.0.1", + "memoize-one": "^6.0.0", + "nullthrows": "^1.1.1", + "postcss-value-parser": "^4.2.0", + "styleq": "^0.1.3" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-native-web/node_modules/@react-native/normalize-colors": { + "version": "0.74.89", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.89.tgz", + "integrity": "sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg==", + "license": "MIT" + }, + "node_modules/react-native-web/node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, "node_modules/react-native/node_modules/@react-native/virtualized-lists": { "version": "0.81.5", "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.81.5.tgz", @@ -8035,6 +8170,12 @@ "node": ">= 0.8" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -8326,6 +8467,12 @@ "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", "license": "MIT" }, + "node_modules/styleq": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/styleq/-/styleq-0.1.3.tgz", + "integrity": "sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA==", + "license": "MIT" + }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", @@ -8600,6 +8747,12 @@ "node": ">=0.6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -8638,6 +8791,32 @@ "node": ">=14.17" } }, + "node_modules/ua-parser-js": { + "version": "1.0.41", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz", + "integrity": "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/undici": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz", @@ -8819,6 +8998,16 @@ "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", "license": "MIT" }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/whatwg-url-without-unicode": { "version": "8.0.0-3", "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", @@ -8833,6 +9022,12 @@ "node": ">=10" } }, + "node_modules/whatwg-url/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index c38f1b4..a6d563d 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,9 @@ "expo-status-bar": "~3.0.8", "my-native-module": "file:./modules/my-native-module", "react": "19.1.0", - "react-native": "0.81.5" + "react-dom": "19.1.0", + "react-native": "0.81.5", + "react-native-web": "^0.21.0" }, "devDependencies": { "@types/react": "~19.1.0",