111 lines
2.4 KiB
TypeScript
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',
|
|
},
|
|
});
|
|
|