feat: improve application access and money precision

This commit is contained in:
hectorzhao
2026-07-16 17:54:05 +08:00
parent 9d5c507007
commit faa716b8d0
49 changed files with 1699 additions and 489 deletions
+8 -2
View File
@@ -4,6 +4,7 @@ import { useNavigate } from 'react-router-dom';
import { clientApi, type ApplicationCmppParams, type ClientSmsApplication } from '@/api/adminApi';
import { formatCents } from '@/utils/currency';
import { Button, Modal, Pagination, Tag } from '@/components/ui';
import { copyText } from '@/utils/clipboard';
type LinkStatus = 'connected' | 'degraded' | 'disconnected' | 'inactive';
@@ -67,6 +68,7 @@ export function ClientApplicationsPage() {
const [error, setError] = useState('');
const [paramsError, setParamsError] = useState('');
const [copied, setCopied] = useState(false);
const [copyError, setCopyError] = useState('');
function loadApplications() {
setLoading(true);
@@ -84,6 +86,7 @@ export function ClientApplicationsPage() {
}, []);
function openParams(application: ClientSmsApplication) {
if (application.interfaceEnabled === false) return;
setSelectedApp(application);
setParams(null);
setParamsError('');
@@ -113,7 +116,9 @@ export function ClientApplicationsPage() {
return;
}
const text = selectedRows.map((item) => `${item.label}: ${item.value}`).join('\n');
void navigator.clipboard.writeText(text).then(() => setCopied(true));
void copyText(text)
.then(() => { setCopied(true); setCopyError(''); })
.catch((failure: Error) => setCopyError(failure.message || '复制失败'));
}
return (
@@ -162,7 +167,7 @@ export function ClientApplicationsPage() {
</div>
<div><dt>HTTP接口</dt><dd><Tag tone={application.httpConfig?.enabled ? 'success' : 'info'}>{application.httpConfig?.enabled ? '已开通' : '未开通'}</Tag></dd></div>
</dl>
<div className="table-actions"><Button onClick={() => openParams(application)} variant="ghost">CMPP参数</Button><Button disabled={!application.httpConfig?.enabled} onClick={() => navigate('/client/http-api')} variant="ghost">HTTP接口对接</Button></div>
<div className="table-actions"><Button disabled={application.interfaceEnabled === false} onClick={() => openParams(application)} variant="ghost">{application.interfaceEnabled === false ? 'CMPP未开通' : 'CMPP参数'}</Button><Button disabled={!application.httpConfig?.enabled} onClick={() => navigate('/client/http-api')} variant="ghost">HTTP接口对接</Button></div>
</article>
);
})}
@@ -197,6 +202,7 @@ export function ClientApplicationsPage() {
))}
</div>
) : null}
{copyError ? <p className="form-error">{copyError}</p> : null}
</Modal>
</section>
);