notification/12-dec-25 #29
@@ -595,6 +595,13 @@ export default function UserLayout() {
|
||||
headerLeft: () => <BackButton />,
|
||||
}}
|
||||
/>
|
||||
<Stack.Screen
|
||||
name="forum/terms"
|
||||
options={{
|
||||
title: "Syarat & Ketentuan Forum",
|
||||
headerLeft: () => <BackButton />,
|
||||
}}
|
||||
/>
|
||||
|
||||
{/* ========== Maps Section ========= */}
|
||||
<Stack.Screen
|
||||
|
||||
202
app/(application)/(user)/forum/terms.tsx
Normal file
202
app/(application)/(user)/forum/terms.tsx
Normal 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",
|
||||
},
|
||||
];
|
||||
@@ -11,35 +11,44 @@ import Home_FeatureSection from "@/screens/Home/topFeatureSection";
|
||||
import { apiUser } from "@/service/api-client/api-user";
|
||||
import { apiVersion } from "@/service/api-config";
|
||||
import { Ionicons } from "@expo/vector-icons";
|
||||
import { Redirect, router, Stack } from "expo-router";
|
||||
import { useEffect, useState } from "react";
|
||||
import { Redirect, router, Stack, useFocusEffect } from "expo-router";
|
||||
import { useCallback, useEffect, useState } from "react";
|
||||
import { RefreshControl } from "react-native";
|
||||
|
||||
export default function Application() {
|
||||
const { token, user } = useAuth();
|
||||
const { token, user, userData } = useAuth();
|
||||
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() {
|
||||
const response = await apiUser(user?.id as string);
|
||||
console.log(
|
||||
"[Profile ID]>>",
|
||||
JSON.stringify(response?.data?.Profile.id, null, 2)
|
||||
);
|
||||
|
||||
console.log("[Profile ID]>>", JSON.stringify(response?.data?.Profile?.id, null, 2));
|
||||
|
||||
setData(response.data);
|
||||
}
|
||||
|
||||
|
||||
const checkVersion = async () => {
|
||||
const response = await apiVersion();
|
||||
console.log("[Version] >>", JSON.stringify(response.data, null, 2));
|
||||
};
|
||||
|
||||
|
||||
const onRefresh = useCallback(() => {
|
||||
setRefreshing(true);
|
||||
onLoadData();
|
||||
checkVersion();
|
||||
setRefreshing(false);
|
||||
}, []);
|
||||
|
||||
if (user && user?.termsOfServiceAccepted === false) {
|
||||
console.log("User is not accept term service");
|
||||
return <Redirect href={`/terms-agreement`} />;
|
||||
@@ -83,8 +92,16 @@ export default function Application() {
|
||||
}}
|
||||
/>
|
||||
<ViewWrapper
|
||||
refreshControl={
|
||||
<RefreshControl refreshing={refreshing} onRefresh={onRefresh} />
|
||||
}
|
||||
footerComponent={
|
||||
<TabSection tabs={tabsHome(data?.Profile?.id as string)} />
|
||||
<TabSection
|
||||
tabs={tabsHome({
|
||||
acceptedForumTermsAt: data?.acceptedForumTermsAt,
|
||||
profileId: data?.Profile?.id,
|
||||
})}
|
||||
/>
|
||||
}
|
||||
>
|
||||
<StackCustom>
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
import { ITabs } from "@/components/_Interface/types";
|
||||
|
||||
export const tabsHome: any = (profileId: string) => [
|
||||
export const tabsHome: any = ({acceptedForumTermsAt, profileId}: {acceptedForumTermsAt: Date, profileId: string}) => [
|
||||
{
|
||||
id: "forum",
|
||||
icon: "chatbubble-ellipses-outline",
|
||||
activeIcon: "chatbubble-ellipses",
|
||||
label: "Forum",
|
||||
path: "/forum",
|
||||
path: acceptedForumTermsAt ? "/forum" : "/forum/terms",
|
||||
isActive: true,
|
||||
disabled: false,
|
||||
},
|
||||
|
||||
@@ -36,3 +36,13 @@ export async function apiForumBlockUser({
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user