import * as Yup from 'yup'; import { useFormik } from 'formik'; import { Navigate, useNavigate, 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, Modal, } from '../../components'; import { Wrapper } from './styles'; import { ArrowLeft, Empty, General } from '../../assets'; import { CategoryOutput, DeleteCategoryMutation, DeleteCategoryMutationVariables, GetCategoryByIdQuery, GetCategoryByIdQueryVariables, UpdateCategoryMutation, UpdateCategoryMutationVariables, } from '../../graphql/types'; import { DELETE_CATEGORY, GET_CATEGORY_BY_ID, UPDATE_CATEGORY, } from '../../graphql/category.api'; const CategorySettings = () => { const navigate = useNavigate(); const { id } = useParams<{ id: string }>(); const role = useReactiveVar(roleVar); const [error, setError] = useState(''); const [success, setSuccess] = useState(false); const [category, setCategory] = useState(); const [deleteCategoryModal, setDeleteCategoryModal] = useState(false); const [getCategory, { loading: categoryLoading, error: categoryError }] = useLazyQuery< GetCategoryByIdQuery, GetCategoryByIdQueryVariables >(GET_CATEGORY_BY_ID, { onCompleted({ getCategoryById }) { setCategory(getCategoryById); } }); const [updateCategory, { loading }] = useMutation< UpdateCategoryMutation, UpdateCategoryMutationVariables >(UPDATE_CATEGORY, { onCompleted({ updateCategory: data }) { setCategory(data); setSuccess(true); setTimeout(() => setSuccess(false), 3000); }, onError({ graphQLErrors }) { setError(graphQLErrors[0]?.extensions?.info as string); setTimeout(() => setError(''), 3000); }, }); const [deleteCategory] = useMutation< DeleteCategoryMutation, DeleteCategoryMutationVariables >(DELETE_CATEGORY, { onCompleted() { navigate('/category'); }, onError({ graphQLErrors }) { setError(graphQLErrors[0]?.extensions?.info as string); setTimeout(() => setError(''), 3000); }, }); useEffect(() => { getCategory({ variables: { id: id as string } }); }, [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: id as string, category: { name, description, image: { name: imageName, src: imageSource }, }, }, }); }, enableReinitialize: true, }); if (role !== 'developer') return ( <> {role === 'admin' && } {['client', 'productOwer'].includes(role as string) && } ) if (categoryLoading) return ( ); if (categoryError || !category) return ( ); return ( {deleteCategoryModal && ( setDeleteCategoryModal(false)} onConfirm={() => deleteCategory({ variables: { id: id as string } })} > )}