From 63037958706f25ae410f1df73e90c373314bbfa2 Mon Sep 17 00:00:00 2001 From: richarjiang Date: Wed, 24 Sep 2025 18:04:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E5=9B=B4=E5=BA=A6?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=9B=BE=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/circumference-detail.tsx | 700 +++++++++++++++++++++ components/statistic/CircumferenceCard.tsx | 61 +- ios/OutLive.xcodeproj/project.pbxproj | 92 +-- ios/Podfile.lock | 54 +- package-lock.json | 481 +++++++------- package.json | 20 +- services/circumferenceAnalysis.ts | 42 ++ store/circumferenceSlice.ts | 87 +++ store/index.ts | 2 + 9 files changed, 1180 insertions(+), 359 deletions(-) create mode 100644 app/circumference-detail.tsx create mode 100644 services/circumferenceAnalysis.ts create mode 100644 store/circumferenceSlice.ts diff --git a/app/circumference-detail.tsx b/app/circumference-detail.tsx new file mode 100644 index 0000000..c8c2d17 --- /dev/null +++ b/app/circumference-detail.tsx @@ -0,0 +1,700 @@ +import { DateSelector } from '@/components/DateSelector'; +import { FloatingSelectionModal, SelectionItem } from '@/components/ui/FloatingSelectionModal'; +import { HeaderBar } from '@/components/ui/HeaderBar'; +import { useAppDispatch, useAppSelector } from '@/hooks/redux'; +import { useAuthGuard } from '@/hooks/useAuthGuard'; +import { fetchCircumferenceAnalysis, selectCircumferenceData, selectCircumferenceError, selectCircumferenceLoading } from '@/store/circumferenceSlice'; +import { selectUserProfile, updateUserBodyMeasurements, UserProfile } from '@/store/userSlice'; +import { getMonthDaysZh, getTodayIndexInMonth } from '@/utils/date'; +import dayjs from 'dayjs'; +import weekOfYear from 'dayjs/plugin/weekOfYear'; +import { LinearGradient } from 'expo-linear-gradient'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import { ActivityIndicator, Dimensions, ScrollView, StyleSheet, Text, TouchableOpacity, View } from 'react-native'; +import { LineChart } from 'react-native-chart-kit'; + +dayjs.extend(weekOfYear); + +// 围度类型数据 +const CIRCUMFERENCE_TYPES = [ + { key: 'chestCircumference', label: '胸围', color: '#FF6B6B' }, + { key: 'waistCircumference', label: '腰围', color: '#4ECDC4' }, + { key: 'upperHipCircumference', label: '上臀围', color: '#45B7D1' }, + { key: 'armCircumference', label: '臂围', color: '#96CEB4' }, + { key: 'thighCircumference', label: '大腿围', color: '#FFEAA7' }, + { key: 'calfCircumference', label: '小腿围', color: '#DDA0DD' }, +]; + +import { CircumferencePeriod } from '@/services/circumferenceAnalysis'; + +type TabType = CircumferencePeriod; + +export default function CircumferenceDetailScreen() { + const dispatch = useAppDispatch(); + const userProfile = useAppSelector(selectUserProfile); + const { ensureLoggedIn } = useAuthGuard(); + + // 日期相关状态 + const [selectedIndex, setSelectedIndex] = useState(getTodayIndexInMonth()); + const [activeTab, setActiveTab] = useState('week'); + + // 弹窗状态 + const [modalVisible, setModalVisible] = useState(false); + const [selectedMeasurement, setSelectedMeasurement] = useState<{ + key: string; + label: string; + currentValue?: number; + } | null>(null); + + // Redux状态 + const chartData = useAppSelector(state => selectCircumferenceData(state, activeTab)); + const isLoading = useAppSelector(state => selectCircumferenceLoading(state, activeTab)); + const error = useAppSelector(selectCircumferenceError); + + console.log('chartData', chartData); + + + // 图例显示状态 - 控制哪些维度显示在图表中 + const [visibleTypes, setVisibleTypes] = useState>( + new Set(CIRCUMFERENCE_TYPES.map(type => type.key)) + ); + + // 获取当前选中日期 + const currentSelectedDate = useMemo(() => { + const days = getMonthDaysZh(); + return days[selectedIndex]?.date?.toDate() ?? new Date(); + }, [selectedIndex]); + + // 判断选中日期是否是今天 + const isSelectedDateToday = useMemo(() => { + const today = new Date(); + const selectedDate = currentSelectedDate; + return dayjs(selectedDate).isSame(today, 'day'); + }, [currentSelectedDate]); + + // 当前围度数据 + const measurements = [ + { + key: 'chestCircumference', + label: '胸围', + value: userProfile?.chestCircumference, + color: '#FF6B6B', + }, + { + key: 'waistCircumference', + label: '腰围', + value: userProfile?.waistCircumference, + color: '#4ECDC4', + }, + { + key: 'upperHipCircumference', + label: '上臀围', + value: userProfile?.upperHipCircumference, + color: '#45B7D1', + }, + { + key: 'armCircumference', + label: '臂围', + value: userProfile?.armCircumference, + color: '#96CEB4', + }, + { + key: 'thighCircumference', + label: '大腿围', + value: userProfile?.thighCircumference, + color: '#FFEAA7', + }, + { + key: 'calfCircumference', + label: '小腿围', + value: userProfile?.calfCircumference, + color: '#DDA0DD', + }, + ]; + + // 日期选择回调 + const onSelectDate = (index: number) => { + setSelectedIndex(index); + }; + + // Tab切换 + const handleTabPress = useCallback((tab: TabType) => { + setActiveTab(tab); + // 切换tab时重新获取数据 + dispatch(fetchCircumferenceAnalysis(tab)); + }, [dispatch]); + + // 初始化加载数据 + useEffect(() => { + dispatch(fetchCircumferenceAnalysis(activeTab)); + }, [dispatch, activeTab]); + + // 处理图例点击,切换显示/隐藏 + const handleLegendPress = (typeKey: string) => { + const newVisibleTypes = new Set(visibleTypes); + if (newVisibleTypes.has(typeKey)) { + // 至少保留一个维度显示 + if (newVisibleTypes.size > 1) { + newVisibleTypes.delete(typeKey); + } + } else { + newVisibleTypes.add(typeKey); + } + setVisibleTypes(newVisibleTypes); + }; + + // 根据不同围度类型获取合理的默认值 + const getDefaultCircumferenceValue = (measurementKey: string, userProfile?: UserProfile): number => { + // 如果用户已有该围度数据,直接使用 + const existingValue = userProfile?.[measurementKey as keyof UserProfile] as number; + if (existingValue) { + return existingValue; + } + + // 根据性别设置合理的默认值 + const isMale = userProfile?.gender === 'male'; + + switch (measurementKey) { + case 'chestCircumference': + // 胸围:男性 85-110cm,女性 75-95cm + return isMale ? 95 : 80; + case 'waistCircumference': + // 腰围:男性 70-90cm,女性 60-80cm + return isMale ? 80 : 70; + case 'upperHipCircumference': + // 上臀围: + return 30; + case 'armCircumference': + // 臂围:男性 25-35cm,女性 20-30cm + return isMale ? 30 : 25; + case 'thighCircumference': + // 大腿围:男性 45-60cm,女性 40-55cm + return isMale ? 50 : 45; + case 'calfCircumference': + // 小腿围:男性 30-40cm,女性 25-35cm + return isMale ? 35 : 30; + default: + return 70; // 默认70cm + } + }; + + // Generate circumference options (30-150 cm) + const circumferenceOptions: SelectionItem[] = Array.from({ length: 121 }, (_, i) => { + const value = i + 30; + return { + label: `${value} cm`, + value: value, + }; + }); + + // 处理围度数据点击 + const handleMeasurementPress = async (measurement: typeof measurements[0]) => { + // 只有选中今天日期才能编辑 + if (!isSelectedDateToday) { + return; + } + + const isLoggedIn = await ensureLoggedIn(); + if (!isLoggedIn) { + // 如果未登录,用户会被重定向到登录页面 + return; + } + + // 使用智能默认值,如果用户已有数据则使用现有数据,否则使用基于性别的合理默认值 + const defaultValue = getDefaultCircumferenceValue(measurement.key, userProfile); + + setSelectedMeasurement({ + key: measurement.key, + label: measurement.label, + currentValue: measurement.value || defaultValue, + }); + setModalVisible(true); + }; + + // 处理围度数据更新 + const handleUpdateMeasurement = (value: string | number) => { + if (!selectedMeasurement) return; + + const updateData = { + [selectedMeasurement.key]: Number(value), + }; + + dispatch(updateUserBodyMeasurements(updateData)); + setModalVisible(false); + setSelectedMeasurement(null); + }; + + // 处理图表数据 + const processedChartData = useMemo(() => { + if (!chartData || chartData.length === 0) { + return { labels: [], datasets: [] }; + } + + // 根据activeTab生成标签 + const labels = chartData.map(item => { + switch (activeTab) { + case 'week': + // 将YYYY-MM-DD格式转换为星期几 + const weekDay = dayjs(item.label).format('dd'); + return weekDay; + case 'month': + // 将YYYY-MM-DD格式转换为第几周 + const weekOfYear = dayjs(item.label).week(); + const firstWeekOfMonth = dayjs(item.label).startOf('month').week(); + return `第${weekOfYear - firstWeekOfMonth + 1}周`; + case 'year': + // 将YYYY-MM格式转换为月份 + return dayjs(item.label).format('M月'); + default: + return item.label; + } + }); + + // 为每个可见的围度类型生成数据集 + const datasets: any[] = []; + CIRCUMFERENCE_TYPES.forEach((type) => { + if (visibleTypes.has(type.key)) { + const data = chartData.map(item => { + const value = item[type.key as keyof typeof item] as number | null; + return value || 0; // null值转换为0,图表会自动处理 + }); + + // 只有数据中至少有一个非零值才添加到数据集 + if (data.some(value => value > 0)) { + datasets.push({ + data, + color: () => type.color, + strokeWidth: 2, + }); + } + } + }); + + return { labels, datasets }; + }, [chartData, activeTab, visibleTypes]); + + return ( + + {/* 背景渐变 */} + + + {/* 头部导航 */} + + + + {/* 日期选择器 */} + + + + + {/* 当前日期围度数据 */} + + + {measurements.map((measurement, index) => ( + handleMeasurementPress(measurement)} + activeOpacity={isSelectedDateToday ? 0.7 : 1} + disabled={!isSelectedDateToday} + > + + {measurement.label} + + + {measurement.value ? measurement.value.toString() : '--'} + + + + ))} + + + + {/* 围度统计 */} + + 围度统计 + + {/* Tab 切换 */} + + handleTabPress('week')} + activeOpacity={0.7} + > + + 按周 + + + handleTabPress('month')} + activeOpacity={0.7} + > + + 按月 + + + handleTabPress('year')} + activeOpacity={0.7} + > + + 按年 + + + + + {/* 图例 - 支持点击切换显示/隐藏 */} + + {CIRCUMFERENCE_TYPES.map((type, index) => { + const isVisible = visibleTypes.has(type.key); + return ( + handleLegendPress(type.key)} + activeOpacity={0.7} + > + + + {type.label} + + + ); + })} + + + {/* 折线图 */} + {isLoading ? ( + + + 加载中... + + ) : error ? ( + + 加载失败: {error} + dispatch(fetchCircumferenceAnalysis(activeTab))} + activeOpacity={0.7} + > + 重试 + + + ) : processedChartData.datasets.length > 0 ? ( + `rgba(100, 100, 100, ${opacity * 0.8})`, + labelColor: (opacity = 1) => `rgba(60, 60, 60, ${opacity})`, + style: { + borderRadius: 16, + }, + propsForDots: { + r: "3", + strokeWidth: "2", + stroke: "#ffffff" + }, + propsForBackgroundLines: { + strokeDasharray: "2,2", + stroke: "#E0E0E0", + strokeWidth: 1 + }, + }} + bezier + style={styles.chart} + /> + ) : ( + + + {processedChartData.datasets.length === 0 && !isLoading && !error + ? '暂无数据' + : '请选择要显示的围度数据' + } + + + )} + + + + {/* 围度编辑弹窗 */} + { + setModalVisible(false); + setSelectedMeasurement(null); + }} + title={selectedMeasurement ? `设置${selectedMeasurement.label}` : '设置围度'} + items={circumferenceOptions} + selectedValue={selectedMeasurement?.currentValue} + onValueChange={() => { }} // Real-time update not needed + onConfirm={handleUpdateMeasurement} + confirmButtonText="确认" + pickerHeight={180} + /> + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#FFFFFF', + }, + gradientBackground: { + position: 'absolute', + left: 0, + right: 0, + top: 0, + bottom: 0, + }, + scrollView: { + flex: 1, + }, + dateContainer: { + marginTop: 16, + marginBottom: 20, + }, + currentDataCard: { + backgroundColor: '#FFFFFF', + borderRadius: 16, + padding: 20, + marginBottom: 20, + shadowColor: '#000', + shadowOffset: { + width: 0, + height: 4, + }, + shadowOpacity: 0.12, + shadowRadius: 12, + elevation: 6, + }, + currentDataTitle: { + fontSize: 16, + fontWeight: '700', + color: '#192126', + marginBottom: 16, + textAlign: 'center', + }, + measurementsContainer: { + flexDirection: 'row', + justifyContent: 'space-between', + flexWrap: 'wrap', + }, + measurementItem: { + alignItems: 'center', + width: '16%', + marginBottom: 12, + }, + measurementItemDisabled: { + opacity: 0.6, + }, + colorIndicator: { + width: 12, + height: 12, + borderRadius: 6, + marginBottom: 4, + }, + label: { + fontSize: 12, + color: '#888', + marginBottom: 8, + textAlign: 'center', + }, + valueContainer: { + backgroundColor: '#F5F5F7', + borderRadius: 10, + paddingHorizontal: 8, + paddingVertical: 6, + minWidth: 32, + alignItems: 'center', + justifyContent: 'center', + }, + value: { + fontSize: 14, + fontWeight: '600', + color: '#192126', + textAlign: 'center', + }, + statsCard: { + backgroundColor: '#FFFFFF', + borderRadius: 16, + padding: 20, + shadowColor: '#000', + shadowOffset: { + width: 0, + height: 4, + }, + shadowOpacity: 0.12, + shadowRadius: 12, + elevation: 6, + }, + statsTitle: { + fontSize: 16, + fontWeight: '700', + color: '#192126', + marginBottom: 16, + }, + tabContainer: { + flexDirection: 'row', + backgroundColor: '#F5F5F7', + borderRadius: 12, + padding: 4, + marginBottom: 20, + }, + tab: { + flex: 1, + paddingVertical: 8, + paddingHorizontal: 16, + borderRadius: 8, + alignItems: 'center', + }, + activeTab: { + backgroundColor: '#FFFFFF', + shadowColor: '#000', + shadowOffset: { + width: 0, + height: 1, + }, + shadowOpacity: 0.1, + shadowRadius: 2, + elevation: 2, + }, + tabText: { + fontSize: 14, + fontWeight: '600', + color: '#888', + }, + activeTabText: { + color: '#192126', + }, + legendContainer: { + flexDirection: 'row', + flexWrap: 'wrap', + marginBottom: 16, + gap: 6, + }, + legendItem: { + flexDirection: 'row', + alignItems: 'center', + paddingVertical: 4, + paddingHorizontal: 8, + borderRadius: 8, + }, + legendItemHidden: { + opacity: 0.5, + }, + legendColor: { + width: 4, + height: 4, + borderRadius: 4, + marginRight: 4, + }, + legendText: { + fontSize: 10, + color: '#666', + fontWeight: '500', + }, + legendTextHidden: { + color: '#999', + }, + chart: { + marginVertical: 8, + borderRadius: 16, + }, + emptyChart: { + height: 220, + alignItems: 'center', + justifyContent: 'center', + backgroundColor: '#F8F9FA', + borderRadius: 16, + marginVertical: 8, + }, + emptyChartText: { + fontSize: 14, + color: '#999', + fontWeight: '500', + }, + loadingChart: { + height: 220, + alignItems: 'center', + justifyContent: 'center', + backgroundColor: '#F8F9FA', + borderRadius: 16, + marginVertical: 8, + }, + loadingText: { + fontSize: 14, + color: '#666', + marginTop: 8, + fontWeight: '500', + }, + errorChart: { + height: 220, + alignItems: 'center', + justifyContent: 'center', + backgroundColor: '#FFF5F5', + borderRadius: 16, + marginVertical: 8, + padding: 20, + }, + errorText: { + fontSize: 14, + color: '#E53E3E', + textAlign: 'center', + marginBottom: 12, + }, + retryButton: { + backgroundColor: '#4ECDC4', + paddingHorizontal: 16, + paddingVertical: 8, + borderRadius: 8, + }, + retryText: { + color: '#FFFFFF', + fontSize: 14, + fontWeight: '600', + }, +}); \ No newline at end of file diff --git a/components/statistic/CircumferenceCard.tsx b/components/statistic/CircumferenceCard.tsx index a0af380..8bf6e1e 100644 --- a/components/statistic/CircumferenceCard.tsx +++ b/components/statistic/CircumferenceCard.tsx @@ -1,7 +1,8 @@ import { FloatingSelectionModal, SelectionItem } from '@/components/ui/FloatingSelectionModal'; import { useAppDispatch, useAppSelector } from '@/hooks/redux'; import { useAuthGuard } from '@/hooks/useAuthGuard'; -import { selectUserProfile, updateUserBodyMeasurements } from '@/store/userSlice'; +import { selectUserProfile, updateUserBodyMeasurements, UserProfile } from '@/store/userSlice'; +import { router } from 'expo-router'; import React, { useState } from 'react'; import { StyleSheet, Text, TouchableOpacity, View } from 'react-native'; @@ -59,6 +60,41 @@ const CircumferenceCard: React.FC = ({ style }) => { }, ]; + // 根据不同围度类型获取合理的默认值 + const getDefaultCircumferenceValue = (measurementKey: string, userProfile?: UserProfile): number => { + // 如果用户已有该围度数据,直接使用 + const existingValue = userProfile?.[measurementKey as keyof UserProfile] as number; + if (existingValue) { + return existingValue; + } + + // 根据性别设置合理的默认值 + const isMale = userProfile?.gender === 'male'; + + switch (measurementKey) { + case 'chestCircumference': + // 胸围:男性 85-110cm,女性 75-95cm + return isMale ? 95 : 80; + case 'waistCircumference': + // 腰围:男性 70-90cm,女性 60-80cm + return isMale ? 80 : 70; + case 'upperHipCircumference': + // 上臀围: + return 30; + case 'armCircumference': + // 臂围:男性 25-35cm,女性 20-30cm + return isMale ? 30 : 25; + case 'thighCircumference': + // 大腿围:男性 45-60cm,女性 40-55cm + return isMale ? 50 : 45; + case 'calfCircumference': + // 小腿围:男性 30-40cm,女性 25-35cm + return isMale ? 35 : 30; + default: + return 70; // 默认70cm + } + }; + // Generate circumference options (30-150 cm) const circumferenceOptions: SelectionItem[] = Array.from({ length: 121 }, (_, i) => { const value = i + 30; @@ -75,10 +111,13 @@ const CircumferenceCard: React.FC = ({ style }) => { return; } + // 使用智能默认值,如果用户已有数据则使用现有数据,否则使用基于性别的合理默认值 + const defaultValue = getDefaultCircumferenceValue(measurement.key, userProfile); + setSelectedMeasurement({ key: measurement.key, label: measurement.label, - currentValue: measurement.value, + currentValue: measurement.value || defaultValue, }); setModalVisible(true); }; @@ -95,8 +134,17 @@ const CircumferenceCard: React.FC = ({ style }) => { setSelectedMeasurement(null); }; + // 处理整个卡片点击,跳转到详情页 + const handleCardPress = () => { + router.push('/circumference-detail'); + }; + return ( - + 围度 (cm) @@ -104,7 +152,10 @@ const CircumferenceCard: React.FC = ({ style }) => { handleMeasurementPress(measurement)} + onPress={(e) => { + e.stopPropagation(); // 阻止事件冒泡 + handleMeasurementPress(measurement); + }} activeOpacity={0.7} > {measurement.label} @@ -131,7 +182,7 @@ const CircumferenceCard: React.FC = ({ style }) => { confirmButtonText="确认" pickerHeight={180} /> - + ); }; diff --git a/ios/OutLive.xcodeproj/project.pbxproj b/ios/OutLive.xcodeproj/project.pbxproj index 0abcd40..2bb6f2b 100644 --- a/ios/OutLive.xcodeproj/project.pbxproj +++ b/ios/OutLive.xcodeproj/project.pbxproj @@ -10,31 +10,31 @@ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 32476CAEFFCE691C1634B0A4 /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EA3641BAC6078512F41509D /* ExpoModulesProvider.swift */; }; 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; }; + 646189797DBE7937221347A9 /* libPods-OutLive.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C411D1CEBC225A6F92F136BA /* libPods-OutLive.a */; }; 79B2CB702E7B954600B51753 /* OutLive-Bridging-Header.h in Sources */ = {isa = PBXBuildFile; fileRef = F11748442D0722820044C1D9 /* OutLive-Bridging-Header.h */; }; 79B2CB732E7B954F00B51753 /* HealthKitManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 79B2CB712E7B954F00B51753 /* HealthKitManager.m */; }; 79B2CB742E7B954F00B51753 /* HealthKitManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79B2CB722E7B954F00B51753 /* HealthKitManager.swift */; }; 91B7BA17B50D328546B5B4B8 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = B7F23062EE59F61E6260DBA8 /* PrivacyInfo.xcprivacy */; }; BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; }; - EB8685B6DDDFD4D181274014 /* libPods-OutLive.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F55788C6990114D378E7CC53 /* libPods-OutLive.a */; }; F11748422D0307B40044C1D9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F11748412D0307B40044C1D9 /* AppDelegate.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 0FF78E2879F14B0D75DF41B4 /* Pods-OutLive.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OutLive.release.xcconfig"; path = "Target Support Files/Pods-OutLive/Pods-OutLive.release.xcconfig"; sourceTree = ""; }; 13B07F961A680F5B00A75B9A /* OutLive.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OutLive.app; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = OutLive/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = OutLive/Info.plist; sourceTree = ""; }; 1EA3641BAC6078512F41509D /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-OutLive/ExpoModulesProvider.swift"; sourceTree = ""; }; + 4FAA45EB21D2C45B94943F48 /* Pods-OutLive.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OutLive.debug.xcconfig"; path = "Target Support Files/Pods-OutLive/Pods-OutLive.debug.xcconfig"; sourceTree = ""; }; 79B2CB712E7B954F00B51753 /* HealthKitManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = HealthKitManager.m; path = OutLive/HealthKitManager.m; sourceTree = ""; }; 79B2CB722E7B954F00B51753 /* HealthKitManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = HealthKitManager.swift; path = OutLive/HealthKitManager.swift; sourceTree = ""; }; - 8040E4CFF70F1C94062730AC /* Pods-OutLive.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OutLive.debug.xcconfig"; path = "Target Support Files/Pods-OutLive/Pods-OutLive.debug.xcconfig"; sourceTree = ""; }; AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = OutLive/SplashScreen.storyboard; sourceTree = ""; }; B7F23062EE59F61E6260DBA8 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = OutLive/PrivacyInfo.xcprivacy; sourceTree = ""; }; BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = ""; }; - EC19B3AF8877D65827EF5567 /* Pods-OutLive.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OutLive.release.xcconfig"; path = "Target Support Files/Pods-OutLive/Pods-OutLive.release.xcconfig"; sourceTree = ""; }; + C411D1CEBC225A6F92F136BA /* libPods-OutLive.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-OutLive.a"; sourceTree = BUILT_PRODUCTS_DIR; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; F11748412D0307B40044C1D9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = OutLive/AppDelegate.swift; sourceTree = ""; }; F11748442D0722820044C1D9 /* OutLive-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "OutLive-Bridging-Header.h"; path = "OutLive/OutLive-Bridging-Header.h"; sourceTree = ""; }; - F55788C6990114D378E7CC53 /* libPods-OutLive.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-OutLive.a"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -42,7 +42,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - EB8685B6DDDFD4D181274014 /* libPods-OutLive.a in Frameworks */, + 646189797DBE7937221347A9 /* libPods-OutLive.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -67,11 +67,21 @@ isa = PBXGroup; children = ( ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - F55788C6990114D378E7CC53 /* libPods-OutLive.a */, + C411D1CEBC225A6F92F136BA /* libPods-OutLive.a */, ); name = Frameworks; sourceTree = ""; }; + 7B63456AB81271603E0039A3 /* Pods */ = { + isa = PBXGroup; + children = ( + 4FAA45EB21D2C45B94943F48 /* Pods-OutLive.debug.xcconfig */, + 0FF78E2879F14B0D75DF41B4 /* Pods-OutLive.release.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 80E2A1E8ECA8777F7264D855 /* ExpoModulesProviders */ = { isa = PBXGroup; children = ( @@ -96,8 +106,8 @@ 832341AE1AAA6A7D00B99B32 /* Libraries */, 83CBBA001A601CBA00E9B192 /* Products */, 2D16E6871FA4F8E400B85C8A /* Frameworks */, - CCDACA5E9524EEDD222FCFC4 /* Pods */, 80E2A1E8ECA8777F7264D855 /* ExpoModulesProviders */, + 7B63456AB81271603E0039A3 /* Pods */, ); indentWidth = 2; sourceTree = ""; @@ -129,16 +139,6 @@ name = OutLive; sourceTree = ""; }; - CCDACA5E9524EEDD222FCFC4 /* Pods */ = { - isa = PBXGroup; - children = ( - 8040E4CFF70F1C94062730AC /* Pods-OutLive.debug.xcconfig */, - EC19B3AF8877D65827EF5567 /* Pods-OutLive.release.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -146,14 +146,14 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "OutLive" */; buildPhases = ( - 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */, + 0B29745394A2F51EC4C9CBC7 /* [CP] Check Pods Manifest.lock */, FED23F24D8115FB0D63DF986 /* [Expo] Configure project */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */, - 018494B0E6694F9F0626A4B2 /* [CP] Embed Pods Frameworks */, + EF8950FE7A620E6B790F3042 /* [CP] Embed Pods Frameworks */, + 2266B6A6AD27779BC2D49E87 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -227,29 +227,7 @@ shellPath = /bin/sh; shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" \"$PROJECT_ROOT\" ios absolute | tail -n 1)\"\nfi\n\nif [[ -z \"$CLI_PATH\" ]]; then\n # Use Expo CLI\n export CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })\")\"\nfi\nif [[ -z \"$BUNDLE_COMMAND\" ]]; then\n # Default Expo CLI command for bundling\n export BUNDLE_COMMAND=\"export:embed\"\nfi\n\n# Source .xcode.env.updates if it exists to allow\n# SKIP_BUNDLING to be unset if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.updates\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.updates\"\nfi\n# Source local changes to allow overrides\n# if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n"; }; - 018494B0E6694F9F0626A4B2 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-OutLive/Pods-OutLive-frameworks.sh", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/React-Core-prebuilt/React.framework/React", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/ReactNativeDependencies/ReactNativeDependencies.framework/ReactNativeDependencies", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/React.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ReactNativeDependencies.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-OutLive/Pods-OutLive-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */ = { + 0B29745394A2F51EC4C9CBC7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -271,7 +249,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = { + 2266B6A6AD27779BC2D49E87 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -323,6 +301,28 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-OutLive/Pods-OutLive-resources.sh\"\n"; showEnvVarsInLog = 0; }; + EF8950FE7A620E6B790F3042 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-OutLive/Pods-OutLive-frameworks.sh", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/React-Core-prebuilt/React.framework/React", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/ReactNativeDependencies/ReactNativeDependencies.framework/ReactNativeDependencies", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/React.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ReactNativeDependencies.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-OutLive/Pods-OutLive-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; FED23F24D8115FB0D63DF986 /* [Expo] Configure project */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -367,7 +367,7 @@ /* Begin XCBuildConfiguration section */ 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8040E4CFF70F1C94062730AC /* Pods-OutLive.debug.xcconfig */; + baseConfigurationReference = 4FAA45EB21D2C45B94943F48 /* Pods-OutLive.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; @@ -404,7 +404,7 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = EC19B3AF8877D65827EF5567 /* Pods-OutLive.release.xcconfig */; + baseConfigurationReference = 0FF78E2879F14B0D75DF41B4 /* Pods-OutLive.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 50b8233..edcbc91 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -8,7 +8,7 @@ PODS: - React-Core - EXNotifications (0.32.11): - ExpoModulesCore - - Expo (54.0.8): + - Expo (54.0.10): - ExpoModulesCore - hermes-engine - RCTRequired @@ -35,9 +35,9 @@ PODS: - Yoga - ExpoAppleAuthentication (8.0.7): - ExpoModulesCore - - ExpoAsset (12.0.8): + - ExpoAsset (12.0.9): - ExpoModulesCore - - ExpoBackgroundTask (1.0.7): + - ExpoBackgroundTask (1.0.8): - ExpoModulesCore - ExpoBlur (15.0.7): - ExpoModulesCore @@ -45,7 +45,7 @@ PODS: - ExpoModulesCore - ZXingObjC/OneD - ZXingObjC/PDF417 - - ExpoFileSystem (19.0.14): + - ExpoFileSystem (19.0.15): - ExpoModulesCore - ExpoFont (14.0.8): - ExpoModulesCore @@ -71,7 +71,7 @@ PODS: - ExpoModulesCore - ExpoLinking (8.0.8): - ExpoModulesCore - - ExpoModulesCore (3.0.16): + - ExpoModulesCore (3.0.18): - hermes-engine - RCTRequired - RCTTypeSafety @@ -104,7 +104,7 @@ PODS: - ExpoModulesCore - ExpoSystemUI (6.0.7): - ExpoModulesCore - - ExpoUI (0.2.0-beta.3): + - ExpoUI (0.2.0-beta.4): - ExpoModulesCore - ExpoWebBrowser (15.0.7): - ExpoModulesCore @@ -1510,7 +1510,7 @@ PODS: - Yoga - react-native-voice (3.2.4): - React-Core - - react-native-webview (13.15.0): + - react-native-webview (13.16.0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1927,7 +1927,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - RNCPicker (2.11.1): + - RNCPicker (2.11.2): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1949,7 +1949,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - RNDateTimePicker (8.4.4): + - RNDateTimePicker (8.4.5): - hermes-engine - RCTRequired - RCTTypeSafety @@ -2119,7 +2119,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - RNSentry (6.20.0): + - RNSentry (7.1.0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -2141,9 +2141,9 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - ReactNativeDependencies - - Sentry/HybridSDK (= 8.53.2) + - Sentry/HybridSDK (= 8.56.0) - Yoga - - RNSVG (15.12.1): + - RNSVG (15.13.0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -2164,9 +2164,9 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - ReactNativeDependencies - - RNSVG/common (= 15.12.1) + - RNSVG/common (= 15.13.0) - Yoga - - RNSVG/common (15.12.1): + - RNSVG/common (15.13.0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -2270,7 +2270,7 @@ PODS: - SDWebImageWebPCoder (0.14.6): - libwebp (~> 1.0) - SDWebImage/Core (~> 5.17) - - Sentry/HybridSDK (8.53.2) + - Sentry/HybridSDK (8.56.0) - UMAppLoader (6.0.7) - Yoga (0.0.0) - ZXingObjC/Core (3.6.9) @@ -2647,13 +2647,13 @@ SPEC CHECKSUMS: EXConstants: a95804601ee4a6aa7800645f9b070d753b1142b3 EXImageLoader: 189e3476581efe3ad4d1d3fb4735b7179eb26f05 EXNotifications: 7a2975f4e282b827a0bc78bb1d232650cb569bbd - Expo: 4875e1cc72ae1398e33bcd6632943a4e93926ecd + Expo: c839a13691635386c0134f204dbbaed3cebff0a8 ExpoAppleAuthentication: bc9de6e9ff3340604213ab9031d4c4f7f802623e - ExpoAsset: 84810d6fed8179f04d4a7a4a6b37028bbd726e26 - ExpoBackgroundTask: 22ed53b129d4d5e15c39be9fa68e45d25f6781a1 + ExpoAsset: 9ba6fbd677fb8e241a3899ac00fa735bc911eadf + ExpoBackgroundTask: e0d201d38539c571efc5f9cb661fae8ab36ed61b ExpoBlur: 2dd8f64aa31f5d405652c21d3deb2d2588b1852f ExpoCamera: e75f6807a2c047f3338bbadd101af4c71a1d13a5 - ExpoFileSystem: 4fb06865906e781329eb67166bd64fc4749c3019 + ExpoFileSystem: 5fb091ea11198e109ceef2bdef2e6e66523e62c4 ExpoFont: 86ceec09ffed1c99cfee36ceb79ba149074901b5 ExpoGlassEffect: 744bf0c58c26a1b0212dff92856be07b98d01d8c ExpoHaptics: 807476b0c39e9d82b7270349d6487928ce32df84 @@ -2663,13 +2663,13 @@ SPEC CHECKSUMS: ExpoKeepAwake: 1a2e820692e933c94a565ec3fbbe38ac31658ffe ExpoLinearGradient: a464898cb95153125e3b81894fd479bcb1c7dd27 ExpoLinking: f051f28e50ea9269ff539317c166adec81d9342d - ExpoModulesCore: a28d1b4a5a9fbdacc41ca8d0c777a2d73496b022 + ExpoModulesCore: c03ac4bc5a83469ca1222c3954a0499cd059addf ExpoQuickActions: 31a70aa6a606128de4416a4830e09cfabfe6667f ExpoSplashScreen: cbb839de72110dea1851dd3e85080b7923af2540 ExpoSQLite: 7fa091ba5562474093fef09be644161a65e11b3f ExpoSymbols: 1ae04ce686de719b9720453b988d8bc5bf776c68 ExpoSystemUI: 6cd74248a2282adf6dec488a75fa532d69dee314 - ExpoUI: 68238da1f16a814f77bc64712a269440174ee898 + ExpoUI: 5e44b62e2589b7bc8a6123943105a230c693d000 ExpoWebBrowser: 533bc2a1b188eec1c10e4926decf658f1687b5e5 EXTaskManager: cf225704fab8de8794a6f57f7fa41a90c0e2cd47 FBLazyVector: 9e0cd874afd81d9a4d36679daca991b58b260d42 @@ -2716,7 +2716,7 @@ SPEC CHECKSUMS: react-native-render-html: 5afc4751f1a98621b3009432ef84c47019dcb2bd react-native-safe-area-context: 42a1b4f8774b577d03b53de7326e3d5757fe9513 react-native-voice: 908a0eba96c8c3d643e4f98b7232c6557d0a6f9c - react-native-webview: b29007f4723bca10872028067b07abacfa1cb35a + react-native-webview: 3e303e80cadb5f17118c8c1502aa398e9287e415 React-NativeModulesApple: a9464983ccc0f66f45e93558671f60fc7536e438 React-oscompat: 73db7dbc80edef36a9d6ed3c6c4e1724ead4236d React-perflogger: 123272debf907cc423962adafcf4513320e43757 @@ -2751,21 +2751,21 @@ SPEC CHECKSUMS: RevenueCat: 4743a5eee0004e1c03eabeb3498818f902a5d622 RNCAsyncStorage: 3a4f5e2777dae1688b781a487923a08569e27fe4 RNCMaskedView: d2578d41c59b936db122b2798ba37e4722d21035 - RNCPicker: a7170edbcbf8288de8edb2502e08e7fc757fa755 - RNDateTimePicker: be0e44bcb9ed0607c7c5f47dbedd88cf091f6791 + RNCPicker: ddce382c4b42ea2ee36dd588066f0c6d5a240707 + RNDateTimePicker: 7dda2673bd2a6022ea8888fe669d735b2eac0b2d RNDeviceInfo: d863506092aef7e7af3a1c350c913d867d795047 RNGestureHandler: 2914750df066d89bf9d8f48a10ad5f0051108ac3 RNPurchases: 1bc60e3a69af65d9cfe23967328421dd1df1763c RNReanimated: 8d3a14606ad49f022c17d9e12a2d339e9e5ad9b0 RNScreens: d8d6f1792f6e7ac12b0190d33d8d390efc0c1845 - RNSentry: 4ed853c2ae6b4a235afa67145e0c30ae5adcf0b2 - RNSVG: 31d6639663c249b7d5abc9728dde2041eb2a3c34 + RNSentry: dbee413744aec703b8763b620b14ed7a1e2db095 + RNSVG: efc8a09e4ef50e7df0dbc9327752be127a2f610c RNWorklets: 76fce72926e28e304afb44f0da23b2d24f2c1fa0 SDWebImage: 9f177d83116802728e122410fb25ad88f5c7608a SDWebImageAVIFCoder: afe194a084e851f70228e4be35ef651df0fc5c57 SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 - Sentry: 59993bffde4a1ac297ba6d268dc4bbce068d7c1b + Sentry: 3d82977434c80381cae856c40b99c39e4be6bc11 UMAppLoader: e1234c45d2b7da239e9e90fc4bbeacee12afd5b6 Yoga: 051f086b5ccf465ff2ed38a2cf5a558ae01aaaa1 ZXingObjC: 8898711ab495761b2dbbdec76d90164a6d7e14c5 diff --git a/package-lock.json b/package-lock.json index fa2b586..a930259 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,24 +9,23 @@ "version": "1.0.2", "dependencies": { "@expo/metro-runtime": "~6.1.2", - "@expo/ui": "~0.2.0-beta.3", + "@expo/ui": "~0.2.0-beta.4", "@expo/vector-icons": "^15.0.2", "@react-native-async-storage/async-storage": "^2.2.0", - "@react-native-community/datetimepicker": "8.4.4", + "@react-native-community/datetimepicker": "8.4.5", "@react-native-masked-view/masked-view": "^0.3.2", - "@react-native-picker/picker": "2.11.1", + "@react-native-picker/picker": "2.11.2", "@react-native-voice/voice": "^3.2.4", "@react-navigation/bottom-tabs": "^7.4.0", "@react-navigation/elements": "^2.6.4", "@react-navigation/native": "^7.1.8", "@reduxjs/toolkit": "^2.9.0", - "@sentry/react-native": "~6.20.0", + "@sentry/react-native": "~7.1.0", "@types/lodash": "^4.17.20", - "cos-js-sdk-v5": "^1.6.0", "dayjs": "^1.11.18", - "expo": "^54.0.8", + "expo": "^54.0.10", "expo-apple-authentication": "~8.0.7", - "expo-background-task": "~1.0.7", + "expo-background-task": "~1.0.8", "expo-blur": "~15.0.7", "expo-camera": "~17.0.8", "expo-constants": "~18.0.9", @@ -52,6 +51,7 @@ "react": "19.1.0", "react-dom": "19.1.0", "react-native": "0.81.4", + "react-native-chart-kit": "^6.12.0", "react-native-device-info": "^14.0.4", "react-native-gesture-handler": "~2.28.0", "react-native-image-viewing": "^0.2.2", @@ -63,10 +63,10 @@ "react-native-render-html": "^6.3.4", "react-native-safe-area-context": "~5.6.1", "react-native-screens": "~4.16.0", - "react-native-svg": "15.12.1", + "react-native-svg": "^15.13.0", "react-native-toast-message": "^2.3.3", "react-native-web": "^0.21.1", - "react-native-webview": "13.15.0", + "react-native-webview": "13.16.0", "react-native-wheel-picker-expo": "^0.5.4", "react-native-worklets": "0.5.1", "react-redux": "^9.2.0" @@ -395,7 +395,6 @@ "version": "7.28.3", "resolved": "https://mirrors.tencent.com/npm/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", - "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.3", @@ -621,7 +620,6 @@ "version": "7.8.3", "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1029,7 +1027,6 @@ "version": "7.27.1", "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", - "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -1397,7 +1394,6 @@ "version": "7.27.1", "resolved": "https://mirrors.tencent.com/npm/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2011,9 +2007,9 @@ } }, "node_modules/@expo/mcp-tunnel": { - "version": "0.0.7", - "resolved": "https://mirrors.tencent.com/npm/@expo/mcp-tunnel/-/mcp-tunnel-0.0.7.tgz", - "integrity": "sha512-ht8Q1nKtiHobZqkUqt/7awwjW2D59ardP6XDVmGceGjQtoZELVaJDHyMIX+aVG9SZ9aj8+uGlhQYeBi57SZPMA==", + "version": "0.0.8", + "resolved": "https://mirrors.tencent.com/npm/@expo/mcp-tunnel/-/mcp-tunnel-0.0.8.tgz", + "integrity": "sha512-6261obzt6h9TQb6clET7Fw4Ig4AY2hfTNKI3gBt0gcTNxZipwMg8wER7ssDYieA9feD/FfPTuCPYFcR280aaWA==", "license": "MIT", "dependencies": { "ws": "^8.18.3", @@ -2051,9 +2047,9 @@ } }, "node_modules/@expo/metro": { - "version": "0.1.1", - "resolved": "https://mirrors.tencent.com/npm/@expo/metro/-/metro-0.1.1.tgz", - "integrity": "sha512-zvA9BE6myFoCxeiw/q3uE/kVkIwLTy27a+fDoEl7WQ7EvKfFeiXnRVhUplDMLGZIHH8VC38Gay6RBtVhnmOm5w==", + "version": "54.0.0", + "resolved": "https://mirrors.tencent.com/npm/@expo/metro/-/metro-54.0.0.tgz", + "integrity": "sha512-x2HlliepLJVLSe0Fl/LuPT83Mn2EXpPlb1ngVtcawlz4IfbkYJo16/Zfsfrn1t9d8LpN5dD44Dc55Q1/fO05Nw==", "license": "MIT", "dependencies": { "metro": "0.83.1", @@ -2071,9 +2067,9 @@ } }, "node_modules/@expo/metro-config": { - "version": "54.0.3", - "resolved": "https://mirrors.tencent.com/npm/@expo/metro-config/-/metro-config-54.0.3.tgz", - "integrity": "sha512-TQ5MKSGFB6zJxi+Yr8VYXQFHzRXgvSJzNsHX1otTqnxjXbptwYiXhljAqGSjr3pByq4+sHX/GifMk6fGgAANmA==", + "version": "54.0.5", + "resolved": "https://mirrors.tencent.com/npm/@expo/metro-config/-/metro-config-54.0.5.tgz", + "integrity": "sha512-Y+oYtLg8b3L4dHFImfu8+yqO+KOcBpLLjxN7wGbs7miP/BjntBQ6tKbPxyKxHz5UUa1s+buBzZlZhsFo9uqKMg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.20.0", @@ -2082,7 +2078,7 @@ "@expo/config": "~12.0.9", "@expo/env": "~2.0.7", "@expo/json-file": "~10.0.7", - "@expo/metro": "~0.1.1", + "@expo/metro": "~54.0.0", "@expo/spawn-async": "^1.7.2", "browserslist": "^4.25.0", "chalk": "^4.1.0", @@ -2238,9 +2234,9 @@ "license": "MIT" }, "node_modules/@expo/server": { - "version": "0.7.4", - "resolved": "https://mirrors.tencent.com/npm/@expo/server/-/server-0.7.4.tgz", - "integrity": "sha512-8bfRzL7h1Qgrmf3auR71sPAcAuxnmNkRJs+8enL8vZi2+hihevLhrayDu7P0A/XGEq7wySAGvBBFfIB00Et/AA==", + "version": "0.7.5", + "resolved": "https://mirrors.tencent.com/npm/@expo/server/-/server-0.7.5.tgz", + "integrity": "sha512-aNVcerBSJEcUspvXRWChEgFhix1gTNIcgFDevaU/A1+TkfbejNIjGX4rfLEpfyRzzdLIRuOkBNjD+uTYMzohyg==", "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", @@ -2269,10 +2265,13 @@ "license": "MIT" }, "node_modules/@expo/ui": { - "version": "0.2.0-beta.3", - "resolved": "https://mirrors.tencent.com/npm/@expo/ui/-/ui-0.2.0-beta.3.tgz", - "integrity": "sha512-o2gtJm8Y1LZjRzapE1q26C6B6RBhyj4jEeBlfOCIWi5R72W+tOX1N5QAxpV9AwZlWi39Y7BSS2vtocQhFEJWHQ==", + "version": "0.2.0-beta.4", + "resolved": "https://mirrors.tencent.com/npm/@expo/ui/-/ui-0.2.0-beta.4.tgz", + "integrity": "sha512-49DoNCQ5jyLFvnTZpVU1aMSbfgRtX4QQtnX7WM97A7dJhocvaF7g7MA3LBeoZ07MMVKuuwfcIBM2F/f52S+6zw==", "license": "MIT", + "dependencies": { + "sf-symbols-typescript": "^2.1.0" + }, "peerDependencies": { "expo": "*", "react": "*", @@ -3382,9 +3381,9 @@ } }, "node_modules/@react-native-community/datetimepicker": { - "version": "8.4.4", - "resolved": "https://mirrors.tencent.com/npm/@react-native-community/datetimepicker/-/datetimepicker-8.4.4.tgz", - "integrity": "sha512-bc4ZixEHxZC9/qf5gbdYvIJiLZ5CLmEsC3j+Yhe1D1KC/3QhaIfGDVdUcid0PdlSoGOSEq4VlB93AWyetEyBSQ==", + "version": "8.4.5", + "resolved": "https://mirrors.tencent.com/npm/@react-native-community/datetimepicker/-/datetimepicker-8.4.5.tgz", + "integrity": "sha512-vvVOJAHjU8TFBzTUjQzANCL6C3pZSE2zjfutCATk790uz7ASEc2tOBD+EIG4BTelWtP2G9jqvXp2L7XGdhEBRg==", "license": "MIT", "dependencies": { "invariant": "^2.2.4" @@ -3415,9 +3414,9 @@ } }, "node_modules/@react-native-picker/picker": { - "version": "2.11.1", - "resolved": "https://mirrors.tencent.com/npm/@react-native-picker/picker/-/picker-2.11.1.tgz", - "integrity": "sha512-ThklnkK4fV3yynnIIRBkxxjxR4IFbdMNJVF6tlLdOJ/zEFUEFUEdXY0KmH0iYzMwY8W4/InWsLiA7AkpAbnexA==", + "version": "2.11.2", + "resolved": "https://mirrors.tencent.com/npm/@react-native-picker/picker/-/picker-2.11.2.tgz", + "integrity": "sha512-2zyFdW4jgHjF+NeuDZ4nl3hJ+8suey69bI3yljqhNyowfklW2NwNrdDUaJ2iwtPCpk2pt7834aPF8TI6iyZRhA==", "license": "MIT", "workspaces": [ "example" @@ -3993,84 +3992,84 @@ "license": "MIT" }, "node_modules/@sentry-internal/browser-utils": { - "version": "8.55.0", - "resolved": "https://mirrors.tencent.com/npm/@sentry-internal/browser-utils/-/browser-utils-8.55.0.tgz", - "integrity": "sha512-ROgqtQfpH/82AQIpESPqPQe0UyWywKJsmVIqi3c5Fh+zkds5LUxnssTj3yNd1x+kxaPDVB023jAP+3ibNgeNDw==", + "version": "10.12.0", + "resolved": "https://mirrors.tencent.com/npm/@sentry-internal/browser-utils/-/browser-utils-10.12.0.tgz", + "integrity": "sha512-dozbx389jhKynj0d657FsgbBVOar7pX3mb6GjqCxslXF0VKpZH2Xks0U32RgDY/nK27O+o095IWz7YvjVmPkDw==", "license": "MIT", "dependencies": { - "@sentry/core": "8.55.0" + "@sentry/core": "10.12.0" }, "engines": { - "node": ">=14.18" + "node": ">=18" } }, "node_modules/@sentry-internal/feedback": { - "version": "8.55.0", - "resolved": "https://mirrors.tencent.com/npm/@sentry-internal/feedback/-/feedback-8.55.0.tgz", - "integrity": "sha512-cP3BD/Q6pquVQ+YL+rwCnorKuTXiS9KXW8HNKu4nmmBAyf7urjs+F6Hr1k9MXP5yQ8W3yK7jRWd09Yu6DHWOiw==", + "version": "10.12.0", + "resolved": "https://mirrors.tencent.com/npm/@sentry-internal/feedback/-/feedback-10.12.0.tgz", + "integrity": "sha512-0+7ceO6yQPPqfxRc9ue/xoPHKcnB917ezPaehGQNfAFNQB9PNTG1y55+8mRu0Fw+ANbZeCt/HyoCmXuRdxmkpg==", "license": "MIT", "dependencies": { - "@sentry/core": "8.55.0" + "@sentry/core": "10.12.0" }, "engines": { - "node": ">=14.18" + "node": ">=18" } }, "node_modules/@sentry-internal/replay": { - "version": "8.55.0", - "resolved": "https://mirrors.tencent.com/npm/@sentry-internal/replay/-/replay-8.55.0.tgz", - "integrity": "sha512-roCDEGkORwolxBn8xAKedybY+Jlefq3xYmgN2fr3BTnsXjSYOPC7D1/mYqINBat99nDtvgFvNfRcZPiwwZ1hSw==", + "version": "10.12.0", + "resolved": "https://mirrors.tencent.com/npm/@sentry-internal/replay/-/replay-10.12.0.tgz", + "integrity": "sha512-/1093gSNGN5KlOBsuyAl33JkzGiG38kCnxswQLZWpPpR6LBbR1Ddb18HjhDpoQNNEZybJBgJC3a5NKl43C2TSQ==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "8.55.0", - "@sentry/core": "8.55.0" + "@sentry-internal/browser-utils": "10.12.0", + "@sentry/core": "10.12.0" }, "engines": { - "node": ">=14.18" + "node": ">=18" } }, "node_modules/@sentry-internal/replay-canvas": { - "version": "8.55.0", - "resolved": "https://mirrors.tencent.com/npm/@sentry-internal/replay-canvas/-/replay-canvas-8.55.0.tgz", - "integrity": "sha512-nIkfgRWk1091zHdu4NbocQsxZF1rv1f7bbp3tTIlZYbrH62XVZosx5iHAuZG0Zc48AETLE7K4AX9VGjvQj8i9w==", + "version": "10.12.0", + "resolved": "https://mirrors.tencent.com/npm/@sentry-internal/replay-canvas/-/replay-canvas-10.12.0.tgz", + "integrity": "sha512-W/z1/+69i3INNfPjD1KuinSNaRQaApjzwb37IFmiyF440F93hxmEYgXHk3poOlYYaigl2JMYbysGPWOiXnqUXA==", "license": "MIT", "dependencies": { - "@sentry-internal/replay": "8.55.0", - "@sentry/core": "8.55.0" + "@sentry-internal/replay": "10.12.0", + "@sentry/core": "10.12.0" }, "engines": { - "node": ">=14.18" + "node": ">=18" } }, "node_modules/@sentry/babel-plugin-component-annotate": { - "version": "4.1.1", - "resolved": "https://mirrors.tencent.com/npm/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-4.1.1.tgz", - "integrity": "sha512-HUpqrCK7zDVojTV6KL6BO9ZZiYrEYQqvYQrscyMsq04z+WCupXaH6YEliiNRvreR8DBJgdsG3lBRpebhUGmvfA==", + "version": "4.3.0", + "resolved": "https://mirrors.tencent.com/npm/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-4.3.0.tgz", + "integrity": "sha512-OuxqBprXRyhe8Pkfyz/4yHQJc5c3lm+TmYWSSx8u48g5yKewSQDOxkiLU5pAk3WnbLPy8XwU/PN+2BG0YFU9Nw==", "license": "MIT", "engines": { "node": ">= 14" } }, "node_modules/@sentry/browser": { - "version": "8.55.0", - "resolved": "https://mirrors.tencent.com/npm/@sentry/browser/-/browser-8.55.0.tgz", - "integrity": "sha512-1A31mCEWCjaMxJt6qGUK+aDnLDcK6AwLAZnqpSchNysGni1pSn1RWSmk9TBF8qyTds5FH8B31H480uxMPUJ7Cw==", + "version": "10.12.0", + "resolved": "https://mirrors.tencent.com/npm/@sentry/browser/-/browser-10.12.0.tgz", + "integrity": "sha512-lKyaB2NFmr7SxPjmMTLLhQ7xfxaY3kdkMhpzuRI5qwOngtKt4+FtvNYHRuz+PTtEFv4OaHhNNbRn6r91gWguQg==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "8.55.0", - "@sentry-internal/feedback": "8.55.0", - "@sentry-internal/replay": "8.55.0", - "@sentry-internal/replay-canvas": "8.55.0", - "@sentry/core": "8.55.0" + "@sentry-internal/browser-utils": "10.12.0", + "@sentry-internal/feedback": "10.12.0", + "@sentry-internal/replay": "10.12.0", + "@sentry-internal/replay-canvas": "10.12.0", + "@sentry/core": "10.12.0" }, "engines": { - "node": ">=14.18" + "node": ">=18" } }, "node_modules/@sentry/cli": { - "version": "2.51.1", - "resolved": "https://mirrors.tencent.com/npm/@sentry/cli/-/cli-2.51.1.tgz", - "integrity": "sha512-FU+54kNcKJABU0+ekvtnoXHM9zVrDe1zXVFbQT7mS0On0m1P0zFRGdzbnWe2XzpzuEAJXtK6aog/W+esRU9AIA==", + "version": "2.53.0", + "resolved": "https://mirrors.tencent.com/npm/@sentry/cli/-/cli-2.53.0.tgz", + "integrity": "sha512-n2ZNb+5Z6AZKQSI0SusQ7ZzFL637mfw3Xh4C3PEyVSn9LiF683fX0TTq8OeGmNZQS4maYfS95IFD+XpydU0dEA==", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { @@ -4087,20 +4086,20 @@ "node": ">= 10" }, "optionalDependencies": { - "@sentry/cli-darwin": "2.51.1", - "@sentry/cli-linux-arm": "2.51.1", - "@sentry/cli-linux-arm64": "2.51.1", - "@sentry/cli-linux-i686": "2.51.1", - "@sentry/cli-linux-x64": "2.51.1", - "@sentry/cli-win32-arm64": "2.51.1", - "@sentry/cli-win32-i686": "2.51.1", - "@sentry/cli-win32-x64": "2.51.1" + "@sentry/cli-darwin": "2.53.0", + "@sentry/cli-linux-arm": "2.53.0", + "@sentry/cli-linux-arm64": "2.53.0", + "@sentry/cli-linux-i686": "2.53.0", + "@sentry/cli-linux-x64": "2.53.0", + "@sentry/cli-win32-arm64": "2.53.0", + "@sentry/cli-win32-i686": "2.53.0", + "@sentry/cli-win32-x64": "2.53.0" } }, "node_modules/@sentry/cli-darwin": { - "version": "2.51.1", - "resolved": "https://mirrors.tencent.com/npm/@sentry/cli-darwin/-/cli-darwin-2.51.1.tgz", - "integrity": "sha512-R1u8IQdn/7Rr8sf6bVVr0vJT4OqwCFdYsS44Y3OoWGVJW2aAQTWRJOTlV4ueclVLAyUQzmgBjfR8AtiUhd/M5w==", + "version": "2.53.0", + "resolved": "https://mirrors.tencent.com/npm/@sentry/cli-darwin/-/cli-darwin-2.53.0.tgz", + "integrity": "sha512-NNPfpILMwKgpHiyJubHHuauMKltkrgLQ5tvMdxNpxY60jBNdo5VJtpESp4XmXlnidzV4j1z61V4ozU6ttDgt5Q==", "license": "BSD-3-Clause", "optional": true, "os": [ @@ -4111,9 +4110,9 @@ } }, "node_modules/@sentry/cli-linux-arm": { - "version": "2.51.1", - "resolved": "https://mirrors.tencent.com/npm/@sentry/cli-linux-arm/-/cli-linux-arm-2.51.1.tgz", - "integrity": "sha512-Klro17OmSSKOOSaxVKBBNPXet2+HrIDZUTSp8NRl4LQsIubdc1S/aQ79cH/g52Muwzpl3aFwPxyXw+46isfEgA==", + "version": "2.53.0", + "resolved": "https://mirrors.tencent.com/npm/@sentry/cli-linux-arm/-/cli-linux-arm-2.53.0.tgz", + "integrity": "sha512-NdRzQ15Ht83qG0/Lyu11ciy/Hu/oXbbtJUgwzACc7bWvHQA8xEwTsehWexqn1529Kfc5EjuZ0Wmj3MHmp+jOWw==", "cpu": [ "arm" ], @@ -4129,9 +4128,9 @@ } }, "node_modules/@sentry/cli-linux-arm64": { - "version": "2.51.1", - "resolved": "https://mirrors.tencent.com/npm/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.51.1.tgz", - "integrity": "sha512-nvA/hdhsw4bKLhslgbBqqvETjXwN1FVmwHLOrRvRcejDO6zeIKUElDiL5UOjGG0NC+62AxyNw5ri8Wzp/7rg9Q==", + "version": "2.53.0", + "resolved": "https://mirrors.tencent.com/npm/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.53.0.tgz", + "integrity": "sha512-xY/CZ1dVazsSCvTXzKpAgXaRqfljVfdrFaYZRUaRPf1ZJRGa3dcrivoOhSIeG/p5NdYtMvslMPY9Gm2MT0M83A==", "cpu": [ "arm64" ], @@ -4147,9 +4146,9 @@ } }, "node_modules/@sentry/cli-linux-i686": { - "version": "2.51.1", - "resolved": "https://mirrors.tencent.com/npm/@sentry/cli-linux-i686/-/cli-linux-i686-2.51.1.tgz", - "integrity": "sha512-jp4TmR8VXBdT9dLo6mHniQHN0xKnmJoPGVz9h9VDvO2Vp/8o96rBc555D4Am5wJOXmfuPlyjGcmwHlB3+kQRWw==", + "version": "2.53.0", + "resolved": "https://mirrors.tencent.com/npm/@sentry/cli-linux-i686/-/cli-linux-i686-2.53.0.tgz", + "integrity": "sha512-0REmBibGAB4jtqt9S6JEsFF4QybzcXHPcHtJjgMi5T0ueh952uG9wLzjSxQErCsxTKF+fL8oG0Oz5yKBuCwCCQ==", "cpu": [ "x86", "ia32" @@ -4166,9 +4165,9 @@ } }, "node_modules/@sentry/cli-linux-x64": { - "version": "2.51.1", - "resolved": "https://mirrors.tencent.com/npm/@sentry/cli-linux-x64/-/cli-linux-x64-2.51.1.tgz", - "integrity": "sha512-JuLt0MXM2KHNFmjqXjv23sly56mJmUQzGBWktkpY3r+jE08f5NLKPd5wQ6W/SoLXGIOKnwLz0WoUg7aBVyQdeQ==", + "version": "2.53.0", + "resolved": "https://mirrors.tencent.com/npm/@sentry/cli-linux-x64/-/cli-linux-x64-2.53.0.tgz", + "integrity": "sha512-9UGJL+Vy5N/YL1EWPZ/dyXLkShlNaDNrzxx4G7mTS9ywjg+BIuemo6rnN7w43K1NOjObTVO6zY0FwumJ1pCyLg==", "cpu": [ "x64" ], @@ -4184,9 +4183,9 @@ } }, "node_modules/@sentry/cli-win32-arm64": { - "version": "2.51.1", - "resolved": "https://mirrors.tencent.com/npm/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.51.1.tgz", - "integrity": "sha512-PiwjTdIFDazTQCTyDCutiSkt4omggYSKnO3HE1+LDjElsFrWY9pJs4fU3D40WAyE2oKu0MarjNH/WxYGdqEAlg==", + "version": "2.53.0", + "resolved": "https://mirrors.tencent.com/npm/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.53.0.tgz", + "integrity": "sha512-G1kjOjrjMBY20rQcJV2GA8KQE74ufmROCDb2GXYRfjvb1fKAsm4Oh8N5+Tqi7xEHdjQoLPkE4CNW0aH68JSUDQ==", "cpu": [ "arm64" ], @@ -4200,9 +4199,9 @@ } }, "node_modules/@sentry/cli-win32-i686": { - "version": "2.51.1", - "resolved": "https://mirrors.tencent.com/npm/@sentry/cli-win32-i686/-/cli-win32-i686-2.51.1.tgz", - "integrity": "sha512-TMvZZpeiI2HmrDFNVQ0uOiTuYKvjEGOZdmUxe3WlhZW82A/2Oka7sQ24ljcOovbmBOj5+fjCHRUMYvLMCWiysA==", + "version": "2.53.0", + "resolved": "https://mirrors.tencent.com/npm/@sentry/cli-win32-i686/-/cli-win32-i686-2.53.0.tgz", + "integrity": "sha512-qbGTZUzesuUaPtY9rPXdNfwLqOZKXrJRC1zUFn52hdo6B+Dmv0m/AHwRVFHZP53Tg1NCa8bDei2K/uzRN0dUZw==", "cpu": [ "x86", "ia32" @@ -4217,9 +4216,9 @@ } }, "node_modules/@sentry/cli-win32-x64": { - "version": "2.51.1", - "resolved": "https://mirrors.tencent.com/npm/@sentry/cli-win32-x64/-/cli-win32-x64-2.51.1.tgz", - "integrity": "sha512-v2hreYUPPTNK1/N7+DeX7XBN/zb7p539k+2Osf0HFyVBaoUC3Y3+KBwSf4ASsnmgTAK7HCGR+X0NH1vP+icw4w==", + "version": "2.53.0", + "resolved": "https://mirrors.tencent.com/npm/@sentry/cli-win32-x64/-/cli-win32-x64-2.53.0.tgz", + "integrity": "sha512-1TXYxYHtwgUq5KAJt3erRzzUtPqg7BlH9T7MdSPHjJatkrr/kwZqnVe2H6Arr/5NH891vOlIeSPHBdgJUAD69g==", "cpu": [ "x64" ], @@ -4258,44 +4257,43 @@ } }, "node_modules/@sentry/core": { - "version": "8.55.0", - "resolved": "https://mirrors.tencent.com/npm/@sentry/core/-/core-8.55.0.tgz", - "integrity": "sha512-6g7jpbefjHYs821Z+EBJ8r4Z7LT5h80YSWRJaylGS4nW5W5Z2KXzpdnyFarv37O7QjauzVC2E+PABmpkw5/JGA==", + "version": "10.12.0", + "resolved": "https://mirrors.tencent.com/npm/@sentry/core/-/core-10.12.0.tgz", + "integrity": "sha512-Jrf0Yo7DvmI/ZQcvBnA0xKNAFkJlVC/fMlvcin+5IrFNRcqOToZ2vtF+XqTgjRZymXQNE8s1QTD7IomPHk0TAw==", "license": "MIT", "engines": { - "node": ">=14.18" + "node": ">=18" } }, "node_modules/@sentry/react": { - "version": "8.55.0", - "resolved": "https://mirrors.tencent.com/npm/@sentry/react/-/react-8.55.0.tgz", - "integrity": "sha512-/qNBvFLpvSa/Rmia0jpKfJdy16d4YZaAnH/TuKLAtm0BWlsPQzbXCU4h8C5Hsst0Do0zG613MEtEmWpWrVOqWA==", + "version": "10.12.0", + "resolved": "https://mirrors.tencent.com/npm/@sentry/react/-/react-10.12.0.tgz", + "integrity": "sha512-TpqgdoYbkf5JynmmW2oQhHQ/h5w+XPYk0cEb/UrsGlvJvnBSR+5tgh0AqxCSi3gvtp82rAXI5w1TyRPBbhLDBw==", "license": "MIT", "dependencies": { - "@sentry/browser": "8.55.0", - "@sentry/core": "8.55.0", + "@sentry/browser": "10.12.0", + "@sentry/core": "10.12.0", "hoist-non-react-statics": "^3.3.2" }, "engines": { - "node": ">=14.18" + "node": ">=18" }, "peerDependencies": { "react": "^16.14.0 || 17.x || 18.x || 19.x" } }, "node_modules/@sentry/react-native": { - "version": "6.20.0", - "resolved": "https://mirrors.tencent.com/npm/@sentry/react-native/-/react-native-6.20.0.tgz", - "integrity": "sha512-YngSba14Hsb5t/ZNMOyxb/HInmYRL5pQ74BkoMBQ/UBBM5kWHgSILxoO2XkKYtaaJXrkSJj+kBalELHblz9h5g==", + "version": "7.1.0", + "resolved": "https://mirrors.tencent.com/npm/@sentry/react-native/-/react-native-7.1.0.tgz", + "integrity": "sha512-Nhs/1j+w7cl9Q+FmaBl0+nByeAKpZttWFz1R0YkZJsg01b+4g63pepI3WMwUSq2QrvYIAu/5PiUoTa2dx9HK6g==", "license": "MIT", "dependencies": { - "@sentry/babel-plugin-component-annotate": "4.1.1", - "@sentry/browser": "8.55.0", - "@sentry/cli": "2.51.1", - "@sentry/core": "8.55.0", - "@sentry/react": "8.55.0", - "@sentry/types": "8.55.0", - "@sentry/utils": "8.55.0" + "@sentry/babel-plugin-component-annotate": "4.3.0", + "@sentry/browser": "10.12.0", + "@sentry/cli": "2.53.0", + "@sentry/core": "10.12.0", + "@sentry/react": "10.12.0", + "@sentry/types": "10.12.0" }, "bin": { "sentry-expo-upload-sourcemaps": "scripts/expo-upload-sourcemaps.js" @@ -4312,27 +4310,15 @@ } }, "node_modules/@sentry/types": { - "version": "8.55.0", - "resolved": "https://mirrors.tencent.com/npm/@sentry/types/-/types-8.55.0.tgz", - "integrity": "sha512-6LRT0+r6NWQ+RtllrUW2yQfodST0cJnkOmdpHA75vONgBUhpKwiJ4H7AmgfoTET8w29pU6AnntaGOe0LJbOmog==", + "version": "10.12.0", + "resolved": "https://mirrors.tencent.com/npm/@sentry/types/-/types-10.12.0.tgz", + "integrity": "sha512-sKGj3l3V8ZKISh2Tu88bHfnm5ztkRtSLdmpZ6TmCeJdSM9pV+RRd6CMJ0RnSEXmYHselPNUod521t2NQFd4W1w==", "license": "MIT", "dependencies": { - "@sentry/core": "8.55.0" + "@sentry/core": "10.12.0" }, "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry/utils": { - "version": "8.55.0", - "resolved": "https://mirrors.tencent.com/npm/@sentry/utils/-/utils-8.55.0.tgz", - "integrity": "sha512-cYcl39+xcOivBpN9d8ZKbALl+DxZKo/8H0nueJZ0PO4JA+MJGhSm6oHakXxLPaiMoNLTX7yor8ndnQIuFg+vmQ==", - "license": "MIT", - "dependencies": { - "@sentry/core": "8.55.0" - }, - "engines": { - "node": ">=14.18" + "node": ">=18" } }, "node_modules/@sinclair/typebox": { @@ -5734,9 +5720,9 @@ } }, "node_modules/babel-preset-expo": { - "version": "54.0.1", - "resolved": "https://mirrors.tencent.com/npm/babel-preset-expo/-/babel-preset-expo-54.0.1.tgz", - "integrity": "sha512-ziLpj+I/IxQdblHCpuzcyukTpzunq6h/QFsbWhk5DTd4suqB+Vl0Neacd+e38YeKXBabmxCOv8VJN3qk39Md4w==", + "version": "54.0.3", + "resolved": "https://mirrors.tencent.com/npm/babel-preset-expo/-/babel-preset-expo-54.0.3.tgz", + "integrity": "sha512-zC6g96Mbf1bofnCI8yI0VKAp8/ER/gpfTsWOpQvStbHU+E4jFZ294n3unW8Hf6nNP4NoeNq9Zc6Prp0vwhxbow==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.25.9", @@ -5840,7 +5826,6 @@ "version": "8.4.2", "resolved": "https://mirrors.tencent.com/npm/open/-/open-8.4.2.tgz", "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -6213,7 +6198,6 @@ "version": "2.1.0", "resolved": "https://mirrors.tencent.com/npm/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "license": "MIT", "dependencies": { "restore-cursor": "^2.0.0" }, @@ -6348,7 +6332,6 @@ "version": "2.0.18", "resolved": "https://mirrors.tencent.com/npm/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -6378,7 +6361,6 @@ "version": "2.6.9", "resolved": "https://mirrors.tencent.com/npm/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -6453,15 +6435,6 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/cos-js-sdk-v5": { - "version": "1.10.1", - "resolved": "https://mirrors.tencent.com/npm/cos-js-sdk-v5/-/cos-js-sdk-v5-1.10.1.tgz", - "integrity": "sha512-a4SRfCY5g6Z35C7OWe9te/S1zk77rVQzfpvZ33gmTdJQzKxbNbEG7Aw/v453XwVMsQB352FIf7KRMm5Ya/wlZQ==", - "hasInstallScript": true, - "dependencies": { - "fast-xml-parser": "4.5.0" - } - }, "node_modules/cosmiconfig": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", @@ -7666,29 +7639,29 @@ "license": "MIT" }, "node_modules/expo": { - "version": "54.0.8", - "resolved": "https://mirrors.tencent.com/npm/expo/-/expo-54.0.8.tgz", - "integrity": "sha512-H4nUVvAczd9ZPWrAR3oXxEr/EkLfPxXg5gBvFgZI4WnGNthehqEYB37urXgj9fvgSBxNaRUkySL4uwr9VB2J8Q==", + "version": "54.0.10", + "resolved": "https://mirrors.tencent.com/npm/expo/-/expo-54.0.10.tgz", + "integrity": "sha512-49+IginEoKC+g125ZlRvUYNl9jKjjHcDiDnQvejNWlMQ0LtcFIWiFad/PLjmi7YqF/0rj9u3FNxqM6jNP16O0w==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "54.0.6", + "@expo/cli": "54.0.8", "@expo/config": "~12.0.9", "@expo/config-plugins": "~54.0.1", "@expo/devtools": "0.1.7", "@expo/fingerprint": "0.15.1", - "@expo/metro": "~0.1.1", - "@expo/metro-config": "54.0.3", + "@expo/metro": "~54.0.0", + "@expo/metro-config": "54.0.5", "@expo/vector-icons": "^15.0.2", "@ungap/structured-clone": "^1.3.0", - "babel-preset-expo": "~54.0.1", - "expo-asset": "~12.0.8", + "babel-preset-expo": "~54.0.3", + "expo-asset": "~12.0.9", "expo-constants": "~18.0.9", - "expo-file-system": "~19.0.14", + "expo-file-system": "~19.0.15", "expo-font": "~14.0.8", "expo-keep-awake": "~15.0.7", - "expo-modules-autolinking": "3.0.11", - "expo-modules-core": "3.0.16", + "expo-modules-autolinking": "3.0.13", + "expo-modules-core": "3.0.18", "pretty-format": "^29.7.0", "react-refresh": "^0.14.2", "whatwg-url-without-unicode": "8.0.0-3" @@ -7737,13 +7710,13 @@ } }, "node_modules/expo-asset": { - "version": "12.0.8", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.8.tgz", - "integrity": "sha512-jj2U8zw9+7orST2rlQGULYiqPoECOuUyffs2NguGrq84bYbkM041T7TOMXH2raPVJnM9lEAP54ezI6XL+GVYqw==", + "version": "12.0.9", + "resolved": "https://mirrors.tencent.com/npm/expo-asset/-/expo-asset-12.0.9.tgz", + "integrity": "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==", "license": "MIT", "dependencies": { "@expo/image-utils": "^0.8.7", - "expo-constants": "~18.0.8" + "expo-constants": "~18.0.9" }, "peerDependencies": { "expo": "*", @@ -7752,9 +7725,9 @@ } }, "node_modules/expo-background-task": { - "version": "1.0.7", - "resolved": "https://mirrors.tencent.com/npm/expo-background-task/-/expo-background-task-1.0.7.tgz", - "integrity": "sha512-SIAxjBt5ZM2HzABVLsMEy24DrqeJqE1e8iqvErNqqujH8nwk0CUi7C+2Ck92HfTMEkThmAUKHl32emVzStAesA==", + "version": "1.0.8", + "resolved": "https://mirrors.tencent.com/npm/expo-background-task/-/expo-background-task-1.0.8.tgz", + "integrity": "sha512-G6WnljBhO0K9j0ntmytF5rZLtYUpwh8n2+hcgmxM1ISPAVVZSPHZhkF9YjBOKpdPWZxmukBgEwejfcGckb8TQQ==", "license": "MIT", "dependencies": { "expo-task-manager": "~14.0.7" @@ -7809,9 +7782,9 @@ } }, "node_modules/expo-file-system": { - "version": "19.0.14", - "resolved": "https://mirrors.tencent.com/npm/expo-file-system/-/expo-file-system-19.0.14.tgz", - "integrity": "sha512-0CA7O5IYhab11TlxQlJAx0Xm9pdkk/zEHNiW+Hh/T4atWi9U/J38CIp7iNYSrBvy9dC3rJbze5D1ANcKKr4mSQ==", + "version": "19.0.15", + "resolved": "https://mirrors.tencent.com/npm/expo-file-system/-/expo-file-system-19.0.15.tgz", + "integrity": "sha512-sRLW+3PVJDiuoCE2LuteHhC7OxPjh1cfqLylf1YG1TDEbbQXnzwjfsKeRm6dslEPZLkMWfSLYIrVbnuq5mF7kQ==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -7926,9 +7899,9 @@ } }, "node_modules/expo-modules-autolinking": { - "version": "3.0.11", - "resolved": "https://mirrors.tencent.com/npm/expo-modules-autolinking/-/expo-modules-autolinking-3.0.11.tgz", - "integrity": "sha512-Sz1ptcSZ4mvWJ7Rf1aB6Pe1fuEeIkACPILg2tmXDo3wwLTxPqugitMOePjbBZyvacBDirtDZlMb2A6LQDPVFOg==", + "version": "3.0.13", + "resolved": "https://mirrors.tencent.com/npm/expo-modules-autolinking/-/expo-modules-autolinking-3.0.13.tgz", + "integrity": "sha512-58WnM15ESTyT2v93Rba7jplXtGvh5cFbxqUCi2uTSpBf3nndDRItLzBQaoWBzAvNUhpC2j1bye7Dn/E+GJFXmw==", "license": "MIT", "dependencies": { "@expo/spawn-async": "^1.7.2", @@ -7943,9 +7916,9 @@ } }, "node_modules/expo-modules-core": { - "version": "3.0.16", - "resolved": "https://mirrors.tencent.com/npm/expo-modules-core/-/expo-modules-core-3.0.16.tgz", - "integrity": "sha512-rCxzJiTdeSdqLVmDYYnogxqHS3NB65YTd76tAtSACujN2TQco08/toxCCov+9uULq1NGPxDJnfTkrtGaGWfatQ==", + "version": "3.0.18", + "resolved": "https://mirrors.tencent.com/npm/expo-modules-core/-/expo-modules-core-3.0.18.tgz", + "integrity": "sha512-9JPnjlXEFaq/uACZ7I4wb/RkgPYCEsfG75UKMvfl7P7rkymtpRGYj8/gTL2KId8Xt1fpmIPOF57U8tKamjtjXg==", "license": "MIT", "dependencies": { "invariant": "^2.2.4" @@ -8168,9 +8141,9 @@ } }, "node_modules/expo/node_modules/@expo/cli": { - "version": "54.0.6", - "resolved": "https://mirrors.tencent.com/npm/@expo/cli/-/cli-54.0.6.tgz", - "integrity": "sha512-BgxJshNqSODb4Rq4q4lHLBVWVL4683Q+PSJ2fd+m3D5Jqd8nu9zGvcq6I/H8AXV/Ux31eIuUgAojPCjW8LRyZA==", + "version": "54.0.8", + "resolved": "https://mirrors.tencent.com/npm/@expo/cli/-/cli-54.0.8.tgz", + "integrity": "sha512-bRJXvtjgxpyElmJuKLotWyIW5j9a2K3rGUjd2A8LRcFimrZp0wwuKPQjlUK0sFNbU7zHWfxubNq/B+UkUNkCxw==", "license": "MIT", "dependencies": { "@0no-co/graphql.web": "^1.0.8", @@ -8182,14 +8155,14 @@ "@expo/image-utils": "^0.8.7", "@expo/json-file": "^10.0.7", "@expo/mcp-tunnel": "~0.0.7", - "@expo/metro": "~0.1.1", - "@expo/metro-config": "~54.0.3", + "@expo/metro": "~54.0.0", + "@expo/metro-config": "~54.0.5", "@expo/osascript": "^2.3.7", "@expo/package-manager": "^1.9.8", "@expo/plist": "^0.4.7", "@expo/prebuild-config": "^54.0.3", "@expo/schema-utils": "^0.1.7", - "@expo/server": "^0.7.4", + "@expo/server": "^0.7.5", "@expo/spawn-async": "^1.7.2", "@expo/ws-tunnel": "^1.0.1", "@expo/xcpretty": "^4.3.0", @@ -8283,7 +8256,6 @@ "version": "7.7.2", "resolved": "https://mirrors.tencent.com/npm/semver/-/semver-7.7.2.tgz", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -8382,28 +8354,6 @@ } ] }, - "node_modules/fast-xml-parser": { - "version": "4.5.0", - "resolved": "https://mirrors.tencent.com/npm/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz", - "integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", @@ -9079,8 +9029,7 @@ "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://mirrors.tencent.com/npm/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, "node_modules/htmlparser2": { "version": "7.2.0", @@ -10620,7 +10569,6 @@ "version": "1.9.3", "resolved": "https://mirrors.tencent.com/npm/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -10628,8 +10576,7 @@ "node_modules/log-symbols/node_modules/color-name": { "version": "1.1.3", "resolved": "https://mirrors.tencent.com/npm/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/log-symbols/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -11117,7 +11064,6 @@ "version": "1.54.0", "resolved": "https://mirrors.tencent.com/npm/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -11183,9 +11129,9 @@ } }, "node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://mirrors.tencent.com/npm/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "version": "3.1.0", + "resolved": "https://mirrors.tencent.com/npm/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "license": "MIT", "dependencies": { "minipass": "^7.1.2" @@ -11348,7 +11294,6 @@ "version": "7.7.2", "resolved": "https://mirrors.tencent.com/npm/semver/-/semver-7.7.2.tgz", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -11556,7 +11501,6 @@ "version": "2.0.1", "resolved": "https://mirrors.tencent.com/npm/onetime/-/onetime-2.0.1.tgz", "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "license": "MIT", "dependencies": { "mimic-fn": "^1.0.0" }, @@ -11654,7 +11598,6 @@ "version": "1.9.3", "resolved": "https://mirrors.tencent.com/npm/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -11662,8 +11605,7 @@ "node_modules/ora/node_modules/color-name": { "version": "1.1.3", "resolved": "https://mirrors.tencent.com/npm/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/ora/node_modules/escape-string-regexp": { "version": "1.0.5", @@ -11872,6 +11814,15 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, + "node_modules/paths-js": { + "version": "0.4.11", + "resolved": "http://mirrors.tencent.com/npm/paths-js/-/paths-js-0.4.11.tgz", + "integrity": "sha512-3mqcLomDBXOo7Fo+UlaenG6f71bk1ZezPQy2JCmYHy2W2k5VKpP+Jbin9H0bjXynelTbglCqdFhSEkeIkKTYUA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.11.0" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -11922,6 +11873,12 @@ "node": ">=4.0.0" } }, + "node_modules/point-in-polygon": { + "version": "1.1.0", + "resolved": "https://mirrors.tencent.com/npm/point-in-polygon/-/point-in-polygon-1.1.0.tgz", + "integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==", + "license": "MIT" + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -11949,7 +11906,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -12181,7 +12137,6 @@ "version": "2.0.1", "resolved": "https://mirrors.tencent.com/npm/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12298,6 +12253,22 @@ } } }, + "node_modules/react-native-chart-kit": { + "version": "6.12.0", + "resolved": "https://mirrors.tencent.com/npm/react-native-chart-kit/-/react-native-chart-kit-6.12.0.tgz", + "integrity": "sha512-nZLGyCFzZ7zmX0KjYeeSV1HKuPhl1wOMlTAqa0JhlyW62qV/1ZPXHgT8o9s8mkFaGxdqbspOeuaa6I9jUQDgnA==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.13", + "paths-js": "^0.4.10", + "point-in-polygon": "^1.0.1" + }, + "peerDependencies": { + "react": "> 16.7.0", + "react-native": ">= 0.50.0", + "react-native-svg": "> 6.4.1" + } + }, "node_modules/react-native-device-info": { "version": "14.0.4", "resolved": "https://mirrors.tencent.com/npm/react-native-device-info/-/react-native-device-info-14.0.4.tgz", @@ -12489,9 +12460,9 @@ } }, "node_modules/react-native-svg": { - "version": "15.12.1", - "resolved": "https://mirrors.tencent.com/npm/react-native-svg/-/react-native-svg-15.12.1.tgz", - "integrity": "sha512-vCuZJDf8a5aNC2dlMovEv4Z0jjEUET53lm/iILFnFewa15b4atjVxU6Wirm6O9y6dEsdjDZVD7Q3QM4T1wlI8g==", + "version": "15.13.0", + "resolved": "https://mirrors.tencent.com/npm/react-native-svg/-/react-native-svg-15.13.0.tgz", + "integrity": "sha512-/YPK+PAAXg4T0x2d2vYPvqqAhOYid2bRKxUVT7STIyd1p2JxWmsGQkfZxXCkEFN7TwLfIyVlT5RimT91Pj/qXw==", "license": "MIT", "dependencies": { "css-select": "^5.1.0", @@ -12546,9 +12517,9 @@ "license": "MIT" }, "node_modules/react-native-webview": { - "version": "13.15.0", - "resolved": "https://mirrors.tencent.com/npm/react-native-webview/-/react-native-webview-13.15.0.tgz", - "integrity": "sha512-Vzjgy8mmxa/JO6l5KZrsTC7YemSdq+qB01diA0FqjUTaWGAGwuykpJ73MDj3+mzBSlaDxAEugHzTtkUQkQEQeQ==", + "version": "13.16.0", + "resolved": "https://mirrors.tencent.com/npm/react-native-webview/-/react-native-webview-13.16.0.tgz", + "integrity": "sha512-Nh13xKZWW35C0dbOskD7OX01nQQavOzHbCw9XoZmar4eXCo7AvrYJ0jlUfRVVIJzqINxHlpECYLdmAdFsl9xDA==", "license": "MIT", "dependencies": { "escape-string-regexp": "^4.0.0", @@ -12947,7 +12918,6 @@ "version": "1.7.1", "resolved": "https://mirrors.tencent.com/npm/resolve/-/resolve-1.7.1.tgz", "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", - "license": "MIT", "dependencies": { "path-parse": "^1.0.5" } @@ -13028,7 +12998,6 @@ "version": "2.0.0", "resolved": "https://mirrors.tencent.com/npm/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "license": "MIT", "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -13287,7 +13256,6 @@ "version": "2.6.9", "resolved": "https://mirrors.tencent.com/npm/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -14058,17 +14026,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strnum": { - "version": "1.1.2", - "resolved": "https://mirrors.tencent.com/npm/strnum/-/strnum-1.1.2.tgz", - "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ] - }, "node_modules/structured-headers": { "version": "0.4.1", "resolved": "https://mirrors.tencent.com/npm/structured-headers/-/structured-headers-0.4.1.tgz", @@ -14150,42 +14107,25 @@ } }, "node_modules/tar": { - "version": "7.4.3", - "resolved": "https://mirrors.tencent.com/npm/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "version": "7.5.1", + "resolved": "https://mirrors.tencent.com/npm/tar/-/tar-7.5.1.tgz", + "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", "license": "ISC", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", + "minizlib": "^3.1.0", "yallist": "^5.0.0" }, "engines": { "node": ">=18" } }, - "node_modules/tar/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://mirrors.tencent.com/npm/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/tar/node_modules/yallist": { "version": "5.0.0", "resolved": "https://mirrors.tencent.com/npm/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } @@ -14915,7 +14855,6 @@ "version": "1.0.1", "resolved": "https://mirrors.tencent.com/npm/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "license": "MIT", "dependencies": { "defaults": "^1.0.3" } diff --git a/package.json b/package.json index 56b7d6c..f2f9075 100644 --- a/package.json +++ b/package.json @@ -13,24 +13,23 @@ }, "dependencies": { "@expo/metro-runtime": "~6.1.2", - "@expo/ui": "~0.2.0-beta.3", + "@expo/ui": "~0.2.0-beta.4", "@expo/vector-icons": "^15.0.2", "@react-native-async-storage/async-storage": "^2.2.0", - "@react-native-community/datetimepicker": "8.4.4", + "@react-native-community/datetimepicker": "8.4.5", "@react-native-masked-view/masked-view": "^0.3.2", - "@react-native-picker/picker": "2.11.1", + "@react-native-picker/picker": "2.11.2", "@react-native-voice/voice": "^3.2.4", "@react-navigation/bottom-tabs": "^7.4.0", "@react-navigation/elements": "^2.6.4", "@react-navigation/native": "^7.1.8", "@reduxjs/toolkit": "^2.9.0", - "@sentry/react-native": "~6.20.0", + "@sentry/react-native": "~7.1.0", "@types/lodash": "^4.17.20", - "cos-js-sdk-v5": "^1.6.0", "dayjs": "^1.11.18", - "expo": "^54.0.8", + "expo": "^54.0.10", "expo-apple-authentication": "~8.0.7", - "expo-background-task": "~1.0.7", + "expo-background-task": "~1.0.8", "expo-blur": "~15.0.7", "expo-camera": "~17.0.8", "expo-constants": "~18.0.9", @@ -56,6 +55,7 @@ "react": "19.1.0", "react-dom": "19.1.0", "react-native": "0.81.4", + "react-native-chart-kit": "^6.12.0", "react-native-device-info": "^14.0.4", "react-native-gesture-handler": "~2.28.0", "react-native-image-viewing": "^0.2.2", @@ -67,10 +67,10 @@ "react-native-render-html": "^6.3.4", "react-native-safe-area-context": "~5.6.1", "react-native-screens": "~4.16.0", - "react-native-svg": "15.12.1", + "react-native-svg": "^15.13.0", "react-native-toast-message": "^2.3.3", "react-native-web": "^0.21.1", - "react-native-webview": "13.15.0", + "react-native-webview": "13.16.0", "react-native-wheel-picker-expo": "^0.5.4", "react-native-worklets": "0.5.1", "react-redux": "^9.2.0" @@ -83,4 +83,4 @@ "typescript": "~5.9.2" }, "private": true -} \ No newline at end of file +} diff --git a/services/circumferenceAnalysis.ts b/services/circumferenceAnalysis.ts new file mode 100644 index 0000000..e884da0 --- /dev/null +++ b/services/circumferenceAnalysis.ts @@ -0,0 +1,42 @@ +import { api } from './api'; + +export type CircumferencePeriod = 'week' | 'month' | 'year'; + +export type CircumferenceAnalysisData = { + label: string; + chestCircumference: number | null; + waistCircumference: number | null; + upperHipCircumference: number | null; + armCircumference: number | null; + thighCircumference: number | null; + calfCircumference: number | null; +}; + +export type CircumferenceAnalysisResponse = { + code: number; + message: string; + data: CircumferenceAnalysisData[]; +}; + +/** + * 获取围度分析报表数据 + * @param period 时间范围:week(按周)、month(按月)、year(按年) + * @returns 围度分析数据 + */ +export async function getCircumferenceAnalysis(period: CircumferencePeriod): Promise { + try { + const response = await api.get( + `/users/body-measurements/analysis?period=${period}` + ); + + // 根据API文档,支持返回 { data: ... } 或直接返回数组 + if (Array.isArray(response)) { + return response; + } + + return response.data || []; + } catch (error) { + console.error('获取围度分析数据失败:', error); + throw error; + } +} \ No newline at end of file diff --git a/store/circumferenceSlice.ts b/store/circumferenceSlice.ts new file mode 100644 index 0000000..8a49585 --- /dev/null +++ b/store/circumferenceSlice.ts @@ -0,0 +1,87 @@ +import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'; +import { CircumferenceAnalysisData, CircumferencePeriod, getCircumferenceAnalysis } from '@/services/circumferenceAnalysis'; + +export type CircumferenceState = { + data: Record; + loading: Record; + error: string | null; + lastFetch: Record; +}; + +const initialState: CircumferenceState = { + data: { + week: [], + month: [], + year: [], + }, + loading: { + week: false, + month: false, + year: false, + }, + error: null, + lastFetch: { + week: 0, + month: 0, + year: 0, + }, +}; + +// 获取围度分析数据 +export const fetchCircumferenceAnalysis = createAsyncThunk( + 'circumference/fetchAnalysis', + async (period: CircumferencePeriod, { rejectWithValue }) => { + try { + const data = await getCircumferenceAnalysis(period); + return { period, data }; + } catch (error: any) { + return rejectWithValue(error?.message || '获取围度分析数据失败'); + } + } +); + +const circumferenceSlice = createSlice({ + name: 'circumference', + initialState, + reducers: { + clearError: (state) => { + state.error = null; + }, + }, + extraReducers: (builder) => { + builder + .addCase(fetchCircumferenceAnalysis.pending, (state, action) => { + const period = action.meta.arg; + state.loading[period] = true; + state.error = null; + }) + .addCase(fetchCircumferenceAnalysis.fulfilled, (state, action) => { + const { period, data } = action.payload; + state.loading[period] = false; + state.data[period] = data; + state.lastFetch[period] = Date.now(); + }) + .addCase(fetchCircumferenceAnalysis.rejected, (state, action) => { + const period = action.meta.arg; + state.loading[period] = false; + state.error = action.payload as string; + }); + }, +}); + +export const { clearError } = circumferenceSlice.actions; + +// Selectors +export const selectCircumferenceData = (state: { circumference: CircumferenceState }, period: CircumferencePeriod) => + state.circumference.data[period]; + +export const selectCircumferenceLoading = (state: { circumference: CircumferenceState }, period: CircumferencePeriod) => + state.circumference.loading[period]; + +export const selectCircumferenceError = (state: { circumference: CircumferenceState }) => + state.circumference.error; + +export const selectLastFetch = (state: { circumference: CircumferenceState }, period: CircumferencePeriod) => + state.circumference.lastFetch[period]; + +export default circumferenceSlice.reducer; \ No newline at end of file diff --git a/store/index.ts b/store/index.ts index 49f268c..94f4ed2 100644 --- a/store/index.ts +++ b/store/index.ts @@ -1,6 +1,7 @@ import { configureStore, createListenerMiddleware } from '@reduxjs/toolkit'; import challengeReducer from './challengeSlice'; import checkinReducer, { addExercise, autoSyncCheckin, removeExercise, replaceExercises, setNote, toggleExerciseCompleted } from './checkinSlice'; +import circumferenceReducer from './circumferenceSlice'; import exerciseLibraryReducer from './exerciseLibrarySlice'; import foodLibraryReducer from './foodLibrarySlice'; import foodRecognitionReducer from './foodRecognitionSlice'; @@ -48,6 +49,7 @@ export const store = configureStore({ user: userReducer, challenge: challengeReducer, checkin: checkinReducer, + circumference: circumferenceReducer, goals: goalsReducer, health: healthReducer, mood: moodReducer,