VulpesOS/gaia/apps/homescreen/js/settings.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

118 lines
2.9 KiB
JavaScript
Executable file

'use strict';
(function(exports) {
/**
* Name of the global home screen settings datastore.
*/
const SETTINGS_STORE = 'homescreen_settings';
/**
* Stored settings version, for use when changing/refactoring settings
* storage.
*/
const SETTINGS_VERSION = 0;
/**
* Name of the global home screen columns setting.
*/
const COLUMNS_SETTING = 'grid.cols';
/**
* Name of the global home screen paging setting.
*/
const PAGING_SETTING = 'grid.paging';
function Settings() {
// Initialise default settings
this.small = false;
this.scrollSnapping = false;
this.firstRun = false;
// Listen to external settings changes
if (navigator.getDataStores) {
navigator.getDataStores(SETTINGS_STORE).then(stores => {
if (stores.length < 1) {
return Promise.reject('Settings datastore inaccessible');
}
var signalChange = () => {
this.save();
window.dispatchEvent(new CustomEvent('settings-changed'));
};
var syncSmallSetting = (signal) => {
stores[0].get(COLUMNS_SETTING).then(cols => {
var oldSmall = this.small;
this.small = cols > 3;
if (this.small !== oldSmall) {
signalChange();
}
});
};
var syncPagingSetting = () => {
stores[0].get(PAGING_SETTING).then(paging => {
var oldSnapping = this.scrollSnapping;
this.scrollSnapping = paging || false;
if (this.scrollSnapping !== oldSnapping) {
signalChange();
}
});
};
stores[0].addEventListener('change', e => {
switch (e.id) {
case COLUMNS_SETTING:
syncSmallSetting();
break;
case PAGING_SETTING:
syncPagingSetting();
break;
}
});
syncSmallSetting();
syncPagingSetting();
}, e => {
console.error('Error retrieving home screen settings datastore:', e);
});
} else {
console.error('Datastore API unavailable');
}
// Restore existing settings
var settingsString = localStorage.getItem('settings');
if (!settingsString) {
this.firstRun = true;
return;
}
var settings = JSON.parse(settingsString);
if (settings.version !== SETTINGS_VERSION) {
return;
}
this.small = settings.small || false;
this.scrollSnapping = settings.scrollSnapping || false;
// Monitor global homescreen settings
if (!navigator.getDataStores) {
console.error('Datastore API unavailable');
return;
}
}
Settings.prototype = {
save: function() {
localStorage.setItem('settings', JSON.stringify({
version: SETTINGS_VERSION,
small: this.small,
scrollSnapping: this.scrollSnapping
}));
}
};
exports.Settings = Settings;
}(window));