Compare commits
1 Commits
lei
...
ce48e54c03
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ce48e54c03 |
4
.gitignore
vendored
@@ -4,10 +4,6 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
*.pem
|
*.pem
|
||||||
|
|
||||||
# Python(运行产物)
|
|
||||||
__pycache__/
|
|
||||||
*.py[cod]
|
|
||||||
|
|
||||||
# Node / JS
|
# Node / JS
|
||||||
node_modules/
|
node_modules/
|
||||||
npm-debug.*
|
npm-debug.*
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"expo": {
|
"expo": {
|
||||||
"name": "client",
|
"name": "Hey Mama",
|
||||||
"slug": "client",
|
"slug": "hey-mama",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"orientation": "portrait",
|
"orientation": "portrait",
|
||||||
"icon": "./assets/images/icon.png",
|
"icon": "./assets/images/icon.png",
|
||||||
"scheme": "client",
|
"scheme": "heymama",
|
||||||
"userInterfaceStyle": "automatic",
|
"userInterfaceStyle": "automatic",
|
||||||
"newArchEnabled": true,
|
"newArchEnabled": true,
|
||||||
"splash": {
|
"splash": {
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
},
|
},
|
||||||
"ios": {
|
"ios": {
|
||||||
"supportsTablet": true,
|
"supportsTablet": true,
|
||||||
"bundleIdentifier": "com.anonymous.client"
|
"bundleIdentifier": "com.heymama.app"
|
||||||
},
|
},
|
||||||
"android": {
|
"android": {
|
||||||
"adaptiveIcon": {
|
"adaptiveIcon": {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useEffect, useLayoutEffect, useMemo, useState, useCallback, useRef } from 'react';
|
import { useEffect, useLayoutEffect, useMemo, useState, useCallback, useRef } from 'react';
|
||||||
import { StyleSheet, View, Dimensions, Text, Pressable, PanResponder, Animated as RNAnimated, ImageBackground } from 'react-native';
|
import { StyleSheet, View, Dimensions, Text, Pressable, PanResponder, Animated as RNAnimated } from 'react-native';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { useNavigation, useFocusEffect } from 'expo-router';
|
import { useNavigation, useFocusEffect } from 'expo-router';
|
||||||
import Animated, {
|
import Animated, {
|
||||||
@@ -39,40 +39,6 @@ import LikeIcon from '@/assets/images/icon/like_icon.svg';
|
|||||||
|
|
||||||
const { height: SCREEN_HEIGHT } = Dimensions.get('window');
|
const { height: SCREEN_HEIGHT } = Dimensions.get('window');
|
||||||
|
|
||||||
// 预定义风景图列表
|
|
||||||
const NATURE_IMAGES = [
|
|
||||||
require('@/assets/theme/nature/1.png'),
|
|
||||||
require('@/assets/theme/nature/2.png'),
|
|
||||||
require('@/assets/theme/nature/3.png'),
|
|
||||||
require('@/assets/theme/nature/4.png'),
|
|
||||||
require('@/assets/theme/nature/5.png'),
|
|
||||||
require('@/assets/theme/nature/6.png'),
|
|
||||||
require('@/assets/theme/nature/7.png'),
|
|
||||||
require('@/assets/theme/nature/8.png'),
|
|
||||||
require('@/assets/theme/nature/9.png'),
|
|
||||||
require('@/assets/theme/nature/10.png'),
|
|
||||||
require('@/assets/theme/nature/11.png'),
|
|
||||||
require('@/assets/theme/nature/12.png'),
|
|
||||||
require('@/assets/theme/nature/13.png'),
|
|
||||||
require('@/assets/theme/nature/14.png'),
|
|
||||||
require('@/assets/theme/nature/15.png'),
|
|
||||||
require('@/assets/theme/nature/17.png'),
|
|
||||||
require('@/assets/theme/nature/18.png'),
|
|
||||||
require('@/assets/theme/nature/19.png'),
|
|
||||||
require('@/assets/theme/nature/20.png'),
|
|
||||||
require('@/assets/theme/nature/22.png'),
|
|
||||||
];
|
|
||||||
|
|
||||||
// 预定义颜色列表
|
|
||||||
const THEME_COLORS = [
|
|
||||||
'#F7D9BF',
|
|
||||||
'#CBF2D8',
|
|
||||||
'#F5CDDE',
|
|
||||||
'#F2ECCB',
|
|
||||||
'#E2CBF2',
|
|
||||||
'#CBD9F2',
|
|
||||||
];
|
|
||||||
|
|
||||||
export default function HomeScreen() {
|
export default function HomeScreen() {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const navigation = useNavigation();
|
const navigation = useNavigation();
|
||||||
@@ -160,26 +126,12 @@ export default function HomeScreen() {
|
|||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const backgroundColor = useMemo(() => {
|
const backgroundColor = themeMode === 'color' ? '#F3D0E1' : '#F4D6C2';
|
||||||
if (themeMode === 'color') {
|
|
||||||
const colorIndex = Math.floor(index / 10) % THEME_COLORS.length;
|
|
||||||
return THEME_COLORS[colorIndex];
|
|
||||||
}
|
|
||||||
return '#F4D6C2'; // 风景模式下的默认底色(图片加载前显示)
|
|
||||||
}, [themeMode, index]);
|
|
||||||
|
|
||||||
// 计算当前应该显示的风景图索引(滑动 10 次切换一张)
|
|
||||||
const natureImageIndex = useMemo(() => {
|
|
||||||
return Math.floor(index / 10) % NATURE_IMAGES.length;
|
|
||||||
}, [index]);
|
|
||||||
|
|
||||||
const currentNatureImage = NATURE_IMAGES[natureImageIndex];
|
|
||||||
|
|
||||||
useLayoutEffect(() => {
|
useLayoutEffect(() => {
|
||||||
navigation.setOptions({
|
navigation.setOptions({
|
||||||
headerShadowVisible: false,
|
headerShadowVisible: false,
|
||||||
headerStyle: { backgroundColor: themeMode === 'scenery' ? 'transparent' : backgroundColor },
|
headerStyle: { backgroundColor },
|
||||||
headerTransparent: themeMode === 'scenery',
|
|
||||||
headerRight: () => (
|
headerRight: () => (
|
||||||
<View style={styles.headerRight}>
|
<View style={styles.headerRight}>
|
||||||
<CircleIconButton
|
<CircleIconButton
|
||||||
@@ -197,7 +149,7 @@ export default function HomeScreen() {
|
|||||||
</View>
|
</View>
|
||||||
),
|
),
|
||||||
});
|
});
|
||||||
}, [backgroundColor, themeMode, navigation, t]);
|
}, [backgroundColor, navigation, t]);
|
||||||
|
|
||||||
const textAnimatedStyle = useAnimatedStyle(() => ({
|
const textAnimatedStyle = useAnimatedStyle(() => ({
|
||||||
transform: [{ translateY: translateY.value }],
|
transform: [{ translateY: translateY.value }],
|
||||||
@@ -289,11 +241,10 @@ export default function HomeScreen() {
|
|||||||
|
|
||||||
// 2. 保存到收藏夹,包含当前背景信息
|
// 2. 保存到收藏夹,包含当前背景信息
|
||||||
await addFavorite({
|
await addFavorite({
|
||||||
favId: String(Date.now()), // 生成唯一 ID
|
id: typeof currentContentId === 'number' ? String(currentContentId) : (item as any).id,
|
||||||
id: item.id,
|
|
||||||
date: dateStr,
|
date: dateStr,
|
||||||
themeMode: themeMode,
|
themeMode: themeMode,
|
||||||
background: themeMode === 'scenery' ? String(natureImageIndex) : backgroundColor,
|
background: backgroundColor, // 目前存储的是颜色值
|
||||||
});
|
});
|
||||||
|
|
||||||
// 3. 爱心缩放动画
|
// 3. 爱心缩放动画
|
||||||
@@ -316,15 +267,8 @@ export default function HomeScreen() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={[styles.container, { backgroundColor }]} {...panResponder.panHandlers}>
|
<View style={[styles.container, { backgroundColor }]} {...panResponder.panHandlers}>
|
||||||
{themeMode === 'scenery' && (
|
<Animated.View style={[styles.card, textAnimatedStyle]}>
|
||||||
<ImageBackground
|
<Text style={styles.text}>{item.text}</Text>
|
||||||
source={currentNatureImage}
|
|
||||||
style={StyleSheet.absoluteFill}
|
|
||||||
resizeMode="cover"
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
<Animated.View style={[styles.card, textAnimatedStyle, themeMode === 'scenery' && styles.sceneryCard]}>
|
|
||||||
<Text style={[styles.text, themeMode === 'scenery' && styles.sceneryText]}>{item.text}</Text>
|
|
||||||
</Animated.View>
|
</Animated.View>
|
||||||
|
|
||||||
<View style={styles.actions}>
|
<View style={styles.actions}>
|
||||||
@@ -337,13 +281,9 @@ export default function HomeScreen() {
|
|||||||
style={styles.reactionInner}
|
style={styles.reactionInner}
|
||||||
>
|
>
|
||||||
{likeFilled ? (
|
{likeFilled ? (
|
||||||
<LikeFilledIcon width={35} height={36} style={{ color: '#EA6969' }} />
|
<LikeFilledIcon width={35} height={36} />
|
||||||
) : (
|
) : (
|
||||||
<LikeIcon
|
<LikeIcon width={35} height={36} />
|
||||||
width={35}
|
|
||||||
height={36}
|
|
||||||
style={{ color: themeMode === 'scenery' ? '#FFFFFF' : '#5E2A28' }}
|
|
||||||
/>
|
|
||||||
)}
|
)}
|
||||||
</Pressable>
|
</Pressable>
|
||||||
</Animated.View>
|
</Animated.View>
|
||||||
@@ -402,15 +342,9 @@ const styles = StyleSheet.create({
|
|||||||
justifyContent: 'center',
|
justifyContent: 'center',
|
||||||
},
|
},
|
||||||
card: {
|
card: {
|
||||||
position: 'absolute',
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
right: 0,
|
|
||||||
bottom: 0,
|
|
||||||
justifyContent: 'center',
|
|
||||||
alignItems: 'center',
|
|
||||||
paddingHorizontal: 30,
|
paddingHorizontal: 30,
|
||||||
zIndex: 5, // 降低层级,防止遮挡底部按钮
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
},
|
},
|
||||||
text: {
|
text: {
|
||||||
fontSize: 22,
|
fontSize: 22,
|
||||||
@@ -419,16 +353,6 @@ const styles = StyleSheet.create({
|
|||||||
fontWeight: '700',
|
fontWeight: '700',
|
||||||
textAlign: 'center',
|
textAlign: 'center',
|
||||||
},
|
},
|
||||||
sceneryCard: {
|
|
||||||
// 风景模式下稍微收窄文案宽度,增加呼吸感
|
|
||||||
paddingHorizontal: 50,
|
|
||||||
},
|
|
||||||
sceneryText: {
|
|
||||||
color: '#FFFFFF',
|
|
||||||
textShadowColor: 'rgba(0, 0, 0, 0.5)',
|
|
||||||
textShadowOffset: { width: 0, height: 1 },
|
|
||||||
textShadowRadius: 4,
|
|
||||||
},
|
|
||||||
actions: {
|
actions: {
|
||||||
position: 'absolute',
|
position: 'absolute',
|
||||||
bottom: SCREEN_HEIGHT * 0.16,
|
bottom: SCREEN_HEIGHT * 0.16,
|
||||||
@@ -436,7 +360,6 @@ const styles = StyleSheet.create({
|
|||||||
right: 0,
|
right: 0,
|
||||||
flexDirection: 'row',
|
flexDirection: 'row',
|
||||||
justifyContent: 'center',
|
justifyContent: 'center',
|
||||||
zIndex: 20, // 提升层级,确保在最顶层可点击
|
|
||||||
},
|
},
|
||||||
reactionButton: {
|
reactionButton: {
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
|
|||||||
@@ -140,13 +140,14 @@ export default function OnboardingScreen() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const onSkip = async () => {
|
const onSkip = () => {
|
||||||
// 跳过整个 Onboarding:仍生成一个“全跳过”的最小画像,保证下游可用
|
// 跳过整个 Onboarding:仍生成一个“全跳过”的最小画像,保证下游可用
|
||||||
const scoringProfile = buildUserProfileFromQuestionnaire({});
|
const scoringProfile = buildUserProfileFromQuestionnaire({});
|
||||||
await setUserProfileScoring(scoringProfile);
|
void setUserProfileScoring(scoringProfile);
|
||||||
|
|
||||||
// 标记已完成,避免下次启动再次进入 Onboarding
|
// 标记已完成,避免下次启动再次进入 Onboarding
|
||||||
await setOnboardingCompleted(true);
|
void setOnboardingCompleted(true);
|
||||||
|
|
||||||
router.replace('/(app)/home');
|
router.replace('/(app)/home');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { ActivityIndicator, StyleSheet, View } from 'react-native';
|
import { ActivityIndicator, StyleSheet, View } from 'react-native';
|
||||||
import { useRouter } from 'expo-router';
|
import { useRouter } from 'expo-router';
|
||||||
|
import AsyncStorage from '@react-native-async-storage/async-storage';
|
||||||
|
|
||||||
import { getOnboardingCompleted, getConsentAccepted } from '@/src/storage/appStorage';
|
import { getOnboardingCompleted, getConsentAccepted, setOnboardingCompleted, setConsentAccepted } from '@/src/storage/appStorage';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 启动分发:根据 consent 和 onboarding 状态跳转
|
* 启动分发:根据 consent 和 onboarding 状态跳转
|
||||||
@@ -13,6 +14,9 @@ export default function Index() {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
let cancelled = false;
|
let cancelled = false;
|
||||||
(async () => {
|
(async () => {
|
||||||
|
// 注意:不要在启动时无条件清空存储,否则 Onboarding/画像等数据无法持久化。
|
||||||
|
// 如需调试重置,请在开发期手动清空或自行加调试开关。
|
||||||
|
|
||||||
// 1. 检查是否同意协议
|
// 1. 检查是否同意协议
|
||||||
const consentAccepted = await getConsentAccepted();
|
const consentAccepted = await getConsentAccepted();
|
||||||
if (cancelled) return;
|
if (cancelled) return;
|
||||||
@@ -22,17 +26,9 @@ export default function Index() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. 检查 Onboarding 是否已完成
|
// 2. 检查 Onboarding
|
||||||
const completed = await getOnboardingCompleted();
|
const completed = await getOnboardingCompleted();
|
||||||
if (cancelled) return;
|
router.replace(completed ? '/(app)/home' : '/(onboarding)/onboarding');
|
||||||
|
|
||||||
if (completed) {
|
|
||||||
// 如果已经完成过流程,直接进 Home
|
|
||||||
router.replace('/(app)/home');
|
|
||||||
} else {
|
|
||||||
// 如果是首次进入(或未完成流程),进入 Onboarding
|
|
||||||
router.replace('/(onboarding)/onboarding');
|
|
||||||
}
|
|
||||||
})();
|
})();
|
||||||
return () => {
|
return () => {
|
||||||
cancelled = true;
|
cancelled = true;
|
||||||
@@ -49,3 +45,4 @@ export default function Index() {
|
|||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
container: { flex: 1, alignItems: 'center', justifyContent: 'center' },
|
container: { flex: 1, alignItems: 'center', justifyContent: 'center' },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 358 KiB |
|
Before Width: | Height: | Size: 629 KiB |
|
Before Width: | Height: | Size: 532 KiB |
|
Before Width: | Height: | Size: 127 KiB |
|
Before Width: | Height: | Size: 449 KiB |
|
Before Width: | Height: | Size: 525 KiB |
|
Before Width: | Height: | Size: 693 KiB |
|
Before Width: | Height: | Size: 458 KiB |
|
Before Width: | Height: | Size: 593 KiB |
|
Before Width: | Height: | Size: 414 KiB |
|
Before Width: | Height: | Size: 381 KiB |
|
Before Width: | Height: | Size: 461 KiB |
|
Before Width: | Height: | Size: 606 KiB |
|
Before Width: | Height: | Size: 384 KiB |
|
Before Width: | Height: | Size: 388 KiB |
|
Before Width: | Height: | Size: 236 KiB |
|
Before Width: | Height: | Size: 721 KiB |
|
Before Width: | Height: | Size: 358 KiB |
|
Before Width: | Height: | Size: 415 KiB |
|
Before Width: | Height: | Size: 214 KiB |
BIN
client/components/home/.ProfileModal.tsx.swp
Normal file
@@ -50,29 +50,6 @@ type Props = {
|
|||||||
type Page = 'root' | 'favorites' | 'dailyReminder' | 'widget' | 'language' | 'widgetHowTo';
|
type Page = 'root' | 'favorites' | 'dailyReminder' | 'widget' | 'language' | 'widgetHowTo';
|
||||||
type NavDirection = 'forward' | 'back';
|
type NavDirection = 'forward' | 'back';
|
||||||
|
|
||||||
const NATURE_IMAGES = [
|
|
||||||
require('@/assets/theme/nature/1.png'),
|
|
||||||
require('@/assets/theme/nature/2.png'),
|
|
||||||
require('@/assets/theme/nature/3.png'),
|
|
||||||
require('@/assets/theme/nature/4.png'),
|
|
||||||
require('@/assets/theme/nature/5.png'),
|
|
||||||
require('@/assets/theme/nature/6.png'),
|
|
||||||
require('@/assets/theme/nature/7.png'),
|
|
||||||
require('@/assets/theme/nature/8.png'),
|
|
||||||
require('@/assets/theme/nature/9.png'),
|
|
||||||
require('@/assets/theme/nature/10.png'),
|
|
||||||
require('@/assets/theme/nature/11.png'),
|
|
||||||
require('@/assets/theme/nature/12.png'),
|
|
||||||
require('@/assets/theme/nature/13.png'),
|
|
||||||
require('@/assets/theme/nature/14.png'),
|
|
||||||
require('@/assets/theme/nature/15.png'),
|
|
||||||
require('@/assets/theme/nature/17.png'),
|
|
||||||
require('@/assets/theme/nature/18.png'),
|
|
||||||
require('@/assets/theme/nature/19.png'),
|
|
||||||
require('@/assets/theme/nature/20.png'),
|
|
||||||
require('@/assets/theme/nature/22.png'),
|
|
||||||
];
|
|
||||||
|
|
||||||
export default function ProfileModal({ visible, name: propName, onClose }: Props) {
|
export default function ProfileModal({ visible, name: propName, onClose }: Props) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
@@ -283,11 +260,11 @@ function FavoritesPage({ visible, page }: { visible: boolean; page: Page }) {
|
|||||||
setFavorites(list);
|
setFavorites(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function handleRemove(favId: string) {
|
async function handleRemove(id: string) {
|
||||||
// 1. 调用存储层移除收藏
|
// 1. 调用存储层移除收藏
|
||||||
await removeFavorite(favId);
|
await removeFavorite(id);
|
||||||
// 2. 更新本地状态
|
// 2. 更新本地状态
|
||||||
setFavorites(prev => prev.filter(item => item.favId !== favId));
|
setFavorites(prev => prev.filter(item => item.id !== id));
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -297,7 +274,7 @@ function FavoritesPage({ visible, page }: { visible: boolean; page: Page }) {
|
|||||||
) : (
|
) : (
|
||||||
<FlatList
|
<FlatList
|
||||||
data={favorites}
|
data={favorites}
|
||||||
keyExtractor={(it) => it.favId}
|
keyExtractor={(it) => it.id}
|
||||||
contentContainerStyle={styles.favList}
|
contentContainerStyle={styles.favList}
|
||||||
showsVerticalScrollIndicator={false}
|
showsVerticalScrollIndicator={false}
|
||||||
renderItem={({ item }) => (
|
renderItem={({ item }) => (
|
||||||
@@ -313,30 +290,11 @@ function FavoritesPage({ visible, page }: { visible: boolean; page: Page }) {
|
|||||||
<View style={styles.favRight}>
|
<View style={styles.favRight}>
|
||||||
<View style={[
|
<View style={[
|
||||||
styles.favThumb,
|
styles.favThumb,
|
||||||
item.themeMode === 'scenery' ? {} : { backgroundColor: item.background }
|
{ backgroundColor: item.background } // 动态同步 Home 页的背景
|
||||||
]}>
|
]}>
|
||||||
{item.themeMode === 'scenery' ? (
|
<Text style={styles.favThumbText} numberOfLines={4}>{item.text}</Text>
|
||||||
<View style={StyleSheet.absoluteFill}>
|
|
||||||
<Image
|
|
||||||
source={NATURE_IMAGES[parseInt(item.background)]}
|
|
||||||
style={{
|
|
||||||
width: width * 0.6,
|
|
||||||
height: 800, // 假设原图较高,设置一个较大的高度
|
|
||||||
position: 'absolute',
|
|
||||||
bottom: 0, // 关键:将图片底部对齐容器底部
|
|
||||||
}}
|
|
||||||
resizeMode="cover"
|
|
||||||
/>
|
|
||||||
</View>
|
|
||||||
) : null}
|
|
||||||
<Text style={[
|
|
||||||
styles.favThumbText,
|
|
||||||
item.themeMode === 'scenery' && { color: '#FFFFFF', textShadowColor: 'rgba(0,0,0,0.5)', textShadowOffset: {width:0, height:1}, textShadowRadius: 3 }
|
|
||||||
]} numberOfLines={4}>
|
|
||||||
{item.text}
|
|
||||||
</Text>
|
|
||||||
<Pressable
|
<Pressable
|
||||||
onPress={() => handleRemove(item.favId)}
|
onPress={() => handleRemove(item.id)}
|
||||||
style={styles.favRemoveBtn}
|
style={styles.favRemoveBtn}
|
||||||
hitSlop={10}
|
hitSlop={10}
|
||||||
>
|
>
|
||||||
@@ -807,7 +765,6 @@ const styles = StyleSheet.create({
|
|||||||
position: 'relative',
|
position: 'relative',
|
||||||
borderWidth: 1,
|
borderWidth: 1,
|
||||||
borderColor: 'rgba(119, 47, 0, 0.05)',
|
borderColor: 'rgba(119, 47, 0, 0.05)',
|
||||||
overflow: 'hidden',
|
|
||||||
},
|
},
|
||||||
favThumbText: {
|
favThumbText: {
|
||||||
fontSize: 15,
|
fontSize: 15,
|
||||||
|
|||||||
BIN
client/components/ui/.SheetModal.tsx.swp
Normal file
@@ -3,9 +3,6 @@ PODS:
|
|||||||
- ExpoModulesCore
|
- ExpoModulesCore
|
||||||
- EXConstants (18.0.13):
|
- EXConstants (18.0.13):
|
||||||
- ExpoModulesCore
|
- ExpoModulesCore
|
||||||
- EXJSONUtils (0.15.0)
|
|
||||||
- EXManifests (1.0.10):
|
|
||||||
- ExpoModulesCore
|
|
||||||
- EXNotifications (0.32.16):
|
- EXNotifications (0.32.16):
|
||||||
- ExpoModulesCore
|
- ExpoModulesCore
|
||||||
- Expo (54.0.32):
|
- Expo (54.0.32):
|
||||||
@@ -33,177 +30,6 @@ PODS:
|
|||||||
- ReactCommon/turbomodule/core
|
- ReactCommon/turbomodule/core
|
||||||
- ReactNativeDependencies
|
- ReactNativeDependencies
|
||||||
- Yoga
|
- Yoga
|
||||||
- expo-dev-client (6.0.20):
|
|
||||||
- EXManifests
|
|
||||||
- expo-dev-launcher
|
|
||||||
- expo-dev-menu
|
|
||||||
- expo-dev-menu-interface
|
|
||||||
- EXUpdatesInterface
|
|
||||||
- expo-dev-launcher (6.0.20):
|
|
||||||
- EXManifests
|
|
||||||
- expo-dev-launcher/Main (= 6.0.20)
|
|
||||||
- expo-dev-menu
|
|
||||||
- expo-dev-menu-interface
|
|
||||||
- ExpoModulesCore
|
|
||||||
- EXUpdatesInterface
|
|
||||||
- hermes-engine
|
|
||||||
- RCTRequired
|
|
||||||
- RCTTypeSafety
|
|
||||||
- React-Core
|
|
||||||
- React-Core-prebuilt
|
|
||||||
- React-debug
|
|
||||||
- React-Fabric
|
|
||||||
- React-featureflags
|
|
||||||
- React-graphics
|
|
||||||
- React-ImageManager
|
|
||||||
- React-jsi
|
|
||||||
- React-jsinspector
|
|
||||||
- React-NativeModulesApple
|
|
||||||
- React-RCTAppDelegate
|
|
||||||
- React-RCTFabric
|
|
||||||
- React-renderercss
|
|
||||||
- React-rendererdebug
|
|
||||||
- React-utils
|
|
||||||
- ReactAppDependencyProvider
|
|
||||||
- ReactCodegen
|
|
||||||
- ReactCommon/turbomodule/bridging
|
|
||||||
- ReactCommon/turbomodule/core
|
|
||||||
- ReactNativeDependencies
|
|
||||||
- Yoga
|
|
||||||
- expo-dev-launcher/Main (6.0.20):
|
|
||||||
- EXManifests
|
|
||||||
- expo-dev-launcher/Unsafe
|
|
||||||
- expo-dev-menu
|
|
||||||
- expo-dev-menu-interface
|
|
||||||
- ExpoModulesCore
|
|
||||||
- EXUpdatesInterface
|
|
||||||
- hermes-engine
|
|
||||||
- RCTRequired
|
|
||||||
- RCTTypeSafety
|
|
||||||
- React-Core
|
|
||||||
- React-Core-prebuilt
|
|
||||||
- React-debug
|
|
||||||
- React-Fabric
|
|
||||||
- React-featureflags
|
|
||||||
- React-graphics
|
|
||||||
- React-ImageManager
|
|
||||||
- React-jsi
|
|
||||||
- React-jsinspector
|
|
||||||
- React-NativeModulesApple
|
|
||||||
- React-RCTAppDelegate
|
|
||||||
- React-RCTFabric
|
|
||||||
- React-renderercss
|
|
||||||
- React-rendererdebug
|
|
||||||
- React-utils
|
|
||||||
- ReactAppDependencyProvider
|
|
||||||
- ReactCodegen
|
|
||||||
- ReactCommon/turbomodule/bridging
|
|
||||||
- ReactCommon/turbomodule/core
|
|
||||||
- ReactNativeDependencies
|
|
||||||
- Yoga
|
|
||||||
- expo-dev-launcher/Unsafe (6.0.20):
|
|
||||||
- EXManifests
|
|
||||||
- expo-dev-menu
|
|
||||||
- expo-dev-menu-interface
|
|
||||||
- ExpoModulesCore
|
|
||||||
- EXUpdatesInterface
|
|
||||||
- hermes-engine
|
|
||||||
- RCTRequired
|
|
||||||
- RCTTypeSafety
|
|
||||||
- React-Core
|
|
||||||
- React-Core-prebuilt
|
|
||||||
- React-debug
|
|
||||||
- React-Fabric
|
|
||||||
- React-featureflags
|
|
||||||
- React-graphics
|
|
||||||
- React-ImageManager
|
|
||||||
- React-jsi
|
|
||||||
- React-jsinspector
|
|
||||||
- React-NativeModulesApple
|
|
||||||
- React-RCTAppDelegate
|
|
||||||
- React-RCTFabric
|
|
||||||
- React-renderercss
|
|
||||||
- React-rendererdebug
|
|
||||||
- React-utils
|
|
||||||
- ReactAppDependencyProvider
|
|
||||||
- ReactCodegen
|
|
||||||
- ReactCommon/turbomodule/bridging
|
|
||||||
- ReactCommon/turbomodule/core
|
|
||||||
- ReactNativeDependencies
|
|
||||||
- Yoga
|
|
||||||
- expo-dev-menu (7.0.18):
|
|
||||||
- expo-dev-menu/Main (= 7.0.18)
|
|
||||||
- expo-dev-menu/ReactNativeCompatibles (= 7.0.18)
|
|
||||||
- hermes-engine
|
|
||||||
- RCTRequired
|
|
||||||
- RCTTypeSafety
|
|
||||||
- React-Core
|
|
||||||
- React-Core-prebuilt
|
|
||||||
- React-debug
|
|
||||||
- React-Fabric
|
|
||||||
- React-featureflags
|
|
||||||
- React-graphics
|
|
||||||
- React-ImageManager
|
|
||||||
- React-jsi
|
|
||||||
- React-NativeModulesApple
|
|
||||||
- React-RCTFabric
|
|
||||||
- React-renderercss
|
|
||||||
- React-rendererdebug
|
|
||||||
- React-utils
|
|
||||||
- ReactCodegen
|
|
||||||
- ReactCommon/turbomodule/bridging
|
|
||||||
- ReactCommon/turbomodule/core
|
|
||||||
- ReactNativeDependencies
|
|
||||||
- Yoga
|
|
||||||
- expo-dev-menu-interface (2.0.0)
|
|
||||||
- expo-dev-menu/Main (7.0.18):
|
|
||||||
- EXManifests
|
|
||||||
- expo-dev-menu-interface
|
|
||||||
- ExpoModulesCore
|
|
||||||
- hermes-engine
|
|
||||||
- RCTRequired
|
|
||||||
- RCTTypeSafety
|
|
||||||
- React-Core
|
|
||||||
- React-Core-prebuilt
|
|
||||||
- React-debug
|
|
||||||
- React-Fabric
|
|
||||||
- React-featureflags
|
|
||||||
- React-graphics
|
|
||||||
- React-ImageManager
|
|
||||||
- React-jsi
|
|
||||||
- React-jsinspector
|
|
||||||
- React-NativeModulesApple
|
|
||||||
- React-RCTFabric
|
|
||||||
- React-renderercss
|
|
||||||
- React-rendererdebug
|
|
||||||
- React-utils
|
|
||||||
- ReactCodegen
|
|
||||||
- ReactCommon/turbomodule/bridging
|
|
||||||
- ReactCommon/turbomodule/core
|
|
||||||
- ReactNativeDependencies
|
|
||||||
- Yoga
|
|
||||||
- expo-dev-menu/ReactNativeCompatibles (7.0.18):
|
|
||||||
- hermes-engine
|
|
||||||
- RCTRequired
|
|
||||||
- RCTTypeSafety
|
|
||||||
- React-Core
|
|
||||||
- React-Core-prebuilt
|
|
||||||
- React-debug
|
|
||||||
- React-Fabric
|
|
||||||
- React-featureflags
|
|
||||||
- React-graphics
|
|
||||||
- React-ImageManager
|
|
||||||
- React-jsi
|
|
||||||
- React-NativeModulesApple
|
|
||||||
- React-RCTFabric
|
|
||||||
- React-renderercss
|
|
||||||
- React-rendererdebug
|
|
||||||
- React-utils
|
|
||||||
- ReactCodegen
|
|
||||||
- ReactCommon/turbomodule/bridging
|
|
||||||
- ReactCommon/turbomodule/core
|
|
||||||
- ReactNativeDependencies
|
|
||||||
- Yoga
|
|
||||||
- ExpoAsset (12.0.12):
|
- ExpoAsset (12.0.12):
|
||||||
- ExpoModulesCore
|
- ExpoModulesCore
|
||||||
- ExpoFileSystem (19.0.21):
|
- ExpoFileSystem (19.0.21):
|
||||||
@@ -248,8 +74,6 @@ PODS:
|
|||||||
- ExpoModulesCore
|
- ExpoModulesCore
|
||||||
- ExpoWebBrowser (15.0.10):
|
- ExpoWebBrowser (15.0.10):
|
||||||
- ExpoModulesCore
|
- ExpoModulesCore
|
||||||
- EXUpdatesInterface (2.0.0):
|
|
||||||
- ExpoModulesCore
|
|
||||||
- FBLazyVector (0.81.5)
|
- FBLazyVector (0.81.5)
|
||||||
- hermes-engine (0.81.5):
|
- hermes-engine (0.81.5):
|
||||||
- hermes-engine/Pre-built (= 0.81.5)
|
- hermes-engine/Pre-built (= 0.81.5)
|
||||||
@@ -1974,28 +1798,6 @@ PODS:
|
|||||||
- ReactCommon/turbomodule/core
|
- ReactCommon/turbomodule/core
|
||||||
- ReactNativeDependencies
|
- ReactNativeDependencies
|
||||||
- Yoga
|
- Yoga
|
||||||
- RNGestureHandler (2.30.0):
|
|
||||||
- hermes-engine
|
|
||||||
- RCTRequired
|
|
||||||
- RCTTypeSafety
|
|
||||||
- React-Core
|
|
||||||
- React-Core-prebuilt
|
|
||||||
- React-debug
|
|
||||||
- React-Fabric
|
|
||||||
- React-featureflags
|
|
||||||
- React-graphics
|
|
||||||
- React-ImageManager
|
|
||||||
- React-jsi
|
|
||||||
- React-NativeModulesApple
|
|
||||||
- React-RCTFabric
|
|
||||||
- React-renderercss
|
|
||||||
- React-rendererdebug
|
|
||||||
- React-utils
|
|
||||||
- ReactCodegen
|
|
||||||
- ReactCommon/turbomodule/bridging
|
|
||||||
- ReactCommon/turbomodule/core
|
|
||||||
- ReactNativeDependencies
|
|
||||||
- Yoga
|
|
||||||
- RNReanimated (4.1.6):
|
- RNReanimated (4.1.6):
|
||||||
- hermes-engine
|
- hermes-engine
|
||||||
- RCTRequired
|
- RCTRequired
|
||||||
@@ -2238,26 +2040,19 @@ PODS:
|
|||||||
DEPENDENCIES:
|
DEPENDENCIES:
|
||||||
- "EXApplication (from `../node_modules/.pnpm/expo-application@7.0.8_expo@54.0.32/node_modules/expo-application/ios`)"
|
- "EXApplication (from `../node_modules/.pnpm/expo-application@7.0.8_expo@54.0.32/node_modules/expo-application/ios`)"
|
||||||
- "EXConstants (from `../node_modules/.pnpm/expo-constants@18.0.13_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0_/node_modules/expo-constants/ios`)"
|
- "EXConstants (from `../node_modules/.pnpm/expo-constants@18.0.13_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0_/node_modules/expo-constants/ios`)"
|
||||||
- "EXJSONUtils (from `../node_modules/.pnpm/expo-json-utils@0.15.0/node_modules/expo-json-utils/ios`)"
|
- "EXNotifications (from `../node_modules/.pnpm/expo-notifications@0.32.16_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@1_nvlvke5tn7wk5pigfsu7j4ieeq/node_modules/expo-notifications/ios`)"
|
||||||
- "EXManifests (from `../node_modules/.pnpm/expo-manifests@1.0.10_expo@54.0.32/node_modules/expo-manifests/ios`)"
|
- "Expo (from `../node_modules/.pnpm/expo@54.0.32_@babel+core@7.28.6_@expo+metro-runtime@6.1.2_expo-router@6.0.22_react-native@0.8_7rhpxisdkrzvrgzbu7ct455kta/node_modules/expo`)"
|
||||||
- "EXNotifications (from `../node_modules/.pnpm/expo-notifications@0.32.16_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+r_758952db70529f49bda448def1c13c49/node_modules/expo-notifications/ios`)"
|
|
||||||
- "Expo (from `../node_modules/.pnpm/expo@54.0.32_@babel+core@7.28.6_@expo+metro-runtime@6.1.2_expo-router@6.0.22_react-nati_18ad48ba284ee86e6eb1cb0f939697b0/node_modules/expo`)"
|
|
||||||
- "expo-dev-client (from `../node_modules/.pnpm/expo-dev-client@6.0.20_expo@54.0.32/node_modules/expo-dev-client/ios`)"
|
|
||||||
- "expo-dev-launcher (from `../node_modules/.pnpm/expo-dev-launcher@6.0.20_expo@54.0.32/node_modules/expo-dev-launcher`)"
|
|
||||||
- "expo-dev-menu (from `../node_modules/.pnpm/expo-dev-menu@7.0.18_expo@54.0.32/node_modules/expo-dev-menu`)"
|
|
||||||
- "expo-dev-menu-interface (from `../node_modules/.pnpm/expo-dev-menu-interface@2.0.0_expo@54.0.32/node_modules/expo-dev-menu-interface/ios`)"
|
|
||||||
- "ExpoAsset (from `../node_modules/.pnpm/expo-asset@12.0.12_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/expo-asset/ios`)"
|
- "ExpoAsset (from `../node_modules/.pnpm/expo-asset@12.0.12_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/expo-asset/ios`)"
|
||||||
- "ExpoFileSystem (from `../node_modules/.pnpm/expo-file-system@19.0.21_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0_/node_modules/expo-file-system/ios`)"
|
- "ExpoFileSystem (from `../node_modules/.pnpm/expo-file-system@19.0.21_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0_/node_modules/expo-file-system/ios`)"
|
||||||
- "ExpoFont (from `../node_modules/.pnpm/expo-font@14.0.11_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/expo-font/ios`)"
|
- "ExpoFont (from `../node_modules/.pnpm/expo-font@14.0.11_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/expo-font/ios`)"
|
||||||
- "ExpoHead (from `../node_modules/.pnpm/expo-router@6.0.22_@expo+metro-runtime@6.1.2_@types+react@19.1.17_expo-constants@18.0.1_bd9aa16746ed7110429f931eb008e6d2/node_modules/expo-router/ios`)"
|
- "ExpoHead (from `../node_modules/.pnpm/expo-router@6.0.22_@expo+metro-runtime@6.1.2_@types+react@19.1.17_expo-constants@18.0.13_expo_rjurfbyy5kjn57nkkfxix5iqea/node_modules/expo-router/ios`)"
|
||||||
- "ExpoKeepAwake (from `../node_modules/.pnpm/expo-keep-awake@15.0.8_expo@54.0.32_react@19.1.0/node_modules/expo-keep-awake/ios`)"
|
- "ExpoKeepAwake (from `../node_modules/.pnpm/expo-keep-awake@15.0.8_expo@54.0.32_react@19.1.0/node_modules/expo-keep-awake/ios`)"
|
||||||
- "ExpoLinearGradient (from `../node_modules/.pnpm/expo-linear-gradient@15.0.8_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+_53aef72480df9baa4504f4743d9c64bb/node_modules/expo-linear-gradient/ios`)"
|
- "ExpoLinearGradient (from `../node_modules/.pnpm/expo-linear-gradient@15.0.8_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@_e6k2hjkd5k4lph2ersbp3gfshy/node_modules/expo-linear-gradient/ios`)"
|
||||||
- "ExpoLinking (from `../node_modules/.pnpm/expo-linking@8.0.11_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/expo-linking/ios`)"
|
- "ExpoLinking (from `../node_modules/.pnpm/expo-linking@8.0.11_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/expo-linking/ios`)"
|
||||||
- "ExpoLocalization (from `../node_modules/.pnpm/expo-localization@17.0.8_expo@54.0.32_react@19.1.0/node_modules/expo-localization/ios`)"
|
- "ExpoLocalization (from `../node_modules/.pnpm/expo-localization@17.0.8_expo@54.0.32_react@19.1.0/node_modules/expo-localization/ios`)"
|
||||||
- "ExpoModulesCore (from `../node_modules/.pnpm/expo-modules-core@3.0.29_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/expo-modules-core`)"
|
- "ExpoModulesCore (from `../node_modules/.pnpm/expo-modules-core@3.0.29_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/expo-modules-core`)"
|
||||||
- "ExpoSplashScreen (from `../node_modules/.pnpm/expo-splash-screen@31.0.13_expo@54.0.32/node_modules/expo-splash-screen/ios`)"
|
- "ExpoSplashScreen (from `../node_modules/.pnpm/expo-splash-screen@31.0.13_expo@54.0.32/node_modules/expo-splash-screen/ios`)"
|
||||||
- "ExpoWebBrowser (from `../node_modules/.pnpm/expo-web-browser@15.0.10_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0_/node_modules/expo-web-browser/ios`)"
|
- "ExpoWebBrowser (from `../node_modules/.pnpm/expo-web-browser@15.0.10_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0_/node_modules/expo-web-browser/ios`)"
|
||||||
- "EXUpdatesInterface (from `../node_modules/.pnpm/expo-updates-interface@2.0.0_expo@54.0.32/node_modules/expo-updates-interface/ios`)"
|
|
||||||
- "FBLazyVector (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/FBLazyVector`)"
|
- "FBLazyVector (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/FBLazyVector`)"
|
||||||
- "hermes-engine (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`)"
|
- "hermes-engine (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`)"
|
||||||
- "RCTDeprecation (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`)"
|
- "RCTDeprecation (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`)"
|
||||||
@@ -2294,7 +2089,7 @@ DEPENDENCIES:
|
|||||||
- "React-logger (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/logger`)"
|
- "React-logger (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/logger`)"
|
||||||
- "React-Mapbuffer (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon`)"
|
- "React-Mapbuffer (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon`)"
|
||||||
- "React-microtasksnativemodule (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/nativemodule/microtasks`)"
|
- "React-microtasksnativemodule (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/nativemodule/microtasks`)"
|
||||||
- "react-native-safe-area-context (from `../node_modules/.pnpm/react-native-safe-area-context@5.6.2_react-native@0.81.5_@babel+core@7.28.6_@types+reac_14122a3aa345cfabcc022a0f638ef16d/node_modules/react-native-safe-area-context`)"
|
- "react-native-safe-area-context (from `../node_modules/.pnpm/react-native-safe-area-context@5.6.2_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1_azuxgonsvxb2yngtegtuvyxcpi/node_modules/react-native-safe-area-context`)"
|
||||||
- "React-NativeModulesApple (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`)"
|
- "React-NativeModulesApple (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`)"
|
||||||
- "React-oscompat (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/oscompat`)"
|
- "React-oscompat (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/oscompat`)"
|
||||||
- "React-perflogger (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/reactperflogger`)"
|
- "React-perflogger (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/reactperflogger`)"
|
||||||
@@ -2326,12 +2121,11 @@ DEPENDENCIES:
|
|||||||
- ReactCodegen (from `build/generated/ios`)
|
- ReactCodegen (from `build/generated/ios`)
|
||||||
- "ReactCommon/turbomodule/core (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon`)"
|
- "ReactCommon/turbomodule/core (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon`)"
|
||||||
- "ReactNativeDependencies (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec`)"
|
- "ReactNativeDependencies (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec`)"
|
||||||
- "RNCAsyncStorage (from `../node_modules/.pnpm/@react-native-async-storage+async-storage@2.2.0_react-native@0.81.5_@babel+core@7.28.6__ce3c4972004f3d6791573ec5b64bee38/node_modules/@react-native-async-storage/async-storage`)"
|
- "RNCAsyncStorage (from `../node_modules/.pnpm/@react-native-async-storage+async-storage@2.2.0_react-native@0.81.5_@babel+core@7.28.6_@types_fp4qq3a7mejmut52v6jrlvxlzi/node_modules/@react-native-async-storage/async-storage`)"
|
||||||
- "RNGestureHandler (from `../node_modules/.pnpm/react-native-gesture-handler@2.30.0_react-native@0.81.5_@babel+core@7.28.6_@types+react_39cf7da47c9c8531caaa923ee740e293/node_modules/react-native-gesture-handler`)"
|
- "RNReanimated (from `../node_modules/.pnpm/react-native-reanimated@4.1.6_@babel+core@7.28.6_react-native-worklets@0.5.1_@babel+core@7.28_ky3sbxf6i7nkyacc2hzg3xcz4q/node_modules/react-native-reanimated`)"
|
||||||
- "RNReanimated (from `../node_modules/.pnpm/react-native-reanimated@4.1.6_@babel+core@7.28.6_react-native-worklets@0.5.1_@babel+cor_c7c888bd389fb93c9cfe2d3c1c8b0777/node_modules/react-native-reanimated`)"
|
|
||||||
- "RNScreens (from `../node_modules/.pnpm/react-native-screens@4.16.0_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/react-native-screens`)"
|
- "RNScreens (from `../node_modules/.pnpm/react-native-screens@4.16.0_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/react-native-screens`)"
|
||||||
- "RNSVG (from `../node_modules/.pnpm/react-native-svg@15.12.1_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/react-native-svg`)"
|
- "RNSVG (from `../node_modules/.pnpm/react-native-svg@15.12.1_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/react-native-svg`)"
|
||||||
- "RNWorklets (from `../node_modules/.pnpm/react-native-worklets@0.5.1_@babel+core@7.28.6_react-native@0.81.5_@babel+core@7.28.6_@_40f69326ce21d3f9f6d74d3965fd9adf/node_modules/react-native-worklets`)"
|
- "RNWorklets (from `../node_modules/.pnpm/react-native-worklets@0.5.1_@babel+core@7.28.6_react-native@0.81.5_@babel+core@7.28.6_@types+_5atwepuw3zy3crkgvetf35tkve/node_modules/react-native-worklets`)"
|
||||||
- "Yoga (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/yoga`)"
|
- "Yoga (from `../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/yoga`)"
|
||||||
|
|
||||||
EXTERNAL SOURCES:
|
EXTERNAL SOURCES:
|
||||||
@@ -2339,22 +2133,10 @@ EXTERNAL SOURCES:
|
|||||||
:path: "../node_modules/.pnpm/expo-application@7.0.8_expo@54.0.32/node_modules/expo-application/ios"
|
:path: "../node_modules/.pnpm/expo-application@7.0.8_expo@54.0.32/node_modules/expo-application/ios"
|
||||||
EXConstants:
|
EXConstants:
|
||||||
:path: "../node_modules/.pnpm/expo-constants@18.0.13_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0_/node_modules/expo-constants/ios"
|
:path: "../node_modules/.pnpm/expo-constants@18.0.13_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0_/node_modules/expo-constants/ios"
|
||||||
EXJSONUtils:
|
|
||||||
:path: "../node_modules/.pnpm/expo-json-utils@0.15.0/node_modules/expo-json-utils/ios"
|
|
||||||
EXManifests:
|
|
||||||
:path: "../node_modules/.pnpm/expo-manifests@1.0.10_expo@54.0.32/node_modules/expo-manifests/ios"
|
|
||||||
EXNotifications:
|
EXNotifications:
|
||||||
:path: "../node_modules/.pnpm/expo-notifications@0.32.16_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+r_758952db70529f49bda448def1c13c49/node_modules/expo-notifications/ios"
|
:path: "../node_modules/.pnpm/expo-notifications@0.32.16_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@1_nvlvke5tn7wk5pigfsu7j4ieeq/node_modules/expo-notifications/ios"
|
||||||
Expo:
|
Expo:
|
||||||
:path: "../node_modules/.pnpm/expo@54.0.32_@babel+core@7.28.6_@expo+metro-runtime@6.1.2_expo-router@6.0.22_react-nati_18ad48ba284ee86e6eb1cb0f939697b0/node_modules/expo"
|
:path: "../node_modules/.pnpm/expo@54.0.32_@babel+core@7.28.6_@expo+metro-runtime@6.1.2_expo-router@6.0.22_react-native@0.8_7rhpxisdkrzvrgzbu7ct455kta/node_modules/expo"
|
||||||
expo-dev-client:
|
|
||||||
:path: "../node_modules/.pnpm/expo-dev-client@6.0.20_expo@54.0.32/node_modules/expo-dev-client/ios"
|
|
||||||
expo-dev-launcher:
|
|
||||||
:path: "../node_modules/.pnpm/expo-dev-launcher@6.0.20_expo@54.0.32/node_modules/expo-dev-launcher"
|
|
||||||
expo-dev-menu:
|
|
||||||
:path: "../node_modules/.pnpm/expo-dev-menu@7.0.18_expo@54.0.32/node_modules/expo-dev-menu"
|
|
||||||
expo-dev-menu-interface:
|
|
||||||
:path: "../node_modules/.pnpm/expo-dev-menu-interface@2.0.0_expo@54.0.32/node_modules/expo-dev-menu-interface/ios"
|
|
||||||
ExpoAsset:
|
ExpoAsset:
|
||||||
:path: "../node_modules/.pnpm/expo-asset@12.0.12_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/expo-asset/ios"
|
:path: "../node_modules/.pnpm/expo-asset@12.0.12_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/expo-asset/ios"
|
||||||
ExpoFileSystem:
|
ExpoFileSystem:
|
||||||
@@ -2362,11 +2144,11 @@ EXTERNAL SOURCES:
|
|||||||
ExpoFont:
|
ExpoFont:
|
||||||
:path: "../node_modules/.pnpm/expo-font@14.0.11_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/expo-font/ios"
|
:path: "../node_modules/.pnpm/expo-font@14.0.11_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/expo-font/ios"
|
||||||
ExpoHead:
|
ExpoHead:
|
||||||
:path: "../node_modules/.pnpm/expo-router@6.0.22_@expo+metro-runtime@6.1.2_@types+react@19.1.17_expo-constants@18.0.1_bd9aa16746ed7110429f931eb008e6d2/node_modules/expo-router/ios"
|
:path: "../node_modules/.pnpm/expo-router@6.0.22_@expo+metro-runtime@6.1.2_@types+react@19.1.17_expo-constants@18.0.13_expo_rjurfbyy5kjn57nkkfxix5iqea/node_modules/expo-router/ios"
|
||||||
ExpoKeepAwake:
|
ExpoKeepAwake:
|
||||||
:path: "../node_modules/.pnpm/expo-keep-awake@15.0.8_expo@54.0.32_react@19.1.0/node_modules/expo-keep-awake/ios"
|
:path: "../node_modules/.pnpm/expo-keep-awake@15.0.8_expo@54.0.32_react@19.1.0/node_modules/expo-keep-awake/ios"
|
||||||
ExpoLinearGradient:
|
ExpoLinearGradient:
|
||||||
:path: "../node_modules/.pnpm/expo-linear-gradient@15.0.8_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+_53aef72480df9baa4504f4743d9c64bb/node_modules/expo-linear-gradient/ios"
|
:path: "../node_modules/.pnpm/expo-linear-gradient@15.0.8_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@_e6k2hjkd5k4lph2ersbp3gfshy/node_modules/expo-linear-gradient/ios"
|
||||||
ExpoLinking:
|
ExpoLinking:
|
||||||
:path: "../node_modules/.pnpm/expo-linking@8.0.11_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/expo-linking/ios"
|
:path: "../node_modules/.pnpm/expo-linking@8.0.11_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/expo-linking/ios"
|
||||||
ExpoLocalization:
|
ExpoLocalization:
|
||||||
@@ -2377,8 +2159,6 @@ EXTERNAL SOURCES:
|
|||||||
:path: "../node_modules/.pnpm/expo-splash-screen@31.0.13_expo@54.0.32/node_modules/expo-splash-screen/ios"
|
:path: "../node_modules/.pnpm/expo-splash-screen@31.0.13_expo@54.0.32/node_modules/expo-splash-screen/ios"
|
||||||
ExpoWebBrowser:
|
ExpoWebBrowser:
|
||||||
:path: "../node_modules/.pnpm/expo-web-browser@15.0.10_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0_/node_modules/expo-web-browser/ios"
|
:path: "../node_modules/.pnpm/expo-web-browser@15.0.10_expo@54.0.32_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0_/node_modules/expo-web-browser/ios"
|
||||||
EXUpdatesInterface:
|
|
||||||
:path: "../node_modules/.pnpm/expo-updates-interface@2.0.0_expo@54.0.32/node_modules/expo-updates-interface/ios"
|
|
||||||
FBLazyVector:
|
FBLazyVector:
|
||||||
:path: "../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/FBLazyVector"
|
:path: "../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/FBLazyVector"
|
||||||
hermes-engine:
|
hermes-engine:
|
||||||
@@ -2451,7 +2231,7 @@ EXTERNAL SOURCES:
|
|||||||
React-microtasksnativemodule:
|
React-microtasksnativemodule:
|
||||||
:path: "../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/nativemodule/microtasks"
|
:path: "../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/nativemodule/microtasks"
|
||||||
react-native-safe-area-context:
|
react-native-safe-area-context:
|
||||||
:path: "../node_modules/.pnpm/react-native-safe-area-context@5.6.2_react-native@0.81.5_@babel+core@7.28.6_@types+reac_14122a3aa345cfabcc022a0f638ef16d/node_modules/react-native-safe-area-context"
|
:path: "../node_modules/.pnpm/react-native-safe-area-context@5.6.2_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1_azuxgonsvxb2yngtegtuvyxcpi/node_modules/react-native-safe-area-context"
|
||||||
React-NativeModulesApple:
|
React-NativeModulesApple:
|
||||||
:path: "../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios"
|
:path: "../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios"
|
||||||
React-oscompat:
|
React-oscompat:
|
||||||
@@ -2515,43 +2295,34 @@ EXTERNAL SOURCES:
|
|||||||
ReactNativeDependencies:
|
ReactNativeDependencies:
|
||||||
:podspec: "../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec"
|
:podspec: "../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec"
|
||||||
RNCAsyncStorage:
|
RNCAsyncStorage:
|
||||||
:path: "../node_modules/.pnpm/@react-native-async-storage+async-storage@2.2.0_react-native@0.81.5_@babel+core@7.28.6__ce3c4972004f3d6791573ec5b64bee38/node_modules/@react-native-async-storage/async-storage"
|
:path: "../node_modules/.pnpm/@react-native-async-storage+async-storage@2.2.0_react-native@0.81.5_@babel+core@7.28.6_@types_fp4qq3a7mejmut52v6jrlvxlzi/node_modules/@react-native-async-storage/async-storage"
|
||||||
RNGestureHandler:
|
|
||||||
:path: "../node_modules/.pnpm/react-native-gesture-handler@2.30.0_react-native@0.81.5_@babel+core@7.28.6_@types+react_39cf7da47c9c8531caaa923ee740e293/node_modules/react-native-gesture-handler"
|
|
||||||
RNReanimated:
|
RNReanimated:
|
||||||
:path: "../node_modules/.pnpm/react-native-reanimated@4.1.6_@babel+core@7.28.6_react-native-worklets@0.5.1_@babel+cor_c7c888bd389fb93c9cfe2d3c1c8b0777/node_modules/react-native-reanimated"
|
:path: "../node_modules/.pnpm/react-native-reanimated@4.1.6_@babel+core@7.28.6_react-native-worklets@0.5.1_@babel+core@7.28_ky3sbxf6i7nkyacc2hzg3xcz4q/node_modules/react-native-reanimated"
|
||||||
RNScreens:
|
RNScreens:
|
||||||
:path: "../node_modules/.pnpm/react-native-screens@4.16.0_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/react-native-screens"
|
:path: "../node_modules/.pnpm/react-native-screens@4.16.0_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/react-native-screens"
|
||||||
RNSVG:
|
RNSVG:
|
||||||
:path: "../node_modules/.pnpm/react-native-svg@15.12.1_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/react-native-svg"
|
:path: "../node_modules/.pnpm/react-native-svg@15.12.1_react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0__react@19.1.0/node_modules/react-native-svg"
|
||||||
RNWorklets:
|
RNWorklets:
|
||||||
:path: "../node_modules/.pnpm/react-native-worklets@0.5.1_@babel+core@7.28.6_react-native@0.81.5_@babel+core@7.28.6_@_40f69326ce21d3f9f6d74d3965fd9adf/node_modules/react-native-worklets"
|
:path: "../node_modules/.pnpm/react-native-worklets@0.5.1_@babel+core@7.28.6_react-native@0.81.5_@babel+core@7.28.6_@types+_5atwepuw3zy3crkgvetf35tkve/node_modules/react-native-worklets"
|
||||||
Yoga:
|
Yoga:
|
||||||
:path: "../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/yoga"
|
:path: "../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.6_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/yoga"
|
||||||
|
|
||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
EXApplication: 1e98d4b1dccdf30627f92917f4b2c5a53c330e5f
|
EXApplication: 13420f8139864183f8a04fd6099077bdf8cfb186
|
||||||
EXConstants: fce59a631a06c4151602843667f7cfe35f81e271
|
EXConstants: 3feb66fd1d94202fc1f0946d74e029d8b224b60e
|
||||||
EXJSONUtils: 1d3e4590438c3ee593684186007028a14b3686cd
|
EXNotifications: 2a3feb7af6194828d9aafda72f63a9a03866230a
|
||||||
EXManifests: a8d97683e5c7a3b026ffbd58559c64dc655b747b
|
Expo: b8d64eb9a496ebe8c71e3dae7eeb7f394b146b80
|
||||||
EXNotifications: 9eec98712cc814ceff916d876cb53859003b0597
|
ExpoAsset: d999f3bbd998a750f3b74cb913229848901b926b
|
||||||
Expo: 4e503a041c59c4e34c8be262a135848ad5cd3710
|
ExpoFileSystem: aefcd337b94b874f88752ebefc52813b84992fad
|
||||||
expo-dev-client: 425ee077d6754a98cfe3a2e2410d29b440b24c9d
|
ExpoFont: c625dbd97ed57e9089b172b2a7bb99003d074664
|
||||||
expo-dev-launcher: a4f4cdef064ab1fb8621e5b8c7c457cd6e9568c3
|
ExpoHead: b691a2ed7ab02ed820b6c6468941832d34969c29
|
||||||
expo-dev-menu: 05b18812110c175814c6af0d09dd658abcc5e00d
|
ExpoKeepAwake: 44bf6715bc1d2ddb17afe19d927cd039cda123f0
|
||||||
expo-dev-menu-interface: 600df12ea01efecdd822daaf13cc0ac091775533
|
ExpoLinearGradient: 814a21fc4056c3cf606e4f19e31e47074c5b5a86
|
||||||
ExpoAsset: f867e55ceb428aab99e1e8c082b5aee7c159ea18
|
ExpoLinking: ebf543fd411d56375cb4eee07f6ab4e31c7ad959
|
||||||
ExpoFileSystem: 858a44267a3e6e9057e0888ad7c7cfbf55d52063
|
ExpoLocalization: 6ac6f326210f0a3141ef6f58ab8f8f4ed003b485
|
||||||
ExpoFont: f543ce20a228dd702813668b1a07b46f51878d47
|
ExpoModulesCore: 77496909fd3c800f97f7f2007dd26aeac4bb3798
|
||||||
ExpoHead: 4425246bc93411f0fe7f6945f95f698e91db8780
|
ExpoSplashScreen: 72fbc6dd9d6404dd9d0725a56c9ac1383bc0b14f
|
||||||
ExpoKeepAwake: 55f75eca6499bb9e4231ebad6f3e9cb8f99c0296
|
ExpoWebBrowser: 88b116cd378d9609c776c0903fe4070fca461588
|
||||||
ExpoLinearGradient: 809102bdb979f590083af49f7fa4805cd931bd58
|
|
||||||
ExpoLinking: 8f0aaf69aa56f832913030503b6263dc6f647f37
|
|
||||||
ExpoLocalization: d9168d5300a5b03e5e78b986124d11fb6ec3ebbd
|
|
||||||
ExpoModulesCore: f3da4f1ab5a8375d0beafab763739dbee8446583
|
|
||||||
ExpoSplashScreen: bc3cffefca2716e5f22350ca109badd7e50ec14d
|
|
||||||
ExpoWebBrowser: 17b064c621789e41d4816c95c93f429b84971f52
|
|
||||||
EXUpdatesInterface: 5adf50cb41e079c861da6d9b4b954c3db9a50734
|
|
||||||
FBLazyVector: e95a291ad2dadb88e42b06e0c5fb8262de53ec12
|
FBLazyVector: e95a291ad2dadb88e42b06e0c5fb8262de53ec12
|
||||||
hermes-engine: 9f4dfe93326146a1c99eb535b1cb0b857a3cd172
|
hermes-engine: 9f4dfe93326146a1c99eb535b1cb0b857a3cd172
|
||||||
RCTDeprecation: 943572d4be82d480a48f4884f670135ae30bf990
|
RCTDeprecation: 943572d4be82d480a48f4884f670135ae30bf990
|
||||||
@@ -2559,72 +2330,71 @@ SPEC CHECKSUMS:
|
|||||||
RCTTypeSafety: 16a4144ca3f959583ab019b57d5633df10b5e97c
|
RCTTypeSafety: 16a4144ca3f959583ab019b57d5633df10b5e97c
|
||||||
React: 914f8695f9bf38e6418228c2ffb70021e559f92f
|
React: 914f8695f9bf38e6418228c2ffb70021e559f92f
|
||||||
React-callinvoker: 1c0808402aee0c6d4a0d8e7220ce6547af9fba71
|
React-callinvoker: 1c0808402aee0c6d4a0d8e7220ce6547af9fba71
|
||||||
React-Core: c61410ef0ca6055e204a963992e363227e0fd1c5
|
React-Core: 4ae98f9e8135b8ddbd7c98730afb6fdae883db90
|
||||||
React-Core-prebuilt: 02f0ad625ddd47463c009c2d0c5dd35c0d982599
|
React-Core-prebuilt: 8f4cca589c14e8cf8fc6db4587ef1c2056b5c151
|
||||||
React-CoreModules: 1f6d1744b5f9f2ec684a4bb5ced25370f87e5382
|
React-CoreModules: e878a90bb19b8f3851818af997dbae3b3b0a27ac
|
||||||
React-cxxreact: 3af79478e8187b63ffc22b794cd42d3fc1f1f2da
|
React-cxxreact: 28af9844f6dc87be1385ab521fbfb3746f19563c
|
||||||
React-debug: 6328c2228e268846161f10082e80dc69eac2e90a
|
React-debug: 6328c2228e268846161f10082e80dc69eac2e90a
|
||||||
React-defaultsnativemodule: d635ef36d755321e5d6fc065bd166b2c5a0e9833
|
React-defaultsnativemodule: afc9d809ec75780f39464a6949c07987fbea488c
|
||||||
React-domnativemodule: dd28f6d96cd21236e020be2eff6fe0b7d4ec3b66
|
React-domnativemodule: 91a233260411d41f27f67aa1358b7f9f0bfd101d
|
||||||
React-Fabric: 2e32c3fdbb1fbcf5fde54607e3abe453c6652ce2
|
React-Fabric: 21f349b5e93f305a3c38c885902683a9c79cf983
|
||||||
React-FabricComponents: 5ed0cdb81f6b91656cb4d3be432feaa28a58071a
|
React-FabricComponents: 47ac634cc9ecc64b30a9997192f510eebe4177e4
|
||||||
React-FabricImage: 2bc714f818cb24e454f5d3961864373271b2faf8
|
React-FabricImage: 21873acd6d4a51a0b97c133141051c7acb11cc86
|
||||||
React-featureflags: 847642f41fa71ad4eec5e0351badebcad4fe6171
|
React-featureflags: 653f469f0c3c9dc271d610373e3b6e66a9fd847d
|
||||||
React-featureflagsnativemodule: c868a544b2c626fa337bcbd364b1befe749f0d3f
|
React-featureflagsnativemodule: c91a8a3880e0f4838286402241ead47db43aed28
|
||||||
React-graphics: 192ec701def5b3f2a07db2814dfba5a44986cff6
|
React-graphics: b4bdb0f635b8048c652a5d2b73eb8b1ddd950f24
|
||||||
React-hermes: e875778b496c86d07ab2ccaa36a9505d248a254b
|
React-hermes: fcfad3b917400f49026f3232561e039c9d1c34bf
|
||||||
React-idlecallbacksnativemodule: 4d57965cdf82c14ee3b337189836cd8491632b76
|
React-idlecallbacksnativemodule: 8cb83207e39f8179ac1d344b6177c6ab3ccebcdc
|
||||||
React-ImageManager: bd0b99e370b13de82c9cd15f0f08144ff3de079e
|
React-ImageManager: 396128004783fc510e629124dce682d38d1088e7
|
||||||
React-jserrorhandler: a2fdef4cbcfdcdf3fa9f5d1f7190f7fd4535248d
|
React-jserrorhandler: b58b788d788cdbf8bda7db74a88ebfcffc8a0795
|
||||||
React-jsi: 89d43d1e7d4d0663f8ba67e0b39eb4e4672c27de
|
React-jsi: d2c3f8555175371c02da6dfe7ed1b64b55a9d6c0
|
||||||
React-jsiexecutor: abe4874aaab90dfee5dec480680220b2f8af07e3
|
React-jsiexecutor: ba537434eb45ee018b590ed7d29ee233fddb8669
|
||||||
React-jsinspector: a0b3e051aef842b0b2be2353790ae2b2a5a65a8f
|
React-jsinspector: f21b6654baf96cb9f71748844a32468a5f73ad51
|
||||||
React-jsinspectorcdp: 6346013b2247c6263fbf5199adf4a8751e53bd89
|
React-jsinspectorcdp: 3f8be4830694c3c1c39442e50f8db877966d43f0
|
||||||
React-jsinspectornetwork: 26281aa50d49fc1ec93abf981d934698fa95714f
|
React-jsinspectornetwork: 70e41469565712ad60e11d9c8b8f999b9f7f61eb
|
||||||
React-jsinspectortracing: 55eedf6d57540507570259a778663b90060bbd6e
|
React-jsinspectortracing: eccf9bfa4ec7f130d514f215cfb2222dc3c0e270
|
||||||
React-jsitooling: 0e001113fa56d8498aa8ac28437ac0d36348e51a
|
React-jsitooling: b376a695f5a507627f7934748533b24eed1751ca
|
||||||
React-jsitracing: b713793eb8a5bbc4d86a84e9d9e5023c0f58cbaf
|
React-jsitracing: 5c8c3273dda2d95191cc0612fb5e71c4d9018d2a
|
||||||
React-logger: 50fdb9a8236da90c0b1072da5c32ee03aeb5bf28
|
React-logger: c3e2f8a2e284341205f61eef3d4677ab5a309dfd
|
||||||
React-Mapbuffer: 9050ee10c19f4f7fca8963d0211b2854d624973e
|
React-Mapbuffer: 603c18db65844bb81dbe62fee8fcc976eaeb7108
|
||||||
React-microtasksnativemodule: f775db9e991c6f3b8ccbc02bfcde22770f96e23b
|
React-microtasksnativemodule: d77e0c426fce34c23227394c96ca1033b30c813c
|
||||||
react-native-safe-area-context: 37e680fc4cace3c0030ee46e8987d24f5d3bdab2
|
react-native-safe-area-context: 53f796cb6c814661bbe99fbdfd0585d07b996cdd
|
||||||
React-NativeModulesApple: 8969913947d5b576de4ed371a939455a8daf28aa
|
React-NativeModulesApple: 1664340b8750d64e0ef3907c5e53d9481f74bcbd
|
||||||
React-oscompat: ce47230ed20185e91de62d8c6d139ae61763d09c
|
React-oscompat: ce47230ed20185e91de62d8c6d139ae61763d09c
|
||||||
React-perflogger: 02b010e665772c7dcb859d85d44c1bfc5ac7c0e4
|
React-perflogger: b1af3cfb3f095f819b2814910000392a8e17ba9f
|
||||||
React-performancetimeline: 130db956b5a83aa4fb41ddf5ae68da89f3fb1526
|
React-performancetimeline: f9ec65b77bcadbc7bd8b47a6f4b4b697da7b1490
|
||||||
React-RCTActionSheet: 0b14875b3963e9124a5a29a45bd1b22df8803916
|
React-RCTActionSheet: 0b14875b3963e9124a5a29a45bd1b22df8803916
|
||||||
React-RCTAnimation: a7b90fd2af7bb9c084428867445a1481a8cb112e
|
React-RCTAnimation: 60f6eca214a62b9673f64db6df3830cee902b5af
|
||||||
React-RCTAppDelegate: 3262bedd01263f140ec62b7989f4355f57cec016
|
React-RCTAppDelegate: 37734b39bac108af30a0fd9d3e1149ec68b82c28
|
||||||
React-RCTBlob: c17531368702f1ebed5d0ada75a7cf5915072a53
|
React-RCTBlob: 83fbcbd57755caf021787324aac2fe9b028cc264
|
||||||
React-RCTFabric: 6409edd8cfdc3133b6cc75636d3b858fdb1d11ea
|
React-RCTFabric: a05cb1df484008db3753c8b4a71e4c6d9f1e43a6
|
||||||
React-RCTFBReactNativeSpec: c004b27b4fa3bd85878ad2cf53de3bbec85da797
|
React-RCTFBReactNativeSpec: d58d7ae9447020bbbac651e3b0674422aba18266
|
||||||
React-RCTImage: c68078a120d0123f4f07a5ac77bea3bb10242f32
|
React-RCTImage: 47aba3be7c6c64f956b7918ab933769602406aac
|
||||||
React-RCTLinking: cf8f9391fe7fe471f96da3a5f0435235eca18c5b
|
React-RCTLinking: 2dbaa4df2e4523f68baa07936bd8efdfa34d5f31
|
||||||
React-RCTNetwork: ca31f7c879355760c2d9832a06ee35f517938a20
|
React-RCTNetwork: 1fca7455f9dedf7de2b95bec438da06680f3b000
|
||||||
React-RCTRuntime: a6cf4a1e42754fc87f493e538f2ac6b820e45418
|
React-RCTRuntime: 17819dd1dfc8613efaf4cbb9d8686baae4a83e5b
|
||||||
React-RCTSettings: e0e140b2ff4bf86d34e9637f6316848fc00be035
|
React-RCTSettings: 01bf91c856862354d3d2f642ccb82f3697a4284a
|
||||||
React-RCTText: 75915bace6f7877c03a840cc7b6c622fb62bfa6b
|
React-RCTText: cb576a3797dcb64933613c522296a07eaafc0461
|
||||||
React-RCTVibration: 25f26b85e5e432bb3c256f8b384f9269e9529f25
|
React-RCTVibration: 560af8c086741f3525b8456a482cdbe27f9d098e
|
||||||
React-rendererconsistency: 2dac03f448ff337235fd5820b10f81633328870d
|
React-rendererconsistency: 2dac03f448ff337235fd5820b10f81633328870d
|
||||||
React-renderercss: 477da167bb96b5ac86d30c5d295412fb853f5453
|
React-renderercss: c5c6b7a15948dd28facca39a18ac269073718490
|
||||||
React-rendererdebug: 2a1798c6f3ef5f22d466df24c33653edbabb5b89
|
React-rendererdebug: 3c9d5e1634273f5a24d84cc5669f290ce0bdc812
|
||||||
React-RuntimeApple: 28cf4d8eb18432f6a21abbed7d801ab7f6b6f0b4
|
React-RuntimeApple: 887637d1e12ea8262df7d32bc100467df2302613
|
||||||
React-RuntimeCore: 41bf0fd56a00de5660f222415af49879fa49c4f0
|
React-RuntimeCore: 91f779835dc4f8f84777fe5dd24f1a22f96454e4
|
||||||
React-runtimeexecutor: 1afb774dde3011348e8334be69d2f57a359ea43e
|
React-runtimeexecutor: 8bb6b738f37b0ada4a6269e6f8ab1133dea0285c
|
||||||
React-RuntimeHermes: f3b158ea40e8212b1a723a68b4315e7a495c5fc6
|
React-RuntimeHermes: 4cb93de9fa8b1cc753d200dbe61a01b9ec5f5562
|
||||||
React-runtimescheduler: 3e1e2bec7300bae512533107d8e54c6e5c63fe0f
|
React-runtimescheduler: 83dc28f530bfbd2fce84ed13aa7feebdc24e5af7
|
||||||
React-timing: 6fa9883de2e41791e5dc4ec404e5e37f3f50e801
|
React-timing: 03c7217455d2bff459b27a3811be25796b600f47
|
||||||
React-utils: 6e2035b53d087927768649a11a26c4e092448e34
|
React-utils: 6d46795ae0444ec8a5d9a5f201157b286bf5250a
|
||||||
ReactAppDependencyProvider: 1bcd3527ac0390a1c898c114f81ff954be35ed79
|
ReactAppDependencyProvider: c277c5b231881ad4f00cd59e3aa0671b99d7ebee
|
||||||
ReactCodegen: fffa79906f5866f6a5ab5d98480b375191190271
|
ReactCodegen: 88a1f4643f15841573f833b895bfa2a0c6cb4e7f
|
||||||
ReactCommon: 08810150b1206cc44aecf5f6ae19af32f29151a8
|
ReactCommon: e6e232202a447d353e5531f2be82f50f47cbaa9a
|
||||||
ReactNativeDependencies: 71ce9c28beb282aa720ea7b46980fff9669f428a
|
ReactNativeDependencies: 71ce9c28beb282aa720ea7b46980fff9669f428a
|
||||||
RNCAsyncStorage: 3a4f5e2777dae1688b781a487923a08569e27fe4
|
RNCAsyncStorage: e85a99325df9eb0191a6ee2b2a842644c7eb29f4
|
||||||
RNGestureHandler: e0d0bce5599f6120b7adf90c38d2805e2935795f
|
RNReanimated: 10415bc8396eaeac0d7b2c9a1538eae7e607ec9c
|
||||||
RNReanimated: 9c6a550b41de91cf374e60afd79db93a362f1126
|
RNScreens: dd61bc3a3e6f6901ad833efa411917d44827cf51
|
||||||
RNScreens: d8d6f1792f6e7ac12b0190d33d8d390efc0c1845
|
RNSVG: 2825ee146e0f6a16221e852299943e4cceef4528
|
||||||
RNSVG: 31d6639663c249b7d5abc9728dde2041eb2a3c34
|
RNWorklets: 9ccdc8112b17af6eee2c85a233891cb80db150ad
|
||||||
RNWorklets: 1b50cb7595142f95e70518196ba247ad7f46a52e
|
|
||||||
Yoga: 5934998fbeaef7845dbf698f698518695ab4cd1a
|
Yoga: 5934998fbeaef7845dbf698f698518695ab4cd1a
|
||||||
|
|
||||||
PODFILE CHECKSUM: dfe3cc75dee014a0abd367bc9e1bdbab0ba64ee3
|
PODFILE CHECKSUM: dfe3cc75dee014a0abd367bc9e1bdbab0ba64ee3
|
||||||
|
|||||||
@@ -374,8 +374,6 @@
|
|||||||
"${PODS_CONFIGURATION_BUILD_DIR}/RNSVG/RNSVGFilters.bundle",
|
"${PODS_CONFIGURATION_BUILD_DIR}/RNSVG/RNSVGFilters.bundle",
|
||||||
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/React-Core_privacy.bundle",
|
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/React-Core_privacy.bundle",
|
||||||
"${PODS_CONFIGURATION_BUILD_DIR}/React-cxxreact/React-cxxreact_privacy.bundle",
|
"${PODS_CONFIGURATION_BUILD_DIR}/React-cxxreact/React-cxxreact_privacy.bundle",
|
||||||
"${PODS_CONFIGURATION_BUILD_DIR}/expo-dev-launcher/EXDevLauncher.bundle",
|
|
||||||
"${PODS_CONFIGURATION_BUILD_DIR}/expo-dev-menu/EXDevMenu.bundle",
|
|
||||||
);
|
);
|
||||||
name = "[CP] Copy Pods Resources";
|
name = "[CP] Copy Pods Resources";
|
||||||
outputPaths = (
|
outputPaths = (
|
||||||
@@ -389,8 +387,6 @@
|
|||||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNSVGFilters.bundle",
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNSVGFilters.bundle",
|
||||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-Core_privacy.bundle",
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-Core_privacy.bundle",
|
||||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-cxxreact_privacy.bundle",
|
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-cxxreact_privacy.bundle",
|
||||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXDevLauncher.bundle",
|
|
||||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXDevMenu.bundle",
|
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
|
|||||||
@@ -1,28 +1,54 @@
|
|||||||
import WidgetKit
|
import WidgetKit
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
// V1:写死文案的小组件(Small/Medium/Large + 点击跳转 Home)
|
// V2:纯色背景 + 随机文案小组件(Small/Medium/Large + 点击跳转 Home)
|
||||||
|
|
||||||
struct EmotionProvider: TimelineProvider {
|
struct EmotionProvider: TimelineProvider {
|
||||||
|
private let quotes = [
|
||||||
|
"你已经很努力了,今天也值得被温柔对待。",
|
||||||
|
"轻轻呼吸,感受当下的每一刻。",
|
||||||
|
"所有的压力,都会在深呼吸中慢慢消散。",
|
||||||
|
"给生活一点留白,给自己一点温柔。",
|
||||||
|
"不要走得太快,等一等落下的灵魂。",
|
||||||
|
"世界虽嘈杂,但你可以拥有一颗宁静的心。",
|
||||||
|
"每一个瞬间,都是生命最好的安排。",
|
||||||
|
"抱抱自己,辛苦了,亲爱的。",
|
||||||
|
"慢一点也没关系,只要你在前行。",
|
||||||
|
"今天,你对自己微笑了吗?",
|
||||||
|
"愿你历经山河,仍觉得人间值得。",
|
||||||
|
"心简单,世界就简单;心平顺,生活就平顺。",
|
||||||
|
"即使生活偶尔晦暗,你也要成为自己的光。",
|
||||||
|
"别让琐事挤走生活的快乐,别让压力消磨奋斗的激情。"
|
||||||
|
]
|
||||||
|
|
||||||
func placeholder(in context: Context) -> EmotionEntry {
|
func placeholder(in context: Context) -> EmotionEntry {
|
||||||
EmotionEntry(date: Date())
|
EmotionEntry(date: Date(), text: quotes[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
func getSnapshot(in context: Context, completion: @escaping (EmotionEntry) -> ()) {
|
func getSnapshot(in context: Context, completion: @escaping (EmotionEntry) -> ()) {
|
||||||
completion(EmotionEntry(date: Date()))
|
let entry = EmotionEntry(date: Date(), text: quotes.randomElement() ?? quotes[0])
|
||||||
|
completion(entry)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getTimeline(in context: Context, completion: @escaping (Timeline<EmotionEntry>) -> ()) {
|
func getTimeline(in context: Context, completion: @escaping (Timeline<EmotionEntry>) -> ()) {
|
||||||
// V1:内容写死,不做数据更新;给一个较长的刷新间隔(系统仍可能自行调度)
|
var entries: [EmotionEntry] = []
|
||||||
let entry = EmotionEntry(date: Date())
|
let currentDate = Date()
|
||||||
let nextUpdate = Calendar.current.date(byAdding: .day, value: 7, to: Date())
|
|
||||||
?? Date().addingTimeInterval(60 * 60 * 24 * 7)
|
// 生成未来 24 小时的 6 个条目,每 4 小时更换一次随机文案
|
||||||
completion(Timeline(entries: [entry], policy: .after(nextUpdate)))
|
for hourOffset in 0..<6 {
|
||||||
|
let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset * 4, to: currentDate)!
|
||||||
|
let entry = EmotionEntry(date: entryDate, text: quotes.randomElement() ?? quotes[0])
|
||||||
|
entries.append(entry)
|
||||||
|
}
|
||||||
|
|
||||||
|
let timeline = Timeline(entries: entries, policy: .atEnd)
|
||||||
|
completion(timeline)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct EmotionEntry: TimelineEntry {
|
struct EmotionEntry: TimelineEntry {
|
||||||
let date: Date
|
let date: Date
|
||||||
|
let text: String
|
||||||
}
|
}
|
||||||
|
|
||||||
struct EmotionWidgetView: View {
|
struct EmotionWidgetView: View {
|
||||||
@@ -30,160 +56,37 @@ struct EmotionWidgetView: View {
|
|||||||
@Environment(\.widgetFamily) var family
|
@Environment(\.widgetFamily) var family
|
||||||
|
|
||||||
private let title = "正念"
|
private let title = "正念"
|
||||||
private let text = "你已经很努力了,今天也值得被温柔对待。"
|
|
||||||
private let deepLink = URL(string: "client:///(app)/home")
|
private let deepLink = URL(string: "client:///(app)/home")
|
||||||
|
|
||||||
|
// 背景色 #F7D9BF
|
||||||
|
private let backgroundColor = Color(red: 247/255, green: 217/255, blue: 191/255)
|
||||||
|
// 文本颜色(深咖色,适合搭配浅橘色背景)
|
||||||
|
private let textColor = Color(red: 74/255, green: 52/255, blue: 40/255)
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
switch family {
|
VStack(alignment: .center, spacing: 0) {
|
||||||
case .systemSmall:
|
Spacer(minLength: 0)
|
||||||
smallView()
|
|
||||||
case .systemMedium:
|
Text(entry.text)
|
||||||
mediumView()
|
.font(.system(size: family == .systemSmall ? 17 : 20, weight: .medium))
|
||||||
case .systemLarge:
|
.foregroundColor(textColor)
|
||||||
largeView()
|
.lineSpacing(6)
|
||||||
default:
|
.multilineTextAlignment(.center)
|
||||||
smallView()
|
.minimumScaleFactor(0.7)
|
||||||
}
|
.fixedSize(horizontal: false, vertical: true)
|
||||||
}
|
|
||||||
|
Spacer(minLength: 0)
|
||||||
// 统一的“卡片背景”风格(iOS 15 兼容)
|
|
||||||
private func cardBackground(colors: [Color]) -> some View {
|
if family != .systemSmall {
|
||||||
ZStack {
|
Text("Hey Mama")
|
||||||
LinearGradient(
|
.font(.system(size: 10, weight: .semibold))
|
||||||
colors: colors,
|
.foregroundColor(textColor.opacity(0.3))
|
||||||
startPoint: .topLeading,
|
.padding(.bottom, 4)
|
||||||
endPoint: .bottomTrailing
|
|
||||||
)
|
|
||||||
// 轻微光斑,增加层次
|
|
||||||
RadialGradient(
|
|
||||||
gradient: Gradient(colors: [Color.white.opacity(0.16), Color.white.opacity(0.0)]),
|
|
||||||
center: .topTrailing,
|
|
||||||
startRadius: 10,
|
|
||||||
endRadius: 180
|
|
||||||
)
|
|
||||||
}
|
|
||||||
.overlay(
|
|
||||||
RoundedRectangle(cornerRadius: 18, style: .continuous)
|
|
||||||
.stroke(Color.white.opacity(0.14), lineWidth: 1)
|
|
||||||
)
|
|
||||||
.cornerRadius(18)
|
|
||||||
}
|
|
||||||
|
|
||||||
private func chip(_ text: String) -> some View {
|
|
||||||
Text(text)
|
|
||||||
.font(.system(size: 12, weight: .semibold))
|
|
||||||
.foregroundColor(Color.white.opacity(0.9))
|
|
||||||
.padding(.horizontal, 10)
|
|
||||||
.padding(.vertical, 6)
|
|
||||||
.background(Color.white.opacity(0.14))
|
|
||||||
.cornerRadius(999)
|
|
||||||
}
|
|
||||||
|
|
||||||
private func smallView() -> some View {
|
|
||||||
ZStack {
|
|
||||||
cardBackground(colors: [
|
|
||||||
Color(red: 0.06, green: 0.08, blue: 0.12),
|
|
||||||
Color(red: 0.13, green: 0.16, blue: 0.22),
|
|
||||||
])
|
|
||||||
|
|
||||||
VStack(alignment: .leading, spacing: 10) {
|
|
||||||
HStack {
|
|
||||||
chip(title)
|
|
||||||
Spacer(minLength: 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
Text(text)
|
|
||||||
.font(.system(size: 15, weight: .semibold))
|
|
||||||
.foregroundColor(Color.white.opacity(0.92))
|
|
||||||
.lineSpacing(2)
|
|
||||||
.lineLimit(4)
|
|
||||||
|
|
||||||
Spacer(minLength: 0)
|
|
||||||
|
|
||||||
Text("点我回到 App")
|
|
||||||
.font(.system(size: 11, weight: .medium))
|
|
||||||
.foregroundColor(Color.white.opacity(0.65))
|
|
||||||
}
|
}
|
||||||
.padding(14)
|
|
||||||
}
|
|
||||||
.widgetURL(deepLink)
|
|
||||||
}
|
|
||||||
|
|
||||||
private func mediumView() -> some View {
|
|
||||||
ZStack {
|
|
||||||
cardBackground(colors: [
|
|
||||||
Color(red: 0.06, green: 0.08, blue: 0.12),
|
|
||||||
Color(red: 0.09, green: 0.11, blue: 0.17),
|
|
||||||
])
|
|
||||||
|
|
||||||
HStack(alignment: .top, spacing: 14) {
|
|
||||||
VStack(alignment: .leading, spacing: 10) {
|
|
||||||
chip(title)
|
|
||||||
Text(text)
|
|
||||||
.font(.system(size: 17, weight: .semibold))
|
|
||||||
.foregroundColor(Color.white.opacity(0.92))
|
|
||||||
.lineSpacing(3)
|
|
||||||
.lineLimit(5)
|
|
||||||
|
|
||||||
Spacer(minLength: 0)
|
|
||||||
|
|
||||||
Text("轻轻呼吸,回到当下")
|
|
||||||
.font(.system(size: 12, weight: .medium))
|
|
||||||
.foregroundColor(Color.white.opacity(0.7))
|
|
||||||
}
|
|
||||||
|
|
||||||
// 右侧装饰区:让版面更饱满
|
|
||||||
VStack(alignment: .trailing, spacing: 8) {
|
|
||||||
Text(entry.date, style: .time)
|
|
||||||
.font(.system(size: 12, weight: .semibold))
|
|
||||||
.foregroundColor(Color.white.opacity(0.8))
|
|
||||||
Spacer(minLength: 0)
|
|
||||||
Text("今日")
|
|
||||||
.font(.system(size: 28, weight: .bold))
|
|
||||||
.foregroundColor(Color.white.opacity(0.12))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.padding(16)
|
|
||||||
}
|
|
||||||
.widgetURL(deepLink)
|
|
||||||
}
|
|
||||||
|
|
||||||
private func largeView() -> some View {
|
|
||||||
ZStack {
|
|
||||||
cardBackground(colors: [
|
|
||||||
Color(red: 0.06, green: 0.08, blue: 0.12),
|
|
||||||
Color(red: 0.14, green: 0.18, blue: 0.28),
|
|
||||||
])
|
|
||||||
|
|
||||||
VStack(alignment: .leading, spacing: 14) {
|
|
||||||
HStack {
|
|
||||||
chip(title)
|
|
||||||
Spacer(minLength: 0)
|
|
||||||
Text(entry.date, style: .time)
|
|
||||||
.font(.system(size: 12, weight: .semibold))
|
|
||||||
.foregroundColor(Color.white.opacity(0.78))
|
|
||||||
}
|
|
||||||
|
|
||||||
Text(text)
|
|
||||||
.font(.system(size: 20, weight: .semibold))
|
|
||||||
.foregroundColor(Color.white.opacity(0.92))
|
|
||||||
.lineSpacing(4)
|
|
||||||
.lineLimit(8)
|
|
||||||
|
|
||||||
Spacer(minLength: 0)
|
|
||||||
|
|
||||||
HStack {
|
|
||||||
Text("点我回到 Home")
|
|
||||||
.font(.system(size: 12, weight: .medium))
|
|
||||||
.foregroundColor(Color.white.opacity(0.7))
|
|
||||||
Spacer(minLength: 0)
|
|
||||||
Text("🌿")
|
|
||||||
.font(.system(size: 18))
|
|
||||||
.opacity(0.9)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.padding(18)
|
|
||||||
}
|
}
|
||||||
|
.padding(family == .systemSmall ? 16 : 24)
|
||||||
|
.frame(maxWidth: .infinity, maxHeight: .infinity) // 强制撑开容器
|
||||||
|
.background(backgroundColor) // 将背景色直接应用到容器上
|
||||||
.widgetURL(deepLink)
|
.widgetURL(deepLink)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -194,7 +97,13 @@ struct EmotionWidget: Widget {
|
|||||||
|
|
||||||
var body: some WidgetConfiguration {
|
var body: some WidgetConfiguration {
|
||||||
StaticConfiguration(kind: kind, provider: EmotionProvider()) { entry in
|
StaticConfiguration(kind: kind, provider: EmotionProvider()) { entry in
|
||||||
EmotionWidgetView(entry: entry)
|
if #available(iOS 17.0, *) {
|
||||||
|
EmotionWidgetView(entry: entry)
|
||||||
|
.containerBackground(Color(red: 247/255, green: 217/255, blue: 191/255), for: .widget)
|
||||||
|
} else {
|
||||||
|
EmotionWidgetView(entry: entry)
|
||||||
|
.background(Color(red: 247/255, green: 217/255, blue: 191/255))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.configurationDisplayName("情绪小组件")
|
.configurationDisplayName("情绪小组件")
|
||||||
.description("一段温柔提醒,陪你回到当下。")
|
.description("一段温柔提醒,陪你回到当下。")
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ function getApiBaseUrl(env: AppRuntimeEnv): string {
|
|||||||
const direct = process.env.EXPO_PUBLIC_API_BASE_URL;
|
const direct = process.env.EXPO_PUBLIC_API_BASE_URL;
|
||||||
if (direct && String(direct).trim()) return String(direct).trim();
|
if (direct && String(direct).trim()) return String(direct).trim();
|
||||||
|
|
||||||
// 约定:local/dev/prod 三套域名分别配置,便于后续直接切环境而不改代码
|
// 约定:local/dev/prod 三套域名分别配置, 便于后续直接切环境而不改代码
|
||||||
if (env === 'local') {
|
if (env === 'local') {
|
||||||
return getOptionalEnv('EXPO_PUBLIC_API_BASE_URL_LOCAL', 'http://localhost:8000');
|
return getOptionalEnv('EXPO_PUBLIC_API_BASE_URL_LOCAL', 'http://localhost:8000');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -105,7 +105,6 @@ export async function setReaction(contentId: string, reaction: Reaction): Promis
|
|||||||
}
|
}
|
||||||
|
|
||||||
export type FavoriteItem = {
|
export type FavoriteItem = {
|
||||||
favId: string; // 唯一标识,支持重复点赞同一文案
|
|
||||||
id: string;
|
id: string;
|
||||||
date: string;
|
date: string;
|
||||||
themeMode: ThemeMode;
|
themeMode: ThemeMode;
|
||||||
@@ -118,15 +117,15 @@ export async function getFavorites(): Promise<FavoriteItem[]> {
|
|||||||
|
|
||||||
export async function addFavorite(item: FavoriteItem): Promise<void> {
|
export async function addFavorite(item: FavoriteItem): Promise<void> {
|
||||||
const list = await getFavorites();
|
const list = await getFavorites();
|
||||||
// 允许重复点赞,不再根据 id 去重
|
if (list.some(i => i.id === item.id)) return;
|
||||||
const newList = [item, ...list];
|
const newList = [item, ...list];
|
||||||
console.log('Adding to favorites, new list size:', newList.length);
|
console.log('Adding to favorites, new list size:', newList.length);
|
||||||
await setJson(KEY_FAVORITES_ITEMS, newList);
|
await setJson(KEY_FAVORITES_ITEMS, newList);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function removeFavorite(favId: string): Promise<void> {
|
export async function removeFavorite(contentId: string): Promise<void> {
|
||||||
const list = await getFavorites();
|
const list = await getFavorites();
|
||||||
const next = list.filter(item => item.favId !== favId);
|
const next = list.filter(item => item.id !== contentId);
|
||||||
await setJson(KEY_FAVORITES_ITEMS, next);
|
await setJson(KEY_FAVORITES_ITEMS, next);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
BIN
server/alembic/__pycache__/env.cpython-313.pyc
Normal file
BIN
server/app/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
server/app/__pycache__/__init__.cpython-314.pyc
Normal file
BIN
server/app/__pycache__/main.cpython-313.pyc
Normal file
BIN
server/app/__pycache__/main.cpython-314.pyc
Normal file
BIN
server/app/api/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
server/app/api/__pycache__/limits.cpython-313.pyc
Normal file
BIN
server/app/api/v1/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
server/app/api/v1/__pycache__/reco.cpython-313.pyc
Normal file
BIN
server/app/core/__pycache__/config.cpython-313.pyc
Normal file
BIN
server/app/core/__pycache__/config.cpython-314.pyc
Normal file
BIN
server/app/db/__pycache__/base.cpython-313.pyc
Normal file
BIN
server/app/db/__pycache__/session.cpython-313.pyc
Normal file
BIN
server/app/db/models/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
server/app/db/models/__pycache__/content.cpython-313.pyc
Normal file
BIN
server/app/db/models/__pycache__/content_profile.cpython-313.pyc
Normal file
BIN
server/app/tasks/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
server/app/tasks/__pycache__/reco.cpython-313.pyc
Normal file
BIN
server/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc
Normal file
103
设计说明文档/用户使用协议.md
@@ -1,102 +1,29 @@
|
|||||||
Hey Mama – Terms of Use
|
欢迎使用本App(情绪推送应用)。请仔细阅读以下协议内容:
|
||||||
Last updated: February 2026
|
|
||||||
Welcome to Hey Mama (“the App,” “we,” or “us”).
|
|
||||||
Please read these Terms of Use carefully before downloading, accessing, or using the App. By using the App, you agree to be bound by these Terms.
|
|
||||||
|
|
||||||
1. Intended Audience
|
适用范围与接受:本协议适用于您下载、安装、登录或使用本App时的全部行为。您在使用本App前,应仔细阅读并充分理解本协议的各项条款。一旦您下载、安装或使用本App,即表示您已阅读并同意接受本协议的全部内容;如果您不同意,请立即停止使用。
|
||||||
Hey Mama is intended for adults only.
|
|
||||||
The App is not designed for children, and users must ensure they have the legal capacity to use the App under applicable laws.
|
|
||||||
|
|
||||||
2. Services Provided
|
服务内容:本App致力于为宝妈群体提供情绪关怀和正能量内容,包括通过定时推送名人励志语句、个性化推荐情绪正向内容等功能。您无需注册或登录即可使用本App,可选择提供昵称改善使用体验。通过参与问卷调查和点击操作,您可帮助我们了解您的内容偏好,以获得更符合您需求的推荐内容。
|
||||||
Hey Mama provides text-based content and features, including but not limited to:
|
|
||||||
- Daily affirmations and mindfulness text
|
|
||||||
- User-configured reminders and push notifications
|
|
||||||
- Home screen widgets displaying affirmation text
|
|
||||||
- Personalized reading or saving experiences (where applicable)
|
|
||||||
All content is provided for general emotional support and self-reflection purposes only and does not constitute medical, psychological, or professional advice.
|
|
||||||
|
|
||||||
3. Acceptable Use
|
使用规范:
|
||||||
You agree to:
|
|
||||||
- Use the App for personal, non-commercial purposes only
|
|
||||||
- Not copy, reproduce, distribute, sell, modify, reverse engineer, or attempt to extract the source code of the App
|
|
||||||
- Not engage in any activity that may interfere with the App’s functionality, stability, or user experience
|
|
||||||
We reserve the right to restrict or terminate access if these Terms are violated.
|
|
||||||
|
|
||||||
4. Push Notifications
|
您承诺遵守中华人民共和国相关法律法规,不得利用本App从事任何违法犯罪或侵权行为。
|
||||||
The App may send push notifications based on your settings (e.g. daily affirmation reminders).
|
|
||||||
- Notifications contain general text only
|
|
||||||
- No sensitive personal data is included
|
|
||||||
- You may disable notifications at any time through your device settings
|
|
||||||
|
|
||||||
5. Intellectual Property
|
您不得干扰本App的正常运行,不得攻击、破坏应用系统或试图绕过使用限制。
|
||||||
All content, design elements, interfaces, and materials within the App are owned by us or our licensors and are protected by applicable intellectual property laws.
|
|
||||||
Unauthorized use, reproduction, or distribution is strictly prohibited.
|
|
||||||
|
|
||||||
6. Disclaimer
|
您不得未经授权破解、反编译、反向工程、篡改本App软件,也不得删除或篡改本App内的任何版权、商标或所有权声明。
|
||||||
The App and its content are provided for informational and self-support purposes only.
|
|
||||||
- We do not guarantee specific emotional or psychological outcomes
|
|
||||||
- The App does not replace professional medical, mental health, or legal advice
|
|
||||||
- You are solely responsible for how you use the content
|
|
||||||
|
|
||||||
7. Service Availability
|
本App及其中的素材、内容(包括但不限于名人句子、图文等)版权归开发者或原作者所有,仅供个人学习交流使用。您不得擅自复制、传播、演绎或用于商业目的。若您使用内容时涉及版权问题,请自行妥善处理或联系我们协助。
|
||||||
We may modify, suspend, or discontinue any part of the App at any time due to maintenance, updates, or circumstances beyond our control.
|
|
||||||
We are not liable for any loss or damage resulting from such interruptions or changes.
|
|
||||||
|
|
||||||
8. Changes to These Terms
|
隐私保护:本App不要求注册登录,也不采集敏感个人信息。您自愿提供的昵称和偏好数据仅用于在本地设备上为您推荐内容,不会上传或共享给任何第三方。您可以选择不提供昵称,我们的核心功能不会因此受影响。
|
||||||
We may update these Terms of Use from time to time.
|
|
||||||
Updated versions will be made available within the App or related pages. Continued use of the App after changes indicates acceptance of the revised Terms.
|
|
||||||
|
|
||||||
9. Governing Law
|
版权声明:本App内所有内容(包括界面设计、程序代码、文字、图片、音视频等)及软件著作权均归开发者或相关权利人所有,受著作权法等法律保护。未经许可,任何个人或组织不得以任何形式复制、发行、展示、播发、修改、链接、转载或建立镜像。您仅可在个人使用的前提下使用本App及其内容。
|
||||||
These Terms shall be governed by and construed in accordance with the applicable laws of our operating jurisdiction.
|
|
||||||
|
|
||||||
---
|
免责声明:本App按“现状”和“可用”原则向您提供服务,对服务不作任何形式的担保(包括但不限于准确性、可靠性或持续可用性)。对于因网络故障、通信线路等客观原因导致的应用功能异常或信息延迟,我们不承担责任。您使用本App过程中应自行承担风险;在法律允许的范围内,对于您因使用本App而可能产生的任何直接或间接损失,我们不承担责任。
|
||||||
Hey Mama 使用條款
|
|
||||||
最後更新日期:2026 年 2 月
|
|
||||||
歡迎使用 Hey Mama(以下簡稱「本 App」、「我們」)。
|
|
||||||
在下載、存取或使用本 App 前,請您仔細閱讀本使用條款。當您開始使用本 App,即表示您已閱讀、理解並同意遵守本條款。
|
|
||||||
|
|
||||||
1. 服務對象與使用資格
|
协议的变更和终止:我们保留随时修改、更新本协议条款和/或终止本App运营的权利。如协议条款发生变更,我们将在应用更新或官网渠道公布最新协议内容,并提示用户注意更新。修改后的协议一经公布即生效,您继续使用本App即视为接受修改后的协议。
|
||||||
Hey Mama 僅供成年人使用(intended for adults)。
|
|
||||||
本 App 並非為兒童設計,使用者應確認自己具備依所在地法律使用本服務的完全行為能力。
|
|
||||||
|
|
||||||
2. 服務內容
|
法律适用和争议解决:本协议的订立、生效、解释及争议解决均适用中华人民共和国法律。因本协议或使用本App引起的任何争议,双方应友好协商解决;协商不成时,任何一方均可向开发者所在地有管辖权的法院提起诉讼。
|
||||||
Hey Mama 提供以文字形式為主的內容與功能,包括但不限於:
|
|
||||||
- 每日肯定語與正念文字內容
|
|
||||||
- 使用者設定的提醒與推送通知
|
|
||||||
- 桌面小組件顯示肯定語文字
|
|
||||||
- 內容閱讀與收藏等個人化體驗(如適用)
|
|
||||||
本 App 所提供之內容僅作為日常情緒支持與自我提醒用途,不構成任何形式的醫療、心理諮商或專業建議。
|
|
||||||
|
|
||||||
3. 使用方式與限制
|
其他:本协议与本隐私政策共同构成本App服务的完整规则。若本协议条款与隐私政策存在不一致之处,以隐私政策为准。本协议条款标题仅为阅读方便而设,不影响条款含义的解释。本协议最终解释权归开发者所有。如您对本协议内容有任何疑问或建议,请通过应用商店提供的联系方式与我们联系。
|
||||||
使用者同意:
|
|
||||||
- 僅將本 App 用於個人、非商業用途
|
|
||||||
- 不以任何方式複製、重製、散布、出售、反編譯或試圖取得本 App 之原始碼
|
|
||||||
- 不進行任何可能影響 App 正常運作、穩定性或其他使用者體驗之行為
|
|
||||||
如有違反,我們有權在不另行通知的情況下限制或終止使用權限。
|
|
||||||
|
|
||||||
4. 推送通知
|
感谢您使用本App!我们将持续优化服务体验,努力为您提供温暖和支持。
|
||||||
本 App 可能依使用者設定發送推送通知(例如每日肯定語提醒)。
|
|
||||||
- 推送內容僅為一般文字資訊
|
|
||||||
- 不包含個人化敏感資料
|
|
||||||
- 您可隨時透過裝置系統設定關閉通知功能
|
|
||||||
|
|
||||||
5. 智慧財產權
|
|
||||||
本 App 及其所有內容(包含但不限於文字、設計、介面、版面配置與視覺元素)之智慧財產權,均屬於我們或合法授權方所有。
|
|
||||||
未經事前書面同意,任何形式之使用、修改、重製或散布皆屬禁止。
|
|
||||||
|
|
||||||
6. 免責聲明
|
|
||||||
本 App 所提供之內容僅供一般參考與自我提醒之用。
|
|
||||||
- 我們不保證內容能產生特定心理、情緒或行為結果
|
|
||||||
- 本 App 不取代任何專業醫療、心理或法律建議
|
|
||||||
- 使用者應自行判斷內容是否適合自身狀況
|
|
||||||
|
|
||||||
7. 服務中斷與變更
|
|
||||||
我們可能因系統維護、功能調整、更新或其他不可抗力因素,暫時中斷或變更本 App 之全部或部分功能。
|
|
||||||
對於因此可能造成的任何直接或間接損失,我們不負任何責任。
|
|
||||||
|
|
||||||
8. 條款修改
|
|
||||||
我們可能不定期更新本使用條款。
|
|
||||||
更新後的版本將公布於 App 內或相關頁面,您於條款更新後繼續使用本 App,即視為同意更新內容。
|
|
||||||
|
|
||||||
9. 準據法與管轄
|
|
||||||
本使用條款之解釋與適用,悉依我們所在地之相關法律規定處理。
|
|
||||||
118
设计说明文档/隐私协议.md
@@ -1,119 +1,21 @@
|
|||||||
Hey Mama | Privacy Policy
|
隐私政策
|
||||||
Last updated: February 2026
|
|
||||||
|
|
||||||
1. Introduction
|
我们尊重并保护您的隐私。根据《个人信息保护法》《网络安全法》等法律法规的规定,以及 Apple App Store 审核指南要求,我们制定本隐私政策,帮助您了解我们如何收集、使用和保护您的信息:
|
||||||
Welcome to Hey Mama (“the App,” “we,” “us”).
|
|
||||||
We respect your privacy and are committed to protecting your personal information. This Privacy Policy explains how we collect, use, store, and protect information when you use the App.
|
|
||||||
By downloading, accessing, or using the App, you acknowledge that you have read, understood, and agreed to this Privacy Policy.
|
|
||||||
|
|
||||||
2. Data Controller and Scope
|
信息收集:本应用无需注册或登录,也不使用任何第三方授权。用户可自愿提供昵称,仅用于界面展示和个性化服务标识;通过问卷或点击行为记录您的内容偏好(如“喜欢/不喜欢”标签)。我们不会收集您的身份信息、地理位置、通讯录等敏感个人信息。
|
||||||
The App is operated and maintained by the Hey Mama team.
|
|
||||||
This Privacy Policy applies to information processing activities related to your use of the App.
|
|
||||||
|
|
||||||
3. Information We Collect
|
信息使用:我们仅使用上述收集的信息进行个性化推荐和名人句子定时推送,不用于其他任何目的,不进行广告或营销投放。所有个性化功能均基于您在应用中的操作和偏好生成。
|
||||||
3.1 Information You Provide
|
|
||||||
Hey Mama does not require account registration and does not require you to provide personally identifiable information.
|
|
||||||
During your use of the App, you may optionally provide or generate the following information:
|
|
||||||
- Reminder settings (e.g., reminder frequency)
|
|
||||||
- Text content you view, save as favorites, or create within the App (if available)
|
|
||||||
This information is used only to operate core App features and provide a personalized experience.
|
|
||||||
|
|
||||||
3.2 Information Collected Automatically
|
数据存储和安全:所有数据均存储在您设备本地,不上传至服务器;本应用不接入任何第三方 SDK。我们采用系统加密和权限隔离等安全机制保护本地数据,防止未经授权的访问。您可以随时通过清除应用数据或卸载应用来删除您的个人信息。
|
||||||
When you use the App, we may automatically collect certain non-identifiable technical information, including but not limited to:
|
|
||||||
- Device type and operating system version
|
|
||||||
- App version
|
|
||||||
- Device language settings
|
|
||||||
- Basic usage status (e.g., whether the App is opened, whether reminders are enabled)
|
|
||||||
This information does not directly identify you and is primarily used to maintain App stability, troubleshoot issues, and improve user experience.
|
|
||||||
The App does not collect precise location information for the purposes described in this policy, does not engage in cross-app tracking, and does not use your data for third-party advertising.
|
|
||||||
|
|
||||||
4. Push Notifications
|
信息共享:我们不会向任何无关第三方提供、出售、出租或分享您的个人信息。未经您明确同意,我们绝不公开您的任何信息,除非法律法规要求或为维护您合法权益所必需。
|
||||||
With your permission, the App may send you reminder notifications, such as daily affirmations.
|
|
||||||
- Notifications contain general text information only
|
|
||||||
- Notifications do not include sensitive personal data
|
|
||||||
- You can disable notifications at any time in your device settings
|
|
||||||
|
|
||||||
5. Home Screen Widgets
|
用户权利与选择:您有权自主决定是否提供个人信息,并可对已提供的信息进行查询、修改或删除。您可以随时在应用中清除偏好设置,或卸载应用以删除所有本地数据。根据法律法规,您还可以通过我们的客服途径要求访问、更正或删除您的信息。
|
||||||
If you choose to use home screen widgets, the displayed content comes from the App’s text-based affirmations. Widgets do not collect or transmit additional personal data.
|
|
||||||
|
|
||||||
6. How We Use Information
|
未成年人保护:本应用主要面向成人用户设计,不针对未成年人提供特殊服务。如 18 岁以下用户使用,请在监护人陪同下进行。我们不会在未征得监护人同意的情况下收集或使用未成年人的个人信息。
|
||||||
We use collected information only for the following purposes:
|
|
||||||
- To provide and maintain core App functionality
|
|
||||||
- To improve content presentation and user experience
|
|
||||||
- To fix bugs and enhance system stability
|
|
||||||
We do not:
|
|
||||||
- Sell, rent, or trade your personal data
|
|
||||||
- Use your data for third-party advertising purposes
|
|
||||||
|
|
||||||
7. Third-Party Services
|
隐私政策更新:我们可能会根据产品功能变化或法律法规要求更新本隐私政策,并在应用内或相关页面公布最新版本。您继续使用本应用即视为接受更新后的隐私政策。如有重大变更,我们会适当提示您。
|
||||||
Hey Mama currently does not integrate third-party advertising or marketing services.
|
|
||||||
The App may rely on necessary operating system and app store services to provide functionality (for example, push notification delivery mechanisms).
|
|
||||||
If we later integrate third-party analytics or technical services, we will update this Privacy Policy accordingly.
|
|
||||||
|
|
||||||
8. Data Retention and Security
|
我们承诺在此过程中严格遵守相关法律法规和行业标准,切实保护您的个人信息安全。本隐私政策与用户使用协议共同构成本应用合法合规运营的基础。
|
||||||
We retain information only for as long as necessary to achieve the purposes described above. We implement reasonable technical and organizational measures to protect information against unauthorized access, disclosure, alteration, or loss.
|
|
||||||
|
|
||||||
9. Minors
|
|
||||||
Hey Mama is not designed for children, and we do not knowingly collect personal information from users under the age of 13.
|
|
||||||
If you are a minor, please use the App with the consent and supervision of a parent or guardian.
|
|
||||||
|
|
||||||
10. Changes to This Privacy Policy
|
|
||||||
We may update this Privacy Policy from time to time. The updated version will be made available within the App or through related pages. If you continue to use the App after updates take effect, you are deemed to have accepted the updated policy.
|
|
||||||
|
|
||||||
|
|
||||||
---
|
|
||||||
Hey Mama|隱私權政策
|
|
||||||
最後更新日期:2026 年 2 月
|
|
||||||
|
|
||||||
一、前言
|
|
||||||
歡迎使用 Hey Mama(以下簡稱「本 App」、「我們」)。
|
|
||||||
我們重視您的隱私,並致力於保護您的個人資料安全。本隱私權政策說明您在使用 Hey Mama 時,我們如何收集、使用、保存與保護相關資訊。
|
|
||||||
當您下載、存取或使用本 App,即表示您已閱讀、理解並同意本隱私權政策之內容。
|
|
||||||
|
|
||||||
二、我們收集的資訊
|
|
||||||
1. 使用者主動提供的資訊
|
|
||||||
Hey Mama 不要求建立帳號,亦不強制使用者提供可識別個人身分的資料。
|
|
||||||
在使用過程中,您可能會選擇性提供或產生以下資訊:
|
|
||||||
- 提醒設定(例如提醒頻率)
|
|
||||||
- 使用者在 App 內閱讀、收藏或建立的文字內容(如有)
|
|
||||||
上述資訊僅用於 App 功能運作與個人化體驗。
|
|
||||||
2. 自動收集的資訊
|
|
||||||
當您使用本 App 時,我們可能會自動收集部分非識別性技術資訊,包括但不限於:
|
|
||||||
- 裝置類型與作業系統版本
|
|
||||||
- App 版本
|
|
||||||
- 裝置語言設定
|
|
||||||
- 基本使用行為(例如是否開啟 App、是否啟用提醒)
|
|
||||||
這些資訊無法直接識別您的身分,僅用於維持 App 穩定性與改善使用體驗。
|
|
||||||
|
|
||||||
三、推送通知
|
|
||||||
在取得您同意後,Hey Mama 可能會向您發送提醒推送,例如每日肯定語提示。
|
|
||||||
- 推送內容僅包含一般文字資訊
|
|
||||||
- 不包含任何敏感個人資料
|
|
||||||
- 您可隨時於裝置系統設定中關閉通知功能
|
|
||||||
|
|
||||||
四、桌面小組件
|
|
||||||
若您選擇使用桌面小組件,其顯示內容僅來自 App 內的文字肯定語,不會額外收集或傳送新的個人資料。
|
|
||||||
|
|
||||||
五、資訊使用方式
|
|
||||||
我們僅於下列目的範圍內使用所收集的資訊:
|
|
||||||
- 提供與維護 App 的基本功能
|
|
||||||
- 改善內容呈現與使用體驗
|
|
||||||
- 修復錯誤與提升系統穩定性
|
|
||||||
我們不會:
|
|
||||||
- 出售、出租或交換您的個人資料
|
|
||||||
- 將資料用於第三方廣告投放
|
|
||||||
|
|
||||||
六、第三方服務
|
|
||||||
目前 Hey Mama 未整合第三方廣告或行銷服務。
|
|
||||||
如未來整合第三方分析或技術服務,我們將於本政策中另行說明並更新。
|
|
||||||
|
|
||||||
七、資料保存與安全
|
|
||||||
我們僅在達成上述目的所需期間內保存相關資訊,並採取合理的技術與管理措施,以防止資料遭未經授權存取、洩漏、竄改或遺失。
|
|
||||||
|
|
||||||
八、未成年人說明
|
|
||||||
Hey Mama 並非專為兒童設計,亦不刻意收集未滿 13 歲使用者的個人資料。
|
|
||||||
若您為未成年人,請在監護人同意與陪同下使用本 App。
|
|
||||||
|
|
||||||
九、隱私權政策的變更
|
|
||||||
我們可能會不定期更新本隱私權政策。
|
|
||||||
更新後的版本將公布於 App 內或相關頁面,您於政策更新後繼續使用本 App,即視為同意更新內容。
|
|
||||||