aboutsummaryrefslogtreecommitdiff
path: root/src/routes/tabs/NavigationBar.tsx
blob: a3584f55d602145b47f594b278f13437255482e0 (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
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, isIPhoneX} 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,
            height: isIPhoneX() ? 85 : 55,
          },
        }}>
        <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;