From ce3baee8f1b63d77bc9d5ce22316de1819cf20ae Mon Sep 17 00:00:00 2001 From: truewhile <62226914+truewhile@users.noreply.github.com> Date: Fri, 2 Oct 2026 23:54:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/App.tsx | 3 + web/src/pages/reader/ReaderAudioPanel.tsx | 359 ++----------- web/src/pages/reader/ReaderMiniPlayer.tsx | 74 +++ web/src/pages/reader/ReaderViewPage.tsx | 92 ++-- web/src/pages/reader/readerAudioEngine.ts | 611 ++++++++++++++++++++++ web/src/stores/readerAudio.ts | 69 +++ 6 files changed, 850 insertions(+), 358 deletions(-) create mode 100644 web/src/pages/reader/ReaderMiniPlayer.tsx create mode 100644 web/src/pages/reader/readerAudioEngine.ts create mode 100644 web/src/stores/readerAudio.ts diff --git a/web/src/App.tsx b/web/src/App.tsx index 8956856..57a04d6 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -4,6 +4,7 @@ import { Navigate, Route, Routes } from 'react-router-dom' import { appRoutes, type AppRoute } from './appRoutes' import { Layout } from './components/Layout' import { RequireAdmin, RequireAuth } from './components/RequireAuth' +import { ReaderMiniPlayer } from './pages/reader/ReaderMiniPlayer' const LoginPage = lazy(() => import('./pages/LoginPage').then((m) => ({ default: m.LoginPage }))) const ReaderRoutes = lazy(() => import('./pages/reader/ReaderRoutes').then((m) => ({ default: m.default }))) @@ -93,6 +94,8 @@ export default function App() { } /> + {/* 听书迷你条:播放引擎常驻,离开阅读页后仍可从这里控制 */} + ) diff --git a/web/src/pages/reader/ReaderAudioPanel.tsx b/web/src/pages/reader/ReaderAudioPanel.tsx index ff37f13..836e82f 100644 --- a/web/src/pages/reader/ReaderAudioPanel.tsx +++ b/web/src/pages/reader/ReaderAudioPanel.tsx @@ -1,28 +1,12 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' -import toast from 'react-hot-toast' -import { - ChevronLeft, - ChevronRight, - Gauge, - ListMusic, - Loader2, - Pause, - Play, - Scissors, - Timer, - X, -} from 'lucide-react' +import { ChevronLeft, ChevronRight, Gauge, ListMusic, Loader2, Pause, Play, Scissors, Timer, X } from 'lucide-react' import { Virtuoso, type VirtuosoHandle } from 'react-virtuoso' -import type { ReaderChapter } from '../../api/reader' -import { - AUDIO_CREDITS_MAX, - AUDIO_SPEEDS, - AUDIO_TIMERS, - useReaderSettingsStore, -} from '../../stores/readerSettings' +import { useReaderAudioStore } from '../../stores/readerAudio' +import { AUDIO_CREDITS_MAX, AUDIO_SPEEDS, AUDIO_TIMERS } from '../../stores/readerSettings' import { buildChapterGroups, chapterGroupIndexOf } from '../../utils/chapterGroups' import { readerCoverSrc } from '../../utils/readerCover' +import { getReaderAudioEngine } from './readerAudioEngine' // 音频播放面板(仿 legado AudioPlayActivity / AudioPlayService transport 行): // hls.js 播 m3u8,