ghostguild-org/app/composables/useCalendarSearch.js

83 lines
2.1 KiB
JavaScript

// Composable for managing calendar search and filter state
export const useCalendarSearch = () => {
const searchQuery = ref("");
const includePastEvents = ref(false);
const searchResults = ref([]);
const selectedCategories = ref([]);
const isSearching = computed(() => {
return (
searchQuery.value.length > 0 ||
selectedCategories.value.length > 0
);
});
// Save search state to sessionStorage for persistence across navigation
const saveSearchState = (
query,
categories,
includePast,
results
) => {
if (process.client) {
sessionStorage.setItem(
"calendarSearchState",
JSON.stringify({
searchQuery: query,
selectedCategories: categories,
includePastEvents: includePast,
searchResults: results,
timestamp: Date.now(),
})
);
}
};
// Load search state from sessionStorage
const loadSearchState = () => {
if (process.client) {
const saved = sessionStorage.getItem("calendarSearchState");
if (saved) {
try {
const state = JSON.parse(saved);
// Only restore if saved less than 30 minutes ago
if (Date.now() - state.timestamp < 30 * 60 * 1000) {
searchQuery.value = state.searchQuery;
selectedCategories.value = state.selectedCategories;
includePastEvents.value = state.includePastEvents;
searchResults.value = state.searchResults;
return true;
}
} catch (e) {
console.error("Failed to load search state:", e);
}
}
}
return false;
};
// Clear all search filters
const clearSearch = () => {
searchQuery.value = "";
selectedCategories.value = [];
searchResults.value = [];
};
// Clear search state from sessionStorage
const clearSearchState = () => {
if (process.client) {
sessionStorage.removeItem("calendarSearchState");
}
};
return {
searchQuery,
includePastEvents,
searchResults,
selectedCategories,
isSearching,
saveSearchState,
loadSearchState,
clearSearch,
clearSearchState,
};
};