From 35acc240abb9dc03edf8137db2c8436b88256448 Mon Sep 17 00:00:00 2001 From: xuqm Date: Mon, 1 Sep 2025 16:49:47 +0800 Subject: [PATCH] =?UTF-8?q?feat(app):=20=E6=96=B0=E5=A2=9E=E9=A6=96?= =?UTF-8?q?=E9=A1=B5=E8=BD=AE=E6=92=AD=E5=9B=BE=E5=92=8C=E6=96=87=E7=AB=A0?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加首页轮播图组件和相关 API - 实现文章详情页面和相关 API - 更新底部导航栏,支持工作台、推荐和我的三个标签页 - 移除 react-native-copilot 依赖- 调整主栈路由,支持新功能 --- android/gradle.properties | 2 +- babel.config.js | 1 + bundle/android/common/common.android.bundle | 2 +- package.json | 7 +- src/app/hooks/useLogout.ts | 6 - src/app/routes/MainParamList.ts | 34 + src/app/routes/MainStack.tsx | 28 +- src/app/routes/MainTab.tsx | 175 +++++ src/app/screens/api/index.ts | 1 + src/app/screens/api/useBannerList.ts | 44 ++ src/app/screens/components/HomeCarousel.tsx | 98 +++ .../articleDetail/ArticleDetailScreen.tsx | 326 ++++++++ .../screens/home/articleDetail/api/index.ts | 1 + .../articleDetail/api/useArticleDetail.tsx | 29 + .../home/articleShare/ArticleShareScreen.tsx | 154 ++++ src/app/screens/home/home/HomeScreen.tsx | 604 +++++++++++++++ src/app/screens/home/home/api/index.ts | 8 + .../home/home/api/useArticleCategory.ts | 39 + .../screens/home/home/api/useArticleList.ts | 33 + .../home/home/api/useArticleListByCategory.ts | 33 + src/app/screens/home/home/api/useBadgeNum.ts | 24 + .../screens/home/home/api/useFeatureList.ts | 33 + .../screens/home/home/api/useNoticeList.ts | 25 + .../home/home/api/useSubServerCheck.ts | 68 ++ .../screens/home/home/api/useUnreadRemind.ts | 22 + .../home/home/components/HeaderRight.tsx | 69 ++ .../home/home/components/HomeArticleItem.tsx | 87 +++ .../home/home/components/HomeArticlesView.tsx | 174 +++++ .../home/home/components/HomeBulletin.tsx | 87 +++ .../home/home/components/HomeFeaturesView.tsx | 148 ++++ .../home/home/components/HomeTodoView.tsx | 181 +++++ .../home/home/components/HomeTopView.tsx | 155 ++++ .../hooks/useHandleClickBannerListItem.ts | 49 ++ .../hooks/useHandleClickFeatureListItem.tsx | 61 ++ .../home/home/hooks/useHandleUnreadRemind.ts | 80 ++ .../contactSupport/ContactSupportScreen.tsx | 147 ++++ .../screens/mine/contactSupport/api/index.ts | 1 + .../contactSupport/api/useCustomrConfig.ts | 18 + src/app/screens/mine/mine/MineScreen.tsx | 400 ++++++++++ .../mine/mine/components/FeatureButton.tsx | 82 ++ .../assets/images}/common_list_empty.png | Bin .../assets/images}/common_list_empty@2x.png | Bin .../assets/images}/common_list_empty@3x.png | Bin src/common/common.ts | 6 +- src/common/components/DataEmpty.tsx | 58 ++ src/common/components/ListEmpty.tsx | 40 + src/common/components/Separator.tsx | 18 + src/common/components/TabBarIcon.tsx | 60 ++ src/common/router/CommonParamList.ts | 12 +- src/common/screens/scan/ScanScreen.tsx | 28 + yarn.lock | 719 +++++++----------- 51 files changed, 4005 insertions(+), 472 deletions(-) create mode 100644 src/app/routes/MainTab.tsx create mode 100644 src/app/screens/api/index.ts create mode 100644 src/app/screens/api/useBannerList.ts create mode 100644 src/app/screens/components/HomeCarousel.tsx create mode 100644 src/app/screens/home/articleDetail/ArticleDetailScreen.tsx create mode 100644 src/app/screens/home/articleDetail/api/index.ts create mode 100644 src/app/screens/home/articleDetail/api/useArticleDetail.tsx create mode 100644 src/app/screens/home/articleShare/ArticleShareScreen.tsx create mode 100644 src/app/screens/home/home/HomeScreen.tsx create mode 100644 src/app/screens/home/home/api/index.ts create mode 100644 src/app/screens/home/home/api/useArticleCategory.ts create mode 100644 src/app/screens/home/home/api/useArticleList.ts create mode 100644 src/app/screens/home/home/api/useArticleListByCategory.ts create mode 100644 src/app/screens/home/home/api/useBadgeNum.ts create mode 100644 src/app/screens/home/home/api/useFeatureList.ts create mode 100644 src/app/screens/home/home/api/useNoticeList.ts create mode 100644 src/app/screens/home/home/api/useSubServerCheck.ts create mode 100644 src/app/screens/home/home/api/useUnreadRemind.ts create mode 100644 src/app/screens/home/home/components/HeaderRight.tsx create mode 100644 src/app/screens/home/home/components/HomeArticleItem.tsx create mode 100644 src/app/screens/home/home/components/HomeArticlesView.tsx create mode 100644 src/app/screens/home/home/components/HomeBulletin.tsx create mode 100644 src/app/screens/home/home/components/HomeFeaturesView.tsx create mode 100644 src/app/screens/home/home/components/HomeTodoView.tsx create mode 100644 src/app/screens/home/home/components/HomeTopView.tsx create mode 100644 src/app/screens/home/home/hooks/useHandleClickBannerListItem.ts create mode 100644 src/app/screens/home/home/hooks/useHandleClickFeatureListItem.tsx create mode 100644 src/app/screens/home/home/hooks/useHandleUnreadRemind.ts create mode 100644 src/app/screens/mine/contactSupport/ContactSupportScreen.tsx create mode 100644 src/app/screens/mine/contactSupport/api/index.ts create mode 100644 src/app/screens/mine/contactSupport/api/useCustomrConfig.ts create mode 100644 src/app/screens/mine/mine/MineScreen.tsx create mode 100644 src/app/screens/mine/mine/components/FeatureButton.tsx rename src/{app/assets/images/common => common/assets/images}/common_list_empty.png (100%) rename src/{app/assets/images/common => common/assets/images}/common_list_empty@2x.png (100%) rename src/{app/assets/images/common => common/assets/images}/common_list_empty@3x.png (100%) create mode 100644 src/common/components/DataEmpty.tsx create mode 100644 src/common/components/ListEmpty.tsx create mode 100644 src/common/components/Separator.tsx create mode 100644 src/common/components/TabBarIcon.tsx create mode 100644 src/common/screens/scan/ScanScreen.tsx diff --git a/android/gradle.properties b/android/gradle.properties index 50fab52..74f1c6c 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -37,4 +37,4 @@ newArchEnabled=true # Use this property to enable or disable the Hermes JS engine. # If set to false, you will be using JSC instead. hermesEnabled=true -#org.gradle.configuration-cache=true \ No newline at end of file +#org.gradle.configuration-cache=true diff --git a/babel.config.js b/babel.config.js index ff95ada..c7e6ea9 100644 --- a/babel.config.js +++ b/babel.config.js @@ -14,5 +14,6 @@ module.exports = { }, }, ], + 'react-native-worklets/plugin', ], }; diff --git a/bundle/android/common/common.android.bundle b/bundle/android/common/common.android.bundle index 486d3d1..cdc208c 100644 --- a/bundle/android/common/common.android.bundle +++ b/bundle/android/common/common.android.bundle @@ -3828,7 +3828,7 @@ __d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{ __d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.zipWithPassword=e.zip=e.unzipWithPassword=e.unzipAssets=e.unzip=e.subscribe=e.isPasswordProtected=e.getUncompressedSize=void 0;var s=t(r(d[1])),n=s.default.NativeEventEmitter,o=s.default.NativeModules.RNZipArchive,u=new n(o),p=function(t){return t.startsWith("file://")?t.slice(7):t};e.unzip=function(t,s){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"UTF-8";return o.unzip(p(t),p(s),n)},e.isPasswordProtected=function(t){return o.isPasswordProtected(p(t)).then(function(t){return!!t})},e.unzipWithPassword=function(t,s,n){return o.unzipWithPassword(p(t),p(s),n)},e.zipWithPassword=function(t,s,n){var u=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";return Array.isArray(t)?o.zipFilesWithPassword(t.map(p),p(s),n,u):o.zipFolderWithPassword(p(t),p(s),n,u)},e.zip=function(t,s){return Array.isArray(t)?o.zipFiles(t.map(p),p(s)):o.zipFolder(p(t),p(s))},e.unzipAssets=function(t,s){if(!o.unzipAssets)throw new Error("unzipAssets not supported on this platform");return o.unzipAssets(p(t),p(s))},e.subscribe=function(t){return u.addListener("zipArchiveProgressEvent",t)},e.getUncompressedSize=function(t){var s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"UTF-8";return o.getUncompressedSize(p(t),s)}},3737,[1,2]); __d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.getDataFromName=e.NavigationPushByName=e.NavigationPop=e.Apps=void 0;var n=t(r(d[1]));e.Apps=(function(t){return t.App="app",t.Hospital="hospital",t.Ywq="ywq",t})({}),e.NavigationPushByName=function(t,o){(0,r(d[2]).saveItem)(`MessageActivity-${t}`,o).finally(function(){n.default.navigate(t)})},e.NavigationPop=function(){n.default.pop()},e.getDataFromName=function(t){return(0,r(d[2]).getItem)(`MessageActivity-${t}`)}},3738,[1,3739,523]); __d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var o=r(d[0]);e.default=o.TurboModuleRegistry.getEnforcing('NavigationManager')},3739,[2]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.version_common=e.version_code=void 0,r(d[0]),r(d[1]),r(d[2]),r(d[3]),r(d[4]),r(d[5]),r(d[6]),r(d[7]),r(d[8]),r(d[9]),r(d[10]),r(d[11]),r(d[12]),r(d[13]),r(d[14]),r(d[15]),r(d[16]),r(d[17]),r(d[18]),r(d[19]),r(d[20]),r(d[21]),r(d[22]);e.version_common='1.0.0',e.version_code=1},3740,[71,2,3377,3627,3616,3733,548,3738,3736,3371,3511,3741,3492,3501,3742,3370,3608,522,556,521,555,547,3743]); +__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.version_common=e.version_code=void 0,r(d[0]),r(d[1]),r(d[2]),r(d[3]),r(d[4]),r(d[5]),r(d[6]),r(d[7]),r(d[8]),r(d[9]),r(d[10]),r(d[11]),r(d[12]),r(d[13]),r(d[14]),r(d[15]),r(d[16]),r(d[17]),r(d[18]),r(d[19]),r(d[20]),r(d[21]),r(d[22]),r(d[23]),r(d[24]),r(d[25]);e.version_common='1.0.0',e.version_code=1},3740,[71,2,3377,3627,3616,3733,548,3738,3736,3371,3511,3741,3492,3501,3742,3370,3608,522,556,521,555,532,534,533,547,3743]); __d(function(g,_r,_i,a,m,_e,d){var t=_r(d[0]);Object.defineProperty(_e,"__esModule",{value:!0}),_e.default=void 0;var e=t(_r(d[1])),n=t(_r(d[2])),o=t(_r(d[3])),i=t(_r(d[4])),r=t(_r(d[5])),s=(function(t,e){if("function"==typeof WeakMap)var n=new WeakMap,o=new WeakMap;return(function(t,e){if(!e&&t&&t.__esModule)return t;var i,r,s={__proto__:null,default:t};if(null===t||"object"!=typeof t&&"function"!=typeof t)return s;if(i=e?o:n){if(i.has(t))return i.get(t);i.set(t,s)}for(var l in t)"default"!==l&&{}.hasOwnProperty.call(t,l)&&((r=(i=Object.defineProperty)&&Object.getOwnPropertyDescriptor(t,l))&&(r.get||r.set)?i(s,l,r):s[l]=t[l]);return s})(t,e)})(_r(d[6])),l=_r(d[7]),u=_r(d[8]);function c(t,e,n){return e=(0,i.default)(e),(0,o.default)(t,p()?Reflect.construct(e,n||[],(0,i.default)(t).constructor):e.apply(t,n))}function p(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(p=function(){return!!t})()}var h=300,f=(function(t){function o(t){var n;return(0,e.default)(this,o),(n=c(this,o,[t])).contentHeight=0,n.backAction=function(){return!0},n.state={backgroundOpacity:new l.Animated.Value(0),top:new l.Animated.Value(0),bottom:new l.Animated.Value(0),contentOpacity:new l.Animated.Value(0)},n}return(0,r.default)(o,t),(0,n.default)(o,[{key:"componentDidMount",value:function(){this.backHandler=l.BackHandler.addEventListener('hardwareBackPress',this.backAction)}},{key:"componentWillUnmount",value:function(){var t;null==(t=this.backHandler)||t.remove()}},{key:"show",value:function(){var t,e,n,o,i,r,s,u,c,p,f,v,y,b,k=this;l.Animated.parallel([l.Animated.timing(this.state.backgroundOpacity,{toValue:null!=(t=null==(e=this.props.options)?void 0:e.backgroundOpacity)?t:.2,duration:null!=(n=null==(o=this.props.options)?void 0:o.duration)?n:h,useNativeDriver:!1}),'top'===this.props.type?l.Animated.timing(this.state.top,{toValue:null!=(i=null==(r=this.props.options)?void 0:r.verticalOffset)?i:0,duration:null!=(s=null==(u=this.props.options)?void 0:u.duration)?s:h,useNativeDriver:!1}):'bottom'===this.props.type?l.Animated.timing(this.state.bottom,{toValue:-(null!=(c=null==(p=this.props.options)?void 0:p.verticalOffset)?c:0),duration:null!=(f=null==(v=this.props.options)?void 0:v.duration)?f:h,useNativeDriver:!1}):l.Animated.timing(this.state.contentOpacity,{toValue:1,duration:null!=(y=null==(b=this.props.options)?void 0:b.duration)?y:h,useNativeDriver:!1})]).start(function(t){t&&k.props.onShown&&k.props.onShown()})}},{key:"hide",value:function(t){var e,n;l.Animated.parallel([l.Animated.timing(this.state.backgroundOpacity,{toValue:0,duration:null!=(e=null==(n=this.props.options)?void 0:n.duration)?e:h,useNativeDriver:!1}),'top'===this.props.type?l.Animated.timing(this.state.top,{toValue:-this.contentHeight,duration:h,useNativeDriver:!1}):'bottom'===this.props.type?l.Animated.timing(this.state.bottom,{toValue:-this.contentHeight,duration:h,useNativeDriver:!1}):l.Animated.timing(this.state.contentOpacity,{toValue:0,duration:h,useNativeDriver:!1})]).start(function(e){e&&t&&t()})}},{key:"onLayout",value:function(t){var e=t.nativeEvent.layout.height;e>0&&0===this.contentHeight&&(this.contentHeight=e,this.state.top.setValue(-e),this.state.bottom.setValue(-e),this.show())}},{key:"render",value:function(){var t,e,n,o,i=this;return(0,u.jsxs)(l.View,{style:'alert'===this.props.type?v.containerAlert:v.container,children:[(0,u.jsx)(l.Animated.View,{style:[v.background,{opacity:this.state.backgroundOpacity,backgroundColor:null!=(t=null==(e=this.props.options)?void 0:e.backgroundColor)?t:"#000000"}],children:(0,u.jsx)(l.TouchableOpacity,{style:v.backgroundTouch,onPress:function(){i.props.onPressBackground&&i.props.onPressBackground()}})}),(0,u.jsx)(l.Animated.View,{style:'top'===this.props.type?[v.content,{top:this.state.top}]:'bottom'===this.props.type?[v.content,{bottom:this.state.bottom}]:[v.contentAlert,{opacity:this.state.contentOpacity,top:null!=(n=null==(o=this.props.options)?void 0:o.verticalOffset)?n:0}],onLayout:this.onLayout.bind(this),children:this.props.content})]})}}])})(s.Component),v=l.StyleSheet.create({container:{position:'absolute',left:0,right:0,top:0,bottom:0},containerAlert:{position:'absolute',left:0,right:0,top:0,bottom:0,justifyContent:'center',alignItems:'center'},background:{position:'absolute',left:0,right:0,top:0,bottom:0},backgroundTouch:{flex:1},content:{position:'absolute',left:0,right:0},contentAlert:{justifyContent:'center',alignItems:'center'}}),y=(function(t){function o(t){var n;return(0,e.default)(this,o),(n=c(this,o,[t])).popupRef=s.default.createRef(),n.state={items:void 0,title:void 0,onSelected:void 0},n}return(0,r.default)(o,t),(0,n.default)(o,[{key:"show",value:function(t,e,n){var o=this;this.state.title?this.hide(function(){o.show(t,e,n)}):this.setState({items:t,title:e,onSelected:n})}},{key:"hide",value:function(t){var e,n=this;this.state.items&&(null==(e=this.popupRef.current)||e.hide(function(){n.setState({items:void 0,title:void 0},function(){t&&t()})}))}},{key:"render",value:function(){var t=this;return(0,u.jsx)(u.Fragment,{children:this.state.items&&(0,u.jsx)(f,{ref:this.popupRef,content:(0,u.jsxs)(_r(d[9]).SafeAreaView,{style:b.content,edges:['bottom'],children:[this.state.title&&(0,u.jsx)(l.View,{style:b.title,children:(0,u.jsx)(l.Text,{style:b.titleText,children:this.state.title})}),this.state.items.map(function(e,n){return(0,u.jsx)(l.TouchableOpacity,{style:b.item,onPress:function(){t.hide(function(){t.state.onSelected&&t.state.onSelected(e)})},children:(0,u.jsx)(l.Text,{style:b.itemText,children:e.text})},n)}),(0,u.jsx)(l.TouchableOpacity,{style:b.cancel,onPress:function(){t.hide()},children:(0,u.jsx)(l.Text,{style:b.cancelText,children:"\u53d6\u6d88"})})]}),type:'bottom',options:{},onPressBackground:function(){t.hide()}})})}}],[{key:"setRef",value:function(t){o._ref=t}},{key:"show",value:function(t,e,n){o._ref&&o._ref.show(t,e,n)}},{key:"hide",value:function(t){o._ref&&o._ref.hide(t)}}])})(s.Component);y._ref=null;var b=l.StyleSheet.create({content:{backgroundColor:'#F2F2F2'},title:{backgroundColor:'#FFFFFF',height:50,alignItems:'center',justifyContent:'center'},titleText:{fontSize:16,color:'#222222',fontWeight:'500'},item:{backgroundColor:'#FFFFFF',height:50,alignItems:'center',justifyContent:'center',marginTop:.5},itemText:{fontSize:14,color:'#333333',fontWeight:'400'},cancel:{backgroundColor:'#FFFFFF',height:50,alignItems:'center',justifyContent:'center',marginTop:6},cancelText:{fontSize:14,color:'#666666',fontWeight:'400'}});_e.default=y},3741,[1,11,12,18,20,23,71,2,243,3527]); __d(function(g,r,_i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.debounce=e.compareVersions=void 0;e.compareVersions=function(t,n){for(var i=t.split('.').map(Number),o=n.split('.').map(Number),u=0;us)return 1;if(f1&&void 0!==arguments[1]?arguments[1]:1500,o=n.toString(),u=(0,r(d[0]).md5_hex)(o),f=Date.now();if(t.get(u)){var s=t.get(u);if(!(s&&s.startTime+s.wait<=f))return;t.delete(u)}t.set(u,{startTime:f,wait:i}),n(),setTimeout(function(){var n=[];t.forEach(function(t,i,o){var u=Date.now(),f=o.get(i);f&&f.startTime+f.wait<=u&&n.push(i)}),n.map(function(n){t.delete(n)})},i)}},3742,[3370]); __d(function(g,_r,i,a,m,e,_d){var l=_r(_d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.usePageApi=void 0;var n=l(_r(_d[1])),o=l(_r(_d[2])),u=_r(_d[3]),t=l(_r(_d[4]));e.usePageApi=function(l,d,r,c,f,s){var v,p,h,S,z=(0,u.useState)(void 0),y=(0,o.default)(z,2),b=y[0],j=y[1],A=(0,u.useState)('loaded'),_=(0,o.default)(A,2),O=_[0],P=_[1],M=t.default.object({records:t.default.array(null!=c?c:t.default.any())}),N=t.default.array(null!=c?c:t.default.any()),E=(0,_r(_d[5]).useApi)(l,d,'offset'===(null==f?void 0:f.pagination)?Object.assign({},r,{current:'loadmore'===O?Math.ceil((null!=b?b:[]).length/(null!=(v=null==f?void 0:f.pageSize)?v:10))+1:1,size:null!=(p=null==f?void 0:f.pageSize)?p:10}):Object.assign({},r,{startNum:'loadmore'===O?(null!=b?b:[]).length:0,endNum:'loadmore'===O?(null!=b?b:[]).length+(null!=(h=null==f?void 0:f.pageSize)?h:10)-1:(null!=(S=null==f?void 0:f.pageSize)?S:10)-1}),'root'===(null==f?void 0:f.path)?N:M,f,s),k=E.error,q=E.loading,w=E.fetchAsync,x=E.cancel;return(0,u.useEffect)(function(){var l;'loaded'!==O&&('loadmore'!==O||0!==(null!=b?b:[]).length&&(null!=b?b:[]).length%(null!=(l=null==f?void 0:f.pageSize)?l:10)===0)&&w().then(function(l){if('reload'===O)'root'===(null==f?void 0:f.path)?(j(l),P('loaded')):(j(l.records),P('loaded'));else if('root'===(null==f?void 0:f.path)){var o=l;j(function(l){return[].concat((0,n.default)(null!=l?l:[]),(0,n.default)(o))}),P('loaded')}else{var u=l;j(function(l){return[].concat((0,n.default)(null!=l?l:[]),(0,n.default)(u.records))}),P('loaded')}}).catch(function(){P('loaded')})},[b,w,null==f?void 0:f.pageSize,null==f?void 0:f.path,O]),{response:b,error:k,loading:q,fetch:P,cancel:x}}},3743,[1,42,34,71,537,547]); diff --git a/package.json b/package.json index f9f25e9..22cfda5 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "@react-native-async-storage/async-storage": "^2.2.0", "@react-native-community/hooks": "^100.1.0", "@react-native/new-app-screen": "0.80.1", + "@react-navigation/bottom-tabs": "^7.4.7", "@react-navigation/native": "^7.1.14", "@react-navigation/stack": "^7.4.2", "@szyx-mobile/hooks": "^1.2.0", @@ -36,18 +37,22 @@ "patch-package": "^8.0.0", "react": "19.1.0", "react-native": "0.80.1", - "react-native-copilot": "^3.3.3", "react-native-device-info": "^14.0.4", "react-native-exit-app": "^2.0.0", "react-native-fs": "^2.20.0", "react-native-gesture-handler": "^2.27.2", "react-native-linear-gradient": "^2.8.3", + "react-native-reanimated": "^4.1.0", + "react-native-reanimated-carousel": "^4.0.3", "react-native-root-siblings": "^5.0.1", "react-native-safe-area-context": "^5.5.2", "react-native-spinkit": "^1.5.1", "react-native-storage": "^1.0.1", + "react-native-svg": "^15.12.1", "react-native-toast-message": "^2.3.3", + "react-native-view-shot": "^4.0.3", "react-native-webview": "^13.16.0", + "react-native-worklets": "^0.5.0", "react-native-zip-archive": "^7.0.2" }, "devDependencies": { diff --git a/src/app/hooks/useLogout.ts b/src/app/hooks/useLogout.ts index 08ec305..004d009 100644 --- a/src/app/hooks/useLogout.ts +++ b/src/app/hooks/useLogout.ts @@ -1,6 +1,5 @@ import { useMemo } from 'react'; import { COMMONINFO_KEY, TOKEN_KEY, USERINFO_KEY } from '@common/constants'; -import { useCopilot } from 'react-native-copilot'; import { getAllKeys, removeAllItems } from '@common/StorageHelper.ts'; import { useAuth } from '@common/contexts/useAuth.ts'; @@ -16,8 +15,6 @@ const useLogout = (): { actions: { logout }, } = useAuth(); - const { stop } = useCopilot(); - const actions = useMemo( () => ({ logout: async () => { @@ -41,9 +38,6 @@ const useLogout = (): { await removeAllItems(keysToDelete); // --- 这部分内容等旧模块不再使用后就可以删除了 --- - stop().catch(() => { - return; - }); await logout(); }, }), diff --git a/src/app/routes/MainParamList.ts b/src/app/routes/MainParamList.ts index f3300fe..c5081d2 100644 --- a/src/app/routes/MainParamList.ts +++ b/src/app/routes/MainParamList.ts @@ -1,3 +1,37 @@ +import { NavigatorScreenParams } from '@react-navigation/native'; + +export type MainTabParamList = { + Home: undefined; // 工作台 + Recommend: undefined; // 推荐 + Mine: undefined; // 我的 +}; export type MainParamList = { MainView: undefined; + + // 【工作台】 + MainTab: NavigatorScreenParams; + // 首页文章详情 + ArticleDetail: { + // 文章 id + id: string; + }; + // 文章图片预览 + ArticleImagePreview: { + url: string; + }; + // 分享页 + ArticleShare: { + // 文章名称 + name: string; + // 文章 url + url: string; + // 图片 + thumbImage?: string; + // 摘要 + summary?: string; + }; + + // 【我的】 + // 咨询客服 + ContactSupport: undefined; }; diff --git a/src/app/routes/MainStack.tsx b/src/app/routes/MainStack.tsx index 2017fae..f00db4b 100644 --- a/src/app/routes/MainStack.tsx +++ b/src/app/routes/MainStack.tsx @@ -11,12 +11,18 @@ import { } from '@common/constants'; import HeaderBackImage from '@common/components/HeaderBackImage.tsx'; import MainViewScreen from '../screens/main/MainViewScreen'; +import WebViewScreen from '@common/screens/webview/WebViewScreen.tsx'; +import ArticleDetailScreen from '@app/screens/home/articleDetail/ArticleDetailScreen.tsx'; +import ScanScreen from '@common/screens/scan/ScanScreen.tsx'; +import { CommonParamList } from '@common/router/CommonParamList.ts'; +import ContactSupportScreen from '@app/screens/mine/contactSupport/ContactSupportScreen.tsx'; +import ArticleShareScreen from '@app/screens/home/articleShare/ArticleShareScreen.tsx'; +import MainTab from '@app/routes/MainTab.tsx'; +// import ArticleImagePreviewScreen from '@app/screens/home/articleDetail/ArticleImagePreviewScreen.tsx'; -const Stack = createStackNavigator(); +const Stack = createStackNavigator(); export function MainStack() { - // const navigation = useNavigation>(); - return ( + + + + {/* 普通栈路由 --> 写这里 */} {/* 对话框形式路由 --> 写这里 */} + + {/**/} + ); diff --git a/src/app/routes/MainTab.tsx b/src/app/routes/MainTab.tsx new file mode 100644 index 0000000..ede0be5 --- /dev/null +++ b/src/app/routes/MainTab.tsx @@ -0,0 +1,175 @@ +import React, { useCallback, useEffect, useState } from 'react'; +import { DeviceEventEmitter, ImageSourcePropType } from 'react-native'; +import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'; +import { + DEVICE_ENENT_UPDATE_HOME_FEATURE_LIST_KEY, + HEADER_TINT_COLOR, + HEADER_TITLE_FONT_SIZE, + HEADER_TITLE_FONT_WEIGHT, + TAB_BAR_ACTIVE_TINT_COLOR, + TAB_BAR_INACTIVE_TINT_COLOR, +} from '@common//constants'; +import { useAuth } from '@common/contexts/useAuth'; +import { MainTabParamList } from './MainParamList'; +import HomeScreen from '@app/screens/home/home/HomeScreen'; +import MineScreen from '@app/screens/mine/mine/MineScreen'; +import { Feature } from '@app/screens/home/home/api'; +import { useHandleClickFeatureListItem } from '@app/screens/home/home/hooks/useHandleClickFeatureListItem'; +import TabBarIcon from '@common/components/TabBarIcon.tsx'; + +const Tab = createBottomTabNavigator(); + +export default function MainTab() { + const { + state: { userInfo }, + } = useAuth(); + + // 【状态】 + + const [recommendFeature, setRecommendFeature] = useState( + undefined, + ); // 当前推荐的服务 + + // 【通知监听】 + + useEffect(() => { + // 监听用户信息的更新 + const listener = DeviceEventEmitter.addListener( + DEVICE_ENENT_UPDATE_HOME_FEATURE_LIST_KEY, + (feature?: Feature) => { + setRecommendFeature(feature); + }, + ); + + return () => { + listener.remove(); + }; + }, []); + + // 【点击事件】 + const { handleClickFeatureListItem } = useHandleClickFeatureListItem(); + + // 【子组件】 + + const handleTabBarIcon = useCallback( + (props: { + focused: boolean; + size: number; + activeImage: ImageSourcePropType; + inactiveImage: ImageSourcePropType; + badge?: boolean; + }) => { + return ( + + ); + }, + [], + ); + + if (userInfo === undefined) { + return null; + } + + return ( + + { + return handleTabBarIcon({ + focused: focused, + size: size, + activeImage: require('@app/assets/images/common/tab_home_s.png'), + inactiveImage: require('@app/assets/images/common/tab_home.png'), + }); + }, + }} + /> + {recommendFeature && ( + { + return handleTabBarIcon({ + focused: focused, + size: size, + activeImage: require('@app/assets/images/common/tab_recommend.png'), + inactiveImage: require('@app/assets/images/common/tab_recommend.png'), + badge: recommendFeature.badge, + }); + }, + }} + listeners={{ + tabPress: e => { + e.preventDefault(); // 阻止默认行为 + handleClickFeatureListItem(recommendFeature); + }, + }} + /> + )} + { + return handleTabBarIcon({ + focused: focused, + size: size, + activeImage: require('@app/assets/images/common/tab_mine_s.png'), + inactiveImage: require('@app/assets/images/common/tab_mine.png'), + }); + }, + }} + /> + + ); +} + +function RecommendScreen() { + return null; +} + +// 图标 +function MainTabBarIcon(props: { + focused: boolean; + size: number; + inactiveImage: ImageSourcePropType; + activeImage: ImageSourcePropType; + badge?: boolean; +}) { + return ( + + ); +} diff --git a/src/app/screens/api/index.ts b/src/app/screens/api/index.ts new file mode 100644 index 0000000..f611b60 --- /dev/null +++ b/src/app/screens/api/index.ts @@ -0,0 +1 @@ +export * from './useBannerList'; diff --git a/src/app/screens/api/useBannerList.ts b/src/app/screens/api/useBannerList.ts new file mode 100644 index 0000000..e313682 --- /dev/null +++ b/src/app/screens/api/useBannerList.ts @@ -0,0 +1,44 @@ +import {useApi} from '@common/api/useApi'; +import {z} from 'zod'; + +// 精品服务功能块 +const featureSchema = z.object({ + uniqueId: z.string(), // 功能 id + name: z.string(), // 功能名称 + icon: z.string().optional(), // 图标 + link: z.string(), // 链接 http/https链接、ywxApp://TeamIndexView + recommend: z.boolean().optional().default(false), // 是否是主推功能 + advertisePic: z.string().optional(), // 广告图 + phone: z.string().optional().default(''), // 电话 + allowApply: z.boolean().optional().default(false), // 是否允许体验 + subscribeType: z.number().optional(), // 订阅类型 0免费订阅 1厂商订阅 2用户订阅 + + badge: z.boolean().optional().default(false), // 注:当前接口没有这个字段,但是会根据 /am/v1/subServer/cornerTag 接口给该模型拼接上该字段,故这里添加一个可选字段并默认为false +}); + +const bannerSchema = z.object({ + id: z.string().optional().default(''), // id + imgUrl: z.string().url(), // 图片 + jumpType: z.enum(['noSkip', 'link', 'activity', 'miniApp', 'hotNews']), // 轮播图跳转类型 noSkip无跳转 link链接跳转 activity活动跳转 miniApp应用跳转 hotNews 热点推荐 + skipUrl: z.string().optional(), // jumpType 为 'link' 时的跳转链接 + activityInfo: z.unknown(), // jumpType 为 'activity' 时的活动信息 这里暂时是 z.unknown() 直接带到旧模块 + miniAppInfo: featureSchema.optional(), // jumpType 为 'miniApp' 时的活动信息 这里和精品服务那里的模型是一致的 + articleId: z.string().optional(), // jumpType 为 'hotNews' 时的文章id +}); + +type Banner = z.infer; +type Feature = z.infer; + +const bannersSchema = z.array(bannerSchema).optional().default([]); + +// 首页轮播图 +// {"data":[{"clientId":"","collection":"app_banner","createTime":"2024-08-21 13:45:05","id":"{\"$oid\":\"66c57ee1986acc69b1dab1ee\"}","imgUrl":"https://tms-dev.oss-cn-beijing.aliyuncs.com/banner/headimg_0687ad243ffe43498e1bac2c16f47181.png","jumpType":"noSkip","linkType":"","skipUrl":"","sortNum":1,"title":"1234"},{"activityId":"c41d2fc4743f4093b0f7a0a49f81bc8f","activityInfo":{"activityId":"c41d2fc4743f4093b0f7a0a49f81bc8f","activityName":"活动99","activityPageImgUrl":"https://tms-dev.oss-cn-beijing.aliyuncs.com/banner/headimg_5f5f5918693d45369cdc8b1bbec48698.jpg","activityPrice":0,"activityPriceWithYuan":"0","activityWindowImgUrl":"https://tms-dev.oss-cn-beijing.aliyuncs.com/banner/headimg_022c001bbc444cd58304c7ff4cf4cc2c.jpg","activityfloatImgUrl":"https://tms-dev.oss-cn-beijing.aliyuncs.com/banner/headimg_10efc2e99e93468fb50404eb74370d91.png","collection":"app_activity","commodityTime":30,"createTime":"2022-03-26 16:57:04","del":0,"endTime":"2022-06-09 00:00:00","explain":"ok","id":"{\"$oid\":\"623ed560986acc03223d186d\"}","minAppVersion":"99","nSId":"012","price":100,"priceWithYuan":"1","startTime":"2022-03-26 00:00:00","templateId":"02fceff4348541f280f06b338b6349e1","updateTime":"2022-05-31 17:17:49"},"clientId":"","collection":"app_banner","createTime":"2024-08-21 13:45:05","id":"{\"$oid\":\"66c57ee1986acc69b1dab1ef\"}","imgUrl":"https://tms-dev.oss-cn-beijing.aliyuncs.com/banner/headimg_0c39dbf709304a5ca347a9cb1b2f8894.png","jumpType":"activity","linkType":"","skipUrl":"","sortNum":2,"title":"测试1"},{"clientId":"","collection":"app_banner","createTime":"2024-08-21 13:45:05","id":"{\"$oid\":\"66c57ee1986acc69b1dab1f0\"}","imgUrl":"https://tms-dev.oss-cn-beijing.aliyuncs.com/banner/headimg_bda974c012b844d9878b05b0e134849d.png","jumpType":"link","linkType":"https://","skipUrl":"https://dev.51trust.com/ketang/index.html?appId=Y_T_A2411062250","sortNum":3,"title":"医信课堂"},{"clientId":"","collection":"app_banner","createTime":"2024-08-21 13:45:05","id":"{\"$oid\":\"66c57ee1986acc69b1dab1f1\"}","imgUrl":"https://tms-dev.oss-cn-beijing.aliyuncs.com/banner/headimg_b5fa8ec8dc8c4326b45fb04c3f5c7969.jpg","jumpType":"link","linkType":"https://","skipUrl":"https://https://blog.csdn.net/kl222/article/details/84939135?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-84939135-blog-115694803.235^v43^pc_blog_bottom_relevance_base7&spm=1001.2101.3001.4242.1&utm_relevant_index=3","sortNum":4,"title":"掌上病历介绍"},{"clientId":"","collection":"app_banner","createTime":"2024-08-21 13:45:05","id":"{\"$oid\":\"66c57ee1986acc69b1dab1f2\"}","imgUrl":"https://tms-dev.oss-cn-beijing.aliyuncs.com/banner/headimg_a18ebcce9d2446c88e12c6675f02a5f9.jpg","jumpType":"miniApp","linkType":"","miniAppInfo":{"advertisePic":"https://tms-dev.oss-cn-beijing.aliyuncs.com/doctorHelper/advertPic_Y_T_A2310053073.png","allowApply":true,"cornerTagUrl":"","createTime":"2023-08-30 10:37:06","icon":"https://tms-dev.oss-cn-beijing.aliyuncs.com/doctorHelper/docIcon_Y_T_A2310053073.png","link":"ywxApp://FollowUpCenter","name":"随访中心","note":"随访中心","phone":"18811061787","recommend":true,"serviceType":4,"sort":0,"status":1,"subscribeType":1,"uniqueId":"Y_T_A2310053073","updateTime":"2024-08-30 15:15:32"},"nsId":"Y_T_A2310053073","skipUrl":"","sortNum":5,"title":"标题"},{"articleId":"2","clientId":"","collection":"app_banner","createTime":"2024-08-21 13:45:05","id":"{\"$oid\":\"66c57ee1986acc69b1dab1f3\"}","imgUrl":"https://tms-dev.oss-cn-beijing.aliyuncs.com/banner/headimg_e26da466ca454f0592321fa7df1c18be.png","jumpType":"noSkip","linkType":"","skipUrl":"","sortNum":6,"title":"标题"}],"message":"success","status":"0"} +const useBannerList = () => { + return useApi('/am/v3/banner/list', 'GET', {}, bannersSchema, { + automatic: true, + loadingDelay: 500, + }); +}; + +export type {Banner, Feature}; +export {useBannerList}; diff --git a/src/app/screens/components/HomeCarousel.tsx b/src/app/screens/components/HomeCarousel.tsx new file mode 100644 index 0000000..d6ac888 --- /dev/null +++ b/src/app/screens/components/HomeCarousel.tsx @@ -0,0 +1,98 @@ +import React, {useState} from 'react'; +import {Image, StyleSheet, TouchableOpacity, View} from 'react-native'; +import Carousel from 'react-native-reanimated-carousel'; + +const CAROUSEL_ASPECT_RATIO = 350 / 80; // 轮播图宽高比 +const INDEX_BACKGROUND_CURRENT = '#FFFFFF'; +const INDEX_BACKGROUND = 'rgba(255, 255, 255, 0.6)'; + +type Props = { + width: number; // 轮播图宽度 + data: {imgUrl: string}[]; // 数据的数组 + onPress?: (index: number) => void; // 点击事件 +}; + +/** + * @description: 首页轮播图 + */ +export default function HomeCarousel(props: Props) { + const [currentIndex, setCurrentIndex] = useState(0); + return ( + + { + setCurrentIndex(index); + }} + renderItem={({index}) => { + return ( + { + props.onPress && props.onPress(index); + }}> + + + ); + }} + /> + + + {props.data.map((_item, index) => { + return ( + + ); + })} + + + + ); +} + +const styles = StyleSheet.create({ + carousel: { + borderRadius: 10, + backgroundColor: '#FFFFFF', + }, + indexView: { + position: 'absolute', + bottom: 0, + left: 0, + right: 0, + height: 7.5, + }, + indexContent: { + flex: 1, + flexDirection: 'row', + justifyContent: 'center', + }, + indexItem: { + flexShrink: 1, + width: 7.5, + height: 2.5, + marginHorizontal: 1.5, + borderRadius: 2, + }, +}); diff --git a/src/app/screens/home/articleDetail/ArticleDetailScreen.tsx b/src/app/screens/home/articleDetail/ArticleDetailScreen.tsx new file mode 100644 index 0000000..93a40b4 --- /dev/null +++ b/src/app/screens/home/articleDetail/ArticleDetailScreen.tsx @@ -0,0 +1,326 @@ +import React, { useCallback, useEffect, useLayoutEffect, useRef } from 'react'; +import { + ActivityIndicator, + DeviceEventEmitter, + Image, + StyleSheet, + TouchableOpacity, + View, +} from 'react-native'; +import { StackScreenProps } from '@react-navigation/stack'; +import WebView from 'react-native-webview'; +import Spinner from '@common/components/Spinner'; +import DataEmpty from '@common/components/DataEmpty'; +import { MainParamList } from '@app/routes/MainParamList'; +import { useArticleDetail } from './api'; +import { useAuth } from '@common/contexts/useAuth'; +import { useSubServerCheck } from '../home/api'; +import { showErrorMessage, showMessage } from '@common/ToastHelper.ts'; + +type Props = StackScreenProps; + +// 服务协议/隐私声明页面 +export default function ArticleDetailScreen(props: Props) { + const { navigation, route } = props; + + const { + state: { userInfo }, + } = useAuth(); + // const { width } = useWindowDimensions(); + // + // const [visible, setVisible] = useState(false); // 预览视图是否可见 + // const [imgUrl, setImgUrl] = useState(undefined); // 预览视图是否可见 + // + // const [adKey, setAdKey] = useState(undefined); + + + // 获取协议内容接口 + const { response, error, loading, fetch } = useArticleDetail(route.params.id); + + useEffect(() => { + fetch(); + }, [fetch]); + + useEffect(() => { + if (error && error.type !== 'Cancel') { + showErrorMessage(error.message); + } + }, [error]); + + useEffect(() => { + const listener = DeviceEventEmitter.addListener( + 'WeChat_Resp', + (resp?: any) => { + if (resp.type === 'SendMessageToWX.Resp' && resp.errCode === 0) { + showMessage('分享成功'); + } + }, + ); + + return () => { + listener.remove(); + }; + }, []); + + const { loading: subServerCheckLoading, fetchAsync: subServerCheckFetch } = + useSubServerCheck(); + + // 导航栏右侧按钮 + const HeaderRight = useCallback(() => { + return ( + { + if (response !== undefined) { + if ( + response.shareUrl === undefined || + response.shareUrl.length === 0 + ) { + showErrorMessage('文章没有分享链接'); + return; + } + navigation.navigate('ArticleShare', { + name: response.title, + url: response.shareUrl, + summary: response.summary, + // thumbImage: Image.resolveAssetSource( + // // eslint-disable-next-line @typescript-eslint/no-var-requires + // require('@app/assets/images/common/common_appicon.png'), + // ).uri, + }); + } + }} + > + + + ); + }, [navigation, response]); + + useLayoutEffect(() => { + navigation.setOptions({ + title: '热点资讯', + headerRight: HeaderRight, + }); + }, [HeaderRight, navigation]); + + const webViewRef = useRef(null); + + const onMessage = (event: any) => { + // 1 {\"appId\":\"101\",\"model\":\"init\",\"functionId\":\"4d349822-b5ee-48b8-8642-b1f92da7f2b1\"} + // 2 {\"model\":\"isYwxApp\",\"functionId\":\"39ad7558-b9e2-4950-b1fe-1bc6a8084f37\",\"appId\":\"101\"} + // 3 {\"model\":\"userInfo\",\"functionId\":\"329b5484-943e-4c23-85ed-9f0b497787cd\",\"appId\":\"101\"} + + try { + const data = JSON.parse(event.nativeEvent.data); + if (data.type === 'imagePreview') { + // setVisible(true); + // setImgUrl(data.url); + // console.log('>>>>>>', data.url); + navigation.navigate('ArticleImagePreview', { url: data.url }); + return; + } + + if (data.appId || data.model === 'isYwxApp') { + if (data.model === 'init') { + // {"model":"init","functionId":"8769e533-2645-487b-9d84-80c98e384e05","value":{"appId":"101","openId":"eb4a3ec98d540c99q8834w68b8y9810068f"},"status":"0","message":"init:ok"} + const obj = { + model: data.model, + functionId: data.functionId, + value: { + appId: data.appId, + openId: getOpenIdByUserId(userInfo?.userId ?? ''), + }, + status: '0', + message: `${data.model}:ok`, + }; + const responseStr = JSON.stringify(obj); + const jsString = `(function() {window.SZYX_YWX_WebViewBridge && window.SZYX_YWX_WebViewBridge.onMessage(${responseStr});})()`; + webViewRef.current?.injectJavaScript(jsString); + } else if (data.model === 'isYwxApp') { + // {"model":"isYwxApp","functionId":"d54f705d-801a-42f7-ae07-64f30c616dc7","value":{"isYwxApp":true},"status":"0","message":"isYwxApp:ok"} + const obj = { + model: data.model, + functionId: data.functionId, + value: { + isYwxApp: true, + }, + status: '0', + message: `${data.model}:ok`, + }; + const responseStr = JSON.stringify(obj); + const jsString = `(function() {window.SZYX_YWX_WebViewBridge && window.SZYX_YWX_WebViewBridge.onMessage(${responseStr});})()`; + webViewRef.current?.injectJavaScript(jsString); + } else if (data.model === 'userInfo') { + // {"model":"userInfo","functionId":"8b41c37f-06dc-4de0-8959-0caa1dee90c9","value":{"openId":"eb4a3ec98d540c99q8834w68b8y9810068f","userName":"邓文龙","nickname":"邓文龙","clientList":[{"clientId":"2019022814080064","clientName":"医网信beta联调"}]},"status":"0","message":"userInfo:ok"} + subServerCheckFetch({ + data: { + nsId: data.appId, + }, + }) + .then(res => { + const clientList = res.clientList; + const list: { + clientId: string; + clientName: string; + }[] = []; + clientList.map(value => { + if (value.subscribeStatus === 'serving') { + list.push({ + clientId: value.clientId, + clientName: value.clientName, + }); + } + }); + const responseData = { + openId: getOpenIdByUserId(userInfo?.userId ?? ''), + userName: userInfo?.nickname, + nickname: userInfo?.nickname, + clientList: list, + }; + const obj = { + model: data.model, + functionId: data.functionId, + value: responseData, + status: '0', + message: `${data.model}:ok`, + }; + const responseStr = JSON.stringify(obj); + const jsString = `(function() {window.SZYX_YWX_WebViewBridge && window.SZYX_YWX_WebViewBridge.onMessage(${responseStr});})()`; + webViewRef.current?.injectJavaScript(jsString); + }) + .catch(() => { + return; + }); + } else if (data.model === 'closeWindows') { + // {\"model\":\"closeWindows\",\"functionId\":\"5c9f2161-1506-42f4-b5ec-8aa4742a038c\",\"appId\":\"101\"} + navigation.pop(); + } + } + } catch (e) { + return; + } + }; + + if (loading) { + return ; + } + + if (!response) { + return ( + { + fetch(); + }} + /> + ); + } + + return ( + + { + // 移动端展示默认表格的时候,边框默认是不展示的,这里注入样式代码将表格每个单元格的边框展示出来 + const injectStyles = ` + var cells = document.querySelectorAll('table td, table th'); + cells.forEach(function(cell) { + cell.style.border = '1px solid #000000'; + cell.style.padding = '4px'; + }); + `; + webViewRef.current?.injectJavaScript(injectStyles); + }} + originWhitelist={['*']} + dataDetectorTypes={'none'} + // 增加了禁止缩放,图片宽度不超过屏幕宽度 + source={{ + html: ` + + + + + +

