Merge pull request 'Apple reject and QC: Ayu' (#26) from qc/9-dec-25 into main

Reviewed-on: http://wibugit.wibudev.com/wibu/hipmi-mobile/pulls/26
This commit is contained in:
2025-12-09 17:41:55 +08:00
27 changed files with 655 additions and 308 deletions

View File

@@ -595,6 +595,13 @@ export default function UserLayout() {
headerLeft: () => <BackButton />, headerLeft: () => <BackButton />,
}} }}
/> />
<Stack.Screen
name="forum/terms"
options={{
title: "Syarat & Ketentuan Forum",
headerLeft: () => <BackButton />,
}}
/>
{/* ========== Maps Section ========= */} {/* ========== Maps Section ========= */}
<Stack.Screen <Stack.Screen

View File

@@ -71,8 +71,6 @@ export default function EventDetailPublish() {
} }
} }
console.log("[participans]", isParticipant);
const handlePress = (item: IMenuDrawerItem) => { const handlePress = (item: IMenuDrawerItem) => {
console.log("PATH ", item.path); console.log("PATH ", item.path);
router.navigate(item.path as any); router.navigate(item.path as any);
@@ -139,7 +137,7 @@ export default function EventDetailPublish() {
<> <>
<Stack.Screen <Stack.Screen
options={{ options={{
title: `Event publish`, title: `Event Publish`,
headerLeft: () => <LeftButtonCustom />, headerLeft: () => <LeftButtonCustom />,
headerRight: () => <DotButton onPress={() => setOpenDrawer(true)} />, headerRight: () => <DotButton onPress={() => setOpenDrawer(true)} />,
}} }}

View File

@@ -145,7 +145,7 @@ export default function EventCreate() {
label: item.name, label: item.name,
value: item.id, value: item.id,
}))} }))}
value={data?.eventMaster_TipeAcaraId || ""} value={data?.eventMaster_TipeAcaraId || null}
onChange={(value: any) => onChange={(value: any) =>
setData({ ...data, eventMaster_TipeAcaraId: value }) setData({ ...data, eventMaster_TipeAcaraId: value })
} }

View File

@@ -0,0 +1,202 @@
import {
BaseBox,
ButtonCustom,
CheckboxCustom,
NewWrapper,
StackCustom,
TextCustom,
} from "@/components";
import { useAuth } from "@/hooks/use-auth";
import { apiAcceptForumTerms } from "@/service/api-client/api-user";
import { GStyles } from "@/styles/global-styles";
import { Ionicons } from "@expo/vector-icons";
import { router } from "expo-router";
import { useState } from "react";
import { View } from "react-native";
import { Text } from "react-native-paper";
import Toast from "react-native-toast-message";
export default function ForumSplash() {
const { user } = useAuth();
const [term, setTerm] = useState(false);
const [loading, setLoading] = useState(false);
const handleSubmit = async () => {
try {
setLoading(true);
const respone = await apiAcceptForumTerms({
category: "Forum",
userId: user?.id as any,
});
if (respone.success) {
Toast.show({
type: "success",
text1: "Berhasil",
text2: "Terima kasih telah menerima syarat & ketentuan forum ini",
});
router.replace("/(application)/forum");
return;
}
Toast.show({
type: "error",
text1: "Gagal",
text2: "Terjadi kesalahan, silahkan coba lagi",
});
} catch (error) {
console.log("[ERROR]", error);
} finally {
setLoading(false);
}
};
return (
<NewWrapper>
{/* <TextCustom bold>HIPMI Badung Connect</TextCustom> . */}
<BaseBox>
<StackCustom>
<TextCustom>
Dengan mengakses dan menggunakan Forum HIPMI Badung Connect, Anda
secara sadar menyetujui ketentuan berikut:
</TextCustom>
<TextCustom bold>
1. Dilarang keras memposting konten yang mengandung:
</TextCustom>
<View style={{ paddingInline: 10 }}>
{forumTerms1.map((term, index) => (
<View
key={index}
style={{
flexDirection: "row",
alignItems: "center",
gap: 10,
paddingBottom: 10,
}}
>
<Ionicons name="radio-button-on" color={"white"} />
<TextCustom>{term.text}</TextCustom>
</View>
))}
</View>
<TextCustom bold>
2. Setiap pengguna bertanggung jawab penuh atas konten yang
diunggah. Konten yang melanggar ketentuan ini dapat dihapus kapan
saja tanpa pemberitahuan.
</TextCustom>
<TextCustom bold>
3. Jika Anda menemukan konten tidak pantas, segera:
</TextCustom>
<View style={{ paddingInline: 10 }}>
{forumTerms2.map((term, index) => (
<View
key={index}
style={{
flexDirection: "row",
alignItems: "center",
gap: 10,
paddingBottom: 10,
}}
>
<Ionicons name="radio-button-on" color={"white"} />
<TextCustom>{term.text}</TextCustom>
</View>
))}
</View>
<TextCustom bold>
4. Gunakan fitur Blokir Pengguna di profil pengguna terkait
</TextCustom>
<View style={{ paddingInline: 10 }}>
{forumTerms3.map((term, index) => (
<View
key={index}
style={{
flexDirection: "row",
alignItems: "center",
gap: 10,
paddingBottom: 10,
}}
>
<Ionicons name="radio-button-on" color={"white"} />
<TextCustom>{term.text}</TextCustom>
</View>
))}
</View>
<TextCustom>
Pelanggaran terhadap ketentuan ini berakibat{" "}
<TextCustom bold>pencabutan akses</TextCustom> ke Forum dan/atau{" "}
<TextCustom bold>pemblokiran akun secara permanen</TextCustom> tanpa
pemberitahuan lebih lanjut.
</TextCustom>
<View
style={{
flexDirection: "row",
alignItems: "center",
marginTop: 16,
marginBottom: 16,
}}
>
<CheckboxCustom value={term} onChange={() => setTerm(!term)} />
<Text style={GStyles.textLabel}>
Saya telah membaca dan menyetujui Syarat & Ketentuan Forum ini
</Text>
</View>
<ButtonCustom
disabled={!term || loading}
onPress={() => {
handleSubmit();
}}
>
Lanjut
</ButtonCustom>
</StackCustom>
</BaseBox>
</NewWrapper>
);
}
// Data dalam format JSON (bisa juga diimpor dari file terpisah)
interface Term {
text: string;
}
const forumTerms1: Term[] = [
{
text: "Ujaran kebencian, diskriminasi, atau konten SARA (Suku, Agama, Ras, Antar-golongan)",
},
{ text: "Kata kasar, pelecehan, ancaman, atau bullying" },
{ text: "Pornografi, hoaks, spam, atau informasi menyesatkan" },
{ text: "Promosi aktivitas ilegal seperti perjudian atau narkoba" },
];
const forumTerms2: Term[] = [
{
text: "Gunakan tombol “Laporkan” di setiap postingan, atau",
},
{
text: "Gunakan fitur “Blokir Pengguna” di profil pengguna terkait.",
},
];
const forumTerms3: Term[] = [
{
text: "Meninjau setiap laporan dalam waktu 24 jam",
},
{
text: "Menghapus konten yang melanggar",
},
{
text: "Memblokir akun pelanggar sesuai tingkat pelanggaran",
},
];

View File

@@ -11,35 +11,44 @@ import Home_FeatureSection from "@/screens/Home/topFeatureSection";
import { apiUser } from "@/service/api-client/api-user"; import { apiUser } from "@/service/api-client/api-user";
import { apiVersion } from "@/service/api-config"; import { apiVersion } from "@/service/api-config";
import { Ionicons } from "@expo/vector-icons"; import { Ionicons } from "@expo/vector-icons";
import { Redirect, router, Stack } from "expo-router"; import { Redirect, router, Stack, useFocusEffect } from "expo-router";
import { useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
import { RefreshControl } from "react-native";
export default function Application() { export default function Application() {
const { token, user } = useAuth(); const { token, user, userData } = useAuth();
const [data, setData] = useState<any>(); const [data, setData] = useState<any>();
const [refreshing, setRefreshing] = useState(false);
console.log("[User] >>", JSON.stringify(user?.id, null, 2))
// ‼️ Untuk cek apakah: 1. user ada, 2. user punya profile, 3. accept temrs of forum nya ada atau tidak
useFocusEffect(
useCallback(() => {
onLoadData();
checkVersion();
userData(token as string);
}, [user?.id, token])
);
console.log("[User] >>", JSON.stringify(user?.id, null, 2));
useEffect(() => {
onLoadData();
checkVersion();
}, []);
async function onLoadData() { async function onLoadData() {
const response = await apiUser(user?.id as string); const response = await apiUser(user?.id as string);
console.log( console.log("[Profile ID]>>", JSON.stringify(response?.data?.Profile?.id, null, 2));
"[Profile ID]>>",
JSON.stringify(response?.data?.Profile.id, null, 2)
);
setData(response.data); setData(response.data);
} }
const checkVersion = async () => { const checkVersion = async () => {
const response = await apiVersion(); const response = await apiVersion();
console.log("[Version] >>", JSON.stringify(response.data, null, 2)); console.log("[Version] >>", JSON.stringify(response.data, null, 2));
}; };
const onRefresh = useCallback(() => {
setRefreshing(true);
onLoadData();
checkVersion();
setRefreshing(false);
}, []);
if (user && user?.termsOfServiceAccepted === false) { if (user && user?.termsOfServiceAccepted === false) {
console.log("User is not accept term service"); console.log("User is not accept term service");
return <Redirect href={`/terms-agreement`} />; return <Redirect href={`/terms-agreement`} />;
@@ -83,8 +92,16 @@ export default function Application() {
}} }}
/> />
<ViewWrapper <ViewWrapper
refreshControl={
<RefreshControl refreshing={refreshing} onRefresh={onRefresh} />
}
footerComponent={ footerComponent={
<TabSection tabs={tabsHome(data?.Profile?.id as string)} /> <TabSection
tabs={tabsHome({
acceptedForumTermsAt: data?.acceptedForumTermsAt,
profileId: data?.Profile?.id,
})}
/>
} }
> >
<StackCustom> <StackCustom>

View File

@@ -76,7 +76,7 @@ export default function PortofolioCreate() {
function handleInputValue(phoneNumber: string) { function handleInputValue(phoneNumber: string) {
setInputValue(phoneNumber); setInputValue(phoneNumber);
const callingCode = selectedCountry?.callingCode.replace(/^\+/, "") || ""; const callingCode = selectedCountry?.callingCode.replace(/^\+/, "") || "";
const fixNumber = inputValue.replace(/\s+/g, ""); let fixNumber = inputValue.replace(/\s+/g, "").replace(/^0+/, "");
const realNumber = callingCode + fixNumber; const realNumber = callingCode + fixNumber;
setData({ ...data, tlpn: realNumber }); setData({ ...data, tlpn: realNumber });
} }

View File

@@ -244,7 +244,7 @@ export default function PortofolioEdit() {
const handleSubmitUpdate = async () => { const handleSubmitUpdate = async () => {
const callingCode = selectedCountry?.callingCode.replace(/^\+/, "") || ""; const callingCode = selectedCountry?.callingCode.replace(/^\+/, "") || "";
const fixNumber = data.tlpn.replace(/\s+/g, ""); let fixNumber = data.tlpn.replace(/\s+/g, "").replace(/^0+/, "");
const realNumber = callingCode + fixNumber; const realNumber = callingCode + fixNumber;
const newData: IFormData = { const newData: IFormData = {

View File

@@ -2,11 +2,13 @@
import { import {
BaseBox, BaseBox,
Grid, Grid,
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 { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8";
import { apiAdminCollaborationGetById } from "@/service/api-admin/api-admin-collaboration"; import { apiAdminCollaborationGetById } from "@/service/api-admin/api-admin-collaboration";
import { useFocusEffect, useLocalSearchParams } from "expo-router"; import { useFocusEffect, useLocalSearchParams } from "expo-router";
import { useCallback, useState } from "react"; import { useCallback, useState } from "react";
@@ -28,6 +30,8 @@ export default function AdminCollaborationGroup() {
category: "group", category: "group",
}); });
console.log("[DATA]", JSON.stringify(response.data, null, 2));
if (response.success) { if (response.success) {
setData(response.data); setData(response.data);
} }
@@ -59,38 +63,33 @@ export default function AdminCollaborationGroup() {
))} ))}
</StackCustom> </StackCustom>
</BaseBox> </BaseBox>
<TextCustom bold>Anggota</TextCustom>
<Spacing height={5}/>
<BaseBox> <BaseBox>
<StackCustom> <StackCustom>
<TextCustom align="center">Anggota</TextCustom>
<Grid>
<Grid.Col span={6} style={{ justifyContent: "center", paddingRight: 10 }}>
<TextCustom bold>Nomor</TextCustom>
</Grid.Col>
<Grid.Col span={6} style={{ justifyContent: "center" }}>
<TextCustom bold>Username</TextCustom>
</Grid.Col>
</Grid>
{data?.ProjectCollaboration_AnggotaRoomChat?.map( {data?.ProjectCollaboration_AnggotaRoomChat?.map(
(item: any, index: number) => ( (item: any, index: number) => (
<StackCustom key={index} gap={0}> <Grid key={index}>
<Grid> <Grid.Col span={6} style={{ justifyContent: "center", paddingRight: 10 }}>
<Grid.Col <TextCustom bold truncate>+{item?.User?.nomor || "-"}</TextCustom>
span={4} </Grid.Col>
style={{ justifyContent: "center", paddingRight: 10 }} <Grid.Col span={6} style={{ justifyContent: "center" }}>
> <TextCustom bold>
<TextCustom bold>Nama</TextCustom> {item?.User?.username || "-"}
</Grid.Col> </TextCustom>
<Grid.Col span={8} style={{ justifyContent: "center" }}> </Grid.Col>
<TextCustom> </Grid>
{item?.User?.Profile?.name || "-"}
</TextCustom>
</Grid.Col>
</Grid>
<Grid>
<Grid.Col
span={4}
style={{ justifyContent: "center", paddingRight: 10 }}
>
<TextCustom bold>Username</TextCustom>
</Grid.Col>
<Grid.Col span={8} style={{ justifyContent: "center" }}>
<TextCustom>{item?.User?.username || "-"}</TextCustom>
</Grid.Col>
</Grid>
</StackCustom>
) )
)} )}
</StackCustom> </StackCustom>

View File

@@ -1,17 +1,14 @@
import { import {
ActionIcon, ClickableCustom,
LoaderCustom, LoaderCustom,
StackCustom, StackCustom,
TextCustom, TextCustom,
ViewWrapper ViewWrapper
} from "@/components"; } from "@/components";
import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage"; import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage";
import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle";
import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue";
import AdminTitlePage from "@/components/_ShareComponent/Admin/TitlePage"; import AdminTitlePage from "@/components/_ShareComponent/Admin/TitlePage";
import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; import { GridSpan_NewComponent } from "@/components/_ShareComponent/GridSpan_NewComponent";
import { apiAdminCollaboration } from "@/service/api-admin/api-admin-collaboration"; import { apiAdminCollaboration } from "@/service/api-admin/api-admin-collaboration";
import { Octicons } from "@expo/vector-icons";
import { router, useFocusEffect } from "expo-router"; import { router, useFocusEffect } from "expo-router";
import _ from "lodash"; import _ from "lodash";
import { useCallback, useState } from "react"; import { useCallback, useState } from "react";
@@ -34,7 +31,7 @@ export default function AdminCollaborationGroup() {
const response = await apiAdminCollaboration({ const response = await apiAdminCollaboration({
category: "group", category: "group",
}); });
if (response.success) { if (response.success) {
setList(response.data); setList(response.data);
} }
@@ -51,10 +48,19 @@ export default function AdminCollaborationGroup() {
<StackCustom> <StackCustom>
<AdminComp_BoxTitle title="Group" /> <AdminComp_BoxTitle title="Group" />
<> <>
<AdminTitleTable <GridSpan_NewComponent
title1="Aksi" span1={6}
title2="Jumlah peserta" span2={6}
title3="Nama group" text1={
<TextCustom bold truncate align="center">
Jumlah Anggota
</TextCustom>
}
text2={
<TextCustom bold truncate>
Nama Group
</TextCustom>
}
/> />
<Divider /> <Divider />
@@ -67,31 +73,27 @@ export default function AdminCollaborationGroup() {
) : ( ) : (
list?.map((item: any, index: number) => ( list?.map((item: any, index: number) => (
<View key={index}> <View key={index}>
<AdminTableValue <ClickableCustom
value1={ onPress={() => {
<ActionIcon router.push(`/admin/collaboration/${item.id}/group`);
icon={ }}
<Octicons >
name="eye" <GridSpan_NewComponent
size={ICON_SIZE_BUTTON} span1={6}
color="black" span2={6}
/> text1={
} <TextCustom truncate={1} align="center">
onPress={() => { {item?.ProjectCollaboration_AnggotaRoomChat?.length ||
router.push(`/admin/collaboration/${item.id}/group`); "-"}
}} </TextCustom>
/> }
} text2={
value2={ <TextCustom truncate={2}>
<TextCustom truncate={1}> {item?.name || "-"}
{item?.ProjectCollaboration_AnggotaRoomChat?.length || </TextCustom>
"-"} }
</TextCustom> />
} </ClickableCustom>
value3={
<TextCustom truncate={2}>{item?.name || "-"}</TextCustom>
}
/>
</View> </View>
)) ))
)} )}

View File

@@ -1,6 +1,8 @@
import { import {
ActionIcon, ActionIcon,
ClickableCustom,
LoaderCustom, LoaderCustom,
Spacing,
StackCustom, StackCustom,
TextCustom, TextCustom,
ViewWrapper, ViewWrapper,
@@ -9,6 +11,7 @@ import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage"
import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle"; import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle";
import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue"; import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue";
import AdminTitlePage from "@/components/_ShareComponent/Admin/TitlePage"; import AdminTitlePage from "@/components/_ShareComponent/Admin/TitlePage";
import { GridSpan_NewComponent } from "@/components/_ShareComponent/GridSpan_NewComponent";
import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; import { ICON_SIZE_BUTTON } from "@/constants/constans-value";
import { apiAdminCollaboration } from "@/service/api-admin/api-admin-collaboration"; import { apiAdminCollaboration } from "@/service/api-admin/api-admin-collaboration";
import { Octicons } from "@expo/vector-icons"; import { Octicons } from "@expo/vector-icons";
@@ -51,11 +54,7 @@ export default function AdminCollaborationPublish() {
<StackCustom> <StackCustom>
<AdminComp_BoxTitle title="Publish" /> <AdminComp_BoxTitle title="Publish" />
<AdminTitleTable <GridSpan_NewComponent text1={<TextCustom bold>Username</TextCustom>} text2={<TextCustom bold>Judul Proyek</TextCustom>} />
title1="Aksi"
title2="Username"
title3="Judul Proyek"
/>
{/* <Spacing height={10} /> */} {/* <Spacing height={10} /> */}
<Divider /> <Divider />
@@ -68,32 +67,26 @@ export default function AdminCollaborationPublish() {
) : ( ) : (
list?.map((item: any, index: number) => ( list?.map((item: any, index: number) => (
<View key={index}> <View key={index}>
<AdminTableValue <ClickableCustom
value1={ onPress={() => {
<ActionIcon router.push(`/admin/collaboration/${item?.id}/publish`);
icon={ }}
<Octicons >
name="eye" <GridSpan_NewComponent
size={ICON_SIZE_BUTTON} text1={
color="black" <TextCustom truncate={1}>
/> {item?.Author?.username || "-"}{" "}
} </TextCustom>
onPress={() => { }
router.push(`/admin/collaboration/${item?.id}/publish`); text2={
}} <TextCustom truncate={2}>
/> {item?.title || "-"}
} </TextCustom>
value2={ }
<TextCustom align="center" truncate={1}> />
{item?.Author?.username || "-"}{" "} </ClickableCustom>
</TextCustom> <Spacing height={8}/>
} <Divider/>
value3={
<TextCustom align="center" truncate={2}>
{item?.title || "-"}
</TextCustom>
}
/>
</View> </View>
)) ))
)} )}

View File

@@ -3,6 +3,7 @@ import {
ActionIcon, ActionIcon,
AlertDefaultSystem, AlertDefaultSystem,
BaseBox, BaseBox,
CenterCustom,
DrawerCustom, DrawerCustom,
LoaderCustom, LoaderCustom,
MenuDrawerDynamicGrid, MenuDrawerDynamicGrid,
@@ -17,6 +18,7 @@ import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage"
import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle"; import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle";
import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue"; import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue";
import { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8"; import { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8";
import { GridSpan_NewComponent } from "@/components/_ShareComponent/GridSpan_NewComponent";
import { MainColor } from "@/constants/color-palet"; import { MainColor } from "@/constants/color-palet";
import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; import { ICON_SIZE_BUTTON } from "@/constants/constans-value";
import { import {
@@ -27,6 +29,7 @@ import {
import { router, useFocusEffect, useLocalSearchParams } from "expo-router"; import { router, useFocusEffect, useLocalSearchParams } from "expo-router";
import _ from "lodash"; import _ from "lodash";
import { useCallback, useState } from "react"; import { useCallback, useState } from "react";
import { View } from "react-native";
import { Divider } from "react-native-paper"; import { Divider } from "react-native-paper";
import Toast from "react-native-toast-message"; import Toast from "react-native-toast-message";
@@ -95,24 +98,24 @@ export default function AdminForumReportComment() {
> >
<BaseBox> <BaseBox>
<StackCustom gap={"sm"}> <StackCustom gap={"sm"}>
<GridSpan_4_8 <GridSpan_NewComponent
label={<TextCustom bold>Username</TextCustom>} text1={<TextCustom bold>Username</TextCustom>}
value={<TextCustom>{data?.Author?.username || "-"}</TextCustom>} text2={<TextCustom>{data?.Author?.username || "-"}</TextCustom>}
/> />
<GridSpan_4_8 <GridSpan_NewComponent
label={<TextCustom bold>Komentar</TextCustom>} text1={<TextCustom bold>Komentar</TextCustom>}
value={<TextCustom>{data?.komentar || "-"}</TextCustom>} text2={<TextCustom>{data?.komentar || "-"}</TextCustom>}
/> />
</StackCustom> </StackCustom>
</BaseBox> </BaseBox>
<AdminComp_BoxTitle title="Daftar Report Komentar" /> <AdminComp_BoxTitle title="Daftar Report Komentar" />
<StackCustom> <StackCustom gap={"sm"}>
<AdminTitleTable <GridSpan_NewComponent
title1="Aksi" text1={<TextCustom bold align="center">Aksi</TextCustom>}
title2="Pelapor" text2={<TextCustom bold>Pelapor</TextCustom>}
title3="Kategori Report" text3={<TextCustom bold>Kategori Report</TextCustom>}
/> />
<Divider /> <Divider />
{loadList ? ( {loadList ? (
@@ -123,34 +126,39 @@ export default function AdminForumReportComment() {
</TextCustom> </TextCustom>
) : ( ) : (
listReport?.map((item: any, index: number) => ( listReport?.map((item: any, index: number) => (
<AdminTableValue <View key={index}>
key={index} <GridSpan_NewComponent
value1={ text1={
<ActionIcon <CenterCustom>
icon={<IconView size={ICON_SIZE_BUTTON} color="black" />} <ActionIcon
onPress={() => { icon={<IconView size={ICON_SIZE_BUTTON} color="black" />}
setOpenDrawerAction(true); onPress={() => {
setSelectedReport({ setOpenDrawerAction(true);
id: item.id, setSelectedReport({
username: item.User?.username, id: item.id,
kategori: item.ForumMaster_KategoriReport?.title, username: item.User?.username,
keterangan: item.ForumMaster_KategoriReport?.deskripsi, kategori: item.ForumMaster_KategoriReport?.title,
deskripsi: item.deskripsi, keterangan:
}); item.ForumMaster_KategoriReport?.deskripsi,
}} deskripsi: item.deskripsi,
/> });
} }}
value2={ />
<TextCustom truncate={1}> </CenterCustom>
{item?.User?.username || "-"} }
</TextCustom> text2={
} <TextCustom truncate={1}>
value3={ {item?.User?.username || "-"}
<TextCustom truncate={2} align="center"> </TextCustom>
{item?.ForumMaster_KategoriReport?.title || "-"} }
</TextCustom> text3={
} <TextCustom truncate={2}>
/> {item?.ForumMaster_KategoriReport?.title || "-"}
</TextCustom>
}
/>
<Divider />
</View>
)) ))
)} )}
</StackCustom> </StackCustom>

View File

@@ -4,6 +4,7 @@ import {
AlertDefaultSystem, AlertDefaultSystem,
BadgeCustom, BadgeCustom,
BaseBox, BaseBox,
CenterCustom,
DrawerCustom, DrawerCustom,
LoaderCustom, LoaderCustom,
MenuDrawerDynamicGrid, MenuDrawerDynamicGrid,
@@ -18,6 +19,7 @@ import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage"
import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle"; import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle";
import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue"; import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue";
import { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8"; import { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8";
import { GridSpan_NewComponent } from "@/components/_ShareComponent/GridSpan_NewComponent";
import { MainColor } from "@/constants/color-palet"; import { MainColor } from "@/constants/color-palet";
import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; import { ICON_SIZE_BUTTON } from "@/constants/constans-value";
import { import {
@@ -28,6 +30,7 @@ import {
import { router, useFocusEffect, useLocalSearchParams } from "expo-router"; import { router, useFocusEffect, useLocalSearchParams } from "expo-router";
import _ from "lodash"; import _ from "lodash";
import { useCallback, useState } from "react"; import { useCallback, useState } from "react";
import { View } from "react-native";
import { Divider } from "react-native-paper"; import { Divider } from "react-native-paper";
import Toast from "react-native-toast-message"; import Toast from "react-native-toast-message";
@@ -95,14 +98,14 @@ export default function AdminForumReportPosting() {
> >
<BaseBox> <BaseBox>
<StackCustom gap={"sm"}> <StackCustom gap={"sm"}>
<GridSpan_4_8 <GridSpan_NewComponent
label={<TextCustom bold>Username</TextCustom>} text1={<TextCustom bold>Username</TextCustom>}
value={<TextCustom>{data?.Author?.username || "-"}</TextCustom>} text2={<TextCustom>{data?.Author?.username || "-"}</TextCustom>}
/> />
<GridSpan_4_8 <GridSpan_NewComponent
label={<TextCustom bold>Status</TextCustom>} text1={<TextCustom bold>Status</TextCustom>}
value={ text2={
data && data?.ForumMaster_StatusPosting?.status ? ( data && data?.ForumMaster_StatusPosting?.status ? (
<BadgeCustom <BadgeCustom
color={ color={
@@ -121,19 +124,23 @@ export default function AdminForumReportPosting() {
} }
/> />
<GridSpan_4_8 <GridSpan_NewComponent
label={<TextCustom bold>Postingan</TextCustom>} text1={<TextCustom bold>Postingan</TextCustom>}
value={<TextCustom>{data?.diskusi || "-"}</TextCustom>} text2={<TextCustom>{data?.diskusi || "-"}</TextCustom>}
/> />
</StackCustom> </StackCustom>
</BaseBox> </BaseBox>
<AdminComp_BoxTitle title="Daftar Report Posting" /> <AdminComp_BoxTitle title="Daftar Report Posting" />
<StackCustom gap={"sm"}> <StackCustom gap={"sm"}>
<AdminTitleTable <GridSpan_NewComponent
title1="Aksi" text1={
title2="Pelapor" <TextCustom bold align="center">
title3="Kategori Report" Aksi
</TextCustom>
}
text2={<TextCustom bold>Pelapor</TextCustom>}
text3={<TextCustom bold>Kategori Report</TextCustom>}
/> />
<Divider /> <Divider />
{loadListReport ? ( {loadListReport ? (
@@ -144,34 +151,41 @@ export default function AdminForumReportPosting() {
</TextCustom> </TextCustom>
) : ( ) : (
listReport?.map((item: any, index: number) => ( listReport?.map((item: any, index: number) => (
<AdminTableValue <View key={index}>
key={index} <GridSpan_NewComponent
value1={ text1={
<ActionIcon <CenterCustom>
icon={<IconView size={ICON_SIZE_BUTTON} color="black" />} <ActionIcon
onPress={() => { icon={
setOpenDrawerAction(true); <IconView size={ICON_SIZE_BUTTON} color="black" />
setSelectedReport({ }
id: item?.id, onPress={() => {
username: item?.User?.username, setOpenDrawerAction(true);
kategori: item?.ForumMaster_KategoriReport?.title, setSelectedReport({
keterangan: item?.ForumMaster_KategoriReport?.deskripsi, id: item?.id,
deskripsi: item?.deskripsi, username: item?.User?.username,
}); kategori: item?.ForumMaster_KategoriReport?.title,
}} keterangan:
/> item?.ForumMaster_KategoriReport?.deskripsi,
} deskripsi: item?.deskripsi,
value2={ });
<TextCustom truncate={1}> }}
{item?.User?.username || "-"} />
</TextCustom> </CenterCustom>
} }
value3={ text2={
<TextCustom truncate={2} align="center"> <TextCustom truncate>
{item?.ForumMaster_KategoriReport?.title || "-"} {item?.User?.username || "-"}
</TextCustom> </TextCustom>
} }
/> text3={
<TextCustom truncate={2}>
{item?.ForumMaster_KategoriReport?.title || "-"}
</TextCustom>
}
/>
<Divider />
</View>
)) ))
)} )}
</StackCustom> </StackCustom>

View File

@@ -1,22 +1,22 @@
/* eslint-disable react-hooks/exhaustive-deps */ /* eslint-disable react-hooks/exhaustive-deps */
import { import {
ActionIcon, ClickableCustom,
LoaderCustom, LoaderCustom,
SearchInput, SearchInput,
Spacing,
StackCustom, StackCustom,
TextCustom, TextCustom,
ViewWrapper, ViewWrapper,
} from "@/components"; } from "@/components";
import { IconView } from "@/components/_Icon/IconComponent";
import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage"; import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage";
import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle";
import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue";
import AdminTitlePage from "@/components/_ShareComponent/Admin/TitlePage"; import AdminTitlePage from "@/components/_ShareComponent/Admin/TitlePage";
import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; import { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8";
import { GridSpan_NewComponent } from "@/components/_ShareComponent/GridSpan_NewComponent";
import { apiAdminForum } from "@/service/api-admin/api-admin-forum"; import { apiAdminForum } from "@/service/api-admin/api-admin-forum";
import { router, useFocusEffect } from "expo-router"; import { router, useFocusEffect } from "expo-router";
import _ from "lodash"; import _ from "lodash";
import React, { useCallback, useState } from "react"; import { useCallback, useState } from "react";
import { View } from "react-native";
import { Divider } from "react-native-paper"; import { Divider } from "react-native-paper";
export default function AdminForumPosting() { export default function AdminForumPosting() {
@@ -37,7 +37,9 @@ export default function AdminForumPosting() {
category: "posting", category: "posting",
search: search, search: search,
}); });
console.log("DATA", JSON.stringify(response, null, 2));
if (response.success) { if (response.success) {
setList(response.data); setList(response.data);
} }
@@ -51,7 +53,7 @@ export default function AdminForumPosting() {
const rightComponent = ( const rightComponent = (
<SearchInput <SearchInput
containerStyle={{ width: "100%", marginBottom: 0 }} containerStyle={{ width: "100%", marginBottom: 0 }}
placeholder="Cari" placeholder="Cari postingan"
value={search} value={search}
onChangeText={setSearch} onChangeText={setSearch}
/> />
@@ -61,9 +63,15 @@ export default function AdminForumPosting() {
<> <>
<ViewWrapper headerComponent={<AdminTitlePage title="Forum" />}> <ViewWrapper headerComponent={<AdminTitlePage title="Forum" />}>
<AdminComp_BoxTitle title={"Posting"} rightComponent={rightComponent} /> <AdminComp_BoxTitle title={"Posting"} rightComponent={rightComponent} />
<GridSpan_NewComponent
text1={<TextCustom bold truncate>Username</TextCustom>}
text2={<TextCustom bold truncate> Postingan</TextCustom>}
text3={<TextCustom bold align="center" truncate> Report Posting</TextCustom>}
text4={<TextCustom bold align="center" truncate> Komentar</TextCustom>}
/>
<Divider />
<Spacing />
<StackCustom> <StackCustom>
<AdminTitleTable title1="Aksi" title2="Username" title3="Postingan" />
<Divider />
{loadList ? ( {loadList ? (
<LoaderCustom /> <LoaderCustom />
) : _.isEmpty(list) ? ( ) : _.isEmpty(list) ? (
@@ -72,25 +80,38 @@ export default function AdminForumPosting() {
</TextCustom> </TextCustom>
) : ( ) : (
list?.map((item: any, index: number) => ( list?.map((item: any, index: number) => (
<AdminTableValue <View key={index}>
key={index} <ClickableCustom
value1={ onPress={() => {
<ActionIcon router.push(`/admin/forum/${item.id}`);
icon={<IconView size={ICON_SIZE_BUTTON} color="black" />} }}
onPress={() => { >
router.push(`/admin/forum/${item?.id}`); <GridSpan_NewComponent
}} text1={
<TextCustom truncate={1}>
{item?.Author?.username || "-"}
</TextCustom>
}
text2={
<TextCustom truncate>
{item?.diskusi || "-"}
</TextCustom>
}
text3={
<TextCustom align="center" truncate={2}>
{item?.reportPosting || "-"}
</TextCustom>
}
text4={
<TextCustom align="center" truncate={2}>
{item?.komentar || "-"}
</TextCustom>
}
/> />
}
value2={ </ClickableCustom>
<TextCustom truncate={1}> <Divider />
{item?.Author?.username || "-"} </View>
</TextCustom>
}
value3={
<TextCustom truncate={2}>{item?.diskusi || "-"}</TextCustom>
}
/>
)) ))
)} )}
</StackCustom> </StackCustom>

View File

@@ -1,8 +1,10 @@
/* eslint-disable react-hooks/exhaustive-deps */ /* eslint-disable react-hooks/exhaustive-deps */
import { import {
ActionIcon, ActionIcon,
ClickableCustom,
LoaderCustom, LoaderCustom,
SearchInput, SearchInput,
Spacing,
StackCustom, StackCustom,
TextCustom, TextCustom,
ViewWrapper, ViewWrapper,
@@ -12,12 +14,14 @@ import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage"
import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle"; import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle";
import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue"; import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue";
import AdminTitlePage from "@/components/_ShareComponent/Admin/TitlePage"; import AdminTitlePage from "@/components/_ShareComponent/Admin/TitlePage";
import { GridSpan_NewComponent } from "@/components/_ShareComponent/GridSpan_NewComponent";
import { MainColor } from "@/constants/color-palet"; import { MainColor } from "@/constants/color-palet";
import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; import { ICON_SIZE_BUTTON } from "@/constants/constans-value";
import { apiAdminForum } from "@/service/api-admin/api-admin-forum"; import { apiAdminForum } from "@/service/api-admin/api-admin-forum";
import { router, useFocusEffect } from "expo-router"; import { router, useFocusEffect } from "expo-router";
import _ from "lodash"; import _ from "lodash";
import { useCallback, useState } from "react"; import { useCallback, useState } from "react";
import { View } from "react-native";
import { Divider } from "react-native-paper"; import { Divider } from "react-native-paper";
export default function AdminForumReportComment() { export default function AdminForumReportComment() {
@@ -67,13 +71,26 @@ export default function AdminForumReportComment() {
rightComponent={rightComponent} rightComponent={rightComponent}
/> />
<StackCustom gap={"sm"}> <GridSpan_NewComponent
<AdminTitleTable text1={
title1="Aksi" <TextCustom bold truncate>
title2="Pelapor" Pelapor
title3="Jenis Laporan" </TextCustom>
/> }
<Divider /> text2={
<TextCustom bold truncate>
Komentar
</TextCustom>
}
text3={
<TextCustom bold truncate>
Jenis Laporan
</TextCustom>
}
/>
<Divider />
<Spacing />
<StackCustom gap={"lg"}>
{loadList ? ( {loadList ? (
<LoaderCustom /> <LoaderCustom />
) : _.isEmpty(listData) ? ( ) : _.isEmpty(listData) ? (
@@ -82,34 +99,35 @@ export default function AdminForumReportComment() {
</TextCustom> </TextCustom>
) : ( ) : (
listData?.map((item: any, index: number) => ( listData?.map((item: any, index: number) => (
<AdminTableValue <View key={index}>
key={index} <ClickableCustom
value1={ onPress={() => {
<ActionIcon router.push(
icon={ `/admin/forum/${item?.Forum_Komentar?.id}/list-report-comment`
<IconView );
size={ICON_SIZE_BUTTON} }}
color={MainColor.black} >
/> <GridSpan_NewComponent
text1={
<TextCustom truncate={1}>
{item?.User?.username || "-"}
</TextCustom>
}
text2={
<TextCustom truncate={2}>
{item?.Forum_Komentar?.komentar || "-"}
</TextCustom>
}
text3={
<TextCustom truncate={2}>
{item?.ForumMaster_KategoriReport?.title || "-"}
</TextCustom>
} }
onPress={() => {
router.push(
`/admin/forum/${item?.Forum_Komentar?.id}/list-report-comment`
);
}}
/> />
} </ClickableCustom>
value2={ <Spacing />
<TextCustom truncate={1}> <Divider />
{item?.User?.username || "-"} </View>
</TextCustom>
}
value3={
<TextCustom truncate={2} align="center">
{item?.ForumMaster_KategoriReport?.title || "-"}
</TextCustom>
}
/>
)) ))
)} )}
</StackCustom> </StackCustom>

View File

@@ -1,24 +1,27 @@
/* eslint-disable react-hooks/exhaustive-deps */ /* eslint-disable react-hooks/exhaustive-deps */
import { import {
ActionIcon, ActionIcon,
ClickableCustom,
Divider, Divider,
LoaderCustom, LoaderCustom,
SearchInput, SearchInput,
StackCustom, StackCustom,
TextCustom, TextCustom,
ViewWrapper ViewWrapper,
} from "@/components"; } from "@/components";
import { IconView } from "@/components/_Icon/IconComponent"; import { IconView } from "@/components/_Icon/IconComponent";
import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage"; import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage";
import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle"; import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle";
import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue"; import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue";
import AdminTitlePage from "@/components/_ShareComponent/Admin/TitlePage"; import AdminTitlePage from "@/components/_ShareComponent/Admin/TitlePage";
import { GridSpan_NewComponent } from "@/components/_ShareComponent/GridSpan_NewComponent";
import { MainColor } from "@/constants/color-palet"; import { MainColor } from "@/constants/color-palet";
import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; import { ICON_SIZE_BUTTON } from "@/constants/constans-value";
import { apiAdminForum } from "@/service/api-admin/api-admin-forum"; import { apiAdminForum } from "@/service/api-admin/api-admin-forum";
import { router, useFocusEffect } from "expo-router"; import { router, useFocusEffect } from "expo-router";
import _ from "lodash"; import _ from "lodash";
import { useCallback, useState } from "react"; import { useCallback, useState } from "react";
import { View } from "react-native";
export default function AdminForumReportPosting() { export default function AdminForumReportPosting() {
const [listData, setListData] = useState<any[] | null>(null); const [listData, setListData] = useState<any[] | null>(null);
@@ -67,46 +70,51 @@ export default function AdminForumReportPosting() {
rightComponent={rightComponent} rightComponent={rightComponent}
/> />
<StackCustom gap={"sm"}> <GridSpan_NewComponent
<AdminTitleTable title1="Aksi" title2="Pelapor" title3="Postingan" /> text1={
<TextCustom bold truncate>
<Divider /> Username
</TextCustom>
}
text2={
<TextCustom bold truncate>
Postingan
</TextCustom>
}
/>
<Divider />
<StackCustom>
{loadList ? ( {loadList ? (
<LoaderCustom /> <LoaderCustom />
) : _.isEmpty(listData) ? ( ) : _.isEmpty(listData) ? (
<TextCustom align="center" color="gray"> <TextCustom align="center" color="gray">
Belum ada data Belum ada data
</TextCustom> </TextCustom>
) : ( ) : (
listData?.map((item: any, index: number) => ( listData?.map((item: any, index: number) => (
<AdminTableValue <View key={index}>
key={index} <ClickableCustom
value1={ onPress={() => {
<ActionIcon router.push(
icon={ `/admin/forum/${item?.Forum_Posting?.id}/list-report-posting`
<IconView );
size={ICON_SIZE_BUTTON} }}
color={MainColor.black} >
/> <GridSpan_NewComponent
text1={
<TextCustom truncate={1}>
{item?.User?.username || "-"}
</TextCustom>
}
text2={
<TextCustom truncate={1}>
{item?.Forum_Posting?.diskusi || "-"}
</TextCustom>
} }
onPress={() => {
router.push(
`/admin/forum/${item?.Forum_Posting?.id}/list-report-posting`
);
}}
/> />
} </ClickableCustom>
value2={ <Divider />
<TextCustom truncate={1}> </View>
{item?.User?.username || "-"}
</TextCustom>
}
value3={
<TextCustom truncate={2} align="center">
{item?.Forum_Posting?.diskusi || "-"}
</TextCustom>
}
/>
)) ))
)} )}
</StackCustom> </StackCustom>

View File

@@ -103,7 +103,7 @@ export default function AdminVotingStatus() {
</TextCustom> </TextCustom>
} }
value3={ value3={
<TextCustom align="center" truncate={2}> <TextCustom truncate={2}>
{item?.title || "-"} {item?.title || "-"}
</TextCustom> </TextCustom>
} }

View File

@@ -91,7 +91,7 @@ export default function AdminVotingHistory() {
} }
value2={<TextCustom truncate={1}>{item?.Author?.username || "-"}</TextCustom>} value2={<TextCustom truncate={1}>{item?.Author?.username || "-"}</TextCustom>}
value3={ value3={
<TextCustom align="center" truncate={2}> <TextCustom truncate={2}>
{item?.title || "-"} {item?.title || "-"}
</TextCustom> </TextCustom>
} }

View File

@@ -87,7 +87,7 @@ const SelectCustom: React.FC<SelectProps> = ({
borderRadius, borderRadius,
flexDirection: "row", flexDirection: "row",
alignItems: "center", alignItems: "center",
paddingHorizontal: 10, // paddingHorizontal: 0,
height: 50, height: 50,
}, },

View File

@@ -1,8 +1,8 @@
import { Grid } from "@/components"; import { Grid } from "@/components";
export const GridSpan_4_8 = ({ export const GridSpan_4_8 = ({
label, label: text1,
value, value: text2,
}: { }: {
label: React.ReactNode; label: React.ReactNode;
value: React.ReactNode; value: React.ReactNode;
@@ -17,10 +17,10 @@ export const GridSpan_4_8 = ({
paddingLeft: 8, paddingLeft: 8,
}} }}
> >
{label} {text1}
</Grid.Col> </Grid.Col>
<Grid.Col span={8} style={{ justifyContent: "center", paddingRight: 8 }}> <Grid.Col span={8} style={{ justifyContent: "center", paddingRight: 8 }}>
{value} {text2}
</Grid.Col> </Grid.Col>
</Grid> </Grid>
); );

View File

@@ -0,0 +1,54 @@
import { Grid } from "@/components";
export const GridSpan_NewComponent = ({
text1,
text2,
text3,
text4,
span1,
span2,
}: {
text1: React.ReactNode;
text2: React.ReactNode;
text3?: React.ReactNode;
text4?: React.ReactNode;
span1?: number;
span2?: number;
}) => {
return (
<Grid>
<Grid.Col
span={span1 ? span1 : text4 ? 3 : 4}
style={{
justifyContent: "flex-start",
paddingRight: 5,
paddingLeft: 5,
}}
>
{text1}
</Grid.Col>
<Grid.Col
span={span2 ? span2 : text4 ? 3 : text3 ? 4 : 8}
style={{ justifyContent: "flex-start", paddingRight: 5 }}
>
{text2}
</Grid.Col>
{text3 && (
<Grid.Col
span={text4 ? 3 : 4}
style={{ justifyContent: "flex-start", paddingRight: 5 }}
>
{text3}
</Grid.Col>
)}
{text4 && (
<Grid.Col
span={3}
style={{ justifyContent: "flex-start", paddingRight: 5 }}
>
{text4}
</Grid.Col>
)}
</Grid>
);
};

View File

@@ -134,10 +134,10 @@ export default function LoginView() {
if (token && token !== "" && isAdmin) { if (token && token !== "" && isAdmin) {
// Akan di aktifkan jika sudah losos review // Akan di aktifkan jika sudah losos review
// return <Redirect href={"/(application)/admin/dashboard"} />; return <Redirect href={"/(application)/admin/dashboard"} />;
// Sementara gunakan ini // Sementara gunakan ini
return <Redirect href={"/(application)/(user)/home"} />; // return <Redirect href={"/(application)/(user)/home"} />;
} }
return ( return (

View File

@@ -25,7 +25,7 @@ function Collaboration_BoxPublishSection({
name={data?.Author?.username || "Username"} name={data?.Author?.username || "Username"}
rightComponent={rightComponentAvatar} rightComponent={rightComponentAvatar}
avatar={data?.Author?.Profile?.imageId} avatar={data?.Author?.Profile?.imageId}
withBottomLine // withBottomLine
/> />
<StackCustom style={{paddingBlock: 10}}> <StackCustom style={{paddingBlock: 10}}>

View File

@@ -50,7 +50,7 @@ export default function Event_BoxDetailPublishSection({
<Grid.Col span={4}> <Grid.Col span={4}>
<TextCustom bold>{item.title}</TextCustom> <TextCustom bold>{item.title}</TextCustom>
</Grid.Col> </Grid.Col>
<Grid.Col span={8}> <Grid.Col span={8} style={{ paddingLeft: 10 }}>
<TextCustom>{item.value}</TextCustom> <TextCustom>{item.value}</TextCustom>
</Grid.Col> </Grid.Col>
</Grid> </Grid>

View File

@@ -1,12 +1,12 @@
import { ITabs } from "@/components/_Interface/types"; import { ITabs } from "@/components/_Interface/types";
export const tabsHome: any = (profileId: string) => [ export const tabsHome: any = ({acceptedForumTermsAt, profileId}: {acceptedForumTermsAt: Date, profileId: string}) => [
{ {
id: "forum", id: "forum",
icon: "chatbubble-ellipses-outline", icon: "chatbubble-ellipses-outline",
activeIcon: "chatbubble-ellipses", activeIcon: "chatbubble-ellipses",
label: "Forum", label: "Forum",
path: "/forum", path: acceptedForumTermsAt ? "/forum" : "/forum/terms",
isActive: true, isActive: true,
disabled: false, disabled: false,
}, },

View File

@@ -15,7 +15,7 @@ export default function Home_FeatureSection() {
name: "Collaboration", name: "Collaboration",
icon: <Ionicons name="share" size={48} color="gray" />, icon: <Ionicons name="share" size={48} color="gray" />,
onPress: () => router.push("/(application)/(user)/collaboration/(tabs)"), onPress: () => router.push("/(application)/(user)/collaboration/(tabs)"),
status: "inactive", status: "active",
}, },
{ {
name: "Voting", name: "Voting",

View File

@@ -55,10 +55,6 @@ export default function Portofolio_ButtonCreate({
}; };
const handleCreatePortofolio = async () => { const handleCreatePortofolio = async () => {
console.log(
"Data sub bidang >>",
JSON.stringify(subBidangSelected, null, 2)
);
if (!validaasiData()) { if (!validaasiData()) {
Toast.show({ Toast.show({
type: "info", type: "info",

View File

@@ -36,3 +36,13 @@ export async function apiForumBlockUser({
throw error; throw error;
} }
} }
export async function apiAcceptForumTerms({category, userId}:{category:"Forum" | "Event", userId: string}) {
try {
const response = await apiConfig.post(`/mobile/user/${userId}/terms-of-app?category=${category}`);
return response.data;
} catch (error) {
throw error;
}
}