admin/lib/seo/hostGuidePage.ts
alisaza e1eaf5eff5 feat: initial ghabilee-admin backoffice app
Extract admin dashboard from ghabilee-frontend2 into a dedicated Next.js
app for backoffice.ghabilee.ir (no SEO indexing / Clarity).
2026-09-05 13:12:59 +03:30

106 lines
4.1 KiB
TypeScript

import type { Metadata } from 'next'
import { ORGANIZATION_ID, WEBSITE_ID } from '@/lib/seo/JsonLd'
import { buildCanonicalUrl, SITE_URL } from '@/lib/seo/metadata'
import { buildPublicPageMetadata } from '@/lib/seo/publicPageMetadata'
export const HOST_GUIDE_UPDATED_AT_ISO = '2026-08-30'
export const HOST_GUIDE_UPDATED_AT_FA = '۸ شهریور ۱۴۰۵'
export const HOST_GUIDE_SEO = {
path: '/host-guide' as const,
h1: 'راهنمای میزبانی در قبیله',
breadcrumbName: 'راهنمای میزبانی',
metaTitle: 'راهنمای میزبانی قبیله | طراحی و اجرای رویداد',
metaDescription:
'چک‌لیست میزبانی رویداد در قبیله: موضوع و مخاطب، زمان و مکان، قیمت‌گذاری، لغو، ارتباط با مهمان‌ها و روز اجرا را قدم‌به‌قدم ببین.',
pageId: `${SITE_URL}/host-guide#webpage`,
}
export const HOST_GUIDE_STEPS = [
{
id: 'topic',
name: 'موضوع و مخاطب را روشن کن',
text: 'در یک جمله بگو مهمان چه تجربه‌ای می‌گیرد. سطح، پیش‌نیاز، محدودیت سنی و وسایل لازم را شفاف بنویس و ظرفیت را متناسب با کیفیت تعامل انتخاب کن.',
},
{
id: 'time-place',
name: 'زمان و مکان را واقعی بچین',
text: 'زمان ورود و پایان را واقعی بگذار. شهر و محدوده مکان را شفاف کن و ایمنی، دسترسی و امکانات ضروری را قبل از انتشار چک کن.',
},
{
id: 'pricing',
name: 'قیمت و قواعد لغو را شفاف بگو',
text: 'هزینه مکان، مواد، زمان و کارمزد را حساب کن. آنچه داخل قیمت است بنویس و قوانین لغو همان رویداد را شفاف تنظیم کن تا مهمان قبل از خرید در صفحه رویداد بداند چه خبر است.',
},
{
id: 'guests',
name: 'با مهمان‌ها در ارتباط بمون',
text: 'سؤال‌ها را سریع جواب بده، تغییر ضروری را به‌موقع بگو و از اطلاعات مهمان فقط برای همان رویداد استفاده کن.',
},
{
id: 'day-of',
name: 'روز اجرا و بعد از آن',
text: 'کمی زودتر برس، فهرست مهمان‌ها را آماده داشته باش، برای مشکل‌های رایج راه دوم داشته باش و بعد از رویداد بازخوردها را بخوان.',
},
] as const
export function buildHostGuideMetadata(): Metadata {
const page = HOST_GUIDE_SEO
const pageMetadata = buildPublicPageMetadata({
path: page.path,
metaTitle: page.metaTitle,
metaDescription: page.metaDescription,
})
return {
...pageMetadata,
title: { absolute: page.metaTitle },
openGraph: { ...pageMetadata.openGraph, title: page.metaTitle },
twitter: { ...pageMetadata.twitter, title: page.metaTitle },
robots: { index: true, follow: true },
}
}
export function hostGuideWebPageSchema() {
const page = HOST_GUIDE_SEO
const url = buildCanonicalUrl(page.path)
return {
'@context': 'https://schema.org',
'@type': 'WebPage',
'@id': page.pageId,
name: page.metaTitle,
headline: page.h1,
description: page.metaDescription,
url,
inLanguage: 'fa-IR',
isPartOf: { '@id': WEBSITE_ID },
publisher: { '@id': ORGANIZATION_ID },
datePublished: HOST_GUIDE_UPDATED_AT_ISO,
dateModified: HOST_GUIDE_UPDATED_AT_ISO,
}
}
/** HowTo helps search/AI systems extract the hosting checklist as ordered steps. */
export function hostGuideHowToSchema() {
const page = HOST_GUIDE_SEO
const url = buildCanonicalUrl(page.path)
return {
'@context': 'https://schema.org',
'@type': 'HowTo',
name: page.h1,
description: page.metaDescription,
inLanguage: 'fa-IR',
url,
step: HOST_GUIDE_STEPS.map((step, index) => ({
'@type': 'HowToStep',
position: index + 1,
name: step.name,
text: step.text,
url: `${url}#${step.id}`,
})),
}
}