feat: 完成头像上传、站点主题配置与UI优化
- 新增附件模型与上传服务,拆分头像上传/管理逻辑 - 重构用户资料接口,移除直接修改头像字段,改用专用上传接口 - 添加站点公开设置API与管理员外观配置页 - 全局替换hover背景为accent-soft,优化交互一致性 - 完善头像组件,支持图片加载失败回退与src更新重置 - 新增用户状态事件总线,解决同页头像更新不及时问题 - 调整依赖包顺序与CI依赖版本 - 重构板块列表接口,新增帖子计数 - 迁移账号设置到用户主页tab,合并重复代码
This commit is contained in:
29
frontend/lib/userEvents.ts
Normal file
29
frontend/lib/userEvents.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
import type { User } from "./api";
|
||||
|
||||
/**
|
||||
* 全局用户状态事件总线。
|
||||
*
|
||||
* 背景:Header 等客户端组件挂载在持久化的 root layout 上,仅靠
|
||||
* router.refresh() 刷新 props 在上传/删除头像等场景下存在时序与
|
||||
* Router Cache 的不确定性。同页内的数据更新必须走显式的状态链路
|
||||
* (React 状态/事件),storage 事件、轮询等方案对本标签页无效。
|
||||
*
|
||||
* 任意位置修改了当前用户资料后 dispatch 一个补丁,Header 等订阅方
|
||||
* 立即合并更新;router.refresh() 仍照常调用,负责校正服务端渲染区域。
|
||||
*/
|
||||
export const USER_UPDATED_EVENT = "j13:user-updated";
|
||||
|
||||
export function emitUserUpdate(patch: Partial<User>): void {
|
||||
if (typeof window === "undefined") return;
|
||||
window.dispatchEvent(new CustomEvent(USER_UPDATED_EVENT, { detail: patch }));
|
||||
}
|
||||
|
||||
export function onUserUpdate(handler: (patch: Partial<User>) => void): () => void {
|
||||
if (typeof window === "undefined") return () => {};
|
||||
const listener = (e: Event) => {
|
||||
const detail = (e as CustomEvent<Partial<User>>).detail;
|
||||
if (detail) handler(detail);
|
||||
};
|
||||
window.addEventListener(USER_UPDATED_EVENT, listener);
|
||||
return () => window.removeEventListener(USER_UPDATED_EVENT, listener);
|
||||
}
|
||||
Reference in New Issue
Block a user