feat(home): redesign boards list to match 4chan with filtering and catalog support

This commit is contained in:
plebeius
2025-11-05 19:50:31 +01:00
parent e40eb5312b
commit a9690ac0be
7 changed files with 464 additions and 173 deletions
+51
View File
@@ -0,0 +1,51 @@
import { create } from 'zustand';
export type BoardFilter = 'all' | 'nsfw' | 'worksafe';
interface BoardsFilterStore {
useCatalogLinks: boolean;
setUseCatalogLinks: (value: boolean) => void;
boardFilter: BoardFilter;
setBoardFilter: (value: BoardFilter) => void;
}
const getStoredUseCatalogLinks = (): boolean => {
try {
const stored = localStorage.getItem('5chan-boards-use-catalog');
return stored === 'true';
} catch {
return false;
}
};
const getStoredBoardFilter = (): BoardFilter => {
try {
const stored = localStorage.getItem('5chan-boards-filter') as BoardFilter;
return stored === 'nsfw' || stored === 'worksafe' ? stored : 'all';
} catch {
return 'all';
}
};
const useBoardsFilterStore = create<BoardsFilterStore>((set) => ({
useCatalogLinks: getStoredUseCatalogLinks(),
setUseCatalogLinks: (value: boolean) => {
set({ useCatalogLinks: value });
try {
localStorage.setItem('5chan-boards-use-catalog', value.toString());
} catch (error) {
console.warn('Failed to save useCatalogLinks to localStorage:', error);
}
},
boardFilter: getStoredBoardFilter(),
setBoardFilter: (value: BoardFilter) => {
set({ boardFilter: value });
try {
localStorage.setItem('5chan-boards-filter', value);
} catch (error) {
console.warn('Failed to save boardFilter to localStorage:', error);
}
},
}));
export default useBoardsFilterStore;
+1 -1
View File
@@ -1,7 +1,7 @@
import { create } from 'zustand';
import { NavigateFunction } from 'react-router-dom';
const DISCLAIMER_ACCEPTED_KEY = '5chan-disclaimer-accepted';
export const DISCLAIMER_ACCEPTED_KEY = '5chan-disclaimer-accepted';
interface DisclaimerModalState {
showModal: boolean;