From 7d778e40d2a5d03655697163230ef9729ea17e27 Mon Sep 17 00:00:00 2001 From: danidfra Date: Fri, 28 Feb 2025 15:20:53 -0300 Subject: [PATCH] Create "save/reset" filter options --- .../explorer/components/explorerFilter.tsx | 8 +++- src/features/explorer/components/filters.tsx | 43 ++++++++++++++++--- src/locales/en.json | 1 + src/store.ts | 13 ++++++ 4 files changed, 59 insertions(+), 6 deletions(-) diff --git a/src/features/explorer/components/explorerFilter.tsx b/src/features/explorer/components/explorerFilter.tsx index 96b37c6d4..d54820ab9 100644 --- a/src/features/explorer/components/explorerFilter.tsx +++ b/src/features/explorer/components/explorerFilter.tsx @@ -12,6 +12,7 @@ import { CreateFilter, LanguageFilter, MediaFilter, + PersistentFilter, PlatformFilters, ToggleRepliesFilter, generateFilter, @@ -49,6 +50,8 @@ const ExplorerFilter = () => { () => { const value = formatFilters(filters); + sessionStorage.setItem('reduxFilterState', JSON.stringify(filters)); + dispatch(changeSearch(value)); dispatch(submitSearch(undefined, value)); }, [filters, dispatch], @@ -83,7 +86,6 @@ const ExplorerFilter = () => { {/* Media toggle */} - {/* Language */} @@ -95,6 +97,10 @@ const ExplorerFilter = () => { {/* Create your filter */} + + {/* Reset your filters */} + + diff --git a/src/features/explorer/components/filters.tsx b/src/features/explorer/components/filters.tsx index fe9b3e9fd..ebed21e76 100644 --- a/src/features/explorer/components/filters.tsx +++ b/src/features/explorer/components/filters.tsx @@ -17,7 +17,7 @@ import { IGenerateFilter } from 'soapbox/features/explorer/components/explorerFi import { SelectDropdown } from 'soapbox/features/forms/index.tsx'; import { useAppDispatch } from 'soapbox/hooks/useAppDispatch.ts'; import { useAppSelector } from 'soapbox/hooks/useAppSelector.ts'; -import { changeStatus, changeLanguage, changeMedia, createFilter, removeFilter, selectProtocol } from 'soapbox/reducers/search-filter.ts'; +import { changeStatus, changeLanguage, changeMedia, createFilter, removeFilter, selectProtocol, resetFilters } from 'soapbox/reducers/search-filter.ts'; import { AppDispatch, RootState } from 'soapbox/store.ts'; import toast from 'soapbox/toast.tsx'; @@ -27,6 +27,7 @@ const messages = defineMessages({ language: { id: 'column.explorer.filters.language', defaultMessage: 'Language:' }, platforms: { id: 'column.explorer.filters.platforms', defaultMessage: 'Platforms:' }, createYourFilter: { id: 'column.explorer.filters.create_your_filter', defaultMessage: 'Create your filter' }, + filterPersistence: { id: 'column.explorer.filters.filter_persistence', defaultMessage: 'Filter persistence:' }, filterByWords: { id: 'column.explorer.filters.filter_by_words', defaultMessage: 'Filter by this/these words' }, include: { id: 'column.explorer.filters.include', defaultMessage: 'Include' }, exclude: { id: 'column.explorer.filters.exclude', defaultMessage: 'Exclude' }, @@ -163,6 +164,38 @@ const PlatformFilters = () => { }; +const PersistentFilter = () => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + const filters = useAppSelector((state) => state.search_filter); + + + const handleSalveFilter = () => { + localStorage.setItem('reduxFilterState', JSON.stringify(filters)); + }; + + const handleReset = () => { + dispatch(resetFilters()); + localStorage.removeItem('reduxFilterState'); + }; + + + return ( + + + {intl.formatMessage(messages.filterPersistence)} + + + + - @@ -427,4 +460,4 @@ const generateFilter = (dispatch: AppDispatch, { name, status }: IGenerateFilter ); }; -export { CreateFilter, PlatformFilters, MediaFilter, LanguageFilter, ToggleRepliesFilter, generateFilter }; \ No newline at end of file +export { CreateFilter, PersistentFilter, PlatformFilters, MediaFilter, LanguageFilter, ToggleRepliesFilter, generateFilter }; \ No newline at end of file diff --git a/src/locales/en.json b/src/locales/en.json index 8692ce597..b8a7f0dfc 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -378,6 +378,7 @@ "column.explorer.filters.exclude": "Exclude", "column.explorer.filters.fediverse": "Fediverse", "column.explorer.filters.filter_by_words": "Filter by this/these words", + "column.explorer.filters.filter_persistence": "Filter persistence:", "column.explorer.filters.include": "Include", "column.explorer.filters.language": "Language:", "column.explorer.filters.language.default": "Global", diff --git a/src/store.ts b/src/store.ts index 0606e5108..323939718 100644 --- a/src/store.ts +++ b/src/store.ts @@ -7,8 +7,21 @@ import appReducer from './reducers/index.ts'; import type { AnyAction } from 'redux'; +const loadState = () => { + try { + const savedState = localStorage.getItem('reduxFilterState'); + return savedState ? JSON.parse(savedState) : undefined; + } catch (error) { + console.error('Failed to load state:', error); + return undefined; + } +}; + +const preloadedState = { ...loadState() ? { search_filter: loadState() } : {} }; + export const store = configureStore({ reducer: appReducer, + preloadedState, middleware: () => new Tuple( thunk, errorsMiddleware(),