Files
mindfulness/client/components/home/ThemeModal.tsx
2026-01-29 19:09:36 +08:00

111 lines
2.4 KiB
TypeScript

import React from 'react';
import { Image, Pressable, StyleSheet, Text, View } from 'react-native';
import { useTranslation } from 'react-i18next';
import SheetModal from '@/components/ui/SheetModal';
export type ThemeMode = 'scenery' | 'color';
type Props = {
visible: boolean;
mode: ThemeMode;
onSelect: (mode: ThemeMode) => void;
onClose: () => void;
};
export default function ThemeModal({ visible, mode, onSelect, onClose }: Props) {
const { t } = useTranslation();
return (
<SheetModal visible={visible} title={t('theme.title')} onClose={onClose}>
<View style={styles.row}>
<ThemeCard
title={t('theme.scenery')}
selected={mode === 'scenery'}
onPress={() => onSelect('scenery')}
>
<Image
source={require('../../assets/images/index/index_flowers.png')}
resizeMode="cover"
style={styles.previewImage}
/>
</ThemeCard>
<ThemeCard
title={t('theme.color')}
selected={mode === 'color'}
onPress={() => onSelect('color')}
>
<View style={styles.colorPreview} />
</ThemeCard>
</View>
</SheetModal>
);
}
function ThemeCard({
title,
selected,
onPress,
children,
}: {
title: string;
selected: boolean;
onPress: () => void;
children: React.ReactNode;
}) {
return (
<Pressable
onPress={onPress}
style={[styles.card, selected ? styles.cardSelected : styles.cardUnselected]}
hitSlop={6}
>
<View style={styles.preview}>{children}</View>
<Text style={styles.cardTitle}>{title}</Text>
</Pressable>
);
}
const styles = StyleSheet.create({
row: {
flexDirection: 'row',
gap: 14,
paddingBottom: 18,
},
card: {
flex: 1,
borderRadius: 18,
padding: 10,
backgroundColor: 'rgba(255,255,255,0.55)',
},
cardSelected: {
borderWidth: 2,
borderColor: '#F99CC0',
},
cardUnselected: {
borderWidth: StyleSheet.hairlineWidth,
borderColor: 'rgba(94,42,40,0.18)',
},
preview: {
height: 96,
borderRadius: 14,
overflow: 'hidden',
backgroundColor: '#fff',
marginBottom: 10,
},
previewImage: {
width: '100%',
height: '100%',
},
colorPreview: {
flex: 1,
backgroundColor: '#F3D0E1',
},
cardTitle: {
color: '#5E2A28',
fontSize: 14,
fontWeight: '700',
textAlign: 'center',
},
});