diff --git a/src/pages/CategorySettings/index.tsx b/src/pages/CategorySettings/index.tsx new file mode 100644 index 0000000..1301ea7 --- /dev/null +++ b/src/pages/CategorySettings/index.tsx @@ -0,0 +1,240 @@ +import * as Yup from 'yup'; +import { useFormik } from 'formik'; +import { Redirect, useHistory, useParams } from 'react-router'; +import { useLazyQuery, useMutation, useReactiveVar } from '@apollo/client'; +import React, { useEffect, useState } from 'react'; +import { roleVar } from '../../graphql/state'; +import { + Box, + Button, + Text, + SectionSelector, + Input, + Alert, + TextArea, + Spinner, +} from '../../components'; +import { Wrapper } from './styles'; +import { ArrowLeft, General } from '../../assets'; +import { + CategoryOutput, + GetCategoryByIdQuery, + GetCategoryByIdQueryVariables, + UpdateCategoryMutation, + UpdateCategoryMutationVariables, +} from '../../graphql/types'; +import { + GET_CATEGORY_BY_ID, + UPDATE_CATEGORY, +} from '../../graphql/category.api'; + +const CategorySettings = () => { + const history = useHistory(); + const { id } = useParams<{ id: string }>(); + const role = useReactiveVar(roleVar); + + const [error, setError] = useState(''); + const [success, setSuccess] = useState(false); + const [category, setCategory] = useState(); + + const [getCategory, { loading: categoryLoading }] = useLazyQuery< + GetCategoryByIdQuery, + GetCategoryByIdQueryVariables + >(GET_CATEGORY_BY_ID, { + onCompleted({ getCategoryById }) { + setCategory(getCategoryById); + }, + fetchPolicy: 'network-only', + }); + + const [updateCategory, { loading }] = useMutation< + UpdateCategoryMutation, + UpdateCategoryMutationVariables + >(UPDATE_CATEGORY, { + onCompleted({ updateCategory: data }) { + setCategory(data); + setSuccess(true); + }, + onError({ graphQLErrors }) { + setError(graphQLErrors[0]?.extensions?.info); + setTimeout(() => setError(''), 3000); + }, + }); + + useEffect(() => { + getCategory({ variables: { id } }); + + // eslint-disable-next-line + }, [id]); + + const form = useFormik({ + initialValues: { + name: category?.name || '', + description: category?.description || '', + imageName: category?.image.name || '', + imageSource: category?.image.src || '', + }, + validationSchema: Yup.object().shape({ + name: Yup.string().required('Name is required'), + description: Yup.string().required('Description is required'), + imageName: Yup.string().required('Image is required'), + imageSource: Yup.string().required('Image is required'), + }), + onSubmit: ({ name, description, imageName, imageSource }) => { + updateCategory({ + variables: { + id, + category: { + name, + description, + image: { name: imageName, src: imageSource }, + }, + }, + }); + }, + enableReinitialize: true, + }); + + return role === 'developer' ? ( + + +