import type { Metadata } from "next"; import { redirect } from "next/navigation"; import { auth } from "@/auth"; import { TopNav } from "@/components/navigation/top-nav"; import { prisma } from "@/lib/db/prisma"; import { hasPermission } from "@/lib/auth/permissions"; import { Permission } from "@/generated/prisma/enums"; import { getProgrammeConfig } from "@/services/loyalty/loyalty.service"; import { LoyaltyConfigForm } from "@/features/owner/components/loyalty-config-form"; export const metadata: Metadata = { title: "Loyalty Programme" }; export const dynamic = "force-dynamic"; export default async function OwnerLoyaltyConfigPage() { const session = await auth(); if (!session?.user) redirect("/sign-in"); const canManage = await hasPermission(session.user.id, Permission.MANAGE_LOYALTY_PROGRAMME); if (!canManage) redirect("/staff"); const owner = await prisma.staffProfile.findUnique({ where: { userId: session.user.id } }); if (!owner) redirect("/staff"); const [programme, services, staff] = await Promise.all([ getProgrammeConfig(prisma, owner.businessId), prisma.service.findMany({ where: { businessId: owner.businessId, isActive: true }, orderBy: { displayOrder: "asc" } }), prisma.staffProfile.findMany({ where: { businessId: owner.businessId, status: "ACTIVE" }, include: { user: { select: { name: true } } }, }), ]); const initialConfig = programme ? { isEnabled: programme.isEnabled, stampsRequired: programme.stampsRequired, rewardType: programme.rewardType, rewardValue: programme.rewardValue?.toString(), rewardLabel: programme.rewardLabel ?? undefined, maxRewardValue: programme.maxRewardValue?.toString(), freeServiceId: programme.freeServiceId ?? undefined, autoApplyReward: programme.autoApplyReward, requiresStaffApproval: programme.requiresStaffApproval, stampsExpireAfterDays: programme.stampsExpireAfterDays ?? undefined, rewardExpiresAfterDays: programme.rewardExpiresAfterDays ?? undefined, earnOnCancelled: programme.earnOnCancelled, earnOnNoShow: programme.earnOnNoShow, cardBackgroundColor: programme.cardBackgroundColor ?? undefined, cardBackgroundImageUrl: programme.cardBackgroundImageUrl ?? undefined, stampIcon: programme.stampIcon ?? undefined, termsLine: programme.termsLine ?? undefined, } : { isEnabled: false, stampsRequired: 10, rewardType: "PERCENTAGE" as const, autoApplyReward: true, requiresStaffApproval: false, earnOnCancelled: false, earnOnNoShow: false, }; return (