import type { IPostItem } from 'src/types/blog'; import { z as zod } from 'zod'; import { useCallback } from 'react'; import { useForm } from 'react-hook-form'; import { useBoolean } from 'minimal-shared/hooks'; import { zodResolver } from '@hookform/resolvers/zod'; import Box from '@mui/material/Box'; import Chip from '@mui/material/Chip'; import Card from '@mui/material/Card'; import Stack from '@mui/material/Stack'; import Button from '@mui/material/Button'; import Switch from '@mui/material/Switch'; import Divider from '@mui/material/Divider'; import Collapse from '@mui/material/Collapse'; import IconButton from '@mui/material/IconButton'; import CardHeader from '@mui/material/CardHeader'; import Typography from '@mui/material/Typography'; import FormControlLabel from '@mui/material/FormControlLabel'; import { paths } from 'src/routes/paths'; import { useRouter } from 'src/routes/hooks'; import { _tags } from 'src/_mock'; import { toast } from 'src/components/snackbar'; import { Iconify } from 'src/components/iconify'; import { Form, Field, schemaHelper } from 'src/components/hook-form'; import { PostDetailsPreview } from './post-details-preview'; // ---------------------------------------------------------------------- export type NewPostSchemaType = zod.infer; export const NewPostSchema = zod.object({ title: zod.string().min(1, { message: 'Title is required!' }), description: zod.string().min(1, { message: 'Description is required!' }), content: schemaHelper .editor() .min(100, { message: 'Content must be at least 100 characters' }) .max(500, { message: 'Content must be less than 500 characters' }), coverUrl: schemaHelper.file({ message: 'Cover is required!' }), tags: zod.string().array().min(2, { message: 'Must have at least 2 items!' }), metaKeywords: zod.string().array().min(1, { message: 'Meta keywords is required!' }), // Not required metaTitle: zod.string(), metaDescription: zod.string(), }); // ---------------------------------------------------------------------- type Props = { currentPost?: IPostItem; }; export function PostNewEditForm({ currentPost }: Props) { const router = useRouter(); const showPreview = useBoolean(); const openDetails = useBoolean(true); const openProperties = useBoolean(true); const defaultValues: NewPostSchemaType = { title: '', description: '', content: '', coverUrl: null, tags: [], metaKeywords: [], metaTitle: '', metaDescription: '', }; const methods = useForm({ mode: 'all', resolver: zodResolver(NewPostSchema), defaultValues, values: currentPost, }); const { reset, watch, setValue, handleSubmit, formState: { isSubmitting, isValid }, } = methods; const values = watch(); const onSubmit = handleSubmit(async (data) => { try { await new Promise((resolve) => setTimeout(resolve, 500)); reset(); showPreview.onFalse(); toast.success(currentPost ? 'Update success!' : 'Create success!'); router.push(paths.dashboard.post.root); console.info('DATA', data); } catch (error) { console.error(error); } }); const handleRemoveFile = useCallback(() => { setValue('coverUrl', null); }, [setValue]); const renderCollapseButton = (value: boolean, onToggle: () => void) => ( ); const renderDetails = () => ( Content Cover ); const renderProperties = () => ( option)} getOptionLabel={(option) => option} renderOption={(props, option) => (
  • {option}
  • )} renderTags={(selected, getTagProps) => selected.map((option, index) => ( )) } /> option)} getOptionLabel={(option) => option} renderOption={(props, option) => (
  • {option}
  • )} renderTags={(selected, getTagProps) => selected.map((option, index) => ( )) } /> } />
    ); const renderActions = () => ( } sx={{ pl: 3, flexGrow: 1 }} />
    ); return (
    {renderDetails()} {renderProperties()} {renderActions()} ); }