render transactions from serverside without state

This commit is contained in:
Petropoulos Evangelos 2025-07-09 23:52:58 +03:00
parent 05df45910a
commit 299c40787e
4 changed files with 95 additions and 54 deletions

View File

@ -15,7 +15,6 @@ export async function GET(request: NextRequest) {
let filteredTransactions = [...depositTransactionDummyData]; let filteredTransactions = [...depositTransactionDummyData];
console.log(12345, dateTime?.split(" ")[0]);
if (userId) { if (userId) {
filteredTransactions = filteredTransactions.filter( filteredTransactions = filteredTransactions.filter(
(tx) => tx.userId.toString() === userId (tx) => tx.userId.toString() === userId
@ -44,7 +43,6 @@ export async function GET(request: NextRequest) {
); );
} }
console.log(777, dateTime);
if (dateTime) { if (dateTime) {
filteredTransactions = filteredTransactions.filter( filteredTransactions = filteredTransactions.filter(
(tx) => tx.dateTime.split(" ")[0] === formatToDateTimeString(dateTime).split(" ")[0] (tx) => tx.dateTime.split(" ")[0] === formatToDateTimeString(dateTime).split(" ")[0]

View File

@ -1,7 +1,22 @@
import DepositsTransactionsTable from "@/app/features/Pages/transactions/DepositTransactionsTable"; import DepositsTransactionsTable from "@/app/features/Pages/transactions/DepositTransactionsTable";
import { getTransactions } from "@/app/services/transactions";
export default function DepositTransactionPage() { export default async function DepositTransactionPage({
return ( searchParams,
<DepositsTransactionsTable /> }: {
); searchParams: Promise<Record<string, string | string[] | undefined>>;
}) {
// Await searchParams before processing
const params = await searchParams;
// Create a safe query string by filtering only string values
const safeParams: Record<string, string> = {};
for (const [key, value] of Object.entries(params)) {
if (typeof value === "string") {
safeParams[key] = value;
}
}
const query = new URLSearchParams(safeParams).toString();
const transactions = await getTransactions({ query });
return <DepositsTransactionsTable data={transactions} />;
} }

View File

@ -23,19 +23,28 @@ import AdvancedSearch1 from "../../AdvancedSearch/AdvancedSearch1";
import SearchFilters from "@/app/components/searchFilter/SearchFilters"; import SearchFilters from "@/app/components/searchFilter/SearchFilters";
import { exportData } from "@/app/utils/exportData"; import { exportData } from "@/app/utils/exportData";
import { ITransaction } from "./types"; import { ITransaction } from "./types";
import { useSearchParams, useRouter } from "next/navigation";
const paginationModel = { page: 0, pageSize: 50 }; const paginationModel = { page: 0, pageSize: 50 };
export default function DepositsTransactionsTable() { interface DepositProps {
const [form, setForm] = useState({ data: any
userId: "", }
transactionId: "",
transactionReferenceId: "", const DepositsTransactionsTable: React.FC<DepositProps> = ({ data }) => {
currency: "", const router = useRouter()
state: "", const searchParams = useSearchParams()
depositMethod: "",
dateTime: "", // const [form, setForm] = useState({
}); // userId: "",
// transactionId: "",
// transactionReferenceId: "",
// currency: "",
// state: "",
// depositMethod: "",
// dateTime: "",
// });
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const [fileType, setFileType] = useState<"csv" | "xls" | "xlsx">("csv"); const [fileType, setFileType] = useState<"csv" | "xls" | "xlsx">("csv");
@ -43,54 +52,58 @@ export default function DepositsTransactionsTable() {
const [transactions, setTransactions] = useState<ITransaction[]>([]); const [transactions, setTransactions] = useState<ITransaction[]>([]);
console.log(777, form) // console.log(777, form)
// const fetchTransactions = useCallback(async () => {
// try {
const fetchTransactions = useCallback(async () => { // const stringForm: Record<string, string> = Object.fromEntries(
try { // Object.entries(form).map(([key, value]) => [key, value === null ? "" : String(value)])
const stringForm: Record<string, string> = Object.fromEntries( // );
Object.entries(form).map(([key, value]) => [key, value === null ? "" : String(value)]) // const query = new URLSearchParams(stringForm).toString();
); // const res = await fetch(`/api/transactions/deposit?${query}`);
const query = new URLSearchParams(stringForm).toString(); // const data = await res.json();
const res = await fetch(`/api/transactions/deposit?${query}`); // setTransactions(data);
const data = await res.json(); // } catch (error) {
setTransactions(data); // console.error('Error fetching transactions:', error);
} catch (error) { // }
console.error('Error fetching transactions:', error); // }, [form]);
}
}, [form]);
const resetForm = () => { const resetForm = () => {
setForm({ // setForm({
userId: "", // userId: "",
transactionId: "", // transactionId: "",
transactionReferenceId: "", // transactionReferenceId: "",
currency: "", // currency: "",
state: "", // state: "",
depositMethod: "", // depositMethod: "",
dateTime: "", // dateTime: "",
}); // });
}; };
useEffect(() => { // useEffect(() => {
fetchTransactions(); // fetchTransactions();
}, [form, fetchTransactions]); // }, [form, fetchTransactions]);
const handleDeleteFilter = (key: string) => { const handleDeleteFilter = (key: string) => {
setForm((prev) => ({ ...prev, [key]: '' })); // setForm((prev) => ({ ...prev, [key]: '' }));
}; };
const handleClearAll = () => { const handleClearAll = () => {
resetForm() // resetForm()
fetchTransactions() // fetchTransactions()
}; };
const handleClickField = (field: string, value: string) => { const handleClickField = (field: string, value: string) => {
setForm((prev) => ({ ...prev, [field]: value })); // setForm((prev) => ({ ...prev, [field]: value }));
const params = new URLSearchParams(searchParams.toString())
params.set(field, value)
router.push(`?${params.toString()}`)
router.refresh()
}; };
@ -109,8 +122,8 @@ export default function DepositsTransactionsTable() {
onChange={(e) => console.log(`setSearchQuery(${e.target.value})`)} onChange={(e) => console.log(`setSearchQuery(${e.target.value})`)}
sx={{ width: 300 }} sx={{ width: 300 }}
/> />
<AdvancedSearch1 form={form} resetForm={resetForm} setForm={setForm} labels={Labels} /> {/* <AdvancedSearch1 form={form} resetForm={resetForm} setForm={setForm} labels={Labels} /> */}
<SearchFilters filters={form} onDeleteFilter={handleDeleteFilter} onClearAll={handleClearAll} /> {/* <SearchFilters filters={form} onDeleteFilter={handleDeleteFilter} onClearAll={handleClearAll} /> */}
<Button <Button
variant="outlined" variant="outlined"
startIcon={<FileUploadIcon />} startIcon={<FileUploadIcon />}
@ -121,7 +134,7 @@ export default function DepositsTransactionsTable() {
</Stack> </Stack>
<DataGrid <DataGrid
rows={transactions} rows={data}
columns={depositTransactionsColumns} columns={depositTransactionsColumns}
initialState={{ pagination: { paginationModel } }} initialState={{ pagination: { paginationModel } }}
pageSizeOptions={[50, 100]} pageSizeOptions={[50, 100]}
@ -161,7 +174,7 @@ export default function DepositsTransactionsTable() {
</DialogContent> </DialogContent>
<DialogActions> <DialogActions>
<Button onClick={() => setOpen(false)}>Cancel</Button> <Button onClick={() => setOpen(false)}>Cancel</Button>
<Button variant="contained" onClick={() => exportData(transactions, depositTransactionsColumns, fileType, onlyCurrentTable, setOpen)}> <Button variant="contained" onClick={() => exportData(data, depositTransactionsColumns, fileType, onlyCurrentTable, setOpen)}>
Export Export
</Button> </Button>
</DialogActions> </DialogActions>
@ -174,3 +187,5 @@ const StyledPaper = styled(Paper)(() => ({
height: "90vh", height: "90vh",
width: "80vw" width: "80vw"
})); }));
export default DepositsTransactionsTable

View File

@ -0,0 +1,13 @@
export async function getTransactions({ query }: { query: string }) {
const res = await fetch(`http://localhost:3000/api/transactions/deposit?${query}`, {
cache: "no-store",
});
if (!res.ok) {
// You can parse the error message from the response if your API sends one
const errorData = await res.json().catch(() => ({ message: 'Unknown error' }));
throw new Error(errorData.message || `HTTP error! status: ${res.status}`);
}
return res.json();
}