Compare commits
1 Commits
loaddata/5
...
loaddata/6
| Author | SHA1 | Date | |
|---|---|---|---|
| 83fa277e03 |
@@ -1,56 +1,9 @@
|
|||||||
import {
|
import Investment_ScreenBursa from "@/screens/Invesment/ScreenBursa";
|
||||||
FloatingButton,
|
|
||||||
LoaderCustom,
|
|
||||||
ViewWrapper
|
|
||||||
} from "@/components";
|
|
||||||
import NoDataText from "@/components/_ShareComponent/NoDataText";
|
|
||||||
import Investment_BoxBerandaSection from "@/screens/Invesment/BoxBerandaSection";
|
|
||||||
import { apiInvestmentGetAll } from "@/service/api-client/api-investment";
|
|
||||||
import { router, useFocusEffect } from "expo-router";
|
|
||||||
import _ from "lodash";
|
|
||||||
import { useCallback, useState } from "react";
|
|
||||||
|
|
||||||
export default function InvestmentBursa() {
|
export default function InvestmentBursa() {
|
||||||
const [list, setList] = useState<any[] | null>(null);
|
|
||||||
const [loadingList, setLoadingList] = useState(false);
|
|
||||||
|
|
||||||
useFocusEffect(
|
|
||||||
useCallback(() => {
|
|
||||||
onLoadList();
|
|
||||||
}, [])
|
|
||||||
);
|
|
||||||
|
|
||||||
const onLoadList = async () => {
|
|
||||||
try {
|
|
||||||
setLoadingList(true);
|
|
||||||
const response = await apiInvestmentGetAll({
|
|
||||||
category: "bursa"
|
|
||||||
});
|
|
||||||
// console.log("[DATA LIST]", JSON.stringify(response.data, null, 2));
|
|
||||||
setList(response.data);
|
|
||||||
} catch (error) {
|
|
||||||
console.log("[ERROR]", error);
|
|
||||||
} finally {
|
|
||||||
setLoadingList(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ViewWrapper
|
<>
|
||||||
hideFooter
|
<Investment_ScreenBursa />
|
||||||
floatingButton={
|
</>
|
||||||
<FloatingButton onPress={() => router.push("/investment/create")} />
|
|
||||||
}
|
|
||||||
>
|
|
||||||
{loadingList ? (
|
|
||||||
<LoaderCustom />
|
|
||||||
) : _.isEmpty(list) ? (
|
|
||||||
<NoDataText />
|
|
||||||
) : (
|
|
||||||
list?.map((item: any, index: number) => (
|
|
||||||
<Investment_BoxBerandaSection id={item.id} data={item} key={index} />
|
|
||||||
))
|
|
||||||
)}
|
|
||||||
</ViewWrapper>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,82 +1,10 @@
|
|||||||
/* eslint-disable react-hooks/exhaustive-deps */
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
import {
|
import Investment_ScreenPortofolio from "@/screens/Invesment/ScreenPortofolio";
|
||||||
LoaderCustom,
|
|
||||||
ScrollableCustom,
|
|
||||||
TextCustom,
|
|
||||||
ViewWrapper,
|
|
||||||
} from "@/components";
|
|
||||||
import { useAuth } from "@/hooks/use-auth";
|
|
||||||
import { dummyMasterStatus } from "@/lib/dummy-data/_master/status";
|
|
||||||
import Investment_StatusBox from "@/screens/Invesment/StatusBox";
|
|
||||||
import { apiInvestmentGetByStatus } from "@/service/api-client/api-investment";
|
|
||||||
import { useFocusEffect, useLocalSearchParams } from "expo-router";
|
|
||||||
import _ from "lodash";
|
|
||||||
import { useCallback, useState } from "react";
|
|
||||||
|
|
||||||
export default function InvestmentPortofolio() {
|
export default function InvestmentPortofolio() {
|
||||||
const { user } = useAuth();
|
|
||||||
const { status } = useLocalSearchParams<{ status?: string }>();
|
|
||||||
|
|
||||||
const [activeCategory, setActiveCategory] = useState<string | null>(
|
|
||||||
status || "publish"
|
|
||||||
);
|
|
||||||
|
|
||||||
const [listData, setListData] = useState<any[]>([]);
|
|
||||||
const [loadingList, setLoadingList] = useState(false);
|
|
||||||
|
|
||||||
useFocusEffect(
|
|
||||||
useCallback(() => {
|
|
||||||
onLoadData();
|
|
||||||
}, [user?.id, activeCategory])
|
|
||||||
);
|
|
||||||
|
|
||||||
const onLoadData = async () => {
|
|
||||||
try {
|
|
||||||
setLoadingList(true);
|
|
||||||
const response = await apiInvestmentGetByStatus({
|
|
||||||
authorId: user?.id as string,
|
|
||||||
status: activeCategory as string,
|
|
||||||
});
|
|
||||||
setListData(response.data);
|
|
||||||
} catch (error) {
|
|
||||||
console.log("[ERROR]", error);
|
|
||||||
} finally {
|
|
||||||
setLoadingList(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const handlePress = (item: any) => {
|
|
||||||
setActiveCategory(item.value);
|
|
||||||
// tambahkan logika lain seperti filter dsb.
|
|
||||||
};
|
|
||||||
|
|
||||||
const scrollComponent = (
|
|
||||||
<ScrollableCustom
|
|
||||||
data={dummyMasterStatus.map((e, i) => ({
|
|
||||||
id: i,
|
|
||||||
label: e.label,
|
|
||||||
value: e.value,
|
|
||||||
}))}
|
|
||||||
onButtonPress={handlePress}
|
|
||||||
activeId={activeCategory as any}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
return (
|
return (
|
||||||
<ViewWrapper headerComponent={scrollComponent} hideFooter>
|
<>
|
||||||
{loadingList ? (
|
<Investment_ScreenPortofolio />
|
||||||
<LoaderCustom />
|
</>
|
||||||
) : _.isEmpty(listData) ? (
|
|
||||||
<TextCustom align="center">Tidak ada data {activeCategory}</TextCustom>
|
|
||||||
) : (
|
|
||||||
listData.map((item: any, index: number) => (
|
|
||||||
<Investment_StatusBox
|
|
||||||
key={index}
|
|
||||||
data={item}
|
|
||||||
status={activeCategory as string}
|
|
||||||
href={`/investment/${item.id}/${activeCategory}/detail`}
|
|
||||||
/>
|
|
||||||
))
|
|
||||||
)}
|
|
||||||
</ViewWrapper>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,124 +1,10 @@
|
|||||||
/* eslint-disable react-hooks/exhaustive-deps */
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
import {
|
import Investment_ScreenTransaction from "@/screens/Invesment/ScreenTransaction";
|
||||||
BadgeCustom,
|
|
||||||
BaseBox,
|
|
||||||
Grid,
|
|
||||||
LoaderCustom,
|
|
||||||
StackCustom,
|
|
||||||
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";
|
|
||||||
import { formatChatTime } from "@/utils/formatChatTime";
|
|
||||||
import { formatCurrencyDisplay } from "@/utils/formatCurrencyDisplay";
|
|
||||||
import { router, useFocusEffect } from "expo-router";
|
|
||||||
import _ from "lodash";
|
|
||||||
import { useCallback, useState } from "react";
|
|
||||||
import { View } from "react-native";
|
|
||||||
|
|
||||||
export default function InvestmentTransaction() {
|
export default function InvestmentTransaction() {
|
||||||
const { user } = useAuth();
|
|
||||||
const [list, setList] = useState<any>([]);
|
|
||||||
const [loadList, setLoadList] = useState<boolean>(false);
|
|
||||||
|
|
||||||
useFocusEffect(
|
|
||||||
useCallback(() => {
|
|
||||||
onLoadList();
|
|
||||||
}, [user?.id])
|
|
||||||
);
|
|
||||||
|
|
||||||
const onLoadList = async () => {
|
|
||||||
try {
|
|
||||||
setLoadList(true);
|
|
||||||
const response = await apiInvestmentGetInvoice({
|
|
||||||
authorId: user?.id as string,
|
|
||||||
category: "transaction",
|
|
||||||
});
|
|
||||||
console.log("[RESPONSE LIST]", JSON.stringify(response.data, null, 2));
|
|
||||||
setList(response.data);
|
|
||||||
} catch (error) {
|
|
||||||
console.log("[ERROR]", error);
|
|
||||||
} finally {
|
|
||||||
setLoadList(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const handlerColor = (status: string) => {
|
|
||||||
if (status === "menunggu") {
|
|
||||||
return "orange";
|
|
||||||
} else if (status === "proses") {
|
|
||||||
return "white";
|
|
||||||
} else if (status === "berhasil") {
|
|
||||||
return "green";
|
|
||||||
} else if (status === "gagal") {
|
|
||||||
return "red";
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const handlePress = ({ id, status }: { id: string; status: string }) => {
|
|
||||||
if (status === "menunggu") {
|
|
||||||
router.push(`/investment/${id}/(transaction-flow)/invoice`);
|
|
||||||
} else if (status === "proses") {
|
|
||||||
router.push(`/investment/${id}/(transaction-flow)/process`);
|
|
||||||
} else if (status === "berhasil") {
|
|
||||||
router.push(`/investment/${id}/(transaction-flow)/success`);
|
|
||||||
} else if (status === "gagal") {
|
|
||||||
router.push(`/investment/${id}/(transaction-flow)/failed`);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ViewWrapper hideFooter>
|
<>
|
||||||
{loadList ? (
|
<Investment_ScreenTransaction />
|
||||||
<LoaderCustom />
|
</>
|
||||||
) : _.isEmpty(list) ? (
|
|
||||||
<NoDataText/>
|
|
||||||
) : (
|
|
||||||
list.map((item: any, i: number) => (
|
|
||||||
<BaseBox
|
|
||||||
key={i}
|
|
||||||
paddingTop={7}
|
|
||||||
paddingBottom={7}
|
|
||||||
onPress={() => {
|
|
||||||
handlePress({
|
|
||||||
id: item.id,
|
|
||||||
status: _.lowerCase(item.statusInvoice),
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Grid>
|
|
||||||
<Grid.Col span={6}>
|
|
||||||
<StackCustom gap={"xs"}>
|
|
||||||
<TextCustom truncate>{item?.title || "-"}</TextCustom>
|
|
||||||
<TextCustom color="gray" size="small">
|
|
||||||
{formatChatTime(item?.createdAt)}
|
|
||||||
</TextCustom>
|
|
||||||
</StackCustom>
|
|
||||||
</Grid.Col>
|
|
||||||
<Grid.Col span={1}>
|
|
||||||
<View />
|
|
||||||
</Grid.Col>
|
|
||||||
<Grid.Col span={5} style={{ alignItems: "flex-end" }}>
|
|
||||||
<StackCustom gap={"xs"}>
|
|
||||||
<TextCustom bold truncate>
|
|
||||||
Rp. {formatCurrencyDisplay(item?.nominal) || "-"}
|
|
||||||
</TextCustom>
|
|
||||||
<BadgeCustom
|
|
||||||
variant="light"
|
|
||||||
color={handlerColor(_.lowerCase(item.statusInvoice))}
|
|
||||||
style={GStyles.alignSelfFlexEnd}
|
|
||||||
>
|
|
||||||
{item?.statusInvoice || "-"}
|
|
||||||
</BadgeCustom>
|
|
||||||
</StackCustom>
|
|
||||||
</Grid.Col>
|
|
||||||
</Grid>
|
|
||||||
</BaseBox>
|
|
||||||
))
|
|
||||||
)}
|
|
||||||
</ViewWrapper>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,58 +1,10 @@
|
|||||||
/* eslint-disable react-hooks/exhaustive-deps */
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
import { LoaderCustom, TextCustom, ViewWrapper } from "@/components";
|
import Investment_ScreenListOfDocument from "@/screens/Invesment/Document/ScreenListDocument";
|
||||||
import Investment_BoxDetailDocument from "@/screens/Invesment/Document/RecapBoxDetail";
|
|
||||||
import { apiInvestmentGetDocument } from "@/service/api-client/api-investment";
|
|
||||||
import { useFocusEffect, useLocalSearchParams } from "expo-router";
|
|
||||||
import _ from "lodash";
|
|
||||||
import { useCallback, useState } from "react";
|
|
||||||
|
|
||||||
export default function InvestmentListOfDocument() {
|
export default function InvestmentListOfDocument() {
|
||||||
const { id } = useLocalSearchParams();
|
|
||||||
console.log("ID >> ", id);
|
|
||||||
|
|
||||||
const [list, setList] = useState<any[] | null>(null);
|
|
||||||
const [loadList, setLoadList] = useState(false);
|
|
||||||
|
|
||||||
useFocusEffect(
|
|
||||||
useCallback(() => {
|
|
||||||
onLoadListDocument();
|
|
||||||
}, [id])
|
|
||||||
);
|
|
||||||
|
|
||||||
const onLoadListDocument = async () => {
|
|
||||||
try {
|
|
||||||
setLoadList(true);
|
|
||||||
const response = await apiInvestmentGetDocument({
|
|
||||||
id: id as string,
|
|
||||||
category: "all-document",
|
|
||||||
});
|
|
||||||
|
|
||||||
setList(response.data);
|
|
||||||
} catch (error) {
|
|
||||||
console.log("[ERROR]", error);
|
|
||||||
setList([]);
|
|
||||||
} finally {
|
|
||||||
setLoadList(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ViewWrapper>
|
<>
|
||||||
{loadList ? (
|
<Investment_ScreenListOfDocument />
|
||||||
<LoaderCustom />
|
</>
|
||||||
) : _.isEmpty(list) ? (
|
|
||||||
<TextCustom align="center" color="gray">
|
|
||||||
Tidak ada data
|
|
||||||
</TextCustom>
|
|
||||||
) : (
|
|
||||||
list?.map((item: any, index: number) => (
|
|
||||||
<Investment_BoxDetailDocument
|
|
||||||
key={index}
|
|
||||||
title={item.title}
|
|
||||||
href={`/(file)/${item.fileId}`}
|
|
||||||
/>
|
|
||||||
))
|
|
||||||
)}
|
|
||||||
</ViewWrapper>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,213 +1,10 @@
|
|||||||
/* eslint-disable react-hooks/exhaustive-deps */
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
import {
|
import Investment_ScreenRecap from "@/screens/Invesment/Document/ScreenRecap";
|
||||||
AlertDefaultSystem,
|
|
||||||
BackButton,
|
|
||||||
DotButton,
|
|
||||||
DrawerCustom,
|
|
||||||
LoaderCustom,
|
|
||||||
MenuDrawerDynamicGrid,
|
|
||||||
TextCustom,
|
|
||||||
ViewWrapper,
|
|
||||||
} from "@/components";
|
|
||||||
import { IconEdit } from "@/components/_Icon";
|
|
||||||
import { MainColor } from "@/constants/color-palet";
|
|
||||||
import { ICON_SIZE_SMALL } from "@/constants/constans-value";
|
|
||||||
import Investment_BoxDetailDocument from "@/screens/Invesment/Document/RecapBoxDetail";
|
|
||||||
import {
|
|
||||||
apiInvestmentDeleteDocument,
|
|
||||||
apiInvestmentGetDocument,
|
|
||||||
} from "@/service/api-client/api-investment";
|
|
||||||
import { AntDesign, Ionicons } from "@expo/vector-icons";
|
|
||||||
import {
|
|
||||||
router,
|
|
||||||
Stack,
|
|
||||||
useFocusEffect,
|
|
||||||
useLocalSearchParams,
|
|
||||||
} from "expo-router";
|
|
||||||
import _ from "lodash";
|
|
||||||
import { useCallback, useState } from "react";
|
|
||||||
import Toast from "react-native-toast-message";
|
|
||||||
|
|
||||||
export default function InvestmentRecapOfDocument() {
|
export default function InvestmentRecapOfDocument() {
|
||||||
const { id } = useLocalSearchParams();
|
|
||||||
const [openDrawer, setOpenDrawer] = useState(false);
|
|
||||||
const [openDrawerBox, setOpenDrawerBox] = useState(false);
|
|
||||||
const [list, setList] = useState<any[] | null>(null);
|
|
||||||
const [loadList, setLoadList] = useState(false);
|
|
||||||
const [selectId, setSelectId] = useState<string | null>(null);
|
|
||||||
|
|
||||||
useFocusEffect(
|
|
||||||
useCallback(() => {
|
|
||||||
onLoadListDocument();
|
|
||||||
}, [id])
|
|
||||||
);
|
|
||||||
|
|
||||||
const onLoadListDocument = async () => {
|
|
||||||
try {
|
|
||||||
setLoadList(true);
|
|
||||||
const response = await apiInvestmentGetDocument({
|
|
||||||
id: id as string,
|
|
||||||
category: "all-document",
|
|
||||||
});
|
|
||||||
|
|
||||||
setList(response.data);
|
|
||||||
} catch (error) {
|
|
||||||
console.log("[ERROR]", error);
|
|
||||||
setList([]);
|
|
||||||
} finally {
|
|
||||||
setLoadList(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const handlerDeleteDocument = async () => {
|
|
||||||
try {
|
|
||||||
const response = await apiInvestmentDeleteDocument({
|
|
||||||
id: selectId as string,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (response.success) {
|
|
||||||
Toast.show({
|
|
||||||
type: "success",
|
|
||||||
text1: "Data berhasil dihapus",
|
|
||||||
});
|
|
||||||
setList((prev: any[] | null) => {
|
|
||||||
if (!prev) return null;
|
|
||||||
return prev.filter((item: any) => item.id !== selectId);
|
|
||||||
});
|
|
||||||
setOpenDrawerBox(false);
|
|
||||||
setSelectId(null);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.log("[ERROR]", error);
|
|
||||||
Toast.show({
|
|
||||||
type: "error",
|
|
||||||
text1: "Gagal menghapus data",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Stack.Screen
|
<Investment_ScreenRecap />
|
||||||
options={{
|
|
||||||
title: "Rekap Dokumen",
|
|
||||||
headerLeft: () => <BackButton />,
|
|
||||||
headerRight: () => (
|
|
||||||
<DotButton
|
|
||||||
onPress={() => {
|
|
||||||
setOpenDrawer(true);
|
|
||||||
setOpenDrawerBox(false);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
),
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<ViewWrapper>
|
|
||||||
{loadList ? (
|
|
||||||
<LoaderCustom />
|
|
||||||
) : _.isEmpty(list) ? (
|
|
||||||
<TextCustom align="center" color="gray">
|
|
||||||
Tidak ada data
|
|
||||||
</TextCustom>
|
|
||||||
) : (
|
|
||||||
list?.map((item: any, index: number) => (
|
|
||||||
<Investment_BoxDetailDocument
|
|
||||||
key={index}
|
|
||||||
title={item.title}
|
|
||||||
leftIcon={
|
|
||||||
<Ionicons
|
|
||||||
name="ellipsis-horizontal-outline"
|
|
||||||
size={ICON_SIZE_SMALL}
|
|
||||||
color={MainColor.white}
|
|
||||||
style={{
|
|
||||||
zIndex: 10,
|
|
||||||
alignSelf: "flex-end",
|
|
||||||
}}
|
|
||||||
onPress={() => {
|
|
||||||
setSelectId(item.id);
|
|
||||||
setOpenDrawerBox(true);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
href={`/(file)/${item.fileId}`}
|
|
||||||
/>
|
|
||||||
))
|
|
||||||
)}
|
|
||||||
</ViewWrapper>
|
|
||||||
|
|
||||||
{/* Drawer On Header */}
|
|
||||||
<DrawerCustom
|
|
||||||
isVisible={openDrawer}
|
|
||||||
closeDrawer={() => setOpenDrawer(false)}
|
|
||||||
height={"auto"}
|
|
||||||
>
|
|
||||||
<MenuDrawerDynamicGrid
|
|
||||||
data={[
|
|
||||||
{
|
|
||||||
icon: (
|
|
||||||
<AntDesign
|
|
||||||
name="plus-circle"
|
|
||||||
size={ICON_SIZE_SMALL}
|
|
||||||
color={MainColor.white}
|
|
||||||
/>
|
|
||||||
),
|
|
||||||
label: "Tambah Dokumen",
|
|
||||||
path: `/investment/${id}/(document)/add-document`,
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
onPressItem={(item) => {
|
|
||||||
router.push(item.path as any);
|
|
||||||
setOpenDrawer(false);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</DrawerCustom>
|
|
||||||
|
|
||||||
{/* Drawer On Box */}
|
|
||||||
<DrawerCustom
|
|
||||||
isVisible={openDrawerBox}
|
|
||||||
closeDrawer={() => setOpenDrawerBox(false)}
|
|
||||||
height={"auto"}
|
|
||||||
>
|
|
||||||
<MenuDrawerDynamicGrid
|
|
||||||
data={[
|
|
||||||
{
|
|
||||||
icon: <IconEdit />,
|
|
||||||
label: "Edit Dokumen",
|
|
||||||
path: `/investment/${selectId}/(document)/edit-document`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: (
|
|
||||||
<Ionicons
|
|
||||||
name="trash-outline"
|
|
||||||
size={ICON_SIZE_SMALL}
|
|
||||||
color={MainColor.white}
|
|
||||||
/>
|
|
||||||
),
|
|
||||||
label: "Hapus Dokumen",
|
|
||||||
path: "" as any,
|
|
||||||
color: MainColor.red,
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
onPressItem={(item) => {
|
|
||||||
if (item.path === ("" as any)) {
|
|
||||||
AlertDefaultSystem({
|
|
||||||
title: "Hapus Dokumen",
|
|
||||||
message: "Apakah anda yakin ingin menghapus dokumen ini?",
|
|
||||||
textLeft: "Batal",
|
|
||||||
textRight: "Hapus",
|
|
||||||
onPressRight: () => {
|
|
||||||
handlerDeleteDocument();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
router.push(item.path as any);
|
|
||||||
}
|
|
||||||
|
|
||||||
setOpenDrawerBox(false);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</DrawerCustom>
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,230 +1,10 @@
|
|||||||
/* eslint-disable react-hooks/exhaustive-deps */
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
import {
|
import Investment_ScreenTransaction from "@/screens/Invesment/ScreenTransaction";
|
||||||
BaseBox,
|
|
||||||
ButtonCenteredOnly,
|
|
||||||
ButtonCustom,
|
|
||||||
Grid,
|
|
||||||
InformationBox,
|
|
||||||
Spacing,
|
|
||||||
StackCustom,
|
|
||||||
TextCustom,
|
|
||||||
ViewWrapper,
|
|
||||||
} from "@/components";
|
|
||||||
import CopyButton from "@/components/Button/CoyButton";
|
|
||||||
import { MainColor } from "@/constants/color-palet";
|
|
||||||
import DIRECTORY_ID from "@/constants/directory-id";
|
|
||||||
import {
|
|
||||||
apiInvestmentGetInvoice,
|
|
||||||
apiInvestmentUpdateInvoice,
|
|
||||||
} from "@/service/api-client/api-investment";
|
|
||||||
import { uploadFileService } from "@/service/upload-service";
|
|
||||||
import { formatCurrencyDisplay } from "@/utils/formatCurrencyDisplay";
|
|
||||||
import pickFile, { IFileData } from "@/utils/pickFile";
|
|
||||||
import { router, useFocusEffect, useLocalSearchParams } from "expo-router";
|
|
||||||
import { useCallback, useState } from "react";
|
|
||||||
import { View } from "react-native";
|
|
||||||
import Toast from "react-native-toast-message";
|
|
||||||
|
|
||||||
export default function InvestmentInvoice() {
|
export default function InvestmentInvoice() {
|
||||||
const { id } = useLocalSearchParams();
|
|
||||||
const [data, setData] = useState<any>({});
|
|
||||||
const [image, setImage] = useState<IFileData>({
|
|
||||||
name: "",
|
|
||||||
uri: "",
|
|
||||||
size: 0,
|
|
||||||
});
|
|
||||||
const [isLoading, setIsLoading] = useState<boolean>(false);
|
|
||||||
|
|
||||||
useFocusEffect(
|
|
||||||
useCallback(() => {
|
|
||||||
onLoadData();
|
|
||||||
}, [id])
|
|
||||||
);
|
|
||||||
|
|
||||||
const onLoadData = async () => {
|
|
||||||
try {
|
|
||||||
const response = await apiInvestmentGetInvoice({
|
|
||||||
id: id as string,
|
|
||||||
category: "invoice",
|
|
||||||
});
|
|
||||||
|
|
||||||
setData(response.data);
|
|
||||||
} catch (error) {
|
|
||||||
console.log("[ERROR]", error);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const handlerSubmitUpdate = async () => {
|
|
||||||
try {
|
|
||||||
setIsLoading(true);
|
|
||||||
const responseUploadImage = await uploadFileService({
|
|
||||||
dirId: DIRECTORY_ID.investasi_bukti_transfer,
|
|
||||||
imageUri: image?.uri,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!responseUploadImage?.data?.id) {
|
|
||||||
Toast.show({
|
|
||||||
type: "error",
|
|
||||||
text1: "Gagal mengunggah bukti transfer",
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const response = await apiInvestmentUpdateInvoice({
|
|
||||||
id: id as string,
|
|
||||||
data: {
|
|
||||||
imageId: responseUploadImage?.data?.id,
|
|
||||||
},
|
|
||||||
status: "proses",
|
|
||||||
});
|
|
||||||
|
|
||||||
if (response.success) {
|
|
||||||
Toast.show({
|
|
||||||
type: "success",
|
|
||||||
text1: "Berhasil mengunggah bukti transfer",
|
|
||||||
});
|
|
||||||
router.push(`/investment/${id}/(transaction-flow)/process`);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.log("[ERROR]", error);
|
|
||||||
} finally {
|
|
||||||
setIsLoading(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<ViewWrapper>
|
<Investment_ScreenTransaction />
|
||||||
<StackCustom>
|
|
||||||
<InformationBox text="Mohon transfer ke rekening dibawah" />
|
|
||||||
<BaseBox>
|
|
||||||
<StackCustom gap={"xs"}>
|
|
||||||
<Grid>
|
|
||||||
<Grid.Col span={4}>
|
|
||||||
<TextCustom>Bank</TextCustom>
|
|
||||||
</Grid.Col>
|
|
||||||
<Grid.Col span={8}>
|
|
||||||
<TextCustom>{data?.MasterBank?.namaBank}</TextCustom>
|
|
||||||
</Grid.Col>
|
|
||||||
</Grid>
|
|
||||||
<Spacing height={10} />
|
|
||||||
<Grid>
|
|
||||||
<Grid.Col span={4}>
|
|
||||||
<TextCustom>Nama Akun</TextCustom>
|
|
||||||
</Grid.Col>
|
|
||||||
<Grid.Col span={8}>
|
|
||||||
<TextCustom>{data?.MasterBank?.namaAkun}</TextCustom>
|
|
||||||
</Grid.Col>
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
<BaseBox backgroundColor={MainColor.soft_darkblue}>
|
|
||||||
<Grid containerStyle={{ justifyContent: "center" }}>
|
|
||||||
<Grid.Col
|
|
||||||
span={8}
|
|
||||||
style={{
|
|
||||||
justifyContent: "center",
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<TextCustom size="xlarge" bold color="yellow">
|
|
||||||
{data?.MasterBank?.norek}
|
|
||||||
</TextCustom>
|
|
||||||
</Grid.Col>
|
|
||||||
<Grid.Col
|
|
||||||
span={4}
|
|
||||||
style={{
|
|
||||||
alignItems: "flex-end",
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<CopyButton textToCopy={data?.MasterBank?.norek} />
|
|
||||||
</Grid.Col>
|
|
||||||
</Grid>
|
|
||||||
</BaseBox>
|
|
||||||
</StackCustom>
|
|
||||||
</BaseBox>
|
|
||||||
|
|
||||||
<BaseBox>
|
|
||||||
<StackCustom gap={"xs"}>
|
|
||||||
<TextCustom>Jumlah Transaksi</TextCustom>
|
|
||||||
|
|
||||||
<Spacing height={10} />
|
|
||||||
|
|
||||||
<BaseBox backgroundColor={MainColor.soft_darkblue}>
|
|
||||||
<Grid containerStyle={{ justifyContent: "center" }}>
|
|
||||||
<Grid.Col
|
|
||||||
span={8}
|
|
||||||
style={{
|
|
||||||
justifyContent: "center",
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<TextCustom size="xlarge" bold color="yellow">
|
|
||||||
Rp. {formatCurrencyDisplay(data?.nominal)}
|
|
||||||
</TextCustom>
|
|
||||||
</Grid.Col>
|
|
||||||
<Grid.Col
|
|
||||||
span={4}
|
|
||||||
style={{
|
|
||||||
alignItems: "flex-end",
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<CopyButton textToCopy={data?.nominal} />
|
|
||||||
</Grid.Col>
|
|
||||||
</Grid>
|
|
||||||
</BaseBox>
|
|
||||||
</StackCustom>
|
|
||||||
</BaseBox>
|
|
||||||
|
|
||||||
<BaseBox>
|
|
||||||
<StackCustom>
|
|
||||||
<TextCustom align="center">
|
|
||||||
Upload bukti transfer anda.
|
|
||||||
</TextCustom>
|
|
||||||
{image ? (
|
|
||||||
<View
|
|
||||||
style={{
|
|
||||||
flexDirection: "row",
|
|
||||||
alignItems: "center",
|
|
||||||
justifyContent: "center",
|
|
||||||
gap: 10,
|
|
||||||
paddingInline: 20,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<TextCustom bold align="center" truncate>
|
|
||||||
{image?.name}
|
|
||||||
</TextCustom>
|
|
||||||
</View>
|
|
||||||
) : (
|
|
||||||
<TextCustom align="center">
|
|
||||||
Tidak ada gambar yang diunggah
|
|
||||||
</TextCustom>
|
|
||||||
)}
|
|
||||||
<ButtonCenteredOnly
|
|
||||||
onPress={() => {
|
|
||||||
pickFile({
|
|
||||||
allowedType: "image",
|
|
||||||
setImageUri(file: any) {
|
|
||||||
setImage(file);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
icon="upload"
|
|
||||||
>
|
|
||||||
Upload
|
|
||||||
</ButtonCenteredOnly>
|
|
||||||
</StackCustom>
|
|
||||||
</BaseBox>
|
|
||||||
|
|
||||||
<ButtonCustom
|
|
||||||
isLoading={isLoading}
|
|
||||||
disabled={!image || isLoading}
|
|
||||||
onPress={() => {
|
|
||||||
handlerSubmitUpdate();
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Saya Sudah Transfer
|
|
||||||
</ButtonCustom>
|
|
||||||
</StackCustom>
|
|
||||||
<Spacing />
|
|
||||||
</ViewWrapper>
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,7 +56,6 @@ export default function InvestmentSelectBank() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (response.success) {
|
if (response.success) {
|
||||||
console.log("[RESPONSE >>]", response);
|
|
||||||
const invoiceId = response.data.id;
|
const invoiceId = response.data.id;
|
||||||
|
|
||||||
const delStorage = await AsyncStorage.removeItem(
|
const delStorage = await AsyncStorage.removeItem(
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ export default function ProfileDetailBlocked() {
|
|||||||
|
|
||||||
const fetchData = async () => {
|
const fetchData = async () => {
|
||||||
const response = await apiGetBlockedById({ id: String(id) });
|
const response = await apiGetBlockedById({ id: String(id) });
|
||||||
// console.log("[RESPONSE >>]", JSON.stringify(response, null, 2));
|
|
||||||
setData(response.data);
|
setData(response.data);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<!-- ===================== Start Penerapan Pagination ===================== -->
|
<!-- ===================== Start Penerapan Pagination ===================== -->
|
||||||
|
|
||||||
File utama: screens/Voting/ScreenListOfContributor.tsx
|
File utama: screens/Invesment/ScreenTransaction.tsx
|
||||||
Function fecth: apiVotingContribution
|
Function fecth: apiInvestmentGetInvoice
|
||||||
File function fetch: service/api-client/api-voting.ts
|
File function fetch: service/api-client/api-investment.ts
|
||||||
File komponen wrapper: components/_ShareComponent/NewWrapper.tsx
|
File komponen wrapper: components/_ShareComponent/NewWrapper.tsx
|
||||||
|
|
||||||
Terapkan pagination pada file "File utama"
|
Terapkan pagination pada file "File utama"
|
||||||
@@ -16,7 +16,7 @@ Jika tidak ada props page maka tambahkan props page dan default page: "1"
|
|||||||
Gunakan bahasa indonesia pada cli agar saya mudah membacanya.
|
Gunakan bahasa indonesia pada cli agar saya mudah membacanya.
|
||||||
|
|
||||||
<!-- Additional Prompt -->
|
<!-- Additional Prompt -->
|
||||||
File refrensi: app/(application)/(user)/event/[id]/list-of-participants.tsx
|
File refrensi: screens/Event/ScreenStatus.tsx
|
||||||
Anda bisa menggunakan refrensi dari "File refrensi" jika butuh pemahaman dengan tipe fitur yang sama
|
Anda bisa menggunakan refrensi dari "File refrensi" jika butuh pemahaman dengan tipe fitur yang sama
|
||||||
|
|
||||||
<!-- ===================== End Penerapan Pagination ===================== -->
|
<!-- ===================== End Penerapan Pagination ===================== -->
|
||||||
@@ -29,3 +29,7 @@ Component yang digunakan: components/_ShareComponent/NewWrapper.tsx , karena ini
|
|||||||
Bantu saya untuk memperbaiki logika path yang ada di dalam file "screens/Admin/Notification-Admin/ScreenNotificationAdmin2.tsx" , pada function fixPath
|
Bantu saya untuk memperbaiki logika path yang ada di dalam file "screens/Admin/Notification-Admin/ScreenNotificationAdmin2.tsx" , pada function fixPath
|
||||||
Saya ingin jika didalam deeplink ada "/admin/..." contoh "/admin/event/review/status" maka path yang akan di redirect adalah "/admin/event/review/status"
|
Saya ingin jika didalam deeplink ada "/admin/..." contoh "/admin/event/review/status" maka path yang akan di redirect adalah "/admin/event/review/status"
|
||||||
jika tidak maka terapkan sesuai dengan logika yang sudah ada
|
jika tidak maka terapkan sesuai dengan logika yang sudah ada
|
||||||
|
|
||||||
|
Bagaimana menangani bug berikut pada file berikut: screens/Invesment/Document/ScreenRecap.tsx
|
||||||
|
Ini adalah halaman yang memiliki fungsi pagination , saya membuat data dummy dimana menghasilkan data urut 1-9, saya mencoba memuat halaman setiap page nya 4 saja untuk percobaan.
|
||||||
|
Saat awal muncul komponent box dengan data 9 - 6, kemudian saya hapus data ke 8 . lalu saya coba scroll ke bawah seharusnya angka akan tetap urut 9, 7, 6, 5, 4 ... 1. Tapi dalam case ini setelah 8 di hapus kemudian saya scroll box ke 5 tidak muncul saat di scroll. Apakah anda mengerti maksud saya ?
|
||||||
|
|||||||
@@ -16,6 +16,9 @@ export default function Investment_ButtonStatusSection({
|
|||||||
status: string;
|
status: string;
|
||||||
buttonPublish?: React.ReactNode;
|
buttonPublish?: React.ReactNode;
|
||||||
}) {
|
}) {
|
||||||
|
const path : any= (status: string) => {
|
||||||
|
return `/investment/(tabs)/portofolio?status=${status}`;
|
||||||
|
};
|
||||||
const [isLoading, setIsLoading] = useState(false);
|
const [isLoading, setIsLoading] = useState(false);
|
||||||
const handleBatalkanReview = () => {
|
const handleBatalkanReview = () => {
|
||||||
AlertDefaultSystem({
|
AlertDefaultSystem({
|
||||||
@@ -30,13 +33,13 @@ export default function Investment_ButtonStatusSection({
|
|||||||
id: id as string,
|
id: id as string,
|
||||||
status: "draft",
|
status: "draft",
|
||||||
});
|
});
|
||||||
console.log("[RESPONSE]", JSON.stringify(response, null, 2));
|
|
||||||
if (response.success) {
|
if (response.success) {
|
||||||
Toast.show({
|
Toast.show({
|
||||||
type: "success",
|
type: "success",
|
||||||
text1: "Berhasil Batalkan Review",
|
text1: "Berhasil Batalkan Review",
|
||||||
});
|
});
|
||||||
router.back();
|
router.replace(path("draft"));
|
||||||
} else {
|
} else {
|
||||||
Toast.show({
|
Toast.show({
|
||||||
type: "error",
|
type: "error",
|
||||||
@@ -65,13 +68,13 @@ export default function Investment_ButtonStatusSection({
|
|||||||
id: id as string,
|
id: id as string,
|
||||||
status: "review",
|
status: "review",
|
||||||
});
|
});
|
||||||
console.log("[RESPONSE]", JSON.stringify(response, null, 2));
|
|
||||||
if (response.success) {
|
if (response.success) {
|
||||||
Toast.show({
|
Toast.show({
|
||||||
type: "success",
|
type: "success",
|
||||||
text1: "Berhasil Ajukan Review",
|
text1: "Berhasil Ajukan Review",
|
||||||
});
|
});
|
||||||
router.back();
|
router.replace(path("review"));
|
||||||
} else {
|
} else {
|
||||||
Toast.show({
|
Toast.show({
|
||||||
type: "error",
|
type: "error",
|
||||||
@@ -100,13 +103,13 @@ export default function Investment_ButtonStatusSection({
|
|||||||
id: id as string,
|
id: id as string,
|
||||||
status: "draft",
|
status: "draft",
|
||||||
});
|
});
|
||||||
console.log("[RESPONSE]", JSON.stringify(response, null, 2));
|
|
||||||
if (response.success) {
|
if (response.success) {
|
||||||
Toast.show({
|
Toast.show({
|
||||||
type: "success",
|
type: "success",
|
||||||
text1: "Berhasil Update Status",
|
text1: "Berhasil Update Status",
|
||||||
});
|
});
|
||||||
router.back();
|
router.replace(path("draft"));
|
||||||
} else {
|
} else {
|
||||||
Toast.show({
|
Toast.show({
|
||||||
type: "error",
|
type: "error",
|
||||||
@@ -135,8 +138,6 @@ export default function Investment_ButtonStatusSection({
|
|||||||
id: id as string,
|
id: id as string,
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log("[RESPONSE DELETE]", JSON.stringify(response, null, 2));
|
|
||||||
|
|
||||||
if (response.success) {
|
if (response.success) {
|
||||||
Toast.show({
|
Toast.show({
|
||||||
type: "success",
|
type: "success",
|
||||||
|
|||||||
@@ -16,10 +16,7 @@ export default function Investment_BoxDetailDocument({
|
|||||||
<Grid>
|
<Grid>
|
||||||
<Grid.Col span={leftIcon ? 10 : 12}>
|
<Grid.Col span={leftIcon ? 10 : 12}>
|
||||||
<ClickableCustom onPress={() => router.push(href as any)}>
|
<ClickableCustom onPress={() => router.push(href as any)}>
|
||||||
<TextCustom truncate>
|
<TextCustom truncate>{title || "-"}</TextCustom>
|
||||||
{title ||
|
|
||||||
`Judul Dokumen: Lorem, ipsum dolor sit amet consectetur adipisicing elit.`}
|
|
||||||
</TextCustom>
|
|
||||||
</ClickableCustom>
|
</ClickableCustom>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
{leftIcon && <Grid.Col span={2}>{leftIcon}</Grid.Col>}
|
{leftIcon && <Grid.Col span={2}>{leftIcon}</Grid.Col>}
|
||||||
|
|||||||
76
screens/Invesment/Document/ScreenListDocument.tsx
Normal file
76
screens/Invesment/Document/ScreenListDocument.tsx
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
|
import { TextCustom } from "@/components";
|
||||||
|
import NewWrapper from "@/components/_ShareComponent/NewWrapper";
|
||||||
|
import { PAGINATION_DEFAULT_TAKE } from "@/constants/constans-value";
|
||||||
|
import { createPaginationComponents } from "@/helpers/paginationHelpers";
|
||||||
|
import { usePagination } from "@/hooks/use-pagination";
|
||||||
|
import Investment_BoxDetailDocument from "@/screens/Invesment/Document/RecapBoxDetail";
|
||||||
|
import { apiInvestmentGetDocument } from "@/service/api-client/api-investment";
|
||||||
|
import { useFocusEffect, useLocalSearchParams } from "expo-router";
|
||||||
|
import _ from "lodash";
|
||||||
|
import { useCallback } from "react";
|
||||||
|
import { RefreshControl } from "react-native";
|
||||||
|
|
||||||
|
export default function Investment_ScreenListOfDocument() {
|
||||||
|
const { id } = useLocalSearchParams();
|
||||||
|
console.log("ID >> ", id);
|
||||||
|
|
||||||
|
// Setup pagination
|
||||||
|
const pagination = usePagination({
|
||||||
|
fetchFunction: async (page) => {
|
||||||
|
if (!id) return { data: [] };
|
||||||
|
|
||||||
|
return await apiInvestmentGetDocument({
|
||||||
|
id: id as string,
|
||||||
|
category: "all-document",
|
||||||
|
page: String(page),
|
||||||
|
});
|
||||||
|
},
|
||||||
|
pageSize: PAGINATION_DEFAULT_TAKE,
|
||||||
|
dependencies: [id],
|
||||||
|
onError: (error) => console.error("[ERROR] Fetch document:", error),
|
||||||
|
});
|
||||||
|
|
||||||
|
// Generate komponen
|
||||||
|
const { ListEmptyComponent, ListFooterComponent } =
|
||||||
|
createPaginationComponents({
|
||||||
|
loading: pagination.loading,
|
||||||
|
refreshing: pagination.refreshing,
|
||||||
|
listData: pagination.listData,
|
||||||
|
emptyMessage: "Tidak ada dokumen",
|
||||||
|
skeletonCount: PAGINATION_DEFAULT_TAKE,
|
||||||
|
skeletonHeight: 100,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Render item dokumen
|
||||||
|
const renderDocumentItem = ({ item }: { item: any }) => (
|
||||||
|
<Investment_BoxDetailDocument
|
||||||
|
key={item.id}
|
||||||
|
title={item.title}
|
||||||
|
href={`/(file)/${item.fileId}`}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
useFocusEffect(
|
||||||
|
useCallback(() => {
|
||||||
|
pagination.onRefresh();
|
||||||
|
}, [id]),
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<NewWrapper
|
||||||
|
hideFooter
|
||||||
|
listData={pagination.listData}
|
||||||
|
renderItem={renderDocumentItem}
|
||||||
|
refreshControl={
|
||||||
|
<RefreshControl
|
||||||
|
refreshing={pagination.refreshing}
|
||||||
|
onRefresh={pagination.onRefresh}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
onEndReached={pagination.loadMore}
|
||||||
|
ListEmptyComponent={ListEmptyComponent}
|
||||||
|
ListFooterComponent={ListFooterComponent}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
233
screens/Invesment/Document/ScreenRecap.tsx
Normal file
233
screens/Invesment/Document/ScreenRecap.tsx
Normal file
@@ -0,0 +1,233 @@
|
|||||||
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
|
import {
|
||||||
|
AlertDefaultSystem,
|
||||||
|
BackButton,
|
||||||
|
DotButton,
|
||||||
|
DrawerCustom,
|
||||||
|
MenuDrawerDynamicGrid,
|
||||||
|
TextCustom,
|
||||||
|
} from "@/components";
|
||||||
|
import NewWrapper from "@/components/_ShareComponent/NewWrapper";
|
||||||
|
import { IconEdit } from "@/components/_Icon";
|
||||||
|
import { PAGINATION_DEFAULT_TAKE } from "@/constants/constans-value";
|
||||||
|
import { MainColor } from "@/constants/color-palet";
|
||||||
|
import { ICON_SIZE_SMALL } from "@/constants/constans-value";
|
||||||
|
import { createPaginationComponents } from "@/helpers/paginationHelpers";
|
||||||
|
import { usePagination } from "@/hooks/use-pagination";
|
||||||
|
import Investment_BoxDetailDocument from "@/screens/Invesment/Document/RecapBoxDetail";
|
||||||
|
import {
|
||||||
|
apiInvestmentDeleteDocument,
|
||||||
|
apiInvestmentGetDocument,
|
||||||
|
} from "@/service/api-client/api-investment";
|
||||||
|
import { AntDesign, Ionicons } from "@expo/vector-icons";
|
||||||
|
import {
|
||||||
|
router,
|
||||||
|
Stack,
|
||||||
|
useFocusEffect,
|
||||||
|
useLocalSearchParams,
|
||||||
|
} from "expo-router";
|
||||||
|
import _ from "lodash";
|
||||||
|
import { useCallback, useState } from "react";
|
||||||
|
import { RefreshControl } from "react-native";
|
||||||
|
import Toast from "react-native-toast-message";
|
||||||
|
|
||||||
|
export default function Investment_ScreenRecap() {
|
||||||
|
const { id } = useLocalSearchParams();
|
||||||
|
const [openDrawer, setOpenDrawer] = useState(false);
|
||||||
|
const [openDrawerBox, setOpenDrawerBox] = useState(false);
|
||||||
|
const [selectId, setSelectId] = useState<string | null>(null);
|
||||||
|
|
||||||
|
// Setup pagination
|
||||||
|
const pagination = usePagination({
|
||||||
|
fetchFunction: async (page) => {
|
||||||
|
if (!id) return { data: [] };
|
||||||
|
|
||||||
|
return await apiInvestmentGetDocument({
|
||||||
|
id: id as string,
|
||||||
|
category: "all-document",
|
||||||
|
page: String(page),
|
||||||
|
});
|
||||||
|
},
|
||||||
|
pageSize: PAGINATION_DEFAULT_TAKE,
|
||||||
|
dependencies: [id],
|
||||||
|
onError: (error) => console.error("[ERROR] Fetch document:", error),
|
||||||
|
});
|
||||||
|
|
||||||
|
// Generate komponen
|
||||||
|
const { ListEmptyComponent, ListFooterComponent } =
|
||||||
|
createPaginationComponents({
|
||||||
|
loading: pagination.loading,
|
||||||
|
refreshing: pagination.refreshing,
|
||||||
|
listData: pagination.listData,
|
||||||
|
emptyMessage: "Tidak ada dokumen",
|
||||||
|
skeletonCount: PAGINATION_DEFAULT_TAKE,
|
||||||
|
skeletonHeight: 100,
|
||||||
|
});
|
||||||
|
|
||||||
|
const handlerDeleteDocument = async () => {
|
||||||
|
try {
|
||||||
|
const response = await apiInvestmentDeleteDocument({
|
||||||
|
id: selectId as string,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (response.success) {
|
||||||
|
Toast.show({
|
||||||
|
type: "success",
|
||||||
|
text1: "Data berhasil dihapus",
|
||||||
|
});
|
||||||
|
// Hapus item dari list
|
||||||
|
pagination.setListData((prev: any) => {
|
||||||
|
if (!prev) return null;
|
||||||
|
return prev.filter((item: any) => item.id !== selectId);
|
||||||
|
});
|
||||||
|
|
||||||
|
pagination.onRefresh();
|
||||||
|
setOpenDrawerBox(false);
|
||||||
|
setSelectId(null);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log("[ERROR]", error);
|
||||||
|
Toast.show({
|
||||||
|
type: "error",
|
||||||
|
text1: "Gagal menghapus data",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
useFocusEffect(
|
||||||
|
useCallback(() => {
|
||||||
|
pagination.onRefresh();
|
||||||
|
}, []),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Render item dokumen
|
||||||
|
const renderDocumentItem = ({ item }: { item: any }) => (
|
||||||
|
<Investment_BoxDetailDocument
|
||||||
|
key={item.id}
|
||||||
|
title={item.title}
|
||||||
|
leftIcon={
|
||||||
|
<Ionicons
|
||||||
|
name="ellipsis-horizontal-outline"
|
||||||
|
size={ICON_SIZE_SMALL}
|
||||||
|
color={MainColor.white}
|
||||||
|
style={{
|
||||||
|
zIndex: 10,
|
||||||
|
alignSelf: "flex-end",
|
||||||
|
}}
|
||||||
|
onPress={() => {
|
||||||
|
setSelectId(item.id);
|
||||||
|
setOpenDrawerBox(true);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
href={`/(file)/${item.fileId}`}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Stack.Screen
|
||||||
|
options={{
|
||||||
|
title: "Rekap Dokumen",
|
||||||
|
headerLeft: () => <BackButton />,
|
||||||
|
headerRight: () => (
|
||||||
|
<DotButton
|
||||||
|
onPress={() => {
|
||||||
|
setOpenDrawer(true);
|
||||||
|
setOpenDrawerBox(false);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<NewWrapper
|
||||||
|
hideFooter
|
||||||
|
listData={pagination.listData}
|
||||||
|
renderItem={renderDocumentItem}
|
||||||
|
refreshControl={
|
||||||
|
<RefreshControl
|
||||||
|
refreshing={pagination.refreshing}
|
||||||
|
onRefresh={pagination.onRefresh}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
onEndReached={pagination.loadMore}
|
||||||
|
ListEmptyComponent={ListEmptyComponent}
|
||||||
|
ListFooterComponent={ListFooterComponent}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{/* Drawer On Header */}
|
||||||
|
<DrawerCustom
|
||||||
|
isVisible={openDrawer}
|
||||||
|
closeDrawer={() => setOpenDrawer(false)}
|
||||||
|
height={"auto"}
|
||||||
|
>
|
||||||
|
<MenuDrawerDynamicGrid
|
||||||
|
data={[
|
||||||
|
{
|
||||||
|
icon: (
|
||||||
|
<AntDesign
|
||||||
|
name="plus-circle"
|
||||||
|
size={ICON_SIZE_SMALL}
|
||||||
|
color={MainColor.white}
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
label: "Tambah Dokumen",
|
||||||
|
path: `/investment/${id}/(document)/add-document`,
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
onPressItem={(item) => {
|
||||||
|
router.push(item.path as any);
|
||||||
|
setOpenDrawer(false);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</DrawerCustom>
|
||||||
|
|
||||||
|
{/* Drawer On Box */}
|
||||||
|
<DrawerCustom
|
||||||
|
isVisible={openDrawerBox}
|
||||||
|
closeDrawer={() => setOpenDrawerBox(false)}
|
||||||
|
height={"auto"}
|
||||||
|
>
|
||||||
|
<MenuDrawerDynamicGrid
|
||||||
|
data={[
|
||||||
|
{
|
||||||
|
icon: <IconEdit />,
|
||||||
|
label: "Edit Dokumen",
|
||||||
|
path: `/investment/${selectId}/(document)/edit-document`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: (
|
||||||
|
<Ionicons
|
||||||
|
name="trash-outline"
|
||||||
|
size={ICON_SIZE_SMALL}
|
||||||
|
color={MainColor.white}
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
label: "Hapus Dokumen",
|
||||||
|
path: "" as any,
|
||||||
|
color: MainColor.red,
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
onPressItem={(item) => {
|
||||||
|
if (item.path === ("" as any)) {
|
||||||
|
AlertDefaultSystem({
|
||||||
|
title: "Hapus Dokumen",
|
||||||
|
message: "Apakah anda yakin ingin menghapus dokumen ini?",
|
||||||
|
textLeft: "Batal",
|
||||||
|
textRight: "Hapus",
|
||||||
|
onPressRight: () => {
|
||||||
|
handlerDeleteDocument();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
router.push(item.path as any);
|
||||||
|
}
|
||||||
|
|
||||||
|
setOpenDrawerBox(false);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</DrawerCustom>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
67
screens/Invesment/ScreenBursa.tsx
Normal file
67
screens/Invesment/ScreenBursa.tsx
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
import {
|
||||||
|
FloatingButton,
|
||||||
|
TextCustom,
|
||||||
|
} from "@/components";
|
||||||
|
import NewWrapper from "@/components/_ShareComponent/NewWrapper";
|
||||||
|
import { PAGINATION_DEFAULT_TAKE } from "@/constants/constans-value";
|
||||||
|
import { createPaginationComponents } from "@/helpers/paginationHelpers";
|
||||||
|
import { usePagination } from "@/hooks/use-pagination";
|
||||||
|
import Investment_BoxBerandaSection from "@/screens/Invesment/BoxBerandaSection";
|
||||||
|
import { apiInvestmentGetAll } from "@/service/api-client/api-investment";
|
||||||
|
import { router } from "expo-router";
|
||||||
|
import _ from "lodash";
|
||||||
|
import { RefreshControl } from "react-native";
|
||||||
|
|
||||||
|
export default function Investment_ScreenBursa() {
|
||||||
|
// Setup pagination
|
||||||
|
const pagination = usePagination({
|
||||||
|
fetchFunction: async (page) => {
|
||||||
|
return await apiInvestmentGetAll({
|
||||||
|
category: "bursa",
|
||||||
|
page: String(page),
|
||||||
|
});
|
||||||
|
},
|
||||||
|
pageSize: PAGINATION_DEFAULT_TAKE,
|
||||||
|
dependencies: [],
|
||||||
|
onError: (error) => console.error("[ERROR] Fetch investment bursa:", error),
|
||||||
|
});
|
||||||
|
|
||||||
|
// Generate komponen
|
||||||
|
const { ListEmptyComponent, ListFooterComponent } = createPaginationComponents({
|
||||||
|
loading: pagination.loading,
|
||||||
|
refreshing: pagination.refreshing,
|
||||||
|
listData: pagination.listData,
|
||||||
|
emptyMessage: "Belum ada investasi",
|
||||||
|
skeletonCount: PAGINATION_DEFAULT_TAKE,
|
||||||
|
skeletonHeight: 100,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Render item investment
|
||||||
|
const renderInvestmentItem = ({ item }: { item: any }) => (
|
||||||
|
<Investment_BoxBerandaSection
|
||||||
|
key={item.id}
|
||||||
|
id={item.id}
|
||||||
|
data={item}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<NewWrapper
|
||||||
|
listData={pagination.listData}
|
||||||
|
renderItem={renderInvestmentItem}
|
||||||
|
refreshControl={
|
||||||
|
<RefreshControl
|
||||||
|
refreshing={pagination.refreshing}
|
||||||
|
onRefresh={pagination.onRefresh}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
onEndReached={pagination.loadMore}
|
||||||
|
ListEmptyComponent={ListEmptyComponent}
|
||||||
|
ListFooterComponent={ListFooterComponent}
|
||||||
|
hideFooter
|
||||||
|
floatingButton={
|
||||||
|
<FloatingButton onPress={() => router.push("/investment/create")} />
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
102
screens/Invesment/ScreenPortofolio.tsx
Normal file
102
screens/Invesment/ScreenPortofolio.tsx
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
|
import { ScrollableCustom, TextCustom } from "@/components";
|
||||||
|
import NewWrapper from "@/components/_ShareComponent/NewWrapper";
|
||||||
|
import { PAGINATION_DEFAULT_TAKE } from "@/constants/constans-value";
|
||||||
|
import { createPaginationComponents } from "@/helpers/paginationHelpers";
|
||||||
|
import { useAuth } from "@/hooks/use-auth";
|
||||||
|
import { usePagination } from "@/hooks/use-pagination";
|
||||||
|
import { dummyMasterStatus } from "@/lib/dummy-data/_master/status";
|
||||||
|
import Investment_StatusBox from "@/screens/Invesment/StatusBox";
|
||||||
|
import { apiInvestmentGetByStatus } from "@/service/api-client/api-investment";
|
||||||
|
import { useFocusEffect, useLocalSearchParams } from "expo-router";
|
||||||
|
import { useCallback, useState } from "react";
|
||||||
|
import { RefreshControl } from "react-native";
|
||||||
|
|
||||||
|
export default function Investment_ScreenPortofolio() {
|
||||||
|
const { user } = useAuth();
|
||||||
|
const { status } = useLocalSearchParams<{ status?: string }>();
|
||||||
|
|
||||||
|
const [activeCategory, setActiveCategory] = useState<string | null>(
|
||||||
|
status || "publish",
|
||||||
|
);
|
||||||
|
|
||||||
|
// Setup pagination
|
||||||
|
const pagination = usePagination({
|
||||||
|
fetchFunction: async (page) => {
|
||||||
|
if (!user?.id) return { data: [] };
|
||||||
|
|
||||||
|
return await apiInvestmentGetByStatus({
|
||||||
|
authorId: user.id,
|
||||||
|
status: activeCategory!,
|
||||||
|
page: String(page),
|
||||||
|
});
|
||||||
|
},
|
||||||
|
pageSize: PAGINATION_DEFAULT_TAKE,
|
||||||
|
dependencies: [user?.id, activeCategory],
|
||||||
|
onError: (error) =>
|
||||||
|
console.error("[ERROR] Fetch investment by status:", error),
|
||||||
|
});
|
||||||
|
|
||||||
|
// Generate komponen
|
||||||
|
const { ListEmptyComponent, ListFooterComponent } =
|
||||||
|
createPaginationComponents({
|
||||||
|
loading: pagination.loading,
|
||||||
|
refreshing: pagination.refreshing,
|
||||||
|
listData: pagination.listData,
|
||||||
|
emptyMessage: `Tidak ada data ${activeCategory}`,
|
||||||
|
skeletonCount: PAGINATION_DEFAULT_TAKE,
|
||||||
|
skeletonHeight: 150,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Render item investment
|
||||||
|
const renderInvestmentItem = ({ item }: { item: any }) => (
|
||||||
|
<Investment_StatusBox
|
||||||
|
key={item.id}
|
||||||
|
data={item}
|
||||||
|
status={activeCategory as string}
|
||||||
|
href={`/investment/${item.id}/${activeCategory}/detail`}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
const handlePress = (item: any) => {
|
||||||
|
setActiveCategory(item.value);
|
||||||
|
// Reset pagination saat kategori berubah
|
||||||
|
pagination.reset();
|
||||||
|
};
|
||||||
|
|
||||||
|
useFocusEffect(
|
||||||
|
useCallback(() => {
|
||||||
|
pagination.onRefresh();
|
||||||
|
}, [activeCategory]),
|
||||||
|
);
|
||||||
|
|
||||||
|
const tabsComponent = (
|
||||||
|
<ScrollableCustom
|
||||||
|
data={dummyMasterStatus.map((e, i) => ({
|
||||||
|
id: i,
|
||||||
|
label: e.label,
|
||||||
|
value: e.value,
|
||||||
|
}))}
|
||||||
|
onButtonPress={handlePress}
|
||||||
|
activeId={activeCategory as any}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<NewWrapper
|
||||||
|
hideFooter
|
||||||
|
headerComponent={tabsComponent}
|
||||||
|
listData={pagination.listData}
|
||||||
|
renderItem={renderInvestmentItem}
|
||||||
|
refreshControl={
|
||||||
|
<RefreshControl
|
||||||
|
refreshing={pagination.refreshing}
|
||||||
|
onRefresh={pagination.onRefresh}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
onEndReached={pagination.loadMore}
|
||||||
|
ListEmptyComponent={ListEmptyComponent}
|
||||||
|
ListFooterComponent={ListFooterComponent}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
144
screens/Invesment/ScreenTransaction.tsx
Normal file
144
screens/Invesment/ScreenTransaction.tsx
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
|
import {
|
||||||
|
BadgeCustom,
|
||||||
|
BaseBox,
|
||||||
|
Grid,
|
||||||
|
Spacing,
|
||||||
|
StackCustom,
|
||||||
|
TextCustom,
|
||||||
|
} from "@/components";
|
||||||
|
import NewWrapper from "@/components/_ShareComponent/NewWrapper";
|
||||||
|
import NoDataText from "@/components/_ShareComponent/NoDataText";
|
||||||
|
import { PAGINATION_DEFAULT_TAKE } from "@/constants/constans-value";
|
||||||
|
import { createPaginationComponents } from "@/helpers/paginationHelpers";
|
||||||
|
import { useAuth } from "@/hooks/use-auth";
|
||||||
|
import { usePagination } from "@/hooks/use-pagination";
|
||||||
|
import { apiInvestmentGetInvoice } from "@/service/api-client/api-investment";
|
||||||
|
import { GStyles } from "@/styles/global-styles";
|
||||||
|
import { formatChatTime } from "@/utils/formatChatTime";
|
||||||
|
import { formatCurrencyDisplay } from "@/utils/formatCurrencyDisplay";
|
||||||
|
import { router, useFocusEffect } from "expo-router";
|
||||||
|
import _ from "lodash";
|
||||||
|
import { useCallback } from "react";
|
||||||
|
import { RefreshControl, View } from "react-native";
|
||||||
|
|
||||||
|
export default function Investment_ScreenTransaction() {
|
||||||
|
const { user } = useAuth();
|
||||||
|
|
||||||
|
// Setup pagination
|
||||||
|
const pagination = usePagination({
|
||||||
|
fetchFunction: async (page) => {
|
||||||
|
if (!user?.id) return { data: [] };
|
||||||
|
|
||||||
|
return await apiInvestmentGetInvoice({
|
||||||
|
authorId: user.id,
|
||||||
|
category: "transaction",
|
||||||
|
page: String(page),
|
||||||
|
});
|
||||||
|
},
|
||||||
|
pageSize: PAGINATION_DEFAULT_TAKE,
|
||||||
|
dependencies: [user?.id],
|
||||||
|
onError: (error) => console.error("[ERROR] Fetch transaction:", error),
|
||||||
|
});
|
||||||
|
|
||||||
|
// Generate komponen
|
||||||
|
const { ListEmptyComponent, ListFooterComponent } =
|
||||||
|
createPaginationComponents({
|
||||||
|
loading: pagination.loading,
|
||||||
|
refreshing: pagination.refreshing,
|
||||||
|
listData: pagination.listData,
|
||||||
|
emptyMessage: "Tidak ada transaksi",
|
||||||
|
skeletonCount: PAGINATION_DEFAULT_TAKE,
|
||||||
|
skeletonHeight: 100,
|
||||||
|
});
|
||||||
|
|
||||||
|
const handlerColor = (status: string) => {
|
||||||
|
if (status === "menunggu") {
|
||||||
|
return "orange";
|
||||||
|
} else if (status === "proses") {
|
||||||
|
return "white";
|
||||||
|
} else if (status === "berhasil") {
|
||||||
|
return "green";
|
||||||
|
} else if (status === "gagal") {
|
||||||
|
return "red";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handlePress = ({ id, status }: { id: string; status: string }) => {
|
||||||
|
if (status === "menunggu") {
|
||||||
|
router.push(`/investment/${id}/(transaction-flow)/invoice`);
|
||||||
|
} else if (status === "proses") {
|
||||||
|
router.push(`/investment/${id}/(transaction-flow)/process`);
|
||||||
|
} else if (status === "berhasil") {
|
||||||
|
router.push(`/investment/${id}/(transaction-flow)/success`);
|
||||||
|
} else if (status === "gagal") {
|
||||||
|
router.push(`/investment/${id}/(transaction-flow)/failed`);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Render item transaksi
|
||||||
|
const renderTransactionItem = ({ item }: { item: any }) => (
|
||||||
|
<BaseBox
|
||||||
|
key={item.id}
|
||||||
|
paddingTop={7}
|
||||||
|
paddingBottom={7}
|
||||||
|
onPress={() => {
|
||||||
|
handlePress({
|
||||||
|
id: item.id,
|
||||||
|
status: _.lowerCase(item.statusInvoice),
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Grid>
|
||||||
|
<Grid.Col span={6}>
|
||||||
|
<StackCustom gap={"xs"}>
|
||||||
|
<TextCustom truncate>{item?.title || "-"}</TextCustom>
|
||||||
|
<TextCustom color="gray" size="small">
|
||||||
|
{formatChatTime(item?.createdAt)}
|
||||||
|
</TextCustom>
|
||||||
|
</StackCustom>
|
||||||
|
</Grid.Col>
|
||||||
|
<Grid.Col span={1}>
|
||||||
|
<View />
|
||||||
|
</Grid.Col>
|
||||||
|
<Grid.Col span={5} style={{ alignItems: "flex-end" }}>
|
||||||
|
<StackCustom gap={"xs"}>
|
||||||
|
<TextCustom bold truncate>
|
||||||
|
Rp. {formatCurrencyDisplay(item?.nominal) || "-"}
|
||||||
|
</TextCustom>
|
||||||
|
<BadgeCustom
|
||||||
|
variant="light"
|
||||||
|
color={handlerColor(_.lowerCase(item.statusInvoice))}
|
||||||
|
style={GStyles.alignSelfFlexEnd}
|
||||||
|
>
|
||||||
|
{item?.statusInvoice || "-"}
|
||||||
|
</BadgeCustom>
|
||||||
|
</StackCustom>
|
||||||
|
</Grid.Col>
|
||||||
|
</Grid>
|
||||||
|
</BaseBox>
|
||||||
|
);
|
||||||
|
|
||||||
|
useFocusEffect(
|
||||||
|
useCallback(() => {
|
||||||
|
pagination.onRefresh();
|
||||||
|
}, [user?.id])
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<NewWrapper
|
||||||
|
hideFooter
|
||||||
|
listData={pagination.listData}
|
||||||
|
renderItem={renderTransactionItem}
|
||||||
|
refreshControl={
|
||||||
|
<RefreshControl
|
||||||
|
refreshing={pagination.refreshing}
|
||||||
|
onRefresh={pagination.onRefresh}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
onEndReached={pagination.loadMore}
|
||||||
|
ListEmptyComponent={ListEmptyComponent}
|
||||||
|
ListFooterComponent={ListFooterComponent}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -14,13 +14,15 @@ export async function apiInvestmentCreate({ data }: { data: any }) {
|
|||||||
export async function apiInvestmentGetByStatus({
|
export async function apiInvestmentGetByStatus({
|
||||||
authorId,
|
authorId,
|
||||||
status,
|
status,
|
||||||
|
page = "1",
|
||||||
}: {
|
}: {
|
||||||
authorId: string;
|
authorId: string;
|
||||||
status: string;
|
status: string;
|
||||||
|
page?: string;
|
||||||
}) {
|
}) {
|
||||||
try {
|
try {
|
||||||
const response = await apiConfig.get(
|
const response = await apiConfig.get(
|
||||||
`/mobile/investment/${authorId}/${status}`
|
`/mobile/investment/${authorId}/${status}?page=${page}`
|
||||||
);
|
);
|
||||||
return response.data;
|
return response.data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -103,13 +105,15 @@ export async function apiInvestmentUpsertDocument({
|
|||||||
export async function apiInvestmentGetDocument({
|
export async function apiInvestmentGetDocument({
|
||||||
id,
|
id,
|
||||||
category,
|
category,
|
||||||
|
page = "1",
|
||||||
}: {
|
}: {
|
||||||
id: string;
|
id: string;
|
||||||
category: "one-document" | "all-document";
|
category: "one-document" | "all-document";
|
||||||
|
page?: string;
|
||||||
}) {
|
}) {
|
||||||
try {
|
try {
|
||||||
const response = await apiConfig.get(
|
const response = await apiConfig.get(
|
||||||
`/mobile/investment/${id}/document?category=${category}`
|
`/mobile/investment/${id}/document?category=${category}&page=${page}`
|
||||||
);
|
);
|
||||||
return response.data;
|
return response.data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -131,15 +135,17 @@ export async function apiInvestmentDeleteDocument({ id }: { id: string }) {
|
|||||||
export async function apiInvestmentGetAll({
|
export async function apiInvestmentGetAll({
|
||||||
category,
|
category,
|
||||||
authorId,
|
authorId,
|
||||||
|
page = "1",
|
||||||
}: {
|
}: {
|
||||||
category: "my-holding" | "bursa";
|
category: "my-holding" | "bursa";
|
||||||
authorId?: string;
|
authorId?: string;
|
||||||
|
page?: string;
|
||||||
}) {
|
}) {
|
||||||
try {
|
try {
|
||||||
const response = await apiConfig.get(
|
const response = await apiConfig.get(
|
||||||
`/mobile/investment?category=${category}${
|
`/mobile/investment?category=${category}${
|
||||||
authorId ? `&authorId=${authorId}` : ""
|
authorId ? `&authorId=${authorId}` : ""
|
||||||
}`
|
}&page=${page}`
|
||||||
);
|
);
|
||||||
return response.data;
|
return response.data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -168,16 +174,19 @@ export async function apiInvestmentGetInvoice({
|
|||||||
id,
|
id,
|
||||||
authorId,
|
authorId,
|
||||||
category,
|
category,
|
||||||
|
page = "1",
|
||||||
}: {
|
}: {
|
||||||
id?: string;
|
id?: string;
|
||||||
authorId?: string;
|
authorId?: string;
|
||||||
category: "my-invest" | "transaction" | "invoice";
|
category: "my-invest" | "transaction" | "invoice";
|
||||||
|
page?: string;
|
||||||
}) {
|
}) {
|
||||||
const categoryQuery = `?category=${category}`;
|
const categoryQuery = `?category=${category}`;
|
||||||
const authorIdQuery = authorId ? `&authorId=${authorId}` : "";
|
const authorIdQuery = authorId ? `&authorId=${authorId}` : "";
|
||||||
|
const pageQuery = `&page=${page}`;
|
||||||
try {
|
try {
|
||||||
const response = await apiConfig.get(
|
const response = await apiConfig.get(
|
||||||
`/mobile/investment/${id}/invoice${categoryQuery}${authorIdQuery}`
|
`/mobile/investment/${id}/invoice${categoryQuery}${authorIdQuery}${pageQuery}`
|
||||||
);
|
);
|
||||||
return response.data;
|
return response.data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user