Integrasi API:
Add: - hipmi-note.md Fix: - app/(application)/(user)/donation/[id]/(transaction-flow)/[invoiceId]/failed.tsx - app/(application)/(user)/donation/[id]/(transaction-flow)/[invoiceId]/success.tsx - app/(application)/(user)/event/[id]/confirmation.tsx - app/(application)/(user)/investment/(tabs)/index.tsx - app/(application)/(user)/investment/(tabs)/my-holding.tsx - app/(application)/(user)/investment/[id]/(my-holding)/[id].tsx - app/(application)/(user)/investment/[id]/(transaction-flow)/failed.tsx - app/(application)/(user)/investment/[id]/(transaction-flow)/index.tsx - app/(application)/(user)/investment/[id]/(transaction-flow)/success.tsx - app/(application)/(user)/investment/[id]/investor.tsx - app/(application)/admin/investment/[id]/[status]/index.tsx - app/(application)/admin/investment/[id]/[status]/transaction-detail.tsx - app/(application)/admin/investment/[id]/list-of-investor.tsx - lib/dummy-data/investment/dummy-data-not-publish.ts - screens/Authentication/VerificationView.tsx - screens/Home/bottomFeatureSection.tsx - service/api-client/api-investment.ts ### No Issue
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
import {
|
import {
|
||||||
BaseBox,
|
BaseBox,
|
||||||
Grid,
|
Grid,
|
||||||
@@ -7,11 +8,60 @@ import {
|
|||||||
ViewWrapper,
|
ViewWrapper,
|
||||||
} from "@/components";
|
} from "@/components";
|
||||||
import { MainColor } from "@/constants/color-palet";
|
import { MainColor } from "@/constants/color-palet";
|
||||||
|
import { apiDonationGetInvoiceById } from "@/service/api-client/api-donation";
|
||||||
import { GStyles } from "@/styles/global-styles";
|
import { GStyles } from "@/styles/global-styles";
|
||||||
|
import { dateTimeView } from "@/utils/dateTimeView";
|
||||||
|
import { formatCurrencyDisplay } from "@/utils/formatCurrencyDisplay";
|
||||||
import { FontAwesome6 } from "@expo/vector-icons";
|
import { FontAwesome6 } from "@expo/vector-icons";
|
||||||
import dayjs from "dayjs";
|
import { useFocusEffect, useLocalSearchParams } from "expo-router";
|
||||||
|
import { useCallback, useState } from "react";
|
||||||
|
|
||||||
export default function DonasiFailed() {
|
export default function DonasiFailed() {
|
||||||
|
const { id, invoiceId } = useLocalSearchParams();
|
||||||
|
const [data, setData] = useState<any>(null);
|
||||||
|
|
||||||
|
useFocusEffect(
|
||||||
|
useCallback(() => {
|
||||||
|
onLoadData();
|
||||||
|
}, [id, invoiceId])
|
||||||
|
);
|
||||||
|
|
||||||
|
const onLoadData = async () => {
|
||||||
|
try {
|
||||||
|
const response = await apiDonationGetInvoiceById({
|
||||||
|
id: invoiceId as string,
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("[DATA]", JSON.stringify(response.data, null, 2));
|
||||||
|
setData(response.data);
|
||||||
|
} catch (error) {
|
||||||
|
console.log("[ERROR]", error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const listData = [
|
||||||
|
{
|
||||||
|
label: "Bank",
|
||||||
|
value: (data && data?.MasterBank?.namaBank) || "-",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Rekening Penerima",
|
||||||
|
value: (data && data?.MasterBank?.namaAkun) || "-",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "No Rekening",
|
||||||
|
value: (data && data?.MasterBank?.norek) || "-",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Jumlah Donasi",
|
||||||
|
value: (data && formatCurrencyDisplay(data?.nominal)) || "-",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Tanggal",
|
||||||
|
value: (data && dateTimeView({ date: data?.createdAt })) || "-",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ViewWrapper>
|
<ViewWrapper>
|
||||||
<StackCustom>
|
<StackCustom>
|
||||||
@@ -58,26 +108,3 @@ export default function DonasiFailed() {
|
|||||||
</ViewWrapper>
|
</ViewWrapper>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const listData = [
|
|
||||||
{
|
|
||||||
label: "Bank",
|
|
||||||
value: " BCA",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Rekening Penerima",
|
|
||||||
value: "Himpunan Pengusaha Muda Indonesia",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "No Rekening",
|
|
||||||
value: "2304235678854332",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Jumlah Donasi",
|
|
||||||
value: "Rp. 750.000",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Tanggal",
|
|
||||||
value: `${dayjs(new Date()).format("DD/MM/YYYY")}`,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
import {
|
import {
|
||||||
BaseBox,
|
BaseBox,
|
||||||
Grid,
|
Grid,
|
||||||
@@ -7,11 +8,60 @@ import {
|
|||||||
ViewWrapper,
|
ViewWrapper,
|
||||||
} from "@/components";
|
} from "@/components";
|
||||||
import { MainColor } from "@/constants/color-palet";
|
import { MainColor } from "@/constants/color-palet";
|
||||||
|
import { apiDonationGetInvoiceById } from "@/service/api-client/api-donation";
|
||||||
import { GStyles } from "@/styles/global-styles";
|
import { GStyles } from "@/styles/global-styles";
|
||||||
|
import { dateTimeView } from "@/utils/dateTimeView";
|
||||||
|
import { formatCurrencyDisplay } from "@/utils/formatCurrencyDisplay";
|
||||||
import { FontAwesome6 } from "@expo/vector-icons";
|
import { FontAwesome6 } from "@expo/vector-icons";
|
||||||
import dayjs from "dayjs";
|
import { useFocusEffect, useLocalSearchParams } from "expo-router";
|
||||||
|
import { useCallback, useState } from "react";
|
||||||
|
|
||||||
export default function DonationSuccess() {
|
export default function DonationSuccess() {
|
||||||
|
const { id, invoiceId } = useLocalSearchParams();
|
||||||
|
const [data, setData] = useState<any>(null);
|
||||||
|
|
||||||
|
useFocusEffect(
|
||||||
|
useCallback(() => {
|
||||||
|
onLoadData();
|
||||||
|
}, [id, invoiceId])
|
||||||
|
);
|
||||||
|
|
||||||
|
const onLoadData = async () => {
|
||||||
|
try {
|
||||||
|
const response = await apiDonationGetInvoiceById({
|
||||||
|
id: invoiceId as string,
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("[DATA]", JSON.stringify(response.data, null, 2));
|
||||||
|
setData(response.data);
|
||||||
|
} catch (error) {
|
||||||
|
console.log("[ERROR]", error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const listData = [
|
||||||
|
{
|
||||||
|
label: "Bank",
|
||||||
|
value: (data && data?.MasterBank?.namaBank) || "-",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Rekening Penerima",
|
||||||
|
value: (data && data?.MasterBank?.namaAkun) || "-",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "No Rekening",
|
||||||
|
value: (data && data?.MasterBank?.norek) || "-",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Jumlah Donasi",
|
||||||
|
value: (data && formatCurrencyDisplay(data?.nominal)) || "-",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Tanggal",
|
||||||
|
value: (data && dateTimeView({ date: data?.createdAt })) || "-",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ViewWrapper>
|
<ViewWrapper>
|
||||||
<StackCustom>
|
<StackCustom>
|
||||||
@@ -59,25 +109,4 @@ export default function DonationSuccess() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const listData = [
|
|
||||||
{
|
|
||||||
label: "Bank",
|
|
||||||
value: " BCA",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Rekening Penerima",
|
|
||||||
value: "Himpunan Pengusaha Muda Indonesia",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "No Rekening",
|
|
||||||
value: "2304235678854332",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Jumlah Donasi",
|
|
||||||
value: "Rp. 750.000",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Tanggal",
|
|
||||||
value: `${dayjs(new Date()).format("DD/MM/YYYY")}`,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|||||||
@@ -261,17 +261,17 @@ export default function UserEventConfirmation() {
|
|||||||
<Stack.Screen
|
<Stack.Screen
|
||||||
options={{
|
options={{
|
||||||
title: "Konfirmasi Event",
|
title: "Konfirmasi Event",
|
||||||
headerLeft: () => (
|
// headerLeft: () => (
|
||||||
<Ionicons
|
// <Ionicons
|
||||||
name="arrow-back"
|
// name="arrow-back"
|
||||||
size={20}
|
// size={20}
|
||||||
color={MainColor.yellow}
|
// color={MainColor.yellow}
|
||||||
onPress={() =>
|
// onPress={() =>
|
||||||
router.navigate("/(application)/(user)/event/create")
|
// router.navigate("/(application)/(user)/event/create")
|
||||||
}
|
// }
|
||||||
/>
|
// />
|
||||||
),
|
// ),
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<ViewWrapper>{handlerReturn()}</ViewWrapper>
|
<ViewWrapper>{handlerReturn()}</ViewWrapper>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -23,7 +23,9 @@ export default function InvestmentBursa() {
|
|||||||
const onLoadList = async () => {
|
const onLoadList = async () => {
|
||||||
try {
|
try {
|
||||||
setLoadingList(true);
|
setLoadingList(true);
|
||||||
const response = await apiInvestmentGetAll();
|
const response = await apiInvestmentGetAll({
|
||||||
|
category: "bursa"
|
||||||
|
});
|
||||||
// console.log("[DATA LIST]", JSON.stringify(response.data, null, 2));
|
// console.log("[DATA LIST]", JSON.stringify(response.data, null, 2));
|
||||||
setList(response.data);
|
setList(response.data);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -1,50 +1,102 @@
|
|||||||
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
import {
|
import {
|
||||||
BaseBox,
|
BaseBox,
|
||||||
Grid,
|
Grid,
|
||||||
|
LoaderCustom,
|
||||||
ProgressCustom,
|
ProgressCustom,
|
||||||
Spacing,
|
Spacing,
|
||||||
StackCustom,
|
StackCustom,
|
||||||
TextCustom,
|
TextCustom,
|
||||||
ViewWrapper,
|
ViewWrapper,
|
||||||
} from "@/components";
|
} from "@/components";
|
||||||
import { router } from "expo-router";
|
import NoDataText from "@/components/_ShareComponent/NoDataText";
|
||||||
|
import { useAuth } from "@/hooks/use-auth";
|
||||||
|
import {
|
||||||
|
apiInvestmentGetAll
|
||||||
|
} from "@/service/api-client/api-investment";
|
||||||
|
import { formatCurrencyDisplay } from "@/utils/formatCurrencyDisplay";
|
||||||
|
import { router, useFocusEffect } from "expo-router";
|
||||||
|
import _ from "lodash";
|
||||||
|
import React, { useCallback, useState } from "react";
|
||||||
import { View } from "react-native";
|
import { View } from "react-native";
|
||||||
|
|
||||||
export default function InvestmentMyHolding() {
|
export default function InvestmentMyHolding() {
|
||||||
|
const { user } = useAuth();
|
||||||
|
const [list, setList] = useState<any[] | null>(null);
|
||||||
|
const [loadingList, setLoadingList] = useState(false);
|
||||||
|
|
||||||
|
useFocusEffect(
|
||||||
|
useCallback(() => {
|
||||||
|
onLoadList();
|
||||||
|
}, [user?.id])
|
||||||
|
);
|
||||||
|
|
||||||
|
const onLoadList = async () => {
|
||||||
|
try {
|
||||||
|
setLoadingList(true);
|
||||||
|
const response = await apiInvestmentGetAll({
|
||||||
|
category: "my-holding",
|
||||||
|
authorId: user?.id,
|
||||||
|
});
|
||||||
|
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>
|
<ViewWrapper hideFooter>
|
||||||
{Array.from({ length: 10 }).map((_, index) => (
|
{loadingList ? (
|
||||||
<BaseBox key={index} paddingTop={7} paddingBottom={7} onPress={() => router.push(`/investment/${index}/(my-holding)/holding-${index}`)}>
|
<LoaderCustom />
|
||||||
<Grid>
|
) : _.isEmpty(list) ? (
|
||||||
<Grid.Col span={6}>
|
<NoDataText />
|
||||||
<StackCustom gap={"xs"}>
|
) : (
|
||||||
<TextCustom truncate={2}>
|
list?.map((item, index) => (
|
||||||
Title here : Lorem ipsum dolor sit amet consectetur
|
<BaseBox
|
||||||
adipisicing elit. Omnis, exercitationem, sequi enim quod
|
key={index}
|
||||||
distinctio maiores laudantium amet, quidem atque repellat sit
|
paddingTop={7}
|
||||||
vitae qui aliquam est veritatis laborum eum voluptatum totam!
|
paddingBottom={7}
|
||||||
</TextCustom>
|
onPress={() =>
|
||||||
|
router.push(`/investment/${item?.id}/(my-holding)/${item?.id}`)
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<Grid>
|
||||||
|
<Grid.Col span={6}>
|
||||||
|
<StackCustom gap={"xs"}>
|
||||||
|
<TextCustom truncate={2}>{item?.title}</TextCustom>
|
||||||
|
|
||||||
<Spacing height={5} />
|
<Spacing height={5} />
|
||||||
<TextCustom size="small">Rp. 7.500.000</TextCustom>
|
<TextCustom size="small">
|
||||||
<TextCustom size="small">300 Lembar</TextCustom>
|
Rp. {formatCurrencyDisplay(item?.nominal)}
|
||||||
</StackCustom>
|
</TextCustom>
|
||||||
</Grid.Col>
|
<TextCustom size="small">
|
||||||
<Grid.Col span={1}>
|
{item?.lembarTerbeli} Lembar
|
||||||
<View />
|
</TextCustom>
|
||||||
</Grid.Col>
|
</StackCustom>
|
||||||
<Grid.Col
|
</Grid.Col>
|
||||||
span={5}
|
<Grid.Col span={1}>
|
||||||
style={{
|
<View />
|
||||||
justifyContent: "center",
|
</Grid.Col>
|
||||||
alignItems: "center",
|
<Grid.Col
|
||||||
}}
|
span={5}
|
||||||
>
|
style={{
|
||||||
<ProgressCustom value={(index % 5) * 20} size="lg" />
|
justifyContent: "center",
|
||||||
</Grid.Col>
|
alignItems: "center",
|
||||||
</Grid>
|
}}
|
||||||
</BaseBox>
|
>
|
||||||
))}
|
<ProgressCustom
|
||||||
|
value={item?.progress}
|
||||||
|
label={`${item?.progress}%`}
|
||||||
|
size="lg"
|
||||||
|
/>
|
||||||
|
</Grid.Col>
|
||||||
|
</Grid>
|
||||||
|
</BaseBox>
|
||||||
|
))
|
||||||
|
)}
|
||||||
</ViewWrapper>
|
</ViewWrapper>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,29 +1,56 @@
|
|||||||
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
import {
|
import {
|
||||||
BackButton,
|
BackButton,
|
||||||
BaseBox,
|
BaseBox,
|
||||||
DotButton,
|
DotButton,
|
||||||
DrawerCustom,
|
DrawerCustom,
|
||||||
Grid,
|
Grid,
|
||||||
MenuDrawerDynamicGrid,
|
MenuDrawerDynamicGrid,
|
||||||
StackCustom,
|
StackCustom,
|
||||||
TextCustom,
|
TextCustom,
|
||||||
ViewWrapper,
|
ViewWrapper,
|
||||||
} from "@/components";
|
} from "@/components";
|
||||||
import { IconDocument, IconEdit, IconNews } from "@/components/_Icon";
|
import { IconDocument, IconEdit, IconNews } from "@/components/_Icon";
|
||||||
import { IMenuDrawerItem } from "@/components/_Interface/types";
|
import { IMenuDrawerItem } from "@/components/_Interface/types";
|
||||||
import { MainColor } from "@/constants/color-palet";
|
import { MainColor } from "@/constants/color-palet";
|
||||||
import { ICON_SIZE_MEDIUM } from "@/constants/constans-value";
|
import { ICON_SIZE_MEDIUM } from "@/constants/constans-value";
|
||||||
|
import { useAuth } from "@/hooks/use-auth";
|
||||||
import Invesment_ComponentBoxOnBottomDetail from "@/screens/Invesment/ComponentBoxOnBottomDetail";
|
import Invesment_ComponentBoxOnBottomDetail from "@/screens/Invesment/ComponentBoxOnBottomDetail";
|
||||||
import Invesment_DetailDataPublishSection from "@/screens/Invesment/DetailDataPublishSection";
|
import Invesment_DetailDataPublishSection from "@/screens/Invesment/DetailDataPublishSection";
|
||||||
|
import { apiInvestmentGetInvoice } from "@/service/api-client/api-investment";
|
||||||
|
import { formatCurrencyDisplay } from "@/utils/formatCurrencyDisplay";
|
||||||
import { AntDesign, MaterialIcons } from "@expo/vector-icons";
|
import { AntDesign, MaterialIcons } from "@expo/vector-icons";
|
||||||
import { router, Stack, useLocalSearchParams } from "expo-router";
|
import { router, Stack, useFocusEffect, useLocalSearchParams } from "expo-router";
|
||||||
import _ from "lodash";
|
import _ from "lodash";
|
||||||
import { useState } from "react";
|
import { useCallback, useState } from "react";
|
||||||
|
|
||||||
export default function InvestmentDetailHolding() {
|
export default function InvestmentDetailHolding() {
|
||||||
|
const { user } = useAuth();
|
||||||
const { id, status } = useLocalSearchParams();
|
const { id, status } = useLocalSearchParams();
|
||||||
const [openDrawerDraft, setOpenDrawerDraft] = useState(false);
|
const [openDrawerDraft, setOpenDrawerDraft] = useState(false);
|
||||||
const [openDrawerPublish, setOpenDrawerPublish] = useState(false);
|
const [openDrawerPublish, setOpenDrawerPublish] = useState(false);
|
||||||
|
const [data, setData] = useState<any>(null);
|
||||||
|
|
||||||
|
useFocusEffect(
|
||||||
|
useCallback(() => {
|
||||||
|
onLoadData();
|
||||||
|
}, [id, status])
|
||||||
|
);
|
||||||
|
|
||||||
|
const onLoadData = async () => {
|
||||||
|
try {
|
||||||
|
const response = await apiInvestmentGetInvoice({
|
||||||
|
id: id as string,
|
||||||
|
authorId: user?.id,
|
||||||
|
category: "invoice",
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("[DATA]", JSON.stringify(response.data, null, 2));
|
||||||
|
setData(response.data);
|
||||||
|
} catch (error) {
|
||||||
|
console.log("[ERROR]", error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handlePressDraft = (item: IMenuDrawerItem) => {
|
const handlePressDraft = (item: IMenuDrawerItem) => {
|
||||||
console.log("PATH >> ", item.path);
|
console.log("PATH >> ", item.path);
|
||||||
@@ -39,7 +66,8 @@ export default function InvestmentDetailHolding() {
|
|||||||
|
|
||||||
const bottomSection = (
|
const bottomSection = (
|
||||||
<Invesment_ComponentBoxOnBottomDetail
|
<Invesment_ComponentBoxOnBottomDetail
|
||||||
id={id as string}
|
prospectusId={id as string}
|
||||||
|
id={data?.Investasi?.id as string}
|
||||||
status={"publish"}
|
status={"publish"}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
@@ -64,10 +92,12 @@ export default function InvestmentDetailHolding() {
|
|||||||
<StackCustom gap={"xs"}>
|
<StackCustom gap={"xs"}>
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.Col span={6}>
|
<Grid.Col span={6}>
|
||||||
<TextCustom bold>Nila Transaksi</TextCustom>
|
<TextCustom bold>Nilai Transaksi</TextCustom>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
<Grid.Col span={6}>
|
<Grid.Col span={6}>
|
||||||
<TextCustom bold>Rp. 7.500.000</TextCustom>
|
<TextCustom bold>
|
||||||
|
Rp. {data ? formatCurrencyDisplay(data?.nominal) : ""}
|
||||||
|
</TextCustom>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid>
|
<Grid>
|
||||||
@@ -75,12 +105,16 @@ export default function InvestmentDetailHolding() {
|
|||||||
<TextCustom bold>Saham Terbeli</TextCustom>
|
<TextCustom bold>Saham Terbeli</TextCustom>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
<Grid.Col span={6}>
|
<Grid.Col span={6}>
|
||||||
<TextCustom bold>300 Lembar</TextCustom>
|
<TextCustom bold>
|
||||||
|
{data ? data?.lembarTerbeli : ""} Lembar
|
||||||
|
</TextCustom>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
</Grid>
|
</Grid>
|
||||||
</StackCustom>
|
</StackCustom>
|
||||||
</BaseBox>
|
</BaseBox>
|
||||||
|
|
||||||
<Invesment_DetailDataPublishSection
|
<Invesment_DetailDataPublishSection
|
||||||
|
data={data && data?.Investasi}
|
||||||
status={"publish"}
|
status={"publish"}
|
||||||
bottomSection={bottomSection}
|
bottomSection={bottomSection}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -1,9 +1,73 @@
|
|||||||
import { BaseBox, Grid, Spacing, StackCustom, TextCustom, ViewWrapper } from "@/components";
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
|
import {
|
||||||
|
BaseBox,
|
||||||
|
Grid,
|
||||||
|
Spacing,
|
||||||
|
StackCustom,
|
||||||
|
TextCustom,
|
||||||
|
ViewWrapper,
|
||||||
|
} from "@/components";
|
||||||
import { MainColor } from "@/constants/color-palet";
|
import { MainColor } from "@/constants/color-palet";
|
||||||
|
import { apiInvestmentGetInvoice } from "@/service/api-client/api-investment";
|
||||||
import { GStyles } from "@/styles/global-styles";
|
import { GStyles } from "@/styles/global-styles";
|
||||||
|
import { dateTimeView } from "@/utils/dateTimeView";
|
||||||
|
import { formatCurrencyDisplay } from "@/utils/formatCurrencyDisplay";
|
||||||
import { FontAwesome6 } from "@expo/vector-icons";
|
import { FontAwesome6 } from "@expo/vector-icons";
|
||||||
|
import { useLocalSearchParams, useFocusEffect } from "expo-router";
|
||||||
|
import React from "react";
|
||||||
|
|
||||||
export default function InvestmentFailed() {
|
export default function InvestmentFailed() {
|
||||||
|
const { id } = useLocalSearchParams();
|
||||||
|
console.log("[ID]", id);
|
||||||
|
|
||||||
|
const [data, setData] = React.useState<any | null>(null);
|
||||||
|
|
||||||
|
useFocusEffect(
|
||||||
|
React.useCallback(() => {
|
||||||
|
onLoadData();
|
||||||
|
}, [id])
|
||||||
|
);
|
||||||
|
const onLoadData = async () => {
|
||||||
|
try {
|
||||||
|
const response = await apiInvestmentGetInvoice({
|
||||||
|
id: id as string,
|
||||||
|
category: "invoice",
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("[RES INVOICE]", JSON.stringify(response.data, null, 2));
|
||||||
|
setData(response.data);
|
||||||
|
} catch (error) {
|
||||||
|
console.log("[ERROR]", error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const listData = [
|
||||||
|
{
|
||||||
|
label: "Bank",
|
||||||
|
value: (data && data?.MasterBank?.namaBank) || "-",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Rekening Penerima",
|
||||||
|
value: (data && data?.MasterBank?.namaAkun) || "-",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "No Rekening",
|
||||||
|
value: (data && data?.MasterBank?.norek) || "-",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Jumlah",
|
||||||
|
value: `Rp ${data && formatCurrencyDisplay(data?.nominal)}` || "-",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Tanggal",
|
||||||
|
value: (data && dateTimeView({ date: data?.createdAt })) || "-",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Lembar Terbeli",
|
||||||
|
value: (data && formatCurrencyDisplay(data?.lembarTerbeli)) || "-",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ViewWrapper>
|
<ViewWrapper>
|
||||||
<StackCustom>
|
<StackCustom>
|
||||||
@@ -11,8 +75,7 @@ export default function InvestmentFailed() {
|
|||||||
<StackCustom>
|
<StackCustom>
|
||||||
<TextCustom bold align="center">
|
<TextCustom bold align="center">
|
||||||
Transaksi anda gagal karena bukti transfer tidak sesuai dengan
|
Transaksi anda gagal karena bukti transfer tidak sesuai dengan
|
||||||
data kami. Jika ini masalah khusus silahkan hubungi pada kontak
|
data kami. Hubungi admin untuk memperbaiki masalah ini.
|
||||||
whatsapp kami.
|
|
||||||
</TextCustom>
|
</TextCustom>
|
||||||
|
|
||||||
<FontAwesome6
|
<FontAwesome6
|
||||||
@@ -50,30 +113,3 @@ export default function InvestmentFailed() {
|
|||||||
</ViewWrapper>
|
</ViewWrapper>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const listData = [
|
|
||||||
{
|
|
||||||
label: "Bank",
|
|
||||||
value: " BCA",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Rekening Penerima",
|
|
||||||
value: "Himpunan Pengusaha Muda Indonesia",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "No Rekening",
|
|
||||||
value: "2304235678854332",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Jumlah",
|
|
||||||
value: "Rp. 1.000.000",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Tanggal",
|
|
||||||
value: "2022-01-01",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Lembar Terbeli",
|
|
||||||
value: "100",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|||||||
@@ -108,7 +108,9 @@ export default function InvestmentInvest() {
|
|||||||
<TextCustom>Sisa Lembar Saham</TextCustom>
|
<TextCustom>Sisa Lembar Saham</TextCustom>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
<Grid.Col span={6} style={{ alignItems: "flex-end" }}>
|
<Grid.Col span={6} style={{ alignItems: "flex-end" }}>
|
||||||
<TextCustom>{data?.sisaLembar || "-"}</TextCustom>
|
<TextCustom>
|
||||||
|
{data && formatCurrencyDisplay(data?.sisaLembar) || "-"}
|
||||||
|
</TextCustom>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid>
|
<Grid>
|
||||||
@@ -116,7 +118,9 @@ export default function InvestmentInvest() {
|
|||||||
<TextCustom>Harga Per Lembar</TextCustom>
|
<TextCustom>Harga Per Lembar</TextCustom>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
<Grid.Col span={6} style={{ alignItems: "flex-end" }}>
|
<Grid.Col span={6} style={{ alignItems: "flex-end" }}>
|
||||||
<TextCustom>{data?.hargaLembar || "-"}</TextCustom>
|
<TextCustom>
|
||||||
|
{data && formatCurrencyDisplay(data?.hargaLembar) || "-"}
|
||||||
|
</TextCustom>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid>
|
<Grid>
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
import {
|
import {
|
||||||
BaseBox,
|
BaseBox,
|
||||||
Grid,
|
Grid,
|
||||||
@@ -7,10 +8,66 @@ import {
|
|||||||
ViewWrapper,
|
ViewWrapper,
|
||||||
} from "@/components";
|
} from "@/components";
|
||||||
import { MainColor } from "@/constants/color-palet";
|
import { MainColor } from "@/constants/color-palet";
|
||||||
|
import { apiInvestmentGetInvoice } from "@/service/api-client/api-investment";
|
||||||
import { GStyles } from "@/styles/global-styles";
|
import { GStyles } from "@/styles/global-styles";
|
||||||
|
import { dateTimeView } from "@/utils/dateTimeView";
|
||||||
|
import { formatCurrencyDisplay } from "@/utils/formatCurrencyDisplay";
|
||||||
import { FontAwesome6 } from "@expo/vector-icons";
|
import { FontAwesome6 } from "@expo/vector-icons";
|
||||||
|
import { useFocusEffect, useLocalSearchParams } from "expo-router";
|
||||||
|
import React from "react";
|
||||||
|
|
||||||
export default function InvestmentSuccess() {
|
export default function InvestmentSuccess() {
|
||||||
|
const { id } = useLocalSearchParams();
|
||||||
|
console.log("[ID]", id);
|
||||||
|
|
||||||
|
const [data, setData] = React.useState<any | null>(null);
|
||||||
|
|
||||||
|
useFocusEffect(
|
||||||
|
React.useCallback(() => {
|
||||||
|
onLoadData();
|
||||||
|
}, [id])
|
||||||
|
);
|
||||||
|
const onLoadData = async () => {
|
||||||
|
try {
|
||||||
|
const response = await apiInvestmentGetInvoice({
|
||||||
|
id: id as string,
|
||||||
|
category: "invoice",
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("[RES INVOICE]", JSON.stringify(response.data, null, 2));
|
||||||
|
setData(response.data);
|
||||||
|
} catch (error) {
|
||||||
|
console.log("[ERROR]", error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const listData = [
|
||||||
|
{
|
||||||
|
label: "Bank",
|
||||||
|
value: (data && data?.MasterBank?.namaBank) || "-",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Rekening Penerima",
|
||||||
|
value: (data && data?.MasterBank?.namaAkun) || "-",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "No Rekening",
|
||||||
|
value: (data && data?.MasterBank?.norek) || "-",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Jumlah",
|
||||||
|
value: `Rp ${data && formatCurrencyDisplay(data?.nominal)}` || "-",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Tanggal",
|
||||||
|
value: (data && dateTimeView({ date: data?.createdAt })) || "-",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Lembar Terbeli",
|
||||||
|
value: (data && formatCurrencyDisplay(data?.lembarTerbeli)) || "-",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ViewWrapper>
|
<ViewWrapper>
|
||||||
<StackCustom>
|
<StackCustom>
|
||||||
@@ -35,8 +92,7 @@ export default function InvestmentSuccess() {
|
|||||||
Detail Transaksi
|
Detail Transaksi
|
||||||
</TextCustom>
|
</TextCustom>
|
||||||
|
|
||||||
<Spacing/>
|
<Spacing />
|
||||||
|
|
||||||
|
|
||||||
<StackCustom>
|
<StackCustom>
|
||||||
{listData.map((item, i) => (
|
{listData.map((item, i) => (
|
||||||
@@ -45,7 +101,9 @@ export default function InvestmentSuccess() {
|
|||||||
<TextCustom bold>{item.label}</TextCustom>
|
<TextCustom bold>{item.label}</TextCustom>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
<Grid.Col span={7}>
|
<Grid.Col span={7}>
|
||||||
<TextCustom style={{paddingLeft: 10}}>{item.value}</TextCustom>
|
<TextCustom style={{ paddingLeft: 10 }}>
|
||||||
|
{item.value}
|
||||||
|
</TextCustom>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
</Grid>
|
</Grid>
|
||||||
))}
|
))}
|
||||||
@@ -55,30 +113,3 @@ export default function InvestmentSuccess() {
|
|||||||
</ViewWrapper>
|
</ViewWrapper>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const listData = [
|
|
||||||
{
|
|
||||||
label: "Bank",
|
|
||||||
value: " BCA",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Rekening Penerima",
|
|
||||||
value: "Himpunan Pengusaha Muda Indonesia",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "No Rekening",
|
|
||||||
value: "2304235678854332",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Jumlah",
|
|
||||||
value: "Rp. 1.000.000",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Tanggal",
|
|
||||||
value: "2022-01-01",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Lembar Terbeli",
|
|
||||||
value: "100",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|||||||
@@ -1,20 +1,66 @@
|
|||||||
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
import {
|
import {
|
||||||
AvatarUsernameAndOtherComponent,
|
AvatarUsernameAndOtherComponent,
|
||||||
BoxWithHeaderSection,
|
BoxWithHeaderSection,
|
||||||
|
LoaderCustom,
|
||||||
TextCustom,
|
TextCustom,
|
||||||
ViewWrapper,
|
ViewWrapper,
|
||||||
} from "@/components";
|
} from "@/components";
|
||||||
|
import NoDataText from "@/components/_ShareComponent/NoDataText";
|
||||||
|
import { apiInvestmentGetInvestorById } from "@/service/api-client/api-investment";
|
||||||
|
import { formatCurrencyDisplay } from "@/utils/formatCurrencyDisplay";
|
||||||
|
import { useFocusEffect, useLocalSearchParams } from "expo-router";
|
||||||
|
import _ from "lodash";
|
||||||
|
import { useCallback, useState } from "react";
|
||||||
|
|
||||||
export default function InvestmentInvestor() {
|
export default function InvestmentInvestor() {
|
||||||
|
const { id } = useLocalSearchParams();
|
||||||
|
const [list, setList] = useState<any[] | null>(null);
|
||||||
|
const [loadingList, setLoadingList] = useState(false);
|
||||||
|
|
||||||
|
useFocusEffect(
|
||||||
|
useCallback(() => {
|
||||||
|
onLoadList();
|
||||||
|
}, [id])
|
||||||
|
);
|
||||||
|
|
||||||
|
const onLoadList = async () => {
|
||||||
|
try {
|
||||||
|
setLoadingList(true);
|
||||||
|
const response = await apiInvestmentGetInvestorById({
|
||||||
|
id: id as string,
|
||||||
|
})
|
||||||
|
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>
|
<ViewWrapper>
|
||||||
{Array.from({ length: 10 }).map((_, index) => (
|
{loadingList ? (
|
||||||
<BoxWithHeaderSection key={index}>
|
<LoaderCustom />
|
||||||
<AvatarUsernameAndOtherComponent />
|
) : _.isEmpty(list) ? (
|
||||||
<TextCustom bold>Rp. 7.000.000</TextCustom>
|
<NoDataText />
|
||||||
</BoxWithHeaderSection>
|
) : (
|
||||||
))}
|
list?.map((item: any, index: number) => (
|
||||||
|
<BoxWithHeaderSection key={index}>
|
||||||
|
<AvatarUsernameAndOtherComponent
|
||||||
|
avatar={item?.Author?.Profile?.imageId}
|
||||||
|
name={item?.Author?.username}
|
||||||
|
avatarHref={`/profile/${item?.Author?.Profile?.id}`}
|
||||||
|
/>
|
||||||
|
<TextCustom bold>
|
||||||
|
Rp. {formatCurrencyDisplay(item?.nominal)}
|
||||||
|
</TextCustom>
|
||||||
|
</BoxWithHeaderSection>
|
||||||
|
))
|
||||||
|
)}
|
||||||
</ViewWrapper>
|
</ViewWrapper>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ export default function AdminInvestmentDetail() {
|
|||||||
const onLoadData = async () => {
|
const onLoadData = async () => {
|
||||||
try {
|
try {
|
||||||
const response = await apiAdminInvestmentDetailById({ id: id as string });
|
const response = await apiAdminInvestmentDetailById({ id: id as string });
|
||||||
console.log("[GETONE INVEST]", JSON.stringify(response, null, 2));
|
// console.log("[GETONE INVEST]", JSON.stringify(response, null, 2));
|
||||||
if (response.success) {
|
if (response.success) {
|
||||||
setData(response.data);
|
setData(response.data);
|
||||||
}
|
}
|
||||||
@@ -176,18 +176,28 @@ export default function AdminInvestmentDetail() {
|
|||||||
>
|
>
|
||||||
{status === "publish" && (
|
{status === "publish" && (
|
||||||
<BaseBox>
|
<BaseBox>
|
||||||
<ProgressCustom size="lg" />
|
<ProgressCustom
|
||||||
|
label={data && `${data.progress}%` || "0%"}
|
||||||
|
value={data && data.progress || 0}
|
||||||
|
size="lg"
|
||||||
|
/>
|
||||||
<Spacing />
|
<Spacing />
|
||||||
<StackCustom gap={"xs"}>
|
<StackCustom gap={"xs"}>
|
||||||
<GridDetail_4_8
|
<GridDetail_4_8
|
||||||
label={<TextCustom bold>Sisa Saham</TextCustom>}
|
label={<TextCustom bold>Sisa Saham</TextCustom>}
|
||||||
value={
|
value={
|
||||||
<TextCustom>{data && formatCurrencyDisplay(data?.sisaLembar)} lembar</TextCustom>
|
<TextCustom>
|
||||||
|
{data && formatCurrencyDisplay(data && data?.sisaLembar)} lembar
|
||||||
|
</TextCustom>
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
<GridDetail_4_8
|
<GridDetail_4_8
|
||||||
label={<TextCustom bold>Validasi Transaksi</TextCustom>}
|
label={<TextCustom bold>Validasi Transaksi</TextCustom>}
|
||||||
value={<TextCustom>{data && formatCurrencyDisplay(data?.lembarTerbeli)} Transaksi</TextCustom>}
|
value={
|
||||||
|
<TextCustom>
|
||||||
|
{data && data?.Investasi_Invoice.length} Proses
|
||||||
|
</TextCustom>
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
</StackCustom>
|
</StackCustom>
|
||||||
</BaseBox>
|
</BaseBox>
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
/* eslint-disable react-hooks/exhaustive-deps */
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
import {
|
import {
|
||||||
|
AlertDefaultSystem,
|
||||||
BadgeCustom,
|
BadgeCustom,
|
||||||
BaseBox,
|
BaseBox,
|
||||||
ButtonCustom,
|
ButtonCustom,
|
||||||
Spacing,
|
Spacing,
|
||||||
StackCustom,
|
StackCustom,
|
||||||
TextCustom,
|
TextCustom,
|
||||||
ViewWrapper
|
ViewWrapper,
|
||||||
} from "@/components";
|
} from "@/components";
|
||||||
import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle";
|
import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle";
|
||||||
import { GridDetail_4_8 } from "@/components/_ShareComponent/GridDetail_4_8";
|
import { GridDetail_4_8 } from "@/components/_ShareComponent/GridDetail_4_8";
|
||||||
@@ -25,8 +26,6 @@ import Toast from "react-native-toast-message";
|
|||||||
|
|
||||||
export default function AdminInvestmentTransactionDetail() {
|
export default function AdminInvestmentTransactionDetail() {
|
||||||
const { id } = useLocalSearchParams();
|
const { id } = useLocalSearchParams();
|
||||||
console.log("[ID]", id);
|
|
||||||
|
|
||||||
const [data, setData] = useState<any | null>(null);
|
const [data, setData] = useState<any | null>(null);
|
||||||
const [isLoading, setLoading] = useState<boolean>(false);
|
const [isLoading, setLoading] = useState<boolean>(false);
|
||||||
|
|
||||||
@@ -41,7 +40,7 @@ export default function AdminInvestmentTransactionDetail() {
|
|||||||
const response = await apiAdminInvestmentGetOneInvoiceById({
|
const response = await apiAdminInvestmentGetOneInvoiceById({
|
||||||
id: id as string,
|
id: id as string,
|
||||||
});
|
});
|
||||||
console.log("[RESPONSE]", JSON.stringify(response, null, 2));
|
// console.log("[RESPONSE]", JSON.stringify(response, null, 2));
|
||||||
if (response.success) {
|
if (response.success) {
|
||||||
setData(response.data);
|
setData(response.data);
|
||||||
}
|
}
|
||||||
@@ -121,7 +120,7 @@ export default function AdminInvestmentTransactionDetail() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log("[RESPONSE SUBMIT]", JSON.stringify(response, null, 2));
|
// console.log("[RESPONSE SUBMIT]", JSON.stringify(response, null, 2));
|
||||||
|
|
||||||
if (!response.success) {
|
if (!response.success) {
|
||||||
Toast.show({
|
Toast.show({
|
||||||
@@ -158,8 +157,16 @@ export default function AdminInvestmentTransactionDetail() {
|
|||||||
backgroundColor={MainColor.red}
|
backgroundColor={MainColor.red}
|
||||||
textColor="white"
|
textColor="white"
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
handlerSubmit({
|
AlertDefaultSystem({
|
||||||
category: "deny",
|
title: "Konfirmasi transaksi",
|
||||||
|
message: "Apakah anda yakin ingin menolak transaksi ini?",
|
||||||
|
textLeft: "Tidak",
|
||||||
|
textRight: "Ya",
|
||||||
|
onPressRight: () => {
|
||||||
|
handlerSubmit({
|
||||||
|
category: "deny",
|
||||||
|
});
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
@@ -170,8 +177,16 @@ export default function AdminInvestmentTransactionDetail() {
|
|||||||
<ButtonCustom
|
<ButtonCustom
|
||||||
isLoading={isLoading}
|
isLoading={isLoading}
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
handlerSubmit({
|
AlertDefaultSystem({
|
||||||
category: "accept",
|
title: "Konfirmasi transaksi",
|
||||||
|
message: "Apakah anda yakin ingin menyetujui transaksi ini?",
|
||||||
|
textLeft: "Tidak",
|
||||||
|
textRight: "Ya",
|
||||||
|
onPressRight: () => {
|
||||||
|
handlerSubmit({
|
||||||
|
category: "accept",
|
||||||
|
});
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -13,9 +13,7 @@ import { IconView } from "@/components/_Icon/IconComponent";
|
|||||||
import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle";
|
import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle";
|
||||||
import { GridViewCustomSpan } from "@/components/_ShareComponent/GridViewCustomSpan";
|
import { GridViewCustomSpan } from "@/components/_ShareComponent/GridViewCustomSpan";
|
||||||
import NoDataText from "@/components/_ShareComponent/NoDataText";
|
import NoDataText from "@/components/_ShareComponent/NoDataText";
|
||||||
import { MainColor } from "@/constants/color-palet";
|
|
||||||
import { ICON_SIZE_BUTTON } from "@/constants/constans-value";
|
import { ICON_SIZE_BUTTON } from "@/constants/constans-value";
|
||||||
import { dummyMasterStatusTransaction } from "@/lib/dummy-data/_master/status-transaction";
|
|
||||||
import { apiAdminInvestmentListOfInvestor } from "@/service/api-admin/api-admin-investment";
|
import { apiAdminInvestmentListOfInvestor } from "@/service/api-admin/api-admin-investment";
|
||||||
import { apiMasterTransaction } from "@/service/api-client/api-master";
|
import { apiMasterTransaction } from "@/service/api-client/api-master";
|
||||||
import { colorBadgeTransaction } from "@/utils/colorBadge";
|
import { colorBadgeTransaction } from "@/utils/colorBadge";
|
||||||
|
|||||||
9
hipmi-note.md
Normal file
9
hipmi-note.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
eas build --profile production : for build production on expo with eas
|
||||||
|
|
||||||
|
npx expo prebuild : untuk build dan membuat folder android & ios
|
||||||
|
|
||||||
|
open ios/<nama-app>.xcworkspace : untuk membuka file xcode
|
||||||
|
Build ios : bun run ios
|
||||||
|
Build android : bun run android
|
||||||
|
Exp: open ios/HIPMIBADUNG.xcworkspace
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ const listDataNotPublishInvesment = ({ data }: { data: any }) => [
|
|||||||
const listDataPublishInvesment = ({ data }: { data: any }) => [
|
const listDataPublishInvesment = ({ data }: { data: any }) => [
|
||||||
{
|
{
|
||||||
label: "Investor",
|
label: "Investor",
|
||||||
value: data?.investor,
|
value: data?.Investasi_Invoice.length || "-",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Target Dana",
|
label: "Target Dana",
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import { router, useLocalSearchParams } from "expo-router";
|
|||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { Text, View } from "react-native";
|
import { Text, View } from "react-native";
|
||||||
import { OtpInput } from "react-native-otp-entry";
|
import { OtpInput } from "react-native-otp-entry";
|
||||||
|
import { ActivityIndicator } from "react-native-paper";
|
||||||
import Toast from "react-native-toast-message";
|
import Toast from "react-native-toast-message";
|
||||||
|
|
||||||
export default function VerificationView() {
|
export default function VerificationView() {
|
||||||
@@ -18,22 +19,41 @@ export default function VerificationView() {
|
|||||||
const [codeOtp, setCodeOtp] = useState<string>("");
|
const [codeOtp, setCodeOtp] = useState<string>("");
|
||||||
const [inputOtp, setInputOtp] = useState<string>("");
|
const [inputOtp, setInputOtp] = useState<string>("");
|
||||||
const [userNumber, setUserNumber] = useState<string>("");
|
const [userNumber, setUserNumber] = useState<string>("");
|
||||||
|
const [loading, setLoading] = useState<boolean>(false);
|
||||||
|
const [recodeOtp, setRecodeOtp] = useState<boolean>(false);
|
||||||
|
|
||||||
// --- Context ---
|
// --- Context ---
|
||||||
const { validateOtp, isLoading } = useAuth();
|
const { validateOtp, isLoading, loginWithNomor } = useAuth();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
onLoadCheckCodeOtp();
|
onLoadCheckCodeOtp();
|
||||||
}, []);
|
}, [recodeOtp]);
|
||||||
|
|
||||||
async function onLoadCheckCodeOtp() {
|
async function onLoadCheckCodeOtp() {
|
||||||
|
setRecodeOtp(false);
|
||||||
const kodeId = await AsyncStorage.getItem("kode_otp");
|
const kodeId = await AsyncStorage.getItem("kode_otp");
|
||||||
const response = await apiCheckCodeOtp({ kodeId: kodeId as string });
|
const response = await apiCheckCodeOtp({ kodeId: kodeId as string });
|
||||||
console.log("Response check code otp >>", JSON.stringify(response.otp, null, 2));
|
console.log(
|
||||||
|
"Response check code otp >>",
|
||||||
|
JSON.stringify(response.otp, null, 2)
|
||||||
|
);
|
||||||
setCodeOtp(response.otp);
|
setCodeOtp(response.otp);
|
||||||
setUserNumber(response.nomor);
|
setUserNumber(response.nomor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handlerResendOtp = async () => {
|
||||||
|
try {
|
||||||
|
setLoading(true);
|
||||||
|
await loginWithNomor(nomor as string);
|
||||||
|
setRecodeOtp(true);
|
||||||
|
} catch (error) {
|
||||||
|
console.log("Error check code otp", error);
|
||||||
|
} finally {
|
||||||
|
setLoading(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
const handleVerification = async () => {
|
const handleVerification = async () => {
|
||||||
const codeOtpNumber = parseInt(codeOtp);
|
const codeOtpNumber = parseInt(codeOtp);
|
||||||
const inputOtpNumber = parseInt(inputOtp);
|
const inputOtpNumber = parseInt(inputOtp);
|
||||||
@@ -109,17 +129,28 @@ export default function VerificationView() {
|
|||||||
onTextChange={(otp: string) => setInputOtp(otp)}
|
onTextChange={(otp: string) => setInputOtp(otp)}
|
||||||
/>
|
/>
|
||||||
<Spacing height={30} />
|
<Spacing height={30} />
|
||||||
<Text style={GStyles.textLabel}>
|
<View style={{ flexDirection: "row", alignItems: "center" }}>
|
||||||
Tidak menerima kode ?{" "}
|
<Text style={GStyles.textLabel}>Tidak menerima kode ? </Text>
|
||||||
<Text style={GStyles.textLabel}>Kirim Ulang</Text>
|
{loading ? (
|
||||||
</Text>
|
<ActivityIndicator size={10} color={MainColor.yellow} />
|
||||||
|
) : (
|
||||||
|
<Text
|
||||||
|
style={GStyles.textLabel}
|
||||||
|
onPress={() => {
|
||||||
|
handlerResendOtp();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Kirim Ulang
|
||||||
|
</Text>
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
</View>
|
</View>
|
||||||
<Spacing height={30} />
|
<Spacing height={30} />
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
<ButtonCustom
|
<ButtonCustom
|
||||||
isLoading={isLoading}
|
isLoading={isLoading}
|
||||||
disabled={codeOtp === ""}
|
disabled={codeOtp === "" || recodeOtp === true}
|
||||||
backgroundColor={MainColor.yellow}
|
backgroundColor={MainColor.yellow}
|
||||||
textColor={MainColor.black}
|
textColor={MainColor.black}
|
||||||
onPress={() => handleVerification()}
|
onPress={() => handleVerification()}
|
||||||
|
|||||||
@@ -1,12 +1,35 @@
|
|||||||
import { ClickableCustom, TextCustom } from "@/components";
|
import { ClickableCustom, TextCustom } from "@/components";
|
||||||
import Spacing from "@/components/_ShareComponent/Spacing";
|
import Spacing from "@/components/_ShareComponent/Spacing";
|
||||||
import React from "react";
|
import React, { useCallback, useState } from "react";
|
||||||
import { View } from "react-native";
|
import { View } from "react-native";
|
||||||
import Icon from "react-native-vector-icons/FontAwesome";
|
import Icon from "react-native-vector-icons/FontAwesome";
|
||||||
import { stylesHome } from "./homeViewStyle";
|
import { stylesHome } from "./homeViewStyle";
|
||||||
import { router } from "expo-router";
|
import { router, useFocusEffect } from "expo-router";
|
||||||
|
import { apiJobGetAll } from "@/service/api-client/api-job";
|
||||||
|
|
||||||
export default function Home_BottomFeatureSection() {
|
export default function Home_BottomFeatureSection() {
|
||||||
|
const [listData, setListData] = useState<any>([]);
|
||||||
|
|
||||||
|
const onLoadData = async () => {
|
||||||
|
try {
|
||||||
|
const response = await apiJobGetAll({
|
||||||
|
category: "beranda",
|
||||||
|
});
|
||||||
|
|
||||||
|
// console.log("[DATA JOB]", JSON.stringify(response.data, null, 2));
|
||||||
|
const result = response.data.slice(-2);
|
||||||
|
setListData(result);
|
||||||
|
} catch (error) {
|
||||||
|
console.log("[ERROR]", error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
useFocusEffect(
|
||||||
|
useCallback(() => {
|
||||||
|
onLoadData();
|
||||||
|
}, [])
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<ClickableCustom onPress={() => router.push("/job")}>
|
<ClickableCustom onPress={() => router.push("/job")}>
|
||||||
@@ -21,32 +44,17 @@ export default function Home_BottomFeatureSection() {
|
|||||||
|
|
||||||
<View style={stylesHome.vacancyList}>
|
<View style={stylesHome.vacancyList}>
|
||||||
{/* Vacancy Item 1 */}
|
{/* Vacancy Item 1 */}
|
||||||
<View style={stylesHome.vacancyItem}>
|
{listData.map((item: any, index: number) => (
|
||||||
{/* <Icon name="user" size={20} color="#FFD700" /> */}
|
<View style={stylesHome.vacancyItem} key={index}>
|
||||||
<View style={stylesHome.vacancyDetails}>
|
<View style={stylesHome.vacancyDetails}>
|
||||||
<TextCustom bold color="yellow" truncate size="large">
|
<TextCustom bold color="yellow" truncate size="large">
|
||||||
Bagas_banuna
|
{item.title}
|
||||||
</TextCustom>
|
</TextCustom>
|
||||||
<Spacing height={5} />
|
<Spacing height={5} />
|
||||||
<TextCustom truncate={2}>
|
<TextCustom truncate={2}>{item.deskripsi}</TextCustom>
|
||||||
Dicari perawat kucing dan perawat anjing
|
</View>
|
||||||
</TextCustom>
|
|
||||||
</View>
|
</View>
|
||||||
</View>
|
))}
|
||||||
|
|
||||||
{/* Vacancy Item 2 */}
|
|
||||||
<View style={stylesHome.vacancyItem}>
|
|
||||||
{/* <Icon name="user" size={20} color="#FFD700" /> */}
|
|
||||||
<View style={stylesHome.vacancyDetails}>
|
|
||||||
<TextCustom bold color="yellow" truncate size="large">
|
|
||||||
fibramarcell
|
|
||||||
</TextCustom>
|
|
||||||
<Spacing height={5} />
|
|
||||||
<TextCustom truncate={2}>
|
|
||||||
Di Butuhkan Seorang Programer dan Designer
|
|
||||||
</TextCustom>
|
|
||||||
</View>
|
|
||||||
</View>
|
|
||||||
</View>
|
</View>
|
||||||
</View>
|
</View>
|
||||||
</ClickableCustom>
|
</ClickableCustom>
|
||||||
|
|||||||
@@ -128,9 +128,19 @@ export async function apiInvestmentDeleteDocument({ id }: { id: string }) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function apiInvestmentGetAll() {
|
export async function apiInvestmentGetAll({
|
||||||
|
category,
|
||||||
|
authorId,
|
||||||
|
}: {
|
||||||
|
category: "my-holding" | "bursa";
|
||||||
|
authorId?: string;
|
||||||
|
}) {
|
||||||
try {
|
try {
|
||||||
const response = await apiConfig.get(`/mobile/investment`);
|
const response = await apiConfig.get(
|
||||||
|
`/mobile/investment?category=${category}${
|
||||||
|
authorId ? `&authorId=${authorId}` : ""
|
||||||
|
}`
|
||||||
|
);
|
||||||
return response.data;
|
return response.data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw error;
|
throw error;
|
||||||
@@ -241,3 +251,17 @@ export async function apiInvestmentDeleteNews({ id }: { id: string }) {
|
|||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function apiInvestmentGetInvestorById({
|
||||||
|
id,
|
||||||
|
}: {
|
||||||
|
id: string;
|
||||||
|
}) {
|
||||||
|
try {
|
||||||
|
const response = await apiConfig.get(`/mobile/investment/${id}/investor`);
|
||||||
|
return response.data;
|
||||||
|
} catch (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user