imeeting/frontend/src/pages/business/PublicDeviceMeetingCreate.tsx

121 lines
4.3 KiB
TypeScript
Raw Normal View History

2026-06-05 07:07:45 +00:00
import { App, Button, Card, Result, Space, Spin, Typography } from "antd";
import { CheckCircleOutlined, QrcodeOutlined } from "@ant-design/icons";
import { useEffect, useState } from "react";
import { useNavigate, useParams } from "react-router-dom";
2026-06-05 07:07:45 +00:00
import { createPublicDeviceMeetingBySession } from "@/api/business/meeting";
2026-06-30 05:37:33 +00:00
import "./PublicDeviceMeetingCreate.css";
const { Title, Text } = Typography;
export default function PublicDeviceMeetingCreate() {
const { message } = App.useApp();
const navigate = useNavigate();
const { sessionId } = useParams<{ sessionId: string }>();
2026-06-05 07:07:45 +00:00
const [ready, setReady] = useState(false);
const [submitting, setSubmitting] = useState(false);
2026-06-05 07:07:45 +00:00
const [confirmed, setConfirmed] = useState(false);
useEffect(() => {
const token = localStorage.getItem("accessToken");
if (!token) {
const redirect = encodeURIComponent(window.location.pathname + window.location.search);
navigate(`/login?redirect=${redirect}`, { replace: true });
return;
}
2026-06-05 07:07:45 +00:00
setReady(true);
}, [navigate]);
2026-06-05 07:07:45 +00:00
const handleConfirm = async () => {
if (!sessionId) {
message.error("扫码会话不存在");
return;
}
setSubmitting(true);
try {
2026-06-05 07:07:45 +00:00
await createPublicDeviceMeetingBySession(sessionId);
setConfirmed(true);
message.success("登录确认已发送到设备");
} catch {
2026-06-05 07:07:45 +00:00
message.error("登录确认失败");
} finally {
setSubmitting(false);
}
};
return (
2026-06-30 05:37:33 +00:00
<div className="public-device-create-page">
<div className="public-device-create-shell">
<Card className="public-device-create-card">
2026-06-05 07:07:45 +00:00
{!ready ? (
2026-06-30 05:37:33 +00:00
<div className="public-device-create-loading">
<Spin />
</div>
2026-06-05 07:07:45 +00:00
) : !sessionId ? (
<Result
status="error"
title="二维码参数无效"
subTitle="请返回设备端重新生成二维码后再扫码。"
extra={
<Button type="primary" onClick={() => navigate("/meetings")}>
</Button>
}
/>
) : confirmed ? (
<Result
status="success"
title="登录确认已发送"
subTitle="安卓设备收到确认消息后,会继续按离线发会流程创建会议。"
extra={
<Button type="primary" onClick={() => navigate("/meetings")}>
</Button>
}
/>
) : (
2026-06-30 05:37:33 +00:00
<Space direction="vertical" size={24} className="public-device-create-content">
<Space size={16} align="start" className="public-device-create-head">
<div className="public-device-create-icon">
2026-06-05 07:07:45 +00:00
<QrcodeOutlined />
</div>
<div>
2026-06-30 05:37:33 +00:00
<Title level={3} className="public-device-create-title">
2026-06-05 07:07:45 +00:00
</Title>
<Text type="secondary">
H5
</Text>
</div>
</Space>
2026-06-30 05:37:33 +00:00
<Card bordered={false} className="public-device-create-notice">
2026-06-05 07:07:45 +00:00
<Space direction="vertical" size={12}>
<Text>
2026-06-30 05:37:33 +00:00
<CheckCircleOutlined className="public-device-create-check" />
2026-06-05 07:07:45 +00:00
线
</Text>
<Text type="secondary">
访
</Text>
</Space>
</Card>
2026-06-30 05:37:33 +00:00
<div className="public-device-create-actions">
<Space>
2026-06-05 07:07:45 +00:00
<Button size="large" onClick={() => navigate(-1)}>
</Button>
<Button type="primary" size="large" loading={submitting} onClick={() => void handleConfirm()}>
</Button>
</Space>
</div>
2026-06-05 07:07:45 +00:00
</Space>
)}
</Card>
</div>
</div>
);
}