direct login

This commit is contained in:
hamid zarghami
2026-01-05 10:47:46 +03:30
parent 48e91a508b
commit 7a7638ad9e
5 changed files with 102 additions and 9 deletions
+27 -3
View File
@@ -7,7 +7,9 @@ import { useTranslation } from 'react-i18next'
import { ItemServiceType } from '../pages/service/types/ServiecTypes' import { ItemServiceType } from '../pages/service/types/ServiecTypes'
import moment from 'moment-jalaali' import moment from 'moment-jalaali'
import { NumberFormat } from '../config/func' import { NumberFormat } from '../config/func'
import { useGetDmenuSubscription } from '../pages/service/hooks/useServiceData' import { useDirectLogin, useGetDmenuSubscription } from '../pages/service/hooks/useServiceData'
import { toast } from './Toast'
import { ErrorType } from '../helpers/types'
type Props = { type Props = {
item: ItemServiceType, item: ItemServiceType,
@@ -30,6 +32,7 @@ const ServiceItem: FC<Props> = (props: Props) => {
const isDmenu = item?.slug === 'Dmenu' const isDmenu = item?.slug === 'Dmenu'
const { data: dmenuSubscription, isPending, isError } = useGetDmenuSubscription(isChecked && isDmenu && props.isLinkPanel ? props.subscriptionId! : '',) const { data: dmenuSubscription, isPending, isError } = useGetDmenuSubscription(isChecked && isDmenu && props.isLinkPanel ? props.subscriptionId! : '',)
const { mutate: directLogin } = useDirectLogin()
const getRemainingDays = (endDate: string): number => { const getRemainingDays = (endDate: string): number => {
const now = moment() const now = moment()
@@ -59,11 +62,31 @@ const ServiceItem: FC<Props> = (props: Props) => {
return `${NumberFormat(days)} روز باقی مانده` return `${NumberFormat(days)} روز باقی مانده`
} }
const handleDirectLogin = () => {
if (!isDmenu) {
window.open(item.link, '_blank')
return
}
if (!props.subscriptionId) {
return
}
directLogin(props.subscriptionId, {
onSuccess: (data) => {
window.open(item.link + `?token=${data?.data?.tokens?.accessToken?.token}&refreshToken=${data?.data?.tokens?.refreshToken?.token}`, '_blank')
},
onError: (error: ErrorType) => {
toast(error.response?.data?.error?.message[0], 'error')
}
})
}
useEffect(() => { useEffect(() => {
if (isChecked && isDmenu && props.isLinkPanel) { if (isChecked && isDmenu && props.isLinkPanel) {
if (dmenuSubscription && !isPending) { if (dmenuSubscription && !isPending) {
if (item.link) { if (item.link) {
window.open(item.link, '_blank') // window.open(item.link, '_blank')
handleDirectLogin()
} }
setIsChecked(false) setIsChecked(false)
} else if (isError && !isPending) { } else if (isError && !isPending) {
@@ -84,7 +107,8 @@ const ServiceItem: FC<Props> = (props: Props) => {
if (isDmenu && props.subscriptionId) { if (isDmenu && props.subscriptionId) {
setIsChecked(true) setIsChecked(true)
} else { } else {
window.open(item.link, '_blank') // window.open(item.link, '_blank')
handleDirectLogin()
} }
} else { } else {
navigate(Pages.services.detail + item.slug) navigate(Pages.services.detail + item.slug)
+28 -6
View File
@@ -1,7 +1,7 @@
import { type FC } from 'react' import { type FC } from 'react'
import { useParams } from 'react-router-dom' import { useParams } from 'react-router-dom'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { useCreateDmenuRestaurant, useGetSubscription } from './hooks/useServiceData' import { useCreateDmenuRestaurant, useDirectLogin, useGetSubscription } from './hooks/useServiceData'
import { useFormik } from 'formik' import { useFormik } from 'formik'
import { DmenuCreateRestaurantType } from './types/ServiecTypes' import { DmenuCreateRestaurantType } from './types/ServiecTypes'
import * as Yup from 'yup' import * as Yup from 'yup'
@@ -13,11 +13,32 @@ import { TickCircle } from 'iconsax-react'
import { Helmet } from 'react-helmet-async' import { Helmet } from 'react-helmet-async'
export const ManageRestaurant: FC = () => { export const ManageRestaurant: FC = () => {
const { t } = useTranslation('global') const { t } = useTranslation('global')
const { subscriptionId } = useParams() const { subscriptionId } = useParams()
const createDmenuRestaurant = useCreateDmenuRestaurant() const createDmenuRestaurant = useCreateDmenuRestaurant()
const getSubscription = useGetSubscription(subscriptionId!) const getSubscription = useGetSubscription(subscriptionId || '')
const { mutate: directLogin } = useDirectLogin()
const handleDirectLogin = () => {
if (!subscriptionId) {
toast(t('errors.required') || 'شناسه اشتراک یافت نشد', 'error')
return
}
directLogin(subscriptionId, {
onSuccess: (data) => {
const serviceLink = getSubscription?.data?.data?.userSubscription?.plan?.service?.link
if (serviceLink && data?.data?.tokens?.accessToken?.token && data?.data?.tokens?.refreshToken?.token) {
window.location.href = `${serviceLink}?token=${data.data.tokens.accessToken.token}&refreshToken=${data.data.tokens.refreshToken.token}`
} else {
toast('خطا در دریافت اطلاعات سرویس', 'error')
}
},
onError: (error: ErrorType) => {
toast(error.response?.data?.error?.message?.[0] || 'خطا در ورود مستقیم', 'error')
}
})
}
const formik = useFormik<DmenuCreateRestaurantType>({ const formik = useFormik<DmenuCreateRestaurantType>({
initialValues: { initialValues: {
@@ -27,6 +48,7 @@ export const ManageRestaurant: FC = () => {
phone: '', phone: '',
userSubscriptionId: subscriptionId || '' userSubscriptionId: subscriptionId || ''
}, },
enableReinitialize: true,
validationSchema: Yup.object({ validationSchema: Yup.object({
name: Yup.string().required(t('errors.required')), name: Yup.string().required(t('errors.required')),
slug: Yup.string().required(t('errors.required')), slug: Yup.string().required(t('errors.required')),
@@ -44,12 +66,12 @@ export const ManageRestaurant: FC = () => {
} }
createDmenuRestaurant.mutate(submitValues, { createDmenuRestaurant.mutate(submitValues, {
onSuccess: () => { onSuccess: () => {
toast(t('success'), 'success') toast(t('success') || 'با موفقیت انجام شد', 'success')
formik.resetForm() formik.resetForm()
window.location.href = getSubscription?.data?.data?.userSubscription?.plan?.service?.link as string handleDirectLogin()
}, },
onError: (error: ErrorType) => { onError: (error: ErrorType) => {
toast(error.response?.data?.error?.message[0], 'error') toast(error.response?.data?.error?.message?.[0] || 'خطا در ایجاد رستوران', 'error')
} }
}) })
} }
@@ -84,3 +84,10 @@ export const useGetSubscription = (subscriptionId: string) => {
enabled: !!subscriptionId, enabled: !!subscriptionId,
}); });
}; };
export const useDirectLogin = () => {
return useMutation({
mutationFn: api.directLogin,
mutationKey: ["direct-login"],
});
};
@@ -6,6 +6,7 @@ import {
ExtentSubscriptionResponseType, ExtentSubscriptionResponseType,
DmenuCreateRestaurantType, DmenuCreateRestaurantType,
GetSubscriptionResponseType, GetSubscriptionResponseType,
DirectLoginResponseType,
} from "../types/ServiecTypes"; } from "../types/ServiecTypes";
export const getServiceSuggestedDanak = async () => { export const getServiceSuggestedDanak = async () => {
@@ -85,3 +86,12 @@ export const getSubscription = async (
const { data } = await axios.get(`/subscriptions/user/${subscriptionId}`); const { data } = await axios.get(`/subscriptions/user/${subscriptionId}`);
return data; return data;
}; };
export const directLogin = async (
userSubscriptionId: string
): Promise<DirectLoginResponseType> => {
const { data } = await axios.post(
`/dmenu/auth/direct-login/${userSubscriptionId}`
);
return data;
};
+30
View File
@@ -368,3 +368,33 @@ export type GetSubscriptionResponseType = {
userSubscription: UserSubscriptionWithDetailsType; userSubscription: UserSubscriptionWithDetailsType;
}; };
}; };
export type DirectLoginResponseType = {
statusCode: number;
success: boolean;
data: {
tokens: {
accessToken: {
token: string;
expire: number;
};
refreshToken: {
token: string;
expire: number;
};
};
admin: {
id: string;
firstName: string;
lastName: string;
phone: string;
role: string;
permissions: string[];
restaurant: {
id: string;
name: string;
slug: string;
};
};
};
};