import React from 'react' import {StyleSheet, TouchableOpacity, View} from 'react-native' import Animated from 'react-native-reanimated' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useNavigation} from '@react-navigation/native' import {useSetDrawerOpen} from '#/state/shell' import {useAnalytics} from 'lib/analytics/analytics' import {useMinimalShellMode} from 'lib/hooks/useMinimalShellMode' import {usePalette} from 'lib/hooks/usePalette' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' import {NavigationProp} from 'lib/routes/types' import {useTheme} from '#/alf' import {Text} from './text/Text' import {CenteredView} from './Views' import hairlineWidth = StyleSheet.hairlineWidth const BACK_HITSLOP = {left: 20, top: 20, right: 50, bottom: 20} export function ViewHeader({ title, subtitle, canGoBack, showBackButton = true, hideOnScroll, showOnDesktop, showBorder, renderButton, }: { title: string subtitle?: string canGoBack?: boolean showBackButton?: boolean hideOnScroll?: boolean showOnDesktop?: boolean showBorder?: boolean renderButton?: () => JSX.Element }) { const pal = usePalette('default') const {_} = useLingui() const setDrawerOpen = useSetDrawerOpen() const navigation = useNavigation() const {track} = useAnalytics() const {isDesktop, isTablet} = useWebMediaQueries() const t = useTheme() const onPressBack = React.useCallback(() => { if (navigation.canGoBack()) { navigation.goBack() } else { navigation.navigate('Home') } }, [navigation]) const onPressMenu = React.useCallback(() => { track('ViewHeader:MenuButtonClicked') setDrawerOpen(true) }, [track, setDrawerOpen]) if (isDesktop) { if (showOnDesktop) { return ( ) } return null } else { if (typeof canGoBack === 'undefined') { canGoBack = navigation.canGoBack() } return ( {showBackButton ? ( {canGoBack ? ( ) : !isTablet ? ( ) : null} ) : null} {title} {renderButton ? ( renderButton() ) : showBackButton ? ( ) : null} {subtitle ? ( {subtitle} ) : undefined} ) } } function DesktopWebHeader({ title, subtitle, renderButton, showBorder = true, }: { title: string subtitle?: string renderButton?: () => JSX.Element showBorder?: boolean }) { const pal = usePalette('default') const t = useTheme() return ( {title} {renderButton?.()} {subtitle ? ( {subtitle} ) : null} ) } function Container({ children, hideOnScroll, showBorder, }: { children: React.ReactNode hideOnScroll: boolean showBorder?: boolean }) { const pal = usePalette('default') const {headerMinimalShellTransform} = useMinimalShellMode() if (!hideOnScroll) { return ( {children} ) } return ( {children} ) } const styles = StyleSheet.create({ header: { flexDirection: 'row', paddingHorizontal: 12, paddingVertical: 6, width: '100%', }, headerFloating: { position: 'absolute', top: 0, width: '100%', }, desktopHeader: { paddingVertical: 12, maxWidth: 600, marginLeft: 'auto', marginRight: 'auto', }, border: { borderBottomWidth: hairlineWidth, }, titleContainer: { marginLeft: 'auto', marginRight: 'auto', alignItems: 'center', }, title: { fontWeight: 'bold', }, subtitle: { fontSize: 13, }, subtitleDesktop: { fontSize: 15, }, backBtn: { width: 30, height: 30, }, backBtnWide: { width: 30, height: 30, paddingHorizontal: 6, }, backIcon: { marginTop: 6, }, })