diff --git a/app/(application)/admin/_layout.tsx b/app/(application)/admin/_layout.tsx
index b7cfcfe..bd4383c 100644
--- a/app/(application)/admin/_layout.tsx
+++ b/app/(application)/admin/_layout.tsx
@@ -1,27 +1,29 @@
-/* eslint-disable @typescript-eslint/no-unused-vars */
import {
- ClickableCustom,
+ AlertDefaultSystem,
DrawerCustom,
+ GridComponentView,
+ MenuDrawerDynamicGrid,
StackCustom,
TextCustom,
} from "@/components";
import DrawerAdmin from "@/components/Drawer/DrawerAdmin";
import NavbarMenu from "@/components/Drawer/NavbarMenu";
-import SidebarMenu from "@/components/Drawer/SidebarMenu";
import { AccentColor, MainColor } from "@/constants/color-palet";
import { ICON_SIZE_SMALL } from "@/constants/constans-value";
+import { adminListMenu } from "@/screens/Admin/listPageAdmin";
import { GStyles } from "@/styles/global-styles";
import { FontAwesome6, Ionicons } from "@expo/vector-icons";
import { router, Stack } from "expo-router";
import { useState } from "react";
-import { View } from "react-native";
export default function AdminLayout() {
- const [openDrawer, setOpenDrawer] = useState(false);
+ const [openDrawerNavbar, setOpenDrawerNavbar] = useState(false);
+ const [openDrawerUser, setOpenDrawerUser] = useState(false);
return (
<>
setOpenDrawer(true)}
+ onPress={() => setOpenDrawerNavbar(true)}
/>
),
headerRight: () => (
@@ -41,54 +43,185 @@ export default function AdminLayout() {
name="circle-user"
size={ICON_SIZE_SMALL}
color={MainColor.white}
+ onPress={() => setOpenDrawerUser(true)}
/>
),
}}
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- setOpenDrawer(false)}>
-
+ setOpenDrawerNavbar(false)}
+ >
+
setOpenDrawer(false)}
+ onPress={() => setOpenDrawerNavbar(false)}
style={{ alignSelf: "flex-end" }}
/>
setOpenDrawer(false)}
+ items={adminListMenu}
+ onClose={() => setOpenDrawerNavbar(false)}
/>
+
+ setOpenDrawerUser(false)}
+ height={"auto"}
+ >
+
+
+ }
+ >
+ Username
+
+
+ }
+ >
+ User Role
+
+
+
+ ),
+ path: "/admin/notification",
+ },
+ {
+ label: "Kembali ke User",
+ value: "back-to-user",
+ icon: (
+
+ ),
+ path: "" as any,
+ },
+ {
+ label: "Keluar",
+ value: "logout",
+ icon: (
+
+ ),
+ path: "" as any,
+ color: MainColor.red,
+ },
+ ]}
+ onPressItem={(item) => {
+ if (item.value === "notification") {
+ router.push("/admin/notification");
+ setOpenDrawerUser(false);
+ } else if (item.value === "back-to-user") {
+ AlertDefaultSystem({
+ title: "Kembali ke User",
+ message: "Apakah Anda yakin ingin kembali ke user?",
+ textLeft: "Batal",
+ textRight: "Ya",
+ onPressRight: () => {
+ router.replace(`/(application)/(user)/profile/${123}`);
+ },
+ });
+ } else if (item.value === "logout") {
+ AlertDefaultSystem({
+ title: "Keluar",
+ message: "Apakah Anda yakin ingin keluar?",
+ textLeft: "Batal",
+ textRight: "Keluar",
+ onPressRight: () => {
+ router.replace("/");
+ },
+ });
+ }
+ }}
+ />
+
+
>
);
}
-
diff --git a/app/(application)/admin/app-information/index.tsx b/app/(application)/admin/app-information/index.tsx
new file mode 100644
index 0000000..213ad29
--- /dev/null
+++ b/app/(application)/admin/app-information/index.tsx
@@ -0,0 +1,62 @@
+import {
+ ScrollableCustom,
+ ViewWrapper
+} from "@/components";
+import AdminAppInformation_BusinessFieldSection from "@/screens/Admin/App-Information/BusinessFieldSection";
+import AdminAppInformation_Bank from "@/screens/Admin/App-Information/InformationBankSection";
+import AdminAppInformation_StickerSection from "@/screens/Admin/App-Information/StickerSection";
+import { useState } from "react";
+
+export default function AdminInformation() {
+ const [activeCategory, setActiveCategory] = useState("bank");
+
+ const handlePress = (item: any) => {
+ setActiveCategory(item.value);
+ // tambahkan logika lain seperti filter dsb.
+ };
+
+ const scrollComponent = (
+
+ );
+
+ const renderContent = () => {
+ switch (activeCategory) {
+ case "bank":
+ return ;
+ case "business":
+ return ;
+ case "sticker":
+ return ;
+ default:
+ return ;
+ }
+ };
+
+ return (
+ <>
+
+ {renderContent()}
+
+ >
+ );
+}
diff --git a/app/(application)/admin/collaboration/group.tsx b/app/(application)/admin/collaboration/group.tsx
new file mode 100644
index 0000000..f00a9bd
--- /dev/null
+++ b/app/(application)/admin/collaboration/group.tsx
@@ -0,0 +1,11 @@
+import { TextCustom, ViewWrapper } from "@/components";
+
+export default function AdminCollaborationGroup() {
+ return (
+ <>
+
+ Admin Collaboration Group
+
+ >
+ );
+}
diff --git a/app/(application)/admin/collaboration/index.tsx b/app/(application)/admin/collaboration/index.tsx
new file mode 100644
index 0000000..5109ce6
--- /dev/null
+++ b/app/(application)/admin/collaboration/index.tsx
@@ -0,0 +1,11 @@
+import { TextCustom, ViewWrapper } from "@/components";
+
+export default function AdminCollaboration() {
+ return (
+ <>
+
+ Admin Collaboration
+
+ >
+ );
+}
diff --git a/app/(application)/admin/collaboration/publish.tsx b/app/(application)/admin/collaboration/publish.tsx
new file mode 100644
index 0000000..442e866
--- /dev/null
+++ b/app/(application)/admin/collaboration/publish.tsx
@@ -0,0 +1,11 @@
+import { TextCustom, ViewWrapper } from "@/components";
+
+export default function AdminCollaborationPublish() {
+ return (
+ <>
+
+ Admin Collaboration Publish
+
+ >
+ );
+}
diff --git a/app/(application)/admin/collaboration/reject.tsx b/app/(application)/admin/collaboration/reject.tsx
new file mode 100644
index 0000000..b351ed7
--- /dev/null
+++ b/app/(application)/admin/collaboration/reject.tsx
@@ -0,0 +1,11 @@
+import { TextCustom, ViewWrapper } from "@/components";
+
+export default function AdminCollaborationReject() {
+ return (
+ <>
+
+ Admin Collaboration Reject
+
+ >
+ );
+}
diff --git a/app/(application)/admin/dashboard.tsx b/app/(application)/admin/dashboard.tsx
index ceb6d04..4748f08 100644
--- a/app/(application)/admin/dashboard.tsx
+++ b/app/(application)/admin/dashboard.tsx
@@ -1,11 +1,40 @@
-import { TextCustom, ViewWrapper } from "@/components";
+import {
+ StackCustom,
+ TextCustom,
+ ViewWrapper
+} from "@/components";
+import AdminComp_BoxDashboard from "@/components/_ShareComponent/Admin/BoxDashboard";
+import { MainColor } from "@/constants/color-palet";
+import { Ionicons } from "@expo/vector-icons";
export default function AdminDashboard() {
return (
<>
- Admin Dashboard
+
+
+ Main Dashboard
+
+ {listData.map((item, i) => (
+
+ ))}
+
>
);
}
+
+const listData = [
+ {
+ label: "User",
+ value: 4,
+ icon: ,
+ },
+ {
+ label: "Portofolio",
+ value: 7,
+ icon: (
+
+ ),
+ },
+];
diff --git a/app/(application)/admin/information.tsx b/app/(application)/admin/investment/index.tsx
similarity index 58%
rename from app/(application)/admin/information.tsx
rename to app/(application)/admin/investment/index.tsx
index d7831ef..876ce21 100644
--- a/app/(application)/admin/information.tsx
+++ b/app/(application)/admin/investment/index.tsx
@@ -1,10 +1,10 @@
import { TextCustom, ViewWrapper } from "@/components";
-export default function AdminInformation() {
+export default function AdminInvestment() {
return (
<>
- Information
+ Admin Investment
>
);
diff --git a/app/(application)/admin/investment/publish.tsx b/app/(application)/admin/investment/publish.tsx
new file mode 100644
index 0000000..a194391
--- /dev/null
+++ b/app/(application)/admin/investment/publish.tsx
@@ -0,0 +1,11 @@
+import { TextCustom, ViewWrapper } from "@/components";
+
+export default function AdminInvestmentPublish() {
+ return (
+ <>
+
+ Admin Investment Publish
+
+ >
+ );
+}
diff --git a/app/(application)/admin/investment/reject.tsx b/app/(application)/admin/investment/reject.tsx
new file mode 100644
index 0000000..26292a7
--- /dev/null
+++ b/app/(application)/admin/investment/reject.tsx
@@ -0,0 +1,11 @@
+import { TextCustom, ViewWrapper } from "@/components";
+
+export default function AdminInvestmentReject() {
+ return (
+ <>
+
+ Admin Investment Reject
+
+ >
+ );
+}
diff --git a/app/(application)/admin/investment/review.tsx b/app/(application)/admin/investment/review.tsx
new file mode 100644
index 0000000..37e018e
--- /dev/null
+++ b/app/(application)/admin/investment/review.tsx
@@ -0,0 +1,11 @@
+import { TextCustom, ViewWrapper } from "@/components";
+
+export default function AdminInvestmentReview() {
+ return (
+ <>
+
+ Admin Investment Review
+
+ >
+ );
+}
diff --git a/app/(application)/admin/maps.tsx b/app/(application)/admin/maps.tsx
index c08541d..f27ac3d 100644
--- a/app/(application)/admin/maps.tsx
+++ b/app/(application)/admin/maps.tsx
@@ -1,10 +1,10 @@
-import { TextCustom, ViewWrapper } from "@/components";
+import { MapCustom, ViewWrapper } from "@/components";
export default function AdminMaps() {
return (
<>
- Maps
+
>
);
diff --git a/app/(application)/admin/notification/index.tsx b/app/(application)/admin/notification/index.tsx
new file mode 100644
index 0000000..eef8cc0
--- /dev/null
+++ b/app/(application)/admin/notification/index.tsx
@@ -0,0 +1,20 @@
+import { BackButton, TextCustom, ViewWrapper } from "@/components";
+import { Stack } from "expo-router";
+
+export default function AdminNotification() {
+ return (
+ <>
+ ,
+ headerRight: () => <>>,
+ }}
+ />
+
+
+ Notification
+
+ >
+ );
+}
diff --git a/app/_layout.tsx b/app/_layout.tsx
index 078d297..14240ab 100644
--- a/app/_layout.tsx
+++ b/app/_layout.tsx
@@ -14,7 +14,10 @@ export default function RootLayout() {
headerTitleAlign: "center",
}}
>
-
+
void;
+ value?: string | number
+ onChange?: (value: string | number) => void;
+ icon?: React.ReactNode;
+ style?: StyleProp
}
-const CircularInput: React.FC = ({ value, onChange }) => {
+const CircularInput: React.FC = ({ value, onChange, icon, style }) => {
return (
-
-
+
+ {icon ? (
+ icon
+ ) : (
+
+ )}
);
};
diff --git a/components/Divider/Divider.tsx b/components/Divider/Divider.tsx
index 810ab6e..477d354 100644
--- a/components/Divider/Divider.tsx
+++ b/components/Divider/Divider.tsx
@@ -2,8 +2,8 @@ import { AccentColor } from "@/constants/color-palet";
import { View } from "react-native";
export default function Divider({
- color = AccentColor.blue,
- size = 1,
+ color = AccentColor.white,
+ size = 0.5,
marginTop= 12,
marginBottom= 12,
}: {
diff --git a/components/Drawer/DrawerAdmin.tsx b/components/Drawer/DrawerAdmin.tsx
index fc433d4..d29bba1 100644
--- a/components/Drawer/DrawerAdmin.tsx
+++ b/components/Drawer/DrawerAdmin.tsx
@@ -1,10 +1,10 @@
import React, { useEffect, useRef } from "react";
import {
- Animated,
- Dimensions,
- InteractionManager,
- PanResponder,
- StyleSheet
+ Animated,
+ Dimensions,
+ InteractionManager,
+ PanResponder,
+ StyleSheet,
} from "react-native";
import { AccentColor, MainColor } from "@/constants/color-palet";
@@ -107,9 +107,15 @@ export default function DrawerAdmin({
{...panResponder.panHandlers}
>
{/* Handle Bar (opsional) */}
- {/* */}
-
- {children}
+
+ {children}
+ {/* */}
+
>
);
diff --git a/components/Drawer/MenuDrawerDynamicGird.tsx b/components/Drawer/MenuDrawerDynamicGird.tsx
index eba1007..5b4c8ac 100644
--- a/components/Drawer/MenuDrawerDynamicGird.tsx
+++ b/components/Drawer/MenuDrawerDynamicGird.tsx
@@ -7,6 +7,7 @@ import { Href } from "expo-router";
type IMenuDrawerItemProps = {
icon: React.ReactNode;
label: string;
+ value?: string;
path?: Href;
color?: string;
}
diff --git a/components/Drawer/NavbarMenu.tsx b/components/Drawer/NavbarMenu.tsx
index a5fda5b..6416647 100644
--- a/components/Drawer/NavbarMenu.tsx
+++ b/components/Drawer/NavbarMenu.tsx
@@ -1,17 +1,17 @@
import { AccentColor, MainColor } from "@/constants/color-palet";
import { Ionicons } from "@expo/vector-icons";
import { router, usePathname } from "expo-router";
-import React, { useRef, useState } from "react";
+import React, { useEffect, useRef, useState } from "react";
import {
Animated,
+ ScrollView,
StyleSheet,
Text,
TouchableOpacity,
View,
} from "react-native";
-import TextCustom from "../Text/TextCustom";
-interface NavbarItem {
+export interface NavbarItem {
label: string;
icon?: keyof typeof Ionicons.glyphMap;
color?: string;
@@ -33,6 +33,17 @@ export default function NavbarMenu({ items, onClose }: NavbarMenuProps) {
const [activeLink, setActiveLink] = useState(null);
const [openKeys, setOpenKeys] = useState([]); // Untuk kontrol dropdown
+ // Normalisasi path: hapus trailing slash
+ const normalizePath = (path: string) => path.replace(/\/+$/, "");
+ const normalizedPathname = pathname ? normalizePath(pathname) : "";
+
+ // Set activeLink saat pathname berubah
+ useEffect(() => {
+ if (normalizedPathname) {
+ setActiveLink(normalizedPathname);
+ }
+ }, [normalizedPathname]);
+
// Toggle dropdown
const toggleOpen = (label: string) => {
setOpenKeys((prev) =>
@@ -41,18 +52,31 @@ export default function NavbarMenu({ items, onClose }: NavbarMenuProps) {
};
return (
-
- {items.map((item) => (
-