Compare commits

...

1 Commits

Author SHA1 Message Date
f9f996f195 Admin : Investasi integarsi API
### NO Issue
2025-11-03 11:41:31 +08:00
4 changed files with 162 additions and 28 deletions

View File

@@ -8,6 +8,7 @@ import {
TextCustom,
ViewWrapper,
} from "@/components";
import NoDataText from "@/components/_ShareComponent/NoDataText";
import { useAuth } from "@/hooks/use-auth";
import { apiInvestmentGetInvoice } from "@/service/api-client/api-investment";
import { GStyles } from "@/styles/global-styles";
@@ -74,7 +75,7 @@ export default function InvestmentTransaction() {
{loadList ? (
<LoaderCustom />
) : _.isEmpty(list) ? (
<TextCustom>Tidak ada data</TextCustom>
<NoDataText/>
) : (
list.map((item: any, i: number) => (
<BaseBox

View File

@@ -50,7 +50,7 @@ export default function AdminInvestmentDetail() {
const onLoadData = async () => {
try {
const response = await apiAdminInvestmentDetailById({ id: id as string });
console.log("[DATA]", JSON.stringify(response, null, 2));
console.log("[GETONE INVEST]", JSON.stringify(response, null, 2));
if (response.success) {
setData(response.data);
}
@@ -134,7 +134,7 @@ export default function AdminInvestmentDetail() {
data: data,
});
console.log("[RESPONSE]", JSON.stringify(response, null, 2));
// console.log("[GET ON INVEST]", JSON.stringify(response, null, 2));
if (!response.success) {
Toast.show({
type: "error",
@@ -181,11 +181,13 @@ export default function AdminInvestmentDetail() {
<StackCustom gap={"xs"}>
<GridDetail_4_8
label={<TextCustom bold>Sisa Saham</TextCustom>}
value={<TextCustom>2490 lembar</TextCustom>}
value={
<TextCustom>{data && formatCurrencyDisplay(data?.sisaLembar)} lembar</TextCustom>
}
/>
<GridDetail_4_8
label={<TextCustom bold>Validasi Transaksi</TextCustom>}
value={<TextCustom>4 Transaksi</TextCustom>}
value={<TextCustom>{data && formatCurrencyDisplay(data?.lembarTerbeli)} Transaksi</TextCustom>}
/>
</StackCustom>
</BaseBox>

View File

@@ -2,26 +2,33 @@
import {
BadgeCustom,
BaseBox,
BoxButtonOnFooter,
ButtonCustom,
Spacing,
StackCustom,
TextCustom,
ViewWrapper,
ViewWrapper
} from "@/components";
import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle";
import { GridDetail_4_8 } from "@/components/_ShareComponent/GridDetail_4_8";
import { apiAdminInvestmentGetOneInvoiceById } from "@/service/api-admin/api-admin-investment";
import GridTwoView from "@/components/_ShareComponent/GridTwoView";
import { MainColor } from "@/constants/color-palet";
import {
apiAdminInvestmentGetOneInvoiceById,
apiAdminInvestmentUpdateInvoice,
} from "@/service/api-admin/api-admin-investment";
import { colorBadgeTransaction } from "@/utils/colorBadge";
import { dateTimeView } from "@/utils/dateTimeView";
import { formatCurrencyDisplay } from "@/utils/formatCurrencyDisplay";
import { router, useFocusEffect, useLocalSearchParams } from "expo-router";
import { useCallback, useState } from "react";
import Toast from "react-native-toast-message";
export default function AdminInvestmentTransactionDetail() {
const { id } = useLocalSearchParams();
console.log("[ID]", id);
const [data, setData] = useState<any | null>(null);
const [isLoading, setLoading] = useState<boolean>(false);
useFocusEffect(
useCallback(() => {
@@ -43,24 +50,22 @@ export default function AdminInvestmentTransactionDetail() {
}
};
const buttonAction = (
<BoxButtonOnFooter>
<ButtonCustom onPress={() => router.back()}>Terima</ButtonCustom>
</BoxButtonOnFooter>
);
const listData = [
{
label: "Investor",
value: data?.Author?.username || "-",
value: (data && data?.Author?.username) || "-",
},
{
label: "Bank",
value: data?.MasterBank?.namaBank || "-",
value: (data && data?.MasterBank?.namaBank) || "-",
},
{
label: "Jumlah Investasi",
value: `Rp. ${formatCurrencyDisplay(data?.nominal) || "-"}`,
value: (data && `Rp. ${formatCurrencyDisplay(data?.nominal)}`) || "-",
},
{
label: "Lembar terbeli",
value: (data && formatCurrencyDisplay(data?.lembarTerbeli)) || "-",
},
{
label: "Status",
@@ -79,29 +84,128 @@ export default function AdminInvestmentTransactionDetail() {
},
{
label: "Tanggal",
value: data && dateTimeView({ date: data?.createdAt }) || "-",
value: (data && dateTimeView({ date: data?.createdAt })) || "-",
},
{
label: "Bukti Transfer",
value: (
value:
data && data?.imageId ? (
<ButtonCustom
onPress={() =>
router.push(`/(application)/(image)/preview-image/${data?.imageId}`)
router.push(
`/(application)/(image)/preview-image/${data?.imageId}`
)
}
>
Cek
</ButtonCustom>
) : (
"-"
),
},
];
const handlerSubmit = async ({
category,
}: {
category: "accept" | "deny";
}) => {
try {
setLoading(true);
const response = await apiAdminInvestmentUpdateInvoice({
id: id as string,
category: category,
data: {
investasiId: data?.investasiId,
lembarTerbeli: data?.lembarTerbeli,
},
});
console.log("[RESPONSE SUBMIT]", JSON.stringify(response, null, 2));
if (!response.success) {
Toast.show({
type: "error",
text1: "Gagal update status transaksi",
});
return;
}
Toast.show({
type: "success",
text1: "Berhasil update status transaksi",
});
router.back();
} catch (error) {
console.log("[ERROR]", error);
} finally {
setLoading(false);
}
};
const buttonAction = () => {
if (data?.StatusInvoice?.name === "Proses") {
return (
<GridTwoView
spanLeft={6}
spanRight={6}
styleLeft={{ paddingRight: 10 }}
styleRight={{ paddingLeft: 10 }}
leftIcon={
<ButtonCustom
isLoading={isLoading}
backgroundColor={MainColor.red}
textColor="white"
onPress={() => {
handlerSubmit({
category: "deny",
});
}}
>
Tolak
</ButtonCustom>
}
rightIcon={
<ButtonCustom
isLoading={isLoading}
onPress={() => {
handlerSubmit({
category: "accept",
});
}}
>
Terima
</ButtonCustom>
}
/>
);
} else if (data?.StatusInvoice?.name === "Gagal") {
return (
<>
<ButtonCustom textColor="red" onPress={() => router.back()}>
Gagal
</ButtonCustom>
</>
);
} else {
return (
<>
<ButtonCustom disabled={true}>
Status: {data?.StatusInvoice?.name}
</ButtonCustom>
</>
);
}
};
return (
<>
<ViewWrapper
headerComponent={
<AdminBackButtonAntTitle title="Detail Transaksi Investor" />
}
footerComponent={buttonAction}
// footerComponent={buttonAction()}
>
<BaseBox>
<StackCustom>
@@ -114,6 +218,8 @@ export default function AdminInvestmentTransactionDetail() {
))}
</StackCustom>
</BaseBox>
<Spacing />
{buttonAction()}
</ViewWrapper>
</>
);

View File

@@ -86,3 +86,28 @@ export async function apiAdminInvestmentGetOneInvoiceById({
throw error;
}
}
export async function apiAdminInvestmentUpdateInvoice({
id,
category,
data,
}: {
id: string;
category: "deny" | "accept";
data: {
investasiId: string;
lembarTerbeli: number;
};
}) {
try {
const response = await apiConfig.put(
`/mobile/admin/investment/${id}/invoice?category=${category}`,
{
data: data,
}
);
return response.data;
} catch (error) {
throw error;
}
}