"use client" import { useRef, useState } from "react" import { REWARDS_PER_PAGE } from "@/constants/rewards" import { trpc } from "@/lib/trpc/client" import { RewardIcon } from "@/components/Blocks/DynamicContent/Rewards/RewardIcon" import ScriptedRewardText from "@/components/Blocks/DynamicContent/Rewards/ScriptedRewardText" import Pagination from "@/components/MyPages/Pagination" import ExpirationDate from "@/components/Rewards/ExpirationDate" import Grids from "@/components/TempDesignSystem/Grids" import Title from "@/components/TempDesignSystem/Text/Title" import { useFilteredRewards } from "@/hooks/rewards/useFilteredRewards" import useLang from "@/hooks/useLang" import { getEarliestExpirationDate } from "@/utils/rewards" import Redeem from "../Redeem" import FilterRewardsModal from "./FilterRewardsModal" import styles from "./current.module.css" import type { CurrentRewardsClientProps } from "@/types/components/myPages/myPage/accountPage" import type { RewardCategory } from "@/types/components/myPages/rewards" import type { MembershipLevelEnum } from "@/constants/membershipLevels" import type { Reward, RewardWithRedeem, } from "@/server/routers/contentstack/reward/output" export default function ClientCurrentRewards({ rewards: initialData, showRedeem, membershipNumber, }: CurrentRewardsClientProps) { const lang = useLang() const containerRef = useRef(null) const [currentPage, setCurrentPage] = useState(1) const [selectedCategories, setSelectedCategories] = useState< RewardCategory[] >([]) const [selectedLevels, setSelectedLevels] = useState( [] ) const { data } = trpc.contentstack.rewards.current.useQuery<{ rewards: (Reward | RewardWithRedeem)[] }>( { lang, }, { initialData: { rewards: initialData }, } ) const { filteredRewards, total, availableTierLevels, availableCategories, hasFilterableOptions, } = useFilteredRewards( data?.rewards ?? [], selectedCategories, selectedLevels ) if (!data) { return null } function handleCategoriesChange(categories: RewardCategory[]) { setSelectedCategories(categories) setCurrentPage(1) } function handleLevelsChange(levels: MembershipLevelEnum[]) { setSelectedLevels(levels) setCurrentPage(1) } const startIndex = (currentPage - 1) * REWARDS_PER_PAGE const endIndex = startIndex + REWARDS_PER_PAGE const paginatedRewards = filteredRewards.slice(startIndex, endIndex) const totalPages = Math.ceil(total / REWARDS_PER_PAGE) function handlePageChange(page: number) { requestAnimationFrame(() => { setCurrentPage(page) containerRef.current?.scrollIntoView({ behavior: "smooth", block: "start", inline: "nearest", }) }) } return (
{showRedeem && hasFilterableOptions ? ( ) : null} {paginatedRewards.map((reward, idx) => { const earliestExpirationDate = "coupons" in reward ? getEarliestExpirationDate(reward.coupons) : null return (
{showRedeem && ( )} {reward.label} {earliestExpirationDate ? ( ) : null}
{showRedeem && "redeem_description" in reward && (
)}
) })}
{totalPages > 1 && ( )}
) }