diff --git a/src/pages/FeatureSettings/index.tsx b/src/pages/FeatureSettings/index.tsx new file mode 100644 index 0000000..45fc9ef --- /dev/null +++ b/src/pages/FeatureSettings/index.tsx @@ -0,0 +1,466 @@ +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, + Modal, + CheckBox, +} from '../../components'; +import { Wrapper } from './styles'; +import { ArrowLeft, Design, General } from '../../assets'; +import { + DeleteFeatureMutation, + DeleteFeatureMutationVariables, + FeatureOutput, + GetFeatureByIdQuery, + GetFeatureByIdQueryVariables, + UpdateFeatureMutation, + UpdateFeatureMutationVariables, +} from '../../graphql/types'; +import { + DELETE_FEATURE, + GET_FEATURE_BY_ID, + UPDATE_FEATURE, +} from '../../graphql/feature.api'; + +const FeatureSettings = () => { + const history = useHistory(); + const { id } = useParams<{ id: string }>(); + const role = useReactiveVar(roleVar); + + const [selectedSection, setSelectedSection] = useState< + 'general' | 'wireframes' + >('general'); + const [error, setError] = useState(''); + const [success, setSuccess] = useState(false); + const [feature, setFeature] = useState(); + + const [deleteFeatureModal, setDeleteFeatureModal] = useState(false); + + const [getFeature, { loading: featureLoading }] = useLazyQuery< + GetFeatureByIdQuery, + GetFeatureByIdQueryVariables + >(GET_FEATURE_BY_ID, { + onCompleted({ getFeatureById }) { + setFeature(getFeatureById); + }, + fetchPolicy: 'network-only', + }); + + const [updateFeature, { loading }] = useMutation< + UpdateFeatureMutation, + UpdateFeatureMutationVariables + >(UPDATE_FEATURE, { + onCompleted({ updateFeature: data }) { + setFeature(data); + setSuccess(true); + setTimeout(() => setSuccess(false), 3000); + }, + onError({ graphQLErrors }) { + setError(graphQLErrors[0]?.extensions?.info); + setTimeout(() => setError(''), 3000); + }, + }); + + const [deleteFeature] = useMutation< + DeleteFeatureMutation, + DeleteFeatureMutationVariables + >(DELETE_FEATURE, { + onCompleted() { + history.push('/feature'); + }, + onError({ graphQLErrors }) { + setError(graphQLErrors[0]?.extensions?.info); + setTimeout(() => setError(''), 3000); + }, + }); + + useEffect(() => { + getFeature({ variables: { id } }); + + // eslint-disable-next-line + }, [id]); + + const generalForm = useFormik({ + initialValues: { + name: feature?.name || '', + description: feature?.description || '', + imageName: feature?.image.name || '', + imageSource: feature?.image.src || '', + featureType: feature?.featureType || '', + price: feature?.price || 0, + repo: feature?.repo || '', + }, + 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'), + featureType: Yup.string().required('Feature Type is required'), + // prettier-ignore + price: Yup.number().typeError('Price must be a number').required('Price is required'), + repo: Yup.string().required('Repo is required'), + }), + onSubmit: ({ + name, + description, + imageName, + imageSource, + featureType, + price, + repo, + }) => { + updateFeature({ + variables: { + id, + feature: { + name, + description, + featureType, + image: { name: imageName, src: imageSource }, + price, + repo, + }, + }, + }); + }, + enableReinitialize: true, + }); + + return role === 'developer' ? ( + + +