From 56f26c552ef055dfc956a6ecf949a17d704c196d Mon Sep 17 00:00:00 2001 From: Leonardo Negreiros de Oliveira Date: Fri, 5 Jan 2024 12:20:34 -0300 Subject: [PATCH 01/13] Move form save on ctr+s to useForm hook Since this is a common behaviour to all forms it is being moved to the general hook to make it DRYer --- .../src/app/tasks/hooks/useEditTaskForm.ts | 19 ++---------------- frontend/src/hooks/useForm/useForm.ts | 20 +++++++++++++++++-- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/frontend/src/app/tasks/hooks/useEditTaskForm.ts b/frontend/src/app/tasks/hooks/useEditTaskForm.ts index da6f9ef6a..159773281 100644 --- a/frontend/src/app/tasks/hooks/useEditTaskForm.ts +++ b/frontend/src/app/tasks/hooks/useEditTaskForm.ts @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useRef } from 'react' +import { useCallback } from 'react' import { useAlert } from '@/ui/Alert/useAlert' import { useForm } from '@/hooks/useForm/useForm' @@ -12,10 +12,9 @@ type UseEditTaskFormProps = { } export const useEditTaskForm = ({ task, tasks, closeForm }: UseEditTaskFormProps) => { - const { formState, handleChange, resetForm } = useForm({ + const { formState, handleChange, resetForm, formRef } = useForm({ initialValues: task }) - const formRef = useRef(null) const { showError } = useAlert() const { editTask } = useEditTask({ handleSuccess: closeForm }) @@ -44,19 +43,5 @@ export const useEditTaskForm = ({ task, tasks, closeForm }: UseEditTaskFormProps editTask(formState) }, [editTask, formState, showError, tasks]) - useEffect(() => { - const handleKeyPress = (event: KeyboardEvent) => { - if (event.key === 's' && event.ctrlKey && formRef.current?.contains(document.activeElement)) { - event.preventDefault() - formRef.current?.requestSubmit() - } - } - document.addEventListener('keydown', handleKeyPress) - - return () => { - document.removeEventListener('keydown', handleKeyPress) - } - }, [handleSubmit]) - return { formState, handleChange, handleSubmit, resetForm, formRef } } diff --git a/frontend/src/hooks/useForm/useForm.ts b/frontend/src/hooks/useForm/useForm.ts index a6aa63bf3..eb5e56222 100644 --- a/frontend/src/hooks/useForm/useForm.ts +++ b/frontend/src/hooks/useForm/useForm.ts @@ -1,4 +1,4 @@ -import { useCallback, useState } from 'react' +import { useCallback, useState, useRef, useEffect } from 'react' type UseFormProps = { initialValues: T @@ -13,5 +13,21 @@ export const useForm = ({ initialValues }: UseFormProps) => { const resetForm = useCallback(() => setFormState(initialValues), [initialValues]) - return { handleChange, formState, resetForm, setFormState } + const formRef = useRef(null) + + useEffect(() => { + const handleKeyPress = (event: KeyboardEvent) => { + if (event.key === 's' && event.ctrlKey && formRef.current?.contains(document.activeElement)) { + event.preventDefault() + formRef.current?.requestSubmit() + } + } + document.addEventListener('keydown', handleKeyPress) + + return () => { + document.removeEventListener('keydown', handleKeyPress) + } + }, []) + + return { handleChange, formState, resetForm, setFormState, formRef } } From 6c6284aa92279499ed9a6509b7ee56ef26b73460 Mon Sep 17 00:00:00 2001 From: Leonardo Negreiros de Oliveira Date: Fri, 5 Jan 2024 12:22:10 -0300 Subject: [PATCH 02/13] Move createTaskForm hook to a context Since we need the form logic in different places of the page, a provider will be use to avoid prop drilling and sending the required parts of the form logic to where it is needed --- .../src/app/tasks/hooks/useCreateTaskForm.ts | 137 +----------------- .../providers/CreateTaskFormProvider.tsx | 115 +++++++++++++++ 2 files changed, 119 insertions(+), 133 deletions(-) create mode 100644 frontend/src/app/tasks/providers/CreateTaskFormProvider.tsx diff --git a/frontend/src/app/tasks/hooks/useCreateTaskForm.ts b/frontend/src/app/tasks/hooks/useCreateTaskForm.ts index cad9f9889..c70c18ceb 100644 --- a/frontend/src/app/tasks/hooks/useCreateTaskForm.ts +++ b/frontend/src/app/tasks/hooks/useCreateTaskForm.ts @@ -1,135 +1,6 @@ -import { format } from 'date-fns' -import { useEffect, useRef, useCallback, useState } from 'react' +import { useContext } from 'react' +import { CreateTaskFormContext } from '../providers/CreateTaskFormProvider' -import { useForm } from '@/hooks/useForm/useForm' -import { useTimer } from '@/hooks/useTimer/useTimer' -import { useGetCurrentUser } from '@/hooks/useGetCurrentUser/useGetCurrentUser' - -import { useGetTasks } from './useGetTasks' -import { useCreateTask } from './useCreateTask' - -import { useAlert } from '@/ui/Alert/useAlert' -import { Template } from '@/domain/Template' - -import { TaskIntent, getOverlappingTasks } from '@/domain/Task' -import { convertTimeToMinutes, getTimeDifference } from '../utils/time' - -export const useTaskForm = () => { - const formRef = useRef(null) - const { id: userId } = useGetCurrentUser() - const { addTask } = useCreateTask() - const { showError } = useAlert() - const { tasks } = useGetTasks() - const [template, setTemplate] = useState