|
@@ -13,6 +13,7 @@ import { API_HOST, FASTEST_MAP_HOST } from 'src/constants';
|
|
import CheckSvg from 'assets/icons/mark.svg';
|
|
import CheckSvg from 'assets/icons/mark.svg';
|
|
import { useGetListQuery } from '@api/series';
|
|
import { useGetListQuery } from '@api/series';
|
|
import { RadioButton } from 'react-native-paper';
|
|
import { RadioButton } from 'react-native-paper';
|
|
|
|
+import { storage, StoreType } from 'src/storage';
|
|
|
|
|
|
const FilterModal = ({
|
|
const FilterModal = ({
|
|
isFilterVisible,
|
|
isFilterVisible,
|
|
@@ -59,6 +60,53 @@ const FilterModal = ({
|
|
const [selectedSeries, setSelectedSeries] = useState<number[]>([]);
|
|
const [selectedSeries, setSelectedSeries] = useState<number[]>([]);
|
|
const [seriesVisible, setSeriesVisible] = useState(true);
|
|
const [seriesVisible, setSeriesVisible] = useState(true);
|
|
const [selectedSeriesFilter, setSelectedSeriesFilter] = useState(-1);
|
|
const [selectedSeriesFilter, setSelectedSeriesFilter] = useState(-1);
|
|
|
|
+ const savedFilterSettings = !isPublicView
|
|
|
|
+ ? (storage.get('filterSettings', StoreType.STRING) as string)
|
|
|
|
+ : null;
|
|
|
|
+
|
|
|
|
+ useEffect(() => {
|
|
|
|
+ const loadFilterSettings = () => {
|
|
|
|
+ try {
|
|
|
|
+ if (savedFilterSettings) {
|
|
|
|
+ const filterSettings = JSON.parse(savedFilterSettings);
|
|
|
|
+ setTilesType(filterSettings.tilesType);
|
|
|
|
+ setSelectedYear(filterSettings.selectedYear);
|
|
|
|
+ setSelectedVisible(filterSettings.selectedVisible);
|
|
|
|
+ setSelectedSeries(filterSettings.seriesFilter.groups);
|
|
|
|
+ setSeriesVisible(filterSettings.seriesFilter.visible);
|
|
|
|
+ setSelectedSeriesFilter(filterSettings.seriesFilter.status);
|
|
|
|
+ }
|
|
|
|
+ } catch (error) {
|
|
|
|
+ console.error('Failed to load filter settings', error);
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ if (!isPublicView && isLogged) {
|
|
|
|
+ loadFilterSettings();
|
|
|
|
+ }
|
|
|
|
+ }, [savedFilterSettings]);
|
|
|
|
+
|
|
|
|
+ const saveFilterSettings = async () => {
|
|
|
|
+ if (isLogged && !isPublicView) {
|
|
|
|
+ try {
|
|
|
|
+ const filterSettings = {
|
|
|
|
+ type: tilesType.value,
|
|
|
|
+ tilesType,
|
|
|
|
+ selectedYear,
|
|
|
|
+ selectedVisible,
|
|
|
|
+ seriesFilter: {
|
|
|
|
+ visible: seriesVisible,
|
|
|
|
+ groups: selectedSeries,
|
|
|
|
+ applied: true,
|
|
|
|
+ status: selectedSeriesFilter
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ storage.set('filterSettings', JSON.stringify(filterSettings));
|
|
|
|
+ } catch (error) {
|
|
|
|
+ console.error('Failed to save filter settings', error);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
if (data) {
|
|
if (data) {
|
|
@@ -67,9 +115,9 @@ const FilterModal = ({
|
|
.map((year) => ({ label: year.toString(), value: year }))
|
|
.map((year) => ({ label: year.toString(), value: year }))
|
|
.reverse();
|
|
.reverse();
|
|
setAllYears(formattedYears);
|
|
setAllYears(formattedYears);
|
|
- formattedYears.length && setSelectedYear(formattedYears[0]);
|
|
|
|
|
|
+ formattedYears.length && !savedFilterSettings && setSelectedYear(formattedYears[0]);
|
|
}
|
|
}
|
|
- }, [data]);
|
|
|
|
|
|
+ }, [data, savedFilterSettings]);
|
|
|
|
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
if (seriesList?.data) {
|
|
if (seriesList?.data) {
|
|
@@ -80,7 +128,7 @@ const FilterModal = ({
|
|
icon: item.icon
|
|
icon: item.icon
|
|
}))
|
|
}))
|
|
]);
|
|
]);
|
|
- setSelectedSeries(seriesList.data.map((item) => item.id));
|
|
|
|
|
|
+ !savedFilterSettings && setSelectedSeries(seriesList.data.map((item) => item.id));
|
|
}
|
|
}
|
|
}, [seriesList]);
|
|
}, [seriesList]);
|
|
|
|
|
|
@@ -100,6 +148,7 @@ const FilterModal = ({
|
|
} else {
|
|
} else {
|
|
tileUrl += 'user_visited_dare/' + userId;
|
|
tileUrl += 'user_visited_dare/' + userId;
|
|
}
|
|
}
|
|
|
|
+ !isPublicView && storage.set('visitedTilesUrl', tileUrl);
|
|
setVisitedTiles(tileUrl);
|
|
setVisitedTiles(tileUrl);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
@@ -120,9 +169,15 @@ const FilterModal = ({
|
|
tileUrl += 'user_visited_dare/' + userId;
|
|
tileUrl += 'user_visited_dare/' + userId;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ !isPublicView && storage.set('visitedTilesUrl', tileUrl);
|
|
setVisitedTiles(tileUrl);
|
|
setVisitedTiles(tileUrl);
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+ const handleCloseFilter = () => {
|
|
|
|
+ setIndex(0);
|
|
|
|
+ setIsFilterVisible(false);
|
|
|
|
+ };
|
|
|
|
+
|
|
const renderScene = ({ route }: { route: any }) => {
|
|
const renderScene = ({ route }: { route: any }) => {
|
|
return route.key === 'regions' ? (
|
|
return route.key === 'regions' ? (
|
|
<View style={styles.sceneContainer}>
|
|
<View style={styles.sceneContainer}>
|
|
@@ -188,9 +243,10 @@ const FilterModal = ({
|
|
<Button
|
|
<Button
|
|
children="Filter"
|
|
children="Filter"
|
|
onPress={() => {
|
|
onPress={() => {
|
|
|
|
+ saveFilterSettings();
|
|
handleApplyFilter();
|
|
handleApplyFilter();
|
|
setType(tilesType.value);
|
|
setType(tilesType.value);
|
|
- setIsFilterVisible(false);
|
|
|
|
|
|
+ handleCloseFilter();
|
|
}}
|
|
}}
|
|
/>
|
|
/>
|
|
<Button
|
|
<Button
|
|
@@ -201,6 +257,27 @@ const FilterModal = ({
|
|
setSelectedVisible({ label: 'visited by', value: 0 });
|
|
setSelectedVisible({ label: 'visited by', value: 0 });
|
|
setVisitedTiles(`${FASTEST_MAP_HOST}/tiles_nm/user_visited/${userId}`);
|
|
setVisitedTiles(`${FASTEST_MAP_HOST}/tiles_nm/user_visited/${userId}`);
|
|
setType(0);
|
|
setType(0);
|
|
|
|
+ if (!isPublicView && isLogged) {
|
|
|
|
+ storage.set(
|
|
|
|
+ 'filterSettings',
|
|
|
|
+ JSON.stringify({
|
|
|
|
+ type: 0,
|
|
|
|
+ tilesType: { label: 'NM regions', value: 0 },
|
|
|
|
+ selectedYear: allYears[0],
|
|
|
|
+ selectedVisible: { label: 'visited by', value: 0 },
|
|
|
|
+ seriesFilter: {
|
|
|
|
+ visible: seriesVisible,
|
|
|
|
+ groups: selectedSeries,
|
|
|
|
+ status: selectedSeriesFilter,
|
|
|
|
+ applied: true
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ );
|
|
|
|
+ storage.set(
|
|
|
|
+ 'visitedTilesUrl',
|
|
|
|
+ `${FASTEST_MAP_HOST}/tiles_nm/user_visited/${userId}`
|
|
|
|
+ );
|
|
|
|
+ }
|
|
}}
|
|
}}
|
|
variant={ButtonVariants.OPACITY}
|
|
variant={ButtonVariants.OPACITY}
|
|
containerStyles={styles.closeBtn}
|
|
containerStyles={styles.closeBtn}
|
|
@@ -219,7 +296,7 @@ const FilterModal = ({
|
|
value={seriesVisible}
|
|
value={seriesVisible}
|
|
style={{ transform: 'scale(0.8)' }}
|
|
style={{ transform: 'scale(0.8)' }}
|
|
/>
|
|
/>
|
|
- <Text style={styles.textBold}>Visible / Not visible</Text>
|
|
|
|
|
|
+ <Text style={styles.textBold}>Show series</Text>
|
|
</View>
|
|
</View>
|
|
|
|
|
|
{isLogged ? (
|
|
{isLogged ? (
|
|
@@ -318,7 +395,8 @@ const FilterModal = ({
|
|
applied: true,
|
|
applied: true,
|
|
status: selectedSeriesFilter
|
|
status: selectedSeriesFilter
|
|
});
|
|
});
|
|
- setIsFilterVisible(false);
|
|
|
|
|
|
+ saveFilterSettings();
|
|
|
|
+ handleCloseFilter();
|
|
}}
|
|
}}
|
|
/>
|
|
/>
|
|
<Button
|
|
<Button
|
|
@@ -329,6 +407,23 @@ const FilterModal = ({
|
|
setSeriesVisible(true);
|
|
setSeriesVisible(true);
|
|
setSeriesFilter &&
|
|
setSeriesFilter &&
|
|
setSeriesFilter({ visible: true, groups: [], applied: false, status: -1 });
|
|
setSeriesFilter({ visible: true, groups: [], applied: false, status: -1 });
|
|
|
|
+ if (!isPublicView && isLogged) {
|
|
|
|
+ storage.set(
|
|
|
|
+ 'filterSettings',
|
|
|
|
+ JSON.stringify({
|
|
|
|
+ type: tilesType.value,
|
|
|
|
+ tilesType,
|
|
|
|
+ selectedYear,
|
|
|
|
+ selectedVisible,
|
|
|
|
+ seriesFilter: {
|
|
|
|
+ visible: true,
|
|
|
|
+ groups: series?.map((item) => item.value),
|
|
|
|
+ status: -1,
|
|
|
|
+ applied: false
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ );
|
|
|
|
+ }
|
|
}}
|
|
}}
|
|
variant={ButtonVariants.OPACITY}
|
|
variant={ButtonVariants.OPACITY}
|
|
containerStyles={styles.closeBtn}
|
|
containerStyles={styles.closeBtn}
|
|
@@ -344,8 +439,8 @@ const FilterModal = ({
|
|
return (
|
|
return (
|
|
<ReactModal
|
|
<ReactModal
|
|
isVisible={isFilterVisible}
|
|
isVisible={isFilterVisible}
|
|
- onBackdropPress={() => setIsFilterVisible(false)}
|
|
|
|
- onBackButtonPress={() => setIsFilterVisible(false)}
|
|
|
|
|
|
+ onBackdropPress={handleCloseFilter}
|
|
|
|
+ onBackButtonPress={handleCloseFilter}
|
|
style={styles.modal}
|
|
style={styles.modal}
|
|
statusBarTranslucent={true}
|
|
statusBarTranslucent={true}
|
|
presentationStyle="overFullScreen"
|
|
presentationStyle="overFullScreen"
|