From b87af7ae09f09a342bf5ca904015bebf7e8aca34 Mon Sep 17 00:00:00 2001 From: 7w1 Date: Wed, 6 May 2026 11:04:06 -0500 Subject: [PATCH] fix tweak favoriting behavior --- .changeset/fix-tweak-favoriting-behavior.md | 5 ++ .../url-preview/TweakPreviewUrlCard.tsx | 1 - .../cosmetics/ThemeCatalogSettings.tsx | 52 ++++++++++++++++--- 3 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 .changeset/fix-tweak-favoriting-behavior.md diff --git a/.changeset/fix-tweak-favoriting-behavior.md b/.changeset/fix-tweak-favoriting-behavior.md new file mode 100644 index 000000000..3431802e9 --- /dev/null +++ b/.changeset/fix-tweak-favoriting-behavior.md @@ -0,0 +1,5 @@ +--- +default: patch +--- + +Fixed tweak automatic favoriting behavior when entering/leaving the catalog. diff --git a/src/app/components/url-preview/TweakPreviewUrlCard.tsx b/src/app/components/url-preview/TweakPreviewUrlCard.tsx index ab3ce5e2c..c3c632745 100644 --- a/src/app/components/url-preview/TweakPreviewUrlCard.tsx +++ b/src/app/components/url-preview/TweakPreviewUrlCard.tsx @@ -198,7 +198,6 @@ export function TweakPreviewUrlCard({ url }: { url: string }) { const nextEnabled = enabledTweakFullUrls.filter((u) => u !== url); patchSettings({ themeRemoteEnabledTweakFullUrls: nextEnabled, - themeRemoteTweakFavorites: pruneTweakFavorites(tweakFavorites, nextEnabled), }); } }, diff --git a/src/app/features/settings/cosmetics/ThemeCatalogSettings.tsx b/src/app/features/settings/cosmetics/ThemeCatalogSettings.tsx index 8653a88b8..e602c7dfc 100644 --- a/src/app/features/settings/cosmetics/ThemeCatalogSettings.tsx +++ b/src/app/features/settings/cosmetics/ThemeCatalogSettings.tsx @@ -1,4 +1,4 @@ -import { type ChangeEventHandler, useCallback, useEffect, useMemo, useState } from 'react'; +import { type ChangeEventHandler, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { useTimeoutToggle } from '$hooks/useTimeoutToggle'; import { copyToClipboard, downloadTextFile } from '$utils/dom'; import { useQuery, useQueryClient } from '@tanstack/react-query'; @@ -214,6 +214,9 @@ export function ThemeCatalogSettings({ const [browseOpen, setBrowseOpen] = useState(false); const [importModalOpen, setImportModalOpen] = useState(false); + const appearanceCatalogBrowseWasOpenRef = useRef(false); + const tweakFavoritesSnapshotAtAppearanceCatalogOpenRef = useRef>(new Set()); + useEffect(() => { if (isAppearanceMode) { onBrowseOpenChange?.(browseOpen); @@ -248,6 +251,19 @@ export function ThemeCatalogSettings({ 'themeChatAutoPreviewAnyUrl' ); + useEffect(() => { + if (!isAppearanceMode) { + appearanceCatalogBrowseWasOpenRef.current = false; + return; + } + if (browseOpen && !appearanceCatalogBrowseWasOpenRef.current) { + tweakFavoritesSnapshotAtAppearanceCatalogOpenRef.current = new Set( + tweakFavorites.map((f) => f.fullUrl.trim()).filter(Boolean) + ); + } + appearanceCatalogBrowseWasOpenRef.current = browseOpen; + }, [browseOpen, isAppearanceMode, tweakFavorites]); + const [themeSearch, setThemeSearch] = useState(''); const [tweakSearch, setTweakSearch] = useState(''); const [kindFilter, setKindFilter] = useState<'all' | 'light' | 'dark'>('all'); @@ -779,7 +795,15 @@ export function ThemeCatalogSettings({ }, [patchSettings]); const setTweakApplied = useCallback( - async (fullUrl: string, apply: boolean, hint?: { displayName?: string; basename?: string }) => { + async ( + fullUrl: string, + apply: boolean, + hint?: { + displayName?: string; + basename?: string; + pruneUnpinnedFavoriteOnDisable?: boolean; + } + ) => { const trimmed = fullUrl.trim(); if (!trimmed) return; @@ -811,10 +835,25 @@ export function ThemeCatalogSettings({ }); } else { const nextEnabled = enabledTweakFullUrls.filter((u) => u !== trimmed); - patchSettings({ - themeRemoteEnabledTweakFullUrls: nextEnabled, - themeRemoteTweakFavorites: pruneTweakFavorites(tweakFavorites, nextEnabled), - }); + if (hint?.pruneUnpinnedFavoriteOnDisable) { + const enabledSet = new Set(nextEnabled); + const inLibraryBeforeThisCatalogVisit = + tweakFavoritesSnapshotAtAppearanceCatalogOpenRef.current; + const nextTweakFavs = tweakFavorites.filter( + (f) => + f.pinned === true || + enabledSet.has(f.fullUrl) || + inLibraryBeforeThisCatalogVisit.has(f.fullUrl.trim()) + ); + patchSettings({ + themeRemoteEnabledTweakFullUrls: nextEnabled, + themeRemoteTweakFavorites: nextTweakFavs, + }); + } else { + patchSettings({ + themeRemoteEnabledTweakFullUrls: nextEnabled, + }); + } } }, [enabledTweakFullUrls, patchSettings, prefetchFull, pruneTweakFavorites, tweakFavorites] @@ -1468,6 +1507,7 @@ export function ThemeCatalogSettings({ setTweakApplied(row.fullUrl, v, { displayName: row.displayName, basename: row.basename, + pruneUnpinnedFavoriteOnDisable: true, }) } />