feat: 实现 Socket 触发的智能列表自动刷新功能(带防抖)

核心改动:
- 扩展 NotificationContext,添加事件更新回调注册机制
- VirtualizedFourRowGrid 添加 forwardRef 暴露 getScrollPosition 方法
- DynamicNewsCard 实现智能刷新逻辑(根据模式和滚动位置判断是否刷新)
- Community 页面注册 Socket 回调自动触发刷新
- 创建 TypeScript 通用防抖工具函数(debounce.ts)
- 集成防抖机制(2秒延迟),避免短时间内频繁请求

智能刷新策略:
- 纵向模式 + 第1页:自动刷新列表
- 纵向模式 + 其他页:不刷新(避免打断用户)
- 平铺模式 + 滚动在顶部:自动刷新列表
- 平铺模式 + 滚动不在顶部:仅显示 Toast 提示

防抖效果:
- 短时间内收到多个新事件,只执行最后一次刷新
- 减少服务器压力,提升用户体验

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
zdl
2025-11-14 19:04:00 +08:00
parent 9fd618c087
commit ddd6b2d4af
7 changed files with 382 additions and 9 deletions

View File

@@ -38,3 +38,21 @@ export const TOAST_CONFIG = {
DURATION_ERROR: 3000, // 错误提示持续时间(毫秒)
DURATION_WARNING: 2000, // 警告提示持续时间(毫秒)
};
// ========== Socket 刷新防抖配置 ==========
/**
* Socket 新事件刷新防抖延迟(毫秒)
*
* 作用:避免短时间内收到多个新事件时频繁刷新列表
*
* 场景示例:
* - 第 1 秒:收到新事件 → 延迟 2 秒刷新
* - 第 2 秒:收到新事件 → 取消上次,重新延迟 2 秒
* - 第 3 秒:收到新事件 → 取消上次,重新延迟 2 秒
* - 第 5 秒:触发刷新 → 只发送 1 次 API 请求
*
* 推荐值2000ms (2 秒)
* - 太短(如 500ms→ 仍可能触发多次刷新
* - 太长(如 5000ms→ 用户感知延迟过高
*/
export const REFRESH_DEBOUNCE_DELAY = 2000;