aboutsummaryrefslogtreecommitdiff
path: root/src/components/profile/ProfileBadges.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/profile/ProfileBadges.tsx')
-rw-r--r--src/components/profile/ProfileBadges.tsx148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/components/profile/ProfileBadges.tsx b/src/components/profile/ProfileBadges.tsx
new file mode 100644
index 00000000..8e68dc46
--- /dev/null
+++ b/src/components/profile/ProfileBadges.tsx
@@ -0,0 +1,148 @@
+import {useNavigation} from '@react-navigation/core';
+import React, {FC, useEffect, useState} from 'react';
+import {StyleSheet, Text, View} from 'react-native';
+import {ScrollView, TouchableOpacity} from 'react-native-gesture-handler';
+import {useSelector} from 'react-redux';
+import {BadgeIcon} from '..';
+import PlusIconImage from '../../assets/icons/plus-icon-thin.svg';
+import {BADGE_LIMIT} from '../../constants';
+import {RootState} from '../../store/rootReducer';
+import {ScreenType, UniversityBadgeDisplayType} from '../../types';
+import {badgesToDisplayBadges, normalize} from '../../utils';
+import BadgeDetailView from '../common/BadgeDetailView';
+
+interface ProfileBadgesProps {
+ userXId: string | undefined;
+ screenType: ScreenType;
+}
+
+const ProfileBadges: React.FC<ProfileBadgesProps> = ({userXId, screenType}) => {
+ const navigation = useNavigation();
+ const {badges, name, university} = useSelector((state: RootState) =>
+ userXId ? state.userX[screenType][userXId].profile : state.user.profile,
+ );
+ const [displayBadges, setDisplayBadges] = useState<
+ UniversityBadgeDisplayType[]
+ >([]);
+ const [isEditBadgeModalVisible, setIsEditBadgeModalVisible] = useState(false);
+ const isOwnProfile = userXId === undefined;
+
+ useEffect(() => {
+ setDisplayBadges(badgesToDisplayBadges(badges, university));
+ }, [badges]);
+
+ const PlusIcon: FC = () => (
+ <TouchableOpacity
+ onPress={() => navigation.navigate('BadgeSelection', {editing: true})}>
+ <PlusIconImage style={styles.plus} />
+ </TouchableOpacity>
+ );
+
+ const CloseIcon: FC = () => (
+ <TouchableOpacity onPress={() => setIsEditBadgeModalVisible(true)}>
+ <PlusIconImage style={styles.close} />
+ </TouchableOpacity>
+ );
+
+ return (
+ <>
+ {/* Tutorial text */}
+ {displayBadges.length === 0 && isOwnProfile && (
+ <>
+ <Text style={styles.title}>Badges</Text>
+ <Text style={styles.body}>
+ Proudly represent your team, club, or organization!
+ </Text>
+ </>
+ )}
+ {displayBadges.length === 0 && isOwnProfile && (
+ // Grey circle placeholders
+ <ScrollView
+ contentContainerStyle={styles.badgeContainer}
+ scrollEnabled={false}
+ horizontal>
+ <PlusIcon />
+ {Array(BADGE_LIMIT)
+ .fill(0)
+ .map(() => (
+ <View style={[styles.grey, styles.circle]} />
+ ))}
+ </ScrollView>
+ )}
+ {displayBadges.length !== 0 && (
+ // Populating actual badges
+ <ScrollView
+ contentContainerStyle={styles.badgeContainer}
+ scrollEnabled={false}
+ horizontal>
+ {/* Actual badges */}
+ {displayBadges.map((displayBadge) => (
+ <BadgeIcon key={displayBadge.id} badge={displayBadge} />
+ ))}
+ {/* Plus icon */}
+ {displayBadges.length < BADGE_LIMIT && isOwnProfile && <PlusIcon />}
+ {/* Empty placeholders for space-between styling */}
+ {Array(BADGE_LIMIT + 1)
+ .fill(0)
+ .splice(displayBadges.length + 1, BADGE_LIMIT)
+ .map(() => (
+ <View style={styles.circle} />
+ ))}
+ {/* X button */}
+ {displayBadges.length === BADGE_LIMIT && isOwnProfile && (
+ <CloseIcon />
+ )}
+ </ScrollView>
+ )}
+ {isEditBadgeModalVisible && (
+ <BadgeDetailView
+ userXId={userXId}
+ screenType={screenType}
+ isEditable={isOwnProfile}
+ userFullName={name}
+ setBadgeViewVisible={setIsEditBadgeModalVisible}
+ />
+ )}
+ </>
+ );
+};
+
+const styles = StyleSheet.create({
+ title: {
+ fontWeight: '600',
+ fontSize: normalize(13.5),
+ lineHeight: normalize(18),
+ },
+ body: {
+ fontSize: normalize(13.5),
+ lineHeight: normalize(17),
+ marginBottom: 10,
+ },
+ badgeContainer: {
+ width: '100%',
+ justifyContent: 'space-between',
+ marginTop: 10,
+ marginBottom: 15,
+ },
+ circle: {
+ width: normalize(31),
+ height: normalize(31),
+ borderRadius: normalize(31) / 2,
+ },
+ grey: {
+ backgroundColor: '#c4c4c4',
+ },
+ plus: {
+ width: normalize(31),
+ height: normalize(31),
+ color: 'black',
+ },
+ close: {
+ width: normalize(31),
+ height: normalize(31),
+ color: 'grey',
+ transform: [{rotate: '45deg'}],
+ },
+});
+
+export default ProfileBadges;