aboutsummaryrefslogtreecommitdiff
path: root/src/routes/tabs/NavigationBar.tsx
blob: c3f0b9f8ed2930f78d74a75795268b0062acdb79 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import {createBottomTabNavigator} from '@react-navigation/bottom-tabs';
import React, {Fragment, useEffect, useState} from 'react';
import {useSelector} from 'react-redux';
import {NavigationIcon} from '../../components';
import {NO_NOTIFICATIONS} from '../../store/initialStates';
import {RootState} from '../../store/rootReducer';
import {setNotificationsReadDate} from '../../services';
import {ScreenType} from '../../types';
import {haveUnreadNotifications} from '../../utils';
import MainStackScreen from '../main/MainStackScreen';
import {NotificationPill} from '../../components/notifications';

const Tabs = createBottomTabNavigator();

const NavigationBar: React.FC = () => {
  const {isOnboardedUser, newNotificationReceived} = useSelector(
    (state: RootState) => state.user,
  );

  const {notifications: {notifications} = NO_NOTIFICATIONS} = useSelector(
    (state: RootState) => state,
  );
  // Triggered if user clicks on Notifications page to close the pill
  const [showIcon, setShowIcon] = useState<boolean>(true);

  const [unreadNotificationsPresent, setUnreadNotificationsPresent] =
    useState<boolean>(false);

  // Prior to pill inclusion, determines if notification bell
  // should have purple dot
  useEffect(() => {
    const determine = async () => {
      setUnreadNotificationsPresent(
        await haveUnreadNotifications(notifications),
      );
    };
    determine();
  }, [notifications]);

  return (
    <>
      <NotificationPill showIcon={showIcon} />
      <Tabs.Navigator
        screenOptions={({route}) => ({
          tabBarIcon: ({focused}) => {
            switch (route.name) {
              case 'Home':
                return <NavigationIcon tab="Home" disabled={!focused} />;
              case 'Chat':
                return <NavigationIcon tab="Chat" disabled={!focused} />;
              case 'Upload':
                return (
                  <NavigationIcon
                    tab="Upload"
                    disabled={!focused}
                    isBigger={true}
                  />
                );
              case 'Notifications':
                return (
                  <NavigationIcon
                    newIcon={
                      newNotificationReceived || unreadNotificationsPresent
                    }
                    tab="Notifications"
                    disabled={!focused}
                  />
                );
              case 'ProfileTab':
                return <NavigationIcon tab="Profile" disabled={!focused} />;
              case 'SuggestedPeople':
                return (
                  <NavigationIcon tab="SuggestedPeople" disabled={!focused} />
                );
              default:
                return <Fragment />;
            }
          },
        })}
        initialRouteName={isOnboardedUser ? 'Profile' : 'SuggestedPeople'}
        tabBarOptions={{
          showLabel: false,
          style: {
            backgroundColor: 'transparent',
            position: 'absolute',
            borderTopWidth: 0,
            left: 0,
            right: 0,
            bottom: '1%',
          },
        }}>
        <Tabs.Screen
          name="SuggestedPeople"
          component={MainStackScreen}
          initialParams={{screenType: ScreenType.SuggestedPeople}}
        />
        <Tabs.Screen
          name="Chat"
          component={MainStackScreen}
          initialParams={{screenType: ScreenType.Chat}}
        />
        <Tabs.Screen
          name="Upload"
          component={MainStackScreen}
          initialParams={{screenType: ScreenType.Upload}}
        />
        <Tabs.Screen
          name="Notifications"
          component={MainStackScreen}
          initialParams={{screenType: ScreenType.Notifications}}
          listeners={{
            tabPress: (_) => {
              // Closes the pill once this screen has been opened
              setShowIcon(false);
              // Updates backend's date of reading notifications
              setNotificationsReadDate();
            },
          }}
        />
        <Tabs.Screen
          name="ProfileTab"
          component={MainStackScreen}
          initialParams={{screenType: ScreenType.Profile}}
        />
      </Tabs.Navigator>
    </>
  );
};

export default NavigationBar;