()
| 2291 | } |
| 2292 | |
| 2293 | async function runDaily() { |
| 2294 | syncDateControls(); |
| 2295 | if (state.dailyPolling && state.dailyTaskId) { |
| 2296 | showFeedbackToast("success", ui().papers.stillRunningTitle, ui().papers.stillRunningDetail(state.dailyTaskId)); |
| 2297 | return; |
| 2298 | } |
| 2299 | const days = selectedDateFetchDays(); |
| 2300 | $("daysInput").value = String(days); |
| 2301 | const options = collectDailyOptions(); |
| 2302 | const userId = currentUser(); |
| 2303 | const runButton = $("runDailyBtn"); |
| 2304 | runButton.disabled = true; |
| 2305 | runButton.textContent = ui().papers.checkingCache; |
| 2306 | const pollToken = ++state.dailyPollToken; |
| 2307 | try { |
| 2308 | const data = await api("/api/daily/start", { |
| 2309 | method: "POST", |
| 2310 | body: JSON.stringify({ user_id: userId, days, target_date: $("paperDate").value, limit_per_source: configuredDailyLimit(), ...options }) |
| 2311 | }); |
| 2312 | const taskId = data.task?.task_id || ""; |
| 2313 | if (data.cached || data.task?.status === "completed") { |
| 2314 | if (data.task?.push) renderPush(data.task.push, { fromCache: Boolean(data.cached || data.task.cached) }); |
| 2315 | if (data.cached) showFeedbackToast("success", ui().papers.loadedCacheTitle, ui().papers.loadedCacheDetail); |
| 2316 | await loadWiki(); |
| 2317 | return; |
| 2318 | } |
| 2319 | if (taskId) setDailyTaskState(taskId, userId, true); |
| 2320 | if (data.task) renderDailyTaskStatus(data.task); |
| 2321 | await pollDailyTask(taskId, data.push, userId, pollToken); |
| 2322 | } finally { |
| 2323 | if (pollToken === state.dailyPollToken) { |
| 2324 | setDailyTaskState("", "", false); |
| 2325 | } |
| 2326 | } |
| 2327 | } |
| 2328 | |
| 2329 | function renderDailyTaskStatus(task) { |
| 2330 | if (!task) return; |
nothing calls this directly
no test coverage detected