import {SlugEditor, SlugEditorProps} from '@common/ui/slug-editor'; import {useController, useFormContext} from 'react-hook-form'; import React, {Fragment, ReactNode, useEffect, useRef} from 'react'; import clsx from 'clsx'; import {useStickySentinel} from '@common/utils/hooks/sticky-sentinel'; import {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query'; import {Button} from '@common/ui/buttons/button'; import {Link} from 'react-router-dom'; import {ArrowBackIcon} from '@common/icons/material/ArrowBack'; import {Trans} from '@common/i18n/trans'; import {HistoryButtons} from '@common/text-editor/menubar/history-buttons'; import {ModeButton} from '@common/text-editor/menubar/mode-button'; import {ArticleBodyEditorMenubar} from './article-body-editor-menubar'; import {Editor} from '@tiptap/react'; import {CreateCustomPagePayload} from '@common/admin/custom-pages/requests/use-create-custom-page'; interface StickyHeaderProps { editor: Editor; allowSlugEditing?: boolean; onSave?: (editorContent: string) => void; saveButton?: ReactNode; backLink: string; isLoading?: boolean; } export function ArticleEditorStickyHeader({ editor, allowSlugEditing = true, onSave, saveButton, isLoading = false, backLink, }: StickyHeaderProps) { const {isSticky, sentinelRef} = useStickySentinel(); const isMobile = useIsMobileMediaQuery(); return ( {!isMobile && ( } > {allowSlugEditing && ( )} )} {editor && } {!isMobile && } {onSave && ( { onSave(editor.getHTML()); }} isLoading={isLoading} /> )} {saveButton} ); } interface SaveButtonProps { onSave: () => void; isLoading: boolean; } function SaveButton({onSave, isLoading}: SaveButtonProps) { const form = useFormContext(); const title = form.watch('title'); return ( onSave()} > ); } interface FormSlugEditorProps extends SlugEditorProps { name: string; } function FormSlugEditor({name, ...other}: FormSlugEditorProps) { const { field: {onChange, onBlur, value = '', ref}, } = useController({ name, }); const manuallyChanged = useRef(false); const {watch, setValue} = useFormContext(); useEffect(() => { const subscription = watch((formVal, {name: fieldName}) => { // if user has not changed slug manually, set it based on page title field changes if (fieldName === 'title' && !manuallyChanged.current) { setValue('slug', formVal.title); } }); return () => subscription.unsubscribe(); }, [watch, setValue]); return ( { manuallyChanged.current = true; onChange(e); }} onInputBlur={onBlur} value={value} inputRef={ref} {...other} /> ); }