diff --git a/src/routes/logs/+page.svelte b/src/routes/logs/+page.svelte index 12ddcbe..7b98c3d 100644 --- a/src/routes/logs/+page.svelte +++ b/src/routes/logs/+page.svelte @@ -184,6 +184,7 @@ inputChannelName = channelName = q.get("c") || ""; inputUserName = userName = q.get("u") || ""; + inputQuery = query = q.get("q") || ""; dateValue = q.get("d") || ""; searchValue = q.get("s") || ""; isJumpMode = (q.get("sm") || window.localStorage.getItem("logs-search-mode")) === "jump"; @@ -209,6 +210,11 @@ let channelStats = $state(null); let statsError = $state(null); + // Query mode + let inputQuery = $state(""); + let query = $state(""); + let isQueryMode = $derived(Boolean(query.trim())); + // Emotes const channelEmotes = new SvelteMap(); const globalEmotes = new SvelteMap(); @@ -226,6 +232,7 @@ d: dateValue, s: searchValue, sm: searchValue && isJumpMode ? "jump" : null, + q: isQueryMode ? query : null, }; untrack(() => { @@ -433,11 +440,8 @@ $effect(() => { // fetch available dates - if (!channelName) return; + if (isQueryMode || !channelName) return; untrack(async () => { - availableDates = []; - chatLogs = []; - channelStats = null; loading = true; const res = await fetch(`https://logs.zonian.dev/list?${parseChannelUser(channelName, userName, true)}`); @@ -459,7 +463,7 @@ $effect(() => { // fetch logs const date = dateContent; - if (!date) return; + if (!date && !query) return; untrack(async () => { error = null; @@ -468,11 +472,21 @@ logsController?.abort(); logsController = new AbortController(); - const res = await fetch(`https://logs.zonian.dev/${parseChannelUser(channelName, userName, false)}/${date.year}/${date.month}${date.day ? `/${date.day}` : ""}?jsonBasic=1`, { - signal: logsController.signal, + const queryParams = new URLSearchParams({ + jsonBasic: "1", + q: isQueryMode ? query : "", }); + const res = await fetch( + `https://logs.zonian.dev/ + ${parseChannelUser(channelName, userName, false)} + ${date ? `/${date.year}/${date.month}${date.day ? `/${date.day}` : ""}` : "/search"} + ?${queryParams}`, + { + signal: logsController.signal, + } + ); if (!res.ok) { - if (res.status === 404) error = "No logs found for this date"; + if (res.status === 404) error = "No results found"; else error = `Error from server: ${res.status} ${res.statusText}`; loading = false; throw error; @@ -639,11 +653,22 @@ // force reload channelName = ""; userName = ""; + query = ""; + // reset availableDates = []; dateValue = ""; + chatLogs = []; + channelStats = null; + + if (inputQuery.trim() && !inputUserName) { + error = "User is required for global search"; + return; + } + channelName = inputChannelName; userName = inputUserName; + query = inputQuery.trim(); }; const selectResult = (index: number) => { @@ -838,7 +863,7 @@ - + {#if foundChannels.length && foundChannels[0].target !== inputChannelName.toLowerCase()}
@@ -862,8 +887,15 @@
- - + + +
+ +
+ +
@@ -1061,51 +1093,52 @@
{/if} - {#if chatLogs.length} -
-
-
- - - {displayMessageCount} - -
-
- {#if isJumpSearching} - {@const width = searchResults.length.toString().length + 5} -
- - / - -
+ {/if} + {#if chatLogs.length} +
+
+
+ + + {displayMessageCount} + +
+
+ {#if isJumpSearching} + {@const width = searchResults.length.toString().length + 5} +
+ + / + +
+ {/if} +
+
+
-
- - - -
- {/if} + + + +
{/if}