${response.title}

${ + response.publishTime ?? '' + }

${response.content} + + + `, + }} + javaScriptEnabled={true} + startInLoadingState={true} + scalesPageToFit={false} + renderLoading={() => { + return ( + + ); + }} + /> + + {/* setVisible(false)}*/} + {/*/>*/} + {subServerCheckLoading && } +
+ ); +} + +function getOpenIdByUserId(userId: string) { + if (userId) { + const array = userId.split(''); + array.splice(8, 0, ['y', 'w', 'q'][0]); + array.splice(13, 0, ['y', 'w', 'q'][1]); + array.splice(18, 0, ['y', 'w', 'q'][2]); + array.reverse(); + const openId = array.join(''); + return openId; + } + return ''; +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + }, + headerRight: { + paddingHorizontal: 16, + height: '100%', + justifyContent: 'center', + }, + headerRightImage: { + height: 15, + width: 15, + }, + webview: { + flex: 1, + }, + activityIndicator: { + position: 'absolute', + alignSelf: 'center', + top: 100, + }, +}); diff --git a/src/app/screens/home/articleDetail/api/index.ts b/src/app/screens/home/articleDetail/api/index.ts new file mode 100644 index 0000000..755a85b --- /dev/null +++ b/src/app/screens/home/articleDetail/api/index.ts @@ -0,0 +1 @@ +export * from './useArticleDetail'; diff --git a/src/app/screens/home/articleDetail/api/useArticleDetail.tsx b/src/app/screens/home/articleDetail/api/useArticleDetail.tsx new file mode 100644 index 0000000..eaa002a --- /dev/null +++ b/src/app/screens/home/articleDetail/api/useArticleDetail.tsx @@ -0,0 +1,29 @@ +import {useApi} from '@common/api/useApi.ts'; +import {z} from 'zod'; + +const articleSchema = z.object({ + content: z.string({ + required_error: '文章内容不存在', + invalid_type_error: '文章内容类型错误', + }), // 文章内容 + title: z.string(), // 文章标题 + publishTime: z.string().optional(), // 发布时间 + coverImgUrl: z.string().optional(), // 封面图 + shareUrl: z.string().optional(), // 分享链接 + summary: z.string().optional(), // 摘要 +}); + +// 首页文章详情 +const useArticleDetail = (id: string) => { + return useApi( + '/am/v3/hotnews/article/detail', + 'GET', + { + id: id, + }, + articleSchema, + {}, + ); +}; + +export {useArticleDetail}; diff --git a/src/app/screens/home/articleShare/ArticleShareScreen.tsx b/src/app/screens/home/articleShare/ArticleShareScreen.tsx new file mode 100644 index 0000000..8b9e981 --- /dev/null +++ b/src/app/screens/home/articleShare/ArticleShareScreen.tsx @@ -0,0 +1,154 @@ +import React, { useEffect, useLayoutEffect, useRef, useState } from 'react'; +import { + Animated, + Image, + Pressable, + StyleSheet, + Text, + TouchableOpacity, + View, +} from 'react-native'; +import { StackScreenProps } from '@react-navigation/stack'; +import { MainParamList } from '@app/routes/MainParamList'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; +import Separator from '@common/components/Separator'; + +const CONTENT_HEIGHT = 200; // 卡片高度 +const DURATION = 300; // 弹出和收起的时间 + +type Props = StackScreenProps; + +// 分享弹窗页 +export default function ArticleShareScreen(props: Props) { + const { navigation, route } = props; + const safeAreaInsets = useSafeAreaInsets(); + + useLayoutEffect(() => { + navigation.setOptions({ + title: '', + }); + }, [navigation]); + + const bottom = useRef( + new Animated.Value(-CONTENT_HEIGHT - safeAreaInsets.bottom), + ); + + const [shown, setShown] = useState(true); + + useEffect(() => { + if (shown === true) { + Animated.timing(bottom.current, { + toValue: 0, + duration: DURATION, + useNativeDriver: false, + }).start(); + } else { + Animated.timing(bottom.current, { + toValue: -CONTENT_HEIGHT - safeAreaInsets.bottom, + duration: DURATION, + useNativeDriver: false, + }).start(() => { + navigation.pop(); + }); + } + }, [navigation, safeAreaInsets.bottom, shown]); + + return ( + + { + setShown(false); + }} + /> + + + { + setShown(false); + }} + > + + 微信 + + { + setShown(false); + }} + > + + 朋友圈 + + + + { + setShown(false); + }} + > + 取消 + + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'flex-end', + }, + background: { + backgroundColor: 'rgba(21, 20, 35, 0.6)', + }, + animated: { + backgroundColor: '#FFFFFF', + borderTopLeftRadius: 13, + borderTopRightRadius: 13, + }, + content: { + height: 120, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-evenly', + }, + contentButton: { + alignItems: 'center', + }, + buttonImage: { + width: 58, + height: 58, + }, + buttonText: { + marginTop: 4, + color: '#242424', + fontSize: 12, + }, + bottomButton: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + }, + bottomButtonText: { + color: '#242424', + fontWeight: '600', + fontSize: 14, + }, +}); diff --git a/src/app/screens/home/home/HomeScreen.tsx b/src/app/screens/home/home/HomeScreen.tsx new file mode 100644 index 0000000..b7dae93 --- /dev/null +++ b/src/app/screens/home/home/HomeScreen.tsx @@ -0,0 +1,604 @@ +import React, { + useCallback, + useEffect, + useLayoutEffect, + useMemo, + useState, +} from 'react'; +import { + DeviceEventEmitter, + FlatList, + Image, + NativeScrollPoint, + RefreshControl, + SafeAreaView, + StyleSheet, + Text, + useWindowDimensions, + View, +} from 'react-native'; +import { CompositeScreenProps, useFocusEffect } from '@react-navigation/native'; +import { useHeaderHeight } from '@react-navigation/elements'; +import { StackScreenProps } from '@react-navigation/stack'; +import { BottomTabScreenProps } from '@react-navigation/bottom-tabs'; +import { MainParamList, MainTabParamList } from '@app/routes/MainParamList'; +import LinearGradient from 'react-native-linear-gradient'; +import HeaderRight from './components/HeaderRight'; +import HomeTopView from './components/HomeTopView'; +import HomeTodoView from './components/HomeTodoView'; +import HomeCarousel from '@app/screens/components/HomeCarousel'; +import HomeBulletin from './components/HomeBulletin'; +import { useBannerList } from '@app/screens/api'; +import { + Article, + useArticleCategory, + useArticleListByCategory, + useBadgeNum, + useFeatureList, + useNoticeList, +} from './api'; +import HomeFeaturesView from './components/HomeFeaturesView'; +import Spinner from '@common/components/Spinner'; +import HomeArticlesView from './components/HomeArticlesView'; +import HomeArticleItem from './components/HomeArticleItem'; +import { DEVICE_ENENT_UPDATE_HOME_FEATURE_LIST_KEY } from '@common/constants'; +import { useHandleClickFeatureListItem } from './hooks/useHandleClickFeatureListItem'; +import { useHandleClickBannerListItem } from './hooks/useHandleClickBannerListItem'; +import { useAuth } from '@common/contexts/useAuth'; +import { useHandleUnreadRemind } from './hooks/useHandleUnreadRemind'; +import { debounce } from '@common/utils/commonUtils'; +import { showErrorMessage } from '@common/ToastHelper.ts'; +import ListEmpty from '@common/components/ListEmpty.tsx'; + +const OPACITY_START = 1; // 导航栏起始透明度 +const OPACITY_END = 0; // 导航栏终点透明度 +const PADDING_HORIZONTAL = 12; +const BACKGROUND_COLOR = '#F3F4F5'; // 背景色 +const ARTICLE_PAGE_SIZE = 10; // 热门推荐每页数量 + +type Props = CompositeScreenProps< + BottomTabScreenProps, + StackScreenProps +>; + +export default function HomeScreen(props: Props) { + const { navigation } = props; + const headerHeight = useHeaderHeight(); + const { width } = useWindowDimensions(); + + const { + state: { userInfo }, + } = useAuth(); + + + // 【状态】 + const [contentOffset, setContentOffset] = useState({ + x: 0, + y: 0, + }); + + // 【子组件】 + + // 创建导航栏背景 + const createHeaderBackground = useCallback(() => { + return ( + = headerHeight + ? OPACITY_START + : contentOffset.y / headerHeight, + }, // 滑动 ScrollView 导航栏透明度逐渐变化 + ]} + /> + ); + }, [contentOffset.y, headerHeight]); + + const { unread, unreadRemindLoading, handleUnreadRemindFetch } = + useHandleUnreadRemind(); // 处理未读消息相关 + + useEffect(() => { + handleUnreadRemindFetch(); + }, [handleUnreadRemindFetch]); + + const createHeaderRight = useCallback(() => { + return ( + { + debounce(() => {}); + }} + onPressRightButton={() => { + debounce(() => {}); + // navigation.navigate('Scan'); // 以后再更换新的扫一扫,工作量太大 + }} + /> + ); + }, [unread]); + + // 【副作用】 + + useLayoutEffect(() => { + navigation.setOptions({ + headerTitle: '医网信', + headerTransparent: true, + headerBackground: () => createHeaderBackground(), + headerRight: () => createHeaderRight(), + }); + return () => { + }; + }, [createHeaderBackground, createHeaderRight, navigation]); + + const { + response: bannerList, + error: bannerListError, + loading: bannerListLoading, + fetch: bannerListFetch, + } = useBannerList(); // 轮播图 + + useEffect(() => { + if (bannerListError && bannerListError.type !== 'Cancel') { + showErrorMessage(bannerListError.message); + } + }, [bannerListError]); + + const { + response: noticeList, + error: noticeListError, + loading: noticeListLoading, + fetch: noticeListFetch, + } = useNoticeList(); // 公告 + + useEffect(() => { + if (noticeListError && noticeListError.type !== 'Cancel') { + showErrorMessage(noticeListError.message); + } + }, [noticeListError]); + + const { + response: featureList, + error: featureListError, + loading: featureListLoading, + fetch: featureListFetch, + } = useFeatureList(); // 精品服务数组 + + useEffect(() => { + if (featureListError && featureListError.type !== 'Cancel') { + showErrorMessage(featureListError.message); + } + }, [featureListError]); + + const { + response: articleCategory, + error: articleCategoryError, + loading: articleCategoryLoading, + fetch: articleCategoryFetch, + } = useArticleCategory(); // 热门推荐分类 + + useEffect(() => { + if (articleCategoryError && articleCategoryError.type !== 'Cancel') { + showErrorMessage(articleCategoryError.message); + } + }, [articleCategoryError]); + + const [selectedCategoryCode, setSelectedCategoryCode] = useState< + number | undefined + >(undefined); + + useEffect(() => { + if (articleCategory !== undefined && articleCategory.length > 0) { + const filteredArticleCategory = articleCategory.filter( + c => c.isDefault === true, + ); + if (filteredArticleCategory.length > 0) { + setSelectedCategoryCode(filteredArticleCategory[0].code); + } + } + }, [articleCategory]); + + const { + response: articleList, + error: articleListError, + loading: articleListLoading, + fetch: articleListFetch, + } = useArticleListByCategory(selectedCategoryCode ?? 0); // 热门推荐数组 + const [displayArticleList, setDisplayArticleList] = useState([]); // 当前展示的热门推荐数组 + + useEffect(() => { + if (articleListError && articleListError.type !== 'Cancel') { + showErrorMessage(articleListError.message); + } + }, [articleListError]); + + useEffect(() => { + if (selectedCategoryCode !== undefined) { + articleListFetch(); + } + }, [articleListFetch, selectedCategoryCode]); + + useEffect(() => { + if (articleList) { + setDisplayArticleList(articleList.slice(0, ARTICLE_PAGE_SIZE)); + } + }, [articleList]); + + const { + response: badgeNum, + error: badgeNumError, + fetch: badgeNumFetch, + } = useBadgeNum(); // 今日未处理数据和精品服务角标 + + // 对于首页角标数据,频繁调用 + useFocusEffect( + useCallback(() => { + badgeNumFetch(); + }, [badgeNumFetch]), + ); + + useEffect(() => { + if (badgeNumError && badgeNumError.type !== 'Cancel') { + showErrorMessage(badgeNumError.message); + } + }, [badgeNumError]); + + // 下拉刷新 + const handleRefresh = useCallback(() => { + bannerListFetch(); + noticeListFetch(); + featureListFetch(); + articleCategoryFetch(); + badgeNumFetch(); + handleUnreadRemindFetch(); + }, [ + articleCategoryFetch, + badgeNumFetch, + bannerListFetch, + featureListFetch, + handleUnreadRemindFetch, + noticeListFetch, + ]); + + // 【计算属性】 + + // 处理过的精品服务列表,增加了badge的状态 + const computedFeatureList = useMemo(() => { + if (badgeNum === undefined || badgeNum.length === 0) { + return featureList; + } + return featureList?.map(feature => { + const filteredBadgeItems = badgeNum.filter(badgeItem => { + return badgeItem.nsId && badgeItem.nsId === feature.uniqueId; + }); + let badge = false; + if (filteredBadgeItems.length > 0) { + badge = filteredBadgeItems[0].shouldRemind; + } + return { ...feature, badge: badge }; + }); + }, [badgeNum, featureList]); // 在原有精品服务功能数组的基础上增加了角标的是否展示 + + useEffect(() => { + const filteredFeatureList = computedFeatureList?.filter(feature => { + return feature.recommend === true; + }); + + // 当这个列表更新的更新时,发通知,tab栏会接收通知更新tab标签 + if (filteredFeatureList !== undefined) { + DeviceEventEmitter.emit( + DEVICE_ENENT_UPDATE_HOME_FEATURE_LIST_KEY, + filteredFeatureList.length > 0 ? filteredFeatureList[0] : undefined, // 如果没有推荐的则传空 + ); + } + }, [computedFeatureList]); + + // 今日未处理三个功能块未处理数 + const computedBadgeNum = useMemo(() => { + if (badgeNum === undefined || badgeNum.length === 0) { + return {}; + } + let yiwangqianNum = '0'; + let suifangNum = '0'; + let hospitalNum = '0'; + for (let index = 0; index < badgeNum.length; index++) { + const badgeItem = badgeNum[index]; + // 医网签id + if (badgeItem.nsId === '101') { + yiwangqianNum = badgeItem.num.toString(); + } + // 随访id + if (badgeItem.nsId === 'Y_T_A2310053073') { + suifangNum = badgeItem.num.toString(); + } + // 云诊室id + if (badgeItem.nsId === 'CLOUD_CLINIC') { + hospitalNum = badgeItem.num.toString(); + } + } + return { + yiwangqianNum, + suifangNum, + hospitalNum, + }; + }, [badgeNum]); + + // 【点击事件方法】 + + const { subServerCheckLoading, handleClickFeatureListItem } = + useHandleClickFeatureListItem(); // 点击精品服务功能块 + + const handleClickBannerListItem = useHandleClickBannerListItem( + handleClickFeatureListItem, + ); // 点击轮播图 + + return ( + { + // 今日未处理视图时引导的开始位置,当这个视图渲染好之后就可以开始了 + // if (info.appTourVersion !== APP_TOUR_VERSION) { + // start('今日未处理', scrollRef.current); + // } + }} + > + {/* 顶部背景 */} + + + + { + setContentOffset(event.nativeEvent.contentOffset); + }} + data={displayArticleList} + renderItem={({ item, index }) => ( + + { + if (articleList && articleList.length > 0) { + const article = articleList[index]; + if (article.id === undefined || article.id.length === 0) { + return; + } + navigation.navigate('ArticleDetail', { + id: article.id, + }); + } + }} + /> + + )} + ListEmptyComponent={ListEmpty} + ListHeaderComponent={ + + + {/* 医生信息视图 */} + { + debounce(() => {}); + }} + /> + {/* 今日未处理视图 */} + { + debounce(() => { + const filteredFeatureList = computedFeatureList?.filter( + feature => { + return feature.uniqueId === '101'; + }, + ); + if ( + filteredFeatureList !== undefined && + filteredFeatureList.length > 0 + ) { + handleClickFeatureListItem(filteredFeatureList[0]); + } + }); + }} + onPressSuifang={() => { + debounce(() => { + const filteredFeatureList = computedFeatureList?.filter( + feature => { + return feature.uniqueId === 'Y_T_A2310053073'; + }, + ); + if ( + filteredFeatureList !== undefined && + filteredFeatureList.length > 0 + ) { + handleClickFeatureListItem(filteredFeatureList[0]); + } + }); + }} + onPressHospital={() => { + debounce(() => { + const filteredFeatureList = computedFeatureList?.filter( + feature => { + return feature.uniqueId === 'CLOUD_CLINIC'; + }, + ); + if ( + filteredFeatureList !== undefined && + filteredFeatureList.length > 0 + ) { + handleClickFeatureListItem(filteredFeatureList[0]); + } + }); + }} + /> + {/* 轮播图 */} + {bannerList && bannerList.length > 0 && ( + + { + debounce(() => { + if (bannerList && bannerList.length > 0) { + handleClickBannerListItem(bannerList[index]); + } + }); + }} + /> + + )} + {/* 公告栏 */} + {noticeList && noticeList.list.length > 0 && ( + + { + debounce(() => {}); + }} + /> + + )} + {/* 精品服务 */} + { + featureListFetch(); + }} + onPress={index => { + debounce(() => { + if (computedFeatureList && computedFeatureList.length > 0) { + handleClickFeatureListItem(computedFeatureList[index]); + } + }); + }} + /> + {/* 热门推荐头部视图 */} + { + setSelectedCategoryCode(code); + }} + /> + + } + ListFooterComponent={articleList === undefined ? FooterEmpty : Footer} + refreshing={false} + refreshControl={ + + } + onRefresh={() => { + handleRefresh(); + }} + onEndReachedThreshold={0.2} + onEndReached={() => { + if (articleList === undefined) { + return; + } + const startIndex = displayArticleList.length; + const endEndex = startIndex + ARTICLE_PAGE_SIZE; + + if (startIndex < articleList.length) { + setDisplayArticleList(prev => [ + ...prev, + ...articleList.slice(startIndex, endEndex), + ]); + } + }} + /> + {(bannerListLoading || + noticeListLoading || + featureListLoading || + articleCategoryLoading || + articleListLoading || + subServerCheckLoading || + unreadRemindLoading) && } + + ); +} + +function FooterEmpty() { + return ; +} + +function Footer() { + return ( + + 没有更多数据了 + + ); +} + +const styles = StyleSheet.create({ + alertText: { + textAlign: 'center', + color: '#999999', + fontSize: 12, + }, + headerBackground: { + flex: 1, + backgroundColor: '#FFFFFF', + }, + container: { + flex: 1, + backgroundColor: BACKGROUND_COLOR, + }, + topBackground: { + position: 'absolute', + top: 0, + left: 0, + right: 0, + height: 240, + }, + backgroundImage: { + flex: 1, + width: '100%', + }, + list: { + flex: 1, + }, + carousel: { + paddingHorizontal: PADDING_HORIZONTAL, + paddingBottom: 6, + }, + bulletin: { + paddingHorizontal: PADDING_HORIZONTAL, + paddingVertical: 4, + backgroundColor: BACKGROUND_COLOR, + }, + footerEmpty: { + height: 25, + }, + footer: { + height: 40, + alignItems: 'center', + justifyContent: 'center', + }, +}); diff --git a/src/app/screens/home/home/api/index.ts b/src/app/screens/home/home/api/index.ts new file mode 100644 index 0000000..2351709 --- /dev/null +++ b/src/app/screens/home/home/api/index.ts @@ -0,0 +1,8 @@ +export * from './useNoticeList'; +export * from './useFeatureList'; +export * from './useArticleList'; +export * from './useBadgeNum'; +export * from './useSubServerCheck'; +export * from './useUnreadRemind'; +export * from './useArticleCategory'; +export * from './useArticleListByCategory'; diff --git a/src/app/screens/home/home/api/useArticleCategory.ts b/src/app/screens/home/home/api/useArticleCategory.ts new file mode 100644 index 0000000..ffe8142 --- /dev/null +++ b/src/app/screens/home/home/api/useArticleCategory.ts @@ -0,0 +1,39 @@ +import {z} from 'zod'; +import { useApi } from '@common/api/useApi.ts'; + +// 文章分类 item +const articleCategoryItemSchema = z.object({ + code: z.number(), // 分类 code + name: z.string().optional().default(''), // 分类名称 + isDefault: z.boolean(), // 图标 +}); + +const articleCategorySchema = z + .array(articleCategoryItemSchema) + .transform(arr => { + return [ + ...arr.filter(item => item.isDefault === true), + ...arr.filter(item => item.isDefault !== true), + ]; + }) + .optional() + .default([]); + +type ArticleCategoryItem = z.infer; + +// 查询文章分类 +const useArticleCategory = () => { + return useApi( + '/am/v3/hotnews/article/queryCategory', + 'GET', + {}, + articleCategorySchema, + { + automatic: true, + loadingDelay: 500, + }, + ); +}; + +export type {ArticleCategoryItem}; +export {useArticleCategory}; diff --git a/src/app/screens/home/home/api/useArticleList.ts b/src/app/screens/home/home/api/useArticleList.ts new file mode 100644 index 0000000..906fea0 --- /dev/null +++ b/src/app/screens/home/home/api/useArticleList.ts @@ -0,0 +1,33 @@ +import {useApi} from '@common/api/useApi.ts'; +import {z} from 'zod'; + +const articleSchema = z.object({ + id: z.string().optional(), // 文章id + title: z.string().optional().default(''), // 文章标题 + summary: z.string().optional().default(''), // 文章摘要 + publishTime: z.string().optional(), // 发布时间 + coverImgUrl: z.string().optional(), // 图片 + totalReadCount: z.string().optional().default('0'), // 阅读量 +}); + +const articlesSchema = z.array(articleSchema).optional().default([]); + +// 首页热门推荐 +// {"data":[{"coverImgUrl":"https://tms-dev.oss-cn-beijing.aliyuncs.com/khcrm_file/null_GNPJXNPOAC/WechatIMG1741.jpg","id":"4","publishTime":"2024-08-27 14:07:59","summary":"1","title":"点击快速反击脸上的肌肤 发了几点上课就放假了带手机客服端上来就分开了带手机来看风景的时刻了就分开的路","totalReadCount":"2"}],"message":"success","status":"0"} +const useArticleList = () => { + return useApi( + '/am/v3/hotnews/article/list', + 'POSTJSON', + { + startNum: 0, + endNum: 999, + }, + articlesSchema, + { + automatic: true, + loadingDelay: 500, + }, + ); +}; + +export {useArticleList}; diff --git a/src/app/screens/home/home/api/useArticleListByCategory.ts b/src/app/screens/home/home/api/useArticleListByCategory.ts new file mode 100644 index 0000000..ad60fb0 --- /dev/null +++ b/src/app/screens/home/home/api/useArticleListByCategory.ts @@ -0,0 +1,33 @@ +import {useApi} from '@common/api/useApi.ts'; +import {z} from 'zod'; + +const articleSchema = z.object({ + id: z.string().optional(), // 文章id + title: z.string().optional().default(''), // 文章标题 + summary: z.string().optional().default(''), // 文章摘要 + publishTime: z.string().optional(), // 发布时间 + coverImgUrl: z.string().optional(), // 图片 + totalReadCount: z.string().optional().default('0'), // 阅读量 +}); + +const articlesSchema = z.array(articleSchema).optional().default([]); +type Article = z.infer; + +// 首页根据分类查询热门推荐 +// {"data":[{"coverImgUrl":"https://tms-dev.oss-cn-beijing.aliyuncs.com/khcrm_file/null_GNPJXNPOAC/WechatIMG1741.jpg","id":"4","publishTime":"2024-08-27 14:07:59","summary":"1","title":"点击快速反击脸上的肌肤 发了几点上课就放假了带手机客服端上来就分开了带手机来看风景的时刻了就分开的路","totalReadCount":"2"}],"message":"success","status":"0"} +const useArticleListByCategory = (code: number) => { + return useApi( + '/am/v3/hotnews/article/queryListByCategory', + 'POSTJSON', + { + categoryCode: code, + }, + articlesSchema, + { + loadingDelay: 500, + }, + ); +}; + +export type {Article}; +export {useArticleListByCategory}; diff --git a/src/app/screens/home/home/api/useBadgeNum.ts b/src/app/screens/home/home/api/useBadgeNum.ts new file mode 100644 index 0000000..39778af --- /dev/null +++ b/src/app/screens/home/home/api/useBadgeNum.ts @@ -0,0 +1,24 @@ +import {useApi} from '@common/api/useApi.ts'; +import {z} from 'zod'; + +const itemBadgeSchema = z.object({ + nsId: z.string().optional(), // id // 功能 id + num: z.number().optional().default(0), // 未处理数量 + shouldRemind: z.boolean().optional().default(false), // 是否红点提示 +}); + +const itemBadgesSchema = z.array(itemBadgeSchema).optional().default([]); + +// 首页今日未处理数据以及精品服务角标数据 +// [{"nsId":"101","num":0,"shouldRemind":false},{"nsId":"E_CONTRACT","num":0,"shouldRemind":false},{"nsId":"CLOUD_CLINIC","num":0,"shouldRemind":false},{"$ref":"$.data[2]"}] +const useBadgeNum = () => { + return useApi( + '/am/v1/subServer/cornerTag', + 'POSTJSON', + {}, + itemBadgesSchema, + {}, + ); +}; + +export {useBadgeNum}; diff --git a/src/app/screens/home/home/api/useFeatureList.ts b/src/app/screens/home/home/api/useFeatureList.ts new file mode 100644 index 0000000..f863849 --- /dev/null +++ b/src/app/screens/home/home/api/useFeatureList.ts @@ -0,0 +1,33 @@ +import {useApi} from '@common/api/useApi.ts'; +import {z} from 'zod'; + +// 精品服务功能块 +const featureSchema = z.object({ + uniqueId: z.string(), // 功能 id + name: z.string(), // 功能名称 + icon: z.string().optional(), // 图标 + link: z.string(), // 链接 http/https链接、ywxApp://TeamIndexView + recommend: z.boolean().optional().default(false), // 是否是主推功能 + advertisePic: z.string().optional(), // 广告图? + phone: z.string().optional().default(''), // 电话 + allowApply: z.boolean().optional().default(false), // 是否允许体验 + subscribeType: z.number().optional(), // 订阅类型 0免费订阅 1厂商订阅 2用户订阅 + + badge: z.boolean().optional().default(false), // 注:当前接口没有这个字段,但是会根据 /am/v1/subServer/cornerTag 接口给该模型拼接上该字段,故这里添加一个可选字段并默认为false +}); + +const featuresSchema = z.array(featureSchema).optional().default([]); + +type Feature = z.infer; + +// 首页精品服务位置常用功能模块列表 +// {"advertisePic":"https://tms-dev.oss-cn-beijing.aliyuncs.com/doctorHelper/advertPic_E_CONTRACT.png?time=1694161704000?time=1694161744000?time=1710124742000?time=1711019040000","allowApply":false,"cornerTagUrl":"","createTime":"2021-06-28 18:30:33","icon":"https://tms-dev.oss-cn-beijing.aliyuncs.com/doctorHelper/docIcon_E_CONTRACT.png?time=1710124742000?time=1711019040000","link":"ywxApp://TeamIndexView","name":"电子合同","note":"电子合同","phone":"13122223333","recommend":false,"serviceType":2,"sort":2,"status":1,"subscribeId":"synForwardRecipe","subscribeType":0,"uniqueId":"E_CONTRACT","updateTime":"2024-03-21 19:04:00"} +const useFeatureList = () => { + return useApi('/am/v4/subServer/baseList', 'POSTJSON', {}, featuresSchema, { + automatic: true, + loadingDelay: 500, + }); +}; + +export type {Feature}; +export {useFeatureList}; diff --git a/src/app/screens/home/home/api/useNoticeList.ts b/src/app/screens/home/home/api/useNoticeList.ts new file mode 100644 index 0000000..523cd3c --- /dev/null +++ b/src/app/screens/home/home/api/useNoticeList.ts @@ -0,0 +1,25 @@ +import {useApi} from '@common/api/useApi.ts'; +import {z} from 'zod'; + +const noticeSchema = z + .object({ + id: z.string().optional().default(''), // id + content: z.string().url(), // 公告内容 + }) + .passthrough(); // passthrough 的意思是除了 content 之外,其他的字段不做任何处理;目前这么写,将对象整体传给旧模块,后期重构可以去掉这个 + +const noticesSchema = z.object({ + list: z.array(noticeSchema).optional().default([]), +}); + +// 公告列表 +// {"collection":"sys_notice","content":"啊倒萨大苏打的","createTime":"2024-08-15 18:31:18","id":"{\"$oid\":\"66bdd8f6986acc13d359124f\"}","isDel":0,"readCount":0,"sendTime":"2024-08-15 18:31:20","status":1,"title":"公告新增标题","type":0,"updateTime":"2024-08-15 18:31:20"} +const useNoticeList = () => { + return useApi('/am/v3/notice/list', 'POSTJSON', {}, noticesSchema, { + automatic: true, + loadingDelay: 500, + log: false, + }); +}; + +export {useNoticeList}; diff --git a/src/app/screens/home/home/api/useSubServerCheck.ts b/src/app/screens/home/home/api/useSubServerCheck.ts new file mode 100644 index 0000000..809e7bc --- /dev/null +++ b/src/app/screens/home/home/api/useSubServerCheck.ts @@ -0,0 +1,68 @@ +import {useApi} from '@common/api/useApi.ts'; +import {z} from 'zod'; + +// 用户类型 +const SubscribeType = { + Free: 0, // 免费 + Vendor: 1, // 面向厂商开启 + Individual: 2, // 面向个人开启 +} as const; + +// 服务开通状态 +const SubscribeStatus = { + Serving: 1, // 已开通 + Stop: 2, // 未开通 +} as const; + +const checkResultSchema = z.object({ + checkResult: z.boolean(), + clientList: z + .array( + z.object({ + clientId: z.string().min(1), // 厂商id + clientName: z.string().optional().default(''), // 厂商名 + subscribeStatus: z.nativeEnum(SubscribeStatus).transform(val => { + switch (val) { + case SubscribeStatus.Serving: + return 'serving'; + case SubscribeStatus.Stop: + return 'stop'; + } + }), // 服务开通状态 + cossConf: z + .object({ + appId: z.string(), + servUrl: z.string(), + }) + .nullish(), + }), + ) + .optional() + .default([]), // 应该是厂商列表 + subscribeType: z.nativeEnum(SubscribeType).transform(val => { + switch (val) { + case SubscribeType.Free: + return 'free'; + case SubscribeType.Vendor: + return 'vendor'; + case SubscribeType.Individual: + return 'individual'; + } + }), // 订阅类型 +}); + +// 检查精品服务功能块是否能进入 +// {"checkResult": true, "clientList": [{"clientId": "2015112716143758", "clientName": "数字医信开发", "subscribeStatus": 2}, {"clientId": "2024013118101247", "clientName": "dev随访客户真", "subscribeStatus": 2}, {"clientId": "2024062618140163", "clientName": "同和互联网医院", "subscribeStatus": 2}], "subscribeType": 1} +const useSubServerCheck = () => { + return useApi( + '/am/v3/subServer/check', + 'POSTJSON', + { + nsId: '', // 功能模块的id + }, + checkResultSchema, + {}, + ); +}; + +export {useSubServerCheck}; diff --git a/src/app/screens/home/home/api/useUnreadRemind.ts b/src/app/screens/home/home/api/useUnreadRemind.ts new file mode 100644 index 0000000..ae7de67 --- /dev/null +++ b/src/app/screens/home/home/api/useUnreadRemind.ts @@ -0,0 +1,22 @@ +import {useApi} from '@common/api/useApi.ts'; +import {z} from 'zod'; + +// 检查是否存在未读的消息 +// timeStamp 传一个 类似 2000-01-01 00:00:00 的字符串 +const useUnreadRemind = () => { + return useApi( + '/am/v3/notice/unreadRemind', + 'POSTJSON', + { + timeStamp: '', + }, + z.object({ + unread: z.boolean().optional().default(false), + }), + { + loadingDelay: 500, + }, + ); +}; + +export {useUnreadRemind}; diff --git a/src/app/screens/home/home/components/HeaderRight.tsx b/src/app/screens/home/home/components/HeaderRight.tsx new file mode 100644 index 0000000..7135963 --- /dev/null +++ b/src/app/screens/home/home/components/HeaderRight.tsx @@ -0,0 +1,69 @@ +import React from 'react'; +import {Image, StyleSheet, TouchableOpacity, View} from 'react-native'; + +type Props = { + badge?: boolean; // 是否有已读消息 + onPressLeftButton?: () => void; // 点击左侧的按钮 + onPressRightButton?: () => void; // 点击右侧的按钮 +}; + +/** + * @description: 首页导航栏右侧按钮视图 + */ +export default function HeaderRight(props: Props) { + return ( + + { + props.onPressLeftButton && props.onPressLeftButton(); + }}> + + + {props.badge === true && } + + + { + props.onPressRightButton && props.onPressRightButton(); + }}> + + + + ); +} + +const styles = StyleSheet.create({ + contanier: { + height: '100%', + marginRight: 15, + flexDirection: 'row', + alignItems: 'center', + }, + button: { + height: '100%', + paddingHorizontal: 10, + alignItems: 'center', + justifyContent: 'center', + }, + image: { + height: 24, + width: 24, + }, + badge: { + position: 'absolute', + width: 6, + height: 6, + backgroundColor: '#FF6500', + borderRadius: 3, + top: 0, + right: 0, + }, +}); diff --git a/src/app/screens/home/home/components/HomeArticleItem.tsx b/src/app/screens/home/home/components/HomeArticleItem.tsx new file mode 100644 index 0000000..79ac800 --- /dev/null +++ b/src/app/screens/home/home/components/HomeArticleItem.tsx @@ -0,0 +1,87 @@ +import React from 'react'; +import { + Image, + SafeAreaView, + StyleSheet, + Text, + TouchableOpacity, + View, +} from 'react-native'; +import Separator from '@common/components/Separator'; + +type Props = { + title: string; // 标题 + summary: string; // 摘要 + totalReadCount: string; // 未读数 + coverImgUrl?: string; // 图片 + onPress?: () => void; // 点击 item +}; + +export default function HomeArticleItem(props: Props) { + return ( + + { + props.onPress && props.onPress(); + }}> + + {props.coverImgUrl && props.coverImgUrl.length > 0 && ( + + )} + + + {props.title} + + + {props.summary} + + {`${props.totalReadCount}阅读`} + + + + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#F3F4F5', + }, + touch: { + flex: 1, + backgroundColor: '#FFFFFF', + marginHorizontal: 12, + }, + content: { + flexDirection: 'row', + padding: 12, + }, + image: { + width: 110, + height: 110, + borderRadius: 10, + marginRight: 12, + }, + contentRight: { + flex: 1, + }, + title: { + color: '#11102C', + fontSize: 14, + fontWeight: '500', + }, + summary: { + flex: 1, + marginVertical: 10, + color: '#999999', + }, + bottomText: { + color: '#666666', + fontSize: 13, + }, +}); diff --git a/src/app/screens/home/home/components/HomeArticlesView.tsx b/src/app/screens/home/home/components/HomeArticlesView.tsx new file mode 100644 index 0000000..2e75873 --- /dev/null +++ b/src/app/screens/home/home/components/HomeArticlesView.tsx @@ -0,0 +1,174 @@ +import React from 'react'; +import { + Image, + ScrollView, + StyleSheet, + Text, + TouchableOpacity, + View, +} from 'react-native'; +import { RequestError } from '@szyx-mobile/use-request'; +import DataEmpty from '@common/components/DataEmpty'; + +type Props = { + articleCategory?: { + code: number; // 分类 code + name: string; // 分类名称 + }[]; + selectedCode?: number; + articleCategoryError?: RequestError; + articleCategoryReload?: () => void; + onPressTag?: (code: number) => void; +}; + +export default function HomeArticlesView(props: Props) { + if ( + props.articleCategoryError === undefined && + props.articleCategory && + props.articleCategory.length === 0 + ) { + return null; + } + + return ( + + + + + + + 热门推荐 + + + {props.articleCategoryError && + props.articleCategoryError.type !== 'Cancel' && ( + + { + props.articleCategoryReload && + props.articleCategoryReload(); + }} + /> + + )} + {props.articleCategoryError === undefined && props.articleCategory ? ( + + {props.articleCategory.map((articleCategoryItem, index) => { + return ( + { + props.onPressTag && + props.onPressTag(articleCategoryItem.code); + }} + style={[ + styles.tagButton, + // eslint-disable-next-line react-native/no-inline-styles + { + marginRight: + props.articleCategory?.length === index - 1 ? 0 : 10, + backgroundColor: + articleCategoryItem.code === props.selectedCode + ? '#DCEAFF' + : '#FFFFFF', + borderColor: + articleCategoryItem.code === props.selectedCode + ? '#B4D8FA' + : '#EEEEEE', + }, + ]} + > + + {articleCategoryItem.name} + + + ); + })} + + ) : null} + + + + ); +} + +const styles = StyleSheet.create({ + contanier: { + backgroundColor: '#F3F4F5', + }, + content: { + flex: 1, + marginTop: 6, + marginHorizontal: 12, + backgroundColor: '#FFFFFF', + borderTopLeftRadius: 10, + borderTopRightRadius: 10, + paddingBottom: 10, + }, + header: { + borderTopLeftRadius: 10, + borderTopRightRadius: 10, + borderColor: '#FFFFFF', + borderWidth: 1, + alignItems: 'flex-start', + }, + background: { + position: 'absolute', + borderTopLeftRadius: 10, + borderTopRightRadius: 10, + width: '100%', + height: '100%', + }, + titleView: { + marginTop: 8, + padding: 12, + }, + title: { + color: '#001846', + fontSize: 16, + fontWeight: '700', + alignSelf: 'flex-start', + }, + tagsView: { + width: '100%', + paddingHorizontal: 12, + }, + tagButton: { + backgroundColor: '#DCEAFF', + borderRadius: 5, + paddingHorizontal: 10, + paddingVertical: 7, + borderColor: '#B4D8FA', + borderWidth: 0.5, + marginVertical: 4, + }, + tagText: { + fontSize: 12, + color: '#1C90FE', + fontWeight: '600', + }, + tagEmpty: { width: '100%' }, +}); diff --git a/src/app/screens/home/home/components/HomeBulletin.tsx b/src/app/screens/home/home/components/HomeBulletin.tsx new file mode 100644 index 0000000..7a956e3 --- /dev/null +++ b/src/app/screens/home/home/components/HomeBulletin.tsx @@ -0,0 +1,87 @@ +import React from 'react'; +import {Image, StyleSheet, Text, TouchableOpacity, View} from 'react-native'; +import Carousel from 'react-native-reanimated-carousel'; + +const PADDING_HORIZONTAL = 0; +const LOGO_WIDTH = 23; +const ARROW_WIDTH = 6; +const CAROUSEL_MARGIN_HORIZONTAL = 6; + +type Props = { + width: number; // 视图的宽度 + data: {content: string}[]; // 数据的数组 + onPress?: (index: number) => void; // 点击事件 +}; + +export default function HomeBulletin(props: Props) { + return ( + + + { + return ( + { + props.onPress && props.onPress(index); + }}> + + {props.data[index].content} + + + ); + }} + /> + + + ); +} + +const styles = StyleSheet.create({ + contanier: { + paddingHorizontal: PADDING_HORIZONTAL, + flexDirection: 'row', + alignItems: 'center', + }, + image: { + width: LOGO_WIDTH, + height: 12.5, + }, + carousel: { + flex: 1, + marginHorizontal: CAROUSEL_MARGIN_HORIZONTAL, + }, + item: { + flex: 1, + justifyContent: 'center', + }, + itemText: { + fontSize: 12, + color: '#666666', + }, + arrow: { + width: ARROW_WIDTH, + height: 10, + tintColor: '#BCBCBC', + }, +}); diff --git a/src/app/screens/home/home/components/HomeFeaturesView.tsx b/src/app/screens/home/home/components/HomeFeaturesView.tsx new file mode 100644 index 0000000..0944787 --- /dev/null +++ b/src/app/screens/home/home/components/HomeFeaturesView.tsx @@ -0,0 +1,148 @@ +import React from 'react'; +import { + Image, + ImageSourcePropType, + StyleSheet, + Text, + TouchableOpacity, + View, +} from 'react-native'; +import DataEmpty from '@common/components/DataEmpty'; +import { RequestError } from '@szyx-mobile/use-request'; + +const ITEM_WIDTH = '33.33%'; // 图标宽度 + +type Props = { + features?: { name: string; icon?: string; badge?: boolean }[]; + error?: RequestError; + reload?: () => void; + onPress?: (index: number) => void; +}; + +export default function HomeFeaturesView(props: Props) { + return ( + + + + + 精品服务 + + + {props.error && props.error.type !== 'Cancel' && ( + { + props.reload && props.reload(); + }} + /> + )} + {props.error === undefined && props.features && ( + + {props.features.map((feature, index) => { + return ( + { + props.onPress && props.onPress(index); + }} + /> + ); + })} + + )} + + ); +} + +function FeatureButtons(props: { + image: ImageSourcePropType; + title: string; + badge?: boolean; + onPress?: () => void; +}) { + return ( + { + props.onPress && props.onPress(); + }} + > + + + {props.badge === true && } + + + {props.title} + + + ); +} + +const styles = StyleSheet.create({ + contanier: { + backgroundColor: '#F3F4F5', + }, + content: { + flex: 1, + marginVertical: 6, + marginHorizontal: 12, + backgroundColor: '#FFFFFF', + borderRadius: 10, + paddingBottom: 14, + }, + header: { + borderTopLeftRadius: 10, + borderTopRightRadius: 10, + borderColor: '#FFFFFF', + borderWidth: 1, + }, + background: { + position: 'absolute', + borderTopLeftRadius: 10, + borderTopRightRadius: 10, + width: '100%', + height: '100%', + }, + title: { + color: '#001846', + fontSize: 16, + fontWeight: '700', + margin: 12, + marginTop: 20, + }, + items: { + flexDirection: 'row', + flexWrap: 'wrap', + }, + item: { + width: ITEM_WIDTH, + minWidth: 70, + paddingVertical: 10, + alignItems: 'center', + paddingHorizontal: 4, + }, + itemImage: { + width: 50, + height: 50, + marginBottom: 2, + }, + badge: { + position: 'absolute', + top: 0, + right: 0, + height: 9, + width: 9, + backgroundColor: '#FF6500', + borderRadius: 4.5, + }, + itemText: { + color: '#11102C', + fontSize: 15, + fontWeight: '500', + }, +}); diff --git a/src/app/screens/home/home/components/HomeTodoView.tsx b/src/app/screens/home/home/components/HomeTodoView.tsx new file mode 100644 index 0000000..009d202 --- /dev/null +++ b/src/app/screens/home/home/components/HomeTodoView.tsx @@ -0,0 +1,181 @@ +import React from 'react'; +import { + Image, + ImageSourcePropType, + Platform, + StyleSheet, + Text, + TouchableOpacity, + View, +} from 'react-native'; + +type Props = { + yiwangqianNum?: string; // 医网签未处理数量 + suifangNum?: string; // 随访未处理数量 + hospitalNum?: string; // 云诊室未处理数量 + onPressYiwangqian?: () => void; // 点击医网签 + onPressSuifang?: () => void; // 点击随访中心 + onPressHospital?: () => void; // 点击云诊室 +}; + +/** + * @description: 首页顶部医生代办视图 + */ +export default function HomeTodoView(props: Props) { + return ( + + + + {/* 今日未处理 */} + + + { + props.onPressYiwangqian && props.onPressYiwangqian(); + }} + /> + { + props.onPressSuifang && props.onPressSuifang(); + }} + /> + { + props.onPressHospital && props.onPressHospital(); + }} + /> + + + + ); +} + +function TodoItem(props: { + title: string; // 标题 + text: string; // 中间文字 + number: string; // 底部数字 + backgroundImage: ImageSourcePropType; // 背景图片 + onPress?: () => void; // 点击 +}) { + return ( + { + props.onPress && props.onPress(); + }} + > + + + + + + {props.title} + + + + {props.number} + + + {props.text} + + + + ); +} + +const styles = StyleSheet.create({ + container: { + marginTop: 10, + }, + arrow: { + width: 69, + height: 12, + marginLeft: 12, + tintColor: '#F8FDFF', + }, + content: { + padding: 6, + backgroundColor: '#F8FDFF', + borderTopLeftRadius: 12, + borderTopRightRadius: 12, + }, + title: { + marginHorizontal: 6, + marginTop: 12, + marginBottom: 9, + fontSize: 16, + color: '#666666', + fontWeight: '700', + }, + items: { + flexDirection: 'row', + padding: 3, + }, + item: { + flex: 1, + margin: 3, + backgroundColor: '#FFFFFF', + borderRadius: 8, + }, + itemContent: { + flex: 1, + borderRadius: 7, + justifyContent: 'center', + padding: 12, + }, + itemBackground: { + position: 'absolute', + width: 58, + height: 58, + right: -7, + bottom: -7, + }, + itemTop: { + flexDirection: 'row', + alignItems: 'center', + }, + itemTopBadge: { + backgroundColor: '#1D91FF', + height: 10, + width: 3, + borderRadius: 1.5, + marginRight: 4, + }, + itemTopText: { + fontSize: 16, + fontWeight: '600', + color: '#000000', + }, + itemText: { + fontSize: 14, + color: '#999999', + marginLeft: 7, + }, + itemNumber: { + color: '#000000', + fontWeight: '700', + fontSize: 24, + fontFamily: Platform.select({ + android: 'DINCondensedBold', + ios: 'DIN Condensed', + }), + marginTop: 16, + marginBottom: 3, + marginLeft: 7, + }, +}); diff --git a/src/app/screens/home/home/components/HomeTopView.tsx b/src/app/screens/home/home/components/HomeTopView.tsx new file mode 100644 index 0000000..c810490 --- /dev/null +++ b/src/app/screens/home/home/components/HomeTopView.tsx @@ -0,0 +1,155 @@ +import React, {memo} from 'react'; +import {Image, StyleSheet, Text, TouchableOpacity, View} from 'react-native'; + +const GREETINGSTRINGS = [ + '不断进步,超越自己!', + '自信自强,砥砺前行!', + '积极向上,充满信心!', + '努力追求,终达顶峰!', + '自信满满,开启新篇!', + '挥洒汗水,拥抱成功!', + '勇敢追求,梦想必达!', + '须及春光,力追朝阳!', + '笃定自信,无畏前行!', + '积极进取,永不放弃!', +]; + +/** + * @description: 获取打招呼字符串 + */ +function getGreeting(): string { + const currentHour = new Date().getHours(); + if (currentHour >= 0 && currentHour < 5) { + return '凌晨好'; + } else if (currentHour >= 5 && currentHour < 8) { + return '早上好'; + } else if (currentHour >= 8 && currentHour < 12) { + return '上午好'; + } else if (currentHour >= 12 && currentHour < 19) { + return '下午好'; + } else { + return '晚上好'; + } +} + +/** + * @description: 从字符串数组中获取随机一个字符串 + */ +function getRandomStringFromArray(strings: string[]): string { + const randomIndex = Math.floor(Math.random() * strings.length); + return strings[randomIndex]; +} + +type Props = { + nickname?: string; // 昵称 + isVerified?: boolean; // 是否已实名 + picUrl?: string; // 头像 + onPress?: () => void; // 点击实名那里的按钮 +}; + +/** + * @description: 首页顶部医生信息的视图 + */ +function HomeTopView(props: Props) { + return ( + + { + props.onPress && props.onPress(); + }}> + + 0 + ? {uri: props.picUrl} + : require('@app/assets/images/mine/mine_avatar.png') + } + /> + {props.isVerified !== undefined && ( + + + + )} + + + + + ); +} + +export default memo(HomeTopView); + +/** + * @description: 右边文字视图 + */ +function HomeTopRightView(props: {nickname?: string}) { + return ( + + + {props.nickname ? `${props.nickname},${getGreeting()}` : '---'} + + + {props.nickname ? `${getRandomStringFromArray(GREETINGSTRINGS)}` : ''} + + + ); +} + +const MemoizedHomeTopRightView = memo(HomeTopRightView); + +const styles = StyleSheet.create({ + top: { + height: 90, + flexDirection: 'row', + }, + topLeft: { + justifyContent: 'center', + }, + avatar: { + width: 73, + height: 73, + borderRadius: 37, + backgroundColor: '#FFFFFF', + marginHorizontal: 12, + alignItems: 'center', + }, + avatarImage: { + width: 73, + height: 73, + borderRadius: 73, + borderWidth: 2, + borderColor: '#FFF5E9', + }, + avatarBadgeTouch: { + width: 63, + height: 18, + top: -8, + }, + avatarBadge: { + width: 63, + height: 18, + }, + topRight: { + flex: 1, + marginRight: 12, + justifyContent: 'center', + }, + topTitleText: { + fontSize: 19, + color: '#17171A', + fontWeight: '600', + }, + topRightText: { + color: '#17171A', + marginTop: 14, + }, +}); diff --git a/src/app/screens/home/home/hooks/useHandleClickBannerListItem.ts b/src/app/screens/home/home/hooks/useHandleClickBannerListItem.ts new file mode 100644 index 0000000..7b60122 --- /dev/null +++ b/src/app/screens/home/home/hooks/useHandleClickBannerListItem.ts @@ -0,0 +1,49 @@ +import {useCallback} from 'react'; +import {Banner, Feature} from '@app/screens/api'; +import {NavigationProp, useNavigation} from '@react-navigation/native'; +import {MainParamList} from '@app/routes/MainParamList'; +import { showErrorMessage } from '@common/ToastHelper.ts'; + +const useHandleClickBannerListItem = ( + handleClickFeatureListItem: (feature: Feature) => void, +) => { + const navigation = useNavigation>(); + // 点击轮播图 + const handleClickBannerListItem = useCallback( + (banner: Banner) => { + // TODO: 处理 banner 版本是否低于手机app版本? + if (banner.jumpType === 'noSkip') { + return; + } + if (banner.jumpType === 'link') { + if (banner.skipUrl === undefined) { + showErrorMessage('链接配置错误,url没有配置'); + return; + } + return; + } + if (banner.jumpType === 'activity') { + if (banner.activityInfo) { + } + return; + } + if (banner.jumpType === 'miniApp') { + if (banner.miniAppInfo) { + handleClickFeatureListItem(banner.miniAppInfo); + } + return; + } + if (banner.jumpType === 'hotNews') { + if (banner.articleId) { + navigation.navigate('ArticleDetail', {id: banner.articleId}); + } + return; + } + }, + [handleClickFeatureListItem, navigation], + ); + + return handleClickBannerListItem; +}; + +export {useHandleClickBannerListItem}; diff --git a/src/app/screens/home/home/hooks/useHandleClickFeatureListItem.tsx b/src/app/screens/home/home/hooks/useHandleClickFeatureListItem.tsx new file mode 100644 index 0000000..e918fc8 --- /dev/null +++ b/src/app/screens/home/home/hooks/useHandleClickFeatureListItem.tsx @@ -0,0 +1,61 @@ +import React, { useCallback } from 'react'; +import { StyleSheet, Text } from 'react-native'; +import { Feature, useSubServerCheck } from '../api'; +import Toast from 'react-native-toast-message'; +import Alert from '@common/components/Alert.tsx'; +import { useAuth } from '@common/contexts/useAuth.ts'; + +// 点击精品模块 +const useHandleClickFeatureListItem = () => { + const { loading: subServerCheckLoading, fetchAsync: subServerCheckFetch } = + useSubServerCheck(); // 检查精品服务功能块是否可以进 + + const { + state: { userInfo }, + } = useAuth(); + + // 点击精品服务功能块 + const handleClickFeatureListItem = useCallback( + (feature: Feature) => { + // 只有实名可以进入 + if (userInfo?.realNameStatus !== 'success') { + // 未实名的需要实名 + Alert.show( + '立即实名认证', + + {'您还未实名认证,请认证后再操作~'} + , + { + action: () => {}, + }, + {}, + ); + return; + } + + subServerCheckFetch({ + data: { + nsId: feature.uniqueId, + }, + }) + .then(r => { + console.log('厂商信息', r); + }) + .catch(e => { + Toast.show(e.message); + }); + }, + [subServerCheckFetch, userInfo], + ); + return { subServerCheckLoading, handleClickFeatureListItem }; +}; + +export { useHandleClickFeatureListItem }; + +const styles = StyleSheet.create({ + alertText: { + textAlign: 'center', + color: '#999999', + fontSize: 12, + }, +}); diff --git a/src/app/screens/home/home/hooks/useHandleUnreadRemind.ts b/src/app/screens/home/home/hooks/useHandleUnreadRemind.ts new file mode 100644 index 0000000..797beb4 --- /dev/null +++ b/src/app/screens/home/home/hooks/useHandleUnreadRemind.ts @@ -0,0 +1,80 @@ +import { useCallback, useEffect, useState } from 'react'; +import { useUnreadRemind } from '../api'; +import AsyncStorage from '@react-native-async-storage/async-storage'; +import { DeviceEventEmitter } from 'react-native'; +import { + PERSONAL_NOTIFICATION, + PLATFORM_NOTIFICATION, +} from '@common/constants'; +import { showErrorMessage } from '@common/ToastHelper.ts'; + +const useHandleUnreadRemind = () => { + const [unread, setUnread] = useState(false); + const { loading: unreadRemindLoading, fetchAsync: unreadRemindFetch } = + useUnreadRemind(); + + const handleUnreadRemindFetch = useCallback(() => { + // 注意:这里取旧模块存储的最后已读时间,后续重构可能会删除或修改此处逻辑 + AsyncStorage.getItem('readNoticeLastTime') + .then(value => { + const parsedValue = JSON.parse(value ?? '{}'); + let time = parsedValue?.readNoticeLastTime; + if (time === null || time === undefined) { + time = '2000-01-01 00:00:00'; + } + unreadRemindFetch({ + data: { + timeStamp: time, + }, + }) + .then(r => { + setUnread(r.unread); + }) + .catch(e => { + showErrorMessage(e.message); + }); + }) + .catch(e => { + showErrorMessage(e.message); + }); + }, [unreadRemindFetch]); + + // 【监听im】 + // 监听系统公告 + useEffect(() => { + const listener = DeviceEventEmitter.addListener( + PLATFORM_NOTIFICATION, + () => { + // 刷新铃铛接口 + handleUnreadRemindFetch(); + }, + ); + + return () => { + listener.remove(); + }; + }, [handleUnreadRemindFetch]); + + // 监听站内信 + useEffect(() => { + const listener = DeviceEventEmitter.addListener( + PERSONAL_NOTIFICATION, + () => { + // 刷新铃铛接口 + handleUnreadRemindFetch(); + }, + ); + + return () => { + listener.remove(); + }; + }, [handleUnreadRemindFetch]); + + return { + unread, + unreadRemindLoading, + handleUnreadRemindFetch, + }; +}; + +export { useHandleUnreadRemind }; diff --git a/src/app/screens/mine/contactSupport/ContactSupportScreen.tsx b/src/app/screens/mine/contactSupport/ContactSupportScreen.tsx new file mode 100644 index 0000000..b30873c --- /dev/null +++ b/src/app/screens/mine/contactSupport/ContactSupportScreen.tsx @@ -0,0 +1,147 @@ +import React, { useRef } from 'react'; +import { + Image, + ImageBackground, + Pressable, + StyleSheet, + Text, + View, +} from 'react-native'; +import { StackScreenProps } from '@react-navigation/stack'; +import { MainParamList } from '@app/routes/MainParamList'; +import SubmitButton from '@common/components/SubmitButton'; +import { useCustomrConfig } from './api'; +import Spinner from '@common/components/Spinner'; +import DataEmpty from '@common/components/DataEmpty'; +import ViewShot from 'react-native-view-shot'; + +type Props = StackScreenProps; + +export default function ContactSupportScreen(props: Props) { + const {navigation} = props; + + const shotRef = useRef(null); // 保存到本地的视图的引用 + + // 【接口】 + const {response, error, loading, fetch} = useCustomrConfig(); + + return ( + + { + navigation.pop(); + }} + /> + + + + + + + 医网信小助手 + + + + 服务时间:9:00-18:00 + + + {loading === true ? ( + + ) : error !== undefined ? ( + { + fetch(); + }} + /> + ) : response?.imgUrl ? ( + + ) : null} + + + + { + }} + /> + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + }, + background: { + backgroundColor: 'rgba(0, 0, 0, 0.7)', + }, + content: { + width: '70%', + }, + imageBackground: { + width: '100%', + aspectRatio: 260 / 357, + justifyContent: 'center', + alignItems: 'center', + }, + header: { + flexDirection: 'row', + alignItems: 'center', + marginLeft: 12, + marginRight: 18, // 背景图不是中心对称,内容需要向左偏移一些 + }, + headerImage: { + width: 17, + height: 17, + marginRight: 6, + }, + headerTitle: { + color: '#1D91FF', + fontSize: 16, + fontWeight: '600', + }, + headerText: { + color: '#999999', + fontSize: 12, + marginVertical: 12, + marginLeft: 12, + marginRight: 18, // 背景图不是中心对称,内容需要向左偏移一些 + }, + qrCodeView: { + aspectRatio: 1, + width: '80%', + borderRadius: 5, + borderColor: 'rgba(1, 137, 255, 0.14)', + borderWidth: 4.5, + alignItems: 'center', + justifyContent: 'center', + marginRight: 6, // 背景图不是中心对称,内容需要向左偏移一些 + }, + qrCodeImage: { + width: '90%', + height: '90%', + }, + submit: { + marginTop: 24, + }, +}); diff --git a/src/app/screens/mine/contactSupport/api/index.ts b/src/app/screens/mine/contactSupport/api/index.ts new file mode 100644 index 0000000..12e5cbc --- /dev/null +++ b/src/app/screens/mine/contactSupport/api/index.ts @@ -0,0 +1 @@ +export * from './useCustomrConfig'; diff --git a/src/app/screens/mine/contactSupport/api/useCustomrConfig.ts b/src/app/screens/mine/contactSupport/api/useCustomrConfig.ts new file mode 100644 index 0000000..bd9508b --- /dev/null +++ b/src/app/screens/mine/contactSupport/api/useCustomrConfig.ts @@ -0,0 +1,18 @@ +import {useApi} from '@common/api/useApi.ts'; +import {z} from 'zod'; + +// 客服信息 +// {"collection": "customer_config_info", "id": "{\"$oid\":\"66050aa9986acc61cd268da4\"}", "imgUrl": "https://tms-dev.oss-cn-beijing.aliyuncs.com/banner/headimg_40fa54e416eb439faf4dd95a2f4a9948.png", "phones": "18312341234,18012312332", "wx": "wx-123456633"} +const useCustomrConfig = () => { + return useApi( + '/am/v1/feedback/getCustomerConfig', + 'GET', + undefined, + z.object({ + imgUrl: z.string().url(), // 二维码图片 + }), + {automatic: true, loadingDelay: 500}, + ); +}; + +export {useCustomrConfig}; diff --git a/src/app/screens/mine/mine/MineScreen.tsx b/src/app/screens/mine/mine/MineScreen.tsx new file mode 100644 index 0000000..8a56755 --- /dev/null +++ b/src/app/screens/mine/mine/MineScreen.tsx @@ -0,0 +1,400 @@ +import React, { + useCallback, + useEffect, + useLayoutEffect, + useRef, + useState, +} from 'react'; +import { + Image, + NativeEventEmitter, + NativeModules, + RefreshControl, + SafeAreaView, + ScrollView, + StyleSheet, + Text, + TouchableOpacity, + View, +} from 'react-native'; +import { CompositeScreenProps, useFocusEffect } from '@react-navigation/native'; +import { StackScreenProps } from '@react-navigation/stack'; +import { useHeaderHeight } from '@react-navigation/elements'; +import { BottomTabScreenProps } from '@react-navigation/bottom-tabs'; +import { MainParamList, MainTabParamList } from '@app/routes/MainParamList'; +import LinearGradient from 'react-native-linear-gradient'; +import FeatureButton from './components/FeatureButton'; +import { useAuth } from '@common/contexts/useAuth'; +import BottomSheet from '@common/components/BottomSheet'; +import useUpdateRef from '@app/hooks/useUpdateRef'; +import Spinner from '@common/components/Spinner'; +import { useHandleUnreadRemind } from '@app/screens/home/home/hooks/useHandleUnreadRemind'; +import { debounce } from '@common/utils/commonUtils'; + +type Props = CompositeScreenProps< + BottomTabScreenProps, + StackScreenProps +>; + +export default function HomeScreen(props: Props) { + const { navigation } = props; + const headerHeight = useHeaderHeight(); + + const [adKey, setAdKey] = useState(undefined); + + useLayoutEffect(() => { + navigation.setOptions({ + title: '我的', + headerTransparent: true, + }); + + const pushListener = new NativeEventEmitter( + NativeModules.innerModule, + ).addListener('adViewRefresh', key => { + if (key && key === 'MineScreen') { + console.log('*********************show', key); + setAdKey(new Date().getTime().toString()); + } + }); + return () => { + pushListener.remove(); + }; + }, [navigation]); + + useFocusEffect( + useCallback(() => { + if (!adKey) { + setAdKey(new Date().getTime().toString()); + } + }, [adKey]), + ); + + // 【引用】 + const scrollRef = useRef(null); + + const { + state: { userInfo }, + actions: { update }, + } = useAuth(); + const userInfoRef = useUpdateRef(userInfo); + + const { unread, unreadRemindLoading, handleUnreadRemindFetch } = + useHandleUnreadRemind(); // 处理未读消息相关 + + useEffect(() => { + handleUnreadRemindFetch(); + }, [handleUnreadRemindFetch]); + + // 下拉刷新 + const handleRefresh = useCallback(() => { + handleUnreadRemindFetch(); + }, [handleUnreadRemindFetch]); + + return ( + + {/* 顶部背景 */} + + + + {/* 底部背景 */} + + + + + + 名医首选互联网职业应用产品 + + + + + {/* 主内容 */} + + } + > + {/* 顶部医生信息区域 */} + + + { + debounce(() => {}); + }} + > + + + 0 + ? { uri: userInfo.picUrl } + : require('@app/assets/images/mine/mine_avatar.png') + } + /> + + + + + + + + + {`${userInfo?.nickname ?? ''}医生`} + + + + + {userInfo?.phone + ? `${userInfo?.phone.replace( + /(\d{3})\d{4}(\d{4})/, + '$1****$2', + )}` + : ''} + + + + {/* 常用功能区域 */} + + + 常用功能 + + + { + debounce(() => {}); + }} + /> + { + debounce(() => {}); + }} + /> + { + if (userInfo === undefined) { + return; + } + debounce(() => {}); + }} + /> + {/* 只有用户包含冠新才有切换按钮 */} + {userInfo && userInfo.userType !== 'general' && ( + { + BottomSheet.show( + [ + { id: 0, text: '医网信(当前)' }, + { id: 1, text: '国家医疗服务数据中心用户专版' }, + ], + undefined, + item => { + if (userInfoRef.current === undefined) { + return; + } + if (item.id === 1) { + // 更新当前角色 + update({ + ...userInfoRef.current, + currentUserType: 'guanxin', + }); + } + }, + ); + }} + /> + )} + { + debounce(() => {}); + }} + /> + { + navigation.navigate('ContactSupport'); + }} + /> + { + debounce(() => {}); + }} + /> + + + + + {unreadRemindLoading && } + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#F3F4F5', + }, + topBackground: { + position: 'absolute', + top: 0, + left: 0, + right: 0, + height: 260, + }, + backgroundImage: { + flex: 1, + width: '100%', + }, + bottomBackground: { + position: 'absolute', + bottom: 35, + left: 0, + right: 0, + alignItems: 'center', + }, + bottomBackgroundImage: { + marginVertical: 8, + }, + bottomBackgroundTextView: { + flexDirection: 'row', + alignItems: 'center', + }, + bottomBackgroundLine: { + height: 1, + width: 36, + borderRadius: 0.5, + }, + bottomBackgroundText: { + color: 'rgba(133, 133, 133, 0.45)', + fontSize: 12, + marginHorizontal: 5, + }, + scroll: { + flex: 1, + }, + header: { + height: 90, + flexDirection: 'row', + }, + headerLeft: { + justifyContent: 'center', + }, + avatar: { + width: 73, + height: 73, + borderRadius: 37, + backgroundColor: '#FFFFFF', + marginHorizontal: 12, + alignItems: 'center', + }, + avatarImage: { + width: 73, + height: 73, + borderRadius: 73, + borderWidth: 2, + borderColor: '#FFF5E9', + }, + avatarBadgeTouch: { + width: 63, + height: 18, + top: -8, + }, + avatarBadge: { + width: 63, + height: 18, + }, + headerRight: { + flex: 1, + marginRight: 12, + justifyContent: 'center', + }, + headerTitle: { + flexDirection: 'row', + alignItems: 'center', + }, + headerTitleText: { + flexShrink: 1, + fontSize: 19, + color: '#17171A', + fontWeight: '600', + }, + headerTitleArrow: { + width: 6, + height: 10, + tintColor: '#17171A', + marginLeft: 8, + }, + headerRightText: { + color: '#17171A', + marginTop: 14, + }, + middle: { + margin: 12, + padding: 12, + backgroundColor: '#FFFFFF', + borderRadius: 10, + }, + middleTitle: { + alignSelf: 'flex-start', + color: '#001846', + fontSize: 16, + fontWeight: '600', + marginBottom: 12, + marginTop: 4, + }, + middleContent: { + flexDirection: 'row', + flexWrap: 'wrap', + marginBottom: 10, + }, + carousel: { + // marginHorizontal: PADDING_HORIZONTAL, + height: 120, + borderRadius: 6, + }, +}); diff --git a/src/app/screens/mine/mine/components/FeatureButton.tsx b/src/app/screens/mine/mine/components/FeatureButton.tsx new file mode 100644 index 0000000..fe245d2 --- /dev/null +++ b/src/app/screens/mine/mine/components/FeatureButton.tsx @@ -0,0 +1,82 @@ +import React from 'react'; +import { + Image, + ImageSourcePropType, + StyleSheet, + Text, + TouchableOpacity, + View, +} from 'react-native'; + +const ITEM_WIDTH = '25%'; // 图标宽度 + +type Props = { + image: ImageSourcePropType; + title: string; + badge?: boolean; + onPress?: () => void; +}; + +export default function FeatureButton(props: Props) { + if (props.title === '咨询客服') { + return ( + { + props.onPress && props.onPress(); + }} + > + + + + {props.title} + + + + ); + } + return ( + { + props.onPress && props.onPress(); + }} + > + + + {props.badge === true && } + + + {props.title} + + + ); +} + +const styles = StyleSheet.create({ + container: { + width: ITEM_WIDTH, + minWidth: 50, + paddingVertical: 12, + alignItems: 'center', + paddingHorizontal: 4, + }, + image: { + width: 24, + height: 24, + marginBottom: 6, + }, + text: { + color: '#130700', + fontSize: 12, + }, + badge: { + position: 'absolute', + width: 6, + height: 6, + backgroundColor: '#FF6500', + borderRadius: 3, + top: 0, + right: 0, + }, +}); diff --git a/src/app/assets/images/common/common_list_empty.png b/src/common/assets/images/common_list_empty.png similarity index 100% rename from src/app/assets/images/common/common_list_empty.png rename to src/common/assets/images/common_list_empty.png diff --git a/src/app/assets/images/common/common_list_empty@2x.png b/src/common/assets/images/common_list_empty@2x.png similarity index 100% rename from src/app/assets/images/common/common_list_empty@2x.png rename to src/common/assets/images/common_list_empty@2x.png diff --git a/src/app/assets/images/common/common_list_empty@3x.png b/src/common/assets/images/common_list_empty@3x.png similarity index 100% rename from src/app/assets/images/common/common_list_empty@3x.png rename to src/common/assets/images/common_list_empty@3x.png diff --git a/src/common/common.ts b/src/common/common.ts index 1b1a307..11eb342 100644 --- a/src/common/common.ts +++ b/src/common/common.ts @@ -12,12 +12,16 @@ import 'react-native-device-info'; // 应用间路由工具 import '@common/NavigationHelper'; import '@common/UpdateHelper.ts'; -// 弹出相关 +// 自定义组件 import '@common/ToastHelper.ts'; import '@common/components/Alert.tsx'; import '@common/components/BottomSheet.tsx'; import '@common/components/HeaderBackImage.tsx'; import '@common/components/Spinner.tsx'; +import '@common/components/Separator.tsx'; +import '@common/components/DataEmpty.tsx'; +import '@common/components/ListEmpty.tsx'; +import '@common/components/TabBarIcon.tsx'; // 工具 import '@common/utils/commonUtils.ts'; import '@common/utils/md5'; diff --git a/src/common/components/DataEmpty.tsx b/src/common/components/DataEmpty.tsx new file mode 100644 index 0000000..4282ac6 --- /dev/null +++ b/src/common/components/DataEmpty.tsx @@ -0,0 +1,58 @@ +import React, { JSX } from 'react'; +import { StyleSheet, Text, TouchableOpacity, View } from 'react-native'; + +type Props = { + title?: string; + info?: string; + reload: () => void; +}; + +export default function DataEmpty(props: Props): JSX.Element { + return ( + + {props.title ?? '网络加载失败'} + {props.info && {props.info}} + { + props.reload(); + }} + > + 重新加载 + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + }, + title: { + textAlign: 'center', + color: '#4E4E4E', + fontSize: 15, + }, + info: { + textAlign: 'center', + color: '#6B6B6B', + fontSize: 14, + marginVertical: 8, + }, + button: { + width: 100, + height: 40, + borderWidth: 1, + borderColor: '#A9A9A9', + borderRadius: 8, + alignItems: 'center', + justifyContent: 'center', + margin: 28, + }, + buttonText: { + color: '#2B2B2B', + fontSize: 14, + }, +}); diff --git a/src/common/components/ListEmpty.tsx b/src/common/components/ListEmpty.tsx new file mode 100644 index 0000000..92d2176 --- /dev/null +++ b/src/common/components/ListEmpty.tsx @@ -0,0 +1,40 @@ +import React, { JSX } from 'react'; +import { Image, StyleSheet, Text, View } from 'react-native'; + +type Props = { + text?: string; +}; + +export default function ListEmpty(props: Props): JSX.Element { + return ( + + + + {props.text && props.text.length > 0 ? props.text : '暂无数据'} + + + ); +} + +const styles = StyleSheet.create({ + container: { + alignItems: 'center', + justifyContent: 'center', + marginTop: 50, + marginBottom: 20, + }, + image: { + width: 150, + height: 102, + }, + text: { + textAlign: 'center', + color: '#6B6B75', + fontSize: 14, + marginTop: 15, + }, +}); diff --git a/src/common/components/Separator.tsx b/src/common/components/Separator.tsx new file mode 100644 index 0000000..622bed2 --- /dev/null +++ b/src/common/components/Separator.tsx @@ -0,0 +1,18 @@ +import React from 'react'; +import {StyleProp, StyleSheet, View, ViewStyle} from 'react-native'; + +type Props = { + style?: StyleProp; +}; + +export default function Separator(props: Props) { + return ; +} + +const styles = StyleSheet.create({ + separator: { + backgroundColor: '#F6F8FB', + marginHorizontal: 12, + height: 0.5, + }, +}); diff --git a/src/common/components/TabBarIcon.tsx b/src/common/components/TabBarIcon.tsx new file mode 100644 index 0000000..36195b9 --- /dev/null +++ b/src/common/components/TabBarIcon.tsx @@ -0,0 +1,60 @@ +import React from 'react'; +import {Image, ImageSourcePropType, StyleSheet, View} from 'react-native'; +import {TAB_BAR_ICON_SIZE} from '@common/constants'; + +type Props = { + focused: boolean; + size: number; + activeImage: ImageSourcePropType; + inactiveImage: ImageSourcePropType; + activeTintColor?: string; + inactiveTintColor: string; + badge?: boolean; +}; + +export default function TabBarIcon(props: Props) { + return ( + + + {props.badge === true && } + + ); +} + +const styles = StyleSheet.create({ + container: { + alignItems: 'center', + justifyContent: 'flex-end', + }, + badge: { + position: 'absolute', + width: 9, + height: 9, + right: 0, + top: 0, + borderRadius: 9, + backgroundColor: '#FF3500', + }, +}); diff --git a/src/common/router/CommonParamList.ts b/src/common/router/CommonParamList.ts index d7cce7d..9f35b0e 100644 --- a/src/common/router/CommonParamList.ts +++ b/src/common/router/CommonParamList.ts @@ -1,6 +1,12 @@ export type CommonParamList = { + // 通用的 webview 页面 WebView: { - url: string; // 地址 - title?: string; // 标题 - }; // 通用的 webview 页面 + // 地址 + url: string; + // 标题 + title?: string; + }; + + // 扫一扫 + Scan: undefined; }; diff --git a/src/common/screens/scan/ScanScreen.tsx b/src/common/screens/scan/ScanScreen.tsx new file mode 100644 index 0000000..19be80a --- /dev/null +++ b/src/common/screens/scan/ScanScreen.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import { StyleSheet, Text, View } from 'react-native'; +import { StackScreenProps } from '@react-navigation/stack'; +import { CommonParamList } from '@common/router/CommonParamList.ts'; + +type Props = StackScreenProps; + +export default function ScanScreen(props: Props) { + return ( + + 扫一扫 + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + }, + webview: { + flex: 1, + }, + activityIndicator: { + position: 'absolute', + alignSelf: 'center', + top: 100, + }, +}); diff --git a/yarn.lock b/yarn.lock index 0f7956d..9b6293a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -72,6 +72,17 @@ "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" +"@babel/generator@^7.28.3": + version "7.28.3" + resolved "https://nexus-inner.51trust.com/repository/npm/@babel/generator/-/generator-7.28.3.tgz#9626c1741c650cbac39121694a0f2d7451b8ef3e" + integrity sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw== + dependencies: + "@babel/parser" "^7.28.3" + "@babel/types" "^7.28.2" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + "@babel/helper-annotate-as-pure@^7.27.1", "@babel/helper-annotate-as-pure@^7.27.3": version "7.27.3" resolved "https://nexus-inner.51trust.com/repository/npm/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz" @@ -230,6 +241,13 @@ dependencies: "@babel/types" "^7.28.0" +"@babel/parser@^7.28.3": + version "7.28.3" + resolved "https://nexus-inner.51trust.com/repository/npm/@babel/parser/-/parser-7.28.3.tgz#d2d25b814621bca5fe9d172bc93792547e7a2a71" + integrity sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA== + dependencies: + "@babel/types" "^7.28.2" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.27.1": version "7.27.1" resolved "https://nexus-inner.51trust.com/repository/npm/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz" @@ -436,7 +454,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.24.7", "@babel/plugin-transform-arrow-functions@^7.27.1": +"@babel/plugin-transform-arrow-functions@^7.0.0-0", "@babel/plugin-transform-arrow-functions@^7.24.7", "@babel/plugin-transform-arrow-functions@^7.27.1": version "7.27.1" resolved "https://nexus-inner.51trust.com/repository/npm/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz" integrity sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA== @@ -475,7 +493,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-class-properties@^7.25.4", "@babel/plugin-transform-class-properties@^7.27.1": +"@babel/plugin-transform-class-properties@^7.0.0-0", "@babel/plugin-transform-class-properties@^7.25.4", "@babel/plugin-transform-class-properties@^7.27.1": version "7.27.1" resolved "https://nexus-inner.51trust.com/repository/npm/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz" integrity sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA== @@ -491,6 +509,18 @@ "@babel/helper-create-class-features-plugin" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" +"@babel/plugin-transform-classes@^7.0.0-0": + version "7.28.3" + resolved "https://nexus-inner.51trust.com/repository/npm/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz#598297260343d0edbd51cb5f5075e07dee91963a" + integrity sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.3" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-globals" "^7.28.0" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-replace-supers" "^7.27.1" + "@babel/traverse" "^7.28.3" + "@babel/plugin-transform-classes@^7.25.4", "@babel/plugin-transform-classes@^7.28.0": version "7.28.0" resolved "https://nexus-inner.51trust.com/repository/npm/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.0.tgz" @@ -673,7 +703,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7", "@babel/plugin-transform-nullish-coalescing-operator@^7.27.1": +"@babel/plugin-transform-nullish-coalescing-operator@^7.0.0-0", "@babel/plugin-transform-nullish-coalescing-operator@^7.24.7", "@babel/plugin-transform-nullish-coalescing-operator@^7.27.1": version "7.27.1" resolved "https://nexus-inner.51trust.com/repository/npm/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz" integrity sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA== @@ -713,7 +743,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-optional-chaining@^7.24.8", "@babel/plugin-transform-optional-chaining@^7.27.1": +"@babel/plugin-transform-optional-chaining@^7.0.0-0", "@babel/plugin-transform-optional-chaining@^7.24.8", "@babel/plugin-transform-optional-chaining@^7.27.1": version "7.27.1" resolved "https://nexus-inner.51trust.com/repository/npm/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz" integrity sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg== @@ -818,7 +848,7 @@ babel-plugin-polyfill-regenerator "^0.6.5" semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.24.7", "@babel/plugin-transform-shorthand-properties@^7.27.1": +"@babel/plugin-transform-shorthand-properties@^7.0.0-0", "@babel/plugin-transform-shorthand-properties@^7.24.7", "@babel/plugin-transform-shorthand-properties@^7.27.1": version "7.27.1" resolved "https://nexus-inner.51trust.com/repository/npm/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz" integrity sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ== @@ -840,7 +870,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-template-literals@^7.27.1": +"@babel/plugin-transform-template-literals@^7.0.0-0", "@babel/plugin-transform-template-literals@^7.27.1": version "7.27.1" resolved "https://nexus-inner.51trust.com/repository/npm/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz" integrity sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg== @@ -854,7 +884,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-typescript@^7.25.2": +"@babel/plugin-transform-typescript@^7.25.2", "@babel/plugin-transform-typescript@^7.27.1": version "7.28.0" resolved "https://nexus-inner.51trust.com/repository/npm/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz" integrity sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg== @@ -880,7 +910,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-unicode-regex@^7.24.7", "@babel/plugin-transform-unicode-regex@^7.27.1": +"@babel/plugin-transform-unicode-regex@^7.0.0-0", "@babel/plugin-transform-unicode-regex@^7.24.7", "@babel/plugin-transform-unicode-regex@^7.27.1": version "7.27.1" resolved "https://nexus-inner.51trust.com/repository/npm/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz" integrity sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw== @@ -981,7 +1011,18 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@^7.25.0", "@babel/runtime@^7.5.5": +"@babel/preset-typescript@^7.16.7": + version "7.27.1" + resolved "https://nexus-inner.51trust.com/repository/npm/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz#190742a6428d282306648a55b0529b561484f912" + integrity sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + "@babel/plugin-syntax-jsx" "^7.27.1" + "@babel/plugin-transform-modules-commonjs" "^7.27.1" + "@babel/plugin-transform-typescript" "^7.27.1" + +"@babel/runtime@^7.25.0": version "7.27.6" resolved "https://nexus-inner.51trust.com/repository/npm/@babel/runtime/-/runtime-7.27.6.tgz" integrity sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q== @@ -1021,6 +1062,19 @@ "@babel/types" "^7.28.0" debug "^4.3.1" +"@babel/traverse@^7.28.3": + version "7.28.3" + resolved "https://nexus-inner.51trust.com/repository/npm/@babel/traverse/-/traverse-7.28.3.tgz#6911a10795d2cce43ec6a28cffc440cca2593434" + integrity sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.3" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.28.3" + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.2" + debug "^4.3.1" + "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.2", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.27.6", "@babel/types@^7.28.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.28.1" resolved "https://nexus-inner.51trust.com/repository/npm/@babel/types/-/types-7.28.1.tgz" @@ -1029,224 +1083,19 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" +"@babel/types@^7.28.2": + version "7.28.2" + resolved "https://nexus-inner.51trust.com/repository/npm/@babel/types/-/types-7.28.2.tgz#da9db0856a9a88e0a13b019881d7513588cf712b" + integrity sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://nexus-inner.51trust.com/repository/npm/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@changesets/apply-release-plan@^7.0.12": - version "7.0.12" - resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/apply-release-plan/-/apply-release-plan-7.0.12.tgz#8413977f117fa95f6e2db6f0c35479a2eba6960a" - integrity sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ== - dependencies: - "@changesets/config" "^3.1.1" - "@changesets/get-version-range-type" "^0.4.0" - "@changesets/git" "^3.0.4" - "@changesets/should-skip-package" "^0.1.2" - "@changesets/types" "^6.1.0" - "@manypkg/get-packages" "^1.1.3" - detect-indent "^6.0.0" - fs-extra "^7.0.1" - lodash.startcase "^4.4.0" - outdent "^0.5.0" - prettier "^2.7.1" - resolve-from "^5.0.0" - semver "^7.5.3" - -"@changesets/assemble-release-plan@^6.0.9": - version "6.0.9" - resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.9.tgz#8aa5baf0037a85812e320172e83b92ca31e85fd6" - integrity sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ== - dependencies: - "@changesets/errors" "^0.2.0" - "@changesets/get-dependents-graph" "^2.1.3" - "@changesets/should-skip-package" "^0.1.2" - "@changesets/types" "^6.1.0" - "@manypkg/get-packages" "^1.1.3" - semver "^7.5.3" - -"@changesets/changelog-git@^0.2.1": - version "0.2.1" - resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/changelog-git/-/changelog-git-0.2.1.tgz#7f311f3dc11eae1235aa7fd2c1807112962b409b" - integrity sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q== - dependencies: - "@changesets/types" "^6.1.0" - -"@changesets/changelog-github@^0.5.0": - version "0.5.1" - resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/changelog-github/-/changelog-github-0.5.1.tgz#58870f77cdfd6d59c73cc046a61e55e82d606d24" - integrity sha512-BVuHtF+hrhUScSoHnJwTELB4/INQxVFc+P/Qdt20BLiBFIHFJDDUaGsZw+8fQeJTRP5hJZrzpt3oZWh0G19rAQ== - dependencies: - "@changesets/get-github-info" "^0.6.0" - "@changesets/types" "^6.1.0" - dotenv "^8.1.0" - -"@changesets/cli@^2.27.1": - version "2.29.5" - resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/cli/-/cli-2.29.5.tgz#7ff589686b5a16b6790962ac09182c7462db4899" - integrity sha512-0j0cPq3fgxt2dPdFsg4XvO+6L66RC0pZybT9F4dG5TBrLA3jA/1pNkdTXH9IBBVHkgsKrNKenI3n1mPyPlIydg== - dependencies: - "@changesets/apply-release-plan" "^7.0.12" - "@changesets/assemble-release-plan" "^6.0.9" - "@changesets/changelog-git" "^0.2.1" - "@changesets/config" "^3.1.1" - "@changesets/errors" "^0.2.0" - "@changesets/get-dependents-graph" "^2.1.3" - "@changesets/get-release-plan" "^4.0.13" - "@changesets/git" "^3.0.4" - "@changesets/logger" "^0.1.1" - "@changesets/pre" "^2.0.2" - "@changesets/read" "^0.6.5" - "@changesets/should-skip-package" "^0.1.2" - "@changesets/types" "^6.1.0" - "@changesets/write" "^0.4.0" - "@manypkg/get-packages" "^1.1.3" - ansi-colors "^4.1.3" - ci-info "^3.7.0" - enquirer "^2.4.1" - external-editor "^3.1.0" - fs-extra "^7.0.1" - mri "^1.2.0" - p-limit "^2.2.0" - package-manager-detector "^0.2.0" - picocolors "^1.1.0" - resolve-from "^5.0.0" - semver "^7.5.3" - spawndamnit "^3.0.1" - term-size "^2.1.0" - -"@changesets/config@^3.1.1": - version "3.1.1" - resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/config/-/config-3.1.1.tgz#3e5b1f74236a4552c5f4eddf2bd05a43a0b71160" - integrity sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA== - dependencies: - "@changesets/errors" "^0.2.0" - "@changesets/get-dependents-graph" "^2.1.3" - "@changesets/logger" "^0.1.1" - "@changesets/types" "^6.1.0" - "@manypkg/get-packages" "^1.1.3" - fs-extra "^7.0.1" - micromatch "^4.0.8" - -"@changesets/errors@^0.2.0": - version "0.2.0" - resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/errors/-/errors-0.2.0.tgz#3c545e802b0f053389cadcf0ed54e5636ff9026a" - integrity sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow== - dependencies: - extendable-error "^0.1.5" - -"@changesets/get-dependents-graph@^2.1.3": - version "2.1.3" - resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.3.tgz#cd31b39daab7102921fb65acdcb51b4658502eee" - integrity sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ== - dependencies: - "@changesets/types" "^6.1.0" - "@manypkg/get-packages" "^1.1.3" - picocolors "^1.1.0" - semver "^7.5.3" - -"@changesets/get-github-info@^0.6.0": - version "0.6.0" - resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/get-github-info/-/get-github-info-0.6.0.tgz#faba66a20a3a5a0cbabea28efd43c9ede7429f11" - integrity sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA== - dependencies: - dataloader "^1.4.0" - node-fetch "^2.5.0" - -"@changesets/get-release-plan@^4.0.13": - version "4.0.13" - resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/get-release-plan/-/get-release-plan-4.0.13.tgz#02e2d9b89a3911bfc4bf1dafe237098b4b7454e9" - integrity sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg== - dependencies: - "@changesets/assemble-release-plan" "^6.0.9" - "@changesets/config" "^3.1.1" - "@changesets/pre" "^2.0.2" - "@changesets/read" "^0.6.5" - "@changesets/types" "^6.1.0" - "@manypkg/get-packages" "^1.1.3" - -"@changesets/get-version-range-type@^0.4.0": - version "0.4.0" - resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz#429a90410eefef4368502c41c63413e291740bf5" - integrity sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ== - -"@changesets/git@^3.0.4": - version "3.0.4" - resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/git/-/git-3.0.4.tgz#75e3811ab407ec010beb51131ceb5c6b3975c914" - integrity sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw== - dependencies: - "@changesets/errors" "^0.2.0" - "@manypkg/get-packages" "^1.1.3" - is-subdir "^1.1.1" - micromatch "^4.0.8" - spawndamnit "^3.0.1" - -"@changesets/logger@^0.1.1": - version "0.1.1" - resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/logger/-/logger-0.1.1.tgz#9926ac4dc8fb00472fe1711603b6b4755d64b435" - integrity sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg== - dependencies: - picocolors "^1.1.0" - -"@changesets/parse@^0.4.1": - version "0.4.1" - resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/parse/-/parse-0.4.1.tgz#18ba51d2eb784d27469034f06344f8fdcba586df" - integrity sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q== - dependencies: - "@changesets/types" "^6.1.0" - js-yaml "^3.13.1" - -"@changesets/pre@^2.0.2": - version "2.0.2" - resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/pre/-/pre-2.0.2.tgz#b35e84d25fca8b970340642ca04ce76c7fc34ced" - integrity sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug== - dependencies: - "@changesets/errors" "^0.2.0" - "@changesets/types" "^6.1.0" - "@manypkg/get-packages" "^1.1.3" - fs-extra "^7.0.1" - -"@changesets/read@^0.6.5": - version "0.6.5" - resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/read/-/read-0.6.5.tgz#7a68457e6356d3df187aa18e388f1b8dba3d2156" - integrity sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg== - dependencies: - "@changesets/git" "^3.0.4" - "@changesets/logger" "^0.1.1" - "@changesets/parse" "^0.4.1" - "@changesets/types" "^6.1.0" - fs-extra "^7.0.1" - p-filter "^2.1.0" - picocolors "^1.1.0" - -"@changesets/should-skip-package@^0.1.2": - version "0.1.2" - resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/should-skip-package/-/should-skip-package-0.1.2.tgz#c018e1e05eab3d97afa4c4590f2b0db7486ae488" - integrity sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw== - dependencies: - "@changesets/types" "^6.1.0" - "@manypkg/get-packages" "^1.1.3" - -"@changesets/types@^4.0.1": - version "4.1.0" - resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/types/-/types-4.1.0.tgz#fb8f7ca2324fd54954824e864f9a61a82cb78fe0" - integrity sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw== - -"@changesets/types@^6.1.0": - version "6.1.0" - resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/types/-/types-6.1.0.tgz#12a4c8490827d26bc6fbf97a151499be2fb6d2f5" - integrity sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA== - -"@changesets/write@^0.4.0": - version "0.4.0" - resolved "https://nexus-inner.51trust.com/repository/npm/@changesets/write/-/write-0.4.0.tgz#ec903cbd8aa9b6da6fa09ef19fb609eedd115ed6" - integrity sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q== - dependencies: - "@changesets/types" "^6.1.0" - fs-extra "^7.0.1" - human-id "^4.1.1" - prettier "^2.7.1" - "@egjs/hammerjs@^2.0.17": version "2.0.17" resolved "https://nexus-inner.51trust.com/repository/npm/@egjs/hammerjs/-/hammerjs-2.0.17.tgz#5dc02af75a6a06e4c2db0202cae38c9263895124" @@ -1587,28 +1436,6 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@manypkg/find-root@^1.1.0": - version "1.1.0" - resolved "https://nexus-inner.51trust.com/repository/npm/@manypkg/find-root/-/find-root-1.1.0.tgz#a62d8ed1cd7e7d4c11d9d52a8397460b5d4ad29f" - integrity sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA== - dependencies: - "@babel/runtime" "^7.5.5" - "@types/node" "^12.7.1" - find-up "^4.1.0" - fs-extra "^8.1.0" - -"@manypkg/get-packages@^1.1.3": - version "1.1.3" - resolved "https://nexus-inner.51trust.com/repository/npm/@manypkg/get-packages/-/get-packages-1.1.3.tgz#e184db9bba792fa4693de4658cfb1463ac2c9c47" - integrity sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A== - dependencies: - "@babel/runtime" "^7.5.5" - "@changesets/types" "^4.0.1" - "@manypkg/find-root" "^1.1.0" - fs-extra "^8.1.0" - globby "^11.0.0" - read-yaml-file "^1.1.0" - "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": version "5.1.1-v1" resolved "https://nexus-inner.51trust.com/repository/npm/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz" @@ -1988,6 +1815,14 @@ invariant "^2.2.4" nullthrows "^1.1.1" +"@react-navigation/bottom-tabs@^7.4.7": + version "7.4.7" + resolved "https://nexus-inner.51trust.com/repository/npm/@react-navigation/bottom-tabs/-/bottom-tabs-7.4.7.tgz#c6fb80bfe25f47db27491918a764e01877f7efeb" + integrity sha512-SQ4KuYV9yr3SV/thefpLWhAD0CU2CrBMG1l0w/QKl3GYuGWdN5OQmdQdmaPZGtsjjVOb+N9Qo7Tf6210P4TlpA== + dependencies: + "@react-navigation/elements" "^2.6.4" + color "^4.2.3" + "@react-navigation/core@^7.12.1": version "7.12.1" resolved "https://nexus-inner.51trust.com/repository/npm/@react-navigation/core/-/core-7.12.1.tgz#aed4ad5fe88f3304c9ab2ac0c97d7014e8f6c3c5" @@ -2010,6 +1845,15 @@ use-latest-callback "^0.2.4" use-sync-external-store "^1.5.0" +"@react-navigation/elements@^2.6.4": + version "2.6.4" + resolved "https://nexus-inner.51trust.com/repository/npm/@react-navigation/elements/-/elements-2.6.4.tgz#f1dc8548b1289588fabcd2f0342c1391c689a49f" + integrity sha512-O3X9vWXOEhAO56zkQS7KaDzL8BvjlwZ0LGSteKpt1/k6w6HONG+2Wkblrb057iKmehTkEkQMzMLkXiuLmN5x9Q== + dependencies: + color "^4.2.3" + use-latest-callback "^0.2.4" + use-sync-external-store "^1.5.0" + "@react-navigation/native@^7.1.14": version "7.1.14" resolved "https://nexus-inner.51trust.com/repository/npm/@react-navigation/native/-/native-7.1.14.tgz#6b5b57bba4c5f45bfc9961da2f921aba5215dfad" @@ -2178,11 +2022,6 @@ dependencies: undici-types "~7.8.0" -"@types/node@^12.7.1": - version "12.20.55" - resolved "https://nexus-inner.51trust.com/repository/npm/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" - integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== - "@types/react-test-renderer@^19.1.0": version "19.1.0" resolved "https://nexus-inner.51trust.com/repository/npm/@types/react-test-renderer/-/react-test-renderer-19.1.0.tgz" @@ -2415,11 +2254,6 @@ anser@^1.4.9: resolved "https://nexus-inner.51trust.com/repository/npm/anser/-/anser-1.4.10.tgz" integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww== -ansi-colors@^4.1.1, ansi-colors@^4.1.3: - version "4.1.3" - resolved "https://nexus-inner.51trust.com/repository/npm/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - ansi-escapes@^1.1.0: version "1.4.0" resolved "https://nexus-inner.51trust.com/repository/npm/ansi-escapes/-/ansi-escapes-1.4.0.tgz" @@ -2778,18 +2612,16 @@ base-64@^0.1.0: resolved "https://nexus-inner.51trust.com/repository/npm/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== +base64-arraybuffer@^1.0.2: + version "1.0.2" + resolved "https://nexus-inner.51trust.com/repository/npm/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" + integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== + base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://nexus-inner.51trust.com/repository/npm/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -better-path-resolve@1.0.0: - version "1.0.0" - resolved "https://nexus-inner.51trust.com/repository/npm/better-path-resolve/-/better-path-resolve-1.0.0.tgz#13a35a1104cdd48a7b74bf8758f96a1ee613f99d" - integrity sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g== - dependencies: - is-windows "^1.0.0" - bl@^4.1.0: version "4.1.0" resolved "https://nexus-inner.51trust.com/repository/npm/bl/-/bl-4.1.0.tgz" @@ -2817,6 +2649,11 @@ body-parser@^1.20.3: type-is "~1.6.18" unpipe "1.0.0" +boolbase@^1.0.0: + version "1.0.0" + resolved "https://nexus-inner.51trust.com/repository/npm/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + brace-expansion@^1.1.7: version "1.1.12" resolved "https://nexus-inner.51trust.com/repository/npm/brace-expansion/-/brace-expansion-1.1.12.tgz" @@ -2968,11 +2805,6 @@ chardet@^0.4.0: resolved "https://nexus-inner.51trust.com/repository/npm/chardet/-/chardet-0.4.2.tgz" integrity sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg== -chardet@^0.7.0: - version "0.7.0" - resolved "https://nexus-inner.51trust.com/repository/npm/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - chrome-launcher@^0.15.2: version "0.15.2" resolved "https://nexus-inner.51trust.com/repository/npm/chrome-launcher/-/chrome-launcher-0.15.2.tgz" @@ -3229,7 +3061,7 @@ create-jest@^29.7.0: jest-util "^29.7.0" prompts "^2.0.1" -cross-spawn@^7.0.2, cross-spawn@^7.0.3, cross-spawn@^7.0.5: +cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.6" resolved "https://nexus-inner.51trust.com/repository/npm/cross-spawn/-/cross-spawn-7.0.6.tgz" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== @@ -3238,6 +3070,37 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3, cross-spawn@^7.0.5: shebang-command "^2.0.0" which "^2.0.1" +css-line-break@^2.1.0: + version "2.1.0" + resolved "https://nexus-inner.51trust.com/repository/npm/css-line-break/-/css-line-break-2.1.0.tgz#bfef660dfa6f5397ea54116bb3cb4873edbc4fa0" + integrity sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w== + dependencies: + utrie "^1.0.2" + +css-select@^5.1.0: + version "5.2.2" + resolved "https://nexus-inner.51trust.com/repository/npm/css-select/-/css-select-5.2.2.tgz#01b6e8d163637bb2dd6c982ca4ed65863682786e" + integrity sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-tree@^1.1.3: + version "1.1.3" + resolved "https://nexus-inner.51trust.com/repository/npm/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^6.1.0: + version "6.2.2" + resolved "https://nexus-inner.51trust.com/repository/npm/css-what/-/css-what-6.2.2.tgz#cdcc8f9b6977719fdfbd1de7aec24abf756b9dea" + integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA== + csstype@^3.0.2: version "3.1.3" resolved "https://nexus-inner.51trust.com/repository/npm/csstype/-/csstype-3.1.3.tgz" @@ -3270,11 +3133,6 @@ data-view-byte-offset@^1.0.1: es-errors "^1.3.0" is-data-view "^1.0.1" -dataloader@^1.4.0: - version "1.4.0" - resolved "https://nexus-inner.51trust.com/repository/npm/dataloader/-/dataloader-1.4.0.tgz#bca11d867f5d3f1b9ed9f737bd15970c65dff5c8" - integrity sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw== - dayjs@^1.8.15: version "1.11.13" resolved "https://nexus-inner.51trust.com/repository/npm/dayjs/-/dayjs-1.11.13.tgz" @@ -3359,11 +3217,6 @@ destroy@1.2.0: resolved "https://nexus-inner.51trust.com/repository/npm/destroy/-/destroy-1.2.0.tgz" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detect-indent@^6.0.0: - version "6.1.0" - resolved "https://nexus-inner.51trust.com/repository/npm/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" - integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== - detect-newline@^3.0.0: version "3.1.0" resolved "https://nexus-inner.51trust.com/repository/npm/detect-newline/-/detect-newline-3.1.0.tgz" @@ -3395,10 +3248,35 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dotenv@^8.1.0: - version "8.6.0" - resolved "https://nexus-inner.51trust.com/repository/npm/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" - integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://nexus-inner.51trust.com/repository/npm/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://nexus-inner.51trust.com/repository/npm/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://nexus-inner.51trust.com/repository/npm/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.2.2" + resolved "https://nexus-inner.51trust.com/repository/npm/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" + integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" drange@^1.0.2: version "1.1.1" @@ -3451,13 +3329,10 @@ encoding@^0.1.11: dependencies: iconv-lite "^0.6.2" -enquirer@^2.4.1: - version "2.4.1" - resolved "https://nexus-inner.51trust.com/repository/npm/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" - integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== - dependencies: - ansi-colors "^4.1.1" - strip-ansi "^6.0.1" +entities@^4.2.0: + version "4.5.0" + resolved "https://nexus-inner.51trust.com/repository/npm/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== env-paths@^2.2.1: version "2.2.1" @@ -3869,11 +3744,6 @@ exponential-backoff@^3.1.1: resolved "https://nexus-inner.51trust.com/repository/npm/exponential-backoff/-/exponential-backoff-3.1.2.tgz" integrity sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA== -extendable-error@^0.1.5: - version "0.1.7" - resolved "https://nexus-inner.51trust.com/repository/npm/extendable-error/-/extendable-error-0.1.7.tgz#60b9adf206264ac920058a7395685ae4670c2b96" - integrity sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg== - external-editor@^2.0.1: version "2.2.0" resolved "https://nexus-inner.51trust.com/repository/npm/external-editor/-/external-editor-2.2.0.tgz" @@ -3883,15 +3753,6 @@ external-editor@^2.0.1: iconv-lite "^0.4.17" tmp "^0.0.33" -external-editor@^3.1.0: - version "3.1.0" - resolved "https://nexus-inner.51trust.com/repository/npm/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://nexus-inner.51trust.com/repository/npm/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" @@ -4062,15 +3923,6 @@ fresh@0.5.2: resolved "https://nexus-inner.51trust.com/repository/npm/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -fs-extra@^7.0.1: - version "7.0.1" - resolved "https://nexus-inner.51trust.com/repository/npm/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-extra@^8.1.0: version "8.1.0" resolved "https://nexus-inner.51trust.com/repository/npm/fs-extra/-/fs-extra-8.1.0.tgz" @@ -4226,7 +4078,7 @@ globalthis@^1.0.4: define-properties "^1.2.1" gopd "^1.0.1" -globby@^11.0.0, globby@^11.1.0: +globby@^11.1.0: version "11.1.0" resolved "https://nexus-inner.51trust.com/repository/npm/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -4243,7 +4095,7 @@ gopd@^1.0.1, gopd@^1.2.0: resolved "https://nexus-inner.51trust.com/repository/npm/gopd/-/gopd-1.2.0.tgz" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.11" resolved "https://nexus-inner.51trust.com/repository/npm/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -4339,6 +4191,14 @@ html-escaper@^2.0.0: resolved "https://nexus-inner.51trust.com/repository/npm/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +html2canvas@^1.4.1: + version "1.4.1" + resolved "https://nexus-inner.51trust.com/repository/npm/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543" + integrity sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA== + dependencies: + css-line-break "^2.1.0" + text-segmentation "^1.0.3" + http-errors@2.0.0: version "2.0.0" resolved "https://nexus-inner.51trust.com/repository/npm/http-errors/-/http-errors-2.0.0.tgz" @@ -4358,17 +4218,12 @@ https-proxy-agent@^7.0.5: agent-base "^7.1.2" debug "4" -human-id@^4.1.1: - version "4.1.1" - resolved "https://nexus-inner.51trust.com/repository/npm/human-id/-/human-id-4.1.1.tgz#2801fbd61b9a5c1c9170f332802db6408a39a4b0" - integrity sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg== - human-signals@^2.1.0: version "2.1.0" resolved "https://nexus-inner.51trust.com/repository/npm/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.17: version "0.4.24" resolved "https://nexus-inner.51trust.com/repository/npm/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -4682,13 +4537,6 @@ is-string@^1.1.1: call-bound "^1.0.3" has-tostringtag "^1.0.2" -is-subdir@^1.1.1: - version "1.2.0" - resolved "https://nexus-inner.51trust.com/repository/npm/is-subdir/-/is-subdir-1.2.0.tgz#b791cd28fab5202e91a08280d51d9d7254fd20d4" - integrity sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw== - dependencies: - better-path-resolve "1.0.0" - is-symbol@^1.0.4, is-symbol@^1.1.1: version "1.1.1" resolved "https://nexus-inner.51trust.com/repository/npm/is-symbol/-/is-symbol-1.1.1.tgz" @@ -4730,11 +4578,6 @@ is-weakset@^2.0.3: call-bound "^1.0.3" get-intrinsic "^1.2.6" -is-windows@^1.0.0: - version "1.0.2" - resolved "https://nexus-inner.51trust.com/repository/npm/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - is-wsl@^1.1.0: version "1.1.0" resolved "https://nexus-inner.51trust.com/repository/npm/is-wsl/-/is-wsl-1.1.0.tgz" @@ -5196,7 +5039,7 @@ joi@^17.2.1: resolved "https://nexus-inner.51trust.com/repository/npm/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1, js-yaml@^3.6.1: +js-yaml@^3.13.1: version "3.14.1" resolved "https://nexus-inner.51trust.com/repository/npm/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -5383,11 +5226,6 @@ lodash.merge@^4.6.2: resolved "https://nexus-inner.51trust.com/repository/npm/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.startcase@^4.4.0: - version "4.4.0" - resolved "https://nexus-inner.51trust.com/repository/npm/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" - integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== - lodash.throttle@^4.1.1: version "4.1.1" resolved "https://nexus-inner.51trust.com/repository/npm/lodash.throttle/-/lodash.throttle-4.1.1.tgz" @@ -5458,6 +5296,11 @@ math-intrinsics@^1.1.0: resolved "https://nexus-inner.51trust.com/repository/npm/math-intrinsics/-/math-intrinsics-1.1.0.tgz" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== +mdn-data@2.0.14: + version "2.0.14" + resolved "https://nexus-inner.51trust.com/repository/npm/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + media-typer@0.3.0: version "0.3.0" resolved "https://nexus-inner.51trust.com/repository/npm/media-typer/-/media-typer-0.3.0.tgz" @@ -5764,21 +5607,11 @@ minipass@^4.2.4: resolved "https://nexus-inner.51trust.com/repository/npm/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -mitt@^3.0.1: - version "3.0.1" - resolved "https://nexus-inner.51trust.com/repository/npm/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" - integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== - mkdirp@^1.0.4: version "1.0.4" resolved "https://nexus-inner.51trust.com/repository/npm/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mri@^1.2.0: - version "1.2.0" - resolved "https://nexus-inner.51trust.com/repository/npm/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== - ms@2.0.0: version "2.0.0" resolved "https://nexus-inner.51trust.com/repository/npm/ms/-/ms-2.0.0.tgz" @@ -5827,13 +5660,6 @@ node-fetch@1.6.3: encoding "^0.1.11" is-stream "^1.0.1" -node-fetch@^2.5.0: - version "2.7.0" - resolved "https://nexus-inner.51trust.com/repository/npm/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - node-int64@^0.4.0: version "0.4.0" resolved "https://nexus-inner.51trust.com/repository/npm/node-int64/-/node-int64-0.4.0.tgz" @@ -5861,6 +5687,13 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +nth-check@^2.0.1: + version "2.1.1" + resolved "https://nexus-inner.51trust.com/repository/npm/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + nullthrows@^1.1.1: version "1.1.1" resolved "https://nexus-inner.51trust.com/repository/npm/nullthrows/-/nullthrows-1.1.1.tgz" @@ -6042,11 +5875,6 @@ os-tmpdir@~1.0.2: resolved "https://nexus-inner.51trust.com/repository/npm/os-tmpdir/-/os-tmpdir-1.0.2.tgz" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== -outdent@^0.5.0: - version "0.5.0" - resolved "https://nexus-inner.51trust.com/repository/npm/outdent/-/outdent-0.5.0.tgz#9e10982fdc41492bb473ad13840d22f9655be2ff" - integrity sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q== - own-keys@^1.0.1: version "1.0.1" resolved "https://nexus-inner.51trust.com/repository/npm/own-keys/-/own-keys-1.0.1.tgz" @@ -6056,13 +5884,6 @@ own-keys@^1.0.1: object-keys "^1.1.1" safe-push-apply "^1.0.0" -p-filter@^2.1.0: - version "2.1.0" - resolved "https://nexus-inner.51trust.com/repository/npm/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" - integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== - dependencies: - p-map "^2.0.0" - p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://nexus-inner.51trust.com/repository/npm/p-limit/-/p-limit-2.3.0.tgz" @@ -6098,23 +5919,11 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" -p-map@^2.0.0: - version "2.1.0" - resolved "https://nexus-inner.51trust.com/repository/npm/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - p-try@^2.0.0: version "2.2.0" resolved "https://nexus-inner.51trust.com/repository/npm/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -package-manager-detector@^0.2.0: - version "0.2.11" - resolved "https://nexus-inner.51trust.com/repository/npm/package-manager-detector/-/package-manager-detector-0.2.11.tgz#3af0b34f99d86d24af0a0620603d2e1180d05c9c" - integrity sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ== - dependencies: - quansync "^0.2.7" - parent-module@^1.0.0: version "1.0.1" resolved "https://nexus-inner.51trust.com/repository/npm/parent-module/-/parent-module-1.0.1.tgz" @@ -6204,7 +6013,7 @@ path-type@^4.0.0: resolved "https://nexus-inner.51trust.com/repository/npm/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1: +picocolors@^1.0.0, picocolors@^1.1.1: version "1.1.1" resolved "https://nexus-inner.51trust.com/repository/npm/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== @@ -6214,11 +6023,6 @@ picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://nexus-inner.51trust.com/repository/npm/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^4.0.1: - version "4.0.1" - resolved "https://nexus-inner.51trust.com/repository/npm/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - pinkie-promise@^2.0.0: version "2.0.1" resolved "https://nexus-inner.51trust.com/repository/npm/pinkie-promise/-/pinkie-promise-2.0.1.tgz" @@ -6260,7 +6064,7 @@ prelude-ls@^1.2.1: resolved "https://nexus-inner.51trust.com/repository/npm/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier@2.8.8, prettier@^2.7.1: +prettier@2.8.8: version "2.8.8" resolved "https://nexus-inner.51trust.com/repository/npm/prettier/-/prettier-2.8.8.tgz" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== @@ -6330,11 +6134,6 @@ qs@6.13.0: dependencies: side-channel "^1.0.6" -quansync@^0.2.7: - version "0.2.10" - resolved "https://nexus-inner.51trust.com/repository/npm/quansync/-/quansync-0.2.10.tgz#32053cf166fa36511aae95fc49796116f2dc20e1" - integrity sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A== - query-string@^7.1.3: version "7.1.3" resolved "https://nexus-inner.51trust.com/repository/npm/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" @@ -6408,15 +6207,6 @@ react-is@^19.1.0: resolved "https://nexus-inner.51trust.com/repository/npm/react-is/-/react-is-19.1.0.tgz" integrity sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg== -react-native-copilot@^3.3.3: - version "3.3.3" - resolved "https://nexus-inner.51trust.com/repository/npm/react-native-copilot/-/react-native-copilot-3.3.3.tgz#05f8b2a33c177e39d9c61fa7f4ea7e1020d91e5d" - integrity sha512-/LX70DSqVhjOsbSGC3r3RYg+FtovUUudqWKby2agbXb0PsIWaEvjoH5SNQRkBCW8DHbDlZoPMv6oGKSJm3BPrQ== - dependencies: - "@changesets/changelog-github" "^0.5.0" - "@changesets/cli" "^2.27.1" - mitt "^3.0.1" - react-native-device-info@^14.0.4: version "14.0.4" resolved "https://nexus-inner.51trust.com/repository/npm/react-native-device-info/-/react-native-device-info-14.0.4.tgz#56b24ace9ff29a66bdfc667209086421ed6cfdce" @@ -6444,11 +6234,29 @@ react-native-gesture-handler@^2.27.2: hoist-non-react-statics "^3.3.0" invariant "^2.2.4" +react-native-is-edge-to-edge@^1.2.1: + version "1.2.1" + resolved "https://nexus-inner.51trust.com/repository/npm/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.2.1.tgz#64e10851abd9d176cbf2b40562f751622bde3358" + integrity sha512-FLbPWl/MyYQWz+KwqOZsSyj2JmLKglHatd3xLZWskXOpRaio4LfEDEz8E/A6uD8QoTHW6Aobw1jbEwK7KMgR7Q== + react-native-linear-gradient@^2.8.3: version "2.8.3" resolved "https://nexus-inner.51trust.com/repository/npm/react-native-linear-gradient/-/react-native-linear-gradient-2.8.3.tgz#9a116649f86d74747304ee13db325e20b21e564f" integrity sha512-KflAXZcEg54PXkLyflaSZQ3PJp4uC4whM7nT/Uot9m0e/qxFV3p6uor1983D1YOBJbJN7rrWdqIjq0T42jOJyA== +react-native-reanimated-carousel@^4.0.3: + version "4.0.3" + resolved "https://nexus-inner.51trust.com/repository/npm/react-native-reanimated-carousel/-/react-native-reanimated-carousel-4.0.3.tgz#975f4ff3f5da5bb3790fe60850a46ad8119612bc" + integrity sha512-YZXlvZNghR5shFcI9hTA7h7bEhh97pfUSLZvLBAshpbkuYwJDKmQXejO/199T6hqGq0wCRwR0CWf2P4Vs6A4Fw== + +react-native-reanimated@^4.1.0: + version "4.1.0" + resolved "https://nexus-inner.51trust.com/repository/npm/react-native-reanimated/-/react-native-reanimated-4.1.0.tgz#dd0a2495b14fa344d7f482131ecae79110fa59cd" + integrity sha512-L8FqZn8VjZyBaCUMYFyx1Y+T+ZTbblaudpxReOXJ66RnOf52g6UM4Pa/IjwLD1XAw1FUxLRQrtpdjbkEc74FiQ== + dependencies: + react-native-is-edge-to-edge "^1.2.1" + semver "7.7.2" + react-native-root-siblings@^5.0.1: version "5.0.1" resolved "https://nexus-inner.51trust.com/repository/npm/react-native-root-siblings/-/react-native-root-siblings-5.0.1.tgz#97e050e5155228f65810fb1c466ff8e769c5272c" @@ -6474,11 +6282,27 @@ react-native-storage@^1.0.1: opencollective "^1.0.3" opencollective-postinstall "^2.0.2" +react-native-svg@^15.12.1: + version "15.12.1" + resolved "https://nexus-inner.51trust.com/repository/npm/react-native-svg/-/react-native-svg-15.12.1.tgz#7ba756dd6a235f86a2c312a1e7911f9b0d18ad3a" + integrity sha512-vCuZJDf8a5aNC2dlMovEv4Z0jjEUET53lm/iILFnFewa15b4atjVxU6Wirm6O9y6dEsdjDZVD7Q3QM4T1wlI8g== + dependencies: + css-select "^5.1.0" + css-tree "^1.1.3" + warn-once "0.1.1" + react-native-toast-message@^2.3.3: version "2.3.3" resolved "https://nexus-inner.51trust.com/repository/npm/react-native-toast-message/-/react-native-toast-message-2.3.3.tgz#e301508d386a9902ff6b4559ecc6674f8cfdf97a" integrity sha512-4IIUHwUPvKHu4gjD0Vj2aGQzqPATiblL1ey8tOqsxOWRPGGu52iIbL8M/mCz4uyqecvPdIcMY38AfwRuUADfQQ== +react-native-view-shot@^4.0.3: + version "4.0.3" + resolved "https://nexus-inner.51trust.com/repository/npm/react-native-view-shot/-/react-native-view-shot-4.0.3.tgz#9b98388fcc5228073cb66ac98ca339eda35767ac" + integrity sha512-USNjYmED7C0me02c1DxKA0074Hw+y/nxo+xJKlffMvfUWWzL5ELh/TJA/pTnVqFurIrzthZDPtDM7aBFJuhrHQ== + dependencies: + html2canvas "^1.4.1" + react-native-webview@^13.16.0: version "13.16.0" resolved "https://nexus-inner.51trust.com/repository/npm/react-native-webview/-/react-native-webview-13.16.0.tgz#c995148f944a7eaf12389f0e6d5c6f5e6a775686" @@ -6487,6 +6311,23 @@ react-native-webview@^13.16.0: escape-string-regexp "^4.0.0" invariant "2.2.4" +react-native-worklets@^0.5.0: + version "0.5.0" + resolved "https://nexus-inner.51trust.com/repository/npm/react-native-worklets/-/react-native-worklets-0.5.0.tgz#ed25b55f3d14b8f66db7a9a5148c609e51eca801" + integrity sha512-+/tbUCBEVchxe5xxFvvdC18PRZFCoxq1emcjIezXodElFguk1MaBYpbqABvZHBGrrEOo9k99h4Jbt0i9ArCbxg== + dependencies: + "@babel/plugin-transform-arrow-functions" "^7.0.0-0" + "@babel/plugin-transform-class-properties" "^7.0.0-0" + "@babel/plugin-transform-classes" "^7.0.0-0" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.0.0-0" + "@babel/plugin-transform-optional-chaining" "^7.0.0-0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0-0" + "@babel/plugin-transform-template-literals" "^7.0.0-0" + "@babel/plugin-transform-unicode-regex" "^7.0.0-0" + "@babel/preset-typescript" "^7.16.7" + convert-source-map "^2.0.0" + semver "7.7.2" + react-native-zip-archive@^7.0.2: version "7.0.2" resolved "https://nexus-inner.51trust.com/repository/npm/react-native-zip-archive/-/react-native-zip-archive-7.0.2.tgz#f8c488b4f5ab1605bff1f366ac101fe0dce6fd1d" @@ -6551,16 +6392,6 @@ react@19.1.0: resolved "https://nexus-inner.51trust.com/repository/npm/react/-/react-19.1.0.tgz" integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg== -read-yaml-file@^1.1.0: - version "1.1.0" - resolved "https://nexus-inner.51trust.com/repository/npm/read-yaml-file/-/read-yaml-file-1.1.0.tgz#9362bbcbdc77007cc8ea4519fe1c0b821a7ce0d8" - integrity sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA== - dependencies: - graceful-fs "^4.1.5" - js-yaml "^3.6.1" - pify "^4.0.1" - strip-bom "^3.0.0" - readable-stream@^3.4.0: version "3.6.2" resolved "https://nexus-inner.51trust.com/repository/npm/readable-stream/-/readable-stream-3.6.2.tgz" @@ -6807,16 +6638,16 @@ scheduler@0.26.0, scheduler@^0.26.0: resolved "https://nexus-inner.51trust.com/repository/npm/scheduler/-/scheduler-0.26.0.tgz" integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== +semver@7.7.2, semver@^7.1.3, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: + version "7.7.2" + resolved "https://nexus-inner.51trust.com/repository/npm/semver/-/semver-7.7.2.tgz" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://nexus-inner.51trust.com/repository/npm/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.1.3, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: - version "7.7.2" - resolved "https://nexus-inner.51trust.com/repository/npm/semver/-/semver-7.7.2.tgz" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== - send@0.19.0: version "0.19.0" resolved "https://nexus-inner.51trust.com/repository/npm/send/-/send-0.19.0.tgz" @@ -6954,11 +6785,6 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://nexus-inner.51trust.com/repository/npm/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://nexus-inner.51trust.com/repository/npm/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - simple-swizzle@^0.2.2: version "0.2.2" resolved "https://nexus-inner.51trust.com/repository/npm/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -7016,14 +6842,6 @@ source-map@^0.6.0, source-map@^0.6.1: resolved "https://nexus-inner.51trust.com/repository/npm/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -spawndamnit@^3.0.1: - version "3.0.1" - resolved "https://nexus-inner.51trust.com/repository/npm/spawndamnit/-/spawndamnit-3.0.1.tgz#44410235d3dc4e21f8e4f740ae3266e4486c2aed" - integrity sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg== - dependencies: - cross-spawn "^7.0.5" - signal-exit "^4.0.1" - split-on-first@^1.0.0: version "1.1.0" resolved "https://nexus-inner.51trust.com/repository/npm/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" @@ -7200,11 +7018,6 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://nexus-inner.51trust.com/repository/npm/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - strip-bom@^4.0.0: version "4.0.0" resolved "https://nexus-inner.51trust.com/repository/npm/strip-bom/-/strip-bom-4.0.0.tgz" @@ -7249,11 +7062,6 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://nexus-inner.51trust.com/repository/npm/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -term-size@^2.1.0: - version "2.2.1" - resolved "https://nexus-inner.51trust.com/repository/npm/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" - integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== - terser@^5.15.0: version "5.43.1" resolved "https://nexus-inner.51trust.com/repository/npm/terser/-/terser-5.43.1.tgz" @@ -7273,6 +7081,13 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +text-segmentation@^1.0.3: + version "1.0.3" + resolved "https://nexus-inner.51trust.com/repository/npm/text-segmentation/-/text-segmentation-1.0.3.tgz#52a388159efffe746b24a63ba311b6ac9f2d7943" + integrity sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw== + dependencies: + utrie "^1.0.2" + text-table@^0.2.0: version "0.2.0" resolved "https://nexus-inner.51trust.com/repository/npm/text-table/-/text-table-0.2.0.tgz" @@ -7312,11 +7127,6 @@ toidentifier@1.0.1: resolved "https://nexus-inner.51trust.com/repository/npm/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tr46@~0.0.3: - version "0.0.3" - resolved "https://nexus-inner.51trust.com/repository/npm/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - ts-api-utils@^1.3.0: version "1.4.3" resolved "https://nexus-inner.51trust.com/repository/npm/ts-api-utils/-/ts-api-utils-1.4.3.tgz" @@ -7512,6 +7322,13 @@ utils-merge@1.0.1: resolved "https://nexus-inner.51trust.com/repository/npm/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +utrie@^1.0.2: + version "1.0.2" + resolved "https://nexus-inner.51trust.com/repository/npm/utrie/-/utrie-1.0.2.tgz#d42fe44de9bc0119c25de7f564a6ed1b2c87a645" + integrity sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw== + dependencies: + base64-arraybuffer "^1.0.2" + v8-to-istanbul@^9.0.1: version "9.3.0" resolved "https://nexus-inner.51trust.com/repository/npm/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz" @@ -7538,6 +7355,11 @@ walker@^1.0.7, walker@^1.0.8: dependencies: makeerror "1.0.12" +warn-once@0.1.1: + version "0.1.1" + resolved "https://nexus-inner.51trust.com/repository/npm/warn-once/-/warn-once-0.1.1.tgz#952088f4fb56896e73fd4e6a3767272a3fccce43" + integrity sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q== + wcwidth@^1.0.1: version "1.0.1" resolved "https://nexus-inner.51trust.com/repository/npm/wcwidth/-/wcwidth-1.0.1.tgz" @@ -7545,24 +7367,11 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://nexus-inner.51trust.com/repository/npm/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - whatwg-fetch@^3.0.0: version "3.6.20" resolved "https://nexus-inner.51trust.com/repository/npm/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz" integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://nexus-inner.51trust.com/repository/npm/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: version "1.1.1" resolved "https://nexus-inner.51trust.com/repository/npm/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz"