(file, percent)
| 293 | |
| 294 | // Upsert / update a record for this resumable file |
| 295 | function upsertResumableDraft(file, percent) { |
| 296 | if (!file || !file.uniqueIdentifier) return; |
| 297 | |
| 298 | const { all, userKey, drafts } = getUserDraftContext(); |
| 299 | const id = file.uniqueIdentifier; |
| 300 | const folder = window.currentFolder || 'root'; |
| 301 | const name = file.fileName || file.name || 'Unnamed file'; |
| 302 | const size = file.size || 0; |
| 303 | |
| 304 | const prev = drafts[id] || {}; |
| 305 | const p = Math.max(0, Math.min(100, Math.floor(percent || 0))); |
| 306 | |
| 307 | // Avoid hammering localStorage if nothing substantially changed |
| 308 | if (prev.lastPercent !== undefined && Math.abs(p - prev.lastPercent) < 1) { |
| 309 | return; |
| 310 | } |
| 311 | |
| 312 | drafts[id] = { |
| 313 | identifier: id, |
| 314 | fileName: name, |
| 315 | size, |
| 316 | folder, |
| 317 | lastPercent: p, |
| 318 | updatedAt: Date.now() |
| 319 | }; |
| 320 | |
| 321 | all[userKey] = drafts; |
| 322 | saveResumableDraftsAll(all); |
| 323 | } |
| 324 | |
| 325 | // Remove a single draft by identifier |
| 326 | function clearResumableDraft(identifier) { |
no test coverage detected