feat: add phone frequency controls and modularize codebase

This commit is contained in:
hectorzhao
2026-07-31 22:25:23 +08:00
parent 0af671b4ed
commit ca4f591a13
216 changed files with 41579 additions and 23694 deletions
+25 -23
View File
@@ -1,7 +1,7 @@
import { useEffect, useMemo, useState } from 'react';
import {
BadgeCheck,
BellRing,
ClipboardList,
FileText,
PenLine,
Plus,
@@ -66,10 +66,10 @@ export function ClientHome() {
const sendTrendOption = useMemo(
() => createLineOption({
labels: ['今日'],
labels: dashboard?.hourlySendTrend.map((item) => item.label) ?? [],
series: [
{ name: '提交量', data: [dashboard?.today.sent ?? 0] },
{ name: '成功量', data: [dashboard?.today.delivered ?? 0] },
{ name: '提交量', data: dashboard?.hourlySendTrend.map((item) => item.submittedCount) ?? [] },
{ name: '成功量', data: dashboard?.hourlySendTrend.map((item) => item.successCount) ?? [] },
],
}),
[dashboard],
@@ -134,12 +134,12 @@ export function ClientHome() {
<button className="quick-action" onClick={() => navigate('/client/templates')} type="button">
<FileText size={20} />
<span></span>
<small></small>
<small></small>
</button>
<button className="quick-action" onClick={() => navigate('/client/signatures')} type="button">
<PenLine size={20} />
<span></span>
<small></small>
<small></small>
</button>
<button className="quick-action" onClick={() => navigate('/client/billing')} type="button">
<WalletCards size={20} />
@@ -155,16 +155,18 @@ export function ClientHome() {
<h2></h2>
<p className="muted"></p>
</div>
<Tag tone={account?.status === 'active' ? 'success' : 'warning'}>{account?.status ?? '未知'}</Tag>
<Tag tone={dashboard?.clientOverview?.certificationStatus === 'certified' ? 'success' : 'warning'}>
{dashboard?.clientOverview?.certificationStatus === 'certified' ? '已认证' : '未认证'}
</Tag>
</div>
<div className="summary-list">
<div>
<span></span>
<strong>{account?.tenant?.name ?? account?.tenantId ?? '当前租户'}</strong>
<strong>{dashboard?.clientOverview?.enterpriseName ?? account?.tenant?.name ?? '企业信息未完善'}</strong>
</div>
<div>
<span></span>
<strong> API </strong>
<span></span>
<strong>{dashboard?.clientOverview?.signatureCount ?? 0} </strong>
</div>
<div>
<span></span>
@@ -184,36 +186,36 @@ export function ClientHome() {
</div>
<div className="overview-grid overview-grid--three">
<div className="surface mini-status-card">
<button className="surface mini-status-card mini-status-card--action" onClick={() => navigate('/client/templates')} type="button">
<BadgeCheck size={22} />
<div>
<span></span>
<strong>{dashboard?.pendingAuditCount ?? 0} </strong>
<strong>{dashboard?.pendingAudits.templates ?? 0} </strong>
<small></small>
</div>
</div>
<div className="surface mini-status-card">
</button>
<button className="surface mini-status-card mini-status-card--action" onClick={() => navigate('/client/signatures')} type="button">
<PenLine size={22} />
<div>
<span></span>
<strong> API</strong>
<strong>{dashboard?.pendingAudits.signatures ?? 0} </strong>
<small></small>
</div>
</div>
<div className="surface mini-status-card">
<BellRing size={22} />
</button>
<button className="surface mini-status-card mini-status-card--action" onClick={() => navigate('/client/batch-tasks')} type="button">
<ClipboardList size={22} />
<div>
<span></span>
<strong></strong>
<small></small>
<span></span>
<strong>{dashboard?.clientOverview?.pendingBatchTaskCount ?? 0} </strong>
<small></small>
</div>
</div>
</button>
</div>
<div className="chart-grid">
<div className="surface chart-card">
<h2></h2>
<p className="muted"> 3 </p>
<p className="muted"></p>
<Chart height={300} option={sendTrendOption} />
</div>
<div className="surface chart-card">