import { useQuery, useMutation } from '@apollo/react-hooks' import { makeStyles, Box } from '@material-ui/core' import gql from 'graphql-tag' import * as R from 'ramda' import React, { useState } from 'react' import DeleteIcon from 'src/styling/icons/action/delete/enabled.svg?react' import { DeleteDialog } from 'src/components/DeleteDialog' import { Link, Button, IconButton } from 'src/components/buttons' import DataTable from 'src/components/tables/DataTable' import { Label3, TL1 } from 'src/components/typography' import styles from './PromoCodes.styles' import PromoCodesModal from './PromoCodesModal' const useStyles = makeStyles(styles) const DUPLICATE_ERROR_MSG = 'There is already a promotion with that code!' const DEFAULT_ERROR_MSG = 'Failed to save' const GET_PROMO_CODES = gql` query promoCodes { promoCodes { id code discount } } ` const DELETE_CODE = gql` mutation deletePromoCode($codeId: ID!) { deletePromoCode(codeId: $codeId) { id } } ` const CREATE_CODE = gql` mutation createPromoCode($code: String!, $discount: Int!) { createPromoCode(code: $code, discount: $discount) { id code discount } } ` const PromoCodes = () => { const classes = useStyles() const [deleteDialog, setDeleteDialog] = useState(false) const [toBeDeleted, setToBeDeleted] = useState() const [showModal, setShowModal] = useState(false) const [errorMsg, setErrorMsg] = useState(null) const toggleModal = () => setShowModal(!showModal) const { data: codeResponse, loading } = useQuery(GET_PROMO_CODES) const [deleteCode] = useMutation(DELETE_CODE, { onError: ({ message }) => { const errorMessage = message ?? 'Error while deleting row' setErrorMsg(errorMessage) }, onCompleted: () => setDeleteDialog(false), refetchQueries: () => ['promoCodes'] }) const [createCode] = useMutation(CREATE_CODE, { refetchQueries: () => ['promoCodes'] }) const addCode = (code, discount) => { setErrorMsg(null) createCode({ variables: { code: code, discount: discount } }) .then(res => { if (!res.errors) return setShowModal(false) const duplicateCodeError = R.any(it => R.includes('duplicate', it?.message) )(res.errors) const msg = duplicateCodeError ? DUPLICATE_ERROR_MSG : DEFAULT_ERROR_MSG setErrorMsg(msg) }) .catch(err => { setErrorMsg(DEFAULT_ERROR_MSG) console.log(err) }) } const elements = [ { header: 'Code', width: 300, textAlign: 'left', size: 'sm', view: t => t.code }, { header: 'Discount', width: 220, textAlign: 'left', size: 'sm', view: t => ( <> {t.discount} % in commissions ) }, { header: 'Delete', width: 100, textAlign: 'center', size: 'sm', view: t => ( { setDeleteDialog(true) setToBeDeleted({ variables: { codeId: t.id } }) }}> ) } ] return ( <> {!loading && !R.isEmpty(codeResponse.promoCodes) && ( Add new code )} {!loading && !R.isEmpty(codeResponse.promoCodes) && ( <> { setDeleteDialog(false) setErrorMsg(null) }} onConfirmed={() => { setErrorMsg(null) deleteCode(toBeDeleted) }} errorMessage={errorMsg} /> )} {!loading && R.isEmpty(codeResponse.promoCodes) && ( Currently, there are no active promo codes on your network. )} { setErrorMsg(null) setShowModal(false) }} errorMsg={errorMsg} addCode={addCode} /> ) } export default PromoCodes