From b49dd448c104c503ae5a2cc41175ff5c737d97fa Mon Sep 17 00:00:00 2001 From: SocioWire Date: Sun, 11 Jan 2026 02:57:42 +0000 Subject: [PATCH] Content filters + SocioWall header + localStorage persistence MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add shared ContentFilters component (Links, Video, Photos, Blogs, Live, Events) - Server-side content_type filtering via reco-service - SocioWall business-style header inside panel - Save filter preferences to localStorage - Theme-aware filter bar (blue/dark/light themes) πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- src/App.jsx | 37 +++- src/api/client.js | 4 +- src/components/Chat/ChatContainer.css | 5 +- src/components/Filters/ContentFilters.css | 169 +++++++++++++++++ src/components/Filters/ContentFilters.jsx | 55 ++++++ src/components/Map/MapView.jsx | 220 ++++++++++++---------- src/components/Map/usePostsEngine.js | 27 ++- src/components/Posts/PostList.jsx | 69 +++---- src/locales/en/translation.json | 3 + src/locales/es/translation.json | 3 + src/locales/fr/translation.json | 3 + src/styles/layout.css | 52 +---- src/styles/map.css | 4 +- src/styles/posts.css | 97 ++++++++-- src/styles/theme.css | 14 +- 15 files changed, 532 insertions(+), 230 deletions(-) create mode 100644 src/components/Filters/ContentFilters.css create mode 100644 src/components/Filters/ContentFilters.jsx diff --git a/src/App.jsx b/src/App.jsx index 628397a..9f0ab54 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -2,6 +2,7 @@ import React, { Suspense, useEffect, useState, useCallback } from "react"; import { useTranslation } from "react-i18next"; import TopBar from "./components/Layout/TopBar"; import PostList from "./components/Posts/PostList"; +import ContentFilters from "./components/Filters/ContentFilters"; import IslandUniverse from "./components/Island/IslandUniverse"; import IslandViewer from "./components/Island/IslandViewer"; import ChatContainer from "./components/Chat/ChatContainer"; @@ -10,6 +11,7 @@ import { fetchIslandByUsername } from "./api/client"; const MapView = React.lazy(() => import("./components/Map/MapView")); const THEME_KEY = "sociowire:theme"; +const CONTENT_FILTER_KEY = "sociowire:contentFilter"; export default function App() { const { t } = useTranslation(); @@ -21,10 +23,30 @@ export default function App() { const [wallError, setWallError] = useState(""); const [selectedPost, setSelectedPost] = useState(null); + // Content filter (shared between map and sociowall) - persisted + // "all" | "links" | "video" | "image" | "text" | "live" | "event" + const [contentFilter, setContentFilter] = useState(() => { + try { + const saved = localStorage.getItem(CONTENT_FILTER_KEY); + if (saved && ["all", "links", "video", "image", "text", "live", "event"].includes(saved)) { + return saved; + } + } catch {} + return "all"; + }); + + // Save content filter to localStorage + useEffect(() => { + try { + localStorage.setItem(CONTENT_FILTER_KEY, contentFilter); + } catch {} + }, [contentFilter]); + // Island Universe & Island Viewer state const [showUniverse, setShowUniverse] = useState(false); const [selectedIsland, setSelectedIsland] = useState(null); + const handlePostsState = useCallback((next) => { if (!next) return; if (Array.isArray(next.posts)) setWallPosts(next.posts); @@ -158,6 +180,7 @@ export default function App() { > + {/* Content filters - shared between map and sociowall */} +
-
SOCIOWALL
+ {/* SocioWall header inside panel */} +
+

SOCIOWALL

+
- {/* CHAT PANEL SUPPRIMÉ */}
@@ -209,7 +240,7 @@ export default function App() {