export const torrentDetailsLoaderSource = " async function loadDetails(tab, options={}){\n const hash=selectedHash;\n const t=torrents.get(hash);\n const silent = !!options.silent;\n if(tab !== 'files') clearFilesAutoRefresh();\n if(tab !== 'peers') clearReverseDnsPeerRefresh();\n if($('peersRefreshBox')) $('peersRefreshBox').classList.toggle('d-none', tab!=='peers');\n setupPeersRefresh(tab);\n if(!t) return;\n if(tab==='general') return renderGeneral();\n if(tab==='log'){\n $('detailPane').innerHTML=`
${esc(t.message||'No logs')}
`;\n return;\n }\n const pane=$('detailPane');\n if(!silent) pane.innerHTML=`
Loading ${esc(tab)}...
`;\n try{\n // Note: Background peer refresh keeps the current table visible and only swaps in fresh rows after a successful response.\n const detailUrl = tab==='chunks' ? `/api/torrents/${encodeURIComponent(hash)}/chunks?max_cells=${chunkMaxCellsForDensity()}` : `/api/torrents/${encodeURIComponent(hash)}/${tab}`;\n const res=await fetch(detailUrl,{headers:{'Accept':'application/json'}});\n const text=await res.text();\n let json;\n try{\n json=JSON.parse(text);\n }catch(parseErr){\n throw new Error(`Invalid API response for ${tab}. HTTP ${res.status}`);\n }\n if(!res.ok || !json.ok) throw new Error(json.error||`HTTP ${res.status}`);\n if(tab!==activeTab() || selectedHash!==hash) return;\n if(tab==='files') renderFiles(json.files||[]);\n if(tab==='chunks') renderChunks(json.chunks||{});\n if(tab==='peers') renderPeers(json.peers||[]);\n if(tab==='trackers') renderTrackers(json.trackers||[]);\n }catch(e){\n if(!silent) pane.innerHTML=`
${esc(e.message)}
`;\n }\n }\n";