This commit is contained in:
oneao committed 2025-11-18 22:35:18 +08:00
1 parent 1445ed3b6c
commit 7419021927
19 files changed
+474 -327

No files matched your search

@@ -1,17 +1,92 @@
import { Stack } from 'expo-router'
import { SafeAreaView } from 'react-native-safe-area-context'
import type { ViewStyle } from 'react-native'
import { Stack, useRouter } from 'expo-router'
import React from 'react'
import { Image, Text, TouchableOpacity, View } from 'react-native'
import { useSafeAreaInsets } from 'react-native-safe-area-context'
import { LucideIcon } from '../common/ao'
export type StackScreenProps = React.ComponentProps<typeof Stack.Screen>
interface CustomHeaderProps {
showHeader?: boolean
title?: string | React.ReactNode
left?: React.ReactNode
right?: React.ReactNode
safeArea?: boolean
screenProps?: StackScreenProps
className?: string
style?: ViewStyle
}
export default function CustomHeader({
showHeader = true,
title,
left,
right,
safeArea = true,
className = '',
style,
screenProps,
}: CustomHeaderProps) {
const safeAreaInsets = useSafeAreaInsets()
const router = useRouter()
if (!showHeader) {
return (
<Stack.Screen
{...screenProps}
options={{
...screenProps?.options,
headerShown: false,
}}
/>
)
}
export default function CustomHeader() {
return (
<>
<Stack.Screen options={{
headerShown: false,
}}
<Stack.Screen
{...screenProps}
options={{
...screenProps?.options,
headerShown: false,
}}
/>
<SafeAreaView className='flex-1'>
</SafeAreaView>
<View
className={`flex-row items-center h-24 px-2 ${className}`}
style={[
{ paddingTop: safeArea ? safeAreaInsets.top : 0 },
style,
]}
>
<View className="w-10 h-full justify-center">
{left || (
<TouchableOpacity onPress={() => router.back()}>
<LucideIcon icon="ArrowLeft" size={24} clickable={false} />
</TouchableOpacity>
)}
</View>
<View className="flex-1 items-center justify-center">
{typeof title === 'string'
? (
<Text className="text-xl">{title}</Text>
)
: (
title
)}
</View>
<View className="w-10 h-full items-center justify-center">
{right || (
<Image
source={require('@/static/images/logo.png')}
style={{ width: 22, height: 22 }}
/>
)}
</View>
</View>
</>
)
}