index.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import React, { useCallback, useState } from 'react';
  2. import { useFocusEffect } from '@react-navigation/native';
  3. import { FlatList } from 'react-native';
  4. import { fetchFullRanking, usePostGetCountriesRanking } from '@api/ranking';
  5. import { Header, Loading, PageWrapper } from '../../../../components';
  6. import { storage, StoreType } from '../../../../storage';
  7. import { Profile } from '../Components/Profile';
  8. import { FilterModal, FilterButton } from '../Components/FilterModal';
  9. import { applyModalSort, dataRanking } from '../utils';
  10. import type { RankingDropdown } from '../utils/types';
  11. import type { Ranking } from '..';
  12. import { useConnection } from 'src/contexts/ConnectionContext';
  13. const MasterRankingScreen = () => {
  14. const { mutateAsync } = fetchFullRanking();
  15. const { data: masterCountries } = usePostGetCountriesRanking();
  16. const netInfo = useConnection();
  17. const [masterRanking, setMasterRanking] = useState<Ranking[]>([]);
  18. const [isLoading, setIsLoading] = useState(true);
  19. const [filteredData, setFilteredData] = useState<Ranking[]>([]);
  20. const [isModalVisible, setModalVisible] = useState(false);
  21. const [confirmedValueRanking, setConfirmedValueRanking] = useState<RankingDropdown | null>();
  22. useFocusEffect(
  23. useCallback(() => {
  24. const fetchRanking = async () => {
  25. const ranking = storage.get('masterRanking', StoreType.STRING) as string;
  26. setMasterRanking(
  27. JSON.parse(ranking).sort((a: Ranking, b: Ranking) => b.score_nm - a.score_nm)
  28. );
  29. setIsLoading(false);
  30. };
  31. fetchRanking();
  32. }, [])
  33. );
  34. if (isLoading) return <Loading />;
  35. const getFullRanking = async () => {
  36. if (netInfo?.isInternetReachable) {
  37. await mutateAsync(undefined, {
  38. onSuccess: (data) => {
  39. setMasterRanking(data.data);
  40. }
  41. });
  42. }
  43. };
  44. return (
  45. <PageWrapper>
  46. <FilterModal
  47. isModalVisible={isModalVisible}
  48. setModalVisible={(value) => setModalVisible(value)}
  49. applyFilter={(filterAge, filterRanking, filterCountry) => {
  50. setConfirmedValueRanking(filterRanking);
  51. setFilteredData(applyModalSort(masterRanking, filterAge, filterRanking, filterCountry));
  52. setModalVisible(false);
  53. }}
  54. countriesData={masterCountries ? masterCountries.data : []}
  55. />
  56. <Header
  57. label="Master Ranking"
  58. rightElement={<FilterButton onPress={() => setModalVisible(!isModalVisible)} />}
  59. />
  60. <FlatList
  61. showsVerticalScrollIndicator={false}
  62. data={filteredData.length != 0 ? filteredData : masterRanking}
  63. keyExtractor={(item) => item.user_id.toString()}
  64. renderItem={({ item, index }) => (
  65. <Profile
  66. userId={item.user_id}
  67. key={index}
  68. index={index}
  69. first_name={item.first_name}
  70. last_name={item.last_name}
  71. avatar={item.avatar}
  72. date_of_birth={item.age}
  73. homebase_flag={item.flag1}
  74. homebase2_flag={item.flag2}
  75. score={[
  76. item.score_nm,
  77. item.score_dare,
  78. item.score_un,
  79. item.score_unp,
  80. item.score_tcc,
  81. item.score_deep,
  82. item.score_yes,
  83. item.score_slow,
  84. item.score_whs,
  85. item.score_kye
  86. ]}
  87. active_score={
  88. confirmedValueRanking ? confirmedValueRanking.value - 1 : dataRanking[0].value - 1
  89. }
  90. tbt_score={item.score_tbt}
  91. tbt_rank={item.rank_tbt}
  92. badge_tbt={item.badge_tbt}
  93. badge_1281={item.badge_1281}
  94. badge_un={item.badge_un}
  95. auth={item.auth}
  96. />
  97. )}
  98. onEndReached={() => getFullRanking()}
  99. onEndReachedThreshold={0.5}
  100. />
  101. </PageWrapper>
  102. );
  103. };
  104. export default MasterRankingScreen;