diff --git a/src/assets/images/dkala.png b/src/assets/images/dkala.png new file mode 100644 index 0000000..88b0d5b Binary files /dev/null and b/src/assets/images/dkala.png differ diff --git a/src/assets/images/dmenu.png b/src/assets/images/dmenu.png new file mode 100644 index 0000000..e767b6e Binary files /dev/null and b/src/assets/images/dmenu.png differ diff --git a/src/components/ServiceItem.tsx b/src/components/ServiceItem.tsx index e8fd0fa..b01d3bd 100644 --- a/src/components/ServiceItem.tsx +++ b/src/components/ServiceItem.tsx @@ -7,7 +7,7 @@ import { useTranslation } from 'react-i18next' import { ItemServiceType } from '../pages/service/types/ServiecTypes' import moment from 'moment-jalaali' import { NumberFormat } from '../config/func' -import { useDirectLogin, useGetDmenuSubscription } from '../pages/service/hooks/useServiceData' +import { useDirectLogin, useDirectLoginDkala, useGetDmenuSubscription, useGetDkalaSubscription } from '../pages/service/hooks/useServiceData' import { toast } from './Toast' import { ErrorType } from '../helpers/types' @@ -31,8 +31,15 @@ const ServiceItem: FC = (props: Props) => { const { item } = props const isDmenu = item?.slug === 'Dmenu' - const { data: dmenuSubscription, isPending, isError } = useGetDmenuSubscription(isChecked && isDmenu && props.isLinkPanel ? props.subscriptionId! : '',) + const isDkala = item?.slug === 'Dkala' + const isDmenuOrDkala = isDmenu || isDkala + const { data: dmenuSubscription, isPending: isDmenuPending, isError: isDmenuError } = useGetDmenuSubscription(isChecked && isDmenu && props.isLinkPanel ? props.subscriptionId! : '') + const { data: dkalaSubscription, isPending: isDkalaPending, isError: isDkalaError } = useGetDkalaSubscription(isChecked && isDkala && props.isLinkPanel ? props.subscriptionId! : '') + const subscription = isDmenu ? dmenuSubscription : dkalaSubscription + const isPending = isDmenu ? isDmenuPending : isDkalaPending + const isError = isDmenu ? isDmenuError : isDkalaError const { mutate: directLogin } = useDirectLogin() + const { mutate: directLoginDkala } = useDirectLoginDkala() const getRemainingDays = (endDate: string): number => { const now = moment() @@ -63,14 +70,15 @@ const ServiceItem: FC = (props: Props) => { } const handleDirectLogin = () => { - if (!isDmenu) { + if (!isDmenuOrDkala) { window.open(item.link, '_blank') return } if (!props.subscriptionId) { return } - directLogin(props.subscriptionId, { + const doLogin = isDkala ? directLoginDkala : directLogin + doLogin(props.subscriptionId, { onSuccess: (data) => { window.open(item.link + `?token=${data?.data?.tokens?.accessToken?.token}&refreshToken=${data?.data?.tokens?.refreshToken?.token}`, '_blank') }, @@ -78,12 +86,11 @@ const ServiceItem: FC = (props: Props) => { toast(error.response?.data?.error?.message[0], 'error') } }) - } useEffect(() => { - if (isChecked && isDmenu && props.isLinkPanel) { - if (dmenuSubscription && !isPending) { + if (isChecked && isDmenuOrDkala && props.isLinkPanel) { + if (subscription && !isPending) { if (item.link) { // window.open(item.link, '_blank') handleDirectLogin() @@ -91,12 +98,12 @@ const ServiceItem: FC = (props: Props) => { setIsChecked(false) } else if (isError && !isPending) { if (props.subscriptionId) { - navigate(Pages.services.manageRestaurant + props.subscriptionId) + navigate(isDmenu ? Pages.services.manageRestaurant + props.subscriptionId : Pages.services.manageDkala + props.subscriptionId) } setIsChecked(false) } } - }, [dmenuSubscription, isError, isPending, isChecked, isDmenu, props.isLinkPanel, props.subscriptionId, item.link, navigate]) + }, [subscription, isError, isPending, isChecked, isDmenuOrDkala, props.isLinkPanel, props.subscriptionId, item.link, navigate]) const handleCheckSubscription = () => { if (props.isDisabled) { @@ -104,7 +111,7 @@ const ServiceItem: FC = (props: Props) => { } if (props.isLinkPanel && item.link) { - if (isDmenu && props.subscriptionId) { + if (isDmenuOrDkala && props.subscriptionId) { setIsChecked(true) } else { // window.open(item.link, '_blank') @@ -159,7 +166,7 @@ const ServiceItem: FC = (props: Props) => { + + +
+ +
+ + + + + + ) +} diff --git a/src/pages/service/ManageRestaurant.tsx b/src/pages/service/ManageRestaurant.tsx index 93e9974..a45fb85 100644 --- a/src/pages/service/ManageRestaurant.tsx +++ b/src/pages/service/ManageRestaurant.tsx @@ -11,7 +11,7 @@ import Button from '../../components/Button' import Error from '../../components/Error' import { TickCircle } from 'iconsax-react' import { Helmet } from 'react-helmet-async' -import GuideSlugImage from '../../assets/images/guide-slug.png' +import GuideSlugImage from '../../assets/images/dmenu.png' export const ManageRestaurant: FC = () => { const { t } = useTranslation('global') diff --git a/src/pages/service/hooks/useServiceData.ts b/src/pages/service/hooks/useServiceData.ts index 09157d2..a017221 100644 --- a/src/pages/service/hooks/useServiceData.ts +++ b/src/pages/service/hooks/useServiceData.ts @@ -1,6 +1,10 @@ import { useMutation, useQuery } from "@tanstack/react-query"; import * as api from "../service/ServiceService"; -import { BuyServiceType, CreateReviewType } from "../types/ServiecTypes"; +import { + BuyServiceType, + CreateReviewType, + DkalaCreateShopType, +} from "../types/ServiecTypes"; export const useGetSuggestedServices = () => { return useQuery({ @@ -79,12 +83,40 @@ export const useGetDmenuSubscription = (subscriptionId: string) => { }); }; +export const useGetDkalaSubscription = (subscriptionId: string) => { + return useQuery({ + queryKey: ["dkala-subscription", subscriptionId], + queryFn: () => api.getDkalaSubscription(subscriptionId), + enabled: !!subscriptionId, + }); +}; + +export const useCreateDkalaShop = () => { + return useMutation({ + mutationFn: (variables: DkalaCreateShopType) => + api.createDkalaShop(variables), + }); +}; + +export const useDirectLoginDkala = () => { + return useMutation({ + mutationFn: api.directLoginDkala, + mutationKey: ["direct-login-dkala"], + }); +}; + export const useCreateDmenuRestaurant = () => { return useMutation({ mutationFn: api.createDmenuRestaurant, }); }; +export const useCreateDkalaRestaurant = () => { + return useMutation({ + mutationFn: api.createDkalaShop, + }); +}; + export const useGetSubscription = (subscriptionId: string) => { return useQuery({ queryKey: ["subscription", subscriptionId], diff --git a/src/pages/service/service/ServiceService.ts b/src/pages/service/service/ServiceService.ts index 14f4378..f027115 100644 --- a/src/pages/service/service/ServiceService.ts +++ b/src/pages/service/service/ServiceService.ts @@ -5,6 +5,7 @@ import { ExtentSubscriptionType, ExtentSubscriptionResponseType, DmenuCreateRestaurantType, + DkalaCreateShopType, GetSubscriptionResponseType, DirectLoginResponseType, } from "../types/ServiecTypes"; @@ -82,6 +83,13 @@ export const getDmenuSubscription = async (subscriptionId: string) => { return data; }; +export const getDkalaSubscription = async (subscriptionId: string) => { + const { data } = await axios.get( + `/dkala/shops/subscription/${subscriptionId}`, + ); + return data; +}; + export const createDmenuRestaurant = async ( params: DmenuCreateRestaurantType, ) => { @@ -89,6 +97,20 @@ export const createDmenuRestaurant = async ( return data; }; +export const createDkalaShop = async (params: DkalaCreateShopType) => { + const { data } = await axios.post(`/dkala/shops`, params); + return data; +}; + +export const directLoginDkala = async ( + userSubscriptionId: string, +): Promise => { + const { data } = await axios.post( + `/dkala/auth/direct-login/${userSubscriptionId}`, + ); + return data; +}; + export const getSubscription = async ( subscriptionId: string, ): Promise => { diff --git a/src/pages/service/types/ServiecTypes.ts b/src/pages/service/types/ServiecTypes.ts index 38cc451..c6b5aa5 100644 --- a/src/pages/service/types/ServiecTypes.ts +++ b/src/pages/service/types/ServiecTypes.ts @@ -283,6 +283,11 @@ export type DmenuCreateRestaurantType = { userSubscriptionId: string; }; +export type DkalaCreateShopType = { + slug: string; + userSubscriptionId: string; +}; + export type ServiceImageType = { id: string; createdAt: string; diff --git a/src/router/Main.tsx b/src/router/Main.tsx index 0461f43..3c36f65 100644 --- a/src/router/Main.tsx +++ b/src/router/Main.tsx @@ -33,6 +33,7 @@ import Support from '../pages/support/Support' import SupportInfo from '../pages/support/SupportInfo' import Invoice from '../pages/receipts/Invoice' import { ManageRestaurant } from '../pages/service/ManageRestaurant' +import { ManageDkala } from '../pages/service/ManageDkala' const MainRouter: FC = () => { return ( @@ -47,6 +48,7 @@ const MainRouter: FC = () => { } /> } /> } /> + } /> } /> } /> } />