Emoji favicons for the web
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: minor fixes

- fix enableflags
- code cleanup, renaming

+39 -43
+4 -2
source/background.ts
··· 76 76 url: string | void, 77 77 settings: Settings, 78 78 ): [FaviconData | void, boolean] { 79 - const { ignoreList, siteList, features } = settings; 79 + const { autoselectorVersion, ignoreList, siteList, features } = settings; 80 + const includeFlags = features.enableAutoselectorIncludeCountryFlags; 81 + 80 82 if (!url) return [undefined, false]; // Should never happen... 81 83 82 84 const shouldIgnore = features.enableSiteIgnore && ··· 89 91 return [favicons[0], true]; 90 92 } else if (features.enableFaviconAutofill) { 91 93 if (!autoselector) { 92 - autoselector = new Autoselector(settings.autoselectorVersion); 94 + autoselector = new Autoselector(autoselectorVersion, { includeFlags }); 93 95 } 94 96 return [autoselector.selectFavicon(url), !!features.enableOverrideAll]; 95 97 }
+16 -21
source/hooks/use_browser_storage.ts
··· 30 30 const [cache, setCache] = useState<Type>(defaultState); 31 31 const [loading, setLoading] = useState<boolean>(true); 32 32 33 - useEffect(() => { 34 - storage.sync.get(keys) 35 - .then((storage) => { 36 - if (runtime?.lastError?.message) setError(runtime?.lastError?.message); 37 - if (Object.keys(storage).length === Object.keys(defaultState).length) { 38 - setCache(storage as Type); 39 - } 40 - setLoading(false); 41 - }); 33 + useEffect(function setupStorageFetcher() { 34 + updateState(); 35 + browserAPI.storage.onChanged.addListener(updateState); 42 36 43 - browserAPI.storage.onChanged.addListener(async () => { 37 + async function updateState() { 44 38 const nextState = await storage.sync.get(keys) as Type; 39 + if (runtime?.lastError?.message) setError(runtime?.lastError?.message); 40 + 45 41 if (Object.keys(nextState).length === Object.keys(defaultState).length) { 46 42 setCache(nextState); 47 43 } 48 - }); 44 + setLoading(false); 45 + } 46 + 47 + return () => { 48 + browserAPI.storage.onChanged.removeListener(updateState); 49 + }; 49 50 }, []); 50 51 51 52 const saveToStorage = useCallback( 52 - (next: Partial<Type> | void): Promise<void> => { 53 - if (!next) return Promise.resolve(); 54 - 55 - return storage.sync.set(next) 56 - .then(() => { 57 - if (runtime?.lastError?.message) { 58 - setError(runtime?.lastError?.message); 59 - throw new Error(runtime?.lastError?.message); 60 - } 61 - }); 53 + async (next: Partial<Type> | void): Promise<void> => { 54 + if (!next) return; 55 + await storage.sync.set(next); 56 + if (runtime?.lastError?.message) setError(runtime?.lastError?.message); 62 57 }, 63 58 [], 64 59 );
+19 -20
source/popup.tsx
··· 26 26 27 27 const autoselector = useMemo(() => { 28 28 if (!cache?.autoselectorVersion) return null; 29 - return new Autoselector(cache?.autoselectorVersion); 29 + const includeFlags = cache?.features?.enableAutoselectorIncludeCountryFlags; 30 + return new Autoselector(cache?.autoselectorVersion, { includeFlags }); 30 31 }, [cache?.autoselectorVersion]); 31 32 32 33 const [autoselectedEmoji, autoselectedURL] = useMemo(() => { ··· 36 37 return [emoji, faviconURL]; 37 38 }, [autoselector, url]); 38 39 39 - useEffect(() => { 40 + useEffect(function updateCurrTab() { 40 41 async function setup() { 41 42 const [activeTab] = await browserAPI.tabs.query(queryOptions); 42 43 setCurrTab(activeTab); 43 44 } 44 45 browserAPI.storage.onChanged.addListener(setup); 45 46 browserAPI.tabs.onUpdated.addListener(setup); 46 - 47 47 setup().catch(console.error); 48 + (() => { 49 + browserAPI.storage.onChanged.removeListener(setup); 50 + browserAPI.tabs.onUpdated.removeListener(setup); 51 + }); 48 52 }, [cache]); 49 53 50 - const updateSite = useCallback((shouldAdd: boolean) => { 54 + const updateSiteList = useCallback((shouldOverride: boolean) => { 51 55 if (!url) return; 52 - const origin = (new URL(url)).origin; 53 - const siteList = cache?.siteList || []; 54 - const nextList = siteList.filter((filter) => filter.matcher !== origin); 55 - if (shouldAdd && autoselectedEmoji) { 56 - nextList.push(new FaviconData(autoselectedEmoji, origin)); 56 + const { origin } = new URL(url); 57 + const siteList = (cache?.siteList || []) 58 + .filter(({ matcher }) => matcher !== origin); // Remove dupes 59 + 60 + if (shouldOverride && autoselectedEmoji) { 61 + siteList.push(new FaviconData(autoselectedEmoji, origin)); 57 62 } 58 - setCache({ siteList: nextList }, true); 63 + 64 + setCache({ siteList }, true); 59 65 }, [url, cache, setCache]); 60 66 61 - const { status, save } = useStatus(error || '', updateSite); 62 - 63 - const addToOverrides = useCallback(() => { 64 - save(true); 65 - }, [save]); 66 - 67 - const removeFromOverrides = useCallback(() => { 68 - save(false); 69 - }, [save]); 70 - 67 + const { status, save } = useStatus(error || '', updateSiteList); 68 + const addToOverrides = useCallback(() => save(true), [save]); 69 + const removeFromOverrides = useCallback(() => save(false), [save]); 71 70 const goToOptions = useCallback(() => { 72 71 browserAPI.runtime.openOptionsPage(); 73 72 }, []);