import React from 'react'; import { View, Text } from '@tarojs/components'; import { Button, Loading } from '@nutui/nutui-react-taro'; import { Scan, Success, Failure } from '@nutui/icons-react-taro'; import { useQRLogin, ScanLoginState } from '@/hooks/useQRLogin'; export interface QRLoginScannerProps { /** 扫码成功回调 */ onSuccess?: (result: any) => void; /** 扫码失败回调 */ onError?: (error: string) => void; /** 自定义样式类名 */ className?: string; /** 按钮文本 */ buttonText?: string; /** 是否显示状态信息 */ showStatus?: boolean; } /** * 扫码登录组件 */ const QRLoginScanner: React.FC = ({ onSuccess, onError, className = '', buttonText = '扫码登录', showStatus = true }) => { const { state, error, result, isLoading, startScan, cancel, reset, canScan } = useQRLogin(); // 处理扫码成功 React.useEffect(() => { if (state === ScanLoginState.SUCCESS && result) { onSuccess?.(result); } }, [state, result, onSuccess]); // 处理扫码失败 React.useEffect(() => { if (state === ScanLoginState.ERROR && error) { onError?.(error); } }, [state, error, onError]); // 获取状态显示内容 const getStatusContent = () => { switch (state) { case ScanLoginState.SCANNING: return ( 请扫描登录二维码... ); case ScanLoginState.CONFIRMING: return ( 正在确认登录... ); case ScanLoginState.SUCCESS: return ( 登录确认成功! ); case ScanLoginState.ERROR: return ( {error || '扫码登录失败'} ); default: return null; } }; // 获取按钮状态 const getButtonProps = () => { const disabled = !canScan() || isLoading; switch (state) { case ScanLoginState.SCANNING: case ScanLoginState.CONFIRMING: return { loading: true, disabled: true, text: state === ScanLoginState.SCANNING ? '扫码中...' : '确认中...', onClick: cancel }; case ScanLoginState.SUCCESS: return { loading: false, disabled: false, text: '重新扫码', onClick: reset }; case ScanLoginState.ERROR: return { loading: false, disabled: false, text: '重试', onClick: startScan }; default: return { loading: false, disabled, text: disabled ? '请先登录' : buttonText, onClick: startScan }; } }; const buttonProps = getButtonProps(); return ( {/* 扫码按钮 */} {/* 状态显示 */} {showStatus && ( {getStatusContent()} )} {/* 成功结果显示 */} {state === ScanLoginState.SUCCESS && result && ( 已为用户 {result.userInfo?.nickname || result.userInfo?.userId} 确认登录 )} {/* 使用说明 */} {state === ScanLoginState.IDLE && ( 扫描网页端显示的登录二维码即可快速登录 )} ); }; export default QRLoginScanner;