Files
website/src/app/(payload)/admin/_components/admin-cache-actions.ts
T
2026-04-30 11:31:40 +08:00

76 lines
1.8 KiB
TypeScript

'use server'
import { revalidatePath, revalidateTag } from 'next/cache'
import { redirect } from 'next/navigation'
import { CMS_CACHE_TAG } from '@/lib/cms-cache'
const CACHE_PATHS = [
'/sitemap.xml',
'/en',
'/zh',
'/en/about',
'/zh/about',
'/en/where-to-buy',
'/zh/where-to-buy',
'/en/downloads',
'/zh/downloads',
'/en/media-assets',
'/zh/media-assets',
'/en/news',
'/zh/news',
'/en/products',
'/zh/products',
'/en/support',
'/zh/support',
'/en/support/contact',
'/zh/support/contact',
'/en/support/faq',
'/zh/support/faq',
'/en/support/warranty',
'/zh/support/warranty',
] as const
const CACHE_ROUTE_PATTERNS = [
'/en/downloads/[slug]',
'/zh/downloads/[slug]',
'/en/media-assets/[category]',
'/zh/media-assets/[category]',
'/en/media-assets/[category]/[subcategory]',
'/zh/media-assets/[category]/[subcategory]',
'/en/news/[slug]',
'/zh/news/[slug]',
'/en/products/[slug]',
'/zh/products/[slug]',
] as const
function normalizeReturnPath(value: FormDataEntryValue | null) {
if (typeof value !== 'string') return '/admin'
if (!value.startsWith('/admin')) return '/admin'
return value
}
export async function clearFrontendCache(formData: FormData) {
const returnTo = normalizeReturnPath(formData.get('returnTo'))
revalidateTag(CMS_CACHE_TAG)
for (const path of CACHE_PATHS) {
revalidatePath(path)
}
for (const path of CACHE_ROUTE_PATTERNS) {
revalidatePath(path, 'page')
}
redirect(`${returnTo}${returnTo.includes('?') ? '&' : '?'}cache=cleared`)
}
export async function refreshSitemapCache(formData: FormData) {
const returnTo = normalizeReturnPath(formData.get('returnTo'))
revalidateTag(CMS_CACHE_TAG)
revalidatePath('/sitemap.xml')
redirect(`${returnTo}${returnTo.includes('?') ? '&' : '?'}sitemap=refreshed`)
}