feat: Expo scaffold + auth screens + core screens (#39-#46, #48)

This commit is contained in:
Nemo
2026-03-23 18:40:04 +08:00
commit 745321e5bd
45 changed files with 10557 additions and 0 deletions

View File

@@ -0,0 +1,57 @@
import React from 'react';
import { Modal, View, Text, TouchableOpacity } from 'react-native';
import { AppButton } from './AppButton';
interface ConfirmModalProps {
visible: boolean;
title: string;
message: string;
confirmLabel?: string;
cancelLabel?: string;
confirmVariant?: 'primary' | 'danger';
onConfirm: () => void;
onCancel: () => void;
}
export const ConfirmModal: React.FC<ConfirmModalProps> = ({
visible,
title,
message,
confirmLabel = 'Confirm',
cancelLabel = 'Cancel',
confirmVariant = 'primary',
onConfirm,
onCancel,
}) => {
return (
<Modal visible={visible} transparent animationType="fade" onRequestClose={onCancel}>
<TouchableOpacity
className="flex-1 bg-black/50 items-center justify-center px-6"
activeOpacity={1}
onPress={onCancel}
>
<TouchableOpacity
className="w-full bg-white rounded-2xl p-6 shadow-lg"
activeOpacity={1}
>
<Text className="text-xl font-bold text-gray-900 mb-2">{title}</Text>
<Text className="text-gray-600 text-sm mb-6">{message}</Text>
<View className="flex-row gap-3">
<AppButton
title={cancelLabel}
onPress={onCancel}
variant="outline"
className="flex-1"
/>
<AppButton
title={confirmLabel}
onPress={onConfirm}
variant={confirmVariant}
className="flex-1"
/>
</View>
</TouchableOpacity>
</TouchableOpacity>
</Modal>
);
};