feat: 将书架跳转加入用户的下拉菜单

This commit is contained in:
naiy committed 2026-07-31 04:07:23 +08:00
1 parent cbb2006e47
commit 6294b47c32
2 files changed
+32 -3

No files matched your search

+15
View File
@@ -0,0 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.2"
stroke-linecap="round"
stroke-linejoin="round">
<path d="M3.5 20h17"/>
<rect x="5" y="7" width="3.5" height="13" rx="0.8"/>
<rect x="8.5" y="5" width="4" height="15" rx="0.8"/>
<path d="M15.1 6.2 18 5.5l3.1 13.6-2.9.7z"/>
<path d="M9.8 8h1.4M6.1 10h1.3M17 8.8l1.3-.3"/>
</svg>

After

Width:  |  Height:  |  Size: 462 B

+17 -3
View File
@@ -1,5 +1,6 @@
import { getDetailedUserInfo, userState } from '../api/user' import { getDetailedUserInfo, userState } from '../api/user'
import type { HookConfig } from '../config' import type { HookConfig } from '../config'
import bookshelf from '../assets/bookshelf.svg?raw'
function formatReadingTime(readBookTime: bigint): string { function formatReadingTime(readBookTime: bigint): string {
let minutes = readBookTime / 60_000n let minutes = readBookTime / 60_000n
@@ -8,7 +9,7 @@ function formatReadingTime(readBookTime: bigint): string {
return `${hours} 时 ${minutes} 分` return `${hours} 时 ${minutes} 分`
} }
function createMenuItem(text: string): HTMLDivElement { function createMenuItem(text: string, icon?: string, onclick?: () => void): HTMLDivElement {
// <div tabindex="0" // <div tabindex="0"
// role="menuitem" // role="menuitem"
// class="arco-menu-item serial-menu-item slogin-user-avatar__menu-item-wrapper" // class="arco-menu-item serial-menu-item slogin-user-avatar__menu-item-wrapper"
@@ -22,11 +23,20 @@ function createMenuItem(text: string): HTMLDivElement {
item.classList.add('fqa-menu-item', 'arco-menu-item', 'serial-menu-item', 'slogin-user-avatar__menu-item-wrapper') item.classList.add('fqa-menu-item', 'arco-menu-item', 'serial-menu-item', 'slogin-user-avatar__menu-item-wrapper')
const inner1 = document.createElement('div') const inner1 = document.createElement('div')
inner1.classList.add('slogin-user-avatar__menu-item') inner1.classList.add('slogin-user-avatar__menu-item')
if (icon) {
const iconDiv = document.createElement('div')
iconDiv.classList.add('slogin-user-avatar__menu-item__icon')
iconDiv.innerHTML = icon
inner1.appendChild(iconDiv)
}
const inner2 = document.createElement('div') const inner2 = document.createElement('div')
inner2.classList.add('slogin-user-avatar__menu-item__content') inner2.classList.add('slogin-user-avatar__menu-item__content')
inner2.textContent = text inner2.textContent = text
inner1.appendChild(inner2) inner1.appendChild(inner2)
item.appendChild(inner1) item.appendChild(inner1)
if (onclick) {
item.addEventListener('click', onclick)
}
return item return item
} }
@@ -48,6 +58,10 @@ async function mainHook(_previous?: string): Promise<void> {
menuInner.insertAdjacentElement('afterbegin', firstDiv) menuInner.insertAdjacentElement('afterbegin', firstDiv)
const secondDiv = createMenuItem(formatReadingTime(userInfo.read_book_time ?? 0n)) const secondDiv = createMenuItem(formatReadingTime(userInfo.read_book_time ?? 0n))
firstDiv.insertAdjacentElement('afterend', secondDiv) firstDiv.insertAdjacentElement('afterend', secondDiv)
const thirdDiv = createMenuItem('我的书架', bookshelf, () => {
window.open('https://fanqienovel.com/bookshelf', '_blank')
})
secondDiv.insertAdjacentElement('afterend', thirdDiv)
} }
const scan = (root: HTMLElement) => { const scan = (root: HTMLElement) => {
@@ -75,8 +89,8 @@ async function mainHook(_previous?: string): Promise<void> {
scan(document.body) scan(document.body)
} }
function filter(_path: string, _query: URLSearchParams, _hash: string): boolean { function filter(path: string, _query: URLSearchParams, _hash: string): boolean {
return userState.isLogin return userState.isLogin && !path.startsWith('/writer') && !path.startsWith('/welfare')
} }
const _exports: HookConfig[] = [ const _exports: HookConfig[] = [