From 6193e57a19478c7406da1512d9953a8ddc6870a6 Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Tue, 21 Jul 2026 01:36:26 +0200 Subject: [PATCH] Add button to open random library entry closes #1005 --- CHANGELOG.md | 1 + .../library/components/LibraryToolbarMenu.tsx | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31010d3f..842aa5bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). - (**Reader**) Add auto background color setting - (**Library**) Add source filter - (**Library**) Add random sort option to library +- (**Library**) Add button to open random library entry ### Changed diff --git a/src/features/library/components/LibraryToolbarMenu.tsx b/src/features/library/components/LibraryToolbarMenu.tsx index d17aa5d6..56b8e7c8 100644 --- a/src/features/library/components/LibraryToolbarMenu.tsx +++ b/src/features/library/components/LibraryToolbarMenu.tsx @@ -14,6 +14,15 @@ import { useLingui } from '@lingui/react/macro'; import { CustomTooltip } from '@/base/components/CustomTooltip.tsx'; import { LibraryOptionsPanel } from '@/features/library/components/LibraryOptionsPanel.tsx'; import { getCategoryMetadata } from '@/features/category/services/CategoryMetadata.ts'; +import ShuffleIcon from '@mui/icons-material/Shuffle'; +import { requestManager } from '@/lib/requests/RequestManager.ts'; +import type { GetMangasBaseQuery, GetMangasBaseQueryVariables } from '@/lib/graphql/generated/graphql.ts'; +import { GET_MANGAS_BASE } from '@/lib/graphql/manga/MangaQuery.ts'; +import { makeToast } from '@/base/utils/Toast.ts'; +import { getErrorMessage } from '@/lib/HelperFunctions.ts'; +import { ReactRouter } from '@/lib/react-router/ReactRouter.ts'; +import { AppRoutes } from '@/base/AppRoute.constants.ts'; +import { assertIsDefined } from '@/base/Asserts.ts'; export const LibraryToolbarMenu = ({ category, @@ -36,6 +45,34 @@ export const LibraryToolbarMenu = ({ return ( <> + + { + try { + const mangasResponse = await requestManager.getMangas< + GetMangasBaseQuery, + GetMangasBaseQueryVariables + >(GET_MANGAS_BASE, { + condition: { inLibrary: true }, + }).response; + + const randomManga = + mangasResponse.data?.mangas.nodes[ + Math.floor(Math.random() * mangasResponse.data?.mangas.totalCount) + ]; + + assertIsDefined(randomManga); + + ReactRouter.navigate(AppRoutes.manga.path(randomManga.id)); + } catch (e) { + makeToast(t`Could not open random entry`, 'error', getErrorMessage(e)); + } + }} + color={active ? 'warning' : 'inherit'} + > + + + setOpen(!open)} color={active ? 'warning' : 'inherit'}>