Merge pull request 'upd: custom header' (#11) from amalia/27-jan-26 into join

Reviewed-on: http://wibugit.wibudev.com/wibu/mobile-darmasaba/pulls/11
This commit is contained in:
2026-01-27 17:41:11 +08:00
31 changed files with 774 additions and 315 deletions

View File

@@ -1,5 +1,5 @@
import HeaderRightAnnouncementList from "@/components/announcement/headerAnnouncementList"; import HeaderRightAnnouncementList from "@/components/announcement/headerAnnouncementList";
import ButtonBackHeader from "@/components/buttonBackHeader"; import AppHeader from "@/components/AppHeader";
import HeaderDiscussionGeneral from "@/components/discussion_general/headerDiscussionGeneral"; import HeaderDiscussionGeneral from "@/components/discussion_general/headerDiscussionGeneral";
import HeaderRightDivisionList from "@/components/division/headerDivisionList"; import HeaderRightDivisionList from "@/components/division/headerDivisionList";
import HeaderRightGroupList from "@/components/group/headerGroupList"; import HeaderRightGroupList from "@/components/group/headerGroupList";
@@ -97,54 +97,100 @@ export default function RootLayout() {
<Stack.Screen name="search" options={{ title: 'Pencarian' }} /> <Stack.Screen name="search" options={{ title: 'Pencarian' }} />
<Stack.Screen name="notification" options={{ <Stack.Screen name="notification" options={{
title: 'Notifikasi', title: 'Notifikasi',
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, // headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
headerTitle: 'Notifikasi', headerTitle: 'Notifikasi',
headerTitleAlign: 'center' headerTitleAlign: 'center',
header: () => (
<AppHeader title="Notifikasi" showBack={true} onPressLeft={() => router.back()} />
)
}} /> }} />
<Stack.Screen name="profile" options={{ title: 'Profile' }} /> <Stack.Screen name="profile" options={{ title: 'Profile' }} />
<Stack.Screen name="member/index" options={{ <Stack.Screen name="member/index" options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, // headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
title: 'Anggota', title: 'Anggota',
headerTitleAlign: 'center', headerTitleAlign: 'center',
headerRight: () => <HeaderMemberList /> // headerRight: () => <HeaderMemberList />
header: () => (
<AppHeader title="Anggota"
showBack={true}
onPressLeft={() => router.back()}
right={<HeaderMemberList />}
/>
)
}} /> }} />
<Stack.Screen name="discussion/index" options={{ <Stack.Screen name="discussion/index" options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, // headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
title: 'Diskusi Umum', title: 'Diskusi Umum',
headerTitleAlign: 'center', headerTitleAlign: 'center',
headerRight: () => <HeaderDiscussionGeneral /> // headerRight: () => <HeaderDiscussionGeneral />
header: () => (
<AppHeader
title="Diskusi Umum"
showBack={true}
onPressLeft={() => router.back()}
right={<HeaderDiscussionGeneral />}
/>
)
}} /> }} />
<Stack.Screen name="project/index" options={{ <Stack.Screen name="project/index" options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, // headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
title: 'Kegiatan', title: 'Kegiatan',
headerTitleAlign: 'center', headerTitleAlign: 'center',
headerRight: () => <HeaderRightProjectList /> // headerRight: () => <HeaderRightProjectList />
header: () => (
<AppHeader title="Kegiatan"
showBack={true}
onPressLeft={() => router.back()}
right={<HeaderRightProjectList />}
/>
)
}} /> }} />
<Stack.Screen name="division/index" options={{ <Stack.Screen name="division/index" options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, // headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
title: 'Divisi', title: 'Divisi',
headerTitleAlign: 'center', headerTitleAlign: 'center',
headerRight: () => <HeaderRightDivisionList /> headerRight: () => <HeaderRightDivisionList />
}} /> }} />
<Stack.Screen name="division/[id]/(fitur-division)" options={{ headerShown: false }} /> <Stack.Screen name="division/[id]/(fitur-division)" options={{ headerShown: false }} />
<Stack.Screen name="group/index" options={{ <Stack.Screen name="group/index" options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, // headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
headerTitle: 'Lembaga Desa', headerTitle: 'Lembaga Desa',
headerTitleAlign: 'center', headerTitleAlign: 'center',
headerRight: () => <HeaderRightGroupList /> // headerRight: () => <HeaderRightGroupList />
header: () => (
<AppHeader title="Lembaga Desa"
showBack={true}
onPressLeft={() => router.back()}
right={<HeaderRightGroupList />}
/>
)
}} /> }} />
<Stack.Screen name="position/index" options={{ <Stack.Screen name="position/index" options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, // headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
headerTitle: 'Jabatan', headerTitle: 'Jabatan',
headerTitleAlign: 'center', headerTitleAlign: 'center',
headerRight: () => <HeaderRightPositionList /> // headerRight: () => <HeaderRightPositionList />
header: () => (
<AppHeader title="Jabatan"
showBack={true}
onPressLeft={() => router.back()}
right={<HeaderRightPositionList />}
/>
)
}} /> }} />
<Stack.Screen name="announcement/index" <Stack.Screen name="announcement/index"
options={{ options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, // headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
headerTitle: 'Pengumuman', headerTitle: 'Pengumuman',
headerTitleAlign: 'center', headerTitleAlign: 'center',
headerRight: () => <HeaderRightAnnouncementList /> // headerRight: () => <HeaderRightAnnouncementList />
header: () => (
<AppHeader title="Pengumuman"
showBack={true}
onPressLeft={() => router.back()}
right={<HeaderRightAnnouncementList />}
/>
)
}} }}
/> />
</Stack> </Stack>

View File

@@ -1,4 +1,5 @@
import HeaderRightAnnouncementDetail from "@/components/announcement/headerAnnouncementDetail"; import HeaderRightAnnouncementDetail from "@/components/announcement/headerAnnouncementDetail";
import AppHeader from "@/components/AppHeader";
import BorderBottomItem from "@/components/borderBottomItem"; import BorderBottomItem from "@/components/borderBottomItem";
import ButtonBackHeader from "@/components/buttonBackHeader"; import ButtonBackHeader from "@/components/buttonBackHeader";
import Skeleton from "@/components/skeleton"; import Skeleton from "@/components/skeleton";
@@ -115,10 +116,17 @@ export default function DetailAnnouncement() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, // headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
headerTitle: 'Pengumuman', headerTitle: 'Pengumuman',
headerTitleAlign: 'center', headerTitleAlign: 'center',
headerRight: () => entityUser.role != 'user' && entityUser.role != 'coadmin' ? <HeaderRightAnnouncementDetail id={id} /> : <></>, // headerRight: () => entityUser.role != 'user' && entityUser.role != 'coadmin' ? <HeaderRightAnnouncementDetail id={id} /> : <></>,
header: () => (
<AppHeader title="Pengumuman"
showBack={true}
onPressLeft={() => router.back()}
right={entityUser.role != 'user' && entityUser.role != 'coadmin' ? <HeaderRightAnnouncementDetail id={id} /> : <></>}
/>
)
}} }}
/> />
<ScrollView <ScrollView

View File

@@ -1,5 +1,5 @@
import AppHeader from "@/components/AppHeader";
import BorderBottomItem from "@/components/borderBottomItem"; import BorderBottomItem from "@/components/borderBottomItem";
import ButtonBackHeader from "@/components/buttonBackHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import ButtonSelect from "@/components/buttonSelect"; import ButtonSelect from "@/components/buttonSelect";
import DrawerBottom from "@/components/drawerBottom"; import DrawerBottom from "@/components/drawerBottom";
@@ -15,7 +15,7 @@ import { useAuthSession } from "@/providers/AuthProvider";
import { Entypo, Ionicons, MaterialCommunityIcons } from "@expo/vector-icons"; import { Entypo, Ionicons, MaterialCommunityIcons } from "@expo/vector-icons";
import * as DocumentPicker from "expo-document-picker"; import * as DocumentPicker from "expo-document-picker";
import { router, Stack } from "expo-router"; import { router, Stack } from "expo-router";
import { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { SafeAreaView, ScrollView, StyleSheet, View } from "react-native"; import { SafeAreaView, ScrollView, StyleSheet, View } from "react-native";
import Toast from "react-native-toast-message"; import Toast from "react-native-toast-message";
import { useDispatch, useSelector } from "react-redux"; import { useDispatch, useSelector } from "react-redux";
@@ -132,16 +132,32 @@ export default function CreateAnnouncement() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => ( // headerLeft: () => (
<ButtonBackHeader // <ButtonBackHeader
onPress={() => { // onPress={() => {
router.back(); // router.back();
}} // }}
/> // />
), // ),
headerTitle: "Tambah Pengumuman", headerTitle: "Tambah Pengumuman",
headerTitleAlign: "center", headerTitleAlign: "center",
headerRight: () => ( // headerRight: () => (
// <ButtonSaveHeader
// disable={disableBtn || divisionMember.length == 0 || loading ? true : false}
// category="create"
// onPress={() => {
// divisionMember.length == 0
// ? Toast.show({ type: 'small', text1: "Anda belum memilih divisi", })
// : handleCreate();
// }}
// />
// ),
header: () => (
<AppHeader
title="Tambah Pengumuman"
showBack={true}
onPressLeft={() => router.back()}
right={
<ButtonSaveHeader <ButtonSaveHeader
disable={disableBtn || divisionMember.length == 0 || loading ? true : false} disable={disableBtn || divisionMember.length == 0 || loading ? true : false}
category="create" category="create"
@@ -151,7 +167,9 @@ export default function CreateAnnouncement() {
: handleCreate(); : handleCreate();
}} }}
/> />
), }
/>
)
}} }}
/> />
<LoadingOverlay visible={loading} /> <LoadingOverlay visible={loading} />

View File

@@ -1,5 +1,5 @@
import AppHeader from "@/components/AppHeader";
import BorderBottomItem from "@/components/borderBottomItem"; import BorderBottomItem from "@/components/borderBottomItem";
import ButtonBackHeader from "@/components/buttonBackHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import ButtonSelect from "@/components/buttonSelect"; import ButtonSelect from "@/components/buttonSelect";
import DrawerBottom from "@/components/drawerBottom"; import DrawerBottom from "@/components/drawerBottom";
@@ -183,16 +183,32 @@ export default function EditAnnouncement() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => ( // headerLeft: () => (
<ButtonBackHeader // <ButtonBackHeader
onPress={() => { // onPress={() => {
router.back(); // router.back();
}} // }}
/> // />
), // ),
headerTitle: "Edit Pengumuman", headerTitle: "Edit Pengumuman",
headerTitleAlign: "center", headerTitleAlign: "center",
headerRight: () => ( // headerRight: () => (
// <ButtonSaveHeader
// disable={disableBtn || loading ? true : false}
// category="update"
// onPress={() => {
// dataMember.length == 0
// ? Toast.show({ type: 'small', text1: "Anda belum memilih divisi", })
// : handleEdit();
// }}
// />
// ),
header: () => (
<AppHeader
title="Edit Pengumuman"
showBack={true}
onPressLeft={() => router.back()}
right={
<ButtonSaveHeader <ButtonSaveHeader
disable={disableBtn || loading ? true : false} disable={disableBtn || loading ? true : false}
category="update" category="update"
@@ -202,7 +218,9 @@ export default function EditAnnouncement() {
: handleEdit(); : handleEdit();
}} }}
/> />
), }
/>
)
}} }}
/> />
<LoadingOverlay visible={loading} /> <LoadingOverlay visible={loading} />

View File

@@ -1,4 +1,4 @@
import ButtonBackHeader from "@/components/buttonBackHeader"; import AppHeader from "@/components/AppHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import { InputForm } from "@/components/inputForm"; import { InputForm } from "@/components/inputForm";
import Text from "@/components/Text"; import Text from "@/components/Text";
@@ -115,19 +115,32 @@ export default function EditBanner() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => ( // headerLeft: () => (
<ButtonBackHeader // <ButtonBackHeader
onPress={() => { // onPress={() => {
router.back(); // router.back();
}} // }}
/> // />
), // ),
headerTitle: "Edit Banner", headerTitle: "Edit Banner",
headerTitleAlign: "center", headerTitleAlign: "center",
headerRight: () => <ButtonSaveHeader // headerRight: () => <ButtonSaveHeader
// disable={title == "" || error || loading ? true : false}
// onPress={() => { handleUpdateEntity() }}
// category="update" />,
header: () => (
<AppHeader
title="Edit Banner"
showBack={true}
onPressLeft={() => router.back()}
right={
<ButtonSaveHeader
disable={title == "" || error || loading ? true : false} disable={title == "" || error || loading ? true : false}
onPress={() => { handleUpdateEntity() }} onPress={() => { handleUpdateEntity() }}
category="update" />, category="update" />
}
/>
)
}} }}
/> />
<ScrollView showsVerticalScrollIndicator={false} style={[Styles.h100]}> <ScrollView showsVerticalScrollIndicator={false} style={[Styles.h100]}>

View File

@@ -1,4 +1,4 @@
import ButtonBackHeader from "@/components/buttonBackHeader"; import AppHeader from "@/components/AppHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import { InputForm } from "@/components/inputForm"; import { InputForm } from "@/components/inputForm";
import Text from "@/components/Text"; import Text from "@/components/Text";
@@ -97,16 +97,30 @@ export default function CreateBanner() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => ( // headerLeft: () => (
<ButtonBackHeader // <ButtonBackHeader
onPress={() => { // onPress={() => {
router.back(); // router.back();
}} // }}
/> // />
), // ),
headerTitle: "Tambah Banner", headerTitle: "Tambah Banner",
headerTitleAlign: "center", headerTitleAlign: "center",
headerRight: () => ( // headerRight: () => (
// <ButtonSaveHeader
// disable={title == "" || selectedImage == undefined || error || loading ? true : false}
// category="create"
// onPress={() => {
// handleCreateEntity();
// }}
// />
// ),
header: () => (
<AppHeader
title="Fitur"
showBack={true}
onPressLeft={() => router.back()}
right={
<ButtonSaveHeader <ButtonSaveHeader
disable={title == "" || selectedImage == undefined || error || loading ? true : false} disable={title == "" || selectedImage == undefined || error || loading ? true : false}
category="create" category="create"
@@ -114,7 +128,9 @@ export default function CreateBanner() {
handleCreateEntity(); handleCreateEntity();
}} }}
/> />
), }
/>
)
}} }}
/> />
<ScrollView showsVerticalScrollIndicator={false} style={[Styles.h100]}> <ScrollView showsVerticalScrollIndicator={false} style={[Styles.h100]}>

View File

@@ -1,7 +1,7 @@
import AlertKonfirmasi from "@/components/alertKonfirmasi" import AlertKonfirmasi from "@/components/alertKonfirmasi"
import AppHeader from "@/components/AppHeader"
import HeaderRightBannerList from "@/components/banner/headerBannerList" import HeaderRightBannerList from "@/components/banner/headerBannerList"
import BorderBottomItem from "@/components/borderBottomItem" import BorderBottomItem from "@/components/borderBottomItem"
import ButtonBackHeader from "@/components/buttonBackHeader"
import DrawerBottom from "@/components/drawerBottom" import DrawerBottom from "@/components/drawerBottom"
import MenuItemRow from "@/components/menuItemRow" import MenuItemRow from "@/components/menuItemRow"
import ModalLoading from "@/components/modalLoading" import ModalLoading from "@/components/modalLoading"
@@ -108,10 +108,20 @@ export default function BannerList() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, // headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
headerTitle: 'Banner', headerTitle: 'Banner',
headerTitleAlign: 'center', headerTitleAlign: 'center',
headerRight: () => <HeaderRightBannerList /> // headerRight: () => <HeaderRightBannerList />
header: () => (
<AppHeader
title="Banner"
showBack={true}
onPressLeft={() => router.back()}
right={
<HeaderRightBannerList />
}
/>
)
}} }}
/> />
<ModalLoading isVisible={loadingOpen} setVisible={setLoadingOpen} /> <ModalLoading isVisible={loadingOpen} setVisible={setLoadingOpen} />

View File

@@ -1,7 +1,7 @@
import AlertKonfirmasi from "@/components/alertKonfirmasi"; import AlertKonfirmasi from "@/components/alertKonfirmasi";
import AppHeader from "@/components/AppHeader";
import BorderBottomItem from "@/components/borderBottomItem"; import BorderBottomItem from "@/components/borderBottomItem";
import BorderBottomItem2 from "@/components/borderBottomItem2"; import BorderBottomItem2 from "@/components/borderBottomItem2";
import ButtonBackHeader from "@/components/buttonBackHeader";
import HeaderRightDiscussionGeneralDetail from "@/components/discussion_general/headerDiscussionDetail"; import HeaderRightDiscussionGeneralDetail from "@/components/discussion_general/headerDiscussionDetail";
import DrawerBottom from "@/components/drawerBottom"; import DrawerBottom from "@/components/drawerBottom";
import ImageUser from "@/components/imageNew"; import ImageUser from "@/components/imageNew";
@@ -22,7 +22,7 @@ import { Feather, Ionicons, MaterialCommunityIcons, MaterialIcons } from "@expo/
import { ref } from '@react-native-firebase/database'; import { ref } from '@react-native-firebase/database';
import { useHeaderHeight } from '@react-navigation/elements'; import { useHeaderHeight } from '@react-navigation/elements';
import { router, Stack, useLocalSearchParams } from "expo-router"; import { router, Stack, useLocalSearchParams } from "expo-router";
import { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { KeyboardAvoidingView, Platform, Pressable, RefreshControl, ScrollView, View } from "react-native"; import { KeyboardAvoidingView, Platform, Pressable, RefreshControl, ScrollView, View } from "react-native";
import Toast from "react-native-toast-message"; import Toast from "react-native-toast-message";
import { useSelector } from "react-redux"; import { useSelector } from "react-redux";
@@ -225,10 +225,18 @@ export default function DetailDiscussionGeneral() {
<> <>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, // headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
headerTitle: 'Diskusi', headerTitle: 'Diskusi',
headerTitleAlign: 'center', headerTitleAlign: 'center',
headerRight: () => <HeaderRightDiscussionGeneralDetail id={id} active={data?.isActive !== undefined ? data.isActive : false} status={data?.status !== undefined ? data.status : 0} />, // headerRight: () => <HeaderRightDiscussionGeneralDetail id={id} active={data?.isActive !== undefined ? data.isActive : false} status={data?.status !== undefined ? data.status : 0} />,
header: () => (
<AppHeader
title="Diskusi"
showBack={true}
onPressLeft={() => router.back()}
right={<HeaderRightDiscussionGeneralDetail id={id} active={data?.isActive !== undefined ? data.isActive : false} status={data?.status !== undefined ? data.status : 0} />}
/>
)
}} }}
/> />
<View style={{ flex: 1 }}> <View style={{ flex: 1 }}>

View File

@@ -1,4 +1,4 @@
import ButtonBackHeader from "@/components/buttonBackHeader"; import AppHeader from "@/components/AppHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import ImageUser from "@/components/imageNew"; import ImageUser from "@/components/imageNew";
import ImageWithLabel from "@/components/imageWithLabel"; import ImageWithLabel from "@/components/imageWithLabel";
@@ -95,10 +95,24 @@ export default function AddMemberDiscussionDetail() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, // headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
headerTitle: 'Tambah Anggota Diskusi', headerTitle: 'Tambah Anggota Diskusi',
headerTitleAlign: 'center', headerTitleAlign: 'center',
headerRight: () => ( // headerRight: () => (
// <ButtonSaveHeader
// category="update"
// disable={selectMember.length == 0 || loading ? true : false}
// onPress={() => {
// handleAddMember()
// }}
// />
// )
header: () => (
<AppHeader
title="Tambah Anggota Diskusi"
showBack={true}
onPressLeft={() => router.back()}
right={
<ButtonSaveHeader <ButtonSaveHeader
category="update" category="update"
disable={selectMember.length == 0 || loading ? true : false} disable={selectMember.length == 0 || loading ? true : false}
@@ -106,6 +120,8 @@ export default function AddMemberDiscussionDetail() {
handleAddMember() handleAddMember()
}} }}
/> />
}
/>
) )
}} }}
/> />

View File

@@ -1,5 +1,5 @@
import AppHeader from "@/components/AppHeader";
import BorderBottomItem from "@/components/borderBottomItem"; import BorderBottomItem from "@/components/borderBottomItem";
import ButtonBackHeader from "@/components/buttonBackHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import ButtonSelect from "@/components/buttonSelect"; import ButtonSelect from "@/components/buttonSelect";
import DrawerBottom from "@/components/drawerBottom"; import DrawerBottom from "@/components/drawerBottom";
@@ -166,14 +166,30 @@ export default function CreateDiscussionGeneral() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => ( // headerLeft: () => (
<ButtonBackHeader // <ButtonBackHeader
onPress={() => { handleBack() }} // onPress={() => { handleBack() }}
/> // />
), // ),
headerTitle: "Tambah Diskusi", headerTitle: "Tambah Diskusi",
headerTitleAlign: "center", headerTitleAlign: "center",
headerRight: () => ( // headerRight: () => (
// <ButtonSaveHeader
// category="create"
// disable={disableBtn || loading ? true : false}
// onPress={() => {
// entitiesMember.length == 0
// ? Toast.show({ type: 'small', text1: 'Anda belum memilih anggota', })
// : handleCreate()
// }}
// />
// ),
header: () => (
<AppHeader
title="Tambah Diskusi"
showBack={true}
onPressLeft={() => router.back()}
right={
<ButtonSaveHeader <ButtonSaveHeader
category="create" category="create"
disable={disableBtn || loading ? true : false} disable={disableBtn || loading ? true : false}
@@ -183,7 +199,9 @@ export default function CreateDiscussionGeneral() {
: handleCreate() : handleCreate()
}} }}
/> />
), }
/>
)
}} }}
/> />
<LoadingOverlay visible={loading} /> <LoadingOverlay visible={loading} />

View File

@@ -1,6 +1,6 @@
import AppHeader from "@/components/AppHeader";
import Text from "@/components/Text"; import Text from "@/components/Text";
import BorderBottomItem from "@/components/borderBottomItem"; import BorderBottomItem from "@/components/borderBottomItem";
import ButtonBackHeader from "@/components/buttonBackHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import ButtonSelect from "@/components/buttonSelect"; import ButtonSelect from "@/components/buttonSelect";
import DrawerBottom from "@/components/drawerBottom"; import DrawerBottom from "@/components/drawerBottom";
@@ -165,22 +165,36 @@ export default function EditDiscussionGeneral() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => ( // headerLeft: () => (
<ButtonBackHeader // <ButtonBackHeader
onPress={() => { // onPress={() => {
router.back(); // router.back();
}} // }}
/> // />
), // ),
headerTitle: "Edit Diskusi", headerTitle: "Edit Diskusi",
headerTitleAlign: "center", headerTitleAlign: "center",
headerRight: () => ( // headerRight: () => (
// <ButtonSaveHeader
// disable={disableBtn || loading ? true : false}
// category="update"
// onPress={() => { handleEdit() }}
// />
// ),
header: () => (
<AppHeader
title="Edit Diskusi"
showBack={true}
onPressLeft={() => router.back()}
right={
<ButtonSaveHeader <ButtonSaveHeader
disable={disableBtn || loading ? true : false} disable={disableBtn || loading ? true : false}
category="update" category="update"
onPress={() => { handleEdit() }} onPress={() => { handleEdit() }}
/> />
), }
/>
)
}} }}
/> />
<LoadingOverlay visible={loading} /> <LoadingOverlay visible={loading} />

View File

@@ -1,6 +1,6 @@
import AlertKonfirmasi from "@/components/alertKonfirmasi"; import AlertKonfirmasi from "@/components/alertKonfirmasi";
import AppHeader from "@/components/AppHeader";
import BorderBottomItem from "@/components/borderBottomItem"; import BorderBottomItem from "@/components/borderBottomItem";
import ButtonBackHeader from "@/components/buttonBackHeader";
import DrawerBottom from "@/components/drawerBottom"; import DrawerBottom from "@/components/drawerBottom";
import ImageUser from "@/components/imageNew"; import ImageUser from "@/components/imageNew";
import MenuItemRow from "@/components/menuItemRow"; import MenuItemRow from "@/components/menuItemRow";
@@ -74,9 +74,16 @@ export default function MemberDiscussionDetail() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, // headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
headerTitle: 'Anggota Diskusi', headerTitle: 'Anggota Diskusi',
headerTitleAlign: 'center', headerTitleAlign: 'center',
header: () => (
<AppHeader
title="Anggota Diskusi"
showBack={true}
onPressLeft={() => router.back()}
/>
)
}} }}
/> />
<ScrollView> <ScrollView>

View File

@@ -1,4 +1,4 @@
import ButtonBackHeader from "@/components/buttonBackHeader"; import AppHeader from "@/components/AppHeader";
import { ButtonFiturMenu } from "@/components/buttonFiturMenu"; import { ButtonFiturMenu } from "@/components/buttonFiturMenu";
import Styles from "@/constants/Styles"; import Styles from "@/constants/Styles";
import { AntDesign, Entypo, Ionicons, MaterialCommunityIcons, MaterialIcons } from "@expo/vector-icons"; import { AntDesign, Entypo, Ionicons, MaterialCommunityIcons, MaterialIcons } from "@expo/vector-icons";
@@ -13,9 +13,11 @@ export default function Feature() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
headerTitle: 'Fitur', headerTitle: 'Fitur',
headerTitleAlign: 'center' headerTitleAlign: 'center',
header: () => (
<AppHeader title="Fitur" showBack={true} onPressLeft={() => router.back()} />
)
}} }}
/> />
<View style={[Styles.p15]}> <View style={[Styles.p15]}>

View File

@@ -1,4 +1,4 @@
import ButtonBackHeader from "@/components/buttonBackHeader"; import AppHeader from "@/components/AppHeader";
import ImageUser from "@/components/imageNew"; import ImageUser from "@/components/imageNew";
import ItemDetailMember from "@/components/itemDetailMember"; import ItemDetailMember from "@/components/itemDetailMember";
import LabelStatus from "@/components/labelStatus"; import LabelStatus from "@/components/labelStatus";
@@ -11,7 +11,7 @@ import { valueRoleUser } from "@/constants/RoleUser";
import Styles from "@/constants/Styles"; import Styles from "@/constants/Styles";
import { apiGetProfile } from "@/lib/api"; import { apiGetProfile } from "@/lib/api";
import { router, Stack, useLocalSearchParams } from "expo-router"; import { router, Stack, useLocalSearchParams } from "expo-router";
import { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { Pressable, RefreshControl, SafeAreaView, ScrollView, View } from "react-native"; import { Pressable, RefreshControl, SafeAreaView, ScrollView, View } from "react-native";
import ImageViewing from 'react-native-image-viewing'; import ImageViewing from 'react-native-image-viewing';
import Toast from "react-native-toast-message"; import Toast from "react-native-toast-message";
@@ -77,11 +77,19 @@ export default function MemberDetail() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, // headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
headerTitle: 'Anggota', headerTitle: 'Anggota',
headerTitleAlign: 'center', headerTitleAlign: 'center',
headerRight: () => (entityUser.role != "user") && isEdit ? <HeaderRightMemberDetail active={data?.isActive} id={id} /> : <></>, // headerRight: () => (entityUser.role != "user") && isEdit ? <HeaderRightMemberDetail active={data?.isActive} id={id} /> : <></>,
headerShadowVisible: false header: () => (
<AppHeader title="Anggota"
showBack={true}
onPressLeft={() => router.back()}
right={
(entityUser.role != "user") && isEdit ? <HeaderRightMemberDetail active={data?.isActive} id={id} /> : <></>
}
/>
)
}} }}
/> />
<ScrollView <ScrollView

View File

@@ -1,4 +1,4 @@
import ButtonBackHeader from "@/components/buttonBackHeader"; import AppHeader from "@/components/AppHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import { InputForm } from "@/components/inputForm"; import { InputForm } from "@/components/inputForm";
import ModalSelect from "@/components/modalSelect"; import ModalSelect from "@/components/modalSelect";
@@ -209,22 +209,35 @@ export default function CreateMember() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => ( // headerLeft: () => (
<ButtonBackHeader // <ButtonBackHeader
onPress={() => { // onPress={() => {
router.back(); // router.back();
}} // }}
/> // />
), // ),
headerTitle: "Tambah Anggota", headerTitle: "Tambah Anggota",
headerTitleAlign: "center", headerTitleAlign: "center",
headerRight: () => ( // headerRight: () => (
// <ButtonSaveHeader
// disable={disableBtn || loading}
// category="create"
// onPress={() => { handleCreate() }}
// />
// ),
header: () => (
<AppHeader title="Anggota"
showBack={true}
onPressLeft={() => router.back()}
right={
<ButtonSaveHeader <ButtonSaveHeader
disable={disableBtn || loading} disable={disableBtn || loading}
category="create" category="create"
onPress={() => { handleCreate() }} onPress={() => { handleCreate() }}
/> />
), }
/>
)
}} }}
/> />
<KeyboardAvoidingView <KeyboardAvoidingView

View File

@@ -1,4 +1,4 @@
import ButtonBackHeader from "@/components/buttonBackHeader"; import AppHeader from "@/components/AppHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import { InputForm } from "@/components/inputForm"; import { InputForm } from "@/components/inputForm";
import ModalSelect from "@/components/modalSelect"; import ModalSelect from "@/components/modalSelect";
@@ -239,16 +239,30 @@ export default function EditMember() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => ( // headerLeft: () => (
<ButtonBackHeader // <ButtonBackHeader
onPress={() => { // onPress={() => {
router.back(); // router.back();
}} // }}
/> // />
), // ),
headerTitle: "Edit Anggota", headerTitle: "Edit Anggota",
headerTitleAlign: "center", headerTitleAlign: "center",
headerRight: () => ( // headerRight: () => (
// <ButtonSaveHeader
// disable={disableBtn || loading}
// category="update"
// onPress={() => {
// handleEdit()
// }}
// />
// ),
header: () => (
<AppHeader
title="Edit Anggota"
showBack={true}
onPressLeft={() => router.back()}
right={
<ButtonSaveHeader <ButtonSaveHeader
disable={disableBtn || loading} disable={disableBtn || loading}
category="update" category="update"
@@ -256,7 +270,9 @@ export default function EditMember() {
handleEdit() handleEdit()
}} }}
/> />
), }
/>
)
}} }}
/> />

View File

@@ -1,5 +1,5 @@
import AlertKonfirmasi from "@/components/alertKonfirmasi"; import AlertKonfirmasi from "@/components/alertKonfirmasi";
import ButtonBackHeader from "@/components/buttonBackHeader"; import AppHeader from "@/components/AppHeader";
import { ButtonHeader } from "@/components/buttonHeader"; import { ButtonHeader } from "@/components/buttonHeader";
import ItemDetailMember from "@/components/itemDetailMember"; import ItemDetailMember from "@/components/itemDetailMember";
import Text from "@/components/Text"; import Text from "@/components/Text";
@@ -25,11 +25,15 @@ export default function Profile() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
headerTitle: 'Profile', headerTitle: 'Profile',
headerTitleAlign: 'center', headerTitleAlign: 'center',
headerShadowVisible: false, header: () => (
headerRight: () => <ButtonHeader <AppHeader
title="Profile"
showBack={true}
onPressLeft={() => router.back()}
right={
<ButtonHeader
item={<AntDesign name="logout" size={20} color="white" />} item={<AntDesign name="logout" size={20} color="white" />}
onPress={() => { onPress={() => {
AlertKonfirmasi({ AlertKonfirmasi({
@@ -39,6 +43,19 @@ export default function Profile() {
}) })
}} }}
/> />
}
/>
)
// headerRight: () => <ButtonHeader
// item={<AntDesign name="logout" size={20} color="white" />}
// onPress={() => {
// AlertKonfirmasi({
// title: 'Keluar',
// desc: 'Apakah anda yakin ingin keluar?',
// onPress: () => { signOut() }
// })
// }}
// />
}} }}
/> />
<ScrollView style={[Styles.h100]}> <ScrollView style={[Styles.h100]}>

View File

@@ -1,5 +1,5 @@
import AppHeader from "@/components/AppHeader"
import BorderBottomItem from "@/components/borderBottomItem" import BorderBottomItem from "@/components/borderBottomItem"
import ButtonBackHeader from "@/components/buttonBackHeader"
import ButtonSaveHeader from "@/components/buttonSaveHeader" import ButtonSaveHeader from "@/components/buttonSaveHeader"
import ButtonSelect from "@/components/buttonSelect" import ButtonSelect from "@/components/buttonSelect"
import DrawerBottom from "@/components/drawerBottom" import DrawerBottom from "@/components/drawerBottom"
@@ -130,13 +130,27 @@ export default function ProjectAddFile() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, // headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
headerTitle: 'Tambah File', headerTitle: 'Tambah File',
headerTitleAlign: 'center', headerTitleAlign: 'center',
headerRight: () => <ButtonSaveHeader // headerRight: () => <ButtonSaveHeader
// disable={fileForm.length == 0 || loading ? true : false}
// category="create"
// onPress={() => { handleAddFile() }} />
header: () => (
<AppHeader
title="Tambah File"
showBack={true}
onPressLeft={() => router.back()}
right={
<ButtonSaveHeader
disable={fileForm.length == 0 || loading ? true : false} disable={fileForm.length == 0 || loading ? true : false}
category="create" category="create"
onPress={() => { handleAddFile() }} /> onPress={() => { handleAddFile() }}
/>
}
/>
)
}} }}
/> />
<ScrollView> <ScrollView>

View File

@@ -1,4 +1,4 @@
import ButtonBackHeader from "@/components/buttonBackHeader"; import AppHeader from "@/components/AppHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import ImageUser from "@/components/imageNew"; import ImageUser from "@/components/imageNew";
import ImageWithLabel from "@/components/imageWithLabel"; import ImageWithLabel from "@/components/imageWithLabel";
@@ -97,10 +97,24 @@ export default function AddMemberProject() {
<> <>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, // headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
headerTitle: 'Tambah Anggota Kegiatan', headerTitle: 'Tambah Anggota Kegiatan',
headerTitleAlign: 'center', headerTitleAlign: 'center',
headerRight: () => ( // headerRight: () => (
// <ButtonSaveHeader
// category="update"
// disable={selectMember.length == 0 || loading ? true : false}
// onPress={() => {
// handleAddMember()
// }}
// />
// )
header: () => (
<AppHeader
title="Tambah Anggota Kegiatan"
showBack={true}
onPressLeft={() => router.back()}
right={
<ButtonSaveHeader <ButtonSaveHeader
category="update" category="update"
disable={selectMember.length == 0 || loading ? true : false} disable={selectMember.length == 0 || loading ? true : false}
@@ -108,6 +122,8 @@ export default function AddMemberProject() {
handleAddMember() handleAddMember()
}} }}
/> />
}
/>
) )
}} }}
/> />

View File

@@ -1,4 +1,4 @@
import ButtonBackHeader from "@/components/buttonBackHeader"; import AppHeader from "@/components/AppHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import { InputForm } from "@/components/inputForm"; import { InputForm } from "@/components/inputForm";
import ModalAddDetailTugasProject from "@/components/project/modalAddDetailTugasProject"; import ModalAddDetailTugasProject from "@/components/project/modalAddDetailTugasProject";
@@ -136,22 +136,36 @@ export default function ProjectAddTask() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => ( // headerLeft: () => (
<ButtonBackHeader // <ButtonBackHeader
onPress={() => { // onPress={() => {
router.back(); // router.back();
}} // }}
/> // />
), // ),
headerTitle: "Tambah Tugas", headerTitle: "Tambah Tugas",
headerTitleAlign: "center", headerTitleAlign: "center",
headerRight: () => ( // headerRight: () => (
// <ButtonSaveHeader
// disable={disable || loading}
// category="create"
// onPress={() => { handleCreate() }}
// />
// ),
header: () => (
<AppHeader
title="Tambah Tugas"
showBack={true}
onPressLeft={() => router.back()}
right={
<ButtonSaveHeader <ButtonSaveHeader
disable={disable || loading} disable={disable || loading}
category="create" category="create"
onPress={() => { handleCreate() }} onPress={() => { handleCreate() }}
/> />
), }
/>
)
}} }}
/> />
<KeyboardAvoidingView <KeyboardAvoidingView

View File

@@ -1,4 +1,4 @@
import ButtonBackHeader from "@/components/buttonBackHeader"; import AppHeader from "@/components/AppHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import { InputForm } from "@/components/inputForm"; import { InputForm } from "@/components/inputForm";
import Styles from "@/constants/Styles"; import Styles from "@/constants/Styles";
@@ -6,7 +6,7 @@ import { apiCancelProject } from "@/lib/api";
import { setUpdateProject } from "@/lib/projectUpdate"; import { setUpdateProject } from "@/lib/projectUpdate";
import { useAuthSession } from "@/providers/AuthProvider"; import { useAuthSession } from "@/providers/AuthProvider";
import { router, Stack, useLocalSearchParams } from "expo-router"; import { router, Stack, useLocalSearchParams } from "expo-router";
import { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { SafeAreaView, ScrollView, View } from "react-native"; import { SafeAreaView, ScrollView, View } from "react-native";
import Toast from "react-native-toast-message"; import Toast from "react-native-toast-message";
import { useDispatch, useSelector } from "react-redux"; import { useDispatch, useSelector } from "react-redux";
@@ -68,16 +68,30 @@ export default function ProjectCancel() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => ( // headerLeft: () => (
<ButtonBackHeader // <ButtonBackHeader
onPress={() => { // onPress={() => {
router.back(); // router.back();
}} // }}
/> // />
), // ),
headerTitle: "Pembatalan Kegiatan", headerTitle: "Pembatalan Kegiatan",
headerTitleAlign: "center", headerTitleAlign: "center",
headerRight: () => ( // headerRight: () => (
// <ButtonSaveHeader
// disable={disable || loading}
// category="cancel"
// onPress={() => {
// handleCancel();
// }}
// />
// ),
header: () => (
<AppHeader
title="Pembatalan Kegiatan"
showBack={true}
onPressLeft={() => router.back()}
right={
<ButtonSaveHeader <ButtonSaveHeader
disable={disable || loading} disable={disable || loading}
category="cancel" category="cancel"
@@ -85,7 +99,9 @@ export default function ProjectCancel() {
handleCancel(); handleCancel();
}} }}
/> />
), }
/>
)
}} }}
/> />
<ScrollView <ScrollView

View File

@@ -1,4 +1,4 @@
import ButtonBackHeader from "@/components/buttonBackHeader"; import AppHeader from "@/components/AppHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import { InputForm } from "@/components/inputForm"; import { InputForm } from "@/components/inputForm";
import Styles from "@/constants/Styles"; import Styles from "@/constants/Styles";
@@ -43,7 +43,7 @@ export default function EditProject() {
setJudul(val) setJudul(val)
if (val == "" || val == "null") { if (val == "" || val == "null") {
setError(true) setError(true)
}else{ } else {
setError(false) setError(false)
} }
} }
@@ -89,22 +89,36 @@ export default function EditProject() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => ( // headerLeft: () => (
<ButtonBackHeader // <ButtonBackHeader
onPress={() => { // onPress={() => {
router.back(); // router.back();
}} // }}
/> // />
), // ),
headerTitle: "Edit Judul Kegiatan", headerTitle: "Edit Judul Kegiatan",
headerTitleAlign: "center", headerTitleAlign: "center",
headerRight: () => ( // headerRight: () => (
// <ButtonSaveHeader
// disable={disable || loading}
// category="update"
// onPress={() => { handleUpdate() }}
// />
// ),
header: () => (
<AppHeader
title="Edit Judul Kegiatan"
showBack={true}
onPressLeft={() => router.back()}
right={
<ButtonSaveHeader <ButtonSaveHeader
disable={disable || loading} disable={disable || loading}
category="update" category="update"
onPress={() => { handleUpdate() }} onPress={() => { handleUpdate() }}
/> />
), }
/>
)
}} }}
/> />
<ScrollView> <ScrollView>

View File

@@ -1,4 +1,4 @@
import ButtonBackHeader from "@/components/buttonBackHeader"; import AppHeader from "@/components/AppHeader";
import HeaderRightProjectDetail from "@/components/project/headerProjectDetail"; import HeaderRightProjectDetail from "@/components/project/headerProjectDetail";
import SectionFile from "@/components/project/sectionFile"; import SectionFile from "@/components/project/sectionFile";
import SectionLink from "@/components/project/sectionLink"; import SectionLink from "@/components/project/sectionLink";
@@ -11,7 +11,7 @@ import Styles from "@/constants/Styles";
import { apiGetProjectOne } from "@/lib/api"; import { apiGetProjectOne } from "@/lib/api";
import { useAuthSession } from "@/providers/AuthProvider"; import { useAuthSession } from "@/providers/AuthProvider";
import { router, Stack, useLocalSearchParams } from "expo-router"; import { router, Stack, useLocalSearchParams } from "expo-router";
import { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { RefreshControl, SafeAreaView, ScrollView, View } from "react-native"; import { RefreshControl, SafeAreaView, ScrollView, View } from "react-native";
import { useSelector } from "react-redux"; import { useSelector } from "react-redux";
@@ -94,10 +94,20 @@ export default function DetailProject() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, // headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
headerTitle: loading ? 'Loading... ' : data?.title, headerTitle: loading ? 'Loading... ' : data?.title,
headerTitleAlign: 'center', headerTitleAlign: 'center',
headerRight: () => (entityUser.role == "user" || entityUser.role == "coadmin") && !isMember ? null : <HeaderRightProjectDetail id={id} status={data?.status} />, // headerRight: () => (entityUser.role == "user" || entityUser.role == "coadmin") && !isMember ? null : <HeaderRightProjectDetail id={id} status={data?.status} />,
header: () => (
<AppHeader
title={loading ? 'Loading...' : data && data?.title || ''}
showBack={true}
onPressLeft={() => router.back()}
right={
(entityUser.role == "user" || entityUser.role == "coadmin") && !isMember ? null : <HeaderRightProjectDetail id={id} status={data?.status} />
}
/>
)
}} }}
/> />
<ScrollView <ScrollView

View File

@@ -1,4 +1,4 @@
import ButtonBackHeader from "@/components/buttonBackHeader"; import AppHeader from "@/components/AppHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import { InputForm } from "@/components/inputForm"; import { InputForm } from "@/components/inputForm";
import Styles from "@/constants/Styles"; import Styles from "@/constants/Styles";
@@ -89,22 +89,36 @@ export default function ReportProject() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => ( // headerLeft: () => (
<ButtonBackHeader // <ButtonBackHeader
onPress={() => { // onPress={() => {
router.back(); // router.back();
}} // }}
/> // />
), // ),
headerTitle: "Laporan Kegiatan", headerTitle: "Laporan Kegiatan",
headerTitleAlign: "center", headerTitleAlign: "center",
headerRight: () => ( // headerRight: () => (
// <ButtonSaveHeader
// disable={disable || loading}
// category="update"
// onPress={() => { handleUpdate() }}
// />
// ),
header: () => (
<AppHeader
title="Laporan Kegiatan"
showBack={true}
onPressLeft={() => router.back()}
right={
<ButtonSaveHeader <ButtonSaveHeader
disable={disable || loading} disable={disable || loading}
category="update" category="update"
onPress={() => { handleUpdate() }} onPress={() => { handleUpdate() }}
/> />
), }
/>
)
}} }}
/> />
<ScrollView <ScrollView

View File

@@ -1,5 +1,5 @@
import AppHeader from "@/components/AppHeader";
import BorderBottomItem from "@/components/borderBottomItem"; import BorderBottomItem from "@/components/borderBottomItem";
import ButtonBackHeader from "@/components/buttonBackHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import ButtonSelect from "@/components/buttonSelect"; import ButtonSelect from "@/components/buttonSelect";
import DrawerBottom from "@/components/drawerBottom"; import DrawerBottom from "@/components/drawerBottom";
@@ -193,16 +193,29 @@ export default function CreateProject() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => ( // headerLeft: () => (
<ButtonBackHeader // <ButtonBackHeader
onPress={() => { // onPress={() => {
handleBack(); // handleBack();
}} // }}
/> // />
), // ),
headerTitle: "Tambah Kegiatan", headerTitle: "Tambah Kegiatan",
headerTitleAlign: "center", headerTitleAlign: "center",
headerRight: () => ( // headerRight: () => (
// <ButtonSaveHeader
// disable={disableBtn || loading}
// category="create"
// onPress={() => {
// handleCreate()
// }}
// />
// ),
header: () => (
<AppHeader title="Tambah Kegiatan"
showBack={true}
onPressLeft={() => router.back()}
right={
<ButtonSaveHeader <ButtonSaveHeader
disable={disableBtn || loading} disable={disableBtn || loading}
category="create" category="create"
@@ -210,7 +223,9 @@ export default function CreateProject() {
handleCreate() handleCreate()
}} }}
/> />
), }
/>
)
}} }}
/> />
<ScrollView <ScrollView

View File

@@ -1,4 +1,4 @@
import ButtonBackHeader from "@/components/buttonBackHeader"; import AppHeader from "@/components/AppHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import ImageUser from "@/components/imageNew"; import ImageUser from "@/components/imageNew";
import ImageWithLabel from "@/components/imageWithLabel"; import ImageWithLabel from "@/components/imageWithLabel";
@@ -11,8 +11,8 @@ import { setMemberChoose } from "@/lib/memberChoose";
import { useAuthSession } from "@/providers/AuthProvider"; import { useAuthSession } from "@/providers/AuthProvider";
import { AntDesign } from "@expo/vector-icons"; import { AntDesign } from "@expo/vector-icons";
import { router, Stack } from "expo-router"; import { router, Stack } from "expo-router";
import { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { Pressable, SafeAreaView, ScrollView, View } from "react-native"; import { Pressable, ScrollView, View } from "react-native";
import Toast from "react-native-toast-message"; import Toast from "react-native-toast-message";
import { useDispatch, useSelector } from "react-redux"; import { useDispatch, useSelector } from "react-redux";
@@ -74,10 +74,23 @@ export default function AddMemberCreateProject() {
<> <>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, // headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
headerTitle: 'Pilih Anggota', headerTitle: 'Pilih Anggota',
headerTitleAlign: 'center', headerTitleAlign: 'center',
headerRight: () => ( // headerRight: () => (
// <ButtonSaveHeader
// category="create"
// disable={selectMember.length > 0 ? false : true}
// onPress={() => {
// handleAddMember()
// }}
// />
// )
header: () => (
<AppHeader title="Pilih Anggota"
showBack={true}
onPressLeft={() => router.back()}
right={
<ButtonSaveHeader <ButtonSaveHeader
category="create" category="create"
disable={selectMember.length > 0 ? false : true} disable={selectMember.length > 0 ? false : true}
@@ -85,6 +98,8 @@ export default function AddMemberCreateProject() {
handleAddMember() handleAddMember()
}} }}
/> />
}
/>
) )
}} }}
/> />

View File

@@ -1,4 +1,4 @@
import ButtonBackHeader from "@/components/buttonBackHeader"; import AppHeader from "@/components/AppHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import { InputForm } from "@/components/inputForm"; import { InputForm } from "@/components/inputForm";
import ModalAddDetailTugasProject from "@/components/project/modalAddDetailTugasProject"; import ModalAddDetailTugasProject from "@/components/project/modalAddDetailTugasProject";
@@ -12,7 +12,7 @@ import { router, Stack } from "expo-router";
import 'intl'; import 'intl';
import 'intl/locale-data/jsonp/id'; import 'intl/locale-data/jsonp/id';
import moment from "moment"; import moment from "moment";
import { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { import {
KeyboardAvoidingView, KeyboardAvoidingView,
Platform, Platform,
@@ -122,22 +122,36 @@ export default function CreateProjectAddTask() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => ( // headerLeft: () => (
<ButtonBackHeader // <ButtonBackHeader
onPress={() => { // onPress={() => {
router.back(); // router.back();
}} // }}
/> // />
), // ),
headerTitle: "Tambah Tugas", headerTitle: "Tambah Tugas",
headerTitleAlign: "center", headerTitleAlign: "center",
headerRight: () => ( // headerRight: () => (
// <ButtonSaveHeader
// disable={disable}
// category="create"
// onPress={() => { handleCreate() }}
// />
// ),
header: () => (
<AppHeader
title="Tambah Tugas"
showBack={true}
onPressLeft={() => router.back()}
right={
<ButtonSaveHeader <ButtonSaveHeader
disable={disable} disable={disable}
category="create" category="create"
onPress={() => { handleCreate() }} onPress={() => { handleCreate() }}
/> />
), }
/>
)
}} }}
/> />
<KeyboardAvoidingView <KeyboardAvoidingView

View File

@@ -1,4 +1,4 @@
import ButtonBackHeader from "@/components/buttonBackHeader"; import AppHeader from "@/components/AppHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import { InputForm } from "@/components/inputForm"; import { InputForm } from "@/components/inputForm";
import ModalAddDetailTugasProject from "@/components/project/modalAddDetailTugasProject"; import ModalAddDetailTugasProject from "@/components/project/modalAddDetailTugasProject";
@@ -14,7 +14,7 @@ import { router, Stack, useLocalSearchParams } from "expo-router";
import 'intl'; import 'intl';
import 'intl/locale-data/jsonp/id'; import 'intl/locale-data/jsonp/id';
import moment from "moment"; import moment from "moment";
import { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { KeyboardAvoidingView, Platform, Pressable, SafeAreaView, ScrollView, View } from "react-native"; import { KeyboardAvoidingView, Platform, Pressable, SafeAreaView, ScrollView, View } from "react-native";
import Toast from "react-native-toast-message"; import Toast from "react-native-toast-message";
import DateTimePicker, { DateType } from "react-native-ui-datepicker"; import DateTimePicker, { DateType } from "react-native-ui-datepicker";
@@ -172,14 +172,28 @@ export default function UpdateProjectTask() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, // headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
headerTitle: 'Edit Tanggal dan Tugas', headerTitle: 'Edit Tanggal dan Tugas',
headerTitleAlign: 'center', headerTitleAlign: 'center',
headerRight: () => <ButtonSaveHeader // headerRight: () => <ButtonSaveHeader
// disable={disableBtn || loadingSubmit}
// category="update"
// onPress={() => { handleEdit() }}
// />
header: () => (
<AppHeader
title="Edit Tanggal dan Tugas"
showBack={true}
onPressLeft={() => router.back()}
right={
<ButtonSaveHeader
disable={disableBtn || loadingSubmit} disable={disableBtn || loadingSubmit}
category="update" category="update"
onPress={() => { handleEdit() }} onPress={() => { handleEdit() }}
/> />
}
/>
)
}} }}
/> />
<KeyboardAvoidingView <KeyboardAvoidingView

View File

@@ -1,5 +1,5 @@
import AppHeader from "@/components/AppHeader";
import BorderBottomItem from "@/components/borderBottomItem"; import BorderBottomItem from "@/components/borderBottomItem";
import ButtonBackHeader from "@/components/buttonBackHeader";
import ImageUser from "@/components/imageNew"; import ImageUser from "@/components/imageNew";
import InputSearch from "@/components/inputSearch"; import InputSearch from "@/components/inputSearch";
import Text from '@/components/Text'; import Text from '@/components/Text';
@@ -82,9 +82,11 @@ export default function Search() {
<SafeAreaView> <SafeAreaView>
<Stack.Screen <Stack.Screen
options={{ options={{
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
headerTitle: 'Pencarian', headerTitle: 'Pencarian',
headerTitleAlign: 'center' headerTitleAlign: 'center',
header: () => (
<AppHeader title="Pencarian" showBack={true} onPressLeft={() => router.back()} />
)
}} }}
/> />
<View style={[Styles.p15]}> <View style={[Styles.p15]}>

33
components/AppHeader.tsx Normal file
View File

@@ -0,0 +1,33 @@
import { useRouter } from 'expo-router';
import { StyleSheet, Text, View } from 'react-native';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import ButtonBackHeader from './buttonBackHeader';
import Styles from '@/constants/Styles';
type Props = {
title: string;
right?: React.ReactNode;
showBack?: boolean;
onPressLeft?: () => void
};
export default function AppHeader({ title, right, showBack = true, onPressLeft }: Props) {
const insets = useSafeAreaInsets();
const router = useRouter();
return (
<View style={[Styles.headerContainer, { paddingTop: insets.top }]}>
<View style={Styles.headerApp}>
{showBack ? (
<ButtonBackHeader onPress={onPressLeft} />
) : (
<View style={Styles.headerSide} />
)}
<Text style={Styles.headerTitle}>{title}</Text>
<View style={Styles.headerSide}>{right}</View>
</View>
</View>
);
}

View File

@@ -631,7 +631,27 @@ const Styles = StyleSheet.create({
position: 'absolute', position: 'absolute',
opacity: 0, opacity: 0,
zIndex: -1, zIndex: -1,
} },
headerContainer: {
backgroundColor: '#19345E',
},
headerApp: {
// height: 40,
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 16,
paddingVertical: 3
},
headerTitle: {
color: '#fff',
fontSize: 16,
fontWeight: '600',
},
headerSide: {
width: 40,
alignItems: 'center',
},
}) })
export default Styles; export default Styles;