Compare commits

...

9 Commits

Author SHA1 Message Date
25e495cdf1 Donation
Add:
- lib/dummy-data/donasi
- donation/(tabs)/
- donation/create-story.tsx

Fix:
- app/(application)/(user)/_layout.tsx
- app/(application)/(user)/crowdfunding/index.tsx
- app/(application)/(user)/donation/create.tsx
- screens/Authentication/LoginView.tsx

## No Issue
2025-08-01 17:32:05 +08:00
0eebe64647 Invesment
Fix:
- ComponentBoxOnBottomDetail: file route > /(file)/[id].tsx

Feature:
- app/(application)/(file)/

## No Issue
2025-08-01 15:09:20 +08:00
db0f4246b6 Invesment
Add:
- /investment/[id]/(my-holding)/

Fix:
- screens/Invesment/DetailDataPublishSection.tsx: tipe data prop ?

## No Issue
2025-08-01 12:01:40 +08:00
16462c4214 Invesment
Add
- _master/status-transaction.ts
- investment/[id]/(transaction-flow)/success.tsx
- investment/[id]/(transaction-flow)/failed.tsx

Fix:
- lib/dummy-data/_master/status.tsx

Component:
- components/Badge/BadgeCustom.tsx: Penambahan custom color

## No Issue
2025-08-01 11:35:39 +08:00
8e31df660a Invesment
Add :
-  lib/dummy-data/_master/bank.ts
- investment/[id]/(transaction-flow)/select-bank.tsx
- /investment/[id]/(transaction-flow)/process.tsx
- investment/[id]/(transaction-flow)/invoice.tsx

## No Issue
2025-07-31 17:47:46 +08:00
cc35bc6907 Invesment
Add:
- app/(application)/(user)/investment/[id]/(document)/

## No Issue
2025-07-31 16:38:28 +08:00
2931f6ba55 Investment
Add:
- screens/Invesment/DetailDataPublishSection.tsx
- screens/Invesment/BoxProgressSection.tsx
- app/(application)/(user)/investment/[id]/(transaction-flow)

## No Issue
2025-07-31 15:45:07 +08:00
7205cb0736 Invesment
Add:
- screens/Invesment/ComponentBoxOnBottomDetail.tsx
- screens/Invesment/ButtonInvestasiSection.tsx
- app/(application)/(user)/investment/[id]/investor.tsx
- app/(application)/(user)/investment/[id]/(news)/list-of-news.tsx

Fix:
- screens/Invesment/BoxDetailDataSection.tsx
- app/(application)/(user)/investment/[id]/[status]/detail.tsx
- app/(application)/(user)/_layout.tsx

## No Issue
2025-07-31 14:47:40 +08:00
54fc2a3d02 Invesment
Add:
- app/(application)/(user)/investment/[id]/(news)/

Fix:
- app/(application)/(user)/investment/[id]/[status]/detail.tsx
- screens/Invesment/BoxDetailDataSection.tsx

Component
Add:
- Tambah icon : IconDocument, IconNews, IconPlus, IconProspectus, IconTrash

## No Issue
2025-07-31 12:03:59 +08:00
56 changed files with 2024 additions and 188 deletions

View File

@@ -0,0 +1,25 @@
import { BackButton, ViewWrapper } from "@/components";
import { MainColor } from "@/constants/color-palet";
import { FontAwesome } from "@expo/vector-icons";
import { Stack } from "expo-router";
export default function FileScreen() {
return (
<>
<Stack.Screen
options={{
title: "File",
headerLeft: () => <BackButton />,
}}
/>
<ViewWrapper>
<FontAwesome
name="file-pdf-o"
size={300}
style={{ alignSelf: "center" }}
color={MainColor.white}
/>
</ViewWrapper>
</>
);
}

View File

@@ -1,6 +1,7 @@
import { BackButton } from "@/components";
import LeftButtonCustom from "@/components/Button/BackButton";
import { MainColor } from "@/constants/color-palet";
import { ICON_SIZE_SMALL } from "@/constants/constans-value";
import { HeaderStyles } from "@/styles/header-styles";
import { Ionicons } from "@expo/vector-icons";
import { router, Stack } from "expo-router";
@@ -214,13 +215,6 @@ export default function UserLayout() {
headerLeft: () => <BackButton />,
}}
/>
<Stack.Screen
name="investment/[id]/list-of-document"
options={{
title: "Daftar Dokumen",
headerLeft: () => <BackButton />,
}}
/>
<Stack.Screen
name="investment/[id]/edit"
options={{
@@ -228,20 +222,7 @@ export default function UserLayout() {
headerLeft: () => <BackButton />,
}}
/>
<Stack.Screen
name="investment/[id]/add-document"
options={{
title: "Tambah Dokumen",
headerLeft: () => <BackButton />,
}}
/>
<Stack.Screen
name="investment/[id]/edit-document"
options={{
title: "Edit Dokumen",
headerLeft: () => <BackButton />,
}}
/>
<Stack.Screen
name="investment/[id]/edit-prospectus"
options={{
@@ -250,10 +231,123 @@ export default function UserLayout() {
}}
/>
<Stack.Screen
name="investment/[id]/(document)/list-of-document"
options={{
title: "Daftar Dokumen",
headerLeft: () => <BackButton />,
}}
/>
<Stack.Screen
name="investment/[id]/(document)/add-document"
options={{
title: "Tambah Dokumen",
headerLeft: () => <BackButton />,
}}
/>
<Stack.Screen
name="investment/[id]/(document)/edit-document"
options={{
title: "Edit Dokumen",
headerLeft: () => <BackButton />,
}}
/>
<Stack.Screen
name="investment/[id]/(news)/add-news"
options={{
title: "Tambah Berita",
headerLeft: () => <BackButton />,
}}
/>
<Stack.Screen
name="investment/[id]/investor"
options={{
title: "Investor",
headerLeft: () => <BackButton />,
}}
/>
<Stack.Screen
name="investment/[id]/(transaction-flow)/index"
options={{
title: "Pembelian Saham",
headerLeft: () => <BackButton />,
}}
/>
<Stack.Screen
name="investment/[id]/(transaction-flow)/select-bank"
options={{
title: "Pilih Bank",
headerLeft: () => <BackButton />,
}}
/>
<Stack.Screen
name="investment/[id]/(transaction-flow)/invoice"
options={{
title: "Invoice",
headerLeft: () => (
<Ionicons
name="close"
size={ICON_SIZE_SMALL}
color={MainColor.yellow}
onPress={() =>
router.navigate(`/investment/(tabs)/transaction`)
}
/>
),
}}
/>
<Stack.Screen
name="investment/[id]/(transaction-flow)/process"
options={{
title: "Proses",
headerLeft: () => (
<Ionicons
name="close"
size={ICON_SIZE_SMALL}
color={MainColor.yellow}
onPress={() =>
router.navigate(`/investment/(tabs)/transaction`)
}
/>
),
}}
/>
<Stack.Screen
name="investment/[id]/(transaction-flow)/success"
options={{
title: "Transaksi Berhasil",
headerLeft: () => <BackButton />,
}}
/>
<Stack.Screen
name="investment/[id]/(transaction-flow)/failed"
options={{
title: "Transaksi Gagal",
headerLeft: () => <BackButton />,
}}
/>
<Stack.Screen
name="investment/[id]/(my-holding)/[id]"
options={{
title: "Detail Saham Saya",
headerLeft: () => <BackButton />,
}}
/>
{/* ========== End Investment Section ========= */}
{/* ========== Donation Section ========= */}
<Stack.Screen
name="donation/(tabs)"
options={{
title: "Donasi",
headerLeft: () => <BackButton path="/home" />,
}}
/>
<Stack.Screen
name="donation/create"
options={{
@@ -261,7 +355,13 @@ export default function UserLayout() {
headerLeft: () => <BackButton />,
}}
/>
<Stack.Screen
name="donation/create-story"
options={{
title: "Tambah Donasi",
headerLeft: () => <BackButton />,
}}
/>
{/* ========== End Donation Section ========= */}
{/* ========== Job Section ========= */}

View File

@@ -20,7 +20,7 @@ export default function Crowdfunding() {
{
title: "Donasi",
desc: "Berbagi info untuk berdonasi lebih luas dan lebih efisien.",
path: "donation/create",
path: "donation/(tabs)",
},
];

View File

@@ -0,0 +1,37 @@
import { IconHome, IconStatus } from "@/components/_Icon";
import { ICON_SIZE_SMALL } from "@/constants/constans-value";
import { TabsStyles } from "@/styles/tabs-styles";
import {
FontAwesome5
} from "@expo/vector-icons";
import { Tabs } from "expo-router";
export default function InvestmentTabsLayout() {
return (
<Tabs screenOptions={TabsStyles}>
<Tabs.Screen
name="index"
options={{
title: "Beranda",
tabBarIcon: ({ color }) => <IconHome color={color} />,
}}
/>
<Tabs.Screen
name="status"
options={{
title: "Galang Dana",
tabBarIcon: ({ color }) => <IconStatus color={color} />,
}}
/>
<Tabs.Screen
name="my-donation"
options={{
title: "Donasi Saya",
tabBarIcon: ({ color }) => (
<FontAwesome5 name="donate" color={color} size={ICON_SIZE_SMALL} />
),
}}
/>
</Tabs>
);
}

View File

@@ -0,0 +1,56 @@
import {
BaseBox,
DummyLandscapeImage,
FloatingButton,
Grid,
ProgressCustom,
StackCustom,
TextCustom,
ViewWrapper,
} from "@/components";
import { router } from "expo-router";
import { View } from "react-native";
export default function DonationBeranda() {
return (
<ViewWrapper
hideFooter
floatingButton={
<FloatingButton onPress={() => router.push("/donation/create")} />
}
>
{Array.from({ length: 10 }).map((_, index) => (
<BaseBox
key={index}
paddingTop={7}
paddingBottom={7}
href={`/investment/${index}`}
>
<Grid>
<Grid.Col span={5}>
<DummyLandscapeImage height={100} />
</Grid.Col>
<Grid.Col span={1}>
<View />
</Grid.Col>
<Grid.Col span={6}>
<StackCustom>
<View>
<TextCustom truncate>
Judul Donasi: Lorem ipsum dolor sit amet consectetur
adipisicing elit.
</TextCustom>
<TextCustom size="small">Sisa hari: 0</TextCustom>
</View>
<ProgressCustom value={(index % 5) * 20} size="lg" />
{/* <TextCustom>
Terkumpul : Rp 300.000
</TextCustom> */}
</StackCustom>
</Grid.Col>
</Grid>
</BaseBox>
))}
</ViewWrapper>
);
}

View File

@@ -0,0 +1,60 @@
import {
BadgeCustom,
BaseBox,
DummyLandscapeImage,
Grid,
StackCustom,
TextCustom,
ViewWrapper
} from "@/components";
import { dummyMasterStatusTransaction } from "@/lib/dummy-data/_master/status-transaction";
import { View } from "react-native";
export default function DonationMyDonation() {
const randomStatusData = Array.from({ length: 10 }, () => {
const randomIndex = Math.floor(
Math.random() * dummyMasterStatusTransaction.length
);
return dummyMasterStatusTransaction[randomIndex];
});
return (
<ViewWrapper hideFooter>
{randomStatusData.map((item, index) => (
<BaseBox
key={index}
paddingTop={7}
paddingBottom={7}
href={`/investment/${index}`}
>
<Grid>
<Grid.Col span={5}>
<DummyLandscapeImage height={100} />
</Grid.Col>
<Grid.Col span={1}>
<View />
</Grid.Col>
<Grid.Col span={6}>
<StackCustom gap={"sm"}>
<View>
<TextCustom truncate>
Judul Donasi: Lorem ipsum dolor sit amet consectetur
adipisicing elit.
</TextCustom>
</View>
<View>
<TextCustom>Donasi Saya</TextCustom>
<TextCustom bold color="yellow">
Rp. 7.500.000
</TextCustom>
</View>
<BadgeCustom variant="light" color={item.color} fullWidth>
{item.label}
</BadgeCustom>
</StackCustom>
</Grid.Col>
</Grid>
</BaseBox>
))}
</ViewWrapper>
);
}

View File

@@ -0,0 +1,74 @@
import {
Grid,
BaseBox,
DummyLandscapeImage,
ScrollableCustom,
StackCustom,
TextCustom,
ViewWrapper,
} from "@/components";
import { dummyMasterStatus } from "@/lib/dummy-data/_master/status";
import { useState } from "react";
import { View } from "react-native";
export default function DonationStatus() {
const [activeCategory, setActiveCategory] = useState<string | null>(
"publish"
);
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 (
<ViewWrapper hideFooter headerComponent={scrollComponent}>
{Array.from({ length: 10 }).map((_, index) => (
<BaseBox
key={index}
paddingTop={7}
paddingBottom={7}
href={`/investment/${index}`}
>
<Grid>
<Grid.Col span={5}>
<DummyLandscapeImage height={100} />
</Grid.Col>
<Grid.Col span={1}>
<View />
</Grid.Col>
<Grid.Col span={6}>
<StackCustom>
<TextCustom truncate>
Judul Donasi: {activeCategory} Lorem ipsum dolor sit amet
consectetur adipisicing elit.
</TextCustom>
<View>
<TextCustom>Target Dana</TextCustom>
<TextCustom bold color="yellow">
Rp. 7.500.000
</TextCustom>
</View>
{/* <TextCustom>
Terkumpul : Rp 300.000
</TextCustom> */}
</StackCustom>
</Grid.Col>
</Grid>
</BaseBox>
))}
</ViewWrapper>
);
}

View File

@@ -0,0 +1,64 @@
import {
ButtonCenteredOnly,
ButtonCustom,
InformationBox,
LandscapeFrameUploaded,
Spacing,
StackCustom,
TextAreaCustom,
TextInputCustom,
ViewWrapper,
} from "@/components";
import { router } from "expo-router";
export default function DonationCreateStory() {
return (
<ViewWrapper>
<StackCustom gap={"xs"}>
<InformationBox text="Cerita Anda adalah kunci untuk menginspirasi kebaikan. Jelaskan dengan jujur dan jelas tujuan penggalangan dana ini agar calon donatur memahami dampak positif yang dapat mereka wujudkan melalui kontribusi mereka." />
<TextAreaCustom
label="Pembukaan Cerita"
placeholder="Masukkan pembukaan cerita"
required
showCount
maxLength={1000}
/>
<TextAreaCustom
label="Tujuan Donasi"
placeholder="Masukkan tujuan donasi"
required
showCount
maxLength={1000}
/>
<LandscapeFrameUploaded />
<ButtonCenteredOnly onPress={() => {}} icon="upload">
Upload
</ButtonCenteredOnly>
<Spacing height={40} />
<InformationBox text="Pastikan Anda mengisi nama bank dan nomor rekening dengan benar. Informasi ini akan membantu admin memverifikasi dan memproses penggalangan dana Anda dengan cepat dan tepat setelah penggalangan dana dipublikasikan." />
<TextInputCustom
label="Nama Bank"
placeholder="Masukkan nama bank"
required
/>
<TextInputCustom
label="Nomor Rekening"
placeholder="Masukkan nomor rekening"
required
/>
<Spacing />
<ButtonCustom
onPress={() => {
router.navigate(`/donation/(tabs)/status`);
}}
>
Simpan
</ButtonCustom>
</StackCustom>
<Spacing />
</ViewWrapper>
);
}

View File

@@ -1,11 +1,70 @@
import { TextCustom, ViewWrapper } from "@/components";
import {
ButtonCenteredOnly,
ButtonCustom,
InformationBox,
LandscapeFrameUploaded,
SelectCustom,
Spacing,
StackCustom,
TextInputCustom,
ViewWrapper
} from "@/components";
import { dummyDonasiDurasi } from "@/lib/dummy-data/donasi/durasi";
import { dummyDonasiKategori } from "@/lib/dummy-data/donasi/kategori";
import { router } from "expo-router";
export default function DonationCreate() {
return (
<ViewWrapper>
<TextCustom bold size="large">
Coming Soon !
</TextCustom>
<StackCustom gap={"xs"}>
<InformationBox text="Lengkapi semua data di bawah untuk selanjutnya mengisi cerita penggalangan dana." />
<TextInputCustom
label="Judul Donasi"
placeholder="Masukkan Judul Donasi"
required
/>
<TextInputCustom
label="Target Donasi"
placeholder="Masukkan Target Donasi"
required
keyboardType="numeric"
/>
<SelectCustom
data={dummyDonasiKategori.map((item) => ({
label: item.label,
value: item.value,
}))}
onChange={(value) => console.log(value)}
label="Pilih Kategori Donasi"
placeholder="Pilih Kategori Donasi"
required
/>
<SelectCustom
data={dummyDonasiDurasi.map((item) => ({
label: item.label,
value: item.value,
}))}
onChange={(value) => console.log(value)}
label="Pilih Durasi Donasi"
placeholder="Pilih Durasi Donasi"
required
/>
<LandscapeFrameUploaded />
<ButtonCenteredOnly onPress={() => {
router.push("/(application)/(image)/take-picture/123")
}} icon="upload">
Upload
</ButtonCenteredOnly>
<Spacing />
<ButtonCustom onPress={() => {
router.push("/donation/create-story")
}}>Selanjutnya</ButtonCustom>
</StackCustom>
<Spacing />
</ViewWrapper>
);
}

View File

@@ -1,12 +1,12 @@
import {
BoxWithHeaderSection,
Grid,
ScrollableCustom,
StackCustom,
TextCustom
BoxWithHeaderSection,
Grid,
ScrollableCustom,
StackCustom,
TextCustom
} from "@/components";
import ViewWrapper from "@/components/_ShareComponent/ViewWrapper";
import { masterStatus } from "@/lib/dummy-data/_master/status";
import { dummyMasterStatus } from "@/lib/dummy-data/_master/status";
import { useState } from "react";
export default function EventStatus() {
@@ -23,7 +23,7 @@ export default function EventStatus() {
const scrollComponent = (
<ScrollableCustom
data={masterStatus.map((e, i) => ({
data={dummyMasterStatus.map((e, i) => ({
id: i,
label: e.label,
value: e.value,

View File

@@ -7,13 +7,14 @@ import {
TextCustom,
ViewWrapper,
} from "@/components";
import { router } from "expo-router";
import { View } from "react-native";
export default function InvestmentMyHolding() {
return (
<ViewWrapper hideFooter>
{Array.from({ length: 10 }).map((_, index) => (
<BaseBox key={index} paddingTop={7} paddingBottom={7}>
<BaseBox key={index} paddingTop={7} paddingBottom={7} onPress={() => router.push(`/investment/${index}/(my-holding)/holding-${index}`)}>
<Grid>
<Grid.Col span={6}>
<StackCustom gap={"xs"}>

View File

@@ -1,5 +1,5 @@
import { ScrollableCustom, ViewWrapper } from "@/components";
import { masterStatus } from "@/lib/dummy-data/_master/status";
import { dummyMasterStatus } from "@/lib/dummy-data/_master/status";
import Investment_StatusBox from "@/screens/Invesment/StatusBox";
import { useState } from "react";
@@ -15,7 +15,7 @@ export default function InvestmentPortofolio() {
const scrollComponent = (
<ScrollableCustom
data={masterStatus.map((e, i) => ({
data={dummyMasterStatus.map((e, i) => ({
id: i,
label: e.label,
value: e.value,

View File

@@ -6,15 +6,43 @@ import {
TextCustom,
ViewWrapper,
} from "@/components";
import { dummyMasterStatusTransaction } from "@/lib/dummy-data/_master/status-transaction";
import { GStyles } from "@/styles/global-styles";
import dayjs from "dayjs";
import { router } from "expo-router";
import { View } from "react-native";
export default function InvestmentTransaction() {
const randomStatusData = Array.from({ length: 10 }, () => {
const randomIndex = Math.floor(
Math.random() * dummyMasterStatusTransaction.length
);
return dummyMasterStatusTransaction[randomIndex];
});
const handlePress = (value: string) => {
if (value === "menunggu") {
router.push(`/investment/${value}/(transaction-flow)/invoice`);
} else if (value === "proses") {
router.push(`/investment/${value}/(transaction-flow)/process`);
} else if (value === "berhasil") {
router.push(`/investment/${value}/(transaction-flow)/success`);
} else if (value === "gagal") {
router.push(`/investment/${value}/(transaction-flow)/failed`);
}
};
return (
<ViewWrapper hideFooter>
{Array.from({ length: 10 }).map((_, i) => (
<BaseBox key={i} paddingTop={7} paddingBottom={7}>
{randomStatusData.map((item, i) => (
<BaseBox
key={i}
paddingTop={7}
paddingBottom={7}
onPress={() => {
handlePress(item.value);
}}
>
<Grid>
<Grid.Col span={6}>
<StackCustom gap={"xs"}>
@@ -38,10 +66,10 @@ export default function InvestmentTransaction() {
</TextCustom>
<BadgeCustom
variant="light"
color="success"
color={item.color}
style={GStyles.alignSelfFlexEnd}
>
Berhasil
{item.label}
</BadgeCustom>
</StackCustom>
</Grid.Col>

View File

@@ -8,7 +8,7 @@ export default function InvestmentListOfDocument() {
<Investment_BoxDetailDocument
key={index}
title={`Judul Dokumen ${index + 1}`}
href={`/investment/${index + 1}/dokumen/file`}
href={`/(file)/${index + 1}`}
/>
))}
</ViewWrapper>

View File

@@ -53,7 +53,7 @@ export default function InvestmentRecapOfDocument() {
onPress={() => setOpenDrawerBox(true)}
/>
}
href={`/investment/${id}/dokumen/file`}
href={`/(file)/${id}`}
/>
))}
</ViewWrapper>
@@ -75,7 +75,7 @@ export default function InvestmentRecapOfDocument() {
/>
),
label: "Tambah Dokumen",
path: `/investment/${id}/add-document`,
path: `/investment/${id}/(document)/add-document`,
},
]}
onPressItem={(item) => {
@@ -96,7 +96,7 @@ export default function InvestmentRecapOfDocument() {
{
icon: <IconEdit />,
label: "Edit Dokumen",
path: `/investment/${id}/edit-document`,
path: `/investment/${id}/(document)/edit-document`,
},
{
icon: (

View File

@@ -0,0 +1,154 @@
import {
BackButton,
BaseBox,
DotButton,
DrawerCustom,
Grid,
MenuDrawerDynamicGrid,
StackCustom,
TextCustom,
ViewWrapper,
} from "@/components";
import { IconDocument, IconEdit, IconNews } from "@/components/_Icon";
import { IMenuDrawerItem } from "@/components/_Interface/types";
import { MainColor } from "@/constants/color-palet";
import { ICON_SIZE_MEDIUM } from "@/constants/constans-value";
import Invesment_ComponentBoxOnBottomDetail from "@/screens/Invesment/ComponentBoxOnBottomDetail";
import Invesment_DetailDataPublishSection from "@/screens/Invesment/DetailDataPublishSection";
import { AntDesign, MaterialIcons } from "@expo/vector-icons";
import { router, Stack, useLocalSearchParams } from "expo-router";
import _ from "lodash";
import { useState } from "react";
export default function InvestmentDetailHolding() {
const { id, status } = useLocalSearchParams();
const [openDrawerDraft, setOpenDrawerDraft] = useState(false);
const [openDrawerPublish, setOpenDrawerPublish] = useState(false);
const handlePressDraft = (item: IMenuDrawerItem) => {
console.log("PATH >> ", item.path);
router.navigate(item.path as any);
setOpenDrawerDraft(false);
};
const handlePressPublish = (item: IMenuDrawerItem) => {
console.log("PATH >> ", item.path);
router.navigate(item.path as any);
setOpenDrawerPublish(false);
};
const bottomSection = (
<Invesment_ComponentBoxOnBottomDetail
id={id as string}
status={"publish"}
/>
);
return (
<>
<Stack.Screen
options={{
title: `Detail ${_.startCase(status as string)}`,
headerLeft: () => <BackButton />,
headerRight: () =>
status === "draft" ? (
<DotButton onPress={() => setOpenDrawerDraft(true)} />
) : status === "publish" ? (
<DotButton onPress={() => setOpenDrawerPublish(true)} />
) : null,
}}
/>
<ViewWrapper>
<BaseBox>
<StackCustom gap={"xs"}>
<Grid>
<Grid.Col span={6}>
<TextCustom bold>Nila Transaksi</TextCustom>
</Grid.Col>
<Grid.Col span={6}>
<TextCustom bold>Rp. 7.500.000</TextCustom>
</Grid.Col>
</Grid>
<Grid>
<Grid.Col span={6}>
<TextCustom bold>Saham Terbeli</TextCustom>
</Grid.Col>
<Grid.Col span={6}>
<TextCustom bold>300 Lembar</TextCustom>
</Grid.Col>
</Grid>
</StackCustom>
</BaseBox>
<Invesment_DetailDataPublishSection
status={"publish"}
bottomSection={bottomSection}
/>
</ViewWrapper>
{/* ========= Draft Drawer ========= */}
<DrawerCustom
isVisible={openDrawerDraft}
closeDrawer={() => setOpenDrawerDraft(false)}
height={"auto"}
>
<MenuDrawerDynamicGrid
data={[
{
icon: <IconEdit />,
label: "Edit Data",
path: `/investment/${id}/edit`,
},
{
icon: (
<AntDesign
name="edit"
size={ICON_SIZE_MEDIUM}
color={MainColor.white}
/>
),
label: "Edit Prospektus",
path: `/investment/${id}/edit-prospectus`,
},
{
icon: (
<MaterialIcons
name="create"
size={ICON_SIZE_MEDIUM}
color={MainColor.white}
/>
),
label: "Update Dokumen",
path: `/investment/${id}/recap-of-document`,
},
]}
columns={4}
onPressItem={handlePressDraft as any}
/>
</DrawerCustom>
{/* ========= Publish Drawer ========= */}
<DrawerCustom
isVisible={openDrawerPublish}
closeDrawer={() => setOpenDrawerPublish(false)}
height={"auto"}
>
<MenuDrawerDynamicGrid
data={[
{
icon: <IconDocument />,
label: "Update Dokumen",
path: `/investment/${id}/recap-of-document`,
},
{
icon: <IconNews />,
label: "Update Berita",
path: `/investment/${id}/(news)/recap-of-news`,
},
]}
onPressItem={handlePressPublish as any}
/>
</DrawerCustom>
</>
);
}

View File

@@ -0,0 +1,76 @@
import {
AlertDefaultSystem,
BackButton,
BaseBox,
DotButton,
DrawerCustom,
DummyLandscapeImage,
MenuDrawerDynamicGrid,
StackCustom,
TextCustom,
ViewWrapper
} from "@/components";
import { IconTrash } from "@/components/_Icon/IconTrash";
import { router, Stack, useLocalSearchParams } from "expo-router";
import { useState } from "react";
export default function InvestmentNews() {
const { id, news } = useLocalSearchParams();
const [openDrawer, setOpenDrawer] = useState(false);
return (
<>
<Stack.Screen
options={{
title: "Detail Berita",
headerLeft: () => <BackButton />,
headerRight: () => <DotButton onPress={() => setOpenDrawer(true)} />,
}}
/>
<ViewWrapper>
<BaseBox>
<StackCustom>
<DummyLandscapeImage />
<TextCustom bold align="center" size="large">
Judul Berita {news} Terbaru
</TextCustom>
<TextCustom>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Laborum
fuga mollitia laboriosam voluptatibus quos molestias, illo fugiat
esse repellat, ad officia earum numquam? Aliquid corrupti quam
tempora cum harum est!
</TextCustom>
</StackCustom>
</BaseBox>
</ViewWrapper>
<DrawerCustom
isVisible={openDrawer}
closeDrawer={() => setOpenDrawer(false)}
height={"auto"}
>
<MenuDrawerDynamicGrid
data={[
{
label: "Hapus Berita",
path: `/investment/${id}/add-news`,
icon: <IconTrash />,
color: "red",
},
]}
onPressItem={(item) => {
AlertDefaultSystem({
title: "Hapus Berita",
message: "Apakah Anda yakin ingin menghapus berita ini?",
textLeft: "Batal",
textRight: "Hapus",
onPressRight: () => {
router.back();
setOpenDrawer(false);
},
});
}}
/>
</DrawerCustom>
</>
);
}

View File

@@ -0,0 +1,53 @@
import {
ButtonCenteredOnly,
ButtonCustom,
InformationBox,
LandscapeFrameUploaded,
Spacing,
StackCustom,
TextAreaCustom,
TextInputCustom,
ViewWrapper,
} from "@/components";
import { router } from "expo-router";
export default function InvestmentAddNews() {
return (
<ViewWrapper>
<StackCustom gap={"xs"}>
<InformationBox text="Pengunggahan foto ke aplikasi bersifat opsional dan tidak diwajibkan, Anda dapat menyimpan berita tanpa mengunggah foto." />
<LandscapeFrameUploaded />
<ButtonCenteredOnly
onPress={() => {
router.push("/(application)/(image)/take-picture/123");
}}
icon="upload"
>
Upload
</ButtonCenteredOnly>
<Spacing />
<TextInputCustom
label="Judul Berita"
placeholder="Masukan judul berita"
required
/>
<TextAreaCustom
label="Deskripsi Berita"
placeholder="Masukan deskripsi berita"
required
showCount
maxLength={1000}
/>
<ButtonCustom
onPress={() => {
router.back();
}}
>
Simpan
</ButtonCustom>
</StackCustom>
<Spacing />
</ViewWrapper>
);
}

View File

@@ -0,0 +1,58 @@
import {
BackButton,
BaseBox,
DrawerCustom,
MenuDrawerDynamicGrid,
TextCustom,
ViewWrapper
} from "@/components";
import { IconPlus } from "@/components/_Icon";
import { router, Stack, useLocalSearchParams } from "expo-router";
import { useState } from "react";
export default function InvestmentListOfNews() {
const { id } = useLocalSearchParams();
const [openDrawer, setOpenDrawer] = useState(false);
return (
<>
<Stack.Screen
options={{
title: "Daftar Berita",
headerLeft: () => <BackButton />,
// headerRight: () => <DotButton onPress={() => setOpenDrawer(true)} />,
}}
/>
<ViewWrapper>
{Array.from({ length: 15 }).map((_, index) => (
<BaseBox
key={index}
paddingBlock={5}
href={`/investment/${id}/(news)/${index + 1}`}
>
<TextCustom bold>Berita Terbaru {index + 1}</TextCustom>
</BaseBox>
))}
</ViewWrapper>
<DrawerCustom
isVisible={openDrawer}
closeDrawer={() => setOpenDrawer(false)}
height={"auto"}
>
<MenuDrawerDynamicGrid
data={[
{
label: "Tambah Berita",
path: `/investment/${id}/add-news`,
icon: <IconPlus />,
},
]}
onPressItem={(item) => {
router.push(item.path as any);
setOpenDrawer(false);
}}
/>
</DrawerCustom>
</>
);
}

View File

@@ -0,0 +1,59 @@
import {
BackButton,
BaseBox,
DotButton,
DrawerCustom,
MenuDrawerDynamicGrid,
TextCustom,
ViewWrapper,
} from "@/components";
import { IconPlus } from "@/components/_Icon";
import { router, Stack, useLocalSearchParams } from "expo-router";
import { useState } from "react";
export default function InvestmentRecapOfNews() {
const { id } = useLocalSearchParams();
const [openDrawer, setOpenDrawer] = useState(false);
return (
<>
<Stack.Screen
options={{
title: "Rekap Berita",
headerLeft: () => <BackButton />,
headerRight: () => <DotButton onPress={() => setOpenDrawer(true)} />,
}}
/>
<ViewWrapper>
{Array.from({ length: 15 }).map((_, index) => (
<BaseBox
key={index}
paddingBlock={5}
href={`/investment/${id}/(news)/${index + 1}`}
>
<TextCustom bold>Berita Terbaru {index + 1}</TextCustom>
</BaseBox>
))}
</ViewWrapper>
<DrawerCustom
isVisible={openDrawer}
closeDrawer={() => setOpenDrawer(false)}
height={"auto"}
>
<MenuDrawerDynamicGrid
data={[
{
label: "Tambah Berita",
path: `/investment/${id}/add-news`,
icon: <IconPlus />,
},
]}
onPressItem={(item) => {
router.push(item.path as any);
setOpenDrawer(false);
}}
/>
</DrawerCustom>
</>
);
}

View File

@@ -0,0 +1,79 @@
import { BaseBox, Grid, Spacing, StackCustom, TextCustom, ViewWrapper } from "@/components";
import { MainColor } from "@/constants/color-palet";
import { GStyles } from "@/styles/global-styles";
import { FontAwesome6 } from "@expo/vector-icons";
export default function InvestmentFailed() {
return (
<ViewWrapper>
<StackCustom>
<BaseBox>
<StackCustom>
<TextCustom bold align="center">
Transaksi anda gagal karena bukti transfer tidak sesuai dengan
data kami. Jika ini masalah khusus silahkan hubungi pada kontak
whatsapp kami.
</TextCustom>
<FontAwesome6
name="whatsapp"
size={50}
color={MainColor.green}
style={GStyles.alignSelfCenter}
/>
</StackCustom>
</BaseBox>
<BaseBox>
<TextCustom bold align="center" size="large">
Detail Transaksi
</TextCustom>
<Spacing />
<StackCustom>
{listData.map((item, i) => (
<Grid key={i}>
<Grid.Col span={5}>
<TextCustom bold>{item.label}</TextCustom>
</Grid.Col>
<Grid.Col span={7}>
<TextCustom style={{ paddingLeft: 10 }}>
{item.value}
</TextCustom>
</Grid.Col>
</Grid>
))}
</StackCustom>
</BaseBox>
</StackCustom>
</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",
},
];

View File

@@ -0,0 +1,89 @@
import {
BaseBox,
BoxButtonOnFooter,
ButtonCustom,
Divider,
Grid,
StackCustom,
TextCustom,
TextInputCustom,
ViewWrapper,
} from "@/components";
import { router, useLocalSearchParams } from "expo-router";
export default function InvestmentInvest() {
const { id } = useLocalSearchParams();
const buttonSubmit = () => {
return (
<>
<BoxButtonOnFooter>
<ButtonCustom onPress={() => router.push(`/investment/${id}/select-bank`)}>Beli</ButtonCustom>
</BoxButtonOnFooter>
</>
);
};
return (
<>
<ViewWrapper footerComponent={buttonSubmit()}>
<BaseBox>
<StackCustom gap={"xs"}>
<Grid>
<Grid.Col span={6}>
<TextCustom>Sisa Lembar Saham</TextCustom>
</Grid.Col>
<Grid.Col span={6} style={{ alignItems: "flex-end" }}>
<TextCustom>3.000</TextCustom>
</Grid.Col>
</Grid>
<Grid>
<Grid.Col span={6}>
<TextCustom>Harga Per Lembar</TextCustom>
</Grid.Col>
<Grid.Col span={6} style={{ alignItems: "flex-end" }}>
<TextCustom>Rp. 1.000</TextCustom>
</Grid.Col>
</Grid>
<Grid>
<Grid.Col
span={6}
style={{
justifyContent: "center",
}}
>
<TextCustom>Jumlah Pembelian</TextCustom>
<TextCustom bold color="yellow" size="small">
Minimum 10 lembar
</TextCustom>
</Grid.Col>
<Grid.Col
span={6}
style={{
alignItems: "flex-end",
}}
>
<TextInputCustom
style={{
width: "80%",
}}
placeholder="0"
keyboardType="numeric"
/>
</Grid.Col>
</Grid>
<Divider />
<Grid>
<Grid.Col span={6}>
<TextCustom>Total Harga</TextCustom>
</Grid.Col>
<Grid.Col span={6} style={{ alignItems: "flex-end" }}>
<TextCustom>Rp. 1.000</TextCustom>
</Grid.Col>
</Grid>
</StackCustom>
</BaseBox>
</ViewWrapper>
</>
);
}

View File

@@ -0,0 +1,110 @@
import {
BaseBox,
ButtonCenteredOnly,
ButtonCustom,
Grid,
InformationBox,
Spacing,
StackCustom,
TextCustom,
ViewWrapper,
} from "@/components";
import { MainColor } from "@/constants/color-palet";
import { router, useLocalSearchParams } from "expo-router";
export default function InvestmentInvoice() {
const { id } = useLocalSearchParams();
return (
<>
<ViewWrapper>
<StackCustom>
<InformationBox text="Mohon transfer ke rekening dibawah" />
<BaseBox>
<StackCustom gap={"xs"}>
<TextCustom>Nama BANK</TextCustom>
<TextCustom>Nama Penerima</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">
4567898765433567
</TextCustom>
</Grid.Col>
<Grid.Col
span={4}
style={{
alignItems: "flex-end",
}}
>
<ButtonCustom>Salin</ButtonCustom>
</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. 1.000.000
</TextCustom>
</Grid.Col>
<Grid.Col
span={4}
style={{
alignItems: "flex-end",
}}
>
<ButtonCustom>Salin</ButtonCustom>
</Grid.Col>
</Grid>
</BaseBox>
</StackCustom>
</BaseBox>
<BaseBox>
<StackCustom>
<TextCustom>Upload bukti transfer anda.</TextCustom>
<ButtonCenteredOnly
onPress={() => {
router.push("/(application)/(image)/take-picture/123");
}}
icon="upload"
>
Upload
</ButtonCenteredOnly>
</StackCustom>
</BaseBox>
<ButtonCustom
onPress={() => {
router.push(`/investment/${id}/(transaction-flow)/process`);
}}
>
Saya Sudah Transfer
</ButtonCustom>
</StackCustom>
<Spacing/>
</ViewWrapper>
</>
);
}

View File

@@ -0,0 +1,45 @@
import {
BaseBox,
Grid,
StackCustom,
TextCustom,
ViewWrapper,
} from "@/components";
import { MainColor } from "@/constants/color-palet";
import { Ionicons } from "@expo/vector-icons";
import { ActivityIndicator } from "react-native";
export default function InvestmentProcess() {
return (
<>
<ViewWrapper>
<BaseBox>
<StackCustom>
<TextCustom align="center" bold>
Admin sedang memproses transaksimu
</TextCustom>
<ActivityIndicator size="large" color={MainColor.yellow} />
</StackCustom>
</BaseBox>
<BaseBox>
<Grid>
<Grid.Col span={10} style={{justifyContent: 'center'}}>
<TextCustom size="small">
Hubungi admin jika tidak kunjung di proses! Klik pada logo
Whatsapp ini.
</TextCustom>
</Grid.Col>
<Grid.Col span={2} style={{alignItems: "flex-end"}}>
<Ionicons
name="logo-whatsapp"
size={50}
color={MainColor.green}
/>
</Grid.Col>
</Grid>
</BaseBox>
</ViewWrapper>
</>
);
}

View File

@@ -0,0 +1,40 @@
import {
BaseBox,
BoxButtonOnFooter,
ButtonCustom,
ViewWrapper,
} from "@/components";
import { RadioCustom, RadioGroup } from "@/components/Radio/RadioCustom";
import { dummyMasterBank } from "@/lib/dummy-data/_master/bank";
import { router, useLocalSearchParams } from "expo-router";
import { useState } from "react";
export default function InvestmentSelectBank() {
const { id } = useLocalSearchParams();
const [value, setValue] = useState<any | number>("");
const buttonSubmit = () => {
return (
<>
<BoxButtonOnFooter>
<ButtonCustom
onPress={() => router.replace(`/investment/${id}/invoice`)}
>
Pilih
</ButtonCustom>
</BoxButtonOnFooter>
</>
);
};
return (
<ViewWrapper footerComponent={buttonSubmit()}>
<RadioGroup value={value} onChange={setValue}>
{dummyMasterBank.map((item) => (
<BaseBox key={item.name}>
<RadioCustom label={item.name} value={item.code} />
</BaseBox>
))}
</RadioGroup>
</ViewWrapper>
);
}

View File

@@ -0,0 +1,84 @@
import {
BaseBox,
Grid,
Spacing,
StackCustom,
TextCustom,
ViewWrapper,
} from "@/components";
import { MainColor } from "@/constants/color-palet";
import { GStyles } from "@/styles/global-styles";
import { FontAwesome6 } from "@expo/vector-icons";
export default function InvestmentSuccess() {
return (
<ViewWrapper>
<StackCustom>
<BaseBox>
<StackCustom>
<FontAwesome6
name="money-bill-wave"
size={100}
color={MainColor.green}
style={GStyles.alignSelfCenter}
/>
<TextCustom bold align="center">
Terimakasih telah percaya pada kami untuk mengelola dana anda!
Info mengenai update Investasi ini bisa di lihat di kolom berita.
</TextCustom>
</StackCustom>
</BaseBox>
<BaseBox>
<TextCustom bold align="center" size="large">
Detail Transaksi
</TextCustom>
<Spacing/>
<StackCustom>
{listData.map((item, i) => (
<Grid key={i}>
<Grid.Col span={5}>
<TextCustom bold>{item.label}</TextCustom>
</Grid.Col>
<Grid.Col span={7}>
<TextCustom style={{paddingLeft: 10}}>{item.value}</TextCustom>
</Grid.Col>
</Grid>
))}
</StackCustom>
</BaseBox>
</StackCustom>
</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",
},
];

View File

@@ -1,20 +0,0 @@
import { BackButton, TextCustom, ViewWrapper } from "@/components";
import { Stack, useLocalSearchParams } from "expo-router";
import _ from "lodash";
export default function InvestmentProspectus() {
const { file } = useLocalSearchParams();
return (
<>
<Stack.Screen
options={{
title: `Pratinjau ${_.startCase(file as string)}`,
headerLeft: () => <BackButton />,
}}
/>
<ViewWrapper>
<TextCustom>Pratinjau File</TextCustom>
</ViewWrapper>
</>
);
}

View File

@@ -1,31 +1,18 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
import {
BackButton,
BaseBox,
CenterCustom,
DotButton,
DrawerCustom,
Grid,
MenuDrawerDynamicGrid,
ProgressCustom,
Spacing,
StackCustom,
TextCustom,
ViewWrapper,
} from "@/components";
import { IconEdit } from "@/components/_Icon";
import { IconDocument, IconEdit, IconNews } from "@/components/_Icon";
import { IMenuDrawerItem } from "@/components/_Interface/types";
import { AccentColor, MainColor } from "@/constants/color-palet";
import { ICON_SIZE_MEDIUM, ICON_SIZE_SMALL } from "@/constants/constans-value";
import { listDataNotPublish } from "@/lib/dummy-data/investment/dummy-data-not-publish";
import BoxDetailDataSection from "@/screens/Invesment/BoxDetailDataSection";
import Investment_ButtonStatusSection from "@/screens/Invesment/ButtonStatusSection";
import {
AntDesign,
FontAwesome6,
Ionicons,
MaterialIcons,
} from "@expo/vector-icons";
import { MainColor } from "@/constants/color-palet";
import { ICON_SIZE_MEDIUM } from "@/constants/constans-value";
import Investment_ButtonInvestasiSection from "@/screens/Invesment/ButtonInvestasiSection";
import Invesment_ComponentBoxOnBottomDetail from "@/screens/Invesment/ComponentBoxOnBottomDetail";
import Invesment_DetailDataPublishSection from "@/screens/Invesment/DetailDataPublishSection";
import { AntDesign, MaterialIcons } from "@expo/vector-icons";
import { router, Stack, useLocalSearchParams } from "expo-router";
import _ from "lodash";
import { useState } from "react";
@@ -48,45 +35,14 @@ export default function InvestmentDetailStatus() {
};
const bottomSection = (
<Grid>
<Grid.Col span={6} style={{ paddingRight: 10 }}>
<BaseBox
backgroundColor={AccentColor.blue}
style={{ borderColor: AccentColor.softblue, borderWidth: 1 }}
href={`/investment/${id}/prospektus/file`}
>
<StackCustom>
<TextCustom align="center">Prospektus</TextCustom>
<CenterCustom>
<FontAwesome6
name="file-contract"
size={50}
color={MainColor.white}
/>
</CenterCustom>
</StackCustom>
</BaseBox>
</Grid.Col>
<Invesment_ComponentBoxOnBottomDetail
id={id as string}
status={status as string}
/>
);
<Grid.Col span={6} style={{ paddingLeft: 10 }}>
<BaseBox
backgroundColor={AccentColor.blue}
style={{ borderColor: AccentColor.softblue, borderWidth: 1 }}
href={`/investment/${id}/list-of-document`}
>
<StackCustom>
<TextCustom align="center">Dokumen</TextCustom>
<CenterCustom>
<FontAwesome6
name="file-lines"
size={50}
color={MainColor.white}
/>
</CenterCustom>
</StackCustom>
</BaseBox>
</Grid.Col>
</Grid>
const buttonSection = (
<Investment_ButtonInvestasiSection id={id as string} isMine={false} />
);
return (
@@ -103,23 +59,13 @@ export default function InvestmentDetailStatus() {
) : null,
}}
/>
<ViewWrapper>
<StackCustom gap={"sm"}>
{status === "publish" && (
<BaseBox>
<StackCustom>
<TextCustom bold>Progress Saham</TextCustom>
<ProgressCustom value={70} size="lg" />
</StackCustom>
</BaseBox>
)}
<BoxDetailDataSection
data={listDataNotPublish}
bottomSection={bottomSection}
/>
<Investment_ButtonStatusSection status={status as string} />
<Spacing />
</StackCustom>
<Invesment_DetailDataPublishSection
status={status as string}
bottomSection={bottomSection}
buttonSection={buttonSection}
/>
</ViewWrapper>
{/* ========= Draft Drawer ========= */}
@@ -155,7 +101,7 @@ export default function InvestmentDetailStatus() {
/>
),
label: "Update Dokumen",
path: `/investment/${id}/recap-of-document`,
path: `/investment/${id}/(document)/recap-of-document`,
},
]}
columns={4}
@@ -172,29 +118,16 @@ export default function InvestmentDetailStatus() {
<MenuDrawerDynamicGrid
data={[
{
icon: (
<FontAwesome6
name="file-lines"
size={ICON_SIZE_SMALL}
color={MainColor.white}
/>
),
icon: <IconDocument />,
label: "Update Dokumen",
path: `/investment/${id}/recap-of-document`,
path: `/investment/${id}/(document)/recap-of-document`,
},
{
icon: (
<Ionicons
name="newspaper-outline"
size={ICON_SIZE_MEDIUM}
color={MainColor.white}
/>
),
icon: <IconNews />,
label: "Update Berita",
path: `/investment/${id}/edit`,
path: `/investment/${id}/(news)/recap-of-news`,
},
]}
columns={4}
onPressItem={handlePressPublish as any}
/>
</DrawerCustom>

View File

@@ -1,9 +1,134 @@
import { TextCustom, ViewWrapper } from "@/components";
import {
BackButton,
DotButton,
DrawerCustom,
MenuDrawerDynamicGrid,
ViewWrapper,
} from "@/components";
import { IconDocument, IconEdit, IconNews } from "@/components/_Icon";
import { IMenuDrawerItem } from "@/components/_Interface/types";
import { MainColor } from "@/constants/color-palet";
import { ICON_SIZE_MEDIUM } from "@/constants/constans-value";
import Investment_ButtonInvestasiSection from "@/screens/Invesment/ButtonInvestasiSection";
import Invesment_ComponentBoxOnBottomDetail from "@/screens/Invesment/ComponentBoxOnBottomDetail";
import Invesment_DetailDataPublishSection from "@/screens/Invesment/DetailDataPublishSection";
import { AntDesign, MaterialIcons } from "@expo/vector-icons";
import { router, Stack, useLocalSearchParams } from "expo-router";
import _ from "lodash";
import { useState } from "react";
export default function InvestmentDetail() {
return (
<ViewWrapper>
<TextCustom>Investment Detail</TextCustom>
</ViewWrapper>
)
}
const { id, status } = useLocalSearchParams();
const [openDrawerDraft, setOpenDrawerDraft] = useState(false);
const [openDrawerPublish, setOpenDrawerPublish] = useState(false);
const handlePressDraft = (item: IMenuDrawerItem) => {
console.log("PATH >> ", item.path);
router.navigate(item.path as any);
setOpenDrawerDraft(false);
};
const handlePressPublish = (item: IMenuDrawerItem) => {
console.log("PATH >> ", item.path);
router.navigate(item.path as any);
setOpenDrawerPublish(false);
};
const bottomSection = (
<Invesment_ComponentBoxOnBottomDetail
id={id as string}
status={'publish'}
/>
);
const buttonSection = <Investment_ButtonInvestasiSection id={id as string} isMine={true} />;
return (
<>
<Stack.Screen
options={{
title: `Detail ${_.startCase(status as string)}`,
headerLeft: () => <BackButton />,
headerRight: () =>
status === "draft" ? (
<DotButton onPress={() => setOpenDrawerDraft(true)} />
) : status === "publish" ? (
<DotButton onPress={() => setOpenDrawerPublish(true)} />
) : null,
}}
/>
<ViewWrapper>
<Invesment_DetailDataPublishSection
status={"publish"}
bottomSection={bottomSection}
buttonSection={buttonSection}
/>
</ViewWrapper>
{/* ========= Draft Drawer ========= */}
<DrawerCustom
isVisible={openDrawerDraft}
closeDrawer={() => setOpenDrawerDraft(false)}
height={"auto"}
>
<MenuDrawerDynamicGrid
data={[
{
icon: <IconEdit />,
label: "Edit Data",
path: `/investment/${id}/edit`,
},
{
icon: (
<AntDesign
name="edit"
size={ICON_SIZE_MEDIUM}
color={MainColor.white}
/>
),
label: "Edit Prospektus",
path: `/investment/${id}/edit-prospectus`,
},
{
icon: (
<MaterialIcons
name="create"
size={ICON_SIZE_MEDIUM}
color={MainColor.white}
/>
),
label: "Update Dokumen",
path: `/investment/${id}/recap-of-document`,
},
]}
columns={4}
onPressItem={handlePressDraft as any}
/>
</DrawerCustom>
{/* ========= Publish Drawer ========= */}
<DrawerCustom
isVisible={openDrawerPublish}
closeDrawer={() => setOpenDrawerPublish(false)}
height={"auto"}
>
<MenuDrawerDynamicGrid
data={[
{
icon: <IconDocument />,
label: "Update Dokumen",
path: `/investment/${id}/recap-of-document`,
},
{
icon: <IconNews />,
label: "Update Berita",
path: `/investment/${id}/(news)/recap-of-news`,
},
]}
onPressItem={handlePressPublish as any}
/>
</DrawerCustom>
</>
);
}

View File

@@ -0,0 +1,21 @@
import {
AvatarUsernameAndOtherComponent,
BoxWithHeaderSection,
TextCustom,
ViewWrapper,
} from "@/components";
export default function InvestmentInvestor() {
return (
<>
<ViewWrapper>
{Array.from({ length: 10 }).map((_, index) => (
<BoxWithHeaderSection key={index}>
<AvatarUsernameAndOtherComponent />
<TextCustom bold>Rp. 7.000.000</TextCustom>
</BoxWithHeaderSection>
))}
</ViewWrapper>
</>
);
}

View File

@@ -1,10 +1,10 @@
import {
BaseBox,
ScrollableCustom,
TextCustom,
ViewWrapper,
BaseBox,
ScrollableCustom,
TextCustom,
ViewWrapper,
} from "@/components";
import { masterStatus } from "@/lib/dummy-data/_master/status";
import { dummyMasterStatus } from "@/lib/dummy-data/_master/status";
import { jobDataDummy } from "@/screens/Job/listDataDummy";
import { useState } from "react";
@@ -20,7 +20,7 @@ export default function JobStatus() {
const scrollComponent = (
<ScrollableCustom
data={masterStatus.map((e, i) => ({
data={dummyMasterStatus.map((e, i) => ({
id: i,
label: e.label,
value: e.value,

View File

@@ -6,7 +6,7 @@ import {
TextCustom,
ViewWrapper,
} from "@/components";
import { masterStatus } from "@/lib/dummy-data/_master/status";
import { dummyMasterStatus } from "@/lib/dummy-data/_master/status";
import dayjs from "dayjs";
import { useState } from "react";
@@ -22,7 +22,7 @@ export default function VotingStatus() {
const scrollComponent = (
<ScrollableCustom
data={masterStatus.map((e, i) => ({
data={dummyMasterStatus.map((e, i) => ({
id: i,
label: e.label,
value: e.value,

View File

@@ -21,7 +21,7 @@ type BadgeSize = "xs" | "sm" | "md" | "lg";
interface BadgeProps extends ViewProps {
children: React.ReactNode;
variant?: BadgeVariant;
color?: BadgeColor;
color?: BadgeColor | string;
size?: BadgeSize;
leftIcon?: React.ReactNode;
rightIcon?: React.ReactNode;
@@ -43,7 +43,8 @@ const BadgeCustom: React.FC<BadgeProps> = ({
style,
...props
}) => {
const colors = {
// Daftar warna bawaan
const defaultColors = {
primary: "#339AF0",
success: "#40C057",
warning: "#FAB005",
@@ -52,8 +53,7 @@ const BadgeCustom: React.FC<BadgeProps> = ({
dark: "#212529",
};
const themeColor = colors[color];
const themeColor = color in defaultColors ? defaultColors[color as BadgeColor] : color;
// Ganti bagian sizeStyles dan styles.container
const sizeStyles = {
xs: {

View File

@@ -90,7 +90,7 @@ const Col: React.FC<ColProps> = ({ children, span, style }) => {
col: {
flexBasis: `${(100 / columns) * colSpan}%`,
paddingVertical: margin,
// marginBottom: gap,
// marginBottom: gap,
marginBlock: gap,
},
});

View File

@@ -0,0 +1,25 @@
import { FontAwesome6, MaterialIcons } from "@expo/vector-icons";
import { ICON_SIZE_MEDIUM } from "@/constants/constans-value";
import { MainColor } from "@/constants/color-palet";
export { IconDocument, IconDocumentEdit };
function IconDocument({ color, size }: { color?: string; size?: number }) {
return (
<FontAwesome6
name="file-lines"
size={size || ICON_SIZE_MEDIUM}
color={color || MainColor.white}
/>
);
}
function IconDocumentEdit({ color, size }: { color?: string; size?: number }) {
return (
<MaterialIcons
name="edit-document"
size={size || ICON_SIZE_MEDIUM}
color={color || MainColor.white}
/>
);
}

View File

@@ -0,0 +1,15 @@
import { MainColor } from "@/constants/color-palet";
import { ICON_SIZE_MEDIUM } from "@/constants/constans-value";
import { MaterialIcons } from "@expo/vector-icons";
export { IconNews };
function IconNews({ color, size }: { color?: string; size?: number }) {
return (
<MaterialIcons
name="newspaper"
size={size || ICON_SIZE_MEDIUM}
color={color || MainColor.white}
/>
);
}

View File

@@ -0,0 +1,15 @@
import { MainColor } from "@/constants/color-palet";
import { ICON_SIZE_MEDIUM } from "@/constants/constans-value";
import { Octicons } from "@expo/vector-icons";
export { IconPlus };
function IconPlus({ color, size }: { color?: string; size?: number }) {
return (
<Octicons
name="plus-circle"
size={size || ICON_SIZE_MEDIUM}
color={color || MainColor.white}
/>
);
}

View File

@@ -0,0 +1,21 @@
import { MainColor } from "@/constants/color-palet";
import { ICON_SIZE_MEDIUM } from "@/constants/constans-value";
import { FontAwesome6, MaterialIcons } from "@expo/vector-icons";
export { IconProspectus , IconProspectusEdit};
function IconProspectus({ color, size }: { color?: string; size?: number }) {
return (
<FontAwesome6 name="file-contract" size={size || ICON_SIZE_MEDIUM} color={color || MainColor.white} />
);
}
function IconProspectusEdit({ color, size }: { color?: string; size?: number }) {
return (
<MaterialIcons
name="edit-note"
size={size || ICON_SIZE_MEDIUM}
color={color || MainColor.white}
/>
);
}

View File

@@ -0,0 +1,15 @@
import { MainColor } from "@/constants/color-palet";
import { ICON_SIZE_MEDIUM } from "@/constants/constans-value";
import { Ionicons } from "@expo/vector-icons";
export { IconTrash };
function IconTrash({ color, size }: { color?: string; size?: number }) {
return (
<Ionicons
name="trash"
size={size || ICON_SIZE_MEDIUM}
color={color || MainColor.white}
/>
);
}

View File

@@ -4,6 +4,10 @@ import IconHistory from "./IconHistory";
import IconHome from "./IconHome";
import IconStatus from "./IconStatus";
import IconArchive from "./IconArchive";
import { IconProspectus, IconProspectusEdit } from "./IconProspectus";
import { IconDocument, IconDocumentEdit } from "./IconDocument";
import { IconNews } from "./IconNews";
import { IconPlus } from "./IconPlus";
export {
IconContribution,
@@ -12,4 +16,14 @@ export {
IconHome,
IconStatus,
IconArchive,
// Prospectus
IconProspectus,
IconProspectusEdit,
// Document
IconDocument,
IconDocumentEdit,
// News
IconNews,
// Plus
IconPlus,
};

View File

@@ -5,14 +5,14 @@ import { StyleSheet } from "react-native";
import ClickableCustom from "../Clickable/ClickableCustom";
import { router } from "expo-router";
export default function DummyLandscapeImage() {
export default function DummyLandscapeImage({height}: {height?: number}) {
return (
<ClickableCustom
onPress={() => {
router.push("/(application)/(image)/preview-image/1");
}}
>
<Image source={DUMMY_IMAGE.background} style={styles.backgroundImage} />
<Image source={DUMMY_IMAGE.background} style={[styles.backgroundImage, {height: height || 200}]} />
</ClickableCustom>
);
}
@@ -20,7 +20,6 @@ export default function DummyLandscapeImage() {
const styles = StyleSheet.create({
backgroundImage: {
width: "100%",
height: 200, // Tinggi background sesuai kebutuhan
justifyContent: "center",
alignItems: "center",
borderRadius: 6,

View File

@@ -0,0 +1,22 @@
export const dummyMasterBank = [
{
name: "Bank BCA",
code: "BCA",
},
{
name: "Bank BNI",
code: "BNI",
},
{
name: "Bank BRI",
code: "BRI",
},
{
name: "Bank Mandiri",
code: "MANDIRI",
},
{
name: "Bank Permata",
code: "PERMATA",
},
]

View File

@@ -0,0 +1,8 @@
import { AccentColor, MainColor } from "@/constants/color-palet";
export const dummyMasterStatusTransaction = [
{ value: "berhasil", label: "Berhasil", color: MainColor.green },
{ value: "proses", label: "Proses", color: AccentColor.skyblue },
{ value: "menunggu", label: "Menunggu", color: MainColor.yellow },
{ value: "gagal", label: "Gagal", color: MainColor.red },
];

View File

@@ -1,4 +1,4 @@
export const masterStatus = [
export const dummyMasterStatus = [
{ value: "publish", label: "Publish" },
{ value: "review", label: "Review" },
{ value: "draft", label: "Draft" },

View File

@@ -0,0 +1,18 @@
export const dummyDonasiDurasi = [
{
label: "1 Bulan",
value: "1_bulan",
},
{
label: "3 Bulan",
value: "3_bulan",
},
{
label: "6 Bulan",
value: "6_bulan",
},
{
label: "1 Tahun",
value: "1_tahun",
},
];

View File

@@ -0,0 +1,22 @@
export const dummyDonasiKategori = [
{
label: "Medis",
value: "medis",
},
{
label: "Pendidikan",
value: "pendidikan",
},
{
label: "Kesehatan",
value: "kesehatan",
},
{
label: "Bantuan Sosial",
value: "bantuan_sosial",
},
{
label: "Lainnya",
value: "lainnya",
},
];

View File

@@ -1,4 +1,6 @@
const listDataNotPublish = [
export {listDataNotPublishInvesment, listDataPublishInvesment};
const listDataNotPublishInvesment = [
{
label: "Target Dana",
value: "Rp. 7.500.000",
@@ -29,4 +31,41 @@ const listDataNotPublish = [
},
];
export {listDataNotPublish};
const listDataPublishInvesment = [
{
label: "Investor",
value: "10",
},
{
label: "Target Dana",
value: "Rp. 7.500.000",
},
{
label: "Harga Per Lembar",
value: "Rp. 2.400",
},
{
label: "Return Of Investment (ROI)",
value: "3 %",
},
{
label: "Total Lembar",
value: "1.200",
},
{
label: "Sisa Lembar",
value: "600",
},
{
label: "Jadwal Pembagian",
value: "Rp. 2.880.000",
},
{
label: "Pembagian Deviden",
value: "Selamanya",
},
{
label: "Pencarian Investor",
value: "30 Hari",
},
];

View File

@@ -38,7 +38,8 @@ export default function LoginView() {
// router.navigate(`/(application)/(image)/preview-image/${id}`);
// router.replace("/(application)/(user)/event/(tabs)");
// router.replace("/(application)/coba");
router.navigate("/investment/(tabs)")
// router.navigate("/investment/(tabs)")
router.navigate("/crowdfunding")
}
return (

View File

@@ -8,7 +8,7 @@ import {
} from "@/components";
import { View } from "react-native";
export default function BoxDetailDataSection({
export default function Invesment_BoxDetailDataSection({
title,
data,
bottomSection,
@@ -24,7 +24,7 @@ export default function BoxDetailDataSection({
<DummyLandscapeImage />
<Spacing />
<TextCustom align="center" size="xlarge" bold>
{title || "Title of Investment"}
{title || "Judul Investasi"}
</TextCustom>
<Spacing />
@@ -41,7 +41,7 @@ export default function BoxDetailDataSection({
</Grid.Col>
</Grid>
))}
<Spacing />
{bottomSection}
</StackCustom>
</BaseBox>

View File

@@ -0,0 +1,16 @@
import { BaseBox, StackCustom, TextCustom, ProgressCustom } from "@/components";
export default function Invesment_BoxProgressSection({status}: {status: string}) {
return (
<>
{status === "publish" && (
<BaseBox>
<StackCustom>
<TextCustom bold>Progress Saham</TextCustom>
<ProgressCustom value={70} size="lg" />
</StackCustom>
</BaseBox>
)}
</>
);
}

View File

@@ -0,0 +1,26 @@
import { ButtonCustom } from "@/components";
import { router } from "expo-router";
export default function Investment_ButtonInvestasiSection({
id,
isMine,
}: {
id: string;
isMine: boolean;
}) {
return (
<>
{isMine ? (
<ButtonCustom
onPress={() => {
router.navigate(`/investment/${id}/(transaction-flow)`);
}}
>
Beli Saham
</ButtonCustom>
) : (
<ButtonCustom disabled>Investasi Ini Milik Anda</ButtonCustom>
)}
</>
);
}

View File

@@ -3,8 +3,10 @@ import { router } from "expo-router";
export default function Investment_ButtonStatusSection({
status,
buttonPublish
}: {
status: string;
buttonPublish?: React.ReactNode;
}) {
const handleBatalkanReview = () => {
AlertDefaultSystem({
@@ -74,7 +76,9 @@ export default function Investment_ButtonStatusSection({
switch (status) {
case "publish":
return <></>;
return <>
{buttonPublish}
</>;
case "review":
return (

View File

@@ -0,0 +1,126 @@
import {
BaseBox,
CenterCustom,
Grid,
StackCustom,
TextCustom,
} from "@/components";
import { IconDocument, IconNews, IconProspectus } from "@/components/_Icon";
import { AccentColor, MainColor } from "@/constants/color-palet";
import { Ionicons } from "@expo/vector-icons";
export default function Invesment_ComponentBoxOnBottomDetail({
id,
status,
}: {
id: string;
status: string;
}) {
return (
<>
{status === "publish" ? (
<>
<Grid>
<Grid.Col span={6} style={{ paddingInline: 5, marginBlock: 0 }}>
<BaseBox
backgroundColor={AccentColor.blue}
style={{ borderColor: AccentColor.softblue, borderWidth: 1 }}
href={`/(file)/${id}`}
>
<StackCustom>
<TextCustom align="center">Prospektus</TextCustom>
<CenterCustom>
<IconProspectus size={50} color={MainColor.white} />
</CenterCustom>
</StackCustom>
</BaseBox>
</Grid.Col>
<Grid.Col span={6} style={{ paddingInline: 5, marginBlock: 0 }}>
<BaseBox
backgroundColor={AccentColor.blue}
style={{ borderColor: AccentColor.softblue, borderWidth: 1 }}
href={`/investment/${id}/(document)/list-of-document`}
>
<StackCustom>
<TextCustom align="center">Dokumen</TextCustom>
<CenterCustom>
<IconDocument size={50} color={MainColor.white} />
</CenterCustom>
</StackCustom>
</BaseBox>
</Grid.Col>
</Grid>
<Grid>
<Grid.Col span={6} style={{ paddingInline: 5, marginBlock: 0 }}>
<BaseBox
backgroundColor={AccentColor.blue}
style={{ borderColor: AccentColor.softblue, borderWidth: 1 }}
href={`/investment/${id}/investor`}
>
<StackCustom>
<TextCustom align="center">Investor</TextCustom>
<CenterCustom>
<Ionicons
name="cash-outline"
size={50}
color={MainColor.white}
/>
</CenterCustom>
</StackCustom>
</BaseBox>
</Grid.Col>
<Grid.Col span={6} style={{ paddingInline: 5, marginBlock: 0 }}>
<BaseBox
backgroundColor={AccentColor.blue}
style={{ borderColor: AccentColor.softblue, borderWidth: 1 }}
href={`/investment/${id}/list-of-news`}
>
<StackCustom>
<TextCustom align="center">Berita</TextCustom>
<CenterCustom>
<IconNews size={50} color={MainColor.white} />
</CenterCustom>
</StackCustom>
</BaseBox>
</Grid.Col>
</Grid>
</>
) : (
<Grid>
<Grid.Col span={6} style={{ paddingRight: 10 }}>
<BaseBox
backgroundColor={AccentColor.blue}
style={{ borderColor: AccentColor.softblue, borderWidth: 1 }}
href={`/(file)/${id}`}
>
<StackCustom>
<TextCustom align="center">Prospektus</TextCustom>
<CenterCustom>
<IconProspectus size={50} color={MainColor.white} />
</CenterCustom>
</StackCustom>
</BaseBox>
</Grid.Col>
<Grid.Col span={6} style={{ paddingLeft: 10 }}>
<BaseBox
backgroundColor={AccentColor.blue}
style={{ borderColor: AccentColor.softblue, borderWidth: 1 }}
href={`/investment/${id}/(document)/list-of-document`}
>
<StackCustom>
<TextCustom align="center">Dokumen</TextCustom>
<CenterCustom>
<IconDocument size={50} color={MainColor.white} />
</CenterCustom>
</StackCustom>
</BaseBox>
</Grid.Col>
</Grid>
)}
</>
);
}

View File

@@ -0,0 +1,40 @@
import { Spacing, StackCustom } from "@/components";
import {
listDataNotPublishInvesment,
listDataPublishInvesment,
} from "@/lib/dummy-data/investment/dummy-data-not-publish";
import React from "react";
import Invesment_BoxDetailDataSection from "./BoxDetailDataSection";
import Invesment_BoxProgressSection from "./BoxProgressSection";
import Investment_ButtonStatusSection from "./ButtonStatusSection";
export default function Invesment_DetailDataPublishSection({
status,
bottomSection,
buttonSection,
}: {
status: string;
bottomSection?: React.ReactNode;
buttonSection?: React.ReactNode;
}) {
return (
<>
<StackCustom gap={"sm"}>
<Invesment_BoxProgressSection status={status as string} />
<Invesment_BoxDetailDataSection
data={
status === "publish"
? listDataPublishInvesment
: listDataNotPublishInvesment
}
bottomSection={bottomSection}
/>
<Investment_ButtonStatusSection
status={status as string}
buttonPublish={buttonSection}
/>
</StackCustom>
<Spacing />
</>
);
}