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

121 lines
4.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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";
import { createPublicDeviceMeetingBySession } from "@/api/business/meeting";
import "./PublicDeviceMeetingCreate.css";
const { Title, Text } = Typography;
export default function PublicDeviceMeetingCreate() {
const { message } = App.useApp();
const navigate = useNavigate();
const { sessionId } = useParams<{ sessionId: string }>();
const [ready, setReady] = useState(false);
const [submitting, setSubmitting] = useState(false);
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;
}
setReady(true);
}, [navigate]);
const handleConfirm = async () => {
if (!sessionId) {
message.error("扫码会话不存在");
return;
}
setSubmitting(true);
try {
await createPublicDeviceMeetingBySession(sessionId);
setConfirmed(true);
message.success("登录确认已发送到设备");
} catch {
message.error("登录确认失败");
} finally {
setSubmitting(false);
}
};
return (
<div className="public-device-create-page">
<div className="public-device-create-shell">
<Card className="public-device-create-card">
{!ready ? (
<div className="public-device-create-loading">
<Spin />
</div>
) : !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>
}
/>
) : (
<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">
<QrcodeOutlined />
</div>
<div>
<Title level={3} className="public-device-create-title">
</Title>
<Text type="secondary">
H5
</Text>
</div>
</Space>
<Card bordered={false} className="public-device-create-notice">
<Space direction="vertical" size={12}>
<Text>
<CheckCircleOutlined className="public-device-create-check" />
线
</Text>
<Text type="secondary">
访
</Text>
</Space>
</Card>
<div className="public-device-create-actions">
<Space>
<Button size="large" onClick={() => navigate(-1)}>
</Button>
<Button type="primary" size="large" loading={submitting} onClick={() => void handleConfirm()}>
</Button>
</Space>
</div>
</Space>
)}
</Card>
</div>
</div>
);
}