import { useContext, useState, useCallback } from "react"; import { FlatList, StyleSheet, Image, View } from "react-native"; import { Actions, DispatchContext, StateContext } from "../../context/state"; import { formatCurrency, parseBrands } from "../../util/helpers"; import { brandType, KonbiniType, PaymentType, sessionDataType, sessionShowPaymentMethodType, } from "../../util/types"; import { validateKonbiniFormFields } from "../../util/validator"; import KonbiniImages from "../../assets/images/konbiniImages"; import { responsiveScale } from "../../theme/scalling"; import Input from "../Input"; import Pill from "../Pill"; import SubmitButton from "../SubmitButton"; import useSessionPayHandler from "../../hooks/useSessionPayHandler"; const initialErrors = { name: false, email: false, }; const KonbiniSection = (): JSX.Element => { const [inputErrors, setInputErrors] = useState(initialErrors); const { sessionPay } = useSessionPayHandler(); const { name, email, sessionData, selectedStore } = useContext(StateContext); const dispatch = useContext(DispatchContext); const SessionData = sessionData as sessionDataType; const konbiniPaymentMethodData = SessionData?.paymentMethods?.find( (method: sessionShowPaymentMethodType) => method?.type === PaymentType.KONBINI ); const konbiniBrands = parseBrands(konbiniPaymentMethodData?.brands || {}); const onPay = () => { // TODO: Fix this type error // @ts-expect-error - Type 'string' is not assignable to type 'object'. const isValid = validateKonbiniFormFields({ name, email, setInputErrors }); if (isValid) { sessionPay({ paymentType: PaymentType.KONBINI, paymentDetails: { name, email, selectedStore, }, }); } }; const resetError = (type: string) => { // TODO: Fix this type error // @ts-expect-error - Type 'string' cannot be used to index type 'object'. setInputErrors((pre: object) => ({ ...pre, [type]: false })); }; const handlePillSelect = (type: string) => { dispatch({ type: Actions.SET_SELECTED_STORE, payload: type }); }; const shopImage = useCallback( (icon: KonbiniType) => { return ; }, [konbiniBrands] ); const renderItem = ({ item }: { item: brandType }) => { const image = shopImage(item?.type); return ( { handlePillSelect(item.type); }} autoWidth /> ); }; return ( { resetError("name"); dispatch({ type: Actions.SET_NAME, payload: text }); }} inputStyle={styles.inputStyle} error={inputErrors.name} errorText="REQUIRED" /> { resetError("email"); dispatch({ type: Actions.SET_EMAIL, payload: text }); }} inputStyle={styles.inputStyle} error={inputErrors.email} errorText="EMAIL_ERROR" inputMode="email" /> ); }; export default KonbiniSection; const styles = StyleSheet.create({ mainContainer: { position: "relative", flex: 1, }, inputContainer: { margin: responsiveScale(16), marginBottom: responsiveScale(8), }, inputStyle: { height: responsiveScale(50), }, shopListContainer: { marginBottom: responsiveScale(26), marginTop: responsiveScale(16), }, contentContainer: { paddingLeft: responsiveScale(16), }, iconStyle: { width: responsiveScale(32), height: responsiveScale(32), }, btn: { height: responsiveScale(60), marginBottom: responsiveScale(24), }, image: { width: responsiveScale(38), height: responsiveScale(24), resizeMode: "contain", }, });