From 06d70bbd705b9b0d2676c5dec43d6e98d67f55c7 Mon Sep 17 00:00:00 2001 From: Pijus Kamandulis Date: Mon, 14 Oct 2024 21:06:15 +0300 Subject: [PATCH] Added YUP validation on forms --- bun.lockb | Bin 199730 -> 201931 bytes package.json | 4 +- src/components/Button.tsx | 15 +- src/components/Input.tsx | 9 + .../forms/CreateEstimationSessionForm.tsx | 26 ++- src/pages/Estimation/Estimation.tsx | 14 +- .../Estimation/components/EditTicketForm.tsx | 35 ++-- .../Estimation/components/PlayerList.tsx | 4 +- src/pages/Home.css | 27 --- src/pages/Home.tsx | 9 +- src/pages/Login.tsx | 188 ++++++++++-------- src/pages/Profile.tsx | 42 ++-- 12 files changed, 206 insertions(+), 167 deletions(-) delete mode 100644 src/pages/Home.css diff --git a/bun.lockb b/bun.lockb index 31f7911fe224c701d3f51f63de51e8f946d5a68e..e26707900577dd7ec71f0b07aabf7c8b4b624ce7 100755 GIT binary patch delta 40662 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 wHB$EDt|MeC{&0j`nVW~pm3J;kk(Ww5aHQkW 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 TSh^l4N9XD_w=T`pBiH;NiQq&4 diff --git a/package.json b/package.json index f943043..61b48a7 100644 --- a/package.json +++ b/package.json @@ -13,10 +13,12 @@ "@ckeditor/ckeditor5-react": "^9.3.0", "@tanstack/react-form": "^0.33.0", "@tanstack/react-router": "^1.62.0", + "@tanstack/yup-form-adapter": "^0.33.0", "appwrite": "^16.0.2", "classnames": "^2.5.1", "react": "^18.3.1", - "react-dom": "^18.3.1" + "react-dom": "^18.3.1", + "yup": "^1.4.0" }, "devDependencies": { "@eslint/js": "^9.11.1", diff --git a/src/components/Button.tsx b/src/components/Button.tsx index 0d3b5a9..3574d56 100644 --- a/src/components/Button.tsx +++ b/src/components/Button.tsx @@ -16,25 +16,28 @@ const Button: React.FC = ({ children, color = ButtonColor.Primary, fullWidth = false, + disabled = false, ...props }) => { const buttonClass = classNames( - 'flex justify-center rounded-md px-3 py-1.5 text-sm font-semibold leading-6 text-white shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2', + 'flex justify-center rounded-md px-3 py-1.5 text-sm font-semibold leading-6 shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2', { 'bg-indigo-600 hover:bg-indigo-500 focus-visible:outline-indigo-600': - color === ButtonColor.Primary, + color === ButtonColor.Primary && !disabled, 'bg-gray-600 hover:bg-gray-500 focus-visible:outline-gray-600': - color === ButtonColor.Secondary, + color === ButtonColor.Secondary && !disabled, 'bg-red-600 hover:bg-red-500 focus-visible:outline-red-600': - color === ButtonColor.Error, + color === ButtonColor.Error && !disabled, 'bg-green-600 hover:bg-green-500 focus-visible:outline-green-600': - color === ButtonColor.Success, + color === ButtonColor.Success && !disabled, + 'bg-gray-300 text-gray-500 cursor-not-allowed dark:bg-nero-600': disabled, + 'text-white': !disabled, 'w-full': fullWidth, }, ); return ( - ); diff --git a/src/components/Input.tsx b/src/components/Input.tsx index d7a30db..f4e7ee2 100644 --- a/src/components/Input.tsx +++ b/src/components/Input.tsx @@ -1,11 +1,15 @@ +import { ValidationError } from '@tanstack/react-form'; + const Input = ({ label, + errors, ...props }: React.DetailedHTMLProps< React.InputHTMLAttributes, HTMLInputElement > & { label?: string; + errors?: ValidationError[]; }) => { return (
@@ -18,6 +22,11 @@ const Input = ({ {...props} />
+ {errors?.map((error, key) => ( + + {error} + + ))} ); }; diff --git a/src/components/forms/CreateEstimationSessionForm.tsx b/src/components/forms/CreateEstimationSessionForm.tsx index 5ebc6fe..c6857c5 100644 --- a/src/components/forms/CreateEstimationSessionForm.tsx +++ b/src/components/forms/CreateEstimationSessionForm.tsx @@ -2,6 +2,8 @@ import { useForm } from '@tanstack/react-form'; import { useEstimationsList } from '../../lib/context/estimationsList'; import Input from '../Input'; import Button from '../Button'; +import { yupValidator } from '@tanstack/yup-form-adapter'; +import * as yup from 'yup'; interface CreateEstimationSessionFormProps { onCreated: () => void; @@ -21,6 +23,12 @@ const CreateEstimationSessionForm: React.FC< }); onCreated(); }, + validators: { + onChange: yup.object({ + name: yup.string().label('Name').max(200).required(), + }), + }, + validatorAdapter: yupValidator(), }); return ( @@ -36,21 +44,25 @@ const CreateEstimationSessionForm: React.FC< form.handleSubmit(); }} > - ( + + {(field) => ( field.handleChange(e.target.value)} + errors={field.state.meta.errors} /> )} - /> - + + [state.canSubmit]}> + {([canSubmit]) => ( + + )} + ); diff --git a/src/pages/Estimation/Estimation.tsx b/src/pages/Estimation/Estimation.tsx index b89c891..4f56c1c 100644 --- a/src/pages/Estimation/Estimation.tsx +++ b/src/pages/Estimation/Estimation.tsx @@ -16,7 +16,7 @@ const route = getRouteApi('/_authenticated/estimate/session/$sessionId'); const Estimation: React.FC = () => { const { sessionId } = route.useParams(); const estimationState = useEstimationContext(); - const [isDrawerOpen, setDrawerOpen] = useState(false); + const [isDrawerOpen, setIsDrawerOpen] = useState(false); const [editingTicketId, setEditingTicketId] = useState(''); useEffect(() => estimationState?.setSessionId(sessionId), [sessionId]); @@ -32,10 +32,10 @@ const Estimation: React.FC = () => { createTicket, updateTicket, currentSessionData: { - tickets: tickets, + tickets, sessionState: { votesRevealed: revealed, - votes: votes, + votes, currentPlayerVote, currentTicket, }, @@ -49,10 +49,10 @@ const Estimation: React.FC = () => { className="w-64 overflow-y-scroll bg-gray-50 p-4 dark:bg-nero-800" tickets={tickets} onSelectTicket={(ticket) => setActiveTicket(ticket.id)} - onAddTicket={() => setDrawerOpen(true)} + onAddTicket={() => setIsDrawerOpen(true)} onEditTicket={(ticketId) => { setEditingTicketId(ticketId); - setDrawerOpen(true); + setIsDrawerOpen(true); }} /> @@ -95,7 +95,7 @@ const Estimation: React.FC = () => { { - setDrawerOpen(false); + setIsDrawerOpen(false); setEditingTicketId(''); }} > @@ -110,7 +110,7 @@ const Estimation: React.FC = () => { } else { await createTicket(ticket); } - setDrawerOpen(false); + setIsDrawerOpen(false); }} /> diff --git a/src/pages/Estimation/components/EditTicketForm.tsx b/src/pages/Estimation/components/EditTicketForm.tsx index adf7b8b..153b96d 100644 --- a/src/pages/Estimation/components/EditTicketForm.tsx +++ b/src/pages/Estimation/components/EditTicketForm.tsx @@ -1,6 +1,8 @@ import { useForm } from '@tanstack/react-form'; import { Button, Input } from '../../../components'; import RichEditor from '../../../components/RichEditor'; +import { yupValidator } from '@tanstack/yup-form-adapter'; +import * as yup from 'yup'; interface EditTicketFormData { name: string; @@ -16,7 +18,7 @@ const EditTicketForm: React.FC = ({ initialData, onSave, }) => { - const form = useForm({ + const form = useForm({ defaultValues: initialData ?? { name: '', content: '', @@ -24,6 +26,12 @@ const EditTicketForm: React.FC = ({ onSubmit: async ({ value }) => { await onSave(value); }, + validators: { + onChange: yup.object({ + name: yup.string().label('Name').max(200).required(), + }), + }, + validatorAdapter: yupValidator(), }); return ( @@ -37,9 +45,8 @@ const EditTicketForm: React.FC = ({ form.handleSubmit(); }} > - ( + + {(field) => ( = ({ value={field.state.value} onBlur={field.handleBlur} onChange={(e) => field.handleChange(e.target.value)} + errors={field.state.meta.errors} /> )} - /> - ( + + + {(field) => ( field.handleChange(value)} /> )} - /> - + + [state.canSubmit]}> + {([canSubmit]) => ( + + )} + ); diff --git a/src/pages/Estimation/components/PlayerList.tsx b/src/pages/Estimation/components/PlayerList.tsx index 79dc6f4..a95698d 100644 --- a/src/pages/Estimation/components/PlayerList.tsx +++ b/src/pages/Estimation/components/PlayerList.tsx @@ -21,9 +21,9 @@ const PlayerList: React.FC = ({
    {players.length > 0 ? ( - players.map((player, index) => ( + players.map((player) => (
  • {player.name} diff --git a/src/pages/Home.css b/src/pages/Home.css deleted file mode 100644 index 1d6fa2b..0000000 --- a/src/pages/Home.css +++ /dev/null @@ -1,27 +0,0 @@ -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx index 0d64590..4dcf6ae 100644 --- a/src/pages/Home.tsx +++ b/src/pages/Home.tsx @@ -1,4 +1,3 @@ -import './Home.css'; import { getRouteApi, Link } from '@tanstack/react-router'; import { useUser } from '../lib/context/user'; import { useEstimationsList } from '../lib/context/estimationsList'; @@ -16,7 +15,7 @@ function Home() { const user = useUser(); const navigate = route.useNavigate(); const estimationsList = useEstimationsList(); - const [isDrawerOpen, setDrawerOpen] = useState(false); + const [isDrawerOpen, setIsDrawerOpen] = useState(false); return ( <> @@ -47,12 +46,12 @@ function Home() { }} /> )} - onAddItem={() => setDrawerOpen(true)} + onAddItem={() => setIsDrawerOpen(true)} /> - setDrawerOpen(false)}> - setDrawerOpen(false)} /> + setIsDrawerOpen(false)}> + setIsDrawerOpen(false)} /> ); diff --git a/src/pages/Login.tsx b/src/pages/Login.tsx index d43987d..f7deafd 100644 --- a/src/pages/Login.tsx +++ b/src/pages/Login.tsx @@ -1,6 +1,8 @@ import { useForm } from '@tanstack/react-form'; import { useUser } from '../lib/context/user'; import { Button, ButtonColor, Input } from '../components'; +import { yupValidator } from '@tanstack/yup-form-adapter'; +import * as yup from 'yup'; const Login = () => { const user = useUser(); @@ -12,96 +14,110 @@ const Login = () => { onSubmit: async ({ value }) => { console.log({ value }); }, + validators: { + onChange: yup.object({ + email: yup.string().label('Email').email().required(), + password: yup.string().label('Password').min(8).max(256).required(), + }), + }, + validatorAdapter: yupValidator(), }); return ( - <> -
    -
    -

    - Sign in to your account -

    -
    - -
    -
    - ( - field.handleChange(e.target.value)} - /> - )} - /> - - ( - field.handleChange(e.target.value)} - /> - )} - /> - -
    -
    - - - -
    -
    - - -

    - Don't want to create an account?{' '} - user.loginAsGuest()} - > - Sign in as a guest - -

    -
    +
    +
    +

    + Sign in to your account +

    - + +
    +
    + + {(field) => ( + field.handleChange(e.target.value)} + errors={field.state.meta.errors} + /> + )} + + + + {(field) => ( + field.handleChange(e.target.value)} + errors={field.state.meta.errors} + /> + )} + + + [state.canSubmit, state.isSubmitting]} + > + {([canSubmit, isSubmitting]) => ( +
    + {/* TODO: Add loader when submitting */} +
    + + + +
    +
    + )} +
    +
    + +

    + Don't want to create an account?{' '} + user.loginAsGuest()} + > + Sign in as a guest + +

    +
    +
    ); }; diff --git a/src/pages/Profile.tsx b/src/pages/Profile.tsx index 364c91a..9217bcc 100644 --- a/src/pages/Profile.tsx +++ b/src/pages/Profile.tsx @@ -1,6 +1,8 @@ import { useForm } from '@tanstack/react-form'; import { Button, Input } from '../components'; import { useUser } from '../lib/context/user'; +import { yupValidator } from '@tanstack/yup-form-adapter'; +import * as yup from 'yup'; const Profile = () => { const user = useUser(); @@ -12,6 +14,12 @@ const Profile = () => { await user.updateUsername(value.name); updateUsernameForm.reset(); }, + validators: { + onChange: yup.object({ + name: yup.string().label('Name').max(128).required(), + }), + }, + validatorAdapter: yupValidator(), }); return ( @@ -28,21 +36,27 @@ const Profile = () => { updateUsernameForm.handleSubmit(); }} > - ( - field.handleChange(e.target.value)} - /> + + {(field) => { + return ( + field.handleChange(e.target.value)} + errors={field.state.meta.errors} + /> + ); + }} + + [state.canSubmit]}> + {([canSubmit]) => ( + )} - /> - +