From 70a6e2f6a19ca85329e128984f4c6a20dbbb3353 Mon Sep 17 00:00:00 2001 From: AdityaJ2305 Date: Sat, 1 Feb 2025 15:26:55 +0530 Subject: [PATCH 01/27] login file --- src/components/Auth/Login.tsx | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/components/Auth/Login.tsx b/src/components/Auth/Login.tsx index efd4403c23d..efe1a6a3f73 100644 --- a/src/components/Auth/Login.tsx +++ b/src/components/Auth/Login.tsx @@ -35,7 +35,6 @@ import FiltersCache from "@/Utils/FiltersCache"; import ViewCache from "@/Utils/ViewCache"; import routes from "@/Utils/request/api"; import mutate from "@/Utils/request/mutate"; -import request from "@/Utils/request/request"; import { TokenData } from "@/types/auth/otpToken"; interface LoginFormData { @@ -110,13 +109,7 @@ const Login = (props: LoginProps) => { // Send OTP Mutation const { mutate: sendOtp, isPending: sendOtpPending } = useMutation({ - mutationFn: async (phone: string) => { - const response = await request(routes.otp.sendOtp, { - body: { phone_number: phone }, - silent: true, - }); - return response; - }, + mutationFn: mutate(routes.otp.sendOtp), onSuccess: () => { setIsOtpSent(true); setOtpError(""); @@ -280,7 +273,7 @@ const Login = (props: LoginProps) => { try { if (!isOtpSent) { - await sendOtp(phone); + await sendOtp({ phone_number: phone }); setIsOtpSent(true); } else { await verifyOtp({ phone_number: phone, otp }); From b7d491dd41bd2459eba2bca98dc914ebcf2ad75c Mon Sep 17 00:00:00 2001 From: AdityaJ2305 Date: Sat, 1 Feb 2025 23:45:05 +0530 Subject: [PATCH 02/27] replace request with callApi and other utilities --- src/components/Auth/ResetPassword.tsx | 28 +++++--- src/components/Facility/FacilityHome.tsx | 16 ++--- .../Resource/ResourceCommentSection.tsx | 18 ++--- src/components/Resource/ResourceCreate.tsx | 69 +++++++++---------- .../Resource/ResourceDetailsUpdate.tsx | 31 +++++---- src/components/Users/UserAvatar.tsx | 7 +- .../PublicAppointments/auth/PatientLogin.tsx | 13 +--- 7 files changed, 88 insertions(+), 94 deletions(-) diff --git a/src/components/Auth/ResetPassword.tsx b/src/components/Auth/ResetPassword.tsx index 1f75e5a1ff6..2e938f8fd9b 100644 --- a/src/components/Auth/ResetPassword.tsx +++ b/src/components/Auth/ResetPassword.tsx @@ -12,7 +12,7 @@ import { LocalStorageKeys } from "@/common/constants"; import { validatePassword } from "@/common/validation"; import routes from "@/Utils/request/api"; -import request from "@/Utils/request/request"; +import { callApi } from "@/Utils/request/query"; interface ResetPasswordProps { token: string; @@ -75,28 +75,34 @@ const ResetPassword = (props: ResetPasswordProps) => { const valid = validateData(); if (valid) { valid.token = props.token; - const { res, error } = await request(routes.resetPassword, { - body: { ...valid }, - }); - if (res?.ok) { + + try { + await callApi(routes.resetPassword, { + body: { ...valid }, + }); + localStorage.removeItem(LocalStorageKeys.accessToken); toast.success(t("password_reset_success")); navigate("/login"); - } else if (res && error) { - setErrors(error); + } catch (error: any) { + if (error.cause) { + setErrors(error.cause); + } } } }; useEffect(() => { const checkResetToken = async () => { - const { res } = await request(routes.checkResetToken, { - body: { token: props.token }, - }); - if (!res || !res.ok) { + try { + await callApi(routes.checkResetToken, { + body: { token: props.token }, + }); + } catch { navigate("/invalid-reset"); } }; + if (props.token) { checkResetToken(); } else { diff --git a/src/components/Facility/FacilityHome.tsx b/src/components/Facility/FacilityHome.tsx index 4856911d5e7..c8705a4738d 100644 --- a/src/components/Facility/FacilityHome.tsx +++ b/src/components/Facility/FacilityHome.tsx @@ -33,7 +33,7 @@ import { FACILITY_FEATURE_TYPES } from "@/common/constants"; import { PLUGIN_Component } from "@/PluginEngine"; import routes from "@/Utils/request/api"; -import query from "@/Utils/request/query"; +import query, { callApi } from "@/Utils/request/query"; import request from "@/Utils/request/request"; import uploadFile from "@/Utils/request/uploadFile"; import { getAuthorizationHeader } from "@/Utils/request/utils"; @@ -111,17 +111,13 @@ export const FacilityHome = ({ facilityId }: Props) => { }; const handleDeleteSubmit = async () => { - await request(routes.deleteFacility, { + const res = await callApi(routes.deleteFacility, { pathParams: { id: facilityId }, - onResponse: ({ res }) => { - if (res?.ok) { - toast.success( - t("deleted_successfully", { name: facilityData?.name }), - ); - } - navigate("/facility"); - }, }); + if (res) { + toast.success(t("deleted_successfully", { name: facilityData?.name })); + navigate("/facility"); + } }; const handleCoverImageUpload = async (file: File, onError: () => void) => { diff --git a/src/components/Resource/ResourceCommentSection.tsx b/src/components/Resource/ResourceCommentSection.tsx index 24adeba890b..1dd2a942a27 100644 --- a/src/components/Resource/ResourceCommentSection.tsx +++ b/src/components/Resource/ResourceCommentSection.tsx @@ -1,3 +1,4 @@ +import { useMutation } from "@tanstack/react-query"; import { t } from "i18next"; import { useState } from "react"; import { toast } from "sonner"; @@ -11,13 +12,18 @@ import { Avatar } from "@/components/Common/Avatar"; import CircularProgress from "@/components/Common/CircularProgress"; import routes from "@/Utils/request/api"; -import request from "@/Utils/request/request"; +import mutate from "@/Utils/request/mutate"; import { formatName, relativeTime } from "@/Utils/utils"; import { CommentModel } from "@/types/resourceRequest/resourceRequest"; const CommentSection = (props: { id: string }) => { const [commentBox, setCommentBox] = useState(""); - + const { mutate: addResourceComments } = useMutation({ + mutationFn: mutate(routes.addResourceComments, { + pathParams: { id: props.id }, + }), + onSuccess: () => toast.success(t("comment_added_successfully")), + }); const onSubmitComment = async () => { const payload = { comment: commentBox, @@ -26,13 +32,7 @@ const CommentSection = (props: { id: string }) => { toast.error(t("comment_min_length")); return; } - const { res } = await request(routes.addResourceComments, { - pathParams: { id: props.id }, - body: payload, - }); - if (res?.ok) { - toast.success(t("comment_added_successfully")); - } + addResourceComments(payload); setCommentBox(""); }; return ( diff --git a/src/components/Resource/ResourceCreate.tsx b/src/components/Resource/ResourceCreate.tsx index 8f0a4c38b0a..1cb23986c2a 100644 --- a/src/components/Resource/ResourceCreate.tsx +++ b/src/components/Resource/ResourceCreate.tsx @@ -1,5 +1,5 @@ import { zodResolver } from "@hookform/resolvers/zod"; -import { useQuery } from "@tanstack/react-query"; +import { useMutation, useQuery } from "@tanstack/react-query"; import { navigate, useQueryParams } from "raviger"; import { useState } from "react"; import { useForm } from "react-hook-form"; @@ -44,10 +44,13 @@ import useAuthUser from "@/hooks/useAuthUser"; import { RESOURCE_CATEGORY_CHOICES } from "@/common/constants"; import routes from "@/Utils/request/api"; +import mutate from "@/Utils/request/mutate"; import query from "@/Utils/request/query"; -import request from "@/Utils/request/request"; import validators from "@/Utils/validators"; -import { CreateResourceRequest } from "@/types/resourceRequest/resourceRequest"; +import { + CreateResourceRequest, + ResourceRequest, +} from "@/types/resourceRequest/resourceRequest"; interface ResourceProps { facilityId: number; @@ -104,40 +107,36 @@ export default function ResourceCreate(props: ResourceProps) { }, }); - const onSubmit = async (data: ResourceFormValues) => { - setIsLoading(true); - - try { - const resourceData: CreateResourceRequest = { - status: "PENDING", - category: data.category, - origin_facility: String(props.facilityId), - assigned_facility: data.assigned_facility?.id || null, - approving_facility: null, - emergency: data.emergency === "true", - title: data.title, - reason: data.reason, - referring_facility_contact_name: data.referring_facility_contact_name, - referring_facility_contact_number: - data.referring_facility_contact_number, - related_patient: related_patient, - priority: data.priority, - }; - - const { res, data: responseData } = await request(routes.createResource, { - body: resourceData, - }); - - if (res?.ok && responseData) { - toast.success(t("resource_created_successfully")); - navigate(`/facility/${facilityId}/resource/${responseData.id}`); - } - } catch (error) { - console.error(error); + const { mutate: createResource } = useMutation({ + mutationFn: mutate(routes.createResource), + onSuccess: (data: ResourceRequest) => { + toast.success(t("resource_created_successfully")); + navigate(`/facility/${facilityId}/resource/${data.id}`); + setIsLoading(false); + }, + onError: (_error) => { toast.error(t("something_went_wrong")); - } finally { setIsLoading(false); - } + }, + }); + + const onSubmit = async (data: ResourceFormValues) => { + setIsLoading(true); + const resourceData: CreateResourceRequest = { + status: "PENDING", + category: data.category, + origin_facility: String(props.facilityId), + assigned_facility: data.assigned_facility?.id || null, + approving_facility: null, + emergency: data.emergency === "true", + title: data.title, + reason: data.reason, + referring_facility_contact_name: data.referring_facility_contact_name, + referring_facility_contact_number: data.referring_facility_contact_number, + related_patient: related_patient, + priority: data.priority, + }; + createResource(resourceData); }; const fillMyDetails = () => { diff --git a/src/components/Resource/ResourceDetailsUpdate.tsx b/src/components/Resource/ResourceDetailsUpdate.tsx index d64bd2bc6f0..03e9c1ec3a5 100644 --- a/src/components/Resource/ResourceDetailsUpdate.tsx +++ b/src/components/Resource/ResourceDetailsUpdate.tsx @@ -1,3 +1,4 @@ +import { useMutation } from "@tanstack/react-query"; import { t } from "i18next"; import { navigate, useQueryParams } from "raviger"; import { useReducer, useState } from "react"; @@ -26,7 +27,7 @@ import useAppHistory from "@/hooks/useAppHistory"; import { RESOURCE_STATUS_CHOICES } from "@/common/constants"; import routes from "@/Utils/request/api"; -import request from "@/Utils/request/request"; +import mutate from "@/Utils/request/mutate"; import useTanStackQueryInstead from "@/Utils/request/useQuery"; import { UpdateResourceRequest } from "@/types/resourceRequest/resourceRequest"; @@ -145,6 +146,19 @@ export const ResourceDetailsUpdate = (props: resourceProps) => { }, ); + const { mutate: updateResource } = useMutation({ + mutationFn: mutate(routes.updateResource, { + pathParams: { id: props.id }, + }), + onSuccess: (data) => { + dispatch({ type: "set_form", form: data }); + toast.success(t("request_updated_successfully")); + navigate(`/facility/${props.facilityId}/resource/${props.id}`); + setIsLoading(false); + }, + onError: (_error) => setIsLoading(false), + }); + const handleSubmit = async () => { const validForm = validateForm(); @@ -169,20 +183,7 @@ export const ResourceDetailsUpdate = (props: resourceProps) => { approving_facility: state.form.approving_facility?.id, related_patient: state.form.related_patient?.id, }; - - const { res, data } = await request(routes.updateResource, { - pathParams: { id: props.id }, - body: resourceData, - }); - setIsLoading(false); - - if (res && res.status == 200 && data) { - dispatch({ type: "set_form", form: data }); - toast.success(t("request_updated_successfully")); - navigate(`/facility/${props.facilityId}/resource/${props.id}`); - } else { - setIsLoading(false); - } + updateResource(resourceData); } }; diff --git a/src/components/Users/UserAvatar.tsx b/src/components/Users/UserAvatar.tsx index 74762953e3e..f6a5e48520e 100644 --- a/src/components/Users/UserAvatar.tsx +++ b/src/components/Users/UserAvatar.tsx @@ -15,8 +15,7 @@ import useAuthUser from "@/hooks/useAuthUser"; import { showAvatarEdit } from "@/Utils/permissions"; import routes from "@/Utils/request/api"; -import query from "@/Utils/request/query"; -import request from "@/Utils/request/request"; +import query, { callApi } from "@/Utils/request/query"; import uploadFile from "@/Utils/request/uploadFile"; import { getAuthorizationHeader } from "@/Utils/request/utils"; import { formatDisplayName, sleep } from "@/Utils/utils"; @@ -66,10 +65,10 @@ export default function UserAvatar({ username }: { username: string }) { }; const handleAvatarDelete = async (onError: () => void) => { - const { res } = await request(routes.deleteProfilePicture, { + const response = await callApi(routes.deleteProfilePicture, { pathParams: { username }, }); - if (res?.ok) { + if (response) { queryClient.invalidateQueries({ queryKey: ["currentUser"] }); toast.success(t("profile_picture_deleted")); setEditAvatar(false); diff --git a/src/pages/PublicAppointments/auth/PatientLogin.tsx b/src/pages/PublicAppointments/auth/PatientLogin.tsx index 42390f1f4ba..24f2c3393a9 100644 --- a/src/pages/PublicAppointments/auth/PatientLogin.tsx +++ b/src/pages/PublicAppointments/auth/PatientLogin.tsx @@ -33,7 +33,6 @@ import { useAuthContext } from "@/hooks/useAuthUser"; import routes from "@/Utils/request/api"; import mutate from "@/Utils/request/mutate"; -import request from "@/Utils/request/request"; import { HTTPError } from "@/Utils/request/types"; import { TokenData } from "@/types/auth/otpToken"; @@ -76,13 +75,7 @@ export default function PatientLogin({ } const { mutate: sendOTP, isPending: isSendOTPLoading } = useMutation({ - mutationFn: (phoneNumber: string) => - request(routes.otp.sendOtp, { - body: { - phone_number: phoneNumber, - }, - silent: true, - }), + mutationFn: mutate(routes.otp.sendOtp), onSuccess: () => { if (page === "send") { navigate(`/facility/${facilityId}/appointments/${staffId}/otp/verify`); @@ -99,7 +92,7 @@ export default function PatientLogin({ setError(t("phone_number_validation_error")); return; } - sendOTP(phoneNumber); + sendOTP({ phone_number: phoneNumber }); }; const { mutate: verifyOTP, isPending: isVerifyOTPLoading } = useMutation({ @@ -245,7 +238,7 @@ export default function PatientLogin({ sendOTP(phoneNumber)} + onClick={() => sendOTP({ phone_number: phoneNumber })} > {t("didnt_receive_a_message")} {t("resend_otp")} From 655baff0eb8690a6b4194332f8bc51d02f2a234b Mon Sep 17 00:00:00 2001 From: AdityaJ2305 Date: Sun, 2 Feb 2025 03:55:03 +0530 Subject: [PATCH 03/27] discard changes in ResourceDetailsUpdate --- .../Resource/ResourceDetailsUpdate.tsx | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/components/Resource/ResourceDetailsUpdate.tsx b/src/components/Resource/ResourceDetailsUpdate.tsx index 03e9c1ec3a5..d64bd2bc6f0 100644 --- a/src/components/Resource/ResourceDetailsUpdate.tsx +++ b/src/components/Resource/ResourceDetailsUpdate.tsx @@ -1,4 +1,3 @@ -import { useMutation } from "@tanstack/react-query"; import { t } from "i18next"; import { navigate, useQueryParams } from "raviger"; import { useReducer, useState } from "react"; @@ -27,7 +26,7 @@ import useAppHistory from "@/hooks/useAppHistory"; import { RESOURCE_STATUS_CHOICES } from "@/common/constants"; import routes from "@/Utils/request/api"; -import mutate from "@/Utils/request/mutate"; +import request from "@/Utils/request/request"; import useTanStackQueryInstead from "@/Utils/request/useQuery"; import { UpdateResourceRequest } from "@/types/resourceRequest/resourceRequest"; @@ -146,19 +145,6 @@ export const ResourceDetailsUpdate = (props: resourceProps) => { }, ); - const { mutate: updateResource } = useMutation({ - mutationFn: mutate(routes.updateResource, { - pathParams: { id: props.id }, - }), - onSuccess: (data) => { - dispatch({ type: "set_form", form: data }); - toast.success(t("request_updated_successfully")); - navigate(`/facility/${props.facilityId}/resource/${props.id}`); - setIsLoading(false); - }, - onError: (_error) => setIsLoading(false), - }); - const handleSubmit = async () => { const validForm = validateForm(); @@ -183,7 +169,20 @@ export const ResourceDetailsUpdate = (props: resourceProps) => { approving_facility: state.form.approving_facility?.id, related_patient: state.form.related_patient?.id, }; - updateResource(resourceData); + + const { res, data } = await request(routes.updateResource, { + pathParams: { id: props.id }, + body: resourceData, + }); + setIsLoading(false); + + if (res && res.status == 200 && data) { + dispatch({ type: "set_form", form: data }); + toast.success(t("request_updated_successfully")); + navigate(`/facility/${props.facilityId}/resource/${props.id}`); + } else { + setIsLoading(false); + } } }; From 841d281a75767ed7ffa20be5b1c329d0ae450fac Mon Sep 17 00:00:00 2001 From: AdityaJ2305 Date: Sun, 2 Feb 2025 03:59:39 +0530 Subject: [PATCH 04/27] rm loading state from resource create --- src/components/Resource/ResourceCreate.tsx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/components/Resource/ResourceCreate.tsx b/src/components/Resource/ResourceCreate.tsx index 1cb23986c2a..1e53ed89719 100644 --- a/src/components/Resource/ResourceCreate.tsx +++ b/src/components/Resource/ResourceCreate.tsx @@ -1,7 +1,6 @@ import { zodResolver } from "@hookform/resolvers/zod"; import { useMutation, useQuery } from "@tanstack/react-query"; import { navigate, useQueryParams } from "raviger"; -import { useState } from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; @@ -60,7 +59,6 @@ export default function ResourceCreate(props: ResourceProps) { const { goBack } = useAppHistory(); const { facilityId } = props; const { t } = useTranslation(); - const [isLoading, setIsLoading] = useState(false); const [{ related_patient }] = useQueryParams(); const authUser = useAuthUser(); @@ -107,21 +105,18 @@ export default function ResourceCreate(props: ResourceProps) { }, }); - const { mutate: createResource } = useMutation({ + const { mutate: createResource, isPending } = useMutation({ mutationFn: mutate(routes.createResource), onSuccess: (data: ResourceRequest) => { toast.success(t("resource_created_successfully")); navigate(`/facility/${facilityId}/resource/${data.id}`); - setIsLoading(false); }, onError: (_error) => { toast.error(t("something_went_wrong")); - setIsLoading(false); }, }); const onSubmit = async (data: ResourceFormValues) => { - setIsLoading(true); const resourceData: CreateResourceRequest = { status: "PENDING", category: data.category, @@ -149,7 +144,7 @@ export default function ResourceCreate(props: ResourceProps) { } }; - if (isLoading) { + if (isPending) { return ; } @@ -413,8 +408,14 @@ export default function ResourceCreate(props: ResourceProps) { > {t("cancel")} - From a23757d03070fe099b89b273270c0500bbaa7b16 Mon Sep 17 00:00:00 2001 From: AdityaJ2305 Date: Sun, 2 Feb 2025 04:31:13 +0530 Subject: [PATCH 05/27] rm deprecated request --- src/Providers/AuthUserProvider.tsx | 36 +++++++++++++----------- src/Utils/request/query.ts | 2 ++ src/components/Auth/Login.tsx | 4 +-- src/components/Facility/FacilityHome.tsx | 12 ++++---- src/components/Users/UserSummary.tsx | 4 +-- src/hooks/useAuthUser.ts | 5 ++-- 6 files changed, 33 insertions(+), 30 deletions(-) diff --git a/src/Providers/AuthUserProvider.tsx b/src/Providers/AuthUserProvider.tsx index 7b94ba73e4a..b5a430c191a 100644 --- a/src/Providers/AuthUserProvider.tsx +++ b/src/Providers/AuthUserProvider.tsx @@ -10,8 +10,7 @@ import { AuthUserContext } from "@/hooks/useAuthUser"; import { LocalStorageKeys } from "@/common/constants"; import routes from "@/Utils/request/api"; -import query from "@/Utils/request/query"; -import request from "@/Utils/request/request"; +import query, { callApi } from "@/Utils/request/query"; import { TokenData } from "@/types/auth/otpToken"; interface Props { @@ -56,12 +55,12 @@ export default function AuthUserProvider({ const signIn = useCallback( async (creds: { username: string; password: string }) => { - const query = await request(routes.login, { body: creds }); + const data = await callApi(routes.login, { body: creds }); - if (query.res?.ok && query.data) { - setAccessToken(query.data.access); - localStorage.setItem(LocalStorageKeys.accessToken, query.data.access); - localStorage.setItem(LocalStorageKeys.refreshToken, query.data.refresh); + if (data?.access && data?.refresh) { + setAccessToken(data.access); + localStorage.setItem(LocalStorageKeys.accessToken, data.access); + localStorage.setItem(LocalStorageKeys.refreshToken, data.refresh); await queryClient.invalidateQueries({ queryKey: ["currentUser"] }); @@ -70,7 +69,7 @@ export default function AuthUserProvider({ } } - return query; + return data; }, [queryClient], ); @@ -155,19 +154,22 @@ const updateRefreshToken = async (silent = false) => { return; } - const { res, data } = await request(routes.token_refresh, { - body: { refresh }, - silent, - }); + try { + const data = await callApi(routes.token_refresh, { + body: { refresh }, + silent, + }); + + if (!data) { + throw new Error("Token refresh failed"); + } - if (res?.status !== 200 || !data) { + localStorage.setItem(LocalStorageKeys.accessToken, data.access); + localStorage.setItem(LocalStorageKeys.refreshToken, data.refresh); + } catch { localStorage.removeItem(LocalStorageKeys.accessToken); localStorage.removeItem(LocalStorageKeys.refreshToken); - return; } - - localStorage.setItem(LocalStorageKeys.accessToken, data.access); - localStorage.setItem(LocalStorageKeys.refreshToken, data.refresh); }; const getRedirectURL = () => { diff --git a/src/Utils/request/query.ts b/src/Utils/request/query.ts index 68a4e1b0bba..78ec6c8e872 100644 --- a/src/Utils/request/query.ts +++ b/src/Utils/request/query.ts @@ -5,6 +5,8 @@ import { ApiCallOptions, ApiRoute, HTTPError } from "@/Utils/request/types"; import { makeHeaders, makeUrl } from "@/Utils/request/utils"; import { sleep } from "@/Utils/utils"; +export type ApiResponse = TData; + export async function callApi>( { path, method, noAuth }: Route, options?: ApiCallOptions, diff --git a/src/components/Auth/Login.tsx b/src/components/Auth/Login.tsx index efe1a6a3f73..3264a9079ef 100644 --- a/src/components/Auth/Login.tsx +++ b/src/components/Auth/Login.tsx @@ -102,8 +102,8 @@ const Login = (props: LoginProps) => { FiltersCache.invaldiateAll(); return await signIn(data); }, - onSuccess: ({ res }) => { - setCaptcha(res?.status === 429); + onSuccess: (res) => { + setCaptcha(!!res?.access); }, }); diff --git a/src/components/Facility/FacilityHome.tsx b/src/components/Facility/FacilityHome.tsx index c8705a4738d..5c7042a44dd 100644 --- a/src/components/Facility/FacilityHome.tsx +++ b/src/components/Facility/FacilityHome.tsx @@ -34,7 +34,6 @@ import { FACILITY_FEATURE_TYPES } from "@/common/constants"; import { PLUGIN_Component } from "@/PluginEngine"; import routes from "@/Utils/request/api"; import query, { callApi } from "@/Utils/request/query"; -import request from "@/Utils/request/request"; import uploadFile from "@/Utils/request/uploadFile"; import { getAuthorizationHeader } from "@/Utils/request/utils"; import { sleep } from "@/Utils/utils"; @@ -150,16 +149,17 @@ export const FacilityHome = ({ facilityId }: Props) => { }; const handleCoverImageDelete = async (onError: () => void) => { - const { res } = await request(routes.deleteFacilityCoverImage, { - pathParams: { id: facilityId }, - }); - if (res?.ok) { + try { + await callApi(routes.deleteFacilityCoverImage, { + pathParams: { id: facilityId }, + }); + toast.success(t("cover_image_deleted")); queryClient.invalidateQueries({ queryKey: ["facility", facilityId], }); setEditCoverImage(false); - } else { + } catch { onError(); } }; diff --git a/src/components/Users/UserSummary.tsx b/src/components/Users/UserSummary.tsx index 6a3a5cb83a8..5cbd504d050 100644 --- a/src/components/Users/UserSummary.tsx +++ b/src/components/Users/UserSummary.tsx @@ -28,7 +28,7 @@ import { showUserPasswordReset, } from "@/Utils/permissions"; import routes from "@/Utils/request/api"; -import request from "@/Utils/request/request"; +import { callApi } from "@/Utils/request/query"; import EditUserSheet from "@/pages/Organization/components/EditUserSheet"; import { UserBase } from "@/types/user/user"; @@ -40,7 +40,7 @@ export default function UserSummaryTab({ userData }: { userData?: UserBase }) { const { mutate: deleteUser, isPending: isDeleting } = useMutation({ mutationFn: async () => { - return await request(routes.deleteUser, { + return await callApi(routes.deleteUser, { pathParams: { username: userData?.username || "" }, }); }, diff --git a/src/hooks/useAuthUser.ts b/src/hooks/useAuthUser.ts index 38cdddc16b3..eda7c939d2f 100644 --- a/src/hooks/useAuthUser.ts +++ b/src/hooks/useAuthUser.ts @@ -3,11 +3,10 @@ import { createContext, useContext } from "react"; import { UserModel } from "@/components/Users/models"; import { JwtTokenObtainPair, LoginCredentials } from "@/Utils/request/api"; -import { RequestResult } from "@/Utils/request/types"; +import { ApiResponse } from "@/Utils/request/query"; import { TokenData } from "@/types/auth/otpToken"; -type SignInReturnType = RequestResult; - +type SignInReturnType = ApiResponse; interface AuthContextType { user: UserModel | undefined; signIn: (creds: LoginCredentials) => Promise; From c953fd38fc1deefcaa567418801da896d7d3135d Mon Sep 17 00:00:00 2001 From: AdityaJ2305 Date: Sun, 2 Feb 2025 04:47:51 +0530 Subject: [PATCH 06/27] coderabbit suggestion --- public/locale/en.json | 1 + src/components/Facility/FacilityHome.tsx | 16 ++++++++++------ src/components/Users/UserAvatar.tsx | 19 +++++++++++-------- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/public/locale/en.json b/public/locale/en.json index 79525b6771b..14a4b93460a 100644 --- a/public/locale/en.json +++ b/public/locale/en.json @@ -683,6 +683,7 @@ "delete_facility": "Delete Facility", "delete_item": "Delete {{name}}", "delete_record": "Delete Record", + "deleted_failed": "{{name}} deleted failed", "deleted_successfully": "{{name}} deleted successfully", "deleting": "Deleting...", "demography": "Demography", diff --git a/src/components/Facility/FacilityHome.tsx b/src/components/Facility/FacilityHome.tsx index 5c7042a44dd..ddec196a37d 100644 --- a/src/components/Facility/FacilityHome.tsx +++ b/src/components/Facility/FacilityHome.tsx @@ -110,12 +110,16 @@ export const FacilityHome = ({ facilityId }: Props) => { }; const handleDeleteSubmit = async () => { - const res = await callApi(routes.deleteFacility, { - pathParams: { id: facilityId }, - }); - if (res) { - toast.success(t("deleted_successfully", { name: facilityData?.name })); - navigate("/facility"); + try { + const res = await callApi(routes.deleteFacility, { + pathParams: { id: facilityId }, + }); + if (res) { + toast.success(t("deleted_successfully", { name: facilityData?.name })); + navigate("/facility"); + } + } catch (_error) { + toast.error(t("delete_failed", { name: facilityData?.name })); } }; diff --git a/src/components/Users/UserAvatar.tsx b/src/components/Users/UserAvatar.tsx index f6a5e48520e..5b9d3718675 100644 --- a/src/components/Users/UserAvatar.tsx +++ b/src/components/Users/UserAvatar.tsx @@ -65,14 +65,17 @@ export default function UserAvatar({ username }: { username: string }) { }; const handleAvatarDelete = async (onError: () => void) => { - const response = await callApi(routes.deleteProfilePicture, { - pathParams: { username }, - }); - if (response) { - queryClient.invalidateQueries({ queryKey: ["currentUser"] }); - toast.success(t("profile_picture_deleted")); - setEditAvatar(false); - } else { + try { + const response = await callApi(routes.deleteProfilePicture, { + pathParams: { username }, + }); + + if (response) { + queryClient.invalidateQueries({ queryKey: ["currentUser"] }); + toast.success(t("profile_picture_deleted")); + setEditAvatar(false); + } + } catch (_error) { onError(); } }; From 98d1c2b8ab01152ae06c3b6c9abe7d914ac9f4a3 Mon Sep 17 00:00:00 2001 From: AdityaJ2305 Date: Sun, 2 Feb 2025 04:57:29 +0530 Subject: [PATCH 07/27] grammatical mistake --- public/locale/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locale/en.json b/public/locale/en.json index 14a4b93460a..cce1d925881 100644 --- a/public/locale/en.json +++ b/public/locale/en.json @@ -683,9 +683,9 @@ "delete_facility": "Delete Facility", "delete_item": "Delete {{name}}", "delete_record": "Delete Record", - "deleted_failed": "{{name}} deleted failed", "deleted_successfully": "{{name}} deleted successfully", "deleting": "Deleting...", + "deletion_failed": "Failed to delete {{name}}", "demography": "Demography", "denied_on": "Denied On", "departments": "Departments", From e15a5f00469ac01625951a4fcf5f848b4ad5f45c Mon Sep 17 00:00:00 2001 From: AdityaJ2305 Date: Mon, 3 Feb 2025 16:11:12 +0530 Subject: [PATCH 08/27] replace callApi with mutate --- src/components/Auth/ResetPassword.tsx | 57 ++++++++++------------ src/components/Facility/FacilityHome.tsx | 31 ++++++------ src/components/Resource/ResourceCreate.tsx | 10 ++-- src/components/Users/UserSummary.tsx | 9 ++-- 4 files changed, 49 insertions(+), 58 deletions(-) diff --git a/src/components/Auth/ResetPassword.tsx b/src/components/Auth/ResetPassword.tsx index 2e938f8fd9b..93d30133ee4 100644 --- a/src/components/Auth/ResetPassword.tsx +++ b/src/components/Auth/ResetPassword.tsx @@ -1,5 +1,6 @@ +import { useMutation, useQuery } from "@tanstack/react-query"; import { navigate } from "raviger"; -import { useEffect, useState } from "react"; +import { useState } from "react"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; @@ -12,7 +13,8 @@ import { LocalStorageKeys } from "@/common/constants"; import { validatePassword } from "@/common/validation"; import routes from "@/Utils/request/api"; -import { callApi } from "@/Utils/request/query"; +import mutate from "@/Utils/request/mutate"; +import query from "@/Utils/request/query"; interface ResetPasswordProps { token: string; @@ -69,46 +71,37 @@ const ResetPassword = (props: ResetPasswordProps) => { } return form; }; + const { mutate: resetPassword } = useMutation({ + mutationFn: mutate(routes.resetPassword), + onSuccess: (_data) => { + localStorage.removeItem(LocalStorageKeys.accessToken); + toast.success(t("password_reset_success")); + navigate("/login"); + }, + onError: (error) => { + if (error.cause) { + setErrors(error.cause); + } + }, + }); const handleSubmit = async (e: any) => { e.preventDefault(); const valid = validateData(); if (valid) { valid.token = props.token; - - try { - await callApi(routes.resetPassword, { - body: { ...valid }, - }); - - localStorage.removeItem(LocalStorageKeys.accessToken); - toast.success(t("password_reset_success")); - navigate("/login"); - } catch (error: any) { - if (error.cause) { - setErrors(error.cause); - } - } + resetPassword(valid); } }; - useEffect(() => { - const checkResetToken = async () => { - try { - await callApi(routes.checkResetToken, { - body: { token: props.token }, - }); - } catch { - navigate("/invalid-reset"); - } - }; + const { isError } = useQuery({ + queryKey: ["checkResetToken", { token: props.token }], + queryFn: () => + query(routes.checkResetToken, { body: { token: props.token } }), + enabled: !!props.token, + }); - if (props.token) { - checkResetToken(); - } else { - navigate("/invalid-reset"); - } - }, []); + if (isError) navigate("/invalid-reset"); return (
diff --git a/src/components/Facility/FacilityHome.tsx b/src/components/Facility/FacilityHome.tsx index ddec196a37d..899f78599a2 100644 --- a/src/components/Facility/FacilityHome.tsx +++ b/src/components/Facility/FacilityHome.tsx @@ -6,6 +6,7 @@ import { TooltipTrigger, } from "@radix-ui/react-tooltip"; import { useQuery, useQueryClient } from "@tanstack/react-query"; +import { useMutation } from "@tanstack/react-query"; import { Hospital, MapPin, MoreVertical, Settings } from "lucide-react"; import { navigate } from "raviger"; import { useState } from "react"; @@ -33,6 +34,7 @@ import { FACILITY_FEATURE_TYPES } from "@/common/constants"; import { PLUGIN_Component } from "@/PluginEngine"; import routes from "@/Utils/request/api"; +import mutate from "@/Utils/request/mutate"; import query, { callApi } from "@/Utils/request/query"; import uploadFile from "@/Utils/request/uploadFile"; import { getAuthorizationHeader } from "@/Utils/request/utils"; @@ -104,23 +106,24 @@ export const FacilityHome = ({ facilityId }: Props) => { pathParams: { id: facilityId }, }), }); + const { mutate: deleteFacility } = useMutation({ + mutationFn: () => + mutate(routes.deleteFacility, { pathParams: { id: facilityId } })(null), + onSuccess: () => { + toast.success(t("deleted_successfully", { name: facilityData?.name })); + navigate("/facility"); + }, + onError: () => { + toast.error(t("delete_failed", { name: facilityData?.name })); + }, + }); - const handleDeleteClose = () => { - setOpenDeleteDialog(false); + const handleDeleteSubmit = () => { + deleteFacility(); }; - const handleDeleteSubmit = async () => { - try { - const res = await callApi(routes.deleteFacility, { - pathParams: { id: facilityId }, - }); - if (res) { - toast.success(t("deleted_successfully", { name: facilityData?.name })); - navigate("/facility"); - } - } catch (_error) { - toast.error(t("delete_failed", { name: facilityData?.name })); - } + const handleDeleteClose = () => { + setOpenDeleteDialog(false); }; const handleCoverImageUpload = async (file: File, onError: () => void) => { diff --git a/src/components/Resource/ResourceCreate.tsx b/src/components/Resource/ResourceCreate.tsx index 1e53ed89719..640d73e3dce 100644 --- a/src/components/Resource/ResourceCreate.tsx +++ b/src/components/Resource/ResourceCreate.tsx @@ -46,10 +46,7 @@ import routes from "@/Utils/request/api"; import mutate from "@/Utils/request/mutate"; import query from "@/Utils/request/query"; import validators from "@/Utils/validators"; -import { - CreateResourceRequest, - ResourceRequest, -} from "@/types/resourceRequest/resourceRequest"; +import { ResourceRequest } from "@/types/resourceRequest/resourceRequest"; interface ResourceProps { facilityId: number; @@ -117,7 +114,7 @@ export default function ResourceCreate(props: ResourceProps) { }); const onSubmit = async (data: ResourceFormValues) => { - const resourceData: CreateResourceRequest = { + createResource({ status: "PENDING", category: data.category, origin_facility: String(props.facilityId), @@ -130,8 +127,7 @@ export default function ResourceCreate(props: ResourceProps) { referring_facility_contact_number: data.referring_facility_contact_number, related_patient: related_patient, priority: data.priority, - }; - createResource(resourceData); + }); }; const fillMyDetails = () => { diff --git a/src/components/Users/UserSummary.tsx b/src/components/Users/UserSummary.tsx index 5cbd504d050..b2f4a3c1eea 100644 --- a/src/components/Users/UserSummary.tsx +++ b/src/components/Users/UserSummary.tsx @@ -28,7 +28,7 @@ import { showUserPasswordReset, } from "@/Utils/permissions"; import routes from "@/Utils/request/api"; -import { callApi } from "@/Utils/request/query"; +import mutate from "@/Utils/request/mutate"; import EditUserSheet from "@/pages/Organization/components/EditUserSheet"; import { UserBase } from "@/types/user/user"; @@ -39,11 +39,10 @@ export default function UserSummaryTab({ userData }: { userData?: UserBase }) { const [showEditUserSheet, setShowEditUserSheet] = useState(false); const { mutate: deleteUser, isPending: isDeleting } = useMutation({ - mutationFn: async () => { - return await callApi(routes.deleteUser, { + mutationFn: () => + mutate(routes.deleteUser, { pathParams: { username: userData?.username || "" }, - }); - }, + })(null), onSuccess: () => { toast.success(t("user_deleted_successfully")); setshowDeleteDialog(false); From a7ce09b687b4ee3a239f1266897b259d3f68c568 Mon Sep 17 00:00:00 2001 From: AdityaJ2305 Date: Mon, 3 Feb 2025 16:29:14 +0530 Subject: [PATCH 09/27] pending replacement done --- src/components/Facility/FacilityHome.tsx | 6 +++--- src/components/Users/UserAvatar.tsx | 16 +++++++--------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/components/Facility/FacilityHome.tsx b/src/components/Facility/FacilityHome.tsx index 899f78599a2..11bc9af2298 100644 --- a/src/components/Facility/FacilityHome.tsx +++ b/src/components/Facility/FacilityHome.tsx @@ -35,7 +35,7 @@ import { FACILITY_FEATURE_TYPES } from "@/common/constants"; import { PLUGIN_Component } from "@/PluginEngine"; import routes from "@/Utils/request/api"; import mutate from "@/Utils/request/mutate"; -import query, { callApi } from "@/Utils/request/query"; +import query from "@/Utils/request/query"; import uploadFile from "@/Utils/request/uploadFile"; import { getAuthorizationHeader } from "@/Utils/request/utils"; import { sleep } from "@/Utils/utils"; @@ -157,9 +157,9 @@ export const FacilityHome = ({ facilityId }: Props) => { const handleCoverImageDelete = async (onError: () => void) => { try { - await callApi(routes.deleteFacilityCoverImage, { + await mutate(routes.deleteFacilityCoverImage, { pathParams: { id: facilityId }, - }); + })({}); toast.success(t("cover_image_deleted")); queryClient.invalidateQueries({ diff --git a/src/components/Users/UserAvatar.tsx b/src/components/Users/UserAvatar.tsx index 5b9d3718675..7bb3990b2e8 100644 --- a/src/components/Users/UserAvatar.tsx +++ b/src/components/Users/UserAvatar.tsx @@ -15,7 +15,8 @@ import useAuthUser from "@/hooks/useAuthUser"; import { showAvatarEdit } from "@/Utils/permissions"; import routes from "@/Utils/request/api"; -import query, { callApi } from "@/Utils/request/query"; +import mutate from "@/Utils/request/mutate"; +import query from "@/Utils/request/query"; import uploadFile from "@/Utils/request/uploadFile"; import { getAuthorizationHeader } from "@/Utils/request/utils"; import { formatDisplayName, sleep } from "@/Utils/utils"; @@ -66,20 +67,17 @@ export default function UserAvatar({ username }: { username: string }) { const handleAvatarDelete = async (onError: () => void) => { try { - const response = await callApi(routes.deleteProfilePicture, { + await mutate(routes.deleteProfilePicture, { pathParams: { username }, - }); + })(null); - if (response) { - queryClient.invalidateQueries({ queryKey: ["currentUser"] }); - toast.success(t("profile_picture_deleted")); - setEditAvatar(false); - } + queryClient.invalidateQueries({ queryKey: ["currentUser"] }); + toast.success(t("profile_picture_deleted")); + setEditAvatar(false); } catch (_error) { onError(); } }; - return ( <> Date: Mon, 3 Feb 2025 16:36:50 +0530 Subject: [PATCH 10/27] coderabbit suggestion --- src/components/Facility/FacilityHome.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Facility/FacilityHome.tsx b/src/components/Facility/FacilityHome.tsx index 11bc9af2298..873969fffa8 100644 --- a/src/components/Facility/FacilityHome.tsx +++ b/src/components/Facility/FacilityHome.tsx @@ -159,7 +159,7 @@ export const FacilityHome = ({ facilityId }: Props) => { try { await mutate(routes.deleteFacilityCoverImage, { pathParams: { id: facilityId }, - })({}); + })(null); toast.success(t("cover_image_deleted")); queryClient.invalidateQueries({ From e3308bf627886a4dd3e3635baa7854a5350d49c1 Mon Sep 17 00:00:00 2001 From: AdityaJ2305 Date: Mon, 3 Feb 2025 16:44:57 +0530 Subject: [PATCH 11/27] Empty-Commit From 379ade16fd1d9ee99139e8f76d2c7b8423e0e1e1 Mon Sep 17 00:00:00 2001 From: AdityaJ2305 Date: Tue, 4 Feb 2025 05:32:52 +0530 Subject: [PATCH 12/27] discard ResourcesCommentSection --- .../Resource/ResourceCommentSection.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/components/Resource/ResourceCommentSection.tsx b/src/components/Resource/ResourceCommentSection.tsx index 1dd2a942a27..24adeba890b 100644 --- a/src/components/Resource/ResourceCommentSection.tsx +++ b/src/components/Resource/ResourceCommentSection.tsx @@ -1,4 +1,3 @@ -import { useMutation } from "@tanstack/react-query"; import { t } from "i18next"; import { useState } from "react"; import { toast } from "sonner"; @@ -12,18 +11,13 @@ import { Avatar } from "@/components/Common/Avatar"; import CircularProgress from "@/components/Common/CircularProgress"; import routes from "@/Utils/request/api"; -import mutate from "@/Utils/request/mutate"; +import request from "@/Utils/request/request"; import { formatName, relativeTime } from "@/Utils/utils"; import { CommentModel } from "@/types/resourceRequest/resourceRequest"; const CommentSection = (props: { id: string }) => { const [commentBox, setCommentBox] = useState(""); - const { mutate: addResourceComments } = useMutation({ - mutationFn: mutate(routes.addResourceComments, { - pathParams: { id: props.id }, - }), - onSuccess: () => toast.success(t("comment_added_successfully")), - }); + const onSubmitComment = async () => { const payload = { comment: commentBox, @@ -32,7 +26,13 @@ const CommentSection = (props: { id: string }) => { toast.error(t("comment_min_length")); return; } - addResourceComments(payload); + const { res } = await request(routes.addResourceComments, { + pathParams: { id: props.id }, + body: payload, + }); + if (res?.ok) { + toast.success(t("comment_added_successfully")); + } setCommentBox(""); }; return ( From f815c0829128d95994d1efe253f72181535622de Mon Sep 17 00:00:00 2001 From: AdityaJ2305 Date: Tue, 4 Feb 2025 16:33:18 +0530 Subject: [PATCH 13/27] pushed minor requested changes in all files --- src/components/Auth/ResetPassword.tsx | 2 +- src/components/Facility/FacilityHome.tsx | 9 +-------- src/components/Resource/ResourceCreate.tsx | 5 +---- src/components/Users/UserAvatar.tsx | 2 +- src/pages/PublicAppointments/auth/PatientLogin.tsx | 11 ----------- 5 files changed, 4 insertions(+), 25 deletions(-) diff --git a/src/components/Auth/ResetPassword.tsx b/src/components/Auth/ResetPassword.tsx index 93d30133ee4..d58330ec633 100644 --- a/src/components/Auth/ResetPassword.tsx +++ b/src/components/Auth/ResetPassword.tsx @@ -73,7 +73,7 @@ const ResetPassword = (props: ResetPasswordProps) => { }; const { mutate: resetPassword } = useMutation({ mutationFn: mutate(routes.resetPassword), - onSuccess: (_data) => { + onSuccess: () => { localStorage.removeItem(LocalStorageKeys.accessToken); toast.success(t("password_reset_success")); navigate("/login"); diff --git a/src/components/Facility/FacilityHome.tsx b/src/components/Facility/FacilityHome.tsx index 873969fffa8..c278b8ac348 100644 --- a/src/components/Facility/FacilityHome.tsx +++ b/src/components/Facility/FacilityHome.tsx @@ -113,19 +113,12 @@ export const FacilityHome = ({ facilityId }: Props) => { toast.success(t("deleted_successfully", { name: facilityData?.name })); navigate("/facility"); }, - onError: () => { - toast.error(t("delete_failed", { name: facilityData?.name })); - }, }); const handleDeleteSubmit = () => { deleteFacility(); }; - const handleDeleteClose = () => { - setOpenDeleteDialog(false); - }; - const handleCoverImageUpload = async (file: File, onError: () => void) => { const formData = new FormData(); formData.append("cover_image", file); @@ -198,7 +191,7 @@ export const FacilityHome = ({ facilityId }: Props) => { action="Delete" variant="destructive" show={openDeleteDialog} - onClose={handleDeleteClose} + onClose={() => setOpenDeleteDialog(false)} onConfirm={handleDeleteSubmit} /> { - toast.error(t("something_went_wrong")); - }, }); - const onSubmit = async (data: ResourceFormValues) => { + const onSubmit = (data: ResourceFormValues) => { createResource({ status: "PENDING", category: data.category, diff --git a/src/components/Users/UserAvatar.tsx b/src/components/Users/UserAvatar.tsx index 7bb3990b2e8..acd86b512c3 100644 --- a/src/components/Users/UserAvatar.tsx +++ b/src/components/Users/UserAvatar.tsx @@ -74,7 +74,7 @@ export default function UserAvatar({ username }: { username: string }) { queryClient.invalidateQueries({ queryKey: ["currentUser"] }); toast.success(t("profile_picture_deleted")); setEditAvatar(false); - } catch (_error) { + } catch { onError(); } }; diff --git a/src/pages/PublicAppointments/auth/PatientLogin.tsx b/src/pages/PublicAppointments/auth/PatientLogin.tsx index 24f2c3393a9..bed59e4ab5e 100644 --- a/src/pages/PublicAppointments/auth/PatientLogin.tsx +++ b/src/pages/PublicAppointments/auth/PatientLogin.tsx @@ -6,7 +6,6 @@ import { useState } from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { isValidPhoneNumber } from "react-phone-number-input"; -import { toast } from "sonner"; import { z } from "zod"; import { Button } from "@/components/ui/button"; @@ -33,7 +32,6 @@ import { useAuthContext } from "@/hooks/useAuthUser"; import routes from "@/Utils/request/api"; import mutate from "@/Utils/request/mutate"; -import { HTTPError } from "@/Utils/request/types"; import { TokenData } from "@/types/auth/otpToken"; const FormSchema = z.object({ @@ -81,9 +79,6 @@ export default function PatientLogin({ navigate(`/facility/${facilityId}/appointments/${staffId}/otp/verify`); } }, - onError: () => { - toast.error(t("error_sending_otp")); - }, }); const handleSubmit = async (e: React.FormEvent) => { @@ -125,12 +120,6 @@ export default function PatientLogin({ ); } }, - onError: (error: HTTPError) => { - const errorData = error.cause as { errors: Array<{ otp: string }> }; - const errorMessage = - errorData?.errors?.[0]?.otp || t("error_verifying_otp"); - toast.error(errorMessage); - }, }); const handleVerifySubmit = async (data: z.infer) => { From ed7102455535ddab37e2745b3f8a8b2fe9ffdaca Mon Sep 17 00:00:00 2001 From: AdityaJ2305 Date: Tue, 4 Feb 2025 17:00:17 +0530 Subject: [PATCH 14/27] update Tbody to void --- src/Providers/AuthUserProvider.tsx | 9 +++++++-- src/Utils/request/api.tsx | 1 + src/components/Users/UserSummary.tsx | 17 ++++++++--------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/Providers/AuthUserProvider.tsx b/src/Providers/AuthUserProvider.tsx index b5a430c191a..39d7a76e2a9 100644 --- a/src/Providers/AuthUserProvider.tsx +++ b/src/Providers/AuthUserProvider.tsx @@ -1,5 +1,5 @@ import careConfig from "@careConfig"; -import { useQuery, useQueryClient } from "@tanstack/react-query"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { navigate } from "raviger"; import { useCallback, useEffect, useState } from "react"; @@ -10,6 +10,7 @@ import { AuthUserContext } from "@/hooks/useAuthUser"; import { LocalStorageKeys } from "@/common/constants"; import routes from "@/Utils/request/api"; +import mutate from "@/Utils/request/mutate"; import query, { callApi } from "@/Utils/request/query"; import { TokenData } from "@/types/auth/otpToken"; @@ -53,9 +54,13 @@ export default function AuthUserProvider({ ); }, [user]); + const { mutateAsync: signInMutate } = useMutation({ + mutationFn: mutate(routes.login), + }); + const signIn = useCallback( async (creds: { username: string; password: string }) => { - const data = await callApi(routes.login, { body: creds }); + const data = await signInMutate(creds); if (data?.access && data?.refresh) { setAccessToken(data.access); diff --git a/src/Utils/request/api.tsx b/src/Utils/request/api.tsx index 45eddeedb24..ea0c6a8e3ca 100644 --- a/src/Utils/request/api.tsx +++ b/src/Utils/request/api.tsx @@ -173,6 +173,7 @@ const routes = { path: "/api/v1/users/{username}/", method: "DELETE", TRes: Type>(), + TBody: Type(), }, // Facility Endpoints diff --git a/src/components/Users/UserSummary.tsx b/src/components/Users/UserSummary.tsx index b2f4a3c1eea..10c6dca9d42 100644 --- a/src/components/Users/UserSummary.tsx +++ b/src/components/Users/UserSummary.tsx @@ -34,22 +34,21 @@ import { UserBase } from "@/types/user/user"; export default function UserSummaryTab({ userData }: { userData?: UserBase }) { const { t } = useTranslation(); - const [showDeleteDialog, setshowDeleteDialog] = useState(false); + const [showDeleteDialog, setShowDeleteDialog] = useState(false); const authUser = useAuthUser(); const [showEditUserSheet, setShowEditUserSheet] = useState(false); const { mutate: deleteUser, isPending: isDeleting } = useMutation({ - mutationFn: () => - mutate(routes.deleteUser, { - pathParams: { username: userData?.username || "" }, - })(null), + mutationFn: mutate(routes.deleteUser, { + pathParams: { username: userData?.username || "" }, + }), onSuccess: () => { toast.success(t("user_deleted_successfully")); - setshowDeleteDialog(false); + setShowDeleteDialog(false); navigate("/users"); }, onError: () => { - setshowDeleteDialog(false); + setShowDeleteDialog(false); toast.error(t("user_delete_error")); }, }); @@ -93,7 +92,7 @@ export default function UserSummaryTab({ userData }: { userData?: UserBase }) { name={userData.username} handleOk={handleSubmit} handleCancel={() => { - setshowDeleteDialog(false); + setShowDeleteDialog(false); }} /> )} @@ -184,7 +183,7 @@ export default function UserSummaryTab({ userData }: { userData?: UserBase }) {