diff --git a/.env b/.env index 343e676..6a84cba 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ VITE_TOKEN_NAME = 'admin_token' VITE_REFRESH_TOKEN_NAME = 'admin_refresh_token' VITE_BASE_URL = 'https://api.danakcorp.com' -# VITE_BASE_URL = 'http://192.168.1.108:4000' \ No newline at end of file +# VITE_BASE_URL = 'http://192.168.1.117:4000' \ No newline at end of file diff --git a/src/components/Radio.tsx b/src/components/Radio.tsx index 4f7dcdc..59180eb 100644 --- a/src/components/Radio.tsx +++ b/src/components/Radio.tsx @@ -2,8 +2,8 @@ import { FC } from 'react' type Props = { isActive: boolean, - value: string, - onChange: (value: string) => void + value: string | boolean, + onChange: (value: string | boolean) => void } const Radio: FC = (props: Props) => { diff --git a/src/components/RadioGroup.tsx b/src/components/RadioGroup.tsx index 0421109..e38efb0 100644 --- a/src/components/RadioGroup.tsx +++ b/src/components/RadioGroup.tsx @@ -5,10 +5,10 @@ import Radio from './Radio' type Props = { items: { label: string - value: string + value: string | boolean }[] - selected: string - onChange: (value: string) => void + selected: string | boolean + onChange: (value: string | boolean) => void } const RadioGroup: FC = (props: Props) => { diff --git a/src/pages/discounts/CreateDiscount.tsx b/src/pages/discounts/CreateDiscount.tsx index ed691c0..d489fbf 100644 --- a/src/pages/discounts/CreateDiscount.tsx +++ b/src/pages/discounts/CreateDiscount.tsx @@ -1,4 +1,4 @@ -import { FC, useState } from 'react' +import { FC, Fragment, useState } from 'react' import { useTranslation } from 'react-i18next' import Input from '../../components/Input' import Button from '../../components/Button' @@ -7,15 +7,13 @@ import { TickCircle } from 'iconsax-react' import DatePickerComponent from '../../components/DatePicker' import RadioGroup from '../../components/RadioGroup' import { useFormik } from 'formik' -import { CreateDiscountType, DiscountCalculationType, DiscountType } from './types/DiscountTypes' +import { CreateDiscountType } from './types/DiscountTypes' import * as Yup from 'yup' -import { useGetAllServices, useGetPlans } from '../service/hooks/useServiceData' -import { PlanItemType, ServiceItemType } from '../service/types/ServiceTypes' +import { useGetAllServices } from '../service/hooks/useServiceData' +import { ServiceItemType } from '../service/types/ServiceTypes' import CheckBoxComponent from '../../components/CheckBoxComponent' import { toast } from 'react-toastify' import { useCreateDiscount } from './hooks/useDiscountData' -import { useGetCustomers } from '../customer/hooks/useCustomerData' -import { CustomerItemType } from '../customer/types/CustomerTypes' import { useNavigate } from 'react-router-dom' import { Pages } from '../../config/Pages' import { ErrorType } from '../../helpers/types' @@ -25,55 +23,49 @@ const CreateDiscount: FC = () => { const navigate = useNavigate() const { t } = useTranslation('global') - const [serviceId, setServiceId] = useState('') - const [planId, setPlanId] = useState('') - const [customerId, setCustomerId] = useState('') + const [serviceId, setServiceId] = useState([]) + // const [planId, setPlanId] = useState('') + // const [customerId, setCustomerId] = useState('') const getServices = useGetAllServices('', 1, '', '', undefined, 50) - const getPlans = useGetPlans(serviceId) - const getCustomers = useGetCustomers() + // const getPlans = useGetPlans(serviceId) + // const getCustomers = useGetCustomers() const createDiscount = useCreateDiscount() const formik = useFormik({ initialValues: { - amount: '', - calculationType: DiscountCalculationType.FIXED, endDate: '', startDate: '', title: '', - type: DiscountType.DIRECT, - subscriptionPlanIds: [], - userIds: [] + type: 1, + targetServices: [], + direct: true, + value: 0, + isActive: true }, validationSchema: Yup.object({ - amount: Yup.string().required(t('errors.required')), - calculationType: Yup.string().required(t('errors.required')), + value: Yup.number().required(t('errors.required')), endDate: Yup.string().required(t('errors.required')), startDate: Yup.string().required(t('errors.required')), title: Yup.string().required(t('errors.required')), type: Yup.string().required(t('errors.required')), }), onSubmit(values) { - if (serviceId && planId) { - values.subscriptionPlanIds = [planId] - values.userIds = [customerId] - const params: CreateDiscountType = { - ...values, - startDate: moment(values.startDate, 'jYYYY-jMM-jDD').format('YYYY-MM-DD'), - endDate: moment(values.endDate, 'jYYYY-jMM-jDD').format('YYYY-MM-DD'), - amount: +values.amount - } - createDiscount.mutate(params, { - onSuccess: () => { - toast.success(t('success')) - navigate(Pages.discount.list) - }, - onError: (error: ErrorType) => { - toast.error(error.response?.data?.error?.message[0]) - } - }) - } else { - toast.error(t('discount.errors_plan')) + values.targetServices = serviceId + const params: CreateDiscountType = { + ...values, + startDate: moment(values.startDate, 'jYYYY-jMM-jDD').format('YYYY-MM-DD'), + endDate: moment(values.endDate, 'jYYYY-jMM-jDD').format('YYYY-MM-DD'), + value: +values.value } + createDiscount.mutate(params, { + onSuccess: () => { + toast.success(t('success')) + navigate(Pages.discount.list) + }, + onError: (error: ErrorType) => { + toast.error(error.response?.data?.error?.message[0]) + } + }) }, }) return ( @@ -103,15 +95,15 @@ const CreateDiscount: FC = () => { items={[ { label: t('discount.direct_discount'), - value: DiscountType.DIRECT + value: true }, { label: t('discount.discount_code'), - value: DiscountType.CODE + value: false } ]} - onChange={(value) => formik.setFieldValue('type', value)} - selected={formik.values.type} + onChange={(value) => formik.setFieldValue('direct', value)} + selected={formik.values.direct} /> @@ -141,23 +133,23 @@ const CreateDiscount: FC = () => { items={[ { label: t('discount.fixed_amount'), - value: DiscountCalculationType.FIXED + value: '1' }, { label: t('discount.percent'), - value: DiscountCalculationType.PERCENTAGE + value: '0' } ]} - onChange={(value) => formik.setFieldValue('calculationType', value)} - selected={formik.values.calculationType} + onChange={(value) => formik.setFieldValue('type', value)} + selected={formik.values.type.toString()} />
@@ -190,30 +182,36 @@ const CreateDiscount: FC = () => { />
-

{t('discount.availabe_service')}

-
- - { - getServices.data?.data?.services?.map((item: ServiceItemType) => ( -
-
- setServiceId(e.target.checked ? item.id : '')} - /> -
-
- {item.name} -
-
- )) - } -
{ + formik.values.direct && + +

{t('discount.availabe_service')}

+
+ + { + getServices.data?.data?.services?.map((item: ServiceItemType) => ( +
+
+ setServiceId(e.target.checked ? [...serviceId, item.id] : serviceId.filter(id => id !== item.id))} + /> +
+
+ {item.name} +
+
+ )) + } +
+
+ } + + {/* { getPlans.data &&
{ @@ -253,7 +251,7 @@ const CreateDiscount: FC = () => { )) }
- } + } */} diff --git a/src/pages/discounts/types/DiscountTypes.ts b/src/pages/discounts/types/DiscountTypes.ts index 9a93a37..e9edae1 100644 --- a/src/pages/discounts/types/DiscountTypes.ts +++ b/src/pages/discounts/types/DiscountTypes.ts @@ -1,12 +1,12 @@ export type CreateDiscountType = { title: string; - type: string; - calculationType: DiscountCalculationType; - amount: string | number; + type: number; + direct: boolean; + value: number; startDate: string; endDate: string; - subscriptionPlanIds: string[]; - userIds: string[]; + isActive: boolean; + targetServices: string[]; }; export enum DiscountType { diff --git a/src/pages/users/RoleCreate.tsx b/src/pages/users/RoleCreate.tsx index a7ea687..27c9fdf 100644 --- a/src/pages/users/RoleCreate.tsx +++ b/src/pages/users/RoleCreate.tsx @@ -112,6 +112,9 @@ const RoleCreate: FC = () => { ) }) } +
+
+
diff --git a/src/pages/users/hooks/useUserData.ts b/src/pages/users/hooks/useUserData.ts index d87390c..20eed69 100644 --- a/src/pages/users/hooks/useUserData.ts +++ b/src/pages/users/hooks/useUserData.ts @@ -51,3 +51,10 @@ export const useGetGroups = () => { queryFn: () => api.getGroups(), }); }; + +export const useGetAdminPermissions = () => { + return useQuery({ + queryKey: ["admin-permissions"], + queryFn: () => api.getAdminPermissions(), + }); +}; diff --git a/src/pages/users/service/UserService.ts b/src/pages/users/service/UserService.ts index fb90f83..b0df2a1 100644 --- a/src/pages/users/service/UserService.ts +++ b/src/pages/users/service/UserService.ts @@ -39,3 +39,8 @@ export const getGroups = async () => { const { data } = await axios.get(`/users/user-group`); return data; }; + +export const getAdminPermissions = async () => { + const { data } = await axios.get(`/users/admin-permissions`); + return data; +}; diff --git a/src/shared/SideBar.tsx b/src/shared/SideBar.tsx index 900bc2b..b234abe 100644 --- a/src/shared/SideBar.tsx +++ b/src/shared/SideBar.tsx @@ -21,7 +21,6 @@ const SideBar: FC = () => { const { t } = useTranslation('global') const { openSidebar, setOpenSidebar, hasSubMenu, setSubMenuName, setSubtMenu, subMenuName } = useSharedStore() const location = useLocation() - const isActive = (name: string) => { return location.pathname.includes(name) } @@ -82,6 +81,7 @@ const SideBar: FC = () => { title={t('sidebar.mainpage')} isActive={isActive('dashboard')} link={Pages.dashboard} + activeName='dashboard' /> } @@ -89,24 +89,28 @@ const SideBar: FC = () => { isActive={isActive('services')} link={Pages.services.list} name='services' + activeName='services' /> } title={t('sidebar.customers')} isActive={isActive('customers')} link={Pages.customers.list} + activeName='customers' /> } title={t('sidebar.representatives')} isActive={isActive('representatives')} link={Pages.representative.list} + activeName='agents' /> } title={t('sidebar.developers')} isActive={isActive('developers')} link={Pages.developers.list} + activeName='developers' /> @@ -115,36 +119,42 @@ const SideBar: FC = () => { title={t('sidebar.receipt_list')} isActive={isActive('receipts')} link={Pages.receipts.index} + activeName='invoices' /> } title={t('sidebar.transactions')} isActive={isActive('transactions')} link={Pages.transactions} + activeName='transactions' /> } title={t('sidebar.payments')} isActive={isActive('payments')} link={Pages.payment.list} + activeName='payments' /> } title={t('sidebar.discounts')} isActive={isActive('discounts')} link={Pages.discount.list} + activeName='discounts' /> } title={t('sidebar.code_referral')} isActive={isActive('referral-code')} link={Pages.referralCode.list} + activeName='referralCode' /> } title={t('sidebar.users')} isActive={isActive('users')} link={Pages.users.list} + activeName='admins' /> @@ -162,6 +172,7 @@ const SideBar: FC = () => { title={t('sidebar.ticket')} isActive={isActive('tickets')} link={Pages.ticket.list} + activeName='tickets' /> @@ -171,6 +182,7 @@ const SideBar: FC = () => { title={t('sidebar.criticisms')} isActive={isActive('criticisms')} link={Pages.criticisms.list} + activeName='criticisms' /> @@ -188,6 +200,7 @@ const SideBar: FC = () => { title={t('sidebar.ads')} isActive={isActive('ads')} link={Pages.ads.list} + activeName='advertisements' /> @@ -197,6 +210,7 @@ const SideBar: FC = () => { title={t('sidebar.announcement')} isActive={isActive('announcement')} link={Pages.announcement.list} + activeName='announcements' /> @@ -206,6 +220,7 @@ const SideBar: FC = () => { title={t('sidebar.blog')} isActive={isActive('blog')} link={Pages.blog.list} + activeName='blogs' /> @@ -215,6 +230,7 @@ const SideBar: FC = () => { title={t('sidebar.learning')} isActive={isActive('learning')} link={Pages.learning.list} + activeName='learnings' /> @@ -224,6 +240,7 @@ const SideBar: FC = () => { title={t('sidebar.messages')} isActive={isActive('messages')} link={Pages.messages.list} + activeName='contacts_us' /> @@ -236,6 +253,7 @@ const SideBar: FC = () => { title={t('sidebar.card')} isActive={isActive('card')} link={Pages.cardBank.list} + activeName='bank_accounts' />
@@ -244,6 +262,7 @@ const SideBar: FC = () => { title={t('sidebar.setting')} isActive={isActive('setting')} link={Pages.setting} + activeName='settings' />
@@ -253,6 +272,7 @@ const SideBar: FC = () => { isActive={isActive('logout')} link={`#`} isLogout + activeName='' />
diff --git a/src/shared/SideBarItem.tsx b/src/shared/SideBarItem.tsx index 2d3426b..936f135 100644 --- a/src/shared/SideBarItem.tsx +++ b/src/shared/SideBarItem.tsx @@ -4,6 +4,7 @@ import { clx } from '../helpers/utils' import { Pages } from '../config/Pages' import { useSharedStore } from './store/sharedStore' import { removeToken, removeRefreshToken } from '../config/func' +import { useGetAdminPermissions } from '../pages/users/hooks/useUserData' type Props = { icon: ReactNode, @@ -11,12 +12,14 @@ type Props = { isActive: boolean, link: string, isLogout?: boolean, - name?: string + name?: string, + activeName?: string } const SideBarItem: FC = (props: Props) => { const { hasSubMenu, setSubMenuName, setSubtMenu } = useSharedStore() + const { data: adminPermissions } = useGetAdminPermissions() const handleLogout = () => { removeToken() removeRefreshToken() @@ -29,29 +32,31 @@ const SideBarItem: FC = (props: Props) => { setSubtMenu(true) } } - - return ( - -
-
permission.name === props.activeName)) { + return ( + - {props.icon} -
- {props.title} +
+
+ {props.icon} +
+ {props.title} +
-
- - ) + + ) + } + return null } export default SideBarItem \ No newline at end of file