Commit 4bb1f0b3 by Arjun Jhukal

download transaction and player is working for all the pages on admin dashboard

parent a36b8a6b
...@@ -7,6 +7,7 @@ import TableHeader from '@/components/molecules/TableHeader' ...@@ -7,6 +7,7 @@ import TableHeader from '@/components/molecules/TableHeader'
import CustomTable from '@/components/organism/Table'; import CustomTable from '@/components/organism/Table';
import { useAppDispatch } from '@/hooks/hook'; import { useAppDispatch } from '@/hooks/hook';
import { PATH } from '@/routes/PATH'; import { PATH } from '@/routes/PATH';
import { useDownloadUserMutation } from '@/services/downloadApi';
import { useDeletePlayerByIdMutation, useGetAllPlayerQuery, useSuspendPlayerByIdMutation } from '@/services/playerApi'; import { useDeletePlayerByIdMutation, useGetAllPlayerQuery, useSuspendPlayerByIdMutation } from '@/services/playerApi';
import { showToast, ToastVariant } from '@/slice/toastSlice'; import { showToast, ToastVariant } from '@/slice/toastSlice';
import { PlayerItem, PlayerProps } from '@/types/player'; import { PlayerItem, PlayerProps } from '@/types/player';
...@@ -36,6 +37,7 @@ export default function PlayerListing() { ...@@ -36,6 +37,7 @@ export default function PlayerListing() {
const [deletePlayer, { isLoading: deletingPlayer }] = useDeletePlayerByIdMutation(); const [deletePlayer, { isLoading: deletingPlayer }] = useDeletePlayerByIdMutation();
const [suspendPlayer, { isLoading: suspendingPlayer }] = useSuspendPlayerByIdMutation(); const [suspendPlayer, { isLoading: suspendingPlayer }] = useSuspendPlayerByIdMutation();
const [downloadUser, { isLoading: downloading }] = useDownloadUserMutation();
const handlePlayerSuspend = async (id: string) => { const handlePlayerSuspend = async (id: string) => {
try { try {
...@@ -225,7 +227,37 @@ export default function PlayerListing() { ...@@ -225,7 +227,37 @@ export default function PlayerListing() {
<TableHeader <TableHeader
search={search} search={search}
setSearch={setSearch} setSearch={setSearch}
onDownloadCSV={() => { }} onDownloadCSV={async () => {
try {
const res = await downloadUser({
search,
}).unwrap();
const blob = new Blob([res], { type: "text/csv" });
const url = window.URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = `transactions_${new Date().toISOString()}.csv`;
document.body.appendChild(a);
a.click();
a.remove();
dispatch(
showToast({
variant: ToastVariant.SUCCESS,
message: "CSV Downloaded successfully.",
})
);
} catch (e: any) {
dispatch(
showToast({
variant: ToastVariant.ERROR,
message: e.message || "Unable to download CSV.",
})
);
}
}}
downloading={downloading}
/> />
<div className="px-4"> <div className="px-4">
<TabController <TabController
......
...@@ -159,12 +159,12 @@ export default function TransactionTable({ user_id, game_id, search, setSearch } ...@@ -159,12 +159,12 @@ export default function TransactionTable({ user_id, game_id, search, setSearch }
return ( return (
<div className="border-gray border-solid border-[1px] rounded-[8px] lg:rounded-[16px]"> <div className="border-gray border-solid border-[1px] rounded-[8px] lg:rounded-[16px]">
<TableHeader {/* <TableHeader
search={search} search={search}
setSearch={setSearch && setSearch} setSearch={setSearch && setSearch}
onDownloadCSV={async () => { onDownloadCSV={async () => {
try { try {
const response = await downloadTransaction({ user: user_id, game: game_id?.toString() }).unwrap(); const response = await downloadTransaction({ user: user_id, game: game_id?.toString(),search:search }).unwrap();
dispatch( dispatch(
showToast({ showToast({
variant: ToastVariant.SUCCESS, variant: ToastVariant.SUCCESS,
...@@ -185,8 +185,54 @@ export default function TransactionTable({ user_id, game_id, search, setSearch } ...@@ -185,8 +185,54 @@ export default function TransactionTable({ user_id, game_id, search, setSearch }
filters={[ filters={[
{ value: status || "", setValue: (value) => setStatus(value as TransactionStatusProps), options: StatusOptions, placeholder: "Filter by status" } { value: status || "", setValue: (value) => setStatus(value as TransactionStatusProps), options: StatusOptions, placeholder: "Filter by status" }
]} ]}
/> */}
<TableHeader
search={search}
setSearch={setSearch && setSearch}
onDownloadCSV={async () => {
try {
const res = await downloadTransaction({
user: user_id?.toString(),
game: game_id?.toString(),
search,
}).unwrap();
const blob = new Blob([res], { type: "text/csv" });
const url = window.URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = `transactions_${new Date().toISOString()}.csv`;
document.body.appendChild(a);
a.click();
a.remove();
dispatch(
showToast({
variant: ToastVariant.SUCCESS,
message: "CSV Downloaded successfully.",
})
);
} catch (e: any) {
dispatch(
showToast({
variant: ToastVariant.ERROR,
message: e.message || "Unable to download CSV.",
})
);
}
}}
downloading={downloading}
filters={[
{
value: status || "",
setValue: (value) => setStatus(value as TransactionStatusProps),
options: StatusOptions,
placeholder: "Filter by status",
},
]}
/> />
<> <>
<CustomTable <CustomTable
key={`${page}-${pageSize}-${search}-${game_id}-${user_id}`} key={`${page}-${pageSize}-${search}-${game_id}-${user_id}`}
......
import { createApi } from "@reduxjs/toolkit/query/react"; // import { createApi } from "@reduxjs/toolkit/query/react";
import { baseQuery } from "./baseQuery"; // import { baseQuery } from "./baseQuery";
// import { GlobalResponse } from "@/types/config";
// export const downloadApi = createApi({
// reducerPath: "downloadApi",
// baseQuery: baseQuery,
// tagTypes: ["Download"],
// endpoints: (builder) => ({
// downloadTransaction: builder.mutation<GlobalResponse, { user?: string; game?: string; search?: string }>({
// query: ({ user, game, search }) => {
// const params = new URLSearchParams();
// if (user) params.append('user', user.toString());
// if (game) params.append('game', game.toString());
// if (search) params.append('search', search.toString());
// const queryString = params.toString();
// return {
// url: `/api/admin/download/transactions${queryString ? `?${queryString}` : ''}`,
// method: "GET",
// }
// }
// })
// })
// })
// export const { useDownloadTransactionMutation } = downloadApi;
// src/services/downloadApi.ts
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
import { baseQuery } from "./baseQuery"; // your custom base query
import { GlobalResponse } from "@/types/config"; import { GlobalResponse } from "@/types/config";
export const downloadApi = createApi({ export const downloadApi = createApi({
...@@ -7,19 +34,41 @@ export const downloadApi = createApi({ ...@@ -7,19 +34,41 @@ export const downloadApi = createApi({
baseQuery: baseQuery, baseQuery: baseQuery,
tagTypes: ["Download"], tagTypes: ["Download"],
endpoints: (builder) => ({ endpoints: (builder) => ({
downloadTransaction: builder.mutation<GlobalResponse, { user?: string; game?: string }>({ downloadTransaction: builder.mutation<Blob, { user?: string; game?: string; search?: string }>({
query: ({ user, game }) => { async queryFn(args, _queryApi, _extraOptions, fetchWithBQ) {
const params = new URLSearchParams(); const params = new URLSearchParams();
if (user) params.append('user', user.toString()); if (args.user) params.append("user", args.user.toString());
if (game) params.append('game', game.toString()); if (args.game) params.append("game", args.game.toString());
if (args.search) params.append("search", args.search.toString());
const queryString = params.toString(); const queryString = params.toString();
return {
url: `/api/admin/download/transactions${queryString ? `?${queryString}` : ''}`, const response = await fetchWithBQ({
url: `/api/admin/download/transactions${queryString ? `?${queryString}` : ""}`,
method: "GET", method: "GET",
} responseHandler: async (response) => response.blob(), // ⬅️ handle blob here
} });
})
}) if (response.error) return { error: response.error };
}) return { data: response.data as Blob };
},
}),
downloadUser: builder.mutation<Blob, { search?: string }>({
async queryFn(args, _queryApi, _extraOptions, fetchWithBQ) {
const params = new URLSearchParams();
if (args.search) params.append("search", args.search.toString());
const queryString = params.toString();
const response = await fetchWithBQ({
url: `/api/admin/download/transactions${queryString ? `?${queryString}` : ""}`,
method: "GET",
responseHandler: async (response) => response.blob(), // ⬅️ handle blob here
});
if (response.error) return { error: response.error };
return { data: response.data as Blob };
},
}),
}),
});
export const { useDownloadTransactionMutation } = downloadApi; export const { useDownloadTransactionMutation,useDownloadUserMutation } = downloadApi;
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment