import React from 'react'; import './Upload.css'; /* 上传(移动端)— 规格 §46。 结构:header(标题 + 计数)> trigger(选择触发器)> list(文件行)+ empty。 移动端没有拖拽:选择动作只能是点一下触发器(规格 §46.1),因此触发器是唯一入口。 **本组件不发请求**:进度与成败全部由宿主回传(file.status / file.percent), 组件只做四态呈现与删除 / 重试的动作回传(规格 §46.7)。 file.status 取值:'pending'(待上传)/ 'uploading'(上传中)/ 'success'(成功)/ 'error'(失败)。 */ const STATUS_TEXT = { pending: '待上传', uploading: '上传中', success: '已上传', error: '上传失败', }; function statusOf(file) { const s = file && file.status ? String(file.status) : 'pending'; return STATUS_TEXT[s] ? s : 'pending'; } function percentOf(file) { const n = file && typeof file.percent === 'number' ? file.percent : 0; return Math.max(0, Math.min(100, Math.round(n))); } function extOf(file) { const name = file && file.name ? String(file.name) : ''; const hit = name.match(/\.([a-z0-9]+)$/i); return hit ? hit[1].toLowerCase() : 'file'; } export default function Upload({ files = [], maxCount = 9, disabled = false, variant = 'dashed', title = '附件', emptyText = '还没有上传文件', accept = '', onSelect, onRemove, onRetry, children = null, }) { const full = files.length >= maxCount; const cls = 'kole-m-upload' + ` kole-m-upload--${variant === 'button' ? 'button' : 'dashed'}` + (full ? ' kole-m-upload--full' : '') + (disabled ? ' is-disabled' : ''); return (
{emptyText}
)} {/* 隐藏的文件选择器(由宿主提供,这里用 accept 说明可选项) */} {children}