import {Fragment, useRef} from 'react'; import {Trans} from '@common/i18n/trans'; import {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger'; import {AppearanceButton} from '@common/admin/appearance/appearance-button'; import {AceDialog} from '@common/ace-editor/ace-dialog'; import mergedAppearanceConfig from '@common/admin/appearance/config/merged-appearance-config'; import {SeoSettingsSectionConfig} from '@common/admin/appearance/types/appearance-editor-config'; import {MessageDescriptor} from '@common/i18n/message-descriptor'; import {useSeoTags} from '@common/admin/appearance/sections/seo/use-seo-tags'; import {useUpdateSeoTags} from '@common/admin/appearance/sections/seo/use-update-seo-tags'; import {useDialogContext} from '@common/ui/overlays/dialog/dialog-context'; import {FullPageLoader} from '@common/ui/progress/full-page-loader'; import {Button} from '@common/ui/buttons/button'; import type ReactAce from 'react-ace'; const pages = ( mergedAppearanceConfig.sections['seo-settings'] .config as SeoSettingsSectionConfig )?.pages || []; const names = pages.map(page => page.key); export function SeoSection() { const {isLoading} = useSeoTags(names); if (isLoading) { return ; } return ( {pages.map(page => ( ))} ); } interface TagEditorTriggerProps { label: MessageDescriptor; name: string; } function TagEditorTrigger({label, name}: TagEditorTriggerProps) { const {data, isLoading} = useSeoTags(names); return ( {data ? : null} ); } interface TagsEditorDialogProps { name: string; value: {custom: string | null; original: string}; } function TagsEditorDialog({name, value}: TagsEditorDialogProps) { const {close} = useDialogContext(); const updateTags = useUpdateSeoTags(name); const editorRef = useRef(null); const resetButton = ( ); return ( } footerStartAction={resetButton} editorRef={editorRef} defaultValue={value.custom || value.original} isSaving={updateTags.isPending} beautify={false} onSave={newValue => { if (newValue != null) { updateTags.mutate( {tags: newValue}, { onSuccess: () => close(), }, ); } }} /> ); }