From 107d9d474c19c8b8853c341e85d00c66afcb9931 Mon Sep 17 00:00:00 2001 From: Rodrigo Verdiani Date: Thu, 9 Apr 2026 17:52:01 -0300 Subject: [PATCH] feat: add adult content filter and display in manga components --- src/api/generated/api.schemas.ts | 5 ++++- src/contexts/UIStateContext.tsx | 8 ++++++++ src/features/home/components/MangaCard.tsx | 10 +++++++++- src/pages/Home.tsx | 1 + src/pages/Manga.tsx | 8 ++++++++ 5 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/api/generated/api.schemas.ts b/src/api/generated/api.schemas.ts index 01ea4b0..8ef277f 100644 --- a/src/api/generated/api.schemas.ts +++ b/src/api/generated/api.schemas.ts @@ -222,9 +222,9 @@ export interface PageMangaImportJobDTO { export interface PageableObject { offset?: number; - paged?: boolean; pageNumber?: number; pageSize?: number; + paged?: boolean; unpaged?: boolean; sort?: SortObject; } @@ -266,6 +266,7 @@ export interface MangaListDTO { authors: string[]; score: number; favorite: boolean; + adult: boolean; } export interface PageMangaListDTO { @@ -318,6 +319,7 @@ export interface MangaDTO { chapterCount: number; favorite: boolean; following: boolean; + adult: boolean; } export interface MangaProviderDTO { @@ -419,6 +421,7 @@ genreIds?: number[]; statuses?: string[]; userFavorites?: boolean; score?: number; +adult?: boolean; /** * Zero-based page index (0..N) * @minimum 0 diff --git a/src/contexts/UIStateContext.tsx b/src/contexts/UIStateContext.tsx index d60664b..7c4361a 100644 --- a/src/contexts/UIStateContext.tsx +++ b/src/contexts/UIStateContext.tsx @@ -3,10 +3,12 @@ import { type ReactNode, useCallback, useContext, + useEffect, useMemo, useState, } from "react"; import type { SortOption } from "@/features/home/components/SortDropdown.tsx"; +import { useAuth } from "./AuthContext.tsx"; interface UIStateContextType { /* Home Filter State */ @@ -42,6 +44,8 @@ interface UIStateContextType { const UIStateContext = createContext(undefined); export const UIStateProvider = ({ children }: { children: ReactNode }) => { + const { isAuthenticated } = useAuth(); + /* Home Filter State */ const [currentPage, setCurrentPage] = useState(1); const [selectedGenres, setSelectedGenres] = useState([]); @@ -53,6 +57,10 @@ export const UIStateProvider = ({ children }: { children: ReactNode }) => { const [searchText, setSearchText] = useState(""); const [isSidebarOpen, setIsSidebarOpen] = useState(true); + useEffect(() => { + setShowAdultContent(isAuthenticated); + }, [isAuthenticated]); + /* Manga Provider Card State */ const [expandedProviderIds, setExpandedProviderIds] = useState([]); diff --git a/src/features/home/components/MangaCard.tsx b/src/features/home/components/MangaCard.tsx index 60af2a6..6b32389 100644 --- a/src/features/home/components/MangaCard.tsx +++ b/src/features/home/components/MangaCard.tsx @@ -102,13 +102,21 @@ export const MangaCard = ({ manga, queryKey }: MangaCardProps) => { isImageLoading ? "opacity-0" : "opacity-100", )} /> -
+
{manga.status} + {manga.adult && ( + + 18+ + + )}
diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx index c935e49..bdc1bd4 100644 --- a/src/pages/Home.tsx +++ b/src/pages/Home.tsx @@ -56,6 +56,7 @@ const Home = () => { genreIds: selectedGenres, userFavorites, score: minRating, + adult: showAdultContent, }); const isFiltersDisabled = isFetching; diff --git a/src/pages/Manga.tsx b/src/pages/Manga.tsx index 4b150c0..976b24c 100644 --- a/src/pages/Manga.tsx +++ b/src/pages/Manga.tsx @@ -277,6 +277,14 @@ const Manga = () => { > {mangaData.data?.status} + {mangaData.data?.adult && ( + + 18+ + + )} {isAuthenticated && ( <>