import React from "react"; import { View, Text, TextInput, Image, TouchableOpacity, StyleSheet, KeyboardAvoidingView, Platform, ActivityIndicator, Modal, FlatList, Dimensions, StatusBar, SafeAreaView, ScrollView } from "react-native"; import { useState } from "react"; import AsyncStorage from "@react-native-async-storage/async-storage"; import BackIcon from "../../components/BackIcon"; import { useNavigation, useRoute, RouteProp } from "@react-navigation/native"; import { AddressItem } from "../../services/api/addressApi"; import { useAddressStore } from "../../store/address"; import { NativeStackNavigationProp } from "@react-navigation/native-stack"; import { settingApi } from "../../services/api/setting"; import flagMap from "../../utils/flagMap"; import useCreateOrderStore from "../../store/createOrder"; import useBurialPointStore from "../../store/burialPoint"; import {getBurialPointData} from "../../store/burialPoint"; import { useTranslation } from "react-i18next"; import fontSize from "../../utils/fontsizeUtils"; type RootStackParamList = { AddRess: { address?: AddressItem; cart_item_id?: number | string }; AddressList: undefined; ShippingFee: { cart_item_id : {}}; }; type AddRessRouteProp = RouteProp; export const PreviewAddress = () => { const { t } = useTranslation(); const { defaultAddress, fetchDefaultAddress, loading, } = useAddressStore(); const navigation = useNavigation>(); const route = useRoute(); const { logAddressInfo } = useBurialPointStore(); const [open, setOpen] = useState(false); const [value, setValue] = useState(null); const [items, setItems] = useState<{label: string; value: string}[]>([]); const [selectedCountryLabel, setSelectedCountryLabel] = useState(""); const [countryList, setCountryList] = useState([]); const { setOrderData ,orderData} = useCreateOrderStore(); const [formData, setFormData] = useState({ receiver_first_name: "", receiver_last_name: "", country: "", receiver_phone: "", receiver_phone_again: "", whatsapp_phone: "", is_default: false, }); const [selectedCountry, setSelectedCountry] = useState(null); const [isDefault, setIsDefault] = useState(false); const [copyPhoneToWhatsApp, setCopyPhoneToWhatsApp] = useState(false); const [phoneNumbersMatch, setPhoneNumbersMatch] = useState(true); const [errors, setErrors] = useState>({}); // Get selected country data const fetchSelectedCountry = async () => { try { const countryData = await AsyncStorage.getItem("@selected_country"); if (countryData) { const parsedData = JSON.parse(countryData); setSelectedCountry(parsedData); setValue(parsedData.name); } } catch (error) { console.error("Error fetching selected country:", error); } }; // Initialize loading React.useEffect(() => { fetchSelectedCountry(); fetchDefaultAddress(); // If there is an address in route params, use it first if (route.params?.address) { setFormData({ ...route.params.address, receiver_phone_again: route.params.address.receiver_phone, is_default: Boolean(route.params.address.is_default), }); // Set country dropdown default value to address country setValue(route.params.address.country || null); } }, []); // When countryList loaded, set selected country label React.useEffect(() => { if (countryList.length > 0) { // If there is an address in route params const addressFromRoute = route.params?.address; if (addressFromRoute && addressFromRoute.country) { const selectedCountry = countryList.find(item => item.name_en === addressFromRoute.country || item.value === addressFromRoute.country ); if (selectedCountry) { setSelectedCountryLabel(selectedCountry.label); setValue(selectedCountry.value); } } // If no route params but there is default address else if (defaultAddress && defaultAddress.country && !route.params?.address) { const selectedCountry = countryList.find(item => item.name_en === defaultAddress.country || item.value === defaultAddress.country ); if (selectedCountry) { setSelectedCountryLabel(selectedCountry.label); setValue(selectedCountry.value); } } } }, [countryList, route.params?.address, defaultAddress]); // Monitor phone number changes, if copy option is checked then automatically update WhatsApp number React.useEffect(() => { if (copyPhoneToWhatsApp) { setFormData((prev) => ({ ...prev, whatsapp_phone: prev.receiver_phone, })); } }, [formData.receiver_phone, copyPhoneToWhatsApp]); // Monitor phone number changes, verify if two inputs match React.useEffect(() => { if (formData.receiver_phone && formData.receiver_phone_again) { setPhoneNumbersMatch( formData.receiver_phone === formData.receiver_phone_again ); } else { setPhoneNumbersMatch(true); } }, [formData.receiver_phone, formData.receiver_phone_again]); // Monitor defaultAddress changes React.useEffect(() => { if (defaultAddress && !route.params?.address) { setFormData({ receiver_first_name: defaultAddress.receiver_first_name || "", receiver_last_name: defaultAddress.receiver_last_name || "", country: defaultAddress.country || "", receiver_phone: defaultAddress.receiver_phone || "", receiver_phone_again: defaultAddress.receiver_phone || "", whatsapp_phone: defaultAddress.whatsapp_phone || "", is_default: Boolean(defaultAddress.is_default), }); setValue(defaultAddress.country || null); } }, [defaultAddress, route.params?.address]); React.useEffect(() => { settingApi.getCountryList().then((res) => { const formattedCountries = res.map((item) => ({ label: `${item.name_en} (${item.country})`, value: item.name.toString(), flag: flagMap.get(item.name_en), name_en: item.name_en, country: item.country })); setItems(formattedCountries); setCountryList(formattedCountries); }); }, []); const validateForm = () => { const newErrors: Record = {}; if (!formData.receiver_first_name) { newErrors.receiver_first_name = t("address.errors.first_name_required"); } if (!formData.receiver_last_name) { newErrors.receiver_last_name = t("address.errors.last_name_required"); } if (!formData.receiver_phone) { newErrors.receiver_phone = t("address.errors.phone_required"); } if (!formData.receiver_phone_again) { newErrors.receiver_phone_again = t("address.errors.confirm_phone_required"); } if (formData.receiver_phone !== formData.receiver_phone_again) { newErrors.receiver_phone_again = t("address.errors.phone_mismatch"); } if (!formData.whatsapp_phone) { newErrors.whatsapp_phone = t("address.errors.whatsapp_required"); } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = async () => { if (validateForm()) { setOrderData({ ...orderData, address_id: defaultAddress?.address_id, }); const logData = { last_name: formData.receiver_last_name, first_name: formData.receiver_first_name, country: formData.country, phone_number: Number(formData.receiver_phone), whatsApp_number: Number(formData.whatsapp_phone), } logAddressInfo(logData,navigation.getState().routes[navigation.getState().index - 1]?.name as string); console.log(getBurialPointData()); navigation.navigate("ShippingFee",{ cart_item_id: route.params, }); } }; const handleCountrySelect = (item: any) => { setValue(item.value); setSelectedCountryLabel(item.label); setOpen(false); }; return ( {loading ? ( ) : ( navigation.goBack()}> {t("address.select_recipient")} {t("address.preview.default_address")} navigation.navigate("AddressList")}> {t("address.preview.choose_other")} {/* First Name Field */} {t("address.first_name")} * setFormData({ ...formData, receiver_first_name: text, }) } editable={false} /> {errors.receiver_first_name && ( {errors.receiver_first_name} )} {/* Last Name Field */} {t("address.last_name")} * setFormData({ ...formData, receiver_last_name: text }) } editable={false} /> {errors.receiver_last_name && ( {errors.receiver_last_name} )} {/* Country */} {t("address.country")} setOpen(true)} disabled={true} > {selectedCountryLabel ? ( {selectedCountryLabel} ) : ( {t("address.placeholder.select_country")} )} {/* Phone Number Section */} {t("address.phone_number")} * setFormData({ ...formData, receiver_phone: text, }) } editable={false} /> {errors.receiver_phone && ( {errors.receiver_phone} )} {t("address.confirm_phone_number")} * setFormData({ ...formData, receiver_phone_again: text, }) } editable={false} /> {errors.receiver_phone_again && ( {errors.receiver_phone_again} )} {!phoneNumbersMatch && ( {t("address.errors.phone_mismatch")} )} {/* WhatsApp Field */} {t("address.whatsapp")} * setFormData({ ...formData, whatsapp_phone: text }) } editable={false} /> {errors.whatsapp_phone && ( {errors.whatsapp_phone} )} setCopyPhoneToWhatsApp(!copyPhoneToWhatsApp) } > {copyPhoneToWhatsApp && ( )} {t("address.copy_phone_to_whatsapp")} {/* Default Setting Section */} {/* {t("address.set_default")} setFormData({ ...formData, is_default: !formData.is_default, }) } trackColor={{ false: "#767577", true: "#81b0ff" }} thumbColor={formData.is_default ? "#002fa7" : "#f4f3f4"} ios_backgroundColor="#3e3e3e" /> */} {/* Submit Button */} {t("address.submit")} )} setOpen(false)} > {t("address.select_country")} setOpen(false)}> {t("address.close")} item.value} renderItem={({ item }) => ( handleCountrySelect(item)} > {item.flag && ( )} {item.label} {value === item.value && ( )} )} style={styles.flatList} contentContainerStyle={styles.flatListContent} /> ); }; const styles = StyleSheet.create({ safeArea: { flex: 1, backgroundColor: '#fff', }, safeAreaContent: { flex: 1, paddingTop: Platform.OS === 'android' ? 0 : 0, }, container: { flex: 1, backgroundColor: '#fff', }, scrollContainer: { flexGrow: 1, paddingBottom: 20, }, recipientFormContainer3: { flex: 1, flexDirection: "column", alignItems: "stretch", justifyContent: "flex-start", }, loadingContainer: { flex: 1, justifyContent: "center", alignItems: "center", }, recipientFormContainer1: { width: "100%", padding: 15, paddingBottom: 32, }, recipientFormContainer2: { width: "100%", flexDirection: "column", alignItems: "stretch", justifyContent: "flex-start", }, titleContainer: { width: "100%", flexDirection: "row", alignItems: "center", justifyContent: "center", position: "relative", }, backIconContainer: { position: "absolute", left: 0, }, titleHeading: { fontWeight: "600", fontSize: fontSize(20), lineHeight: 22, fontFamily: "PingFang SC", color: "black", }, recipientInfoForm: { marginTop: 35, }, recipientInfoHeadingContainer: { flexDirection: "row", alignItems: "center", justifyContent: "space-between", }, recipientInfoHeading: { padding: 0, margin: 0, fontWeight: "500", fontSize: fontSize(18), lineHeight: 22, fontFamily: "PingFang SC", color: "black", }, recipientInfoHeadingEmit:{ padding: 0, margin: 0, fontWeight: "500", fontSize: fontSize(18), lineHeight: 22, fontFamily: "PingFang SC", color: "#ff731e", textDecorationLine: "underline", }, contactFormContainer: { width: "100%", marginTop: 9, }, formFieldContainer: { width: "100%", padding: 6, paddingLeft: 8, paddingBottom: 10, backgroundColor: "white", borderWidth: 1, borderColor: "#dbdce0", borderRadius: 5, }, flexRowCentered: { flexDirection: "row", alignItems: "center", justifyContent: "flex-start", }, elegantTextSnippet: { padding: 0, margin: 0, fontWeight: "500", fontSize: fontSize(12), fontFamily: "PingFang SC", color: "#646472", }, redTextHeading: { padding: 0, margin: 0, marginLeft: 1, fontWeight: "500", fontSize: fontSize(18), lineHeight: 22, fontFamily: "PingFang SC", color: "#fe1e00", }, pingFangText: { padding: 0, margin: 0, marginTop: -2, fontWeight: "400", fontSize: fontSize(16), lineHeight: 22, fontFamily: "PingFang SC", color: "#807e7e", }, pingFangText1: { padding: 0, margin: 0, marginTop: -2, fontWeight: "400", fontSize: fontSize(16), lineHeight: 22, fontFamily: "PingFang SC", color: "#807e7e", }, copyContainer: { marginTop: 10, flexDirection: "row", alignItems: "center", }, checkboxContainer: { flexDirection: "row", alignItems: "center", }, checkbox: { width: 15, height: 15, borderWidth: 1, borderColor: "#dbdce0", borderRadius: 4, marginRight: 8, justifyContent: "center", alignItems: "center", }, checked: { backgroundColor: "#002fa7", borderColor: "#002fa7", }, checkmark: { color: "white", fontSize: 12, }, checkboxLabel: { fontSize: fontSize(14), color: "#646472", fontFamily: "PingFang SC", }, lastNameInputContainer: { width: "100%", padding: 6, paddingLeft: 8, paddingBottom: 10, marginTop: 12, backgroundColor: "white", borderWidth: 1, borderColor: "#dbdce0", borderRadius: 5, }, lastNameInputContainer1: { width: "100%", padding: 6, paddingLeft: 8, paddingBottom: 10, backgroundColor: "white", borderTopWidth: 1, borderColor: "#dbdce0", }, redAsteriskTextStyle: { padding: 0, margin: 0, marginLeft: 1, fontWeight: "500", fontSize: fontSize(18), lineHeight: 22, fontFamily: "PingFang SC", color: "#fe1e00", }, formContainer: { flexDirection: "column", alignItems: "stretch", justifyContent: "center", width: "100%", marginTop: 12, backgroundColor: "white", borderWidth: 1, borderColor: "#dbdce0", }, optionListDropdown: {}, verticalCenteredColumn: { flexDirection: "column", alignItems: "stretch", justifyContent: "center", marginTop: -1, }, phoneNumberContainer: { flexDirection: "row", alignItems: "center", justifyContent: "flex-start", height: 60, paddingRight: 8, paddingLeft: 8, backgroundColor: "white", borderWidth: 1, borderColor: "#dbdce0", }, mobilePhoneNumberLabel: { padding: 0, margin: 0, fontWeight: "500", fontSize: fontSize(14), fontFamily: "PingFang SC", color: "#807e7e", }, mobilePhoneNumberLabel1: { padding: 0, margin: 0, fontWeight: "500", fontSize: fontSize(14), fontFamily: "PingFang SC", color: "#807e7e", }, phoneNumberPromptContainer: { flexDirection: "row", alignItems: "center", justifyContent: "flex-start", height: 60, paddingRight: 8, paddingLeft: 8, marginTop: -1, backgroundColor: "white", borderWidth: 1, borderColor: "#dbdce0", borderBottomLeftRadius: 5, borderBottomRightRadius: 5, }, defaultSettingSection: { flexDirection: "row", alignItems: "center", justifyContent: "space-between", width: "100%", marginTop: 15.5, gap: 8, }, defaultTextDisplayStyle: { padding: 0, margin: 0, fontWeight: "500", fontSize: fontSize(16), lineHeight: 22, fontFamily: "PingFang SC", color: "black", }, submitButtonContainer: { paddingRight: 11, paddingLeft: 11, marginTop: 60, }, primaryButtonStyle: { width: "100%", height: 50, justifyContent: "center", alignItems: "center", fontWeight: "600", fontSize: fontSize(16), lineHeight: 22, fontFamily: "PingFang SC", color: "white", backgroundColor: "#002fa7", borderWidth: 0, borderRadius: 25, }, buttonText: { color: "white", fontWeight: "600", fontSize: fontSize(16), lineHeight: 22, fontFamily: "PingFang SC", }, selectedCountryText: { padding: 0, margin: 0, fontWeight: "500", fontSize: fontSize(16) , lineHeight: 22, fontFamily: "PingFang SC", color: "#646472", }, modalContainer: { flex: 1, justifyContent: "flex-end", backgroundColor: "rgba(0, 0, 0, 0.5)", }, modalContent: { backgroundColor: "white", borderTopLeftRadius: 20, borderTopRightRadius: 20, width: "100%", height: Dimensions.get('window').height * 0.8, display: "flex", flexDirection: "column", }, modalHeader: { flexDirection: "row", alignItems: "center", justifyContent: "space-between", padding: 15, borderBottomWidth: 1, borderBottomColor: "#dbdce0", }, modalTitle: { fontWeight: "600", fontSize: fontSize(18), lineHeight: 22, fontFamily: "PingFang SC", color: "black", }, closeButton: { fontWeight: "500", fontSize: fontSize(16), lineHeight: 22, fontFamily: "PingFang SC", color: "#ff731e", textDecorationLine: "underline", }, countryItem: { padding: 15, borderBottomWidth: 1, borderBottomColor: "#dbdce0", flexDirection: "row", alignItems: "center", }, countryItemText: { fontSize: fontSize(16), color: "#333", flex: 1, }, errorText: { color: "#fe1e00", fontSize: fontSize(12), marginTop: 4, fontFamily: "PingFang SC", }, countrySelectorButton: { padding: 10, borderWidth: 1, borderColor: "#dbdce0", borderRadius: 5, marginTop: 5, flexDirection: "row", alignItems: "center", justifyContent: "space-between", }, placeholderStyle: { color: "#807e7e", fontSize: fontSize(16), }, flagImage: { width: 24, height: 16, marginRight: 10, }, dropdownArrow: { fontSize: fontSize(12), color: "#807e7e", }, flatList: { flex: 1, height: "100%", }, flatListContent: { flexGrow: 1, }, checkIcon: { color: "#002fa7", fontSize: fontSize(18), fontWeight: "bold", }, });