'use client' import type { FieldType } from '@payloadcms/ui' import type { TextareaFieldClientProps } from 'payload' import { FieldLabel, TextareaInput, useConfig, useDocumentInfo, useField, useForm, useLocale, useTranslation, } from '@payloadcms/ui' import { reduceToSerializableFields } from '@payloadcms/ui/shared' import React, { useCallback } from 'react' import type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../../translations/index.js' import type { GenerateDescription } from '../../types.js' import { defaults } from '../../defaults.js' import { LengthIndicator } from '../../ui/LengthIndicator.js' const { maxLength: maxLengthDefault, minLength: minLengthDefault } = defaults.description type MetaDescriptionProps = { readonly hasGenerateDescriptionFn: boolean } & TextareaFieldClientProps export const MetaDescriptionComponent: React.FC = (props) => { const { field: { label, localized, maxLength: maxLengthFromProps, minLength: minLengthFromProps, required, }, hasGenerateDescriptionFn, readOnly, } = props const { config: { routes: { api }, serverURL, }, } = useConfig() const { t } = useTranslation() const locale = useLocale() const { getData } = useForm() const docInfo = useDocumentInfo() const maxLength = maxLengthFromProps || maxLengthDefault const minLength = minLengthFromProps || minLengthDefault const { customComponents: { AfterInput, BeforeInput, Label } = {}, errorMessage, path, setValue, showError, value, }: FieldType = useField() const regenerateDescription = useCallback(async () => { if (!hasGenerateDescriptionFn) { return } const endpoint = `${serverURL}${api}/plugin-seo/generate-description` const genDescriptionResponse = await fetch(endpoint, { body: JSON.stringify({ id: docInfo.id, collectionSlug: docInfo.collectionSlug, doc: getData(), docPermissions: docInfo.docPermissions, globalSlug: docInfo.globalSlug, hasPublishPermission: docInfo.hasPublishPermission, hasSavePermission: docInfo.hasSavePermission, initialData: docInfo.initialData, initialState: reduceToSerializableFields(docInfo.initialState ?? {}), locale: typeof locale === 'object' ? locale?.code : locale, title: docInfo.title, } satisfies Omit< Parameters[0], 'collectionConfig' | 'globalConfig' | 'hasPublishedDoc' | 'req' | 'versionCount' >), credentials: 'include', headers: { 'Content-Type': 'application/json', }, method: 'POST', }) const { result: generatedDescription } = await genDescriptionResponse.json() setValue(generatedDescription || '') }, [ hasGenerateDescriptionFn, serverURL, api, docInfo.id, docInfo.collectionSlug, docInfo.docPermissions, docInfo.globalSlug, docInfo.hasPublishPermission, docInfo.hasSavePermission, docInfo.initialData, docInfo.initialState, docInfo.title, getData, locale, setValue, ]) return (
{Label ?? ( )} {hasGenerateDescriptionFn && (   —   )}
{t('plugin-seo:lengthTipDescription', { maxLength, minLength })} {t('plugin-seo:bestPractices')}
) }