Skip to content

Commit da74545

Browse files
committed
fix: persist search overlay preferences
1 parent b483728 commit da74545

1 file changed

Lines changed: 45 additions & 19 deletions

File tree

src/pages/search-overlay.tsx

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ type SearchResultItem = RoundSearchResultItem | SessionSearchResultItem | Projec
7373
const RECENT_SEARCH_LIMIT = 20;
7474
const RECENT_SEARCH_BADGE_LIMIT = 8;
7575
const RECENT_SEARCH_STORAGE_KEY = "lovcode:search-overlay:recent-searches";
76+
const SEARCH_VIEW_STORAGE_KEY = "lovcode:search-overlay:view-mode";
7677
const FULL_TEXT_SEARCH_LIMIT = 600;
7778
const MATCH_CONTEXT_RADIUS = 96;
7879

@@ -348,10 +349,31 @@ function writeRecentSearches(searches: string[]) {
348349
}
349350
}
350351

352+
function isSearchViewMode(value: unknown): value is SearchViewMode {
353+
return SEARCH_VIEW_MODES.some((mode) => mode.id === value);
354+
}
355+
356+
function readSearchViewMode(): SearchViewMode {
357+
try {
358+
const stored = window.localStorage.getItem(SEARCH_VIEW_STORAGE_KEY);
359+
return isSearchViewMode(stored) ? stored : "round";
360+
} catch {
361+
return "round";
362+
}
363+
}
364+
365+
function writeSearchViewMode(mode: SearchViewMode) {
366+
try {
367+
window.localStorage.setItem(SEARCH_VIEW_STORAGE_KEY, mode);
368+
} catch {
369+
// Ignore storage failures; the in-memory view switch still works.
370+
}
371+
}
372+
351373
export default function SearchOverlay() {
352374
const [query, setQuery] = useState("");
353375
const [sourceResults, setSourceResults] = useState<SearchResultItem[]>([]);
354-
const [viewMode, setViewMode] = useState<SearchViewMode>("round");
376+
const [viewMode, setViewMode] = useState<SearchViewMode>(readSearchViewMode);
355377
const [searching, setSearching] = useState(false);
356378
const [indexBuilding, setIndexBuilding] = useState(false);
357379
const [indexReady, setIndexReady] = useState(false);
@@ -525,6 +547,10 @@ export default function SearchOverlay() {
525547
return () => clearTimeout(timer);
526548
}, [trimmedQuery, rememberSearch]);
527549

550+
useEffect(() => {
551+
writeSearchViewMode(viewMode);
552+
}, [viewMode]);
553+
528554
useEffect(() => {
529555
setActiveIdx(0);
530556
}, [query, results.length, viewMode]);
@@ -623,6 +649,24 @@ export default function SearchOverlay() {
623649
)}
624650
</div>
625651

652+
{!trimmedQuery && recentSearchBadges.length > 0 && (
653+
<div className="mt-2 flex min-w-0 items-center gap-1.5 overflow-hidden whitespace-nowrap" aria-label="Recent searches">
654+
<span className="shrink-0 text-[11px] text-muted-foreground">Recent</span>
655+
{recentSearchBadges.map((term) => (
656+
<button
657+
key={term}
658+
type="button"
659+
onClick={() => onSelectRecentSearch(term)}
660+
className="max-w-[12rem] shrink-0 truncate rounded-lg border border-border bg-card-alt px-2 py-1 text-[11px] text-muted-foreground transition-colors hover:bg-card hover:text-foreground"
661+
aria-label={`Search for ${term}`}
662+
title={term}
663+
>
664+
{term}
665+
</button>
666+
))}
667+
</div>
668+
)}
669+
626670
<div className="mt-2 flex items-center justify-between gap-2">
627671
<div className="inline-flex rounded-lg border border-border bg-card-alt p-0.5" aria-label="Search view">
628672
{SEARCH_VIEW_MODES.map((mode) => {
@@ -653,24 +697,6 @@ export default function SearchOverlay() {
653697
</span>
654698
)}
655699
</div>
656-
657-
{!trimmedQuery && recentSearchBadges.length > 0 && (
658-
<div className="mt-2 flex flex-wrap items-center gap-1.5" aria-label="Recent searches">
659-
<span className="shrink-0 text-[11px] text-muted-foreground">Recent</span>
660-
{recentSearchBadges.map((term) => (
661-
<button
662-
key={term}
663-
type="button"
664-
onClick={() => onSelectRecentSearch(term)}
665-
className="max-w-[12rem] truncate rounded-lg border border-border bg-card-alt px-2 py-1 text-[11px] text-muted-foreground transition-colors hover:bg-card hover:text-foreground"
666-
aria-label={`Search for ${term}`}
667-
title={term}
668-
>
669-
{term}
670-
</button>
671-
))}
672-
</div>
673-
)}
674700
</div>
675701
</div>
676702

0 commit comments

Comments
 (0)