@jhb.software/payload-alt-text-plugin 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,13 +1,12 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { Button, toast, useSelection } from '@payloadcms/ui';
3
+ import { Button, toast, useSelection, useTranslation } from '@payloadcms/ui';
4
4
  import { useRouter } from 'next/navigation.js';
5
5
  import { useTransition } from 'react';
6
- import { usePluginTranslation } from '../utils/usePluginTranslation.js';
7
6
  import { Lightning } from './icons/Lightning.js';
8
7
  import { Spinner } from './icons/Spinner.js';
9
8
  export function BulkGenerateAltTextsButton({ collectionSlug }) {
10
- const { t } = usePluginTranslation();
9
+ const { t } = useTranslation();
11
10
  const [isPending, startTransition] = useTransition();
12
11
  const { selected, setSelection } = useSelection();
13
12
  const selectedIds = Array.from(selected.entries()).filter(([, isSelected])=>isSelected).map(([id])=>id);
@@ -26,18 +25,18 @@ export function BulkGenerateAltTextsButton({ collectionSlug }) {
26
25
  method: 'POST'
27
26
  });
28
27
  if (!response.ok) {
29
- toast.error(t('failedToGenerate'));
28
+ toast.error(t('@jhb.software/payload-alt-text-plugin:failedToGenerate'));
30
29
  return;
31
30
  }
32
31
  const data = await response.json();
33
32
  if (data.erroredDocs.length > 0) {
34
- toast.error(t('failedToGenerateForXImages').replace('{X}', data.erroredDocs.length.toString()));
33
+ toast.error(t('@jhb.software/payload-alt-text-plugin:failedToGenerateForXImages').replace('{X}', data.erroredDocs.length.toString()));
35
34
  }
36
35
  // in case not all images were updated, show a warning instead of a success message:
37
36
  if (data.updatedDocs === data.totalDocs) {
38
- toast.success(t('xOfYImagesUpdated').replace('{X}', data.updatedDocs.toString()).replace('{Y}', data.totalDocs.toString()));
37
+ toast.success(t('@jhb.software/payload-alt-text-plugin:xOfYImagesUpdated').replace('{X}', data.updatedDocs.toString()).replace('{Y}', data.totalDocs.toString()));
39
38
  } else {
40
- toast.warning(t('xOfYImagesUpdated').replace('{X}', data.updatedDocs.toString()).replace('{Y}', data.totalDocs.toString()));
39
+ toast.warning(t('@jhb.software/payload-alt-text-plugin:xOfYImagesUpdated').replace('{X}', data.updatedDocs.toString()).replace('{Y}', data.totalDocs.toString()));
41
40
  }
42
41
  // deselect all previously selected images
43
42
  for (const id of selectedIds){
@@ -46,7 +45,7 @@ export function BulkGenerateAltTextsButton({ collectionSlug }) {
46
45
  router.refresh();
47
46
  } catch (error) {
48
47
  console.error('Error generating alt text:', error);
49
- toast.error(t('errorGeneratingAltText'));
48
+ toast.error(t('@jhb.software/payload-alt-text-plugin:errorGeneratingAltText'));
50
49
  }
51
50
  });
52
51
  };
@@ -62,11 +61,11 @@ export function BulkGenerateAltTextsButton({ collectionSlug }) {
62
61
  icon: isPending ? /*#__PURE__*/ _jsx(Spinner, {}) : /*#__PURE__*/ _jsx(Lightning, {}),
63
62
  onClick: handleGenerateAltTexts,
64
63
  children: [
65
- t('generateAltTextFor'),
64
+ t('@jhb.software/payload-alt-text-plugin:generateAltTextFor'),
66
65
  " ",
67
66
  selectedIds.length,
68
67
  ' ',
69
- selectedIds.length === 1 ? t('image') : t('images')
68
+ selectedIds.length === 1 ? t('@jhb.software/payload-alt-text-plugin:image') : t('@jhb.software/payload-alt-text-plugin:images')
70
69
  ]
71
70
  })
72
71
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/BulkGenerateAltTextsButton.tsx"],"sourcesContent":["'use client'\n\nimport { Button, toast, useSelection } from '@payloadcms/ui'\nimport { useRouter } from 'next/navigation.js'\nimport { useTransition } from 'react'\n\nimport { usePluginTranslation } from '../utils/usePluginTranslation.js'\nimport { Lightning } from './icons/Lightning.js'\nimport { Spinner } from './icons/Spinner.js'\n\nexport function BulkGenerateAltTextsButton({ collectionSlug }: { collectionSlug: string }) {\n const { t } = usePluginTranslation()\n const [isPending, startTransition] = useTransition()\n const { selected, setSelection } = useSelection()\n\n const selectedIds = Array.from(selected.entries())\n .filter(([, isSelected]) => isSelected)\n .map(([id]) => id) as string[]\n\n const router = useRouter()\n\n const handleGenerateAltTexts = () => {\n startTransition(async () => {\n if (!collectionSlug) {\n throw new Error('Collection slug is required')\n }\n\n try {\n const response = await fetch('/api/alt-text-plugin/bulk-generate-alt-texts', {\n body: JSON.stringify({\n collection: collectionSlug,\n ids: selectedIds,\n }),\n method: 'POST',\n })\n\n if (!response.ok) {\n toast.error(t('failedToGenerate'))\n return\n }\n\n const data = (await response.json()) as {\n erroredDocs: string[]\n totalDocs: number\n updatedDocs: number\n }\n\n if (data.erroredDocs.length > 0) {\n toast.error(\n t('failedToGenerateForXImages').replace('{X}', data.erroredDocs.length.toString()),\n )\n }\n\n // in case not all images were updated, show a warning instead of a success message:\n if (data.updatedDocs === data.totalDocs) {\n toast.success(\n t('xOfYImagesUpdated')\n .replace('{X}', data.updatedDocs.toString())\n .replace('{Y}', data.totalDocs.toString()),\n )\n } else {\n toast.warning(\n t('xOfYImagesUpdated')\n .replace('{X}', data.updatedDocs.toString())\n .replace('{Y}', data.totalDocs.toString()),\n )\n }\n\n // deselect all previously selected images\n for (const id of selectedIds) {\n setSelection(id)\n }\n\n router.refresh()\n } catch (error) {\n console.error('Error generating alt text:', error)\n toast.error(t('errorGeneratingAltText'))\n }\n })\n }\n\n return (\n selectedIds.length > 0 && (\n <div className=\"m-0\" style={{ display: 'flex', justifyContent: 'right' }}>\n <Button\n className=\"m-0\"\n disabled={isPending || selectedIds.length === 0}\n icon={isPending ? <Spinner /> : <Lightning />}\n onClick={handleGenerateAltTexts}\n >\n {t('generateAltTextFor')} {selectedIds.length}{' '}\n {selectedIds.length === 1 ? t('image') : t('images')}\n </Button>\n </div>\n )\n )\n}\n"],"names":["Button","toast","useSelection","useRouter","useTransition","usePluginTranslation","Lightning","Spinner","BulkGenerateAltTextsButton","collectionSlug","t","isPending","startTransition","selected","setSelection","selectedIds","Array","from","entries","filter","isSelected","map","id","router","handleGenerateAltTexts","Error","response","fetch","body","JSON","stringify","collection","ids","method","ok","error","data","json","erroredDocs","length","replace","toString","updatedDocs","totalDocs","success","warning","refresh","console","div","className","style","display","justifyContent","disabled","icon","onClick"],"mappings":"AAAA;;AAEA,SAASA,MAAM,EAAEC,KAAK,EAAEC,YAAY,QAAQ,iBAAgB;AAC5D,SAASC,SAAS,QAAQ,qBAAoB;AAC9C,SAASC,aAAa,QAAQ,QAAO;AAErC,SAASC,oBAAoB,QAAQ,mCAAkC;AACvE,SAASC,SAAS,QAAQ,uBAAsB;AAChD,SAASC,OAAO,QAAQ,qBAAoB;AAE5C,OAAO,SAASC,2BAA2B,EAAEC,cAAc,EAA8B;IACvF,MAAM,EAAEC,CAAC,EAAE,GAAGL;IACd,MAAM,CAACM,WAAWC,gBAAgB,GAAGR;IACrC,MAAM,EAAES,QAAQ,EAAEC,YAAY,EAAE,GAAGZ;IAEnC,MAAMa,cAAcC,MAAMC,IAAI,CAACJ,SAASK,OAAO,IAC5CC,MAAM,CAAC,CAAC,GAAGC,WAAW,GAAKA,YAC3BC,GAAG,CAAC,CAAC,CAACC,GAAG,GAAKA;IAEjB,MAAMC,SAASpB;IAEf,MAAMqB,yBAAyB;QAC7BZ,gBAAgB;YACd,IAAI,CAACH,gBAAgB;gBACnB,MAAM,IAAIgB,MAAM;YAClB;YAEA,IAAI;gBACF,MAAMC,WAAW,MAAMC,MAAM,gDAAgD;oBAC3EC,MAAMC,KAAKC,SAAS,CAAC;wBACnBC,YAAYtB;wBACZuB,KAAKjB;oBACP;oBACAkB,QAAQ;gBACV;gBAEA,IAAI,CAACP,SAASQ,EAAE,EAAE;oBAChBjC,MAAMkC,KAAK,CAACzB,EAAE;oBACd;gBACF;gBAEA,MAAM0B,OAAQ,MAAMV,SAASW,IAAI;gBAMjC,IAAID,KAAKE,WAAW,CAACC,MAAM,GAAG,GAAG;oBAC/BtC,MAAMkC,KAAK,CACTzB,EAAE,8BAA8B8B,OAAO,CAAC,OAAOJ,KAAKE,WAAW,CAACC,MAAM,CAACE,QAAQ;gBAEnF;gBAEA,oFAAoF;gBACpF,IAAIL,KAAKM,WAAW,KAAKN,KAAKO,SAAS,EAAE;oBACvC1C,MAAM2C,OAAO,CACXlC,EAAE,qBACC8B,OAAO,CAAC,OAAOJ,KAAKM,WAAW,CAACD,QAAQ,IACxCD,OAAO,CAAC,OAAOJ,KAAKO,SAAS,CAACF,QAAQ;gBAE7C,OAAO;oBACLxC,MAAM4C,OAAO,CACXnC,EAAE,qBACC8B,OAAO,CAAC,OAAOJ,KAAKM,WAAW,CAACD,QAAQ,IACxCD,OAAO,CAAC,OAAOJ,KAAKO,SAAS,CAACF,QAAQ;gBAE7C;gBAEA,0CAA0C;gBAC1C,KAAK,MAAMnB,MAAMP,YAAa;oBAC5BD,aAAaQ;gBACf;gBAEAC,OAAOuB,OAAO;YAChB,EAAE,OAAOX,OAAO;gBACdY,QAAQZ,KAAK,CAAC,8BAA8BA;gBAC5ClC,MAAMkC,KAAK,CAACzB,EAAE;YAChB;QACF;IACF;IAEA,OACEK,YAAYwB,MAAM,GAAG,mBACnB,KAACS;QAAIC,WAAU;QAAMC,OAAO;YAAEC,SAAS;YAAQC,gBAAgB;QAAQ;kBACrE,cAAA,MAACpD;YACCiD,WAAU;YACVI,UAAU1C,aAAaI,YAAYwB,MAAM,KAAK;YAC9Ce,MAAM3C,0BAAY,KAACJ,6BAAa,KAACD;YACjCiD,SAAS/B;;gBAERd,EAAE;gBAAsB;gBAAEK,YAAYwB,MAAM;gBAAE;gBAC9CxB,YAAYwB,MAAM,KAAK,IAAI7B,EAAE,WAAWA,EAAE;;;;AAKrD"}
1
+ {"version":3,"sources":["../../src/components/BulkGenerateAltTextsButton.tsx"],"sourcesContent":["'use client'\n\nimport { Button, toast, useSelection, useTranslation } from '@payloadcms/ui'\nimport { useRouter } from 'next/navigation.js'\nimport { useTransition } from 'react'\n\nimport type {\n PluginAltTextTranslationKeys,\n PluginAltTextTranslations,\n} from '../translations/index.js'\nimport { Lightning } from './icons/Lightning.js'\nimport { Spinner } from './icons/Spinner.js'\n\nexport function BulkGenerateAltTextsButton({ collectionSlug }: { collectionSlug: string }) {\n const { t } = useTranslation<PluginAltTextTranslations, PluginAltTextTranslationKeys>()\n const [isPending, startTransition] = useTransition()\n const { selected, setSelection } = useSelection()\n\n const selectedIds = Array.from(selected.entries())\n .filter(([, isSelected]) => isSelected)\n .map(([id]) => id) as string[]\n\n const router = useRouter()\n\n const handleGenerateAltTexts = () => {\n startTransition(async () => {\n if (!collectionSlug) {\n throw new Error('Collection slug is required')\n }\n\n try {\n const response = await fetch('/api/alt-text-plugin/bulk-generate-alt-texts', {\n body: JSON.stringify({\n collection: collectionSlug,\n ids: selectedIds,\n }),\n method: 'POST',\n })\n\n if (!response.ok) {\n toast.error(t('@jhb.software/payload-alt-text-plugin:failedToGenerate'))\n return\n }\n\n const data = (await response.json()) as {\n erroredDocs: string[]\n totalDocs: number\n updatedDocs: number\n }\n\n if (data.erroredDocs.length > 0) {\n toast.error(\n t('@jhb.software/payload-alt-text-plugin:failedToGenerateForXImages').replace(\n '{X}',\n data.erroredDocs.length.toString(),\n ),\n )\n }\n\n // in case not all images were updated, show a warning instead of a success message:\n if (data.updatedDocs === data.totalDocs) {\n toast.success(\n t('@jhb.software/payload-alt-text-plugin:xOfYImagesUpdated')\n .replace('{X}', data.updatedDocs.toString())\n .replace('{Y}', data.totalDocs.toString()),\n )\n } else {\n toast.warning(\n t('@jhb.software/payload-alt-text-plugin:xOfYImagesUpdated')\n .replace('{X}', data.updatedDocs.toString())\n .replace('{Y}', data.totalDocs.toString()),\n )\n }\n\n // deselect all previously selected images\n for (const id of selectedIds) {\n setSelection(id)\n }\n\n router.refresh()\n } catch (error) {\n console.error('Error generating alt text:', error)\n toast.error(t('@jhb.software/payload-alt-text-plugin:errorGeneratingAltText'))\n }\n })\n }\n\n return (\n selectedIds.length > 0 && (\n <div className=\"m-0\" style={{ display: 'flex', justifyContent: 'right' }}>\n <Button\n className=\"m-0\"\n disabled={isPending || selectedIds.length === 0}\n icon={isPending ? <Spinner /> : <Lightning />}\n onClick={handleGenerateAltTexts}\n >\n {t('@jhb.software/payload-alt-text-plugin:generateAltTextFor')} {selectedIds.length}{' '}\n {selectedIds.length === 1\n ? t('@jhb.software/payload-alt-text-plugin:image')\n : t('@jhb.software/payload-alt-text-plugin:images')}\n </Button>\n </div>\n )\n )\n}\n"],"names":["Button","toast","useSelection","useTranslation","useRouter","useTransition","Lightning","Spinner","BulkGenerateAltTextsButton","collectionSlug","t","isPending","startTransition","selected","setSelection","selectedIds","Array","from","entries","filter","isSelected","map","id","router","handleGenerateAltTexts","Error","response","fetch","body","JSON","stringify","collection","ids","method","ok","error","data","json","erroredDocs","length","replace","toString","updatedDocs","totalDocs","success","warning","refresh","console","div","className","style","display","justifyContent","disabled","icon","onClick"],"mappings":"AAAA;;AAEA,SAASA,MAAM,EAAEC,KAAK,EAAEC,YAAY,EAAEC,cAAc,QAAQ,iBAAgB;AAC5E,SAASC,SAAS,QAAQ,qBAAoB;AAC9C,SAASC,aAAa,QAAQ,QAAO;AAMrC,SAASC,SAAS,QAAQ,uBAAsB;AAChD,SAASC,OAAO,QAAQ,qBAAoB;AAE5C,OAAO,SAASC,2BAA2B,EAAEC,cAAc,EAA8B;IACvF,MAAM,EAAEC,CAAC,EAAE,GAAGP;IACd,MAAM,CAACQ,WAAWC,gBAAgB,GAAGP;IACrC,MAAM,EAAEQ,QAAQ,EAAEC,YAAY,EAAE,GAAGZ;IAEnC,MAAMa,cAAcC,MAAMC,IAAI,CAACJ,SAASK,OAAO,IAC5CC,MAAM,CAAC,CAAC,GAAGC,WAAW,GAAKA,YAC3BC,GAAG,CAAC,CAAC,CAACC,GAAG,GAAKA;IAEjB,MAAMC,SAASnB;IAEf,MAAMoB,yBAAyB;QAC7BZ,gBAAgB;YACd,IAAI,CAACH,gBAAgB;gBACnB,MAAM,IAAIgB,MAAM;YAClB;YAEA,IAAI;gBACF,MAAMC,WAAW,MAAMC,MAAM,gDAAgD;oBAC3EC,MAAMC,KAAKC,SAAS,CAAC;wBACnBC,YAAYtB;wBACZuB,KAAKjB;oBACP;oBACAkB,QAAQ;gBACV;gBAEA,IAAI,CAACP,SAASQ,EAAE,EAAE;oBAChBjC,MAAMkC,KAAK,CAACzB,EAAE;oBACd;gBACF;gBAEA,MAAM0B,OAAQ,MAAMV,SAASW,IAAI;gBAMjC,IAAID,KAAKE,WAAW,CAACC,MAAM,GAAG,GAAG;oBAC/BtC,MAAMkC,KAAK,CACTzB,EAAE,oEAAoE8B,OAAO,CAC3E,OACAJ,KAAKE,WAAW,CAACC,MAAM,CAACE,QAAQ;gBAGtC;gBAEA,oFAAoF;gBACpF,IAAIL,KAAKM,WAAW,KAAKN,KAAKO,SAAS,EAAE;oBACvC1C,MAAM2C,OAAO,CACXlC,EAAE,2DACC8B,OAAO,CAAC,OAAOJ,KAAKM,WAAW,CAACD,QAAQ,IACxCD,OAAO,CAAC,OAAOJ,KAAKO,SAAS,CAACF,QAAQ;gBAE7C,OAAO;oBACLxC,MAAM4C,OAAO,CACXnC,EAAE,2DACC8B,OAAO,CAAC,OAAOJ,KAAKM,WAAW,CAACD,QAAQ,IACxCD,OAAO,CAAC,OAAOJ,KAAKO,SAAS,CAACF,QAAQ;gBAE7C;gBAEA,0CAA0C;gBAC1C,KAAK,MAAMnB,MAAMP,YAAa;oBAC5BD,aAAaQ;gBACf;gBAEAC,OAAOuB,OAAO;YAChB,EAAE,OAAOX,OAAO;gBACdY,QAAQZ,KAAK,CAAC,8BAA8BA;gBAC5ClC,MAAMkC,KAAK,CAACzB,EAAE;YAChB;QACF;IACF;IAEA,OACEK,YAAYwB,MAAM,GAAG,mBACnB,KAACS;QAAIC,WAAU;QAAMC,OAAO;YAAEC,SAAS;YAAQC,gBAAgB;QAAQ;kBACrE,cAAA,MAACpD;YACCiD,WAAU;YACVI,UAAU1C,aAAaI,YAAYwB,MAAM,KAAK;YAC9Ce,MAAM3C,0BAAY,KAACJ,6BAAa,KAACD;YACjCiD,SAAS/B;;gBAERd,EAAE;gBAA4D;gBAAEK,YAAYwB,MAAM;gBAAE;gBACpFxB,YAAYwB,MAAM,KAAK,IACpB7B,EAAE,iDACFA,EAAE;;;;AAKhB"}
@@ -1,12 +1,11 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { Button, toast, useDocumentInfo, useField, useLocale } from '@payloadcms/ui';
3
+ import { Button, toast, useDocumentInfo, useField, useLocale, useTranslation } from '@payloadcms/ui';
4
4
  import { useTransition } from 'react';
5
- import { usePluginTranslation } from '../utils/usePluginTranslation.js';
6
5
  import { Lightning } from './icons/Lightning.js';
7
6
  import { Spinner } from './icons/Spinner.js';
8
7
  export function GenerateAltTextButton() {
9
- const { t } = usePluginTranslation();
8
+ const { t } = useTranslation();
10
9
  const { id, collectionSlug } = useDocumentInfo();
11
10
  const locale = useLocale();
12
11
  const [isPending, startTransition] = useTransition();
@@ -18,7 +17,7 @@ export function GenerateAltTextButton() {
18
17
  });
19
18
  const handleGenerateAltText = ()=>{
20
19
  if (!collectionSlug || !id) {
21
- toast.error(t('cannotGenerateMissingFields'));
20
+ toast.error(t('@jhb.software/payload-alt-text-plugin:cannotGenerateMissingFields'));
22
21
  throw new Error('Missing required fields');
23
22
  }
24
23
  startTransition(async ()=>{
@@ -32,7 +31,7 @@ export function GenerateAltTextButton() {
32
31
  method: 'POST'
33
32
  });
34
33
  if (!response.ok) {
35
- let errorMessage = t('failedToGenerate');
34
+ let errorMessage = t('@jhb.software/payload-alt-text-plugin:failedToGenerate');
36
35
  try {
37
36
  const errorData = await response.json();
38
37
  errorMessage = errorData.error;
@@ -46,13 +45,13 @@ export function GenerateAltTextButton() {
46
45
  if (data.altText && data.keywords) {
47
46
  setAltText(data.altText);
48
47
  setKeywords(data.keywords);
49
- toast.success(t('altTextGeneratedSuccess'));
48
+ toast.success(t('@jhb.software/payload-alt-text-plugin:altTextGeneratedSuccess'));
50
49
  } else {
51
- toast.error(t('noAltTextGenerated'));
50
+ toast.error(t('@jhb.software/payload-alt-text-plugin:noAltTextGenerated'));
52
51
  }
53
52
  } catch (error) {
54
53
  console.error('Error generating alt text:', error);
55
- toast.error(t('errorGeneratingAltText'));
54
+ toast.error(t('@jhb.software/payload-alt-text-plugin:errorGeneratingAltText'));
56
55
  }
57
56
  });
58
57
  };
@@ -70,7 +69,7 @@ export function GenerateAltTextButton() {
70
69
  },
71
70
  children: [
72
71
  /*#__PURE__*/ _jsx("p", {
73
- children: t('altTextDescription')
72
+ children: t('@jhb.software/payload-alt-text-plugin:altTextDescription')
74
73
  }),
75
74
  /*#__PURE__*/ _jsxs("ol", {
76
75
  style: {
@@ -79,13 +78,13 @@ export function GenerateAltTextButton() {
79
78
  },
80
79
  children: [
81
80
  /*#__PURE__*/ _jsx("li", {
82
- children: t('altTextRequirement1')
81
+ children: t('@jhb.software/payload-alt-text-plugin:altTextRequirement1')
83
82
  }),
84
83
  /*#__PURE__*/ _jsx("li", {
85
- children: t('altTextRequirement2')
84
+ children: t('@jhb.software/payload-alt-text-plugin:altTextRequirement2')
86
85
  }),
87
86
  /*#__PURE__*/ _jsx("li", {
88
- children: t('altTextRequirement3')
87
+ children: t('@jhb.software/payload-alt-text-plugin:altTextRequirement3')
89
88
  })
90
89
  ]
91
90
  })
@@ -100,8 +99,8 @@ export function GenerateAltTextButton() {
100
99
  disabled: isPending || !id,
101
100
  icon: isPending ? /*#__PURE__*/ _jsx(Spinner, {}) : /*#__PURE__*/ _jsx(Lightning, {}),
102
101
  onClick: handleGenerateAltText,
103
- tooltip: !id ? t('pleaseSaveDocumentFirst') : undefined,
104
- children: t('generateAltText')
102
+ tooltip: !id ? t('@jhb.software/payload-alt-text-plugin:pleaseSaveDocumentFirst') : undefined,
103
+ children: t('@jhb.software/payload-alt-text-plugin:generateAltText')
105
104
  })
106
105
  })
107
106
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/GenerateAltTextButton.tsx"],"sourcesContent":["'use client'\n\nimport { Button, toast, useDocumentInfo, useField, useLocale } from '@payloadcms/ui'\nimport { useTransition } from 'react'\n\nimport { usePluginTranslation } from '../utils/usePluginTranslation.js'\nimport { Lightning } from './icons/Lightning.js'\nimport { Spinner } from './icons/Spinner.js'\n\nexport function GenerateAltTextButton() {\n const { t } = usePluginTranslation()\n const { id, collectionSlug } = useDocumentInfo()\n const locale = useLocale()\n const [isPending, startTransition] = useTransition()\n\n const { setValue: setKeywords } = useField<string>({ path: 'keywords' })\n const { setValue: setAltText } = useField<string>({ path: 'alt' })\n\n const handleGenerateAltText = () => {\n if (!collectionSlug || !id) {\n toast.error(t('cannotGenerateMissingFields'))\n throw new Error('Missing required fields')\n }\n\n startTransition(async () => {\n try {\n const response = await fetch('/api/alt-text-plugin/generate-alt-text', {\n body: JSON.stringify({\n id: id as string,\n collection: collectionSlug,\n locale: locale?.code ?? null, // sent null when localization is disabled\n }),\n method: 'POST',\n })\n\n if (!response.ok) {\n let errorMessage = t('failedToGenerate')\n try {\n const errorData = (await response.json()) as { error: string }\n errorMessage = errorData.error\n } catch (error) {\n console.error('Error generating alt text:', error)\n }\n\n toast.error(errorMessage)\n return\n }\n\n const data = (await response.json()) as {\n altText: string\n keywords: string[]\n }\n\n if (data.altText && data.keywords) {\n setAltText(data.altText)\n setKeywords(data.keywords)\n toast.success(t('altTextGeneratedSuccess'))\n } else {\n toast.error(t('noAltTextGenerated'))\n }\n } catch (error) {\n console.error('Error generating alt text:', error)\n toast.error(t('errorGeneratingAltText'))\n }\n })\n }\n\n return (\n <div style={{ display: 'flex', gap: '20px', marginTop: '10px' }}>\n <div style={{ color: 'var(--theme-elevation-400)', flex: '1' }}>\n <p>{t('altTextDescription')}</p>\n <ol style={{ margin: '10px 0', paddingLeft: '20px' }}>\n <li>{t('altTextRequirement1')}</li>\n <li>{t('altTextRequirement2')}</li>\n <li>{t('altTextRequirement3')}</li>\n </ol>\n </div>\n <div style={{ alignItems: 'center', display: 'flex' }}>\n <Button\n disabled={isPending || !id}\n icon={isPending ? <Spinner /> : <Lightning />}\n onClick={handleGenerateAltText}\n tooltip={!id ? t('pleaseSaveDocumentFirst') : undefined}\n >\n {t('generateAltText')}\n </Button>\n </div>\n </div>\n )\n}\n"],"names":["Button","toast","useDocumentInfo","useField","useLocale","useTransition","usePluginTranslation","Lightning","Spinner","GenerateAltTextButton","t","id","collectionSlug","locale","isPending","startTransition","setValue","setKeywords","path","setAltText","handleGenerateAltText","error","Error","response","fetch","body","JSON","stringify","collection","code","method","ok","errorMessage","errorData","json","console","data","altText","keywords","success","div","style","display","gap","marginTop","color","flex","p","ol","margin","paddingLeft","li","alignItems","disabled","icon","onClick","tooltip","undefined"],"mappings":"AAAA;;AAEA,SAASA,MAAM,EAAEC,KAAK,EAAEC,eAAe,EAAEC,QAAQ,EAAEC,SAAS,QAAQ,iBAAgB;AACpF,SAASC,aAAa,QAAQ,QAAO;AAErC,SAASC,oBAAoB,QAAQ,mCAAkC;AACvE,SAASC,SAAS,QAAQ,uBAAsB;AAChD,SAASC,OAAO,QAAQ,qBAAoB;AAE5C,OAAO,SAASC;IACd,MAAM,EAAEC,CAAC,EAAE,GAAGJ;IACd,MAAM,EAAEK,EAAE,EAAEC,cAAc,EAAE,GAAGV;IAC/B,MAAMW,SAAST;IACf,MAAM,CAACU,WAAWC,gBAAgB,GAAGV;IAErC,MAAM,EAAEW,UAAUC,WAAW,EAAE,GAAGd,SAAiB;QAAEe,MAAM;IAAW;IACtE,MAAM,EAAEF,UAAUG,UAAU,EAAE,GAAGhB,SAAiB;QAAEe,MAAM;IAAM;IAEhE,MAAME,wBAAwB;QAC5B,IAAI,CAACR,kBAAkB,CAACD,IAAI;YAC1BV,MAAMoB,KAAK,CAACX,EAAE;YACd,MAAM,IAAIY,MAAM;QAClB;QAEAP,gBAAgB;YACd,IAAI;gBACF,MAAMQ,WAAW,MAAMC,MAAM,0CAA0C;oBACrEC,MAAMC,KAAKC,SAAS,CAAC;wBACnBhB,IAAIA;wBACJiB,YAAYhB;wBACZC,QAAQA,QAAQgB,QAAQ;oBAC1B;oBACAC,QAAQ;gBACV;gBAEA,IAAI,CAACP,SAASQ,EAAE,EAAE;oBAChB,IAAIC,eAAetB,EAAE;oBACrB,IAAI;wBACF,MAAMuB,YAAa,MAAMV,SAASW,IAAI;wBACtCF,eAAeC,UAAUZ,KAAK;oBAChC,EAAE,OAAOA,OAAO;wBACdc,QAAQd,KAAK,CAAC,8BAA8BA;oBAC9C;oBAEApB,MAAMoB,KAAK,CAACW;oBACZ;gBACF;gBAEA,MAAMI,OAAQ,MAAMb,SAASW,IAAI;gBAKjC,IAAIE,KAAKC,OAAO,IAAID,KAAKE,QAAQ,EAAE;oBACjCnB,WAAWiB,KAAKC,OAAO;oBACvBpB,YAAYmB,KAAKE,QAAQ;oBACzBrC,MAAMsC,OAAO,CAAC7B,EAAE;gBAClB,OAAO;oBACLT,MAAMoB,KAAK,CAACX,EAAE;gBAChB;YACF,EAAE,OAAOW,OAAO;gBACdc,QAAQd,KAAK,CAAC,8BAA8BA;gBAC5CpB,MAAMoB,KAAK,CAACX,EAAE;YAChB;QACF;IACF;IAEA,qBACE,MAAC8B;QAAIC,OAAO;YAAEC,SAAS;YAAQC,KAAK;YAAQC,WAAW;QAAO;;0BAC5D,MAACJ;gBAAIC,OAAO;oBAAEI,OAAO;oBAA8BC,MAAM;gBAAI;;kCAC3D,KAACC;kCAAGrC,EAAE;;kCACN,MAACsC;wBAAGP,OAAO;4BAAEQ,QAAQ;4BAAUC,aAAa;wBAAO;;0CACjD,KAACC;0CAAIzC,EAAE;;0CACP,KAACyC;0CAAIzC,EAAE;;0CACP,KAACyC;0CAAIzC,EAAE;;;;;;0BAGX,KAAC8B;gBAAIC,OAAO;oBAAEW,YAAY;oBAAUV,SAAS;gBAAO;0BAClD,cAAA,KAAC1C;oBACCqD,UAAUvC,aAAa,CAACH;oBACxB2C,MAAMxC,0BAAY,KAACN,6BAAa,KAACD;oBACjCgD,SAASnC;oBACToC,SAAS,CAAC7C,KAAKD,EAAE,6BAA6B+C;8BAE7C/C,EAAE;;;;;AAKb"}
1
+ {"version":3,"sources":["../../src/components/GenerateAltTextButton.tsx"],"sourcesContent":["'use client'\n\nimport { Button, toast, useDocumentInfo, useField, useLocale, useTranslation } from '@payloadcms/ui'\nimport { useTransition } from 'react'\n\nimport type {\n PluginAltTextTranslationKeys,\n PluginAltTextTranslations,\n} from '../translations/index.js'\nimport { Lightning } from './icons/Lightning.js'\nimport { Spinner } from './icons/Spinner.js'\n\nexport function GenerateAltTextButton() {\n const { t } = useTranslation<PluginAltTextTranslations, PluginAltTextTranslationKeys>()\n const { id, collectionSlug } = useDocumentInfo()\n const locale = useLocale()\n const [isPending, startTransition] = useTransition()\n\n const { setValue: setKeywords } = useField<string>({ path: 'keywords' })\n const { setValue: setAltText } = useField<string>({ path: 'alt' })\n\n const handleGenerateAltText = () => {\n if (!collectionSlug || !id) {\n toast.error(t('@jhb.software/payload-alt-text-plugin:cannotGenerateMissingFields'))\n throw new Error('Missing required fields')\n }\n\n startTransition(async () => {\n try {\n const response = await fetch('/api/alt-text-plugin/generate-alt-text', {\n body: JSON.stringify({\n id: id as string,\n collection: collectionSlug,\n locale: locale?.code ?? null, // sent null when localization is disabled\n }),\n method: 'POST',\n })\n\n if (!response.ok) {\n let errorMessage = t('@jhb.software/payload-alt-text-plugin:failedToGenerate')\n try {\n const errorData = (await response.json()) as { error: string }\n errorMessage = errorData.error\n } catch (error) {\n console.error('Error generating alt text:', error)\n }\n\n toast.error(errorMessage)\n return\n }\n\n const data = (await response.json()) as {\n altText: string\n keywords: string[]\n }\n\n if (data.altText && data.keywords) {\n setAltText(data.altText)\n setKeywords(data.keywords)\n toast.success(t('@jhb.software/payload-alt-text-plugin:altTextGeneratedSuccess'))\n } else {\n toast.error(t('@jhb.software/payload-alt-text-plugin:noAltTextGenerated'))\n }\n } catch (error) {\n console.error('Error generating alt text:', error)\n toast.error(t('@jhb.software/payload-alt-text-plugin:errorGeneratingAltText'))\n }\n })\n }\n\n return (\n <div style={{ display: 'flex', gap: '20px', marginTop: '10px' }}>\n <div style={{ color: 'var(--theme-elevation-400)', flex: '1' }}>\n <p>{t('@jhb.software/payload-alt-text-plugin:altTextDescription')}</p>\n <ol style={{ margin: '10px 0', paddingLeft: '20px' }}>\n <li>{t('@jhb.software/payload-alt-text-plugin:altTextRequirement1')}</li>\n <li>{t('@jhb.software/payload-alt-text-plugin:altTextRequirement2')}</li>\n <li>{t('@jhb.software/payload-alt-text-plugin:altTextRequirement3')}</li>\n </ol>\n </div>\n <div style={{ alignItems: 'center', display: 'flex' }}>\n <Button\n disabled={isPending || !id}\n icon={isPending ? <Spinner /> : <Lightning />}\n onClick={handleGenerateAltText}\n tooltip={\n !id ? t('@jhb.software/payload-alt-text-plugin:pleaseSaveDocumentFirst') : undefined\n }\n >\n {t('@jhb.software/payload-alt-text-plugin:generateAltText')}\n </Button>\n </div>\n </div>\n )\n}\n"],"names":["Button","toast","useDocumentInfo","useField","useLocale","useTranslation","useTransition","Lightning","Spinner","GenerateAltTextButton","t","id","collectionSlug","locale","isPending","startTransition","setValue","setKeywords","path","setAltText","handleGenerateAltText","error","Error","response","fetch","body","JSON","stringify","collection","code","method","ok","errorMessage","errorData","json","console","data","altText","keywords","success","div","style","display","gap","marginTop","color","flex","p","ol","margin","paddingLeft","li","alignItems","disabled","icon","onClick","tooltip","undefined"],"mappings":"AAAA;;AAEA,SAASA,MAAM,EAAEC,KAAK,EAAEC,eAAe,EAAEC,QAAQ,EAAEC,SAAS,EAAEC,cAAc,QAAQ,iBAAgB;AACpG,SAASC,aAAa,QAAQ,QAAO;AAMrC,SAASC,SAAS,QAAQ,uBAAsB;AAChD,SAASC,OAAO,QAAQ,qBAAoB;AAE5C,OAAO,SAASC;IACd,MAAM,EAAEC,CAAC,EAAE,GAAGL;IACd,MAAM,EAAEM,EAAE,EAAEC,cAAc,EAAE,GAAGV;IAC/B,MAAMW,SAAST;IACf,MAAM,CAACU,WAAWC,gBAAgB,GAAGT;IAErC,MAAM,EAAEU,UAAUC,WAAW,EAAE,GAAGd,SAAiB;QAAEe,MAAM;IAAW;IACtE,MAAM,EAAEF,UAAUG,UAAU,EAAE,GAAGhB,SAAiB;QAAEe,MAAM;IAAM;IAEhE,MAAME,wBAAwB;QAC5B,IAAI,CAACR,kBAAkB,CAACD,IAAI;YAC1BV,MAAMoB,KAAK,CAACX,EAAE;YACd,MAAM,IAAIY,MAAM;QAClB;QAEAP,gBAAgB;YACd,IAAI;gBACF,MAAMQ,WAAW,MAAMC,MAAM,0CAA0C;oBACrEC,MAAMC,KAAKC,SAAS,CAAC;wBACnBhB,IAAIA;wBACJiB,YAAYhB;wBACZC,QAAQA,QAAQgB,QAAQ;oBAC1B;oBACAC,QAAQ;gBACV;gBAEA,IAAI,CAACP,SAASQ,EAAE,EAAE;oBAChB,IAAIC,eAAetB,EAAE;oBACrB,IAAI;wBACF,MAAMuB,YAAa,MAAMV,SAASW,IAAI;wBACtCF,eAAeC,UAAUZ,KAAK;oBAChC,EAAE,OAAOA,OAAO;wBACdc,QAAQd,KAAK,CAAC,8BAA8BA;oBAC9C;oBAEApB,MAAMoB,KAAK,CAACW;oBACZ;gBACF;gBAEA,MAAMI,OAAQ,MAAMb,SAASW,IAAI;gBAKjC,IAAIE,KAAKC,OAAO,IAAID,KAAKE,QAAQ,EAAE;oBACjCnB,WAAWiB,KAAKC,OAAO;oBACvBpB,YAAYmB,KAAKE,QAAQ;oBACzBrC,MAAMsC,OAAO,CAAC7B,EAAE;gBAClB,OAAO;oBACLT,MAAMoB,KAAK,CAACX,EAAE;gBAChB;YACF,EAAE,OAAOW,OAAO;gBACdc,QAAQd,KAAK,CAAC,8BAA8BA;gBAC5CpB,MAAMoB,KAAK,CAACX,EAAE;YAChB;QACF;IACF;IAEA,qBACE,MAAC8B;QAAIC,OAAO;YAAEC,SAAS;YAAQC,KAAK;YAAQC,WAAW;QAAO;;0BAC5D,MAACJ;gBAAIC,OAAO;oBAAEI,OAAO;oBAA8BC,MAAM;gBAAI;;kCAC3D,KAACC;kCAAGrC,EAAE;;kCACN,MAACsC;wBAAGP,OAAO;4BAAEQ,QAAQ;4BAAUC,aAAa;wBAAO;;0CACjD,KAACC;0CAAIzC,EAAE;;0CACP,KAACyC;0CAAIzC,EAAE;;0CACP,KAACyC;0CAAIzC,EAAE;;;;;;0BAGX,KAAC8B;gBAAIC,OAAO;oBAAEW,YAAY;oBAAUV,SAAS;gBAAO;0BAClD,cAAA,KAAC1C;oBACCqD,UAAUvC,aAAa,CAACH;oBACxB2C,MAAMxC,0BAAY,KAACN,6BAAa,KAACD;oBACjCgD,SAASnC;oBACToC,SACE,CAAC7C,KAAKD,EAAE,mEAAmE+C;8BAG5E/C,EAAE;;;;;AAKb"}
@@ -11,16 +11,21 @@ export function altTextField({ localized }) {
11
11
  label: translatedLabel('alternateText'),
12
12
  localized,
13
13
  required: true,
14
- validate: (value, { id, req: { t } })=>{
15
- // if the document has an id, which means a media file was uploaded, the alt text is required
16
- if (id) {
17
- if (!value || value.trim().length === 0) {
18
- // @ts-expect-error - the translation key type does not include the custom key
19
- return t('@jhb.software/payload-alt-text-plugin:theAlternateTextIsRequired');
20
- }
14
+ validate: (value, { data, operation, req: { t } })=>{
15
+ // Since https://github.com/payloadcms/payload/pull/14988, when using external storage (e.g., S3),
16
+ // it is no longer possible to detect whether this validation runs during the initial upload
17
+ // or a regular update by checking the existence of the ID.
18
+ // Instead, compare the timestamps of the createdAt and updatedAt fields.
19
+ const isInitialUpload = operation === 'create' || 'createdAt' in data && 'updatedAt' in data && data.createdAt === data.updatedAt;
20
+ // initial upload: allow without alt text
21
+ if (isInitialUpload) {
22
+ return true;
23
+ }
24
+ // regular update: require alt text
25
+ if (!value || value.trim().length === 0) {
26
+ // @ts-expect-error - the translation key type does not include the custom key
27
+ return t('@jhb.software/payload-alt-text-plugin:theAlternateTextIsRequired');
21
28
  }
22
- // The alt text is not required when the media file was not uploaded yet
23
- // (since the alt text generation needs an URL to fetch the file)
24
29
  return true;
25
30
  }
26
31
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/fields/altTextField.ts"],"sourcesContent":["import type { TextareaField } from 'payload'\n\nimport { translatedLabel } from '../utils/translatedLabel.js'\n\nexport function altTextField({\n localized,\n}: {\n localized?: TextareaField['localized']\n}): TextareaField {\n return {\n name: 'alt',\n type: 'textarea',\n admin: {\n components: {\n Field: '@jhb.software/payload-alt-text-plugin/client#AltTextField',\n },\n },\n label: translatedLabel('alternateText'),\n localized,\n required: true,\n validate: (value, { id, req: { t } }) => {\n // if the document has an id, which means a media file was uploaded, the alt text is required\n if (id) {\n if (!value || value.trim().length === 0) {\n // @ts-expect-error - the translation key type does not include the custom key\n return t('@jhb.software/payload-alt-text-plugin:theAlternateTextIsRequired')\n }\n }\n\n // The alt text is not required when the media file was not uploaded yet\n // (since the alt text generation needs an URL to fetch the file)\n return true\n },\n }\n}\n"],"names":["translatedLabel","altTextField","localized","name","type","admin","components","Field","label","required","validate","value","id","req","t","trim","length"],"mappings":"AAEA,SAASA,eAAe,QAAQ,8BAA6B;AAE7D,OAAO,SAASC,aAAa,EAC3BC,SAAS,EAGV;IACC,OAAO;QACLC,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,YAAY;gBACVC,OAAO;YACT;QACF;QACAC,OAAOR,gBAAgB;QACvBE;QACAO,UAAU;QACVC,UAAU,CAACC,OAAO,EAAEC,EAAE,EAAEC,KAAK,EAAEC,CAAC,EAAE,EAAE;YAClC,6FAA6F;YAC7F,IAAIF,IAAI;gBACN,IAAI,CAACD,SAASA,MAAMI,IAAI,GAAGC,MAAM,KAAK,GAAG;oBACvC,8EAA8E;oBAC9E,OAAOF,EAAE;gBACX;YACF;YAEA,wEAAwE;YACxE,iEAAiE;YACjE,OAAO;QACT;IACF;AACF"}
1
+ {"version":3,"sources":["../../src/fields/altTextField.ts"],"sourcesContent":["import type { TextareaField } from 'payload'\n\nimport { translatedLabel } from '../utils/translatedLabel.js'\n\nexport function altTextField({\n localized,\n}: {\n localized?: TextareaField['localized']\n}): TextareaField {\n return {\n name: 'alt',\n type: 'textarea',\n admin: {\n components: {\n Field: '@jhb.software/payload-alt-text-plugin/client#AltTextField',\n },\n },\n label: translatedLabel('alternateText'),\n localized,\n required: true,\n validate: (value, { data, operation, req: { t } }) => {\n // Since https://github.com/payloadcms/payload/pull/14988, when using external storage (e.g., S3),\n // it is no longer possible to detect whether this validation runs during the initial upload\n // or a regular update by checking the existence of the ID.\n // Instead, compare the timestamps of the createdAt and updatedAt fields.\n const isInitialUpload =\n operation === 'create' ||\n ('createdAt' in data && 'updatedAt' in data && data.createdAt === data.updatedAt)\n\n // initial upload: allow without alt text\n if (isInitialUpload) {\n return true\n }\n\n // regular update: require alt text\n if (!value || value.trim().length === 0) {\n // @ts-expect-error - the translation key type does not include the custom key\n return t('@jhb.software/payload-alt-text-plugin:theAlternateTextIsRequired')\n }\n\n return true\n },\n }\n}\n"],"names":["translatedLabel","altTextField","localized","name","type","admin","components","Field","label","required","validate","value","data","operation","req","t","isInitialUpload","createdAt","updatedAt","trim","length"],"mappings":"AAEA,SAASA,eAAe,QAAQ,8BAA6B;AAE7D,OAAO,SAASC,aAAa,EAC3BC,SAAS,EAGV;IACC,OAAO;QACLC,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,YAAY;gBACVC,OAAO;YACT;QACF;QACAC,OAAOR,gBAAgB;QACvBE;QACAO,UAAU;QACVC,UAAU,CAACC,OAAO,EAAEC,IAAI,EAAEC,SAAS,EAAEC,KAAK,EAAEC,CAAC,EAAE,EAAE;YAC/C,kGAAkG;YAClG,4FAA4F;YAC5F,2DAA2D;YAC3D,yEAAyE;YACzE,MAAMC,kBACJH,cAAc,YACb,eAAeD,QAAQ,eAAeA,QAAQA,KAAKK,SAAS,KAAKL,KAAKM,SAAS;YAElF,yCAAyC;YACzC,IAAIF,iBAAiB;gBACnB,OAAO;YACT;YAEA,mCAAmC;YACnC,IAAI,CAACL,SAASA,MAAMQ,IAAI,GAAGC,MAAM,KAAK,GAAG;gBACvC,8EAA8E;gBAC9E,OAAOL,EAAE;YACX;YAEA,OAAO;QACT;IACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jhb.software/payload-alt-text-plugin",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "A Payload CMS plugin that adds AI-powered alt text generation for images.",
5
5
  "bugs": "https://github.com/jhb-software/payload-plugins/issues",
6
6
  "repository": "https://github.com/jhb-software/payload-plugins",
@@ -17,26 +17,26 @@
17
17
  "main": "./dist/index.js",
18
18
  "types": "./dist/index.d.ts",
19
19
  "dependencies": {
20
- "openai": "^6.9.1",
20
+ "openai": "^6.16.0",
21
21
  "p-map": "^7.0.4",
22
- "zod": "^4.1.13"
22
+ "zod": "^4.3.5"
23
23
  },
24
24
  "peerDependencies": {
25
- "@payloadcms/ui": "^3.65.0",
26
- "next": "15.5.6",
27
- "payload": "^3.65.0",
28
- "react": "19.2.0",
29
- "react-dom": "19.2.0"
25
+ "@payloadcms/ui": "^3.72.0",
26
+ "next": "15.5.9",
27
+ "payload": "^3.72.0",
28
+ "react": "19.2.3",
29
+ "react-dom": "19.2.3"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@payloadcms/eslint-config": "^3.28.0",
33
- "@swc/cli": "^0.7.9",
34
- "@swc/core": "^1.15.3",
35
- "@types/react": "19.2.7",
33
+ "@swc/cli": "^0.7.10",
34
+ "@swc/core": "^1.15.10",
35
+ "@types/react": "19.2.8",
36
36
  "@types/react-dom": "19.2.3",
37
37
  "copyfiles": "2.4.1",
38
- "eslint": "^9.39.1",
39
- "prettier": "^3.7.3",
38
+ "eslint": "^9.39.2",
39
+ "prettier": "^3.8.0",
40
40
  "rimraf": "6.1.2",
41
41
  "typescript": "5.9.3"
42
42
  },
@@ -1,5 +0,0 @@
1
- import type { PluginAltTextTranslationKeys } from 'src/translations/index.js';
2
- /** Hook which returns a translation function for the plugin translations. */
3
- export declare const usePluginTranslation: () => {
4
- t: (key: PluginAltTextTranslationKeys) => string;
5
- };
@@ -1,16 +0,0 @@
1
- import { useTranslation } from '@payloadcms/ui';
2
- /** Hook which returns a translation function for the plugin translations. */ export const usePluginTranslation = ()=>{
3
- const { i18n } = useTranslation();
4
- const pluginTranslations = i18n.translations['@jhb.software/payload-alt-text-plugin'];
5
- return {
6
- t: (key)=>{
7
- const translation = pluginTranslations[key];
8
- if (!translation) {
9
- console.error('Plugin translation not found', key);
10
- }
11
- return translation ?? key;
12
- }
13
- };
14
- };
15
-
16
- //# sourceMappingURL=usePluginTranslation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/usePluginTranslation.ts"],"sourcesContent":["import type {\n PluginAltTextTranslationKeys,\n PluginAltTextTranslations,\n} from 'src/translations/index.js'\n\nimport { useTranslation } from '@payloadcms/ui'\n\n/** Hook which returns a translation function for the plugin translations. */\nexport const usePluginTranslation = () => {\n const { i18n } = useTranslation<PluginAltTextTranslations, PluginAltTextTranslationKeys>()\n const pluginTranslations = i18n.translations[\n '@jhb.software/payload-alt-text-plugin'\n ] as PluginAltTextTranslations\n\n return {\n t: (key: PluginAltTextTranslationKeys) => {\n const translation = pluginTranslations[key] as string\n\n if (!translation) {\n console.error('Plugin translation not found', key)\n }\n return translation ?? key\n },\n }\n}\n"],"names":["useTranslation","usePluginTranslation","i18n","pluginTranslations","translations","t","key","translation","console","error"],"mappings":"AAKA,SAASA,cAAc,QAAQ,iBAAgB;AAE/C,2EAA2E,GAC3E,OAAO,MAAMC,uBAAuB;IAClC,MAAM,EAAEC,IAAI,EAAE,GAAGF;IACjB,MAAMG,qBAAqBD,KAAKE,YAAY,CAC1C,wCACD;IAED,OAAO;QACLC,GAAG,CAACC;YACF,MAAMC,cAAcJ,kBAAkB,CAACG,IAAI;YAE3C,IAAI,CAACC,aAAa;gBAChBC,QAAQC,KAAK,CAAC,gCAAgCH;YAChD;YACA,OAAOC,eAAeD;QACxB;IACF;AACF,EAAC"}