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
This commit is contained in:
@@ -340,6 +340,14 @@ export default function UserLayout() {
|
|||||||
{/* ========== End Investment Section ========= */}
|
{/* ========== End Investment Section ========= */}
|
||||||
|
|
||||||
{/* ========== Donation Section ========= */}
|
{/* ========== Donation Section ========= */}
|
||||||
|
<Stack.Screen
|
||||||
|
name="donation/(tabs)"
|
||||||
|
options={{
|
||||||
|
title: "Donasi",
|
||||||
|
headerLeft: () => <BackButton path="/home" />,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
<Stack.Screen
|
<Stack.Screen
|
||||||
name="donation/create"
|
name="donation/create"
|
||||||
options={{
|
options={{
|
||||||
@@ -347,7 +355,13 @@ export default function UserLayout() {
|
|||||||
headerLeft: () => <BackButton />,
|
headerLeft: () => <BackButton />,
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
<Stack.Screen
|
||||||
|
name="donation/create-story"
|
||||||
|
options={{
|
||||||
|
title: "Tambah Donasi",
|
||||||
|
headerLeft: () => <BackButton />,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
{/* ========== End Donation Section ========= */}
|
{/* ========== End Donation Section ========= */}
|
||||||
|
|
||||||
{/* ========== Job Section ========= */}
|
{/* ========== Job Section ========= */}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export default function Crowdfunding() {
|
|||||||
{
|
{
|
||||||
title: "Donasi",
|
title: "Donasi",
|
||||||
desc: "Berbagi info untuk berdonasi lebih luas dan lebih efisien.",
|
desc: "Berbagi info untuk berdonasi lebih luas dan lebih efisien.",
|
||||||
path: "donation/create",
|
path: "donation/(tabs)",
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
37
app/(application)/(user)/donation/(tabs)/_layout.tsx
Normal file
37
app/(application)/(user)/donation/(tabs)/_layout.tsx
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
56
app/(application)/(user)/donation/(tabs)/index.tsx
Normal file
56
app/(application)/(user)/donation/(tabs)/index.tsx
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
60
app/(application)/(user)/donation/(tabs)/my-donation.tsx
Normal file
60
app/(application)/(user)/donation/(tabs)/my-donation.tsx
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
74
app/(application)/(user)/donation/(tabs)/status.tsx
Normal file
74
app/(application)/(user)/donation/(tabs)/status.tsx
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
64
app/(application)/(user)/donation/create-story.tsx
Normal file
64
app/(application)/(user)/donation/create-story.tsx
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -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() {
|
export default function DonationCreate() {
|
||||||
return (
|
return (
|
||||||
<ViewWrapper>
|
<ViewWrapper>
|
||||||
<TextCustom bold size="large">
|
<StackCustom gap={"xs"}>
|
||||||
Coming Soon !
|
<InformationBox text="Lengkapi semua data di bawah untuk selanjutnya mengisi cerita penggalangan dana." />
|
||||||
</TextCustom>
|
|
||||||
|
<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>
|
</ViewWrapper>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,14 +5,14 @@ import { StyleSheet } from "react-native";
|
|||||||
import ClickableCustom from "../Clickable/ClickableCustom";
|
import ClickableCustom from "../Clickable/ClickableCustom";
|
||||||
import { router } from "expo-router";
|
import { router } from "expo-router";
|
||||||
|
|
||||||
export default function DummyLandscapeImage() {
|
export default function DummyLandscapeImage({height}: {height?: number}) {
|
||||||
return (
|
return (
|
||||||
<ClickableCustom
|
<ClickableCustom
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
router.push("/(application)/(image)/preview-image/1");
|
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>
|
</ClickableCustom>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -20,7 +20,6 @@ export default function DummyLandscapeImage() {
|
|||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
backgroundImage: {
|
backgroundImage: {
|
||||||
width: "100%",
|
width: "100%",
|
||||||
height: 200, // Tinggi background sesuai kebutuhan
|
|
||||||
justifyContent: "center",
|
justifyContent: "center",
|
||||||
alignItems: "center",
|
alignItems: "center",
|
||||||
borderRadius: 6,
|
borderRadius: 6,
|
||||||
|
|||||||
18
lib/dummy-data/donasi/durasi.tsx
Normal file
18
lib/dummy-data/donasi/durasi.tsx
Normal 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",
|
||||||
|
},
|
||||||
|
];
|
||||||
22
lib/dummy-data/donasi/kategori.tsx
Normal file
22
lib/dummy-data/donasi/kategori.tsx
Normal 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",
|
||||||
|
},
|
||||||
|
];
|
||||||
@@ -38,7 +38,8 @@ export default function LoginView() {
|
|||||||
// router.navigate(`/(application)/(image)/preview-image/${id}`);
|
// router.navigate(`/(application)/(image)/preview-image/${id}`);
|
||||||
// router.replace("/(application)/(user)/event/(tabs)");
|
// router.replace("/(application)/(user)/event/(tabs)");
|
||||||
// router.replace("/(application)/coba");
|
// router.replace("/(application)/coba");
|
||||||
router.navigate("/investment/(tabs)")
|
// router.navigate("/investment/(tabs)")
|
||||||
|
router.navigate("/crowdfunding")
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
Reference in New Issue
Block a user