//the size of the TabView will follow its parent-container's size. import * as React from 'react'; import { View, Text, useWindowDimensions, StyleSheet, ImageSourcePropType, ScrollView, ActivityIndicator, Pressable, Alert } from 'react-native'; import { TabView, SceneMap, TabBar } from 'react-native-tab-view'; import { IndividualCouponComponent } from '../accountPages/walletPageComponent'; import { formatCouponDate } from '../../util/lib'; import { useCallback, useEffect, useRef, useState } from 'react'; import { walletService } from '../../service/walletService'; import { useChargingStore } from '../../providers/scan_qr_payload_store'; import { chargeStationService } from '../../service/chargeStationService'; import { router } from 'expo-router'; import axios from 'axios'; export interface TabItem { imgURL: ImageSourcePropType; date: string; time: string; chargeStationName: string; chargeStationAddress: string; distance: string; } interface TabViewComponentProps { titles: string[]; } const FirstRoute = ({ coupons, loading, handleCouponClick }: { coupons: any; loading: boolean; handleCouponClick: (couponName: string, couponDescription: string) => void; }) => { return ( {loading ? ( ) : ( {coupons.filter( (coupon: any) => coupon.permission == true && coupon.is_consumed === false && new Date(coupon.expire_date) > new Date() ).length === 0 ? ( 暫時戶口沒有優惠券。 ) : ( coupons .filter( (coupon: any) => coupon.permission == true && coupon.is_consumed === false && new Date(coupon.expire_date) > new Date() ) .sort( (a: any, b: any) => new Date(a.expire_date).getTime() - new Date(b.expire_date).getTime() ) .slice(0, 30) .map((coupon: any, index: any) => ( handleCouponClick(coupon.coupon.name, coupon.coupon.description) } // key={coupon.redeem_code} key={`${coupon.id}-${index}`} title={coupon.coupon.name} price={coupon.coupon.amount} detail={coupon.coupon.description} date={formatCouponDate(coupon.expire_date)} setOpacity={false} noCircle={true} redeem_code={coupon.id} /> )) )} )} ); }; const SecondRoute = ({ coupons }: { coupons: any }) => ( {coupons .filter((coupon: any) => coupon.is_consumed === true || new Date(coupon.expire_date) < new Date()) .slice(0, 30) .map((coupon: any, index: any) => ( ))} ); const DisplayedOnlyCouponTabView: React.FC = ({ titles }) => { const layout = useWindowDimensions(); const [loading, setLoading] = useState(false); const [coupons, setCoupons] = useState([]); const [userID, setUserID] = useState(''); const [modalVisible, setModalVisible] = useState(false); const [useableCoupons, setUseableCoupons] = useState([]); useEffect(() => { const fetchData = async () => { try { setLoading(true); const info = await walletService.getCustomerInfo(); const coupon = await walletService.getCouponForSpecificUser(info.id); const useableConpon = coupon.filter((couponObj: any) => { const today = new Date(); if (couponObj.expire_date === null) { return couponObj.is_consumed === false; } const expireDate = new Date(couponObj.expire_date); return expireDate > today && couponObj.is_consumed === false; }); setUserID(info.id); setCoupons(coupon); setUseableCoupons(useableConpon); } catch (error) { console.log(error); } finally { setLoading(false); } }; fetchData(); }, []); const handleCouponClick = async (clickedCoupon: string, clickedCouponDescription: string) => { router.push({ pathname: '/couponDetailPage', params: { couponName: clickedCoupon, couponDescription: clickedCouponDescription } }); }; const renderScene = useCallback( ({ route }: { route: any }) => { switch (route.key) { case 'firstRoute': return ( ); case 'secondRoute': return ; default: return null; } }, [coupons, loading, handleCouponClick] ); const [routes] = React.useState([ { key: 'firstRoute', title: titles[0] }, { key: 'secondRoute', title: titles[1] } ]); const [index, setIndex] = React.useState(0); const renderTabBar = (props: any) => ( ); return ( ( {route.title} ) }} /> ); }; export default DisplayedOnlyCouponTabView; const styles = StyleSheet.create({ container: { flexDirection: 'row' }, image: { width: 100, height: 100, margin: 15, borderRadius: 10 }, textContainer: { flexDirection: 'column', gap: 8, marginTop: 20 }, floatingButton: { elevation: 5, shadowColor: '#000', shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.25, shadowRadius: 3.84 } });