mirror of
https://github.com/shadoll/sLogos.git
synced 2026-02-04 11:03:24 +00:00
feat: restore selected tags from localStorage and update on changes
This commit is contained in:
118
src/App.svelte
118
src/App.svelte
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user