75 lines
2.4 KiB
TypeScript
75 lines
2.4 KiB
TypeScript
import { useState } from 'react';
|
|
import { Alert, Pressable, StyleSheet, Text, View } from 'react-native';
|
|
import { useRouter } from 'expo-router';
|
|
import { useTranslation } from 'react-i18next';
|
|
import * as Notifications from 'expo-notifications';
|
|
|
|
import { setPushPromptState } from '@/src/storage/appStorage';
|
|
|
|
export default function PushPromptScreen() {
|
|
const router = useRouter();
|
|
const { t } = useTranslation();
|
|
const [loading, setLoading] = useState(false);
|
|
|
|
async function goHome() {
|
|
router.replace('/(app)/home');
|
|
}
|
|
|
|
async function onLater() {
|
|
await setPushPromptState('skipped');
|
|
await goHome();
|
|
}
|
|
|
|
async function onEnableNow() {
|
|
// 触发系统权限申请(可失败,但不阻塞进入主功能)
|
|
setLoading(true);
|
|
try {
|
|
await Notifications.requestPermissionsAsync();
|
|
await setPushPromptState('enabled');
|
|
await goHome();
|
|
} catch (e) {
|
|
Alert.alert(t('push.errorTitle'), t('push.errorDesc'));
|
|
await goHome();
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
}
|
|
|
|
return (
|
|
<View style={styles.container}>
|
|
<View style={styles.card}>
|
|
<Text style={styles.title}>{t('push.cardTitle')}</Text>
|
|
<Text style={styles.desc}>{t('push.cardDesc')}</Text>
|
|
</View>
|
|
|
|
<View style={styles.actions}>
|
|
<Pressable style={[styles.btn, styles.secondary]} onPress={onLater} disabled={loading}>
|
|
<Text style={[styles.btnText, styles.secondaryText]}>{t('push.later')}</Text>
|
|
</Pressable>
|
|
<Pressable style={[styles.btn, styles.primary]} onPress={onEnableNow} disabled={loading}>
|
|
<Text style={styles.btnText}>{loading ? t('push.loading') : t('push.enable')}</Text>
|
|
</Pressable>
|
|
</View>
|
|
</View>
|
|
);
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
container: { flex: 1, padding: 20, justifyContent: 'center', gap: 16 },
|
|
card: {
|
|
borderRadius: 18,
|
|
padding: 20,
|
|
backgroundColor: '#111827',
|
|
gap: 10
|
|
},
|
|
title: { color: 'white', fontSize: 20, fontWeight: '700' },
|
|
desc: { color: '#E5E7EB', fontSize: 15, lineHeight: 21 },
|
|
actions: { flexDirection: 'row', gap: 12 },
|
|
btn: { flex: 1, paddingVertical: 14, borderRadius: 14, alignItems: 'center' },
|
|
primary: { backgroundColor: '#16A34A' },
|
|
secondary: { backgroundColor: '#F3F4F6' },
|
|
btnText: { fontSize: 16, fontWeight: '600', color: '#FFFFFF' },
|
|
secondaryText: { color: '#111827' }
|
|
});
|
|
|