Skip to content

Commit 559c064

Browse files
authored
fix(plugin-seo)!: data types plugin seo (#6979)
Changed the data to correctly match type generic being sent to the generate functions. So now you can type your generateTitle etc. functions like this ```ts // before const generateTitle: GenerateTitle = async <Page>({ doc, locale }) => { return `Website.com — ${doc?.title?.value}` } // curent import type { GenerateDescription, GenerateTitle, GenerateURL } from '@payloadcms/plugin-seo/types' import type { Page } from './payload-types' const generateTitle: GenerateTitle<Page> = async ({ doc, locale }) => { return `Website.com — ${doc?.title}` } const generateDescription: GenerateDescription<Page> = async ({ doc, locale }) => { return doc?.excerpt || 'generated description' } const generateURL: GenerateURL<Page> = async ({ doc, locale }) => { return `https://yoursite.com/${locale ? locale + '/' : ''}${doc?.slug || ''}` } ``` Breaking change because it was previously a FormState value.
1 parent 75a3040 commit 559c064

File tree

7 files changed

+48
-25
lines changed

7 files changed

+48
-25
lines changed

packages/plugin-seo/src/fields/MetaDescription.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ import type { FieldType, FormFieldBase, Options } from '@payloadcms/ui'
55
import {
66
FieldLabel,
77
TextareaInput,
8-
useAllFormFields,
98
useDocumentInfo,
109
useField,
1110
useFieldProps,
11+
useForm,
1212
useLocale,
1313
useTranslation,
1414
} from '@payloadcms/ui'
@@ -35,7 +35,7 @@ export const MetaDescription: React.FC<MetaDescriptionProps> = (props) => {
3535
const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()
3636

3737
const locale = useLocale()
38-
const [fields] = useAllFormFields()
38+
const { getData } = useForm()
3939
const docInfo = useDocumentInfo()
4040

4141
const field: FieldType<string> = useField({
@@ -50,7 +50,7 @@ export const MetaDescription: React.FC<MetaDescriptionProps> = (props) => {
5050
const genDescriptionResponse = await fetch('/api/plugin-seo/generate-description', {
5151
body: JSON.stringify({
5252
...docInfo,
53-
doc: { ...fields },
53+
doc: { ...getData() },
5454
locale: typeof locale === 'object' ? locale?.code : locale,
5555
} satisfies Parameters<GenerateDescription>[0]),
5656
credentials: 'include',
@@ -63,7 +63,7 @@ export const MetaDescription: React.FC<MetaDescriptionProps> = (props) => {
6363
const { result: generatedDescription } = await genDescriptionResponse.json()
6464

6565
setValue(generatedDescription || '')
66-
}, [fields, setValue, hasGenerateDescriptionFn, locale, docInfo])
66+
}, [hasGenerateDescriptionFn, docInfo, getData, locale, setValue])
6767

6868
return (
6969
<div

packages/plugin-seo/src/fields/MetaImage.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ import type { FieldType, Options, UploadInputProps } from '@payloadcms/ui'
55
import {
66
FieldLabel,
77
UploadInput,
8-
useAllFormFields,
98
useConfig,
109
useDocumentInfo,
1110
useField,
11+
useForm,
1212
useLocale,
1313
useTranslation,
1414
} from '@payloadcms/ui'
@@ -32,7 +32,7 @@ export const MetaImage: React.FC<MetaImageProps> = (props) => {
3232
const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()
3333

3434
const locale = useLocale()
35-
const [fields] = useAllFormFields()
35+
const { getData } = useForm()
3636
const docInfo = useDocumentInfo()
3737

3838
const { errorMessage, setValue, showError, value } = field
@@ -43,7 +43,7 @@ export const MetaImage: React.FC<MetaImageProps> = (props) => {
4343
const genImageResponse = await fetch('/api/plugin-seo/generate-image', {
4444
body: JSON.stringify({
4545
...docInfo,
46-
doc: { ...fields },
46+
doc: { ...getData() },
4747
locale: typeof locale === 'object' ? locale?.code : locale,
4848
} satisfies Parameters<GenerateImage>[0]),
4949
credentials: 'include',
@@ -56,7 +56,7 @@ export const MetaImage: React.FC<MetaImageProps> = (props) => {
5656
const { result: generatedImage } = await genImageResponse.json()
5757

5858
setValue(generatedImage || '')
59-
}, [fields, setValue, hasGenerateImageFn, locale, docInfo])
59+
}, [hasGenerateImageFn, docInfo, getData, locale, setValue])
6060

6161
const hasImage = Boolean(value)
6262

packages/plugin-seo/src/fields/MetaTitle.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ import type { FieldType, FormFieldBase, Options } from '@payloadcms/ui'
55
import {
66
FieldLabel,
77
TextInput,
8-
useAllFormFields,
98
useDocumentInfo,
109
useField,
1110
useFieldProps,
11+
useForm,
1212
useLocale,
1313
useTranslation,
1414
} from '@payloadcms/ui'
@@ -39,7 +39,7 @@ export const MetaTitle: React.FC<MetaTitleProps> = (props) => {
3939
} as Options)
4040

4141
const locale = useLocale()
42-
const [fields] = useAllFormFields()
42+
const { getData } = useForm()
4343
const docInfo = useDocumentInfo()
4444

4545
const { errorMessage, setValue, showError, value } = field
@@ -50,7 +50,7 @@ export const MetaTitle: React.FC<MetaTitleProps> = (props) => {
5050
const genTitleResponse = await fetch('/api/plugin-seo/generate-title', {
5151
body: JSON.stringify({
5252
...docInfo,
53-
doc: { ...fields },
53+
doc: { ...getData() },
5454
locale: typeof locale === 'object' ? locale?.code : locale,
5555
} satisfies Parameters<GenerateTitle>[0]),
5656
credentials: 'include',
@@ -63,7 +63,7 @@ export const MetaTitle: React.FC<MetaTitleProps> = (props) => {
6363
const { result: generatedTitle } = await genTitleResponse.json()
6464

6565
setValue(generatedTitle || '')
66-
}, [fields, setValue, hasGenerateTitleFn, locale, docInfo])
66+
}, [hasGenerateTitleFn, docInfo, getData, locale, setValue])
6767

6868
return (
6969
<div

packages/plugin-seo/src/types.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
import type { DocumentInfoContext } from '@payloadcms/ui'
22
import type { Field, TextField, TextareaField, UploadField } from 'payload'
33

4-
export type GenerateTitle = <T = any>(
4+
export type GenerateTitle<T = any> = (
55
args: DocumentInfoContext & { doc: T; locale?: string },
66
) => Promise<string> | string
77

8-
export type GenerateDescription = <T = any>(
8+
export type GenerateDescription<T = any> = (
99
args: DocumentInfoContext & {
1010
doc: T
1111
locale?: string
1212
},
1313
) => Promise<string> | string
1414

15-
export type GenerateImage = <T = any>(
15+
export type GenerateImage<T = any> = (
1616
args: DocumentInfoContext & { doc: T; locale?: string },
1717
) => Promise<string> | string
1818

19-
export type GenerateURL = <T = any>(
19+
export type GenerateURL<T = any> = (
2020
args: DocumentInfoContext & { doc: T; locale?: string },
2121
) => Promise<string> | string
2222

packages/plugin-seo/src/ui/Preview.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,13 @@
22

33
import type { FormField, UIField } from 'payload'
44

5-
import { useAllFormFields, useDocumentInfo, useLocale, useTranslation } from '@payloadcms/ui'
5+
import {
6+
useAllFormFields,
7+
useDocumentInfo,
8+
useForm,
9+
useLocale,
10+
useTranslation,
11+
} from '@payloadcms/ui'
612
import React, { useEffect, useState } from 'react'
713

814
import type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../translations/index.js'
@@ -17,6 +23,7 @@ export const Preview: React.FC<PreviewProps> = ({ hasGenerateURLFn }) => {
1723

1824
const locale = useLocale()
1925
const [fields] = useAllFormFields()
26+
const { getData } = useForm()
2027
const docInfo = useDocumentInfo()
2128

2229
const {
@@ -31,7 +38,7 @@ export const Preview: React.FC<PreviewProps> = ({ hasGenerateURLFn }) => {
3138
const genURLResponse = await fetch('/api/plugin-seo/generate-url', {
3239
body: JSON.stringify({
3340
...docInfo,
34-
doc: { ...fields },
41+
doc: { ...getData() },
3542
locale: typeof locale === 'object' ? locale?.code : locale,
3643
} satisfies Parameters<GenerateURL>[0]),
3744
credentials: 'include',
@@ -49,7 +56,7 @@ export const Preview: React.FC<PreviewProps> = ({ hasGenerateURLFn }) => {
4956
if (hasGenerateURLFn && !href) {
5057
void getHref()
5158
}
52-
}, [fields, href, locale, docInfo, hasGenerateURLFn])
59+
}, [fields, href, locale, docInfo, hasGenerateURLFn, getData])
5360

5461
return (
5562
<div>

test/plugin-seo/config.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ import { fileURLToPath } from 'node:url'
22
import path from 'path'
33
const filename = fileURLToPath(import.meta.url)
44
const dirname = path.dirname(filename)
5+
import type { GenerateDescription, GenerateTitle, GenerateURL } from '@payloadcms/plugin-seo/types'
6+
import type { Page } from 'plugin-seo/payload-types.js'
7+
58
import { seoPlugin } from '@payloadcms/plugin-seo'
69
import { en } from '@payloadcms/translations/languages/en'
710
import { es } from '@payloadcms/translations/languages/es'
@@ -13,6 +16,18 @@ import { Pages } from './collections/Pages.js'
1316
import { Users } from './collections/Users.js'
1417
import { seed } from './seed/index.js'
1518

19+
const generateTitle: GenerateTitle<Page> = ({ doc }) => {
20+
return `Website.com — ${doc?.title}`
21+
}
22+
23+
const generateDescription: GenerateDescription<Page> = ({ doc }) => {
24+
return doc?.excerpt || 'generated description'
25+
}
26+
27+
const generateURL: GenerateURL<Page> = ({ doc, locale }) => {
28+
return `https://yoursite.com/${locale ? locale + '/' : ''}${doc?.slug || ''}`
29+
}
30+
1631
export default buildConfigWithDefaults({
1732
collections: [Users, Pages, Media],
1833
i18n: {
@@ -59,10 +74,9 @@ export default buildConfigWithDefaults({
5974
label: 'og:title',
6075
},
6176
],
62-
generateDescription: ({ doc }: any) => doc?.excerpt?.value || 'generated description',
63-
generateTitle: (data: any) => `Website.com — ${data?.doc?.title?.value}`,
64-
generateURL: ({ doc, locale }: any) =>
65-
`https://yoursite.com/${locale ? locale + '/' : ''}${doc?.slug?.value || ''}`,
77+
generateDescription,
78+
generateTitle,
79+
generateURL,
6680
tabbedUI: true,
6781
uploadsCollection: 'media',
6882
}),

test/plugin-seo/payload-types.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,11 @@ export interface Page {
4646
title: string;
4747
excerpt?: string | null;
4848
slug: string;
49-
meta?: {
50-
title?: string | null;
49+
meta: {
50+
title: string;
5151
description?: string | null;
52+
image?: string | Media | null;
53+
ogTitle?: string | null;
5254
};
5355
updatedAt: string;
5456
createdAt: string;

0 commit comments

Comments
 (0)