feat: generate pickup codes on upload
Release / deploy (push) Successful in 2m5s

This commit is contained in:
loveuer
2026-09-10 23:01:22 -07:00
parent 3907410354
commit ec53eb06ec
+6 -1
View File
@@ -116,6 +116,11 @@ function UploadPanel() {
const [error, setError] = useState('')
const [result, setResult] = useState(null)
const allowed = user.canUpload || user.canAdvancedUpload
const generatePickupCode = () => {
const value = new Uint32Array(1)
crypto.getRandomValues(value)
setPickupCode(String(value[0] % 1000000).padStart(6, '0'))
}
const submit = async (event) => {
event.preventDefault(); if (!file) return
setBusy(true); setError('')
@@ -137,7 +142,7 @@ function UploadPanel() {
<div><label className="label">保留时间</label><select className="field" value={retention} onChange={(e) => setRetention(e.target.value)}><option value="1h">1 小时</option><option value="8h">8 小时</option><option value="1d">1 天</option><option value="3d">3 天</option>{user.canAdvancedUpload && <option value="forever">永久</option>}</select></div>
<div><label className="label">可访问次数</label><select className="field" value={downloads} onChange={(e) => setDownloads(e.target.value)}><option value="1">1 次</option><option value="3">3 次</option><option value="5">5 次</option><option value="10">10 次</option><option value="custom">自定义</option>{user.canAdvancedUpload && <option value="unlimited">无限</option>}</select></div>
{downloads === 'custom' && <div><label className="label">自定义次数(1–99)</label><input className="field" type="number" min="1" max="99" required value={customDownloads} onChange={(e) => setCustomDownloads(e.target.value)} /></div>}
<div className={downloads === 'custom' ? '' : 'sm:col-span-2'}><label className="label">6 位数字取件码(可选)</label><input className="field" inputMode="numeric" pattern="[0-9]{6}" maxLength={6} placeholder="留空则无需取件码" value={pickupCode} onChange={(e) => setPickupCode(e.target.value.replace(/\D/g, ''))} /></div>
<div className={downloads === 'custom' ? '' : 'sm:col-span-2'}><label className="label">6 位数字取件码(可选)</label><div className="flex gap-2"><input className="field" inputMode="numeric" pattern="[0-9]{6}" maxLength={6} placeholder="留空则无需取件码" value={pickupCode} onChange={(e) => setPickupCode(e.target.value.replace(/\D/g, ''))} /><button className="btn-secondary shrink-0" type="button" onClick={generatePickupCode}>随机生成</button></div><p className={`mt-2 text-xs ${pickupCode ? 'text-leaf' : 'text-amber-700'}`}>{pickupCode ? '已启用取件码保护' : '强烈建议生成取件码;仅在确认文件无需保护时留空。'}</p></div>
</div>
{error && <p className="mt-4 text-sm text-red-600">{error}</p>}
<button className="btn-primary mt-5 w-full" disabled={!file || busy}>{busy ? <><LoaderCircle className="animate-spin" size={18} />正在上传</> : <><UploadCloud size={18} />上传并生成链接</>}</button>