index.tsx 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. import React, { useCallback, useEffect, useState } from 'react';
  2. import { useFocusEffect } from '@react-navigation/native';
  3. import { FlatList } from 'react-native';
  4. import { useGetFullRanking, 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. import { updateMasterRanking } from 'src/database';
  14. const MasterRankingScreen = () => {
  15. const { data: fullData } = useGetFullRanking();
  16. const { data: masterCountries } = usePostGetCountriesRanking();
  17. const netInfo = useConnection();
  18. const [masterRanking, setMasterRanking] = useState<Ranking[]>([]);
  19. const [fullRanking, setFullRanking] = useState<Ranking[]>([]);
  20. const [isLoading, setIsLoading] = useState(true);
  21. const [filteredData, setFilteredData] = useState<Ranking[]>([]);
  22. const [isModalVisible, setModalVisible] = useState(false);
  23. const [confirmedValueRanking, setConfirmedValueRanking] = useState<RankingDropdown | null>();
  24. useFocusEffect(
  25. useCallback(() => {
  26. const fetchRanking = async () => {
  27. const ranking = storage.get('masterRanking', StoreType.STRING) as string;
  28. let indexCounter = 0;
  29. if (!ranking) {
  30. updateMasterRanking();
  31. setMasterRanking(
  32. fullData
  33. ? fullData?.data
  34. ?.sort(
  35. (a: Omit<Ranking, 'displayIndex'>, b: Omit<Ranking, 'displayIndex'>) =>
  36. b.score_nm - a.score_nm || b.score_un - a.score_un || a.age - b.age
  37. )
  38. .map((item) => {
  39. return item.dod !== 1
  40. ? { ...item, displayIndex: indexCounter++ }
  41. : { ...item, displayIndex: -1 };
  42. })
  43. : []
  44. );
  45. return;
  46. }
  47. setMasterRanking(
  48. JSON.parse(ranking)
  49. .sort(
  50. (a: Ranking, b: Ranking) =>
  51. b.score_nm - a.score_nm || b.score_un - a.score_un || a.age - b.age
  52. )
  53. .map((item: Ranking) => {
  54. return item.dod !== 1
  55. ? { ...item, displayIndex: indexCounter++ }
  56. : { ...item, displayIndex: -1 };
  57. })
  58. );
  59. setIsLoading(false);
  60. };
  61. fetchRanking();
  62. }, [])
  63. );
  64. useEffect(() => {
  65. if (fullData) {
  66. let indexCounter = 0;
  67. setFullRanking(
  68. fullData?.data
  69. ?.sort(
  70. (a: Omit<Ranking, 'displayIndex'>, b: Omit<Ranking, 'displayIndex'>) =>
  71. b.score_nm - a.score_nm || b.score_un - a.score_un || a.age - b.age
  72. )
  73. .map((item) => {
  74. return item.dod !== 1
  75. ? { ...item, displayIndex: indexCounter++ }
  76. : { ...item, displayIndex: -1 };
  77. })
  78. );
  79. }
  80. }, [fullData]);
  81. if (isLoading) return <Loading />;
  82. const getFullRanking = async () => {
  83. if (netInfo?.isInternetReachable && fullRanking) {
  84. setMasterRanking(fullRanking);
  85. }
  86. };
  87. return (
  88. <PageWrapper>
  89. <FilterModal
  90. isModalVisible={isModalVisible}
  91. setModalVisible={(value) => setModalVisible(value)}
  92. applyFilter={(filterAge, filterRanking, filterCountry) => {
  93. setConfirmedValueRanking(filterRanking);
  94. setFilteredData(
  95. applyModalSort(
  96. netInfo?.isInternetReachable && fullRanking ? fullRanking : masterRanking,
  97. filterAge,
  98. filterRanking,
  99. filterCountry
  100. )
  101. );
  102. setModalVisible(false);
  103. }}
  104. countriesData={masterCountries ? masterCountries.data : []}
  105. />
  106. <Header
  107. label="Master Ranking"
  108. rightElement={<FilterButton onPress={() => setModalVisible(!isModalVisible)} />}
  109. />
  110. <FlatList
  111. showsVerticalScrollIndicator={false}
  112. data={filteredData.length != 0 ? filteredData : masterRanking}
  113. keyExtractor={(item) => item.user_id.toString()}
  114. renderItem={({ item, index }) => (
  115. <Profile
  116. userId={item.user_id}
  117. key={index}
  118. index={item.displayIndex}
  119. first_name={item.first_name}
  120. last_name={item.last_name}
  121. avatar={item.avatar}
  122. date_of_birth={item.age}
  123. homebase_flag={item.flag1}
  124. homebase2_flag={item.flag2}
  125. score={[
  126. item.score_nm,
  127. item.score_un,
  128. item.score_unp,
  129. item.score_dare,
  130. item.score_tcc,
  131. item.score_deep,
  132. item.score_slow,
  133. item.score_yes,
  134. item.score_kye,
  135. item.score_whs
  136. ]}
  137. active_score={
  138. confirmedValueRanking ? confirmedValueRanking.value - 1 : dataRanking[0].value - 1
  139. }
  140. tbt_score={item.score_tbt}
  141. tbt_rank={item.rank_tbt}
  142. badge_tbt={item.badge_tbt}
  143. badge_1281={item.badge_1281}
  144. badge_un={item.badge_un}
  145. badge_un_50={item.badge_un_50}
  146. badge_un_100={item.badge_un_100}
  147. badge_un_150={item.badge_un_150}
  148. auth={item.auth}
  149. />
  150. )}
  151. onEndReached={() => getFullRanking()}
  152. onEndReachedThreshold={0.5}
  153. />
  154. </PageWrapper>
  155. );
  156. };
  157. export default MasterRankingScreen;