diff options
Diffstat (limited to 'devtools/client/responsive.html/actions/devices.js')
-rw-r--r-- | devtools/client/responsive.html/actions/devices.js | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/devtools/client/responsive.html/actions/devices.js b/devtools/client/responsive.html/actions/devices.js new file mode 100644 index 000000000..b06134450 --- /dev/null +++ b/devtools/client/responsive.html/actions/devices.js @@ -0,0 +1,138 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +const { + ADD_DEVICE, + ADD_DEVICE_TYPE, + LOAD_DEVICE_LIST_START, + LOAD_DEVICE_LIST_ERROR, + LOAD_DEVICE_LIST_END, + UPDATE_DEVICE_DISPLAYED, + UPDATE_DEVICE_MODAL_OPEN, +} = require("./index"); + +const { getDevices } = require("devtools/client/shared/devices"); + +const Services = require("Services"); +const DISPLAYED_DEVICES_PREF = "devtools.responsive.html.displayedDeviceList"; + +/** + * Returns an object containing the user preference of displayed devices. + * + * @return {Object} containing two Sets: + * - added: Names of the devices that were explicitly enabled by the user + * - removed: Names of the devices that were explicitly removed by the user + */ +function loadPreferredDevices() { + let preferredDevices = { + "added": new Set(), + "removed": new Set(), + }; + + if (Services.prefs.prefHasUserValue(DISPLAYED_DEVICES_PREF)) { + try { + let savedData = Services.prefs.getCharPref(DISPLAYED_DEVICES_PREF); + savedData = JSON.parse(savedData); + if (savedData.added && savedData.removed) { + preferredDevices.added = new Set(savedData.added); + preferredDevices.removed = new Set(savedData.removed); + } + } catch (e) { + console.error(e); + } + } + + return preferredDevices; +} + +/** + * Update the displayed device list preference with the given device list. + * + * @param {Object} containing two Sets: + * - added: Names of the devices that were explicitly enabled by the user + * - removed: Names of the devices that were explicitly removed by the user + */ +function updatePreferredDevices(devices) { + let devicesToSave = { + added: Array.from(devices.added), + removed: Array.from(devices.removed), + }; + devicesToSave = JSON.stringify(devicesToSave); + Services.prefs.setCharPref(DISPLAYED_DEVICES_PREF, devicesToSave); +} + +module.exports = { + + // This function is only exported for testing purposes + _loadPreferredDevices: loadPreferredDevices, + + updatePreferredDevices: updatePreferredDevices, + + addDevice(device, deviceType) { + return { + type: ADD_DEVICE, + device, + deviceType, + }; + }, + + addDeviceType(deviceType) { + return { + type: ADD_DEVICE_TYPE, + deviceType, + }; + }, + + updateDeviceDisplayed(device, deviceType, displayed) { + return { + type: UPDATE_DEVICE_DISPLAYED, + device, + deviceType, + displayed, + }; + }, + + loadDevices() { + return function* (dispatch, getState) { + yield dispatch({ type: LOAD_DEVICE_LIST_START }); + let preferredDevices = loadPreferredDevices(); + let devices; + + try { + devices = yield getDevices(); + } catch (e) { + console.error("Could not load device list: " + e); + dispatch({ type: LOAD_DEVICE_LIST_ERROR }); + return; + } + + for (let type of devices.TYPES) { + dispatch(module.exports.addDeviceType(type)); + for (let device of devices[type]) { + if (device.os == "fxos") { + continue; + } + + let newDevice = Object.assign({}, device, { + displayed: preferredDevices.added.has(device.name) || + (device.featured && !(preferredDevices.removed.has(device.name))), + }); + + dispatch(module.exports.addDevice(newDevice, type)); + } + } + dispatch({ type: LOAD_DEVICE_LIST_END }); + }; + }, + + updateDeviceModalOpen(isOpen) { + return { + type: UPDATE_DEVICE_MODAL_OPEN, + isOpen, + }; + }, + +}; |