/**
* GET /repos/:name/search?q=... — search files in a repo
*/
import { layout, escapeHtml } from '../helpers.js'
export async function renderRepoSearch (svc, ctx, repoName, query) {
const prefix = (ctx && ctx.prefix) || ''
const sync = svc._sync
if (!sync) return errorPage('Sync service not running', ctx)
let results = []
if (query) {
try {
results = await sync.searchFiles(repoName, query)
} catch (err) {
return errorPage('Search error: ' + err.message, ctx)
}
}
const body = `
<div class="card">
<h2><a href="${prefix}/repos/${encodeURIComponent(repoName)}">${escapeHtml(repoName)}</a> / search</h2>
<form method="GET" action="${prefix}/repos/${encodeURIComponent(repoName)}/search" style="margin-top:0.5rem">
<div class="hstack">
<input name="q" value="${escapeHtml(query || '')}" placeholder="Search file names..." style="flex:1">
<button type="submit">Search</button>
</div>
</form>
</div>
${query ? `
<div class="card">
<h2>${results.length} result${results.length === 1 ? '' : 's'} for "${escapeHtml(query)}"</h2>
${results.length === 0 ? '<div class="empty">(no matching files)</div>' : results.map(f => `
<div class="item">
<a href="${prefix}/repos/${encodeURIComponent(repoName)}/blob/${encodeURIComponent(f)}">${escapeHtml(f)}</a>
</div>`).join('')}
</div>` : ''}
`
return layout('search · ' + repoName, '/repos', body, ctx)
}
function errorPage (msg, ctx) {
const body = `<div class="card"><h2>Error</h2><div class="empty">${escapeHtml(msg)}</div></div>`
return layout('Error', '/repos', body, ctx)
}