import { View, TouchableOpacity, Text } from 'react-native'; import { useState, useEffect, useContext } from 'react'; import { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context'; import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'; import { createDrawerNavigator } from '@react-navigation/drawer'; import { createStackNavigator } from '@react-navigation/stack'; import { NavigationContainer } from '@react-navigation/native'; import Ionicons from '@expo/vector-icons/AntDesign'; import { useSession } from './useSession.hook'; import { styles } from './Session.styled'; import Colors from 'constants/Colors'; import { ProfileTitle, Profile } from './profile/Profile'; import { CardsTitle, CardsBody, Cards } from './cards/Cards'; import { useCards } from './cards/useCards.hook'; import { RegistryTitle, RegistryBody, Registry } from './registry/Registry'; import { useRegistry } from './registry/useRegistry.hook'; import { Contact, ContactTitle } from './contact/Contact'; import { Details, DetailsHeader, DetailsBody } from './details/Details'; import { Conversation, ConversationHeader, ConversationBody } from './conversation/Conversation'; import { Welcome } from './welcome/Welcome'; import { ChannelsTitle, ChannelsBody, Channels } from './channels/Channels'; import { useChannels } from './channels/useChannels.hook'; import { CommonActions } from '@react-navigation/native'; import { ConversationContext } from 'context/ConversationContext'; const ConversationStack = createStackNavigator(); const ProfileStack = createStackNavigator(); const ContactStack = createStackNavigator(); const ProfileDrawer = createDrawerNavigator(); const ContactDrawer = createDrawerNavigator(); const DetailDrawer = createDrawerNavigator(); const CardDrawer = createDrawerNavigator(); const RegistryDrawer = createDrawerNavigator(); const Tab = createBottomTabNavigator(); export function Session() { const { state, actions } = useSession(); // tabbed containers const ConversationStackScreen = () => { const [selected, setSelected] = useState(null); const setConversation = (navigation, cardId, channelId, revision) => { setSelected({ cardId, channelId, revision }); navigation.navigate('conversation'); } const clearConversation = (navigation) => { navigation.dispatch( CommonActions.reset({ index: 0, routes: [ { name: 'channels' }, ], }) ); } const setDetail = (navigation) => { navigation.navigate('details'); } const clearDetail = (navigation) => { navigation.goBack(); } const channels = useChannels(); const conversation = useContext(ConversationContext); useEffect(() => { conversation.actions.setChannel(selected); }, [selected]); return ( ({ headerShown: true, headerTintColor: Colors.primary })} screenListeners={{ state: (e) => { if (e?.data?.state?.index === 0 && selected) { setSelected(null); }}, }}> }}> {(props) => setConversation(props.navigation, cardId, channelId, revision)} />} }}> {(props) => } }}> {(props) => clearConversation(props.navigation)} />} ); } const ProfileStackScreen = () => { return ( ({ headerShown: true, headerTintColor: Colors.primary })}> }} /> ); } const ContactStackScreen = () => { const [selected, setSelected] = useState(null); const setCardStack = (navigation, contact) => { setSelected(contact); navigation.navigate('contact') } const clearCardStack = (navigation) => { navigation.goBack(); } const setRegistryStack = (navigation) => { navigation.navigate('registry'); } const clearRegistryStack = (navigation) => { navigation.goBack(); } const registry = useRegistry(); const cards = useCards(); return ( ({ headerShow: true, headerTintColor: Colors.primary })} initialRouteName="cards"> }}> {(props) => setCardStack(props.navigation, contact)} />} }}> {(props) => clearCardStack(props.navigation)} />} }}> {(props) => setCardStack(props.navigation, contact)} />} ); } const HomeScreen = ({ cardNav, registryNav, detailNav, contactNav, profileNav, setDetails, resetConversation, clearReset }) => { const [channel, setChannel] = useState(null); const setConversation = (cardId, channelId, revision) => { setChannel({ cardId, channelId, revision }); }; const clearConversation = () => { setChannel(null); }; const setProfile = () => { profileNav.openDrawer(); }; const setChannelDetails = (channel) => { setDetails(channel); detailNav.openDrawer(); }; const openProfile = () => { profileNav.openDrawer(); } const openCards = () => { cardNav.openDrawer(); } const conversation = useContext(ConversationContext); useEffect(() => { if (resetConversation) { detailNav.closeDrawer(); setChannel(null); setDetails(null); clearReset(); } }, [resetConversation]); useEffect(() => { conversation.actions.setChannel(channel); }, [channel]); return ( Profile Contacts { channel && ( )} { !channel && ( )} ) } const CardDrawerScreen = ({ registryNav, detailNav, contactNav, profileNav, setContact, setDetails, clearReset, resetConversation }) => { const openRegistry = () => { registryNav.openDrawer(); }; setCardContact = (contact) => { setContact(contact); contactNav.openDrawer(); }; const params = { profileNav, registryNav, detailNav, contactNav, setDetails, setContact, clearReset, resetConversation, }; return ( }> {(props) => } ); }; const RegistryDrawerScreen = ({ detailNav, contactNav, profileNav, setContact, setDetails, clearReset, resetConversation }) => { const setRegistryContact = (contact) => { setContact(contact); contactNav.openDrawer(); }; const params = { profileNav, detailNav, contactNav, setDetails, setContact, clearReset, resetConversation, }; return ( }> {(props) => } ); }; const ContactDrawerScreen = ({ detailNav, profileNav, setDetails, resetConversation, clearReset }) => { const [selected, setSelected] = useState(null); const setContact = (contact) => { setSelected(contact); } const params = { profileNav, detailNav, setDetails, setContact, clearReset, resetConversation, }; return ( }> {(props) => } ); } const DetailDrawerScreen = ({ profileNav }) => { const [selected, setSelected] = useState(null); const [resetConversation, setResetConversation] = useState(false); const setDetails = (channel) => { setSelected(channel); }; const clearConversation = () => { setResetConversation(true); } const clearReset = () => { setResetConversation(false); } const params = { profileNav, setDetails, clearReset, resetConversation, }; return (
} > {(props) => } ); } return ( { state.tabbed === false && ( }> {(props) => } )} { state.tabbed === true && ( ({ tabBarStyle: styles.tabBar, headerShown: false, tabBarIcon: ({ focused, color, size }) => { if (route.name === 'Profile') { return ; } if (route.name === 'Conversation') { return ; } if (route.name === 'Contacts') { return ; } }, tabBarShowLabel: false, tabBarActiveTintColor: Colors.white, tabBarInactiveTintColor: Colors.disabled, })}> )} ); }