import React, { useState } from 'react';
import { View, ScrollView, Alert } from 'react-native';
import { AppContainer, MyText, tw, useMarkDataFetchers, MyTouchableOpacity, MyTextInput } from 'common-ui';
import { trpc } from '@/src/trpc-client';
import MaterialIcons from '@expo/vector-icons/MaterialIcons';
import dayjs from 'dayjs';
interface CouponCardProps {
coupon: {
id: number;
code: string;
discountType: 'percentage' | 'flat';
discountValue: number;
maxValue?: number;
minOrder?: number;
description: string;
validTill?: string | Date;
usageCount: number;
maxLimitForUser?: number;
isExpired: boolean;
isUsedUp: boolean;
};
}
function CouponCard({ coupon }: CouponCardProps) {
const getStatusColor = () => {
if (coupon.isExpired) return 'text-red-500';
if (coupon.isUsedUp) return 'text-orange-500';
return 'text-green-600';
};
const getStatusText = () => {
if (coupon.isExpired) return 'Expired';
if (coupon.isUsedUp) return 'Used';
return 'Available';
};
const formatDate = (date?: string | Date) => {
if (!date) return 'No expiry';
return dayjs(date).format('DD MMM YYYY');
};
return (
{coupon.code}
{coupon.description}
{getStatusText()}
{coupon.maxLimitForUser && (
Used: {coupon.usageCount}/{coupon.maxLimitForUser}
)}
Valid till: {formatDate(coupon.validTill)}
{coupon.isExpired || coupon.isUsedUp ? 'Unavailable' : 'Apply'}
);
}
function CouponSection({
title,
coupons,
emptyMessage
}: {
title: string;
coupons: CouponCardProps['coupon'][];
emptyMessage: string;
}) {
return (
{title}
{coupons.length === 0 ? (
{emptyMessage}
) : (
coupons.map(coupon => (
))
)}
);
}
export default function Coupons() {
const { data, isLoading, error, refetch } = trpc.user.coupon.getMyCoupons.useQuery();
const [couponCode, setCouponCode] = useState('');
const redeemCouponMutation = trpc.user.coupon.redeemReservedCoupon.useMutation({
onSuccess: () => {
setCouponCode('');
refetch();
Alert.alert('Success', 'Coupon added successfully!');
},
onError: (error: any) => {
Alert.alert('Error', error.message || 'Failed to add coupon. Please check the code and try again.');
}
});
useMarkDataFetchers(() => {
refetch();
});
console.log({data, error})
if (isLoading) {
return (
Loading coupons...
);
}
if (error) {
return (
Failed to load coupons. Please try again.
);
}
const personalCoupons = data?.data?.personal || [];
const generalCoupons = data?.data?.general || [];
return (
Add a Coupon
{
if (couponCode.trim().length >= 4) {
redeemCouponMutation.mutate({ secretCode: couponCode.trim().toUpperCase() });
}
}}
>
{redeemCouponMutation.isPending ? 'Adding...' : 'Add Coupon'}
);
}