|
@@ -1,19 +1,40 @@
|
|
import React, { useCallback, useState } from 'react';
|
|
import React, { useCallback, useState } from 'react';
|
|
import { useFocusEffect } from '@react-navigation/native';
|
|
import { useFocusEffect } from '@react-navigation/native';
|
|
-import { FlatList } from 'react-native';
|
|
|
|
|
|
+import { FlatList, Text, TouchableOpacity, View } from 'react-native';
|
|
|
|
+import { Dropdown } from 'react-native-searchable-dropdown-kj';
|
|
|
|
+import Modal from 'react-native-modal';
|
|
|
|
+
|
|
import { fetchFullRanking } from '@api/ranking';
|
|
import { fetchFullRanking } from '@api/ranking';
|
|
|
|
|
|
-import { Header, Loading, PageWrapper } from '../../../../components';
|
|
|
|
|
|
+import { styles } from './styles';
|
|
|
|
+import { Colors } from '../../../../theme';
|
|
|
|
+
|
|
|
|
+import { dataAge, dataRanking } from './values';
|
|
|
|
+
|
|
|
|
+import { Button, Header, Loading, PageWrapper } from '../../../../components';
|
|
import { getOnlineStatus, storage, StoreType } from '../../../../storage';
|
|
import { getOnlineStatus, storage, StoreType } from '../../../../storage';
|
|
|
|
|
|
import { Profile } from '../Components/Profile';
|
|
import { Profile } from '../Components/Profile';
|
|
|
|
|
|
|
|
+import { ButtonVariants } from '../../../../types/components';
|
|
|
|
+
|
|
|
|
+import FilterIcon from '../../../../../assets/icons/filter.svg';
|
|
|
|
+import CloseIcon from '../../../../../assets/icons/close.svg';
|
|
|
|
+
|
|
import type { Ranking } from '..';
|
|
import type { Ranking } from '..';
|
|
|
|
|
|
const MasterRankingScreen = () => {
|
|
const MasterRankingScreen = () => {
|
|
const [masterRanking, setMasterRanking] = useState<Ranking[]>([]);
|
|
const [masterRanking, setMasterRanking] = useState<Ranking[]>([]);
|
|
const { mutateAsync } = fetchFullRanking();
|
|
const { mutateAsync } = fetchFullRanking();
|
|
const [isLoading, setIsLoading] = useState(true);
|
|
const [isLoading, setIsLoading] = useState(true);
|
|
|
|
+ const [isModalVisible, setModalVisible] = useState(false);
|
|
|
|
+
|
|
|
|
+ const [valueAge, setValueAge] = useState<{ value: string; label: string } | null>();
|
|
|
|
+ const [valueRanking, setValueRanking] = useState<{ value: string; label: string } | null>({
|
|
|
|
+ value: '1',
|
|
|
|
+ label: '1301'
|
|
|
|
+ });
|
|
|
|
+ const [valueCountry, setValueCountry] = useState(null);
|
|
|
|
|
|
useFocusEffect(
|
|
useFocusEffect(
|
|
useCallback(() => {
|
|
useCallback(() => {
|
|
@@ -41,15 +62,176 @@ const MasterRankingScreen = () => {
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+ const applySort = () => {
|
|
|
|
+ switch (valueRanking?.label) {
|
|
|
|
+ case '1301':
|
|
|
|
+ setMasterRanking(masterRanking.sort((a: Ranking, b: Ranking) => b.score_nm - a.score_nm));
|
|
|
|
+ break;
|
|
|
|
+ case 'DARE':
|
|
|
|
+ setMasterRanking(
|
|
|
|
+ masterRanking.sort((a: Ranking, b: Ranking) => b.score_dare - a.score_dare)
|
|
|
|
+ );
|
|
|
|
+ break;
|
|
|
|
+ case 'UN':
|
|
|
|
+ setMasterRanking(masterRanking.sort((a: Ranking, b: Ranking) => b.score_un - a.score_un));
|
|
|
|
+ break;
|
|
|
|
+ case 'UN+':
|
|
|
|
+ setMasterRanking(masterRanking.sort((a: Ranking, b: Ranking) => b.score_unp - a.score_unp));
|
|
|
|
+ break;
|
|
|
|
+ case 'TCC':
|
|
|
|
+ setMasterRanking(masterRanking.sort((a: Ranking, b: Ranking) => b.score_tcc - a.score_tcc));
|
|
|
|
+ break;
|
|
|
|
+ case 'DEEP':
|
|
|
|
+ setMasterRanking(
|
|
|
|
+ masterRanking.sort((a: Ranking, b: Ranking) => b.score_deep - a.score_deep)
|
|
|
|
+ );
|
|
|
|
+ break;
|
|
|
|
+ case 'YES':
|
|
|
|
+ const validUsers = masterRanking.filter((user) => user.score_yes !== 10000);
|
|
|
|
+ setMasterRanking(validUsers.sort((a: Ranking, b: Ranking) => a.score_yes - b.score_yes));
|
|
|
|
+ break;
|
|
|
|
+ case 'SLOW':
|
|
|
|
+ const valiidUsers = masterRanking.filter(
|
|
|
|
+ (user) => user.score_slow < 4500 && user.score_slow > 0
|
|
|
|
+ );
|
|
|
|
+ setMasterRanking(valiidUsers.sort((a: Ranking, b: Ranking) => b.score_slow - a.score_slow));
|
|
|
|
+ break;
|
|
|
|
+ case 'WHS':
|
|
|
|
+ setMasterRanking(masterRanking.sort((a: Ranking, b: Ranking) => b.score_whs - a.score_whs));
|
|
|
|
+ break;
|
|
|
|
+ case 'KYE':
|
|
|
|
+ setMasterRanking(masterRanking.sort((a: Ranking, b: Ranking) => b.score_kye - a.score_kye));
|
|
|
|
+ break;
|
|
|
|
+ case 'TBT':
|
|
|
|
+ setMasterRanking(masterRanking.sort((a: Ranking, b: Ranking) => b.score_tbt - a.score_tbt));
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ const ModalComponent = () => {
|
|
|
|
+ return (
|
|
|
|
+ <>
|
|
|
|
+ <Modal isVisible={isModalVisible}>
|
|
|
|
+ <View style={{ height: 270, backgroundColor: 'white', borderRadius: 15 }}>
|
|
|
|
+ <View style={{ marginLeft: '5%', marginRight: '5%', marginTop: '5%' }}>
|
|
|
|
+ <View style={{ alignSelf: 'flex-end' }}>
|
|
|
|
+ <TouchableOpacity onPress={() => setModalVisible(!isModalVisible)}>
|
|
|
|
+ <CloseIcon />
|
|
|
|
+ </TouchableOpacity>
|
|
|
|
+ </View>
|
|
|
|
+ <View style={{ display: 'flex', alignItems: 'center' }}>
|
|
|
|
+ <Text style={{ color: Colors.DARK_BLUE, fontSize: 20, fontWeight: '700' }}>
|
|
|
|
+ Filter
|
|
|
|
+ </Text>
|
|
|
|
+ <View style={styles.ageAndRankingWrapper}>
|
|
|
|
+ <Dropdown
|
|
|
|
+ style={styles.dropdown}
|
|
|
|
+ placeholderStyle={styles.placeholderStyle}
|
|
|
|
+ selectedTextStyle={styles.selectedTextStyle}
|
|
|
|
+ data={dataAge}
|
|
|
|
+ maxHeight={300}
|
|
|
|
+ labelField="label"
|
|
|
|
+ valueField="value"
|
|
|
|
+ placeholder="Select age"
|
|
|
|
+ searchPlaceholder="Search..."
|
|
|
|
+ value={valueAge?.value}
|
|
|
|
+ onChange={(item) => {
|
|
|
|
+ setValueAge(item);
|
|
|
|
+ }}
|
|
|
|
+ />
|
|
|
|
+ <Dropdown
|
|
|
|
+ style={styles.dropdown}
|
|
|
|
+ placeholderStyle={styles.placeholderStyle}
|
|
|
|
+ selectedTextStyle={styles.selectedTextStyle}
|
|
|
|
+ data={dataRanking}
|
|
|
|
+ maxHeight={300}
|
|
|
|
+ labelField="label"
|
|
|
|
+ valueField="value"
|
|
|
|
+ placeholder="Select ranking"
|
|
|
|
+ searchPlaceholder="Search..."
|
|
|
|
+ value={valueRanking?.value}
|
|
|
|
+ onChange={(item) => {
|
|
|
|
+ setValueRanking(item);
|
|
|
|
+ }}
|
|
|
|
+ />
|
|
|
|
+ </View>
|
|
|
|
+ <Dropdown
|
|
|
|
+ style={styles.dropdown}
|
|
|
|
+ placeholderStyle={styles.placeholderStyle}
|
|
|
|
+ selectedTextStyle={styles.selectedTextStyle}
|
|
|
|
+ data={[]}
|
|
|
|
+ maxHeight={300}
|
|
|
|
+ labelField="label"
|
|
|
|
+ valueField="value"
|
|
|
|
+ placeholder="Select country"
|
|
|
|
+ searchPlaceholder="Search..."
|
|
|
|
+ value={valueRanking?.value}
|
|
|
|
+ onChange={(item) => {
|
|
|
|
+ //todo: Country
|
|
|
|
+ }}
|
|
|
|
+ />
|
|
|
|
+ <View style={styles.buttonsWrapper}>
|
|
|
|
+ <Button
|
|
|
|
+ variant={ButtonVariants.OPACITY}
|
|
|
|
+ containerStyles={{
|
|
|
|
+ borderColor: Colors.DARK_BLUE,
|
|
|
|
+ backgroundColor: 'white',
|
|
|
|
+ width: '45%'
|
|
|
|
+ }}
|
|
|
|
+ textStyles={{
|
|
|
|
+ color: Colors.DARK_BLUE
|
|
|
|
+ }}
|
|
|
|
+ onPress={() => {
|
|
|
|
+ setValueAge(null);
|
|
|
|
+ setValueRanking(null);
|
|
|
|
+ }}
|
|
|
|
+ children={'Clear'}
|
|
|
|
+ />
|
|
|
|
+ <Button
|
|
|
|
+ variant={ButtonVariants.FILL}
|
|
|
|
+ containerStyles={{
|
|
|
|
+ borderColor: Colors.DARK_BLUE,
|
|
|
|
+ backgroundColor: Colors.DARK_BLUE,
|
|
|
|
+ width: '45%'
|
|
|
|
+ }}
|
|
|
|
+ textStyles={{
|
|
|
|
+ color: Colors.WHITE
|
|
|
|
+ }}
|
|
|
|
+ onPress={() => {
|
|
|
|
+ setModalVisible(!isModalVisible);
|
|
|
|
+ applySort();
|
|
|
|
+ }}
|
|
|
|
+ children={'Filter'}
|
|
|
|
+ />
|
|
|
|
+ </View>
|
|
|
|
+ </View>
|
|
|
|
+ </View>
|
|
|
|
+ </View>
|
|
|
|
+ </Modal>
|
|
|
|
+ </>
|
|
|
|
+ );
|
|
|
|
+ };
|
|
|
|
+
|
|
return (
|
|
return (
|
|
<PageWrapper>
|
|
<PageWrapper>
|
|
|
|
+ <ModalComponent />
|
|
<FlatList
|
|
<FlatList
|
|
showsVerticalScrollIndicator={false}
|
|
showsVerticalScrollIndicator={false}
|
|
data={masterRanking}
|
|
data={masterRanking}
|
|
- ListHeaderComponent={<Header label="Master Ranking" />}
|
|
|
|
|
|
+ ListHeaderComponent={
|
|
|
|
+ <Header
|
|
|
|
+ label="Master Ranking"
|
|
|
|
+ rightElement={
|
|
|
|
+ <TouchableOpacity onPress={() => setModalVisible(!isModalVisible)}>
|
|
|
|
+ <FilterIcon />
|
|
|
|
+ </TouchableOpacity>
|
|
|
|
+ }
|
|
|
|
+ />
|
|
|
|
+ }
|
|
keyExtractor={(item) => item.user_id.toString()}
|
|
keyExtractor={(item) => item.user_id.toString()}
|
|
renderItem={({ item, index }) => (
|
|
renderItem={({ item, index }) => (
|
|
<Profile
|
|
<Profile
|
|
|
|
+ userId={item.user_id}
|
|
key={index}
|
|
key={index}
|
|
index={index}
|
|
index={index}
|
|
first_name={item.first_name}
|
|
first_name={item.first_name}
|