feat(game): 优化界面组件

- 在国际化文件中添加钱包流水相关翻译项
- 在用户个人资料页面添加复制邀请链接功能
- 优化桌面端动物组件的视觉效果和动画参数
- 添加虚拟滚动功能到财务记录标签页提升性能
- 为桌面端控制面板添加投注数量调节按钮
- 更新消息模态框为通知列表和详情展示
- 在头部余额显示旁添加充值图标入口
This commit is contained in:
JiaJun
2026-05-28 11:34:02 +08:00
parent 2b2b86a73d
commit dbfe5701aa
130 changed files with 1357 additions and 597 deletions

View File

@@ -24,12 +24,23 @@ interface NotificationStoreState {
closingDialogId: string | null
dialogQueue: NotificationDialog[]
dismissDialog: (id?: string) => void
pushDialog: (dialog: NotificationDialog) => void
pushDialog: (dialog: NotificationDialog) => string
}
const dialogTimers = new Map<string, number>()
const dialogExitTimers = new Map<string, number>()
function isSameDialog(
firstDialog: NotificationDialog,
secondDialog: NotificationDialog,
) {
return (
firstDialog.type === secondDialog.type &&
firstDialog.message === secondDialog.message &&
(firstDialog.description ?? '') === (secondDialog.description ?? '')
)
}
function clearDialogTimer(id: string) {
const timerId = dialogTimers.get(id)
@@ -129,6 +140,8 @@ export const useNotificationStore = create<NotificationStoreState>()((set) => ({
})
},
pushDialog: (dialog) => {
let dialogId = dialog.id
set((state) => {
if (!state.activeDialog) {
clearDialogExitTimer(dialog.id)
@@ -140,6 +153,42 @@ export const useNotificationStore = create<NotificationStoreState>()((set) => ({
}
}
if (isSameDialog(state.activeDialog, dialog)) {
dialogId = state.activeDialog.id
clearDialogExitTimer(state.activeDialog.id)
scheduleDialogDismiss(state.activeDialog.id, dialog.duration)
return {
activeDialog: {
...state.activeDialog,
duration: dialog.duration,
},
closingDialogId: null,
dialogQueue: state.dialogQueue.filter(
(item) => !isSameDialog(item, dialog),
),
}
}
const queuedDialog = state.dialogQueue.find((item) =>
isSameDialog(item, dialog),
)
if (queuedDialog) {
dialogId = queuedDialog.id
return {
dialogQueue: state.dialogQueue.map((item) =>
item.id === queuedDialog.id
? {
...item,
duration: dialog.duration,
}
: item,
),
}
}
return {
dialogQueue: [
...state.dialogQueue.filter((item) => item.id !== dialog.id),
@@ -147,6 +196,8 @@ export const useNotificationStore = create<NotificationStoreState>()((set) => ({
],
}
})
return dialogId
},
}))
@@ -162,15 +213,13 @@ function showToast(
const id = createToastId()
const duration = options?.duration ?? DEFAULT_ALERT_DURATION_MS
useNotificationStore.getState().pushDialog({
return useNotificationStore.getState().pushDialog({
description: options?.description,
duration,
id,
message,
type,
})
return id
}
export const notify = {