feat(settings_sync): add syncing with store

This commit is contained in:
sethburkart123
2024-09-18 09:00:40 +10:00
parent 2a9e901b2b
commit c9550d0d37
4 changed files with 44 additions and 7 deletions
+2 -3
View File
@@ -8,11 +8,10 @@ const mutex = new Mutex();
let isDisabling = false; let isDisabling = false;
export const disableTheme = async () => { export const disableTheme = async () => {
console.log('Disabling theme', isDisabling)
if (isDisabling) return; if (isDisabling) return;
if (!settingsState.selectedTheme || settingsState.selectedTheme === '') { if (!settingsState.selectedTheme || settingsState.selectedTheme === '') {
console.log('Theme is already disabled, exit early') console.debug('Theme is already disabled, exit early')
// Theme is already disabled, exit early // Theme is already disabled, exit early
return; return;
} }
@@ -20,7 +19,7 @@ export const disableTheme = async () => {
const unlock = await mutex.lock(); const unlock = await mutex.lock();
try { try {
if (settingsState.selectedTheme) { if (settingsState.selectedTheme) {
console.log('Disabling theme:', settingsState.selectedTheme); console.debug('Disabling theme:', settingsState.selectedTheme);
const theme = await localforage.getItem(settingsState.selectedTheme) as CustomTheme; const theme = await localforage.getItem(settingsState.selectedTheme) as CustomTheme;
if (theme) { if (theme) {
await removeTheme(theme); await removeTheme(theme);
@@ -1,7 +1,7 @@
<script lang="ts"> <script lang="ts">
import type { CustomTheme, ThemeList } from '@/types/CustomThemes' import type { CustomTheme, ThemeList } from '@/types/CustomThemes'
import { getAvailableThemes } from '@/seqta/ui/themes/getAvailableThemes' import { getAvailableThemes } from '@/seqta/ui/themes/getAvailableThemes'
import { onMount } from 'svelte' import { onDestroy, onMount } from 'svelte'
import { OpenThemeCreator } from '@/seqta/ui/ThemeCreator' import { OpenThemeCreator } from '@/seqta/ui/ThemeCreator'
import shareTheme from '@/seqta/ui/themes/shareTheme' import shareTheme from '@/seqta/ui/themes/shareTheme'
import { InstallTheme } from '@/seqta/ui/themes/downloadTheme' import { InstallTheme } from '@/seqta/ui/themes/downloadTheme'
@@ -9,6 +9,7 @@
import { setTheme } from '@/seqta/ui/themes/setTheme' import { setTheme } from '@/seqta/ui/themes/setTheme'
import { deleteTheme } from '@/seqta/ui/themes/deleteTheme' import { deleteTheme } from '@/seqta/ui/themes/deleteTheme'
import { OpenStorePage } from '@/seqta/ui/renderStore' import { OpenStorePage } from '@/seqta/ui/renderStore'
import { themeUpdates } from '@/svelte-interface/hooks/ThemeUpdates'
let themes = $state<ThemeList | null>(null); let themes = $state<ThemeList | null>(null);
let { isEditMode } = $props<{ isEditMode: boolean }>(); let { isEditMode } = $props<{ isEditMode: boolean }>();
@@ -72,11 +73,10 @@
tempTheme = result; tempTheme = result;
await InstallTheme(result); await InstallTheme(result);
await fetchThemes(); await fetchThemes();
tempTheme = null;
} catch (error) { } catch (error) {
alert('Error parsing file. Please upload a valid JSON theme file.'); alert('Error parsing file. Please upload a valid JSON theme file.');
tempTheme = null;
} }
tempTheme = null;
}; };
reader.readAsText(file); reader.readAsText(file);
} }
@@ -87,6 +87,12 @@
onMount(async () => { onMount(async () => {
await fetchThemes(); await fetchThemes();
themeUpdates.addListener(fetchThemes);
})
onDestroy(() => {
themeUpdates.removeListener(fetchThemes);
}) })
</script> </script>
@@ -0,0 +1,29 @@
type ThemeUpdateCallback = () => void;
class ThemeUpdates {
private static instance: ThemeUpdates;
private listeners: Set<ThemeUpdateCallback> = new Set();
private constructor() {}
public static getInstance(): ThemeUpdates {
if (!ThemeUpdates.instance) {
ThemeUpdates.instance = new ThemeUpdates();
}
return ThemeUpdates.instance;
}
public addListener(callback: ThemeUpdateCallback): void {
this.listeners.add(callback);
}
public removeListener(callback: ThemeUpdateCallback): void {
this.listeners.delete(callback);
}
public triggerUpdate(): void {
this.listeners.forEach(callback => callback());
}
}
export const themeUpdates = ThemeUpdates.getInstance();
+4 -1
View File
@@ -14,6 +14,7 @@
import Header from '../components/store/Header.svelte' import Header from '../components/store/Header.svelte'
import { deleteTheme } from '@/seqta/ui/themes/deleteTheme' import { deleteTheme } from '@/seqta/ui/themes/deleteTheme'
import { getAvailableThemes } from '@/seqta/ui/themes/getAvailableThemes' import { getAvailableThemes } from '@/seqta/ui/themes/getAvailableThemes'
import { themeUpdates } from '../hooks/ThemeUpdates'
// State variables // State variables
let searchTerm = $state<string>(''); let searchTerm = $state<string>('');
@@ -97,12 +98,14 @@
await StoreDownloadTheme({themeContent: displayTheme}) await StoreDownloadTheme({themeContent: displayTheme})
// @ts-ignore // @ts-ignore
setTheme(displayTheme.id); setTheme(displayTheme.id);
themeUpdates.triggerUpdate();
await fetchCurrentThemes(); await fetchCurrentThemes();
} }
}} onRemove={async () => { }} onRemove={async () => {
if (displayTheme?.id) { if (displayTheme?.id) {
console.log('deleting theme', displayTheme.id); console.debug('deleting theme', displayTheme.id);
deleteTheme(displayTheme.id) deleteTheme(displayTheme.id)
themeUpdates.triggerUpdate();
await fetchCurrentThemes(); await fetchCurrentThemes();
} }
}} /> }} />