You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

338 lines
9.9 KiB

import { View, Text, StyleSheet, TouchableOpacity, Image, SafeAreaView, StatusBar, Platform } from "react-native";
1 month ago
import BackIcon from "../../components/BackIcon";
import fontSize from "../../utils/fontsizeUtils";
import { useNavigation, useRoute, RouteProp } from "@react-navigation/native";
import { NativeStackNavigationProp } from "@react-navigation/native-stack";
import { RootStackParamList } from "../../navigation/types";
import { useState, useEffect } from "react";
import { settingApi, Country } from "../../services/api/setting";
import { FlatList } from "react-native";
import flagMap from "../../utils/flagMap";
import CheckIcon from "../../components/CheckIcon";
import Toast from "react-native-toast-message";
import { eventBus } from "../../utils/eventBus";
import { changeLanguage } from "../../i18n";
import { t } from "../../i18n";
1 month ago
// Define CountryList type to match API response
type CountryList = {
country: number;
currency: string;
language: string;
name: string;
name_en: string;
timezone: string;
user_count: number;
valid_digits: number[];
};
1 month ago
export const CountrySetting = () => {
const navigation =
useNavigation<NativeStackNavigationProp<RootStackParamList>>();
const route = useRoute<RouteProp<RootStackParamList, "CountrySetting">>();
const [changeType, setChangeType] = useState<string>("country");
const [countryList, setCountryList] = useState<CountryList[]>([]);
1 month ago
const [currencyList, setCurrencyList] = useState<string[]>([]);
const [languageList, setLanguageList] = useState<string[]>([]);
const [country, setCountry] = useState<number>(0);
const [currency, setCurrency] = useState<string>("");
const [language, setLanguage] = useState<string>("");
const getCountry = async () => {
const res = await settingApi.getCountryList();
setCountryList(res);
setCountry(route.params?.mySetting?.country || 0);
};
const getCurrency = async () => {
const res = await settingApi.getCurrencyList();
setCurrencyList(res);
setCurrency(route.params?.mySetting?.currency || "");
};
const getLanguage = async () => {
const res = await settingApi.getLanguageList();
setLanguageList(res);
setLanguage(route.params?.mySetting?.language || "");
};
useEffect(() => {
getCountry();
getCurrency();
getLanguage();
}, []);
const putSettinghandel = async () => {
const data = {
country: country,
currency: currency,
language: language,
};
Toast.show({
text1: t('setting.success'),
1 month ago
type: "success",
visibilityTime: 1000,
});
await settingApi.putSetting(data);
if (language) {
await changeLanguage(language);
}
1 month ago
eventBus.emit("refreshSetting");
};
return (
<SafeAreaView style={styles.safeArea}>
<StatusBar barStyle="dark-content" backgroundColor="#fff" />
<View style={styles.safeAreaContent}>
<View style={styles.header}>
<TouchableOpacity
onPress={() => navigation.goBack()}
style={styles.backButton}
>
<BackIcon size={fontSize(24)} />
</TouchableOpacity>
<Text style={styles.title}>{t('setting.title')}</Text>
<View style={styles.placeholder} />
</View>
<View style={styles.changeType}>
<TouchableOpacity
style={[
styles.changeTypeText,
changeType === "country" && styles.changeTypeTextActive,
]}
onPress={() => setChangeType("country")}
>
<Text style={styles.changeTypeTextTitle}>{t('setting.country')}</Text>
</TouchableOpacity>
<TouchableOpacity
style={[
styles.changeTypeText,
changeType === "currency" && styles.changeTypeTextActive,
]}
onPress={() => setChangeType("currency")}
>
<Text style={styles.changeTypeTextTitle}>{t('setting.currency')}</Text>
</TouchableOpacity>
<TouchableOpacity
style={[
styles.changeTypeText,
changeType === "language" && styles.changeTypeTextActive,
]}
onPress={() => setChangeType("language")}
>
<Text style={styles.changeTypeTextTitle}>{t('setting.language')}</Text>
</TouchableOpacity>
1 month ago
</View>
{changeType === "country" && (
<View style={styles.countryList}>
<FlatList
keyExtractor={(item) => String(item.name)}
data={countryList}
showsVerticalScrollIndicator={false}
showsHorizontalScrollIndicator={false}
renderItem={({ item }) => (
<TouchableOpacity
key={item.country}
style={styles.countryItem}
onPress={() => {
setCountry(item.country);
}}
>
<View style={styles.countryItemContent}>
<Image
source={flagMap.get(item.name_en)}
style={styles.countryFlag}
/>
<Text>{item.name_en} {item.country}</Text>
</View>
<View>
{country === item.country && (
<CheckIcon size={fontSize(24)} color="#ff611a" />
)}
</View>
</TouchableOpacity>
)}
/>
</View>
)}
{changeType === "currency" && (
<View style={styles.countryList}>
<FlatList
keyExtractor={(item) => item}
showsVerticalScrollIndicator={false}
showsHorizontalScrollIndicator={false}
data={currencyList}
renderItem={({ item }) => (
<TouchableOpacity
style={styles.countryItem}
onPress={() => setCurrency(item)}
>
<View style={styles.countryItemContent}>
<View>
<Text>{item}</Text>
</View>
</View>
1 month ago
<View>
{currency === item && (
<CheckIcon size={fontSize(24)} color="#ff611a" />
)}
</View>
</TouchableOpacity>
)}
/>
</View>
)}
{changeType === "language" && (
<View style={styles.countryList}>
<FlatList
keyExtractor={(item) => item}
showsVerticalScrollIndicator={false}
showsHorizontalScrollIndicator={false}
data={languageList}
renderItem={({ item }) => (
<TouchableOpacity
style={styles.countryItem}
onPress={() => setLanguage(item)}
>
<View style={styles.countryItemContent}>
1 month ago
<Text>{item}</Text>
</View>
<View>
{language === item && (
<CheckIcon size={fontSize(24)} color="#ff611a" />
)}
</View>
</TouchableOpacity>
)}
/>
</View>
)}
<TouchableOpacity style={styles.bottomButton} onPress={putSettinghandel}>
<Text style={styles.buttonText}>{t('setting.confirm')}</Text>
</TouchableOpacity>
</View>
</SafeAreaView>
1 month ago
);
};
const styles = StyleSheet.create({
safeArea: {
flex: 1,
backgroundColor: '#fff',
},
safeAreaContent: {
flex: 1,
paddingTop: 0,
},
1 month ago
container: {
flex: 1,
backgroundColor: "#fff",
1 month ago
},
header: {
paddingInline: 20,
flexDirection: "row",
alignItems: "center",
justifyContent: "space-between",
backgroundColor: "white",
width: "100%",
paddingVertical: 15,
borderBottomWidth: 1,
borderBottomColor: "#e9ecef",
shadowColor: "#000",
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.1,
shadowRadius: 4,
elevation: 3,
},
backButton: {
width: fontSize(24),
},
title: {
fontSize: fontSize(20),
fontWeight: "600",
flex: 1,
textAlign: "center",
},
placeholder: {
width: fontSize(24),
},
changeType: {
backgroundColor: "white",
width: "100%",
marginBottom: 20,
flexDirection: "row",
alignItems: "center",
},
changeTypeText: {
width: "33%",
paddingVertical: 15,
},
changeTypeTextTitle: {
fontSize: fontSize(16),
color: "#343a40",
fontFamily: "PingFangSC-Medium",
textAlign: "center",
fontWeight: "600",
},
changeTypeTextActive: {
borderBottomWidth: 2,
borderBottomColor: "#ff611a",
color: "#ff611a",
},
countryList: {
backgroundColor: "white",
borderRadius: 10,
marginHorizontal: 20,
marginBottom: 70,
},
countryItem: {
paddingVertical: 12,
borderBottomWidth: 1,
paddingHorizontal: 10,
borderBottomColor: "#e9ecef",
fontSize: fontSize(16),
fontFamily: "PingFangSC-Medium",
fontWeight: "600",
flexDirection: "row",
alignItems: "center",
justifyContent: "space-between",
},
countryFlag: {
width: 24,
height: 24,
marginRight: 10,
borderRadius: 12,
},
countryItemContent: {
flexDirection: "row",
alignItems: "center",
},
bottomButton: {
position: "absolute",
bottom: 0,
left: 0,
right: 0,
height: 60,
backgroundColor: "#ffff",
justifyContent: "center",
alignItems: "center",
padding: 10,
borderTopWidth: 1,
borderTopColor: "#e9ecef",
shadowColor: "#000",
shadowOffset: { width: 0, height: -2 },
shadowOpacity: 0.1,
shadowRadius: 4,
elevation: 5,
},
buttonText: {
fontSize: fontSize(18),
fontWeight: "600",
width: "90%",
backgroundColor: "#ff611a",
color: "white",
textAlign: "center",
paddingVertical: 10,
borderRadius: 10,
},
});