From fa77e8b92315e814fa99b083f3a85989a10fc23f Mon Sep 17 00:00:00 2001 From: KoloMl Date: Wed, 7 Aug 2024 03:26:32 +0400 Subject: [PATCH] Added search settings controller, sync settings in popup with the class --- src/lib/extension/settings/SearchSettings.js | 42 ++++++++++++++++++++ src/stores/search-preferences.js | 20 +++++++++- 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 src/lib/extension/settings/SearchSettings.js diff --git a/src/lib/extension/settings/SearchSettings.js b/src/lib/extension/settings/SearchSettings.js new file mode 100644 index 0000000..e5de971 --- /dev/null +++ b/src/lib/extension/settings/SearchSettings.js @@ -0,0 +1,42 @@ +import CacheableSettings from "$lib/extension/base/CacheableSettings.js"; + +export default class SearchSettings extends CacheableSettings { + constructor() { + super("search"); + } + + async resolvePropertiesSuggestionsEnabled() { + return this._resolveSetting("suggestProperties", false); + } + + async resolvePropertiesSuggestionsPosition() { + return this._resolveSetting("suggestPropertiesPosition", "start"); + } + + async setPropertiesSuggestions(isEnabled) { + return this._writeSetting("suggestProperties", isEnabled); + } + + async setPropertiesSuggestionsPosition(position) { + return this._writeSetting("suggestPropertiesPosition", position); + } + + /** + * @param {function(SearchSettingsObject): void} callback + * @return {function(): void} + */ + subscribe(callback) { + return super.subscribe(rawSettings => { + callback({ + suggestProperties: rawSettings.suggestProperties ?? false, + suggestPropertiesPosition: rawSettings.suggestPropertiesPosition ?? "start", + }); + }); + } +} + +/** + * @typedef {Object} SearchSettingsObject + * @property {boolean} suggestProperties + * @property {"start"|"end"} suggestPropertiesPosition + */ diff --git a/src/stores/search-preferences.js b/src/stores/search-preferences.js index 0a150d7..f485261 100644 --- a/src/stores/search-preferences.js +++ b/src/stores/search-preferences.js @@ -1,6 +1,24 @@ import {writable} from "svelte/store"; +import SearchSettings from "$lib/extension/settings/SearchSettings.js"; export const searchPropertiesSuggestionsEnabled = writable(false); -/** @type {import('svelte').Writable<"start"|"end">} */ +/** @type {import('svelte/store').Writable<"start"|"end">} */ export const searchPropertiesSuggestionsPosition = writable('start'); + +const searchSettings = new SearchSettings(); + +Promise.allSettled([ + // First we wait for all properties to load and save + searchSettings.resolvePropertiesSuggestionsEnabled().then(v => searchPropertiesSuggestionsEnabled.set(v)), + searchSettings.resolvePropertiesSuggestionsPosition().then(v => searchPropertiesSuggestionsPosition.set(v)) +]).then(() => { + // And then we can start reading value changes from the writable objects + searchPropertiesSuggestionsEnabled.subscribe(value => { + void searchSettings.setPropertiesSuggestions(value); + }); + + searchPropertiesSuggestionsPosition.subscribe(value => { + void searchSettings.setPropertiesSuggestionsPosition(value); + }); +})