From 321947db98cb60ddf663995d72db4409028a878f Mon Sep 17 00:00:00 2001 From: richarjiang Date: Wed, 13 Aug 2025 15:21:54 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=92=8C=E9=9B=86=E6=88=90=E8=85=BE=E8=AE=AF?= =?UTF-8?q?=E4=BA=91=20COS=20=E4=B8=8A=E4=BC=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将应用版本更新至 1.0.2,修改相关配置文件 - 集成腾讯云 COS 上传功能,新增相关服务和钩子 - 更新 AI 体态评估页面,支持照片上传和评估结果展示 - 添加雷达图组件以展示评估结果 - 更新样式以适应新功能的展示和交互 - 修改登录页面背景效果,提升用户体验 --- android/app/build.gradle | 4 +- android/gradle.properties | 2 +- app.json | 3 +- app/ai-posture-assessment.tsx | 75 ++-- app/ai-posture-processing.tsx | 279 +++++++++++++ app/ai-posture-result.tsx | 318 ++++++++++++++ app/auth/login.tsx | 192 ++++++++- app/training-plan.tsx | 111 ++++- components/RadarChart.tsx | 104 +++++ constants/Cos.ts | 26 ++ docs/cos.md | 174 ++++++++ hooks/useCosUpload.ts | 59 +++ ios/Podfile.lock | 411 +++++++------------ ios/Podfile.properties.json | 4 +- ios/digitalpilates.xcodeproj/project.pbxproj | 23 +- ios/digitalpilates/Info.plist | 4 +- package-lock.json | 58 ++- package.json | 6 +- services/cos.ts | 107 +++++ types/react-native-svg.d.ts | 46 +++ 20 files changed, 1664 insertions(+), 342 deletions(-) create mode 100644 app/ai-posture-processing.tsx create mode 100644 app/ai-posture-result.tsx create mode 100644 components/RadarChart.tsx create mode 100644 constants/Cos.ts create mode 100644 docs/cos.md create mode 100644 hooks/useCosUpload.ts create mode 100644 services/cos.ts diff --git a/android/app/build.gradle b/android/app/build.gradle index e20323c..e66bff4 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -92,8 +92,8 @@ android { applicationId 'com.anonymous.digitalpilates' minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "1.0.0" + versionCode 2 + versionName "1.0.2" } signingConfigs { debug { diff --git a/android/gradle.properties b/android/gradle.properties index 2170001..38e3ce3 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -39,7 +39,7 @@ 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 +hermesEnabled=false # Enable GIF support in React Native images (~200 B increase) expo.gif.enabled=true diff --git a/app.json b/app.json index f7aa7ce..7658929 100644 --- a/app.json +++ b/app.json @@ -2,12 +2,13 @@ "expo": { "name": "digital-pilates", "slug": "digital-pilates", - "version": "1.0.0", + "version": "1.0.2", "orientation": "portrait", "icon": "./assets/images/icon.png", "scheme": "digitalpilates", "userInterfaceStyle": "automatic", "newArchEnabled": true, + "jsEngine": "jsc", "ios": { "supportsTablet": true, "bundleIdentifier": "com.anonymous.digitalpilates", diff --git a/app/ai-posture-assessment.tsx b/app/ai-posture-assessment.tsx index 2918c90..bbce1e8 100644 --- a/app/ai-posture-assessment.tsx +++ b/app/ai-posture-assessment.tsx @@ -14,6 +14,7 @@ import { TouchableOpacity, View, } from 'react-native'; +import ImageViewing from 'react-native-image-viewing'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { HeaderBar } from '@/components/ui/HeaderBar'; @@ -31,17 +32,17 @@ type Sample = { uri: string; correct: boolean }; const SAMPLES: Record = { front: [ - { uri: 'https://images.unsplash.com/photo-1594737625785-c6683fc87c73?w=400&q=80&auto=format', correct: true }, + { uri: 'https://plates-1251306435.cos.ap-guangzhou.myqcloud.com/images/imagedemo.jpeg', correct: true }, { uri: 'https://images.unsplash.com/photo-1544716278-ca5e3f4abd8c?w=400&q=80&auto=format', correct: false }, { uri: 'https://images.unsplash.com/photo-1571019614242-c5c5dee9f50b?w=400&q=80&auto=format', correct: false }, ], side: [ - { uri: 'https://images.unsplash.com/photo-1554463529-e27854014799?w=400&q=80&auto=format', correct: true }, + { uri: 'https://plates-1251306435.cos.ap-guangzhou.myqcloud.com/images/imagedemo.jpeg', correct: true }, { uri: 'https://images.unsplash.com/photo-1596357395104-5bcae0b1a5eb?w=400&q=80&auto=format', correct: false }, { uri: 'https://images.unsplash.com/photo-1526506118085-60ce8714f8c5?w=400&q=80&auto=format', correct: false }, ], back: [ - { uri: 'https://images.unsplash.com/photo-1517836357463-d25dfeac3438?w=400&q=80&auto=format', correct: true }, + { uri: 'https://plates-1251306435.cos.ap-guangzhou.myqcloud.com/images/imagedemo.jpeg', correct: true }, { uri: 'https://images.unsplash.com/photo-1571721797421-f4c9f2b13107?w=400&q=80&auto=format', correct: false }, { uri: 'https://images.unsplash.com/photo-1518611012118-696072aa579a?w=400&q=80&auto=format', correct: false }, ], @@ -50,7 +51,7 @@ const SAMPLES: Record = { export default function AIPostureAssessmentScreen() { const router = useRouter(); const insets = useSafeAreaInsets(); - const theme = Colors.dark; + const theme = Colors.light; const [uploadState, setUploadState] = useState({}); const canStart = useMemo( @@ -167,13 +168,13 @@ export default function AIPostureAssessmentScreen() { function handleStart() { if (!canStart) return; - // TODO: 调用后端或进入分析页面 - Alert.alert('开始测评', '已收集三视角照片,准备开始AI体态分析'); + // 进入评估中间页面 + router.push('/ai-posture-processing'); } return ( - - router.back()} tone="dark" transparent /> + + router.back()} tone="light" transparent /> - 上传标准姿势照片 - - 请依次上传正面、侧面与背面全身照。保持光线均匀、背景简洁,身体立正自然放松。 - + 上传标准姿势照片 + 请依次上传正面、侧面与背面全身照。保持光线均匀、背景简洁,身体立正自然放松。 {/* Upload sections */} @@ -272,6 +271,10 @@ function UploadTile({ onPickLibrary: () => void; samples: Sample[]; }) { + const [viewerVisible, setViewerVisible] = React.useState(false); + const [viewerIndex, setViewerIndex] = React.useState(0); + const imagesForViewer = React.useMemo(() => samples.map((s) => ({ uri: s.uri })), [samples]); + return ( @@ -294,7 +297,7 @@ function UploadTile({ ) : ( - + 拍摄或选择照片 点击拍摄,长按从相册选择 @@ -302,19 +305,27 @@ function UploadTile({ )} - + 示例 {samples.map((s, idx) => ( - - + { setViewerIndex(idx); setViewerVisible(true); }}> + + + {s.correct ? '正确示范' : '错误示范'} ))} + setViewerVisible(false)} + /> ); } @@ -328,15 +339,15 @@ const styles = StyleSheet.create({ marginHorizontal: 16, padding: 14, borderRadius: 16, - backgroundColor: 'rgba(255,255,255,0.04)' + backgroundColor: 'rgba(25,33,38,0.06)' }, permTitle: { - color: '#ECEDEE', + color: '#192126', fontSize: 16, fontWeight: '700', }, permDesc: { - color: 'rgba(255,255,255,0.75)', + color: '#5E6468', marginTop: 6, fontSize: 13, }, @@ -367,10 +378,10 @@ const styles = StyleSheet.create({ height: 40, borderRadius: 12, borderWidth: 1, - borderColor: 'rgba(255,255,255,0.18)', + borderColor: 'rgba(25,33,38,0.14)', }, permSecondaryText: { - color: 'rgba(255,255,255,0.85)', + color: '#384046', fontSize: 14, fontWeight: '700', }, @@ -420,12 +431,12 @@ const styles = StyleSheet.create({ justifyContent: 'space-between', }, sectionTitle: { - color: '#ECEDEE', + color: '#192126', fontSize: 18, fontWeight: '700', }, retakeHint: { - color: 'rgba(255,255,255,0.55)', + color: '#888F92', fontSize: 13, }, uploader: { @@ -433,8 +444,8 @@ const styles = StyleSheet.create({ borderRadius: 18, borderWidth: 1, borderStyle: 'dashed', - borderColor: 'rgba(255,255,255,0.18)', - backgroundColor: '#1E262C', + borderColor: 'rgba(25,33,38,0.14)', + backgroundColor: '#FFFFFF', overflow: 'hidden', }, preview: { @@ -453,25 +464,27 @@ const styles = StyleSheet.create({ borderRadius: 18, alignItems: 'center', justifyContent: 'center', - backgroundColor: '#BBF246', + backgroundColor: '#FFFFFF', + borderWidth: 2, + borderColor: '#BBF246', }, placeholderTitle: { - color: '#ECEDEE', + color: '#192126', fontSize: 16, fontWeight: '700', }, placeholderDesc: { - color: 'rgba(255,255,255,0.65)', + color: '#888F92', fontSize: 12, }, sampleBox: { marginTop: 8, borderRadius: 16, padding: 12, - backgroundColor: 'rgba(255,255,255,0.04)', + backgroundColor: 'rgba(255,255,255,0.72)', }, sampleTitle: { - color: 'rgba(255,255,255,0.8)', + color: '#192126', fontSize: 14, marginBottom: 8, fontWeight: '600', @@ -487,7 +500,7 @@ const styles = StyleSheet.create({ width: '100%', height: 90, borderRadius: 12, - backgroundColor: '#111', + backgroundColor: '#F2F4F5', }, sampleTag: { alignSelf: 'flex-start', diff --git a/app/ai-posture-processing.tsx b/app/ai-posture-processing.tsx new file mode 100644 index 0000000..fd25c39 --- /dev/null +++ b/app/ai-posture-processing.tsx @@ -0,0 +1,279 @@ +import { Ionicons } from '@expo/vector-icons'; +import { BlurView } from 'expo-blur'; +import { LinearGradient } from 'expo-linear-gradient'; +import { useRouter } from 'expo-router'; +import React, { useEffect } from 'react'; +import { Dimensions, StyleSheet, Text, TouchableOpacity, View } from 'react-native'; +import Animated, { Easing, useAnimatedStyle, useSharedValue, withDelay, withRepeat, withSequence, withTiming } from 'react-native-reanimated'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; + +import { HeaderBar } from '@/components/ui/HeaderBar'; +import { Colors } from '@/constants/Colors'; + +const { width: SCREEN_WIDTH, height: SCREEN_HEIGHT } = Dimensions.get('window'); + +export default function AIPostureProcessingScreen() { + const insets = useSafeAreaInsets(); + const router = useRouter(); + const theme = Colors.dark; + + // Core looping animations + const spin = useSharedValue(0); + const pulse = useSharedValue(0); + const scanY = useSharedValue(0); + const particle = useSharedValue(0); + + useEffect(() => { + spin.value = withRepeat(withTiming(1, { duration: 6000, easing: Easing.linear }), -1); + pulse.value = withRepeat(withSequence( + withTiming(1, { duration: 1600, easing: Easing.inOut(Easing.quad) }), + withTiming(0, { duration: 1600, easing: Easing.inOut(Easing.quad) }) + ), -1, true); + scanY.value = withRepeat(withTiming(1, { duration: 3800, easing: Easing.inOut(Easing.cubic) }), -1, false); + particle.value = withDelay(400, withRepeat(withTiming(1, { duration: 5200, easing: Easing.inOut(Easing.quad) }), -1, true)); + }, []); + + const ringStyleOuter = useAnimatedStyle(() => ({ + transform: [{ rotate: `${spin.value * 360}deg` }], + opacity: 0.8, + })); + const ringStyleInner = useAnimatedStyle(() => ({ + transform: [{ rotate: `${-spin.value * 360}deg` }, { scale: 0.98 + pulse.value * 0.04 }], + })); + const scannerStyle = useAnimatedStyle(() => ({ + transform: [{ translateY: (scanY.value * (SCREEN_HEIGHT * 0.45)) - (SCREEN_HEIGHT * 0.225) }], + opacity: 0.6 + Math.sin(scanY.value * Math.PI) * 0.2, + })); + const particleStyleA = useAnimatedStyle(() => ({ + transform: [ + { translateX: Math.sin(particle.value * Math.PI * 2) * 40 }, + { translateY: Math.cos(particle.value * Math.PI * 2) * 24 }, + { rotate: `${particle.value * 360}deg` }, + ], + opacity: 0.5 + 0.5 * Math.abs(Math.sin(particle.value * Math.PI)), + })); + + return ( + + router.back()} tone="light" transparent /> + + {/* Layered background */} + + + + + + + {/* Hero visualization */} + + + + + + + {Array.from({ length: 9 }).map((_, i) => ( + + {Array.from({ length: 9 }).map((__, j) => ( + + ))} + + ))} + + + + + + + + {/* Copy & actions */} + + 正在进行体态特征提取与矢量评估 + 这通常需要 10-30 秒。你可以停留在此页面等待结果,或点击返回稍后在个人中心查看。 + + + router.replace('/ai-posture-result')} + > + + 保持页面等待 + + router.replace('/(tabs)/personal')}> + 返回个人中心 + + + + + ); +} + +const RING_SIZE = Math.min(SCREEN_WIDTH, SCREEN_HEIGHT) * 0.62; +const INNER_RING_SIZE = RING_SIZE * 0.72; + +const styles = StyleSheet.create({ + screen: { + flex: 1, + }, + hero: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + }, + blurBlobA: { + position: 'absolute', + top: -80, + right: -60, + width: 240, + height: 240, + borderRadius: 120, + backgroundColor: 'rgba(187,242,70,0.20)', + }, + blurBlobB: { + position: 'absolute', + bottom: 120, + left: -40, + width: 220, + height: 220, + borderRadius: 110, + backgroundColor: 'rgba(89, 198, 255, 0.16)', + }, + heroBackdrop: { + position: 'absolute', + width: RING_SIZE * 1.08, + height: RING_SIZE * 1.08, + borderRadius: (RING_SIZE * 1.08) / 2, + backgroundColor: 'rgba(25,33,38,0.25)', + }, + ringOuter: { + position: 'absolute', + width: RING_SIZE, + height: RING_SIZE, + borderRadius: RING_SIZE / 2, + borderWidth: 1, + borderColor: 'rgba(25,33,38,0.16)', + }, + ringInner: { + position: 'absolute', + width: INNER_RING_SIZE, + height: INNER_RING_SIZE, + borderRadius: INNER_RING_SIZE / 2, + borderWidth: 2, + borderColor: 'rgba(187,242,70,0.65)', + shadowColor: '#BBF246', + shadowOffset: { width: 0, height: 0 }, + shadowOpacity: 0.35, + shadowRadius: 24, + }, + grid: { + width: RING_SIZE * 0.9, + height: RING_SIZE * 0.9, + borderRadius: RING_SIZE * 0.45, + overflow: 'hidden', + padding: 10, + backgroundColor: 'rgba(25,33,38,0.08)', + }, + gridRow: { + flexDirection: 'row', + }, + gridCell: { + flex: 1, + aspectRatio: 1, + margin: 2, + borderRadius: 3, + backgroundColor: 'rgba(255,255,255,0.16)', + }, + scanner: { + position: 'absolute', + left: 0, + right: 0, + top: '50%', + height: 60, + marginTop: -30, + backgroundColor: 'rgba(187,242,70,0.10)', + borderWidth: 1, + borderColor: 'rgba(187,242,70,0.25)', + }, + particleA: { + position: 'absolute', + right: SCREEN_WIDTH * 0.18, + top: 40, + width: 14, + height: 14, + borderRadius: 7, + backgroundColor: '#BBF246', + shadowColor: '#BBF246', + shadowOffset: { width: 0, height: 0 }, + shadowOpacity: 0.4, + shadowRadius: 16, + }, + particleB: { + position: 'absolute', + right: SCREEN_WIDTH * 0.08, + top: 120, + width: 8, + height: 8, + borderRadius: 4, + backgroundColor: 'rgba(89, 198, 255, 1)', + shadowColor: 'rgba(89, 198, 255, 1)', + shadowOffset: { width: 0, height: 0 }, + shadowOpacity: 0.4, + shadowRadius: 12, + }, + panel: { + paddingHorizontal: 20, + paddingTop: 8, + }, + title: { + color: '#ECEDEE', + fontSize: 18, + fontWeight: '800', + marginBottom: 8, + }, + subtitle: { + color: 'rgba(255,255,255,0.75)', + fontSize: 14, + lineHeight: 20, + }, + actions: { + flexDirection: 'row', + gap: 10, + marginTop: 14, + }, + primaryBtn: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + gap: 6, + height: 44, + paddingHorizontal: 16, + borderRadius: 12, + }, + primaryBtnText: { + color: '#192126', + fontSize: 14, + fontWeight: '800', + }, + secondaryBtn: { + flex: 1, + height: 44, + borderRadius: 12, + alignItems: 'center', + justifyContent: 'center', + borderWidth: 1, + borderColor: 'rgba(255,255,255,0.18)', + }, + secondaryBtnText: { + color: 'rgba(255,255,255,0.85)', + fontSize: 14, + fontWeight: '700', + }, +}); + + diff --git a/app/ai-posture-result.tsx b/app/ai-posture-result.tsx new file mode 100644 index 0000000..e86f83c --- /dev/null +++ b/app/ai-posture-result.tsx @@ -0,0 +1,318 @@ +import { Ionicons } from '@expo/vector-icons'; +import { BlurView } from 'expo-blur'; +import { useRouter } from 'expo-router'; +import React, { useMemo } from 'react'; +import { ScrollView, StyleSheet, Text, TouchableOpacity, View } from 'react-native'; +import Animated, { FadeInDown } from 'react-native-reanimated'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; + +import { RadarChart } from '@/components/RadarChart'; +import { HeaderBar } from '@/components/ui/HeaderBar'; +import { Colors } from '@/constants/Colors'; + +type PoseView = 'front' | 'side' | 'back'; + +// 斯多特普拉提体态评估维度(示例) +const DIMENSIONS = [ + { key: 'head_neck', label: '头颈对齐' }, + { key: 'shoulder', label: '肩带稳定' }, + { key: 'ribs', label: '胸廓控制' }, + { key: 'pelvis', label: '骨盆中立' }, + { key: 'spine', label: '脊柱排列' }, + { key: 'hip_knee', label: '髋膝对线' }, +]; + +type Issue = { + title: string; + severity: 'low' | 'medium' | 'high'; + description: string; + suggestions: string[]; +}; + +type ViewReport = { + score: number; // 0-5 + issues: Issue[]; +}; + +type ResultData = { + radar: number[]; // 与 DIMENSIONS 对应,0-5 + overview: string; + byView: Record; +}; + +// NOTE: 此处示例数据,后续可由 API 注入 +const MOCK_RESULT: ResultData = { + radar: [4.2, 3.6, 3.2, 4.6, 3.8, 3.4], + overview: '整体体态较为均衡,骨盆与脊柱控制较好;肩带稳定性与胸廓控制仍有提升空间。', + byView: { + front: { + score: 3.8, + issues: [ + { + title: '肩峰略前移,肩胛轻度外旋', + severity: 'medium', + description: '站立正面观察,右侧肩峰较左侧略有前移,提示肩带稳定性偏弱。', + suggestions: ['肩胛稳定训练(如天鹅摆臂分解)', '胸椎伸展与放松', '轻度弹力带外旋激活'], + }, + ], + }, + side: { + score: 4.1, + issues: [ + { + title: '骨盆接近中立,腰椎轻度前凸', + severity: 'low', + description: '侧面观察,骨盆位置接近中立位,腰椎存在轻度前凸,需注意腹压与肋骨下沉。', + suggestions: ['呼吸配合下的腹横肌激活', '猫牛流动改善胸椎灵活性'], + }, + ], + }, + back: { + score: 3.5, + issues: [ + { + title: '右侧肩胛轻度上抬', + severity: 'medium', + description: '背面观察,右肩胛较左侧轻度上抬,肩胛下回旋不足。', + suggestions: ['锯前肌激活训练', '低位划船,关注肩胛下沉与后缩'], + }, + ], + }, + }, +}; + +export default function AIPostureResultScreen() { + const insets = useSafeAreaInsets(); + const router = useRouter(); + const theme = Colors.light; + + const categories = useMemo(() => DIMENSIONS.map(d => ({ key: d.key, label: d.label })), []); + + const ScoreBadge = ({ score }: { score: number }) => ( + + {score.toFixed(1)} + /5 + + ); + + const IssueItem = ({ issue }: { issue: Issue }) => ( + + + + {issue.title} + {issue.description} + {!!issue.suggestions?.length && ( + + {issue.suggestions.map((s, idx) => ( + {s} + ))} + + )} + + + ); + + const ViewCard = ({ title, report }: { title: string; report: ViewReport }) => ( + + + {title} + + + {report.issues.map((iss, idx) => ())} + + ); + + return ( + + router.back()} tone="light" transparent /> + + {/* 背景装饰 */} + + + + + + + {/* 总览与雷达图 */} + + 总体概览 + {MOCK_RESULT.overview} + + + + + + {/* 视图分析 */} + + + + + {/* 底部操作 */} + + router.replace('/(tabs)/personal')}> + + 完成并返回 + + router.push('/ai-coach-chat')}> + 生成训练建议 + + + + + ); +} + +const styles = StyleSheet.create({ + screen: { + flex: 1, + }, + bgBlobA: { + position: 'absolute', + top: -60, + right: -40, + width: 200, + height: 200, + borderRadius: 100, + backgroundColor: 'rgba(187,242,70,0.18)', + }, + bgBlobB: { + position: 'absolute', + bottom: 100, + left: -30, + width: 180, + height: 180, + borderRadius: 90, + backgroundColor: 'rgba(89, 198, 255, 0.16)', + }, + card: { + marginTop: 16, + marginHorizontal: 16, + borderRadius: 16, + padding: 14, + backgroundColor: 'rgba(255,255,255,0.72)', + borderWidth: 1, + borderColor: 'rgba(25,33,38,0.08)', + }, + sectionTitle: { + color: '#192126', + fontSize: 16, + fontWeight: '800', + marginBottom: 8, + }, + overview: { + color: '#384046', + fontSize: 14, + lineHeight: 20, + }, + radarWrap: { + marginTop: 10, + alignItems: 'center', + }, + cardHeader: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + marginBottom: 8, + }, + cardTitle: { + color: '#192126', + fontSize: 15, + fontWeight: '700', + }, + scoreBadge: { + flexDirection: 'row', + alignItems: 'flex-end', + paddingHorizontal: 10, + paddingVertical: 6, + borderRadius: 10, + backgroundColor: 'rgba(187,242,70,0.16)', + }, + scoreText: { + color: '#192126', + fontSize: 18, + fontWeight: '800', + }, + scoreUnit: { + color: '#5E6468', + fontSize: 12, + marginLeft: 4, + }, + issueItem: { + flexDirection: 'row', + gap: 10, + paddingVertical: 10, + }, + issueDot: { + width: 10, + height: 10, + borderRadius: 5, + marginTop: 6, + }, + dotHigh: { backgroundColor: '#E24D4D' }, + dotMedium: { backgroundColor: '#F0C23C' }, + dotLow: { backgroundColor: '#2BCC7F' }, + issueTitle: { + color: '#192126', + fontSize: 14, + fontWeight: '700', + }, + issueDesc: { + color: '#5E6468', + fontSize: 13, + marginTop: 4, + }, + suggestRow: { + flexDirection: 'row', + flexWrap: 'wrap', + gap: 8, + marginTop: 8, + }, + suggestChip: { + paddingHorizontal: 10, + paddingVertical: 6, + borderRadius: 12, + backgroundColor: 'rgba(25,33,38,0.04)', + borderWidth: 1, + borderColor: 'rgba(25,33,38,0.08)', + }, + suggestText: { + color: '#192126', + fontSize: 12, + }, + actions: { + marginTop: 16, + paddingHorizontal: 16, + flexDirection: 'row', + gap: 10, + }, + primaryBtn: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + gap: 8, + height: 48, + paddingHorizontal: 16, + borderRadius: 14, + }, + primaryBtnText: { + color: '#192126', + fontSize: 15, + fontWeight: '800', + }, + secondaryBtn: { + flex: 1, + height: 48, + borderRadius: 14, + alignItems: 'center', + justifyContent: 'center', + borderWidth: 1, + borderColor: 'transparent', + }, + secondaryBtnText: { + color: '#384046', + fontSize: 15, + fontWeight: '700', + }, +}); + + diff --git a/app/auth/login.tsx b/app/auth/login.tsx index daeffa7..72652f9 100644 --- a/app/auth/login.tsx +++ b/app/auth/login.tsx @@ -1,8 +1,9 @@ import { Ionicons } from '@expo/vector-icons'; import * as AppleAuthentication from 'expo-apple-authentication'; +import { LinearGradient } from 'expo-linear-gradient'; import { useLocalSearchParams, useRouter } from 'expo-router'; -import React, { useCallback, useEffect, useMemo, useState } from 'react'; -import { Alert, Pressable, ScrollView, StyleSheet, Text, TouchableOpacity, View } from 'react-native'; +import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { Alert, Animated, Pressable, ScrollView, StyleSheet, Text, TouchableOpacity, View } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import { ThemedText } from '@/components/ThemedText'; @@ -17,7 +18,52 @@ export default function LoginScreen() { const searchParams = useLocalSearchParams<{ redirectTo?: string; redirectParams?: string }>(); const scheme = (useColorScheme() ?? 'light') as 'light' | 'dark'; const color = Colors[scheme]; + const pageBackground = scheme === 'light' ? color.pageBackgroundEmphasis : color.background; const dispatch = useAppDispatch(); + const AnimatedLinear = useMemo(() => Animated.createAnimatedComponent(LinearGradient), []); + + // 背景动效:轻微平移/旋转与呼吸动画 + const translateAnim = useRef(new Animated.Value(0)).current; + const rotateAnim = useRef(new Animated.Value(0)).current; + const pulseAnimA = useRef(new Animated.Value(0)).current; + const pulseAnimB = useRef(new Animated.Value(0)).current; + + useEffect(() => { + const loopTranslate = Animated.loop( + Animated.sequence([ + Animated.timing(translateAnim, { toValue: 1, duration: 6000, useNativeDriver: true }), + Animated.timing(translateAnim, { toValue: 0, duration: 6000, useNativeDriver: true }), + ]) + ); + const loopRotate = Animated.loop( + Animated.sequence([ + Animated.timing(rotateAnim, { toValue: 1, duration: 10000, useNativeDriver: true }), + Animated.timing(rotateAnim, { toValue: 0, duration: 10000, useNativeDriver: true }), + ]) + ); + const loopPulseA = Animated.loop( + Animated.sequence([ + Animated.timing(pulseAnimA, { toValue: 1, duration: 3500, useNativeDriver: true }), + Animated.timing(pulseAnimA, { toValue: 0, duration: 3500, useNativeDriver: true }), + ]) + ); + const loopPulseB = Animated.loop( + Animated.sequence([ + Animated.timing(pulseAnimB, { toValue: 1, duration: 4200, useNativeDriver: true }), + Animated.timing(pulseAnimB, { toValue: 0, duration: 4200, useNativeDriver: true }), + ]) + ); + loopTranslate.start(); + loopRotate.start(); + loopPulseA.start(); + loopPulseB.start(); + return () => { + loopTranslate.stop(); + loopRotate.stop(); + loopPulseA.stop(); + loopPulseB.stop(); + }; + }, [pulseAnimA, pulseAnimB, rotateAnim, translateAnim]); const [hasAgreed, setHasAgreed] = useState(false); const [appleAvailable, setAppleAvailable] = useState(false); @@ -29,7 +75,21 @@ export default function LoginScreen() { const guardAgreement = useCallback((action: () => void) => { if (!hasAgreed) { - Alert.alert('请先阅读并同意', '勾选“我已阅读并同意用户协议与隐私政策”后才可继续登录'); + Alert.alert( + '请先阅读并同意', + '继续登录前,请阅读并勾选《隐私政策》和《用户协议》。点击“同意并继续”将默认勾选并继续登录。', + [ + { text: '取消', style: 'cancel' }, + { + text: '同意并继续', + onPress: () => { + setHasAgreed(true); + setTimeout(() => action(), 0); + }, + }, + ], + { cancelable: true } + ); return; } action(); @@ -83,11 +143,79 @@ export default function LoginScreen() { } }, [router, searchParams?.redirectParams, searchParams?.redirectTo]); - const disabledStyle = useMemo(() => ({ opacity: hasAgreed ? 1 : 0.5 }), [hasAgreed]); + // 登录按钮不再因未勾选协议而禁用,仅在加载中禁用 return ( - - + + + {/* 动态背景层(置于内容之下) */} + + {/* 基础全屏渐变:保证覆盖全屏 */} + + + {/* 次级大面积渐变:对角线方向形成层次 */} + + + {/* 动感色块 A(主色呼吸,置于左下) */} + + + {/* 动感色块 B(辅色漂移,置于右上) */} + + {/* 自定义头部,与其它页面风格一致 */} router.back()} style={styles.backButton}> @@ -108,11 +236,11 @@ export default function LoginScreen() { guardAgreement(onAppleLogin)} - disabled={!hasAgreed || loading} + disabled={loading} style={({ pressed }) => [ styles.appleButton, { backgroundColor: '#000000' }, - disabledStyle, + loading && { opacity: 0.7 }, pressed && { transform: [{ scale: 0.98 }] }, ]} > @@ -125,16 +253,16 @@ export default function LoginScreen() { guardAgreement(onGuestLogin)} - disabled={!hasAgreed || loading} + disabled={loading} style={({ pressed }) => [ styles.guestButton, { borderColor: color.border, backgroundColor: color.surface }, - disabledStyle, + loading && { opacity: 0.7 }, pressed && { transform: [{ scale: 0.98 }] }, ]} > - - 以游客身份继续 + + 以游客身份继续 {/* 协议勾选 */} @@ -192,6 +320,7 @@ const styles = StyleSheet.create({ fontSize: 32, fontWeight: '500', letterSpacing: 0.5, + lineHeight: 38, }, subtitle: { marginTop: 8, @@ -248,6 +377,45 @@ const styles = StyleSheet.create({ link: { fontSize: 12, fontWeight: '600' }, footerHint: { marginTop: 24 }, hintText: { fontSize: 12 }, + // 背景样式 + bgWrap: { + ...StyleSheet.absoluteFillObject, + zIndex: 0, + }, + bgGradientFull: { + position: 'absolute', + left: 0, + top: 0, + right: 0, + bottom: 0, + }, + bgGradientCover: { + position: 'absolute', + left: '-10%', + top: '-15%', + width: '130%', + height: '70%', + borderBottomLeftRadius: 36, + borderBottomRightRadius: 36, + }, + accentBlob: { + position: 'absolute', + width: 180, + height: 180, + borderRadius: 90, + }, + accentBlobLarge: { + position: 'absolute', + width: 260, + height: 260, + borderRadius: 130, + }, + accentBlobMedium: { + position: 'absolute', + width: 180, + height: 180, + borderRadius: 90, + }, }); diff --git a/app/training-plan.tsx b/app/training-plan.tsx index 307091b..15ce8e2 100644 --- a/app/training-plan.tsx +++ b/app/training-plan.tsx @@ -1,7 +1,7 @@ +import DateTimePicker from '@react-native-community/datetimepicker'; import { useRouter } from 'expo-router'; import React, { useEffect, useMemo, useState } from 'react'; -import { Pressable, SafeAreaView, ScrollView, StyleSheet, TextInput, View } from 'react-native'; -import DateTimePickerModal from 'react-native-modal-datetime-picker'; +import { Modal, Platform, Pressable, SafeAreaView, ScrollView, StyleSheet, TextInput, View } from 'react-native'; import { ThemedText } from '@/components/ThemedText'; import { ThemedView } from '@/components/ThemedView'; @@ -39,6 +39,7 @@ export default function TrainingPlanScreen() { const { draft, current } = useAppSelector((s) => s.trainingPlan); const [weightInput, setWeightInput] = useState(''); const [datePickerVisible, setDatePickerVisible] = useState(false); + const [pickerDate, setPickerDate] = useState(new Date()); useEffect(() => { dispatch(loadTrainingPlan()); @@ -60,12 +61,31 @@ export default function TrainingPlanScreen() { return true; }, [draft]); + const formattedStartDate = useMemo(() => { + const d = new Date(draft.startDate); + try { + return new Intl.DateTimeFormat('zh-CN', { + year: 'numeric', + month: 'long', + day: 'numeric', + weekday: 'short', + }).format(d); + } catch { + return d.toLocaleDateString('zh-CN'); + } + }, [draft.startDate]); + const handleSave = async () => { await dispatch(saveTrainingPlan()).unwrap().catch(() => { }); router.back(); }; - const openDatePicker = () => setDatePickerVisible(true); + const openDatePicker = () => { + const base = draft.startDate ? new Date(draft.startDate) : new Date(); + base.setHours(0, 0, 0, 0); + setPickerDate(base); + setDatePickerVisible(true); + }; const closeDatePicker = () => setDatePickerVisible(false); const onConfirmDate = (date: Date) => { // 只允许今天之后(含今天)的日期 @@ -161,7 +181,7 @@ export default function TrainingPlanScreen() { - {new Date(draft.startDate).toLocaleDateString()} + {formattedStartDate} 开始体重 (kg) @@ -197,13 +217,44 @@ export default function TrainingPlanScreen() { - + + + + { + if (Platform.OS === 'ios') { + if (date) setPickerDate(date); + } else { + if (event.type === 'set' && date) { + onConfirmDate(date); + } else { + closeDatePicker(); + } + } + }} + /> + {Platform.OS === 'ios' && ( + + + 取消 + + { onConfirmDate(pickerDate); }} style={[styles.modalBtn, styles.modalBtnPrimary]}> + 确定 + + + )} + + ); } @@ -239,12 +290,14 @@ const styles = StyleSheet.create({ fontSize: 28, fontWeight: '800', color: '#1A1A1A', + lineHeight: 36, }, subtitle: { fontSize: 14, color: '#5E6468', marginTop: 6, marginBottom: 16, + lineHeight: 20, }, card: { backgroundColor: '#FFFFFF', @@ -463,6 +516,42 @@ const styles = StyleSheet.create({ fontSize: 16, fontWeight: '800', }, + modalBackdrop: { + ...StyleSheet.absoluteFillObject, + backgroundColor: 'rgba(0,0,0,0.35)', + }, + modalSheet: { + position: 'absolute', + left: 0, + right: 0, + bottom: 0, + padding: 16, + backgroundColor: '#FFFFFF', + borderTopLeftRadius: 16, + borderTopRightRadius: 16, + }, + modalActions: { + flexDirection: 'row', + justifyContent: 'flex-end', + marginTop: 8, + gap: 12, + }, + modalBtn: { + paddingHorizontal: 14, + paddingVertical: 10, + borderRadius: 10, + backgroundColor: '#F1F5F9', + }, + modalBtnPrimary: { + backgroundColor: palette.primary, + }, + modalBtnText: { + color: '#334155', + fontWeight: '700', + }, + modalBtnTextPrimary: { + color: palette.ink, + }, }); diff --git a/components/RadarChart.tsx b/components/RadarChart.tsx new file mode 100644 index 0000000..e345688 --- /dev/null +++ b/components/RadarChart.tsx @@ -0,0 +1,104 @@ +import React, { useMemo } from 'react'; +import { StyleSheet, View } from 'react-native'; +import Svg, * as SvgLib from 'react-native-svg'; + +export type RadarCategory = { key: string; label: string }; + +export type RadarChartProps = { + categories: RadarCategory[]; + values: number[]; // 与 categories 一一对应 + maxValue?: number; // 默认 5 + size?: number; // 组件宽高,默认 260 + levels?: number; // 网格层数,默认 5 + showGrid?: boolean; +}; + +export function RadarChart({ categories, values, maxValue = 5, size = 260, levels = 5, showGrid = true }: RadarChartProps) { + const radius = size * 0.38; + const cx = size / 2; + const cy = size / 2; + const count = categories.length; + + const points = useMemo(() => { + return categories.map((_, i) => { + const angle = (Math.PI * 2 * i) / count - Math.PI / 2; // 顶部起点 + return { angle, x: (v: number) => cx + Math.cos(angle) * v, y: (v: number) => cy + Math.sin(angle) * v }; + }); + }, [categories, count, cx, cy]); + + const valuePath = useMemo(() => { + const rValues = values.map((v) => Math.max(0, Math.min(maxValue, v)) / maxValue * radius); + const d = rValues + .map((rv, i) => `${i === 0 ? 'M' : 'L'} ${points[i].x(rv)} ${points[i].y(rv)}`) + .join(' '); + return `${d} Z`; + }, [values, maxValue, radius, points]); + + const gridPolygons = useMemo(() => { + const polys: string[] = []; + for (let l = 1; l <= levels; l++) { + const r = (radius / levels) * l; + const p = points.map((p) => `${p.x(r)},${p.y(r)}`).join(' '); + polys.push(p); + } + return polys; + }, [levels, radius, points]); + + return ( + + + + + + + + + + {showGrid && ( + + {gridPolygons.map((pointsStr, idx) => ( + + ))} + {points.map((p, i) => ( + + ))} + + )} + + {categories.map((c, i) => { + const r = radius + 18; + const x = points[i].x(r); + const y = points[i].y(r); + const anchor = Math.cos(points[i].angle) > 0.2 ? 'start' : Math.cos(points[i].angle) < -0.2 ? 'end' : 'middle'; + const dy = Math.sin(points[i].angle) > 0.6 ? 10 : Math.sin(points[i].angle) < -0.6 ? -4 : 4; + return ( + + {c.label} + + ); + })} + + + + + + ); +} + +const styles = StyleSheet.create({}); + + diff --git a/constants/Cos.ts b/constants/Cos.ts new file mode 100644 index 0000000..7e56eb4 --- /dev/null +++ b/constants/Cos.ts @@ -0,0 +1,26 @@ +export const COS_BUCKET: string = ''; +export const COS_REGION: string = ''; +export const COS_PUBLIC_BASE: string = ''; + +// 统一的对象键前缀(可按业务拆分) +export const COS_KEY_PREFIX = 'uploads/'; + +// 生成文件名(含子目录),避免冲突 +export function buildCosKey(params: { prefix?: string; ext?: string; userId?: string }): string { + const { prefix, ext, userId } = params; + const date = new Date(); + const yyyy = date.getFullYear(); + const mm = String(date.getMonth() + 1).padStart(2, '0'); + const dd = String(date.getDate()).padStart(2, '0'); + const ts = date.getTime(); + const rand = Math.random().toString(36).slice(2, 8); + const base = `${COS_KEY_PREFIX}${yyyy}/${mm}/${dd}/${userId ? userId + '/' : ''}${ts}_${rand}`; + return `${prefix ? prefix.replace(/\/*$/, '/') : ''}${base}${ext ? (ext.startsWith('.') ? ext : `.${ext}`) : ''}`; +} + +export function buildPublicUrl(key: string): string { + if (!COS_PUBLIC_BASE) return ''; + return `${COS_PUBLIC_BASE.replace(/\/$/, '')}/${key.replace(/^\//, '')}`; +} + + diff --git a/docs/cos.md b/docs/cos.md new file mode 100644 index 0000000..0ed73a0 --- /dev/null +++ b/docs/cos.md @@ -0,0 +1,174 @@ +# 腾讯云 COS 上传集成说明 + +本文档记录本项目在前端(Expo/React Native)侧对腾讯云 COS 的接入方式与使用规范,包含配置、接口约定、上传用法、进度/取消/重试、URL 构建、权限与安全、常见问题等。 + +## 概览 +- 依赖:`cos-js-sdk-v5` +- 临时密钥接口:`GET /api/users/cos-token` +- 统一封装: + - 配置:`constants/Cos.ts` + - 上传服务:`services/cos.ts` + - Hook:`hooks/useCosUpload.ts` + +## 安装与依赖 +已在 `package.json` 中添加: + +```json +{ + "dependencies": { + "cos-js-sdk-v5": "^1.6.0" + } +} +``` + +## 配置 +编辑 `constants/Cos.ts`,填入实际 COS 参数: + +```ts +export const COS_BUCKET = 'your-bucket-125xxxxxxx'; +export const COS_REGION = 'ap-shanghai'; +export const COS_PUBLIC_BASE = 'https://your-bucket-125xxxxxxx.cos.ap-shanghai.myqcloud.com'; +export const COS_KEY_PREFIX = 'uploads/'; +``` + +说明: +- COS_PUBLIC_BASE:若桶或 CDN 具有公网访问,使用对应域名(建议 HTTPS)。若为私有桶,可忽略该项(前端不能直接拼公开 URL)。 +- `buildCosKey` 会依据日期和随机串生成不重复 Key,可通过 `prefix`/`userId` 定制目录。 + +## 后端接口约定:/api/users/cos-token +- 方法:`GET` +- 鉴权:建议要求登录态,后端根据用户权限签发最小权限临时凭证。 +- 响应体示例(关键字段): + +```json +{ + "credentials": { + "tmpSecretId": "TMPID...", + "tmpSecretKey": "TMPKEY...", + "sessionToken": "SESSION_TOKEN..." + }, + "startTime": 1730000000, + "expiredTime": 1730001800 +} +``` + +- 最小权限策略建议(示例,后端侧): + +```json +{ + "version": "2.0", + "statement": [ + { + "action": [ + "name/cos:PutObject", + "name/cos:InitiateMultipartUpload", + "name/cos:UploadPart", + "name/cos:CompleteMultipartUpload" + ], + "effect": "allow", + "resource": [ + "qcs::cos:ap-shanghai:uid/125xxxxxxx:your-bucket-125xxxxxxx/*" + ] + } + ] +} +``` + +注意:对上传路径进行前缀限制(如 `uploads/*`)能进一步收敛权限范围。 + +## 前端用法一:Hook(推荐) +在页面/组件内使用 `useCosUpload`,支持进度、取消与重试。 + +```tsx +import { useCosUpload } from '@/hooks/useCosUpload'; +import * as ImagePicker from 'expo-image-picker'; + +export default function Uploader() { + const { upload, progress, uploading, cancel } = useCosUpload({ prefix: 'images/', userId: 'uid-123' }); + + const pickAndUpload = async () => { + const res = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Images }); + if (res.canceled || !res.assets?.[0]) return; + const asset = res.assets[0]; + const result = await upload({ uri: asset.uri, name: asset.fileName, type: asset.mimeType }); + console.log('uploaded:', result); // { key, url } + }; + + return null; +} +``` + +说明: +- `progress` 范围 0-1;`uploading` 指示进行中;可随时 `cancel()`。 +- 未开启公网访问时,`url` 可能为空(需服务端签名下载)。 + +## 前端用法二:直接调用服务 +`services/cos.ts` 提供基础方法: + +```ts +import { uploadWithRetry } from '@/services/cos'; + +const { key, etag } = await uploadWithRetry({ + key: 'uploads/demo.png', + body: blob, + contentType: 'image/png' +}); +``` + +- 进度回调:`onProgress: ({ percent }) => { ... }` +- 取消:传入 `signal: AbortSignal` +- 重试:`maxRetries`/`backoffMs` 配置指数退避 + +## URL 构建 +若为公网可访问场景,使用: + +```ts +import { buildPublicUrl } from '@/constants/Cos'; +const url = buildPublicUrl(key); +``` + +若为私有桶,请改走服务端生成临时下载链接或代理下载。 + +## 大文件与分片上传 +当前默认使用 `putObject`。若需大文件/断点续传,建议切换 SDK 的分片接口 `sliceUploadFile`: + +```ts +const taskId = cos.sliceUploadFile({ + Bucket: COS_BUCKET, + Region: COS_REGION, + Key: key, + Body: fileOrBlob, + onProgress(progress) { /* ... */ } +}, (err, data) => { /* ... */ }); +``` + +如需切换,可在 `services/cos.ts` 中将 `putObject` 替换为 `sliceUploadFile`,并保留同样的进度、取消与重试包装。 + +## CORS 与浏览器(如使用 Web) +- COS 控制台需配置 CORS,允许来源域名、方法(PUT/POST/OPTIONS)、请求头(含 `Authorization`、`x-cos-*` 等)、暴露头。 +- 若通过自有域名/网关代理,也需在代理层正确透传 CORS 与签名头。 + +## 安全与最佳实践 +- 永久密钥仅存在服务端,通过 `/api/users/cos-token` 颁发短期凭证。 +- 严控临时凭证权限与有效期,并限制上传前缀。 +- 前端仅持有短期凭证;错误重试次数受限,避免暴力重放。 + +## 常见问题排查 +- 403/签名失败:确认服务端时间同步、`region/bucket`/`resource` 配置正确;临时密钥未过期。 +- CORS 失败:检查 COS 跨域规则;确认需要的请求头(含 `Authorization`)均已放行。 +- URL 访问 403:私有桶下请改用服务端签名下载;或为指定前缀开启公共读(谨慎)。 +- MIME/ContentType:从 ImagePicker 取 `mimeType`,或按扩展名兜底设置。 + +## 测试清单 +- 小图上传成功且进度递增、可取消。 +- 取消后不再继续发片段;重试如期生效。 +- 返回的 `key` 能通过 `buildPublicUrl` 拼出可访问地址(公网桶)。 +- 临时密钥过期后,能够重新获取并继续上传。 + +## 变更点速记 +- 依赖:`cos-js-sdk-v5` +- 新增:`constants/Cos.ts`、`services/cos.ts`、`hooks/useCosUpload.ts` +- 接口:`GET /api/users/cos-token`(返回临时凭证) + +--- +如需我将某页面接入示例按钮或改造为分片上传,请在需求中指明目标文件与交互期望。 diff --git a/hooks/useCosUpload.ts b/hooks/useCosUpload.ts new file mode 100644 index 0000000..c98cf97 --- /dev/null +++ b/hooks/useCosUpload.ts @@ -0,0 +1,59 @@ +import { buildCosKey, buildPublicUrl } from '@/constants/Cos'; +import { uploadWithRetry } from '@/services/cos'; +import { useCallback, useMemo, useRef, useState } from 'react'; + +export type UseCosUploadOptions = { + prefix?: string; + userId?: string; + contentType?: string; +}; + +export function useCosUpload(defaultOptions?: UseCosUploadOptions) { + const abortRef = useRef(null); + const [progress, setProgress] = useState(0); + const [uploading, setUploading] = useState(false); + + const cancel = useCallback(() => { + abortRef.current?.abort(); + }, []); + + const upload = useCallback( + async (file: { uri?: string; name?: string; type?: string; buffer?: any; blob?: Blob } | Blob | any, options?: UseCosUploadOptions) => { + const finalOptions = { ...(defaultOptions || {}), ...(options || {}) }; + const extGuess = (() => { + const name = (file && (file.name || (file as any).filename)) || ''; + const match = name.match(/\.([a-zA-Z0-9]+)$/); + return match ? match[1] : undefined; + })(); + const key = buildCosKey({ prefix: finalOptions.prefix, userId: finalOptions.userId, ext: extGuess }); + const controller = new AbortController(); + abortRef.current = controller; + setProgress(0); + setUploading(true); + try { + let body = (file as any)?.blob || (file as any)?.buffer || file; + // Expo ImagePicker 返回 { uri } 时,转换为 Blob + if (!body && (file as any)?.uri) { + const resp = await fetch((file as any).uri); + body = await resp.blob(); + } + const res = await uploadWithRetry({ + key, + body, + contentType: finalOptions.contentType || (file as any)?.type, + signal: controller.signal, + onProgress: ({ percent }) => setProgress(percent), + }); + const url = buildPublicUrl(res.key); + return { key: res.key, url }; + } finally { + setUploading(false); + } + }, + [defaultOptions] + ); + + return useMemo(() => ({ upload, cancel, progress, uploading }), [upload, cancel, progress, uploading]); +} + + diff --git a/ios/Podfile.lock b/ios/Podfile.lock index bbcad37..7b6dd49 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -10,7 +10,6 @@ PODS: - DoubleConversion - ExpoModulesCore - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -19,8 +18,8 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager + - React-jsc - React-jsi - React-NativeModulesApple - React-RCTAppDelegate @@ -65,7 +64,6 @@ PODS: - ExpoModulesCore (2.5.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -74,10 +72,9 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager + - React-jsc - React-jsi - - React-jsinspector - React-NativeModulesApple - React-RCTFabric - React-renderercss @@ -99,9 +96,6 @@ PODS: - FBLazyVector (0.79.5) - fmt (11.0.2) - glog (0.3.5) - - hermes-engine (0.79.5): - - hermes-engine/Pre-built (= 0.79.5) - - hermes-engine/Pre-built (0.79.5) - libavif/core (0.11.1) - libavif/libdav1d (0.11.1): - libavif/core @@ -160,13 +154,12 @@ PODS: - React-callinvoker (0.79.5) - React-Core (0.79.5): - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default (= 0.79.5) - React-cxxreact - React-featureflags - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-jsinspector @@ -178,13 +171,12 @@ PODS: - Yoga - React-Core/CoreModulesHeaders (0.79.5): - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default - React-cxxreact - React-featureflags - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-jsinspector @@ -196,12 +188,11 @@ PODS: - Yoga - React-Core/Default (0.79.5): - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-cxxreact - React-featureflags - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-jsinspector @@ -213,14 +204,13 @@ PODS: - Yoga - React-Core/DevSupport (0.79.5): - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default (= 0.79.5) - React-Core/RCTWebSocket (= 0.79.5) - React-cxxreact - React-featureflags - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-jsinspector @@ -232,13 +222,12 @@ PODS: - Yoga - React-Core/RCTActionSheetHeaders (0.79.5): - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default - React-cxxreact - React-featureflags - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-jsinspector @@ -250,13 +239,12 @@ PODS: - Yoga - React-Core/RCTAnimationHeaders (0.79.5): - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default - React-cxxreact - React-featureflags - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-jsinspector @@ -268,13 +256,12 @@ PODS: - Yoga - React-Core/RCTBlobHeaders (0.79.5): - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default - React-cxxreact - React-featureflags - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-jsinspector @@ -286,13 +273,12 @@ PODS: - Yoga - React-Core/RCTImageHeaders (0.79.5): - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default - React-cxxreact - React-featureflags - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-jsinspector @@ -304,13 +290,12 @@ PODS: - Yoga - React-Core/RCTLinkingHeaders (0.79.5): - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default - React-cxxreact - React-featureflags - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-jsinspector @@ -322,13 +307,12 @@ PODS: - Yoga - React-Core/RCTNetworkHeaders (0.79.5): - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default - React-cxxreact - React-featureflags - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-jsinspector @@ -340,13 +324,12 @@ PODS: - Yoga - React-Core/RCTSettingsHeaders (0.79.5): - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default - React-cxxreact - React-featureflags - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-jsinspector @@ -358,13 +341,12 @@ PODS: - Yoga - React-Core/RCTTextHeaders (0.79.5): - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default - React-cxxreact - React-featureflags - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-jsinspector @@ -376,13 +358,12 @@ PODS: - Yoga - React-Core/RCTVibrationHeaders (0.79.5): - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default - React-cxxreact - React-featureflags - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-jsinspector @@ -394,13 +375,12 @@ PODS: - Yoga - React-Core/RCTWebSocket (0.79.5): - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default (= 0.79.5) - React-cxxreact - React-featureflags - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-jsinspector @@ -432,7 +412,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - React-callinvoker (= 0.79.5) - React-debug (= 0.79.5) @@ -445,23 +424,21 @@ PODS: - React-timing (= 0.79.5) - React-debug (0.79.5) - React-defaultsnativemodule (0.79.5): - - hermes-engine - RCT-Folly - React-domnativemodule - React-featureflagsnativemodule - - React-hermes - React-idlecallbacksnativemodule + - React-jsc - React-jsi - React-jsiexecutor - React-microtasksnativemodule - React-RCTFBReactNativeSpec - React-domnativemodule (0.79.5): - - hermes-engine - RCT-Folly - React-Fabric - React-FabricComponents - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec @@ -472,7 +449,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -497,7 +473,7 @@ PODS: - React-Fabric/uimanager (= 0.79.5) - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -510,7 +486,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -519,7 +494,7 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -532,7 +507,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -541,7 +515,7 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -554,7 +528,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -563,7 +536,7 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -576,7 +549,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -585,7 +557,7 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -598,7 +570,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -611,7 +582,7 @@ PODS: - React-Fabric/components/view (= 0.79.5) - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -624,7 +595,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -633,7 +603,7 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -646,7 +616,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -655,7 +624,7 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -668,7 +637,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -677,7 +645,7 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -690,7 +658,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -699,7 +666,7 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -714,7 +681,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -723,7 +689,7 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -736,7 +702,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -745,7 +710,7 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -758,7 +723,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -767,7 +731,7 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -780,7 +744,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -789,7 +752,7 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -802,7 +765,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -811,7 +773,7 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -824,7 +786,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -833,7 +794,7 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -846,7 +807,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -856,7 +816,7 @@ PODS: - React-Fabric/observers/events (= 0.79.5) - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -869,7 +829,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -878,7 +837,7 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -891,7 +850,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -901,7 +859,7 @@ PODS: - React-Fabric/observers/events - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -915,7 +873,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -924,7 +881,7 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -937,7 +894,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -946,7 +902,7 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -959,7 +915,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -969,7 +924,7 @@ PODS: - React-Fabric/uimanager/consistency (= 0.79.5) - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -983,7 +938,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -992,7 +946,7 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -1006,7 +960,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1018,7 +971,7 @@ PODS: - React-FabricComponents/textlayoutmanager (= 0.79.5) - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -1032,7 +985,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1051,7 +1003,7 @@ PODS: - React-FabricComponents/components/unimplementedview (= 0.79.5) - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -1065,7 +1017,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1075,7 +1026,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -1089,7 +1040,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1099,7 +1049,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -1113,7 +1063,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1123,7 +1072,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -1137,7 +1086,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1147,7 +1095,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -1161,7 +1109,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1171,7 +1118,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -1185,7 +1132,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1195,7 +1141,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -1209,7 +1155,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1219,7 +1164,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -1233,7 +1178,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1243,7 +1187,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -1257,7 +1201,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1267,7 +1210,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -1281,7 +1224,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1291,7 +1233,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-logger @@ -1305,15 +1247,14 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired (= 0.79.5) - RCTTypeSafety (= 0.79.5) - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager + - React-jsc - React-jsi - React-jsiexecutor (= 0.79.5) - React-logger @@ -1324,10 +1265,9 @@ PODS: - React-featureflags (0.79.5): - RCT-Folly (= 2024.11.18.00) - React-featureflagsnativemodule (0.79.5): - - hermes-engine - RCT-Folly - React-featureflags - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec @@ -1337,31 +1277,15 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-utils - - React-hermes (0.79.5): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-cxxreact (= 0.79.5) - - React-jsi - - React-jsiexecutor (= 0.79.5) - - React-jsinspector - - React-jsinspectortracing - - React-perflogger (= 0.79.5) - - React-runtimeexecutor - React-idlecallbacksnativemodule (0.79.5): - glog - - hermes-engine - RCT-Folly - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec @@ -1376,9 +1300,13 @@ PODS: - React-graphics - React-rendererdebug - React-utils + - React-jsc (0.79.5): + - React-jsc/Fabric (= 0.79.5) + - React-jsi (= 0.79.5) + - React-jsc/Fabric (0.79.5): + - React-jsi (= 0.79.5) - React-jserrorhandler (0.79.5): - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - React-cxxreact - React-debug @@ -1391,14 +1319,12 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - React-jsiexecutor (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - React-cxxreact (= 0.79.5) - React-jsi (= 0.79.5) @@ -1408,7 +1334,6 @@ PODS: - React-jsinspector (0.79.5): - DoubleConversion - glog - - hermes-engine - RCT-Folly - React-featureflags - React-jsi @@ -1436,9 +1361,8 @@ PODS: - glog - React-debug - React-microtasksnativemodule (0.79.5): - - hermes-engine - RCT-Folly - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec @@ -1446,7 +1370,6 @@ PODS: - react-native-safe-area-context (5.4.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1455,8 +1378,8 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager + - React-jsc - React-jsi - react-native-safe-area-context/common (= 5.4.0) - react-native-safe-area-context/fabric (= 5.4.0) @@ -1472,7 +1395,6 @@ PODS: - react-native-safe-area-context/common (5.4.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1481,8 +1403,8 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager + - React-jsc - React-jsi - React-NativeModulesApple - React-RCTFabric @@ -1496,7 +1418,6 @@ PODS: - react-native-safe-area-context/fabric (5.4.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1505,8 +1426,8 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager + - React-jsc - React-jsi - react-native-safe-area-context/common - React-NativeModulesApple @@ -1521,7 +1442,6 @@ PODS: - react-native-webview (13.13.5): - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1530,8 +1450,8 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager + - React-jsc - React-jsi - React-NativeModulesApple - React-RCTFabric @@ -1544,12 +1464,11 @@ PODS: - Yoga - React-NativeModulesApple (0.79.5): - glog - - hermes-engine - React-callinvoker - React-Core - React-cxxreact - React-featureflags - - React-hermes + - React-jsc - React-jsi - React-jsinspector - React-runtimeexecutor @@ -1577,7 +1496,6 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - React-RCTAppDelegate (0.79.5): - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1588,7 +1506,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsitooling - React-NativeModulesApple - React-RCTFabric @@ -1606,7 +1524,6 @@ PODS: - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) - - hermes-engine - RCT-Folly (= 2024.11.18.00) - React-Core/RCTBlobHeaders - React-Core/RCTWebSocket @@ -1618,7 +1535,6 @@ PODS: - ReactCommon - React-RCTFabric (0.79.5): - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - React-Core - React-debug @@ -1627,8 +1543,8 @@ PODS: - React-FabricImage - React-featureflags - React-graphics - - React-hermes - React-ImageManager + - React-jsc - React-jsi - React-jsinspector - React-jsinspectortracing @@ -1643,12 +1559,11 @@ PODS: - React-utils - Yoga - React-RCTFBReactNativeSpec (0.79.5): - - hermes-engine - RCT-Folly - RCTRequired - RCTTypeSafety - React-Core - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-NativeModulesApple @@ -1679,17 +1594,15 @@ PODS: - ReactCommon - React-RCTRuntime (0.79.5): - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - React-Core - - React-hermes + - React-jsc - React-jsi - React-jsinspector - React-jsinspectortracing - React-jsitooling - React-RuntimeApple - React-RuntimeCore - - React-RuntimeHermes - React-RCTSettings (0.79.5): - RCT-Folly (= 2024.11.18.00) - RCTTypeSafety @@ -1720,13 +1633,13 @@ PODS: - React-debug - React-rncore (0.79.5) - React-RuntimeApple (0.79.5): - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - React-callinvoker - React-Core/Default - React-CoreModules - React-cxxreact - React-featureflags + - React-jsc - React-jserrorhandler - React-jsi - React-jsiexecutor @@ -1738,17 +1651,15 @@ PODS: - React-RCTFBReactNativeSpec - React-RuntimeCore - React-runtimeexecutor - - React-RuntimeHermes - React-runtimescheduler - React-utils - React-RuntimeCore (0.79.5): - glog - - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - React-cxxreact - React-Fabric - React-featureflags - - React-hermes + - React-jsc - React-jserrorhandler - React-jsi - React-jsiexecutor @@ -1760,27 +1671,14 @@ PODS: - React-utils - React-runtimeexecutor (0.79.5): - React-jsi (= 0.79.5) - - React-RuntimeHermes (0.79.5): - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - React-featureflags - - React-hermes - - React-jsi - - React-jsinspector - - React-jsinspectortracing - - React-jsitooling - - React-jsitracing - - React-RuntimeCore - - React-utils - React-runtimescheduler (0.79.5): - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - React-callinvoker - React-cxxreact - React-debug - React-featureflags - - React-hermes + - React-jsc - React-jsi - React-jsinspectortracing - React-performancetimeline @@ -1792,17 +1690,15 @@ PODS: - React-timing (0.79.5) - React-utils (0.79.5): - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - React-debug - - React-hermes + - React-jsc - React-jsi (= 0.79.5) - ReactAppDependencyProvider (0.79.5): - ReactCodegen - ReactCodegen (0.79.5): - DoubleConversion - glog - - hermes-engine - RCT-Folly - RCTRequired - RCTTypeSafety @@ -1812,7 +1708,7 @@ PODS: - React-FabricImage - React-featureflags - React-graphics - - React-hermes + - React-jsc - React-jsi - React-jsiexecutor - React-NativeModulesApple @@ -1828,7 +1724,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - React-callinvoker (= 0.79.5) - React-cxxreact (= 0.79.5) @@ -1842,7 +1737,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - React-callinvoker (= 0.79.5) - React-cxxreact (= 0.79.5) @@ -1854,7 +1748,6 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - React-callinvoker (= 0.79.5) - React-cxxreact (= 0.79.5) @@ -1869,7 +1762,6 @@ PODS: - RNCAsyncStorage (2.2.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1878,8 +1770,31 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager + - React-jsc + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - RNDateTimePicker (8.4.4): + - DoubleConversion + - glog + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsc - React-jsi - React-NativeModulesApple - React-RCTFabric @@ -1893,7 +1808,6 @@ PODS: - RNGestureHandler (2.24.0): - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1902,8 +1816,8 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager + - React-jsc - React-jsi - React-NativeModulesApple - React-RCTFabric @@ -1917,7 +1831,6 @@ PODS: - RNReanimated (3.17.5): - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1926,8 +1839,8 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager + - React-jsc - React-jsi - React-NativeModulesApple - React-RCTFabric @@ -1943,7 +1856,6 @@ PODS: - RNReanimated/reanimated (3.17.5): - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1952,8 +1864,8 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager + - React-jsc - React-jsi - React-NativeModulesApple - React-RCTFabric @@ -1968,7 +1880,6 @@ PODS: - RNReanimated/reanimated/apple (3.17.5): - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -1977,8 +1888,8 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager + - React-jsc - React-jsi - React-NativeModulesApple - React-RCTFabric @@ -1992,7 +1903,6 @@ PODS: - RNReanimated/worklets (3.17.5): - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -2001,8 +1911,8 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager + - React-jsc - React-jsi - React-NativeModulesApple - React-RCTFabric @@ -2017,7 +1927,6 @@ PODS: - RNReanimated/worklets/apple (3.17.5): - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -2026,8 +1935,8 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager + - React-jsc - React-jsi - React-NativeModulesApple - React-RCTFabric @@ -2041,7 +1950,6 @@ PODS: - RNScreens (4.11.1): - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -2050,8 +1958,8 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager + - React-jsc - React-jsi - React-NativeModulesApple - React-RCTFabric @@ -2067,7 +1975,6 @@ PODS: - RNScreens/common (4.11.1): - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -2076,8 +1983,8 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager + - React-jsc - React-jsi - React-NativeModulesApple - React-RCTFabric @@ -2092,7 +1999,6 @@ PODS: - RNSVG (15.12.1): - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -2101,8 +2007,8 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager + - React-jsc - React-jsi - React-NativeModulesApple - React-RCTFabric @@ -2117,7 +2023,6 @@ PODS: - RNSVG/common (15.12.1): - DoubleConversion - glog - - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -2126,8 +2031,8 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager + - React-jsc - React-jsi - React-NativeModulesApple - React-RCTFabric @@ -2179,7 +2084,6 @@ DEPENDENCIES: - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`) - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCT-Folly/Fabric (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) @@ -2200,9 +2104,10 @@ DEPENDENCIES: - React-featureflags (from `../node_modules/react-native/ReactCommon/react/featureflags`) - React-featureflagsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`) - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`) - - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) - React-idlecallbacksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`) - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) + - React-jsc (from `../node_modules/react-native/ReactCommon/jsc`) + - React-jsc/Fabric (from `../node_modules/react-native/ReactCommon/jsc`) - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`) - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) @@ -2239,7 +2144,6 @@ DEPENDENCIES: - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`) - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) - - React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`) - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) - React-timing (from `../node_modules/react-native/ReactCommon/react/timing`) - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) @@ -2248,6 +2152,7 @@ DEPENDENCIES: - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - RNAppleHealthKit (from `../node_modules/react-native-health`) - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" + - "RNDateTimePicker (from `../node_modules/@react-native-community/datetimepicker`)" - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - RNReanimated (from `../node_modules/react-native-reanimated`) - RNScreens (from `../node_modules/react-native-screens`) @@ -2318,9 +2223,6 @@ EXTERNAL SOURCES: :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec" glog: :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" - hermes-engine: - :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" - :tag: hermes-2025-06-04-RNv0.79.3-7f9a871eefeb2c3852365ee80f0b6733ec12ac3b RCT-Folly: :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTDeprecation: @@ -2357,12 +2259,12 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/featureflags" React-graphics: :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" - React-hermes: - :path: "../node_modules/react-native/ReactCommon/hermes" React-idlecallbacksnativemodule: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" React-ImageManager: :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" + React-jsc: + :path: "../node_modules/react-native/ReactCommon/jsc" React-jserrorhandler: :path: "../node_modules/react-native/ReactCommon/jserrorhandler" React-jsi: @@ -2435,8 +2337,6 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/react/runtime" React-runtimeexecutor: :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" - React-RuntimeHermes: - :path: "../node_modules/react-native/ReactCommon/react/runtime" React-runtimescheduler: :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" React-timing: @@ -2453,6 +2353,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-health" RNCAsyncStorage: :path: "../node_modules/@react-native-async-storage/async-storage" + RNDateTimePicker: + :path: "../node_modules/@react-native-community/datetimepicker" RNGestureHandler: :path: "../node_modules/react-native-gesture-handler" RNReanimated: @@ -2469,7 +2371,7 @@ SPEC CHECKSUMS: DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb EXConstants: 98bcf0f22b820f9b28f9fee55ff2daededadd2f8 EXImageLoader: 4d3d3284141f1a45006cc4d0844061c182daf7ee - Expo: a40d525c930dd1c8a158e082756ee071955baccb + Expo: ad449665420b9fe5e907bd97e79aec2e47f98785 ExpoAppleAuthentication: 8a661b6f4936affafd830f983ac22463c936dad5 ExpoAsset: ef06e880126c375f580d4923fdd1cdf4ee6ee7d6 ExpoBlur: 3c8885b9bf9eef4309041ec87adec48b5f1986a9 @@ -2482,7 +2384,7 @@ SPEC CHECKSUMS: ExpoKeepAwake: bf0811570c8da182bfb879169437d4de298376e7 ExpoLinearGradient: 7734c8059972fcf691fb4330bcdf3390960a152d ExpoLinking: d5c183998ca6ada66ff45e407e0f965b398a8902 - ExpoModulesCore: 00a1b5c73248465bd0b93f59f8538c4573dac579 + ExpoModulesCore: 2c1a84ec154d32afb4f6569bc558f059ebbcdb8e ExpoSplashScreen: 0ad5acac1b5d2953c6e00d4319f16d616f70d4dd ExpoSymbols: c5612a90fb9179cdaebcd19bea9d8c69e5d3b859 ExpoSystemUI: c2724f9d5af6b1bb74e013efadf9c6a8fae547a2 @@ -2491,7 +2393,6 @@ SPEC CHECKSUMS: FBLazyVector: d2a9cd223302b6c9aa4aa34c1a775e9db609eb52 fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 - hermes-engine: f03b0e06d3882d71e67e45b073bb827da1a21aae libavif: 84bbb62fb232c3018d6f1bab79beea87e35de7b7 libdav1d: 23581a4d8ec811ff171ed5e2e05cd27bad64c39f libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 @@ -2501,47 +2402,47 @@ SPEC CHECKSUMS: RCTTypeSafety: cc4740278c2a52cbf740592b0a0a40df1587c9ab React: 6393ae1807614f017a84805bf2417e3497f518a6 React-callinvoker: c34f666f551f05a325b87e7e3e6df0e082fa3d99 - React-Core: 1ba9acdf7accbd46ccaae99999443ae2722c82b7 + React-Core: ca172125eac2dd15face8987b5a4b10d02787ca0 React-CoreModules: 3c3cf4a91257f138e3feb47169a2d7fe341b5495 - React-cxxreact: 444d518a5d3a933e029b5e5ca6d8127c2e43255c + React-cxxreact: a01e7fadf3130f360cde715c59622b1f4ce918b1 React-debug: a951cdb698321d78ebd955fc8788ebbe51af3519 - React-defaultsnativemodule: 35816c7cb315962495d815446b2c8f1f3d2396ad - React-domnativemodule: 94efa04e53aa12a6dc02d420f1564ee18f3059bd - React-Fabric: bb8ccdb10256fa8acfd98a189590e2e44878abd7 - React-FabricComponents: 60703b954ca7e3d09cdb8d6fff6a4118f3c1478f - React-FabricImage: 0a8cc153d20af111f966e14b3814faa692a6805d + React-defaultsnativemodule: c2b64a9a3d9690255c3adea1610a375dc6b17bb9 + React-domnativemodule: 7767eae984d30624241c07daaa1bde83d967011a + React-Fabric: 1cad8dedd49cb778ff3262e878c007a8154167b3 + React-FabricComponents: 6c5485057ece34a7714eec25c293798ac180a939 + React-FabricImage: 09c73186e42743438888e71cb71f005062de8406 React-featureflags: 32d776f9bef34bdab6218ad99db535e75e5c1f4e - React-featureflagsnativemodule: dd5e1e8579d7c3e10b31969c4ca2f56ba3743ec2 - React-graphics: bce95f01799245fa58ca35bdc06a98677b67352e - React-hermes: 9ec11ce5f88c0778e027aa06a6e3e6eb19ddae09 - React-idlecallbacksnativemodule: 9d125d1b9bb3e0bb4de334fea94228e6eeac1852 + React-featureflagsnativemodule: c486c632e00d30c7ae73bcfa2aa91bcd3ab17e8e + React-graphics: faec57e5281407c9cda2bee80c6fe04fa52f3625 + React-idlecallbacksnativemodule: 134151d52c9ae314a23c7daaf7a2b560256e6e0e React-ImageManager: c40cb4a131371ddecbabc618ef354c57c864c550 - React-jserrorhandler: c00e040f76b32a1846d7eb43602a78ad1e1f60d1 - React-jsi: 8f065aa1ae1d35bef3c394cb1663d114c4952fd8 - React-jsiexecutor: fc8e69fb870cb6e69920fd482a76d4ae54a1c40a - React-jsinspector: 42760714871594f021b3bf223f2f9ac350183ed3 + React-jsc: bb1609faba475d135bd5422103ae73db297d39d4 + React-jserrorhandler: 0dd472170bbace5363896496b38c4515af2939f7 + React-jsi: 8c1210e53cfc45d2a75cc0538c90dc7b2ede8674 + React-jsiexecutor: ff5051219ad3ed486a9946c44418e1556aa2e502 + React-jsinspector: 7713ce47b60c03f823f9f3ba1fdd331548d74333 React-jsinspectortracing: 237f149a09bab785ec6b3a15cc92fc51c0d15cc4 React-jsitooling: ef1fca866f14d8d4bd80a9570118c19e62775f96 React-jsitracing: cfa927f650c6f7da613da9fe2a6eeaebc6b2ad1b React-logger: 85fa3509931497c72ccd2547fcc91e7299d8591e React-Mapbuffer: 96a2f2a176268581733be182fa6eebab1c0193be - React-microtasksnativemodule: bda561d2648e1e52bd9e5a87f8889836bdbde2e2 - react-native-safe-area-context: 562163222d999b79a51577eda2ea8ad2c32b4d06 - react-native-webview: 520bcb79c3f2af91e157cdd695732a34ab5f25c8 - React-NativeModulesApple: 1ecb83880dd11baf2228f8dd89d8419c387e03ad + React-microtasksnativemodule: 11b292232f1626567a79d58136689f1b911c605f + react-native-safe-area-context: b0ee54c424896b916aab46212b884cb8794308d7 + react-native-webview: faccaeb84216940628d4422822d367ad03d15a81 + React-NativeModulesApple: 494c38599b82392ed14b2c0118fca162425bb618 React-oscompat: 0592889a9fcf0eacb205532028e4a364e22907dd React-perflogger: c584fa50e422a46f37404d083fad12eb289d5de4 React-performancetimeline: 8deae06fc819e6f7d1f834818e72ab5581540e45 React-RCTActionSheet: ce67bdc050cc1d9ef673c7a93e9799288a183f24 React-RCTAnimation: 8bb813eb29c6de85be99c62640f3a999df76ba02 - React-RCTAppDelegate: 0200dcd70e996a7061965cfa7f8c443013cc11a1 - React-RCTBlob: a1dd15758420b6a8154019c5c188cf90648bc487 - React-RCTFabric: c7825ff7180893c4213eae8d249b279fc6bf5253 - React-RCTFBReactNativeSpec: b42afeff81dfd0618a4d37c6c6cb99a66b93a363 + React-RCTAppDelegate: 4de5b1b68d9bc435bb7949fdde274895f12428c6 + React-RCTBlob: 4c6fa35aa8b2b4d46ff2e5fb80c2b26df9457e57 + React-RCTFabric: 05582e7dc62b2c393b054b39d1b4202e9dcbce68 + React-RCTFBReactNativeSpec: f5970e7ba0b15cf23c0552c82251aff9630a6acd React-RCTImage: 8a4f6ce18e73a7e894b886dfb7625e9e9fbc90ef React-RCTLinking: fa49c624cd63979e7a6295ae9b1351d23ac4395a React-RCTNetwork: f236fd2897d18522bba24453e2995a4c83e01024 - React-RCTRuntime: 6b9e893b1d375b7a733fe26c8781e8f062f52951 + React-RCTRuntime: f46f5c9890b77bbb38a536157d317a7a04a8825e React-RCTSettings: 69e2f25a5a1bf6cb37eef2e5c3bd4bb7e848296b React-RCTText: 515ce74ed79c31dbf509e6f12770420ebbf23755 React-RCTVibration: ef30ada606dfed859b2c71577f6f041d47f2cfbb @@ -2549,22 +2450,22 @@ SPEC CHECKSUMS: React-renderercss: 636c2fffff5334897fc7745442c5e450a90eb549 React-rendererdebug: 9c95cda4ebc6afb3b474924bb185b42ae317c02d React-rncore: 3eb6f7bdfd181bc26f9f3edc87f70eb1a68a2f3c - React-RuntimeApple: 2cf5c8e38bfccd0e6aa47e3f87a1a3e85ae7fb87 - React-RuntimeCore: 2f87f504ca55b4a2a6bda1ee50c144b33cce0a15 + React-RuntimeApple: e9e64dc1ecc2e7e5eccce80c60e3bae84d633662 + React-RuntimeCore: 5112170a09701386178248fe1968983f4bfc7738 React-runtimeexecutor: ebfd71307b3166c73ac0c441c1ea42e0f17f821d - React-RuntimeHermes: a8391605396019d1f72079d3c72e80fcdc79c6a2 - React-runtimescheduler: 158b956675f624b3d3158ffab8f711ebf54fb3a6 + React-runtimescheduler: 0bea8876abf599326dd2939ee878491ba81bb6a4 React-timing: acc3fa92c72dcc1de6300d752ebb84a1d55dc809 - React-utils: 525f1fe996874cff32a0ef8e523e31ebde23664d + React-utils: 8e44ae18bdf49dc09665de1e26721b0f43746cb8 ReactAppDependencyProvider: f3e842e6cb5a825b6918a74a38402ba1409411f8 - ReactCodegen: 6cb6e0d0b52471abc883541c76589d1c367c64c7 - ReactCommon: 1ab5451fc5da87c4cc4c3046e19a8054624ca763 + ReactCodegen: 272c9bc1a8a917bf557bd9d032a4b3e181c6abfe + ReactCommon: 7eb76fcd5133313d8c6a138a5c7dd89f80f189d5 RNAppleHealthKit: 86ef7ab70f762b802f5c5289372de360cca701f9 - RNCAsyncStorage: a1c8cc8a99c32de1244a9cf707bf9d83d0de0f71 - RNGestureHandler: 7d0931a61d7ba0259f32db0ba7d0963c3ed15d2b - RNReanimated: 2313402fe27fecb7237619e9c6fcee3177f08a65 - RNScreens: 482e9707f9826230810c92e765751af53826d509 - RNSVG: ba53827311fd9f8a14e06626365a749ce7713975 + RNCAsyncStorage: f4b48b7eb2ae9296be4df608ff60c1b12a469b7a + RNDateTimePicker: 41af3f0749ea5555f15805b468bc8453e6fa9850 + RNGestureHandler: 6bf8b210cbad95ced45f3f9b8df05924b3a97300 + RNReanimated: 79c239f5562adcf2406b681830f716f1e7d76081 + RNScreens: dd9a329b21412c5322a5447fc2c3ae6471cf6e5a + RNSVG: 820687c168d70d90a47d96a0cd5e263905fc67d9 SDWebImage: f29024626962457f3470184232766516dee8dfea SDWebImageAVIFCoder: 00310d246aab3232ce77f1d8f0076f8c4b021d90 SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c diff --git a/ios/Podfile.properties.json b/ios/Podfile.properties.json index 417e2e5..282473a 100644 --- a/ios/Podfile.properties.json +++ b/ios/Podfile.properties.json @@ -1,5 +1,5 @@ { - "expo.jsEngine": "hermes", + "expo.jsEngine": "jsc", "EX_DEV_CLIENT_NETWORK_INSPECTOR": "true", "newArchEnabled": "true" -} +} \ No newline at end of file diff --git a/ios/digitalpilates.xcodeproj/project.pbxproj b/ios/digitalpilates.xcodeproj/project.pbxproj index 1795b1c..745d981 100644 --- a/ios/digitalpilates.xcodeproj/project.pbxproj +++ b/ios/digitalpilates.xcodeproj/project.pbxproj @@ -145,7 +145,6 @@ 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */, - 761236F3114550442BC2DA44 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -258,24 +257,6 @@ shellPath = /bin/sh; shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-digitalpilates/expo-configure-project.sh\"\n"; }; - 761236F3114550442BC2DA44 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-digitalpilates/Pods-digitalpilates-frameworks.sh", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-digitalpilates/Pods-digitalpilates-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -461,7 +442,7 @@ REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; - USE_HERMES = true; + USE_HERMES = false; }; name = Debug; }; @@ -518,7 +499,7 @@ ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; - USE_HERMES = true; + USE_HERMES = false; VALIDATE_PRODUCT = YES; }; name = Release; diff --git a/ios/digitalpilates/Info.plist b/ios/digitalpilates/Info.plist index 56ab7c2..476e7a6 100644 --- a/ios/digitalpilates/Info.plist +++ b/ios/digitalpilates/Info.plist @@ -19,7 +19,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.0.0 + 1.0.2 CFBundleSignature ???? CFBundleURLTypes @@ -33,7 +33,7 @@ CFBundleVersion - 1 + 2 ITSAppUsesNonExemptEncryption LSMinimumSystemVersion diff --git a/package-lock.json b/package-lock.json index 73d726e..8de7cdc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "digital-pilates", - "version": "1.0.0", + "version": "1.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "digital-pilates", - "version": "1.0.0", + "version": "1.0.2", "dependencies": { "@expo/vector-icons": "^14.1.0", "@react-native-async-storage/async-storage": "^2.2.0", @@ -15,6 +15,7 @@ "@react-navigation/elements": "^2.3.8", "@react-navigation/native": "^7.1.6", "@reduxjs/toolkit": "^2.8.2", + "cos-js-sdk-v5": "^1.6.0", "dayjs": "^1.11.13", "expo": "~53.0.20", "expo-apple-authentication": "6.4.2", @@ -37,6 +38,7 @@ "react-native": "0.79.5", "react-native-gesture-handler": "~2.24.0", "react-native-health": "^1.19.0", + "react-native-image-viewing": "^0.2.2", "react-native-modal-datetime-picker": "^18.0.0", "react-native-reanimated": "~3.17.4", "react-native-safe-area-context": "5.4.0", @@ -5182,6 +5184,15 @@ "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", @@ -6776,6 +6787,28 @@ ], "license": "BSD-3-Clause" }, + "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", @@ -10691,6 +10724,16 @@ "node": ">=8.0" } }, + "node_modules/react-native-image-viewing": { + "version": "0.2.2", + "resolved": "https://mirrors.tencent.com/npm/react-native-image-viewing/-/react-native-image-viewing-0.2.2.tgz", + "integrity": "sha512-osWieG+p/d2NPbAyonOMubttajtYEYiRGQaJA54slFxZ69j1V4/dCmcrVQry47ktVKy8/qpFwCpW1eT6MH5T2Q==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.11.0", + "react-native": ">=0.61.3" + } + }, "node_modules/react-native-is-edge-to-edge": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.2.1.tgz", @@ -12197,6 +12240,17 @@ "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://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", diff --git a/package.json b/package.json index a25ff2d..a9e90a4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "digital-pilates", "main": "expo-router/entry", - "version": "1.0.0", + "version": "1.0.2", "scripts": { "start": "expo start", "reset-project": "node ./scripts/reset-project.js", @@ -11,6 +11,7 @@ "lint": "expo lint" }, "dependencies": { + "cos-js-sdk-v5": "^1.6.0", "@expo/vector-icons": "^14.1.0", "@react-native-async-storage/async-storage": "^2.2.0", "@react-native-community/datetimepicker": "^8.4.4", @@ -40,6 +41,7 @@ "react-native": "0.79.5", "react-native-gesture-handler": "~2.24.0", "react-native-health": "^1.19.0", + "react-native-image-viewing": "^0.2.2", "react-native-modal-datetime-picker": "^18.0.0", "react-native-reanimated": "~3.17.4", "react-native-safe-area-context": "5.4.0", @@ -57,4 +59,4 @@ "typescript": "~5.8.3" }, "private": true -} +} \ No newline at end of file diff --git a/services/cos.ts b/services/cos.ts new file mode 100644 index 0000000..96d6577 --- /dev/null +++ b/services/cos.ts @@ -0,0 +1,107 @@ +import { COS_BUCKET, COS_REGION } from '@/constants/Cos'; +import { api } from '@/services/api'; + +type CosCredential = { + credentials: { + tmpSecretId: string; + tmpSecretKey: string; + sessionToken: string; + }; + startTime?: number; + expiredTime?: number; +}; + +type UploadOptions = { + key: string; + body: any; + contentType?: string; + onProgress?: (progress: { percent: number }) => void; + signal?: AbortSignal; +}; + +let CosSdk: any | null = null; + +async function ensureCosSdk(): Promise { + if (CosSdk) return CosSdk; + // 动态导入避免影响首屏 + const mod = await import('cos-js-sdk-v5'); + CosSdk = mod.default ?? mod; + return CosSdk; +} + +async function fetchCredential(): Promise { + return await api.get('/users/cos-token'); +} + +export async function uploadToCos(options: UploadOptions): Promise<{ key: string; etag?: string; headers?: Record }> { + const { key, body, contentType, onProgress, signal } = options; + if (!COS_BUCKET || !COS_REGION) { + throw new Error('未配置 COS_BUCKET / COS_REGION'); + } + const COS = await ensureCosSdk(); + const cred = await fetchCredential(); + + const controller = new AbortController(); + if (signal) { + if (signal.aborted) controller.abort(); + signal.addEventListener('abort', () => controller.abort(), { once: true }); + } + + return await new Promise((resolve, reject) => { + const cos = new COS({ + getAuthorization: (_opts: any, cb: any) => { + cb({ + TmpSecretId: cred.credentials.tmpSecretId, + TmpSecretKey: cred.credentials.tmpSecretKey, + SecurityToken: cred.credentials.sessionToken, + StartTime: cred.startTime, + ExpiredTime: cred.expiredTime, + }); + }, + }); + + const task = cos.putObject( + { + Bucket: COS_BUCKET, + Region: COS_REGION, + Key: key, + Body: body, + ContentType: contentType, + onProgress: (progressData: any) => { + if (onProgress) { + const percent = progressData && progressData.percent ? progressData.percent : 0; + onProgress({ percent }); + } + }, + }, + (err: any, data: any) => { + if (err) return reject(err); + resolve({ key, etag: data && data.ETag, headers: data && data.headers }); + } + ); + + controller.signal.addEventListener('abort', () => { + try { task && task.cancel && task.cancel(); } catch { } + reject(new DOMException('Aborted', 'AbortError')); + }); + }); +} + +export async function uploadWithRetry(options: UploadOptions & { maxRetries?: number; backoffMs?: number }): Promise<{ key: string; etag?: string }> { + const { maxRetries = 2, backoffMs = 800, ...rest } = options; + let attempt = 0; + // 简单指数退避 + while (true) { + try { + return await uploadToCos(rest); + } catch (e: any) { + if (rest.signal?.aborted) throw e; + if (attempt >= maxRetries) throw e; + const wait = backoffMs * Math.pow(2, attempt); + await new Promise(r => setTimeout(r, wait)); + attempt++; + } + } +} + + diff --git a/types/react-native-svg.d.ts b/types/react-native-svg.d.ts index 556e2db..01a655f 100644 --- a/types/react-native-svg.d.ts +++ b/types/react-native-svg.d.ts @@ -34,6 +34,52 @@ declare module 'react-native-svg' { originY?: number; } export const G: React.ComponentType>; + + export interface DefsProps { } + export const Defs: React.ComponentType>; + + export interface LineProps extends CommonProps { + x1?: number | string; + y1?: number | string; + x2?: number | string; + y2?: number | string; + } + export const Line: React.ComponentType; + + export interface LinearGradientProps { + id?: string; + x1?: number | string; + y1?: number | string; + x2?: number | string; + y2?: number | string; + } + export const LinearGradient: React.ComponentType>; + + export interface StopProps { + offset?: number | string; + stopColor?: string; + stopOpacity?: number; + } + export const Stop: React.ComponentType; + + export interface PolygonProps extends CommonProps { + points?: string; + } + export const Polygon: React.ComponentType; + + export interface PathProps extends CommonProps { + d?: string; + } + export const Path: React.ComponentType; + + export interface TextProps extends CommonProps { + x?: number | string; + y?: number | string; + fontSize?: number | string; + fill?: string; + textAnchor?: 'start' | 'middle' | 'end'; + } + export const Text: React.ComponentType>; }