89dafd4886
## 改动内容 - 新增邀请提现审核页,并与其他提现共用审核组件 - 完善筛选、状态统计、详情、邀请用户信息、风险提示和时间线 - 按订单状态展示微信转账单号和真实失败原因 - 支持高风险标记、取消标记和备注维护 - 优化用户管理及提现列表的列宽、固定操作列和横向滚动 - 移除提现实名、账本校验和人工处理超时订单入口 ## 验证 - npm run build:通过 - npx tsc --noEmit:通过 ## 说明 - 本地设计记录与 mock 数据未提交 --------- Co-authored-by: guke <guke@wonderable.ai> Co-authored-by: linkeyu <798648091@qq.com> Reviewed-on: #75 Co-authored-by: linkeyu <linkeyu@wonderable.ai> Co-committed-by: linkeyu <linkeyu@wonderable.ai>
82 lines
1.8 KiB
TypeScript
82 lines
1.8 KiB
TypeScript
'use client';
|
|
|
|
import { useEffect, useState } from 'react';
|
|
import { App, Input, Modal } from 'antd';
|
|
import { api, errMsg } from '@/lib/api';
|
|
|
|
export type RiskUser = {
|
|
id: number;
|
|
phone: string;
|
|
is_high_risk: boolean;
|
|
high_risk_note: string | null;
|
|
};
|
|
|
|
type Props = {
|
|
user: RiskUser | null;
|
|
open: boolean;
|
|
onClose: () => void;
|
|
onDone: () => void | Promise<void>;
|
|
};
|
|
|
|
export function UserRiskModal({ user, open, onClose, onDone }: Props) {
|
|
const { message } = App.useApp();
|
|
const [note, setNote] = useState('');
|
|
const [saving, setSaving] = useState(false);
|
|
|
|
useEffect(() => {
|
|
if (open) setNote(user?.high_risk_note ?? '');
|
|
}, [open, user]);
|
|
|
|
const save = async () => {
|
|
if (!user) return;
|
|
const trimmed = note.trim();
|
|
if (!trimmed) {
|
|
message.warning('请输入标记为高风险的原因');
|
|
return;
|
|
}
|
|
setSaving(true);
|
|
try {
|
|
await api.post(`/admin/api/users/${user.id}/risk`, {
|
|
is_high_risk: true,
|
|
note: trimmed,
|
|
});
|
|
message.success(user.is_high_risk ? '高风险备注已更新' : '已标记为高风险');
|
|
await onDone();
|
|
onClose();
|
|
} catch (error) {
|
|
message.error(errMsg(error));
|
|
} finally {
|
|
setSaving(false);
|
|
}
|
|
};
|
|
|
|
return (
|
|
<Modal
|
|
title="高风险备注"
|
|
open={open}
|
|
okText="保存"
|
|
confirmLoading={saving}
|
|
onOk={save}
|
|
onCancel={onClose}
|
|
destroyOnHidden
|
|
>
|
|
<Input.TextArea
|
|
autoFocus
|
|
rows={5}
|
|
maxLength={500}
|
|
showCount
|
|
value={note}
|
|
placeholder="请输入标记为高风险的原因"
|
|
onChange={(event) => setNote(event.target.value)}
|
|
/>
|
|
</Modal>
|
|
);
|
|
}
|
|
|
|
export async function clearUserRisk(userId: number) {
|
|
await api.post(`/admin/api/users/${userId}/risk`, {
|
|
is_high_risk: false,
|
|
note: null,
|
|
});
|
|
}
|