Layouts & Navigation - app/(application)/_layout.tsx - app/(application)/(user)/_layout.tsx - app/(application)/(user)/event/(tabs)/_layout.tsx - app/(application)/(user)/job/(tabs)/_layout.tsx - app/(application)/(user)/voting/(tabs)/_layout.tsx - app/(application)/(user)/portofolio/_layout.tsx - app/(application)/(user)/profile/_layout.tsx - app/(application)/admin/_layout.tsx - app/+not-found.tsx User – File - app/(application)/(file)/[id].tsx User – Collaboration - app/(application)/(user)/collaboration/[id]/index.tsx - app/(application)/(user)/collaboration/[id]/detail-project-main.tsx - app/(application)/(user)/collaboration/[id]/detail-participant.tsx - app/(application)/(user)/collaboration/[id]/[detail]/info.tsx - app/(application)/(user)/collaboration/[id]/[detail]/room-chat.tsx User – Donation - app/(application)/(user)/donation/[id]/index.tsx - app/(application)/(user)/donation/[id]/[status]/detail.tsx - app/(application)/(user)/donation/[id]/(news)/[news]/index.tsx User – Event - app/(application)/(user)/event/[id]/[status]/detail-event.tsx - app/(application)/(user)/event/[id]/confirmation.tsx - app/(application)/(user)/event/[id]/contribution.tsx - app/(application)/(user)/event/[id]/history.tsx - app/(application)/(user)/event/[id]/publish.tsx User – Investment - app/(application)/(user)/investment/[id]/index.tsx - app/(application)/(user)/investment/[id]/[status]/detail.tsx - app/(application)/(user)/investment/[id]/(my-holding)/[id].tsx - app/(application)/(user)/investment/[id]/(news)/[news]/index.tsx User – Job - app/(application)/(user)/job/[id]/[status]/detail.tsx User – Portofolio - app/(application)/(user)/portofolio/[id]/index.tsx User – Profile - app/(application)/(user)/profile/[id]/index.tsx User – Voting - app/(application)/(user)/voting/[id]/index.tsx - app/(application)/(user)/voting/[id]/[status]/detail.tsx - app/(application)/(user)/voting/[id]/contribution.tsx - app/(application)/(user)/voting/[id]/history.tsx Components - components/Button/BackButtonFromNotification.tsx - components/_ShareComponent/AppHeader.tsx Admin Screens - screens/Admin/Notification-Admin/ScreenNotificationAdmin.tsx - screens/Admin/Notification-Admin/ScreenNotificationAdmin2.tsx Screens – Donation - screens/Donation/ScreenListOfNews.tsx - screens/Donation/ScreenRecapOfNews.tsx Screens – Forum - screens/Forum/ViewBeranda.tsx - screens/Forum/ViewBeranda2.tsx - screens/Forum/ViewBeranda3.tsx Screens – Investment - screens/Invesment/Document/ScreenRecapOfDocument.tsx - screens/Invesment/News/ScreenListOfNews.tsx - screens/Invesment/News/ScreenRecapOfNews.tsx Screens – Notification - screens/Notification/ScreenNotification_V1.tsx - screens/Notification/ScreenNotification_V2.tsx iOS - ios/HIPMIBadungConnect.xcodeproj/project.pbxproj Docs - QWEN.md ### Issue: Tabs can't clicked
115 lines
2.6 KiB
TypeScript
115 lines
2.6 KiB
TypeScript
import { MainColor } from "@/constants/color-palet";
|
|
import { Platform, StyleSheet, Text, View } from "react-native";
|
|
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
import { BackButton } from "..";
|
|
|
|
type Props = {
|
|
title: string;
|
|
right?: React.ReactNode;
|
|
showBack?: boolean;
|
|
onPressLeft?: () => void;
|
|
left?: React.ReactNode;
|
|
};
|
|
|
|
export default function AppHeader({
|
|
title,
|
|
right,
|
|
showBack = true,
|
|
onPressLeft,
|
|
left,
|
|
}: Props) {
|
|
const insets = useSafeAreaInsets();
|
|
|
|
// iOS 16+ detection (Dynamic Island) - insets.top > 47 indicates Dynamic Island
|
|
const isIOS26Plus =
|
|
Platform.OS === "ios" && insets.top > 47;
|
|
|
|
// Dynamic padding berdasarkan platform dan iOS version
|
|
const paddingTop =
|
|
Platform.OS === "ios"
|
|
? isIOS26Plus
|
|
? insets.top - 10
|
|
: insets.top
|
|
: 10;
|
|
|
|
const paddingBottom = Platform.OS === "ios" ? 8 : 13;
|
|
|
|
return (
|
|
<View
|
|
style={[
|
|
{
|
|
backgroundColor: MainColor.darkblue,
|
|
paddingTop,
|
|
paddingBottom,
|
|
},
|
|
]}
|
|
pointerEvents="box-none"
|
|
>
|
|
{/* Header Container dengan absolute positioning untuk title center */}
|
|
<View style={styles.headerApp} pointerEvents="box-none">
|
|
{/* Left Section - Absolute Left */}
|
|
<View style={styles.headerLeft}>
|
|
{showBack ? (
|
|
<BackButton onPress={onPressLeft} />
|
|
) : left ? (
|
|
left
|
|
) : (
|
|
<View style={styles.placeholder} />
|
|
)}
|
|
</View>
|
|
|
|
{/* Title - Absolute Center */}
|
|
<View style={styles.headerCenter}>
|
|
<Text
|
|
style={styles.headerTitle}
|
|
numberOfLines={1}
|
|
ellipsizeMode="tail"
|
|
>
|
|
{title ? title.charAt(0).toUpperCase() + title.slice(1) : ""}
|
|
</Text>
|
|
</View>
|
|
|
|
{/* Right Section - Absolute Right */}
|
|
<View style={styles.headerRight}>
|
|
{right}
|
|
</View>
|
|
</View>
|
|
</View>
|
|
);
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
headerApp: {
|
|
flexDirection: "row",
|
|
alignItems: "center",
|
|
justifyContent: "space-between",
|
|
paddingHorizontal: 16,
|
|
height: 44, // Fixed height untuk consistency
|
|
},
|
|
headerLeft: {
|
|
position: "absolute",
|
|
left: 16,
|
|
zIndex: 1,
|
|
},
|
|
headerCenter: {
|
|
flex: 1,
|
|
alignItems: "center",
|
|
justifyContent: "center",
|
|
},
|
|
headerRight: {
|
|
position: "absolute",
|
|
right: 16,
|
|
zIndex: 1,
|
|
},
|
|
placeholder: {
|
|
width: 40,
|
|
height: 40,
|
|
},
|
|
headerTitle: {
|
|
color: MainColor.yellow,
|
|
fontSize: 18,
|
|
fontWeight: "600",
|
|
textAlign: "center",
|
|
},
|
|
});
|