--- import { differenceInCalendarDays } from 'date-fns' import AnnouncementBanner from '../components/AnnouncementBanner.astro' import BaseHead from '../components/BaseHead.astro' import Footer from '../components/Footer.astro' import Header from '../components/Header.astro' import { cn } from '../lib/cn' import { pluralize } from '../lib/pluralize' import { prisma } from '../lib/prisma' import type { AstroChildren } from '../lib/astro' import type { Prisma } from '@prisma/client' import type { ComponentProps } from 'astro/types' import '@fontsource-variable/space-grotesk' import '../styles/global.css' type Props = ComponentProps & { children: AstroChildren errors?: string[] success?: string[] classNames?: { body?: string main?: string footer?: string } showSplashText?: boolean widthClassName?: | 'container' | 'max-w-none' | 'max-w-screen-2xl' | 'max-w-screen-lg' | 'max-w-screen-md' | 'max-w-screen-sm' | 'max-w-screen-xl' | 'max-w-screen-xs' isErrorPage?: boolean } const { errors = [], success = [], classNames, widthClassName = 'max-w-screen-2xl', showSplashText, isErrorPage, ...baseHeadProps } = Astro.props const actualErrors = [...errors, ...Astro.locals.banners.errors] const actualSuccess = [...success, ...Astro.locals.banners.successes] const currentDate = new Date() const announcement = await Astro.locals.banners.try( 'Unable to load announcements.', () => prisma.announcement.findFirst({ where: { isActive: true, startDate: { lte: currentDate }, OR: [{ endDate: null }, { endDate: { gt: currentDate } }], }, select: { id: true, content: true, type: true, link: true, linkText: true, startDate: true, endDate: true, isActive: true, }, orderBy: [{ type: 'desc' }, { createdAt: 'desc' }], }), null ) function getDeletionAnnouncement( user: Prisma.UserGetPayload<{ select: { scheduledDeletionAt: true } }> | null, currentDate: Date = new Date() ) { if (!user?.scheduledDeletionAt) return null const daysUntilDeletion = differenceInCalendarDays(user.scheduledDeletionAt, currentDate) return { id: 0, content: `Your account will be deleted ${daysUntilDeletion <= 0 ? 'today' : `in ${daysUntilDeletion.toLocaleString()} ${pluralize('day', daysUntilDeletion)}`} due to inactivity.`, type: 'ALERT' as const, link: '/account', linkText: 'Prevent deletion', startDate: currentDate, endDate: null, isActive: true, } } const deletionAnnouncement = getDeletionAnnouncement(Astro.locals.user, currentDate) --- {announcement && } { deletionAnnouncement && ( ) }
{ actualSuccess.length > 0 && (
    {actualSuccess.map((message) => (
  • {message}
  • ))}
) } { actualErrors.length > 0 && (
    {actualErrors.map((error) => (
  • {error}
  • ))}
) }