import { Box, ConfirmModal, Flex, HStack, Input, MetaButton, MetaTag, Select, Text, Textarea, VStack, } from '@metafam/ds'; import { GuildFragmentFragment, QuestFragmentFragment, QuestRepetition_Enum, QuestStatus_Enum, } from 'graphql/autogen/types'; import { useRouter } from 'next/router'; import React, { useMemo, useState } from 'react'; import { Controller, FieldError, useForm } from 'react-hook-form'; import { QuestRepetitionHint, UriRegexp } from '../../utils/questHelpers'; import { CategoryOption, SkillOption } from '../../utils/skillHelpers'; import { FlexContainer } from '../Container'; import { SkillsSelect } from '../Skills'; import { RepetitionColors } from './QuestTags'; const validations = { title: { required: true, minLength: 4, maxLength: 50, }, description: { required: true, minLength: 4, }, repetition: { required: true, }, guild_id: { required: true, }, external_link: { pattern: UriRegexp, }, cooldown: { valueAsNumber: true, min: 1, }, }; export interface CreateQuestFormInputs { title: string; description: string | undefined | null; repetition: QuestRepetition_Enum; status: QuestStatus_Enum; guild_id: string | null; external_link: string | undefined | null; cooldown: number | undefined | null; skills: SkillOption[]; } const MetaFamGuildId = 'f94b7cd4-cf29-4251-baa5-eaacab98a719'; const getDefaultFormValues = ( editQuest: QuestFragmentFragment | undefined, guilds: GuildFragmentFragment[], ): CreateQuestFormInputs => ({ title: editQuest?.title || '', repetition: editQuest?.repetition || QuestRepetition_Enum.Unique, description: editQuest?.description || '', external_link: editQuest?.external_link || '', guild_id: editQuest?.guild_id || guilds.find((g) => g.id === MetaFamGuildId)?.id || guilds[0].id, status: editQuest?.status || QuestStatus_Enum.Open, cooldown: editQuest?.cooldown || null, skills: editQuest ? editQuest.quest_skills .map((s) => s.skill) .map((s) => ({ value: s.id, label: s.name, ...s, })) : [], }); type FieldProps = { children: React.ReactNode; label: string; error?: FieldError; }; const Field: React.FC = ({ children, error, label }) => ( {label} {error?.type === 'required' && 'Required'} {error?.type === 'pattern' && 'Invalid URL'} {error?.type === 'minLength' && 'Too short'} {error?.type === 'maxLength' && 'Too long'} {error?.type === 'min' && 'Too small'} {children} ); type Props = { guilds: GuildFragmentFragment[]; editQuest?: QuestFragmentFragment; skillChoices: Array; onSubmit: (data: CreateQuestFormInputs) => void; success?: boolean; fetching?: boolean; submitLabel: string; loadingLabel: string; }; export const QuestForm: React.FC = ({ guilds, skillChoices, onSubmit, success, fetching, submitLabel, loadingLabel, editQuest, }) => { const defaultValues = useMemo( () => getDefaultFormValues(editQuest, guilds), [editQuest, guilds], ); const { register, control, errors, watch, handleSubmit, } = useForm({ defaultValues, }); const router = useRouter(); const [exitAlert, setExitAlert] = useState(false); const createQuestInput = watch(); return (