58 lines
1.7 KiB
TypeScript
58 lines
1.7 KiB
TypeScript
const STORAGE_PREFIX = "paperclip:recent-searches:";
|
|
const MAX_RECENT_SEARCHES = 5;
|
|
|
|
function storageKey(companyId: string) {
|
|
return `${STORAGE_PREFIX}${companyId}`;
|
|
}
|
|
|
|
function isStorageAvailable() {
|
|
return typeof window !== "undefined" && typeof window.localStorage !== "undefined";
|
|
}
|
|
|
|
export function loadRecentSearches(companyId: string): string[] {
|
|
if (!isStorageAvailable() || !companyId) return [];
|
|
try {
|
|
const raw = window.localStorage.getItem(storageKey(companyId));
|
|
if (!raw) return [];
|
|
const parsed = JSON.parse(raw);
|
|
if (!Array.isArray(parsed)) return [];
|
|
const cleaned: string[] = [];
|
|
for (const value of parsed) {
|
|
if (typeof value !== "string") continue;
|
|
const trimmed = value.trim();
|
|
if (!trimmed) continue;
|
|
cleaned.push(trimmed);
|
|
if (cleaned.length >= MAX_RECENT_SEARCHES) break;
|
|
}
|
|
return cleaned;
|
|
} catch {
|
|
return [];
|
|
}
|
|
}
|
|
|
|
export function pushRecentSearch(companyId: string, query: string): string[] {
|
|
if (!isStorageAvailable() || !companyId) return [];
|
|
const trimmed = query.trim();
|
|
if (!trimmed) return loadRecentSearches(companyId);
|
|
const existing = loadRecentSearches(companyId);
|
|
const filtered = existing.filter((entry) => entry.toLowerCase() !== trimmed.toLowerCase());
|
|
const next = [trimmed, ...filtered].slice(0, MAX_RECENT_SEARCHES);
|
|
try {
|
|
window.localStorage.setItem(storageKey(companyId), JSON.stringify(next));
|
|
} catch {
|
|
// ignore
|
|
}
|
|
return next;
|
|
}
|
|
|
|
export function clearRecentSearches(companyId: string): void {
|
|
if (!isStorageAvailable() || !companyId) return;
|
|
try {
|
|
window.localStorage.removeItem(storageKey(companyId));
|
|
} catch {
|
|
// ignore
|
|
}
|
|
}
|
|
|
|
export const RECENT_SEARCHES_LIMIT = MAX_RECENT_SEARCHES;
|