{"version":3,"file":"SettingsPage.mjs","sources":["../../../../admin/src/pages/SettingsPage/SettingsPage.tsx"],"sourcesContent":["// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport {\n  Page,\n  useNotification,\n  useFetchClient,\n  Layouts,\n  ConfirmDialog,\n} from '@strapi/admin/strapi-admin';\nimport { useAIAvailability } from '@strapi/admin/strapi-admin/ee';\nimport {\n  Box,\n  Button,\n  Dialog,\n  Flex,\n  Grid,\n  Toggle,\n  Typography,\n  Field,\n  Status,\n  Divider,\n  StatusProps,\n  TextButton,\n} from '@strapi/design-system';\nimport { Check, Sparkle } from '@strapi/icons';\nimport isEqual from 'lodash/isEqual';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQuery } from 'react-query';\n\nimport { AIMetadataJob } from '../../../../shared/contracts/ai-metadata-jobs';\nimport { GetAIMetadataCount, GenerateAIMetadata } from '../../../../shared/contracts/files';\nimport { UpdateSettings } from '../../../../shared/contracts/settings';\nimport { PERMISSIONS } from '../../constants';\nimport { useAIMetadataJob } from '../../hooks/useAIMetadataJob';\nimport { useSettings } from '../../hooks/useSettings';\nimport { useTracking } from '../../hooks/useTracking';\nimport { getTrad } from '../../utils';\n\nimport { init } from './init';\nimport { initialState, reducer } from './reducer';\n\nimport type { InitialState } from './reducer';\n\n/* -------------------------------------------------------------------------------------------------\n * MetadataAction\n * -----------------------------------------------------------------------------------------------*/\n\nconst BetaStatus = (props: Omit<StatusProps, 'children'>) => {\n  const { formatMessage } = useIntl();\n\n  return (\n    <Status\n      size=\"S\"\n      variant=\"secondary\"\n      style={{ textTransform: 'uppercase', display: 'flex' }}\n      {...props}\n    >\n      <Typography tag=\"span\" variant=\"pi\" fontWeight=\"bold\">\n        {formatMessage({\n          id: 'app.components.Status.beta',\n          defaultMessage: 'Beta',\n        })}\n      </Typography>\n    </Status>\n  );\n};\n\ninterface MetadataActionProps {\n  job: AIMetadataJob | null;\n  imagesWithoutMetadataCount: number;\n  isConfirmDialogOpen: boolean;\n  onConfirmDialogChange: (open: boolean) => void;\n  onGenerate: () => Promise<void>;\n}\n\nconst MetadataAction = ({\n  job,\n  imagesWithoutMetadataCount,\n  isConfirmDialogOpen,\n  onConfirmDialogChange,\n  onGenerate,\n}: MetadataActionProps) => {\n  const { formatMessage } = useIntl();\n\n  // If there's an active job processing\n  if (job?.status === 'processing') {\n    return (\n      <Flex gap={2} alignItems=\"center\">\n        <Typography variant=\"pi\" textColor=\"neutral600\">\n          {formatMessage({\n            id: getTrad('settings.form.aiMetadata.generatingMetadata'),\n            defaultMessage: 'AI is generating your metadata',\n          })}\n        </Typography>\n      </Flex>\n    );\n  }\n\n  // Only show completed state when all images have metadata\n  if (imagesWithoutMetadataCount === 0) {\n    return (\n      <Typography variant=\"pi\" textColor=\"primary600\">\n        <Flex gap={2} alignItems=\"center\">\n          <Check width=\"16px\" height=\"16px\" />\n          {formatMessage({\n            id: getTrad('settings.form.aiMetadata.metadataGenerated'),\n            defaultMessage: 'Your metadata has been generated',\n          })}\n        </Flex>\n      </Typography>\n    );\n  }\n\n  return (\n    <Dialog.Root open={isConfirmDialogOpen} onOpenChange={onConfirmDialogChange}>\n      <Dialog.Trigger>\n        <TextButton disabled={imagesWithoutMetadataCount === 0}>\n          {formatMessage({\n            id: getTrad('settings.form.aiMetadata.generateButton'),\n            defaultMessage: 'Generate metadata',\n          })}\n        </TextButton>\n      </Dialog.Trigger>\n      <ConfirmDialog\n        variant=\"success-light\"\n        onConfirm={onGenerate}\n        title={\n          <Flex gap={2}>\n            <BetaStatus />\n            {formatMessage({\n              id: getTrad('settings.form.aiMetadata.confirmDialog.title'),\n              defaultMessage: 'Generate AI Metadata',\n            })}\n          </Flex>\n        }\n      >\n        {formatMessage(\n          {\n            id: getTrad('settings.form.aiMetadata.confirmDialog.message'),\n            defaultMessage:\n              'This will start a process in the background to generate captions and alternative text for {count, plural, one {# image} other {# images}}. AI can make mistakes, be sure to review the generated content.',\n          },\n          { count: imagesWithoutMetadataCount }\n        )}\n      </ConfirmDialog>\n    </Dialog.Root>\n  );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * SettingsPage\n * -----------------------------------------------------------------------------------------------*/\n\nexport const SettingsPage = () => {\n  const { formatMessage } = useIntl();\n  const { toggleNotification } = useNotification();\n  const { put, post, get } = useFetchClient();\n  const [isConfirmDialogOpen, setIsConfirmDialogOpen] = React.useState(false);\n  const { trackUsage } = useTracking();\n\n  const [{ initialData, modifiedData }, dispatch] = React.useReducer(reducer, initialState, init);\n\n  const { data, isLoading, refetch } = useSettings();\n  const isAIAvailable = useAIAvailability();\n\n  const { data: imageCountResponse, isLoading: isLoadingImagesWithoutMetadataCount } = useQuery<\n    GetAIMetadataCount.Response['data'],\n    GetAIMetadataCount.Response['error']\n  >(\n    ['ai-metadata-count'],\n    async () => {\n      const { data } = await get('/upload/actions/generate-ai-metadata/count');\n      return data;\n    },\n    {\n      enabled: isAIAvailable && !!data?.aiMetadata,\n      retry: false,\n    }\n  );\n\n  const imagesWithoutMetadataCount = imageCountResponse?.imagesWithoutMetadataCount ?? 0;\n\n  React.useEffect(() => {\n    if (data) {\n      dispatch({\n        type: 'GET_DATA_SUCCEEDED',\n        data,\n      });\n    }\n  }, [data]);\n\n  const isSaveButtonDisabled = isEqual(initialData, modifiedData);\n\n  const { mutateAsync, isLoading: isSubmitting } = useMutation<\n    UpdateSettings.Response['data'],\n    UpdateSettings.Response['error'],\n    UpdateSettings.Request['body']\n  >(\n    async (body) => {\n      const { data } = await put('/upload/settings', body);\n\n      return data;\n    },\n    {\n      onSuccess() {\n        refetch();\n\n        toggleNotification({\n          type: 'success',\n          message: formatMessage({ id: 'notification.form.success.fields' }),\n        });\n      },\n      onError(err: any) {\n        toggleNotification({\n          type: 'danger',\n          message: err.message || formatMessage({ id: 'notification.error' }),\n        });\n      },\n    }\n  );\n\n  // Poll for latest active job - notifications are handled inside the hook\n  const { data: aiMetadataJob, refetch: refetchAiMetadataJob } = useAIMetadataJob({\n    enabled: isAIAvailable,\n  });\n\n  const { mutateAsync: startGenerateAIMetadata } = useMutation<\n    GenerateAIMetadata.Response['data'],\n    GenerateAIMetadata.Response['error'],\n    void\n  >(\n    async () => {\n      const { data } = await post('/upload/actions/generate-ai-metadata', {});\n      return data;\n    },\n    {\n      onSuccess() {\n        setIsConfirmDialogOpen(false);\n        // Refetch job status to start polling the new job\n        refetchAiMetadataJob();\n      },\n      onError(err) {\n        toggleNotification({\n          type: 'danger',\n          message: (err as Error)?.message || formatMessage({ id: 'notification.error' }),\n        });\n        setIsConfirmDialogOpen(false);\n      },\n    }\n  );\n\n  const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n    e.preventDefault();\n\n    if (isSaveButtonDisabled) {\n      return;\n    }\n\n    await mutateAsync(modifiedData!);\n  };\n\n  const handleChange = ({\n    target: { name, value },\n  }: {\n    target: { name: keyof NonNullable<InitialState['initialData']>; value: boolean };\n  }) => {\n    dispatch({\n      type: 'ON_CHANGE',\n      keys: name,\n      value,\n    });\n  };\n\n  if (isLoading) {\n    return <Page.Loading />;\n  }\n\n  return (\n    <Page.Main tabIndex={-1}>\n      <Page.Title>\n        {formatMessage({\n          id: getTrad('page.title'),\n          defaultMessage: 'Settings - Media Library',\n        })}\n      </Page.Title>\n      <form onSubmit={handleSubmit}>\n        <Layouts.Header\n          title={formatMessage({\n            id: getTrad('settings.header.label'),\n            defaultMessage: 'Media Library',\n          })}\n          primaryAction={\n            <Button\n              disabled={isSaveButtonDisabled}\n              loading={isSubmitting}\n              type=\"submit\"\n              startIcon={<Check />}\n              size=\"S\"\n              fullWidth\n            >\n              {formatMessage({\n                id: 'global.save',\n                defaultMessage: 'Save',\n              })}\n            </Button>\n          }\n          subtitle={formatMessage({\n            id: getTrad('settings.sub-header.label'),\n            defaultMessage: 'Configure the settings for the Media Library',\n          })}\n        />\n        <Layouts.Content>\n          <Layouts.Root>\n            <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n              {/* AI features section when ai is available */}\n              {isAIAvailable && (\n                <Box background=\"neutral0\" padding={6} shadow=\"filterShadow\" hasRadius>\n                  <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n                    <Grid.Root gap={6}>\n                      <Grid.Item col={8} xs={12} direction=\"column\" alignItems=\"stretch\">\n                        <Flex gap={2}>\n                          <Box color=\"alternative700\">\n                            <Sparkle />\n                          </Box>\n                          <Typography variant=\"delta\" tag=\"h2\">\n                            {formatMessage({\n                              id: getTrad('settings.form.aiMetadata.label'),\n                              defaultMessage:\n                                'Generate AI captions and alt texts automatically on upload!',\n                            })}\n                          </Typography>\n                        </Flex>\n                        <Flex paddingTop={1}>\n                          <Typography variant=\"pi\" textColor=\"neutral600\">\n                            {formatMessage({\n                              id: getTrad('settings.form.aiMetadata.description'),\n                              defaultMessage:\n                                'Enable this feature to save time, optimize your SEO and increase accessibility by letting our AI generate captions and alternative texts for you.',\n                            })}\n                          </Typography>\n                        </Flex>\n                      </Grid.Item>\n                      <Grid.Item\n                        col={4}\n                        xs={12}\n                        direction=\"column\"\n                        alignItems=\"end\"\n                        justifyContent={'center'}\n                      >\n                        <Field.Root name=\"aiMetadata\" minWidth=\"200px\">\n                          <Toggle\n                            checked={modifiedData?.aiMetadata}\n                            offLabel={formatMessage({\n                              id: 'app.components.ToggleCheckbox.disabled-label',\n                              defaultMessage: 'Disabled',\n                            })}\n                            onLabel={formatMessage({\n                              id: 'app.components.ToggleCheckbox.enabled-label',\n                              defaultMessage: 'Enabled',\n                            })}\n                            onChange={(e) => {\n                              handleChange({\n                                target: { name: 'aiMetadata', value: e.target.checked },\n                              });\n                            }}\n                          />\n                        </Field.Root>\n                      </Grid.Item>\n                    </Grid.Root>\n                    {/* Retroactive metadata generation when aiMetadata is enabled */}\n                    {initialData?.aiMetadata &&\n                      !isLoadingImagesWithoutMetadataCount &&\n                      Boolean(imageCountResponse?.totalImages) && (\n                        <>\n                          <Divider marginTop={4} marginBottom={4} />\n                          <Flex justifyContent=\"space-between\" alignItems=\"center\" gap={2}>\n                            <Flex gap={2}>\n                              <BetaStatus size=\"XS\" />\n                              <Typography variant=\"pi\" textColor=\"neutral500\">\n                                {imagesWithoutMetadataCount === 0\n                                  ? formatMessage({\n                                      id: getTrad('settings.form.aiMetadata.allAssetsHaveMetadata'),\n                                      defaultMessage: 'All assets have caption and alt text',\n                                    })\n                                  : formatMessage(\n                                      {\n                                        id: getTrad(\n                                          'settings.form.aiMetadata.imagesWithoutMetadata'\n                                        ),\n                                        defaultMessage:\n                                          '{count, plural, one {# image lacks captions or alternative text} other {# images lack captions or alternative text}}',\n                                      },\n                                      { count: imagesWithoutMetadataCount }\n                                    )}\n                              </Typography>\n                            </Flex>\n                            <MetadataAction\n                              job={aiMetadataJob ?? null}\n                              imagesWithoutMetadataCount={imagesWithoutMetadataCount}\n                              isConfirmDialogOpen={isConfirmDialogOpen}\n                              onConfirmDialogChange={setIsConfirmDialogOpen}\n                              onGenerate={async () => {\n                                await startGenerateAIMetadata();\n                                trackUsage('didGenerateMetadataRetroactively');\n                              }}\n                            />\n                          </Flex>\n                        </>\n                      )}\n                  </Flex>\n                </Box>\n              )}\n\n              <Box background=\"neutral0\" padding={6} shadow=\"filterShadow\" hasRadius>\n                <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n                  <Flex>\n                    <Typography variant=\"delta\" tag=\"h2\">\n                      {formatMessage({\n                        id: getTrad('settings.blockTitle'),\n                        defaultMessage: 'Asset management',\n                      })}\n                    </Typography>\n                  </Flex>\n                  <Grid.Root gap={6}>\n                    <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n                      <Field.Root\n                        hint={formatMessage({\n                          id: getTrad('settings.form.responsiveDimensions.description'),\n                          defaultMessage:\n                            'Enabling this option will generate multiple formats (small, medium and large) of the uploaded asset.',\n                        })}\n                        name=\"responsiveDimensions\"\n                      >\n                        <Field.Label>\n                          {formatMessage({\n                            id: getTrad('settings.form.responsiveDimensions.label'),\n                            defaultMessage: 'Responsive friendly upload',\n                          })}\n                        </Field.Label>\n                        <Toggle\n                          checked={modifiedData?.responsiveDimensions}\n                          offLabel={formatMessage({\n                            id: 'app.components.ToggleCheckbox.off-label',\n                            defaultMessage: 'Off',\n                          })}\n                          onLabel={formatMessage({\n                            id: 'app.components.ToggleCheckbox.on-label',\n                            defaultMessage: 'On',\n                          })}\n                          onChange={(e) => {\n                            handleChange({\n                              target: { name: 'responsiveDimensions', value: e.target.checked },\n                            });\n                          }}\n                        />\n                        <Field.Hint />\n                      </Field.Root>\n                    </Grid.Item>\n                    <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n                      <Field.Root\n                        hint={formatMessage({\n                          id: getTrad('settings.form.sizeOptimization.description'),\n                          defaultMessage:\n                            'Enabling this option will reduce the image size and slightly reduce its quality.',\n                        })}\n                        name=\"sizeOptimization\"\n                      >\n                        <Field.Label>\n                          {formatMessage({\n                            id: getTrad('settings.form.sizeOptimization.label'),\n                            defaultMessage: 'Size optimization',\n                          })}\n                        </Field.Label>\n                        <Toggle\n                          checked={modifiedData?.sizeOptimization}\n                          offLabel={formatMessage({\n                            id: 'app.components.ToggleCheckbox.off-label',\n                            defaultMessage: 'Off',\n                          })}\n                          onLabel={formatMessage({\n                            id: 'app.components.ToggleCheckbox.on-label',\n                            defaultMessage: 'On',\n                          })}\n                          onChange={(e) => {\n                            handleChange({\n                              target: { name: 'sizeOptimization', value: e.target.checked },\n                            });\n                          }}\n                        />\n                        <Field.Hint />\n                      </Field.Root>\n                    </Grid.Item>\n                    <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n                      <Field.Root\n                        hint={formatMessage({\n                          id: getTrad('settings.form.autoOrientation.description'),\n                          defaultMessage:\n                            'Enabling this option will automatically rotate the image according to EXIF orientation tag.',\n                        })}\n                        name=\"autoOrientation\"\n                      >\n                        <Field.Label>\n                          {formatMessage({\n                            id: getTrad('settings.form.autoOrientation.label'),\n                            defaultMessage: 'Auto orientation',\n                          })}\n                        </Field.Label>\n                        <Toggle\n                          checked={modifiedData?.autoOrientation}\n                          offLabel={formatMessage({\n                            id: 'app.components.ToggleCheckbox.off-label',\n                            defaultMessage: 'Off',\n                          })}\n                          onLabel={formatMessage({\n                            id: 'app.components.ToggleCheckbox.on-label',\n                            defaultMessage: 'On',\n                          })}\n                          onChange={(e) => {\n                            handleChange({\n                              target: { name: 'autoOrientation', value: e.target.checked },\n                            });\n                          }}\n                        />\n                        <Field.Hint />\n                      </Field.Root>\n                    </Grid.Item>\n                  </Grid.Root>\n                </Flex>\n              </Box>\n            </Flex>\n          </Layouts.Root>\n        </Layouts.Content>\n      </form>\n    </Page.Main>\n  );\n};\n\nexport const ProtectedSettingsPage = () => (\n  <Page.Protect permissions={PERMISSIONS.settings}>\n    <SettingsPage />\n  </Page.Protect>\n);\n"],"names":["BetaStatus","props","formatMessage","useIntl","_jsx","Status","size","variant","style","textTransform","display","Typography","tag","fontWeight","id","defaultMessage","MetadataAction","job","imagesWithoutMetadataCount","isConfirmDialogOpen","onConfirmDialogChange","onGenerate","status","Flex","gap","alignItems","textColor","getTrad","_jsxs","Check","width","height","Dialog","Root","open","onOpenChange","Trigger","TextButton","disabled","ConfirmDialog","onConfirm","title","count","SettingsPage","toggleNotification","useNotification","put","post","get","useFetchClient","setIsConfirmDialogOpen","React","useState","trackUsage","useTracking","initialData","modifiedData","dispatch","useReducer","reducer","initialState","init","data","isLoading","refetch","useSettings","isAIAvailable","useAIAvailability","imageCountResponse","isLoadingImagesWithoutMetadataCount","useQuery","enabled","aiMetadata","retry","useEffect","type","isSaveButtonDisabled","isEqual","mutateAsync","isSubmitting","useMutation","body","onSuccess","message","onError","err","aiMetadataJob","refetchAiMetadataJob","useAIMetadataJob","startGenerateAIMetadata","handleSubmit","e","preventDefault","handleChange","target","name","value","keys","Page","Loading","Main","tabIndex","Title","form","onSubmit","Layouts","Header","primaryAction","Button","loading","startIcon","fullWidth","subtitle","Content","direction","Box","background","padding","shadow","hasRadius","Grid","Item","col","xs","color","Sparkle","paddingTop","justifyContent","Field","minWidth","Toggle","checked","offLabel","onLabel","onChange","Boolean","totalImages","_Fragment","Divider","marginTop","marginBottom","hint","Label","responsiveDimensions","Hint","sizeOptimization","autoOrientation","ProtectedSettingsPage","Protect","permissions","PERMISSIONS","settings"],"mappings":"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"}