import { useState, useRef } from 'react' import { useSearchParams } from 'react-router-dom' import { ClipboardList, Check, FileText, X } from 'lucide-react' import api from '../../lib/api' import Card from '../../components/ui/Card' import Button from '../../components/ui/Button' import { Input, Label } from '../../components/ui/Input' const FILE_TYPES = [ { key: 'ID_CARD_FRONT', label: '身份证正面' }, { key: 'ID_CARD_BACK', label: '身份证反面' }, { key: 'EDUCATION', label: '学历证明' }, { key: 'BANK_CARD', label: '银行卡照片' }, { key: 'OTHER', label: '其他材料' }, ] interface UploadedFile { fileType: string fileName: string fileUrl: string fileSize: number } export default function Onboarding() { const [params] = useSearchParams() const token = params.get('token') || '' const [orgName, setOrgName] = useState('') const [loading, setLoading] = useState(false) const [submitted, setSubmitted] = useState(false) const [error, setError] = useState('') const [uploading, setUploading] = useState(false) const [uploadedFiles, setUploadedFiles] = useState([]) const fileInputRef = useRef(null) const [currentFileType, setCurrentFileType] = useState('ID_CARD_FRONT') const [form, setForm] = useState({ name: '', phone: '', idCard: '', emergencyContact: '', emergencyPhone: '', address: '', bankCard: '', bankName: '', }) // 获取链接信息 useState(() => { if (token) { api.get(`/portal/onboarding/${token}`).then((res: any) => { setOrgName(res.data.orgName) }).catch((err: any) => { setError(err.response?.data?.error?.message || '链接无效') }) } }) const handleFileUpload = async (e: React.ChangeEvent) => { const file = e.target.files?.[0] if (!file) return setUploading(true) setError('') try { const formData = new FormData() formData.append('file', file) formData.append('fileType', currentFileType) const res = await api.post(`/portal/onboarding/${token}/upload`, formData, { headers: { 'Content-Type': 'multipart/form-data' }, }) as any setUploadedFiles([...uploadedFiles, res.data.data]) } catch (err: any) { setError(err.response?.data?.error?.message || '文件上传失败') } finally { setUploading(false) if (fileInputRef.current) fileInputRef.current.value = '' } } const removeFile = (idx: number) => { setUploadedFiles(uploadedFiles.filter((_, i) => i !== idx)) } const handleSubmit = async () => { setError('') setLoading(true) try { await api.post('/portal/onboarding', { ...form, token, attachments: uploadedFiles }) setSubmitted(true) } catch (err: any) { setError(err.response?.data?.error?.message || '提交失败') } finally { setLoading(false) } } if (submitted) { return (

信息提交成功

HR 将审核您的信息,请耐心等待。

) } return (

入职信息填报

{orgName && (
欢迎加入 {orgName}!请填写以下信息:
)} {error && (
{error}
)}
setForm({ ...form, name: e.target.value })} placeholder="请输入姓名" />
setForm({ ...form, phone: e.target.value })} placeholder="请输入手机号" maxLength={11} />
setForm({ ...form, idCard: e.target.value })} placeholder="请输入身份证号" maxLength={18} />
setForm({ ...form, emergencyContact: e.target.value })} placeholder="选填" />
setForm({ ...form, emergencyPhone: e.target.value })} placeholder="选填" maxLength={11} />
setForm({ ...form, address: e.target.value })} placeholder="选填" />
setForm({ ...form, bankCard: e.target.value })} placeholder="选填" />
setForm({ ...form, bankName: e.target.value })} placeholder="选填" />
{/* 文件上传区域 */}
{FILE_TYPES.map((ft) => ( ))}
{uploadedFiles.length > 0 && (
{uploadedFiles.map((f, i) => (
{FILE_TYPES.find(ft => ft.key === f.fileType)?.label || f.fileType}: {f.fileName}
))}
)}
📌 提交后 HR 将审核您的信息
) }