- 前台列表/详情/标签页标签统一 antd Tag;标签页改 CheckableTagGroup 单选 (选中态由组件承接,再点已选标签回到全部);移除首页标签筛选条, 标签入口收敛至顶部「标签」页 - 公开列表新增 cover 字段(取正文第一张站内图,store.FirstImageRef), 首页条目左侧显示封面缩略图,无图条目保持纯文字 - favicon 随站点 Logo:webui.Meta.Icon 服务端注入 index.html, 前端 useSiteTitle 兜底(dev 模板占位符场景)并即时生效; 设置页「重置默认」清空 Logo 后回退内置 /favicon.svg - 后台侧栏改 antd Menu(inline 分组),宽度 256→208、窄侧栏档 224→184
36 lines
1.2 KiB
TypeScript
36 lines
1.2 KiB
TypeScript
import { useEffect } from 'react'
|
|
import { useQuery } from '@tanstack/react-query'
|
|
import { api } from '../lib/api'
|
|
import type { SiteSettings } from '../lib/api'
|
|
|
|
export function useSiteTitle() {
|
|
const { data } = useQuery({
|
|
queryKey: ['site'],
|
|
queryFn: () => api<SiteSettings>('/api/site'),
|
|
staleTime: 5 * 60_000,
|
|
})
|
|
|
|
// favicon 随站点 Logo:生产由服务端注入 index.html,此处兜底(dev 模板占位符
|
|
// 不会被渲染)并保证设置变更后 SPA 内即时生效
|
|
useEffect(() => {
|
|
const link = document.querySelector<HTMLLinkElement>('link[rel="icon"]')
|
|
if (link) link.href = data?.site_logo || '/favicon.svg'
|
|
}, [data?.site_logo])
|
|
|
|
return { data }
|
|
}
|
|
|
|
/**
|
|
* 设置浏览器标签页标题。
|
|
* - 生产环境首帧由服务端注入首页标题;SPA 路由切换后由此 hook 接管。
|
|
* - dev 环境 index.html 占位符 `{{.Title}}` 也依赖此 hook 替换。
|
|
* pageTitle 缺省时仅显示站点名。
|
|
*/
|
|
export function useDocumentTitle(pageTitle?: string) {
|
|
const { data } = useSiteTitle()
|
|
const siteName = data?.site_title ?? 'Pure Note'
|
|
useEffect(() => {
|
|
document.title = pageTitle ? `${pageTitle} · ${siteName}` : siteName
|
|
}, [pageTitle, siteName])
|
|
}
|