diff --git a/src/features/pay/api.ts b/src/features/pay/api.ts index fee68df..354b00d 100644 --- a/src/features/pay/api.ts +++ b/src/features/pay/api.ts @@ -5,6 +5,7 @@ import type { OmInitializationPayload as OmTransactionInitializationPayload, OmInitializationResponse as OmTransactionInitializationResponse, PaymentType, + Transaction, WaveInitializationPayload, WaveTransactionInitilizationResponse, } from "./types"; @@ -54,3 +55,7 @@ export const waveInitializeTransaction = (payload: WaveInitializationPayload) => export const waveGetTransactionStatus = (id: string) => { return axiosInstance.get(`/wave-session/${id}/`); }; + +export const getTransactions = () => { + return axiosInstance.get>("/transactions/"); +}; diff --git a/src/features/pay/components/TransactionItem.tsx b/src/features/pay/components/TransactionItem.tsx new file mode 100644 index 0000000..5357f78 --- /dev/null +++ b/src/features/pay/components/TransactionItem.tsx @@ -0,0 +1,46 @@ +import moment from "moment"; +import "moment/locale/fr"; +import { asp as g } from "@asp/asp"; +import type { FC } from "react"; +import { Text, View } from "react-native"; +import type { Transaction } from "../types"; +import PaymentType from "./PaymentType"; + +moment.locale("fr"); + +export const TransactionItem: FC<{ transaction: Transaction }> = ({ transaction }) => { + const { type_paiement_label, reference, date, montant, status } = transaction; + const dateObject = Date.parse(date); + const color = status === "SUCCESS" ? "green" : status === "INITIATED" ? "orange" : "red"; + return ( + + + + + + + {reference} + {moment(dateObject).fromNow()} + + + + + {montant} + + + ); +}; diff --git a/src/features/pay/types.ts b/src/features/pay/types.ts index 3f0072a..bcd5987 100644 --- a/src/features/pay/types.ts +++ b/src/features/pay/types.ts @@ -89,3 +89,19 @@ export interface WaveTransactionInitilizationResponse { when_created: string; when_expires: string; } + +export type Transaction = { + type_paiement: number; + type_paiement_label: PaymentTypeCode; + marchand: string; + marchand_name: string; + service: string; + montant: number; + date: string; + commentaire: string; + etat: boolean; + status: "SUCCESS" | "INITIATED" | "FAILED"; + reference: string; + transaction_id: number; + marchand_code: string; +}; diff --git a/src/screens/TransactionHistoryScreen.tsx b/src/screens/TransactionHistoryScreen.tsx index f9a9dff..8fbc37e 100644 --- a/src/screens/TransactionHistoryScreen.tsx +++ b/src/screens/TransactionHistoryScreen.tsx @@ -1,260 +1,221 @@ -import { useModalsManagerContext } from "@/contexts/ModalsManagerContext"; -import BarWithBeasyAndNotificationsIcon from "@components/BarWithBeasyAndNotificationsIcon"; -import Button from "@components/Button"; -import Input from "@components/Input"; -import TransactionInformationsItem from "@components/TransactionInformationsItem"; -import Box from "@components/bases/Box"; -import Text from "@components/bases/Text"; -import WrapperWithDefaultBeasyBackgroundAndSafeAreaTopLeftRight from "@components/wrappers/WrapperWithDefaultBeasyBackgroundAndSafeAreaTopLeftRight"; -import useTransactionsHistory, { type OperatorsFilter } from "@hooks/useTransactionsHistory"; +/** biome-ignore-all lint/style/useNamingConvention: */ + +import { asp as g } from "@asp/asp"; +import { BarnoinPayBackground } from "@components/BarnoinPayBackground"; +import BeasyLogoIcon from "@components/BeasyLogoIcon"; +import * as Button from "@components/ButtonNew"; +import * as Input from "@components/InputNew"; +import * as Modal from "@components/Modal"; +import Entypo from "@expo/vector-icons/Entypo"; +import Ionicons from "@expo/vector-icons/Ionicons"; import { LOG } from "@logger"; -import Card from "@re-card"; -import theme from "@themes/Theme"; -import { useCallback, useState } from "react"; -import { RefreshControl, ScrollView, Switch } from "react-native"; -import Icon from "react-native-vector-icons/Ionicons"; +import { FlashList } from "@shopify/flash-list"; +import { useQuery } from "@tanstack/react-query"; +import { useState } from "react"; +import { Switch, Text, TouchableOpacity, View } from "react-native"; +import { getTransactions } from "@/features/pay/api"; +import { TransactionItem } from "@/features/pay/components/TransactionItem"; +import type { PaymentTypeCode } from "@/features/pay/types"; const log = LOG.extend("TransactionHistoryScreen"); const TransactionHistoryScreen = () => { log.verbose("TransactionHistoryScreen"); + const [showFilterModal, setShowFilterModal] = useState(false); + const [filters, setFilters] = useState>({ + CB: true, + FLOOZ: true, + MTN: true, + WAVE: true, + OM: true, + }); + const [referenceFilter, setReferenceFilter] = useState(""); - const { - transactionsHistory: data, - isLoading, - error, - refetch, - setReferenceFilter, - operatorsFilter, - setOperatorsFilter, - } = useTransactionsHistory(); + const transactionHistoryQuery = useQuery({ + queryKey: ["transactionsHistory"], + queryFn: getTransactions, + }); - const { showModal } = useModalsManagerContext(); + const transactions = transactionHistoryQuery.data?.data.results + ? transactionHistoryQuery.data?.data?.results.filter( + (transaction) => + filters[transaction.type_paiement_label] && + transaction.reference.includes(referenceFilter), + ) + : []; return ( - - + + + + + - - - - - - + + + + + + + setShowFilterModal(true)} + style={[ + g.justify_center, + g.align_center, + g.p_md, + g.rounded_md, + { backgroundColor: "#e8e8e9ff" }, + ]} > - setShowFiltersModal(true)} - onPress={() => - showModal( - , - ) - } - /> - - - } - contentContainerStyle={{ - gap: 10, - padding: 5, - // marginTop: 10, - paddingBottom: 30, - flexDirection: "column", - }} - showsVerticalScrollIndicator={false} - > - {data?.map((transaction) => ( - - ))} - - - - ); -}; + + + -export default TransactionHistoryScreen; - -interface FiltersModalProps { - // biome-ignore lint/style/useNamingConvention: - operatorsFilter: OperatorsFilter; - // biome-ignore lint/style/useNamingConvention: - setOperatorsFilter: React.Dispatch>; -} -const FiltersModal: React.FC = ({ operatorsFilter, setOperatorsFilter }) => { - const [filterOm, setFilterOm] = useState(operatorsFilter.OM); - const [filterMtn, setFilterMtn] = useState(operatorsFilter.MTN); - const [filterFlooz, setFilterFlooz] = useState(operatorsFilter.FLOOZ); - const [filterWave, setFilterWave] = useState(operatorsFilter.WAVE); - const [filterCb, setFilterCb] = useState(operatorsFilter.CB); - - const saveOperatorsFilters = useCallback(() => { - setOperatorsFilter({ - // biome-ignore lint/style/useNamingConvention: - OM: filterOm, - // biome-ignore lint/style/useNamingConvention: - MTN: filterMtn, - // biome-ignore lint/style/useNamingConvention: - FLOOZ: filterFlooz, - // biome-ignore lint/style/useNamingConvention: - WAVE: filterWave, - // biome-ignore lint/style/useNamingConvention: - CB: filterCb, - }); - }, [filterOm, filterMtn, filterFlooz, filterWave, filterCb, setOperatorsFilter]); - - const { closeModal } = useModalsManagerContext(); + {!transactions ? ( + Aucune transaction n'a été trouvée + ) : ( + item.reference} + estimatedItemSize={75} + bounces={false} + renderItem={({ item }) => ( + + + + )} + /> + )} + - const saveFilters = useCallback(() => { - saveOperatorsFilters(); - closeModal(); - }, [saveOperatorsFilters, closeModal]); + {/* FILTER MODAL */} - return ( - - - - - Paramétrage filtre - - { - closeModal(); - }} - /> - - - - Opérateurs - - - - Orange Money - - - - MTN Money - - - - Flooz Money - - - - Wave - - - - Carte Bancaire - - - - -