|
@@ -1,50 +1,31 @@
|
|
|
import React, { useCallback, useState } from 'react';
|
|
|
import { useFocusEffect } from '@react-navigation/native';
|
|
|
-import { FlatList, Text, TouchableOpacity, View } from 'react-native';
|
|
|
-import { Dropdown } from 'react-native-searchable-dropdown-kj';
|
|
|
-import Modal from 'react-native-modal';
|
|
|
+import { FlatList } from 'react-native';
|
|
|
|
|
|
import { fetchFullRanking, usePostGetCountriesRanking } from '@api/ranking';
|
|
|
|
|
|
-import { styles } from './styles';
|
|
|
-import { Colors } from '../../../../theme';
|
|
|
-
|
|
|
-import { dataAge, dataRanking } from './values';
|
|
|
-
|
|
|
-import { Button, Header, Loading, PageWrapper } from '../../../../components';
|
|
|
+import { Header, Loading, PageWrapper } from '../../../../components';
|
|
|
import { getOnlineStatus, storage, StoreType } from '../../../../storage';
|
|
|
|
|
|
import { Profile } from '../Components/Profile';
|
|
|
+import { FilterModal, FilterButton } from '../Components/FilterModal';
|
|
|
|
|
|
-import { ButtonVariants } from '../../../../types/components';
|
|
|
-
|
|
|
-import FilterIcon from '../../../../../assets/icons/filter.svg';
|
|
|
-import CloseIcon from '../../../../../assets/icons/close.svg';
|
|
|
+import { applyModalSort, dataRanking } from '../utils';
|
|
|
+import type { RankingDropdown } from '../utils/types';
|
|
|
|
|
|
import type { Ranking } from '..';
|
|
|
|
|
|
-type RankingDropdown = { value: number; label: string };
|
|
|
-
|
|
|
const MasterRankingScreen = () => {
|
|
|
- const [masterRanking, setMasterRanking] = useState<Ranking[]>([]);
|
|
|
- const [filteredData, setFilteredData] = useState<Ranking[]>([]);
|
|
|
const { mutateAsync } = fetchFullRanking();
|
|
|
- const [isLoading, setIsLoading] = useState(true);
|
|
|
- const [isModalVisible, setModalVisible] = useState(false);
|
|
|
+ const { data: masterCountries } = usePostGetCountriesRanking();
|
|
|
|
|
|
- const [valueAge, setValueAge] = useState<{
|
|
|
- value: string;
|
|
|
- label: string;
|
|
|
- min: number;
|
|
|
- max: number;
|
|
|
- } | null>();
|
|
|
- const [valueCountry, setValueCountry] = useState<{ two: string; name: string } | null>();
|
|
|
+ const [masterRanking, setMasterRanking] = useState<Ranking[]>([]);
|
|
|
+ const [isLoading, setIsLoading] = useState(true);
|
|
|
|
|
|
- const [valueRanking, setValueRanking] = useState<RankingDropdown | null>();
|
|
|
+ const [filteredData, setFilteredData] = useState<Ranking[]>([]);
|
|
|
+ const [isModalVisible, setModalVisible] = useState(false);
|
|
|
const [confirmedValueRanking, setConfirmedValueRanking] = useState<RankingDropdown | null>();
|
|
|
|
|
|
- const { data: masterCountries } = usePostGetCountriesRanking();
|
|
|
-
|
|
|
useFocusEffect(
|
|
|
useCallback(() => {
|
|
|
const fetchRanking = async () => {
|
|
@@ -71,195 +52,22 @@ const MasterRankingScreen = () => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- const applySort = () => {
|
|
|
- setConfirmedValueRanking(valueRanking);
|
|
|
-
|
|
|
- let filteredLocalData = masterRanking;
|
|
|
-
|
|
|
- if (valueAge) {
|
|
|
- filteredLocalData = filteredLocalData.filter(
|
|
|
- (user) => user.age >= valueAge.min && user.age <= valueAge.max
|
|
|
- );
|
|
|
- }
|
|
|
-
|
|
|
- if (valueCountry) {
|
|
|
- filteredLocalData = filteredLocalData.filter(
|
|
|
- (user) => user.country === valueCountry.two.toLowerCase()
|
|
|
- );
|
|
|
- }
|
|
|
-
|
|
|
- if (valueRanking) {
|
|
|
- switch (valueRanking?.label) {
|
|
|
- case 'NM':
|
|
|
- setFilteredData(
|
|
|
- filteredLocalData.sort((a: Ranking, b: Ranking) => b.score_nm - a.score_nm)
|
|
|
- );
|
|
|
- break;
|
|
|
- case 'DARE':
|
|
|
- setFilteredData(
|
|
|
- filteredLocalData.sort((a: Ranking, b: Ranking) => b.score_dare - a.score_dare)
|
|
|
- );
|
|
|
- break;
|
|
|
- case 'UN':
|
|
|
- setFilteredData(
|
|
|
- filteredLocalData.sort((a: Ranking, b: Ranking) => b.score_un - a.score_un)
|
|
|
- );
|
|
|
- break;
|
|
|
- case 'UN+':
|
|
|
- setFilteredData(
|
|
|
- filteredLocalData.sort((a: Ranking, b: Ranking) => b.score_unp - a.score_unp)
|
|
|
- );
|
|
|
- break;
|
|
|
- case 'TCC':
|
|
|
- setFilteredData(
|
|
|
- filteredLocalData.sort((a: Ranking, b: Ranking) => b.score_tcc - a.score_tcc)
|
|
|
- );
|
|
|
- break;
|
|
|
- case 'DEEP':
|
|
|
- //TODO: Crash
|
|
|
- setFilteredData(
|
|
|
- filteredLocalData.sort((a: Ranking, b: Ranking) => b.score_deep - a.score_deep)
|
|
|
- );
|
|
|
- break;
|
|
|
- case 'YES':
|
|
|
- const validUsers = masterRanking.filter((user) => user.score_yes !== 10000);
|
|
|
- setFilteredData(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
|
|
|
- );
|
|
|
- setFilteredData(
|
|
|
- valiidUsers.sort((a: Ranking, b: Ranking) => b.score_slow - a.score_slow)
|
|
|
- );
|
|
|
- break;
|
|
|
- case 'WHS':
|
|
|
- setFilteredData(
|
|
|
- filteredLocalData.sort((a: Ranking, b: Ranking) => b.score_whs - a.score_whs)
|
|
|
- );
|
|
|
- break;
|
|
|
- case 'KYE':
|
|
|
- setFilteredData(
|
|
|
- filteredLocalData.sort((a: Ranking, b: Ranking) => b.score_kye - a.score_kye)
|
|
|
- );
|
|
|
- break;
|
|
|
- case 'TBT':
|
|
|
- setFilteredData(
|
|
|
- filteredLocalData.sort((a: Ranking, b: Ranking) => b.score_tbt - a.score_tbt)
|
|
|
- );
|
|
|
- break;
|
|
|
- default:
|
|
|
- setFilteredData(filteredLocalData);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- setFilteredData(filteredLocalData);
|
|
|
- };
|
|
|
-
|
|
|
return (
|
|
|
<PageWrapper>
|
|
|
- <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}
|
|
|
- disable={!getOnlineStatus()}
|
|
|
- labelField="label"
|
|
|
- valueField="value"
|
|
|
- placeholder="Select age"
|
|
|
- value={valueAge?.value}
|
|
|
- onChange={(item) => {
|
|
|
- setValueAge(item);
|
|
|
- }}
|
|
|
- />
|
|
|
- <Dropdown
|
|
|
- style={styles.dropdown}
|
|
|
- placeholderStyle={styles.placeholderStyle}
|
|
|
- selectedTextStyle={styles.selectedTextStyle}
|
|
|
- data={dataRanking}
|
|
|
- labelField="label"
|
|
|
- valueField="value"
|
|
|
- placeholder="Select ranking"
|
|
|
- value={valueRanking?.value}
|
|
|
- onChange={(item) => {
|
|
|
- setValueRanking(item);
|
|
|
- }}
|
|
|
- />
|
|
|
- </View>
|
|
|
- <Dropdown
|
|
|
- style={[styles.dropdown, { width: '100%', marginTop: 15 }]}
|
|
|
- placeholderStyle={styles.placeholderStyle}
|
|
|
- selectedTextStyle={styles.selectedTextStyle}
|
|
|
- data={masterCountries ? masterCountries.data : []}
|
|
|
- disable={!getOnlineStatus()}
|
|
|
- labelField="name"
|
|
|
- valueField="two"
|
|
|
- placeholder="Select country"
|
|
|
- value={valueCountry?.two}
|
|
|
- onChange={(item) => {
|
|
|
- setValueCountry(item);
|
|
|
- }}
|
|
|
- />
|
|
|
- <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);
|
|
|
- setValueCountry(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>
|
|
|
+ <FilterModal
|
|
|
+ isModalVisible={isModalVisible}
|
|
|
+ setModalVisible={(value) => setModalVisible(value)}
|
|
|
+ applyFilter={(filterAge, filterRanking, filterCountry) => {
|
|
|
+ setConfirmedValueRanking(filterRanking);
|
|
|
+ setFilteredData(applyModalSort(masterRanking, filterAge, filterRanking, filterCountry));
|
|
|
+ setModalVisible(false);
|
|
|
+ }}
|
|
|
+ countriesData={masterCountries ? masterCountries.data : []}
|
|
|
+ />
|
|
|
|
|
|
<Header
|
|
|
label="Master Ranking"
|
|
|
- rightElement={
|
|
|
- <TouchableOpacity style={{ padding: 5 }} onPress={() => setModalVisible(!isModalVisible)}>
|
|
|
- <FilterIcon />
|
|
|
- </TouchableOpacity>
|
|
|
- }
|
|
|
+ rightElement={<FilterButton onPress={() => setModalVisible(!isModalVisible)} />}
|
|
|
/>
|
|
|
|
|
|
<FlatList
|
|
@@ -289,10 +97,10 @@ const MasterRankingScreen = () => {
|
|
|
item.score_whs,
|
|
|
item.score_kye
|
|
|
]}
|
|
|
- tbt_score={item.score_tbt}
|
|
|
active_score={
|
|
|
confirmedValueRanking ? confirmedValueRanking.value - 1 : dataRanking[0].value - 1
|
|
|
}
|
|
|
+ tbt_score={item.score_tbt}
|
|
|
tbt_rank={item.rank_tbt}
|
|
|
badge_tbt={item.badge_tbt}
|
|
|
badge_1281={item.badge_1281}
|