feat: restore selected tags from localStorage and update on changes

This commit is contained in:
sHa
2025-05-29 11:27:12 +03:00
parent e1165b72d8
commit f4f4312d5b

View File

@@ -154,6 +154,7 @@
setSearchQuery, setSearchQuery,
setGridView, setGridView,
setListView, setListView,
setCompactView,
setTheme, setTheme,
toggleDropdown, toggleDropdown,
addTag, addTag,
@@ -207,6 +208,21 @@
if (savedCompact === "true" || savedCompact === "false") { if (savedCompact === "true" || savedCompact === "false") {
setCompactMode(savedCompact === "true"); setCompactMode(savedCompact === "true");
} }
// Restore selected tags from localStorage
const savedTags = localStorage.getItem("selectedTags");
if (savedTags) {
try {
const parsedTags = JSON.parse(savedTags);
if (Array.isArray(parsedTags)) {
selectedTags = parsedTags;
console.log("App: Restored selectedTags from localStorage:", selectedTags);
}
} catch (error) {
console.error("App: Error parsing saved tags:", error);
localStorage.removeItem("selectedTags");
}
}
}); });
// Make sure to apply theme whenever it changes // Make sure to apply theme whenever it changes
@@ -418,22 +434,31 @@
selectedTags = [...selectedTags, tag]; selectedTags = [...selectedTags, tag];
} }
// Save to localStorage
localStorage.setItem("selectedTags", JSON.stringify(selectedTags));
console.log("App: Updated selectedTags:", selectedTags);
// Update window.appData immediately // Update window.appData immediately
if (typeof window !== "undefined" && window.appData) { if (typeof window !== "undefined" && window.appData) {
window.appData.selectedTags = [...selectedTags]; window.appData.selectedTags = [...selectedTags];
console.log("App: Updated selectedTags in window.appData");
// Update filtered logos immediately // Update filtered logos immediately
updateFilteredLogosImmediate(); updateFilteredLogosImmediate();
} }
} }
function addTag(tag) { function addTag(tag) {
console.log("App: Adding tag:", tag); console.log("App: Adding tag:", tag);
if (!selectedTags.includes(tag)) { if (!selectedTags.includes(tag)) {
selectedTags = [...selectedTags, tag]; selectedTags = [...selectedTags, tag];
localStorage.setItem("selectedTags", JSON.stringify(selectedTags));
console.log("App: Updated selectedTags:", selectedTags);
// Update window.appData immediately // Update window.appData immediately
if (typeof window !== "undefined" && window.appData) { if (typeof window !== "undefined" && window.appData) {
window.appData.selectedTags = [...selectedTags]; window.appData.selectedTags = [...selectedTags];
console.log("App: Updated selectedTags in window.appData");
// Update filtered logos immediately // Update filtered logos immediately
updateFilteredLogosImmediate(); updateFilteredLogosImmediate();
@@ -452,10 +477,13 @@
function removeTag(tag) { function removeTag(tag) {
console.log("App: Removing tag:", tag); console.log("App: Removing tag:", tag);
selectedTags = selectedTags.filter((t) => t !== tag); selectedTags = selectedTags.filter((t) => t !== tag);
localStorage.setItem("selectedTags", JSON.stringify(selectedTags));
console.log("App: Updated selectedTags:", selectedTags);
// Update window.appData immediately // Update window.appData immediately
if (typeof window !== "undefined" && window.appData) { if (typeof window !== "undefined" && window.appData) {
window.appData.selectedTags = [...selectedTags]; window.appData.selectedTags = [...selectedTags];
console.log("App: Updated selectedTags in window.appData");
// Update filtered logos immediately // Update filtered logos immediately
updateFilteredLogosImmediate(); updateFilteredLogosImmediate();
@@ -464,16 +492,12 @@
// Helper function to immediately update filtered/display logos in window.appData // Helper function to immediately update filtered/display logos in window.appData
function updateFilteredLogosImmediate() { function updateFilteredLogosImmediate() {
if ( if (typeof window !== "undefined" && window.appData) {
typeof window !== "undefined" && // Update filtered logos immediately for reactive UI
window.appData &&
window.appData.logos
) {
window.appData.filteredLogos = window.appData.logos.filter((logo) => { window.appData.filteredLogos = window.appData.logos.filter((logo) => {
const matchesSearch = const matchesSearch =
logo.name.toLowerCase().includes(searchQuery.toLowerCase()) || logo.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
(logo.brand && (logo.brand && logo.brand.toLowerCase().includes(searchQuery.toLowerCase()));
logo.brand.toLowerCase().includes(searchQuery.toLowerCase()));
const matchesTags = const matchesTags =
!selectedTags.length || !selectedTags.length ||
(logo.tags && (logo.tags &&
@@ -494,9 +518,8 @@
: window.appData.filteredLogos; : window.appData.filteredLogos;
console.log( console.log(
"App: Updated filtered logos:", "App: Updated filtered/display logos:",
window.appData.filteredLogos.length, window.appData.filteredLogos.length,
"display logos:",
window.appData.displayLogos.length, window.appData.displayLogos.length,
); );
} }
@@ -509,74 +532,53 @@
// Update window.appData immediately // Update window.appData immediately
if (typeof window !== "undefined" && window.appData) { if (typeof window !== "undefined" && window.appData) {
window.appData.tagDropdownOpen = tagDropdownOpen; window.appData.tagDropdownOpen = tagDropdownOpen;
console.log(
"App: Updated tagDropdownOpen in window.appData to:",
tagDropdownOpen,
);
// Force immediate update
setTimeout(() => {
if (window.appData) window.appData.tagDropdownOpen = tagDropdownOpen;
}, 0);
} }
} }
function closeDropdown(e) { function closeDropdown() {
if (!e.target.closest(".filter-dropdown")) { tagDropdownOpen = false;
tagDropdownOpen = false; if (typeof window !== "undefined" && window.appData) {
window.appData.tagDropdownOpen = false;
// Update window.appData immediately
if (typeof window !== "undefined" && window.appData) {
window.appData.tagDropdownOpen = false;
console.log("App: Closed dropdown, updated in window.appData");
}
} }
} }
function getTagObj(text) { function getTagObj(tag) {
return allTags.find((t) => t.text === text); const tagObj = allTags.find(t => t.text === tag);
return tagObj || { text: tag };
} }
// The openPreview function has been removed as it's now handled directly
// by the Grid.svelte component using the router
function openLogoByAnchor(hash) { function openLogoByAnchor(hash) {
if (!hash || !hash.startsWith("#/preview/")) return; if (!hash || !hash.startsWith('#/preview/')) return;
const anchor = decodeURIComponent(hash.replace("#/preview/", "")); const logoName = hash.replace('#/preview/', '').replace(/-/g, ' ');
const logo = logos.find(l =>
const found = logos.find( l.name.toLowerCase().replace(/\s+/g, '-') === hash.replace('#/preview/', '').toLowerCase() ||
(l) => l.name.replace(/\s+/g, "-").toLowerCase() === anchor, l.name.toLowerCase() === logoName.toLowerCase()
); );
if (found) { if (logo) {
const previewUrl = `#/preview/${encodeURIComponent(found.name.replace(/\s+/g, "-").toLowerCase())}`; selectedLogo = logo;
console.log("App: Navigating to router URL:", previewUrl); showModal = true;
window.location.href = previewUrl;
} }
} }
// Listen for outside click to close dropdown // Listen for outside click to close dropdown
$: if (tagDropdownOpen) { function handleOutsideClick(event) {
window.addEventListener("click", closeDropdown); if (tagDropdownOpen && !event.target.closest('.filter-dropdown')) {
} else { closeDropdown();
window.removeEventListener("click", closeDropdown); }
}
$: if (typeof window !== "undefined") {
if (tagDropdownOpen) {
document.addEventListener('click', handleOutsideClick);
} else {
document.removeEventListener('click', handleOutsideClick);
}
} }
</script> </script>
<div class="container app-flex"> <Router {routes} />
<Router {routes} />
</div>
<style> <style>
.app-flex {
min-height: 100vh;
display: flex;
flex-direction: column;
}
.app-flex {
min-height: 100vh;
display: flex;
flex-direction: column;
}
</style> </style>