diff --git a/src/plugins/shared_preferences/index.js b/src/plugins/shared_preferences/index.js new file mode 100644 index 000000000..62a291ade --- /dev/null +++ b/src/plugins/shared_preferences/index.js @@ -0,0 +1,162 @@ +/** + * Copyright 2018-present Facebook. + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * @format + */ + +import {ManagedTable, Text, Panel, colors, FlexRow, DataInspector} from 'sonar'; +import {SonarPlugin} from 'sonar'; + +const {clone} = require('lodash'); + +type SharedPreferencesChangeEvent = {| + name: string, + time: number, + deleted: boolean, + value: string, +|}; + +export type SharedPreferences = { + [name: string]: any, +}; + +type SharedPreferencesState = {| + sharedPreferences: ?SharedPreferences, + changesList: Array, +|}; + +const CHANGELOG_COLUMNS = { + event: { + value: 'Event', + }, + name: { + value: 'Name', + }, + value: { + value: 'Value', + }, +}; + +const CHANGELOG_COLUMN_SIZES = { + event: '20%', + name: '40%', + value: '40%', +}; + +const UPDATED_LABEL = Updated; +const DELETED_LABEL = Deleted; + +export default class extends SonarPlugin { + static title = 'Shared Preferences Viewer'; + static id = 'Preferences'; + + reducers = { + UpdateSharedPreferences(state: SharedPreferencesState, results: Object) { + return { + changesList: state.changesList, + sharedPreferences: results.results, + }; + }, + + ChangeSharedPreferences(state: SharedPreferencesState, event: Object) { + const sharedPreferences = {...(state.sharedPreferences || {})}; + if (event.change.deleted) { + delete sharedPreferences[event.change.name]; + } else { + sharedPreferences[event.change.name] = event.change.value; + } + return { + changesList: [event.change, ...state.changesList], + sharedPreferences, + }; + }, + }; + + init() { + this.client + .call('getSharedPreferences') + .then((results: SharedPreferences) => { + this.dispatchAction({results, type: 'UpdateSharedPreferences'}); + }); + + this.client.subscribe( + 'sharedPreferencesChange', + (change: SharedPreferencesChangeEvent) => { + this.dispatchAction({change, type: 'ChangeSharedPreferences'}); + }, + ); + this.client.subscribe( + 'newSharedPreferences', + (results: SharedPreferences) => { + this.dispatchAction({results, type: 'UpdateSharedPreferences'}); + }, + ); + } + + constructor() { + super(); + this.state = { + changesList: [], + sharedPreferences: null, + }; + } + + onSharedPreferencesChanged = (path: Array, value: any) => { + const values = this.state.sharedPreferences; + + let newValue = value; + if (path.length === 2 && values) { + newValue = clone(values[path[0]]); + newValue[path[1]] = value; + } + this.client + .call('setSharedPreference', { + preferenceName: path[0], + preferenceValue: newValue, + }) + .then((results: SharedPreferences) => { + this.dispatchAction({results, type: 'UpdateSharedPreferences'}); + }); + }; + + render() { + if (this.state.sharedPreferences == null) { + return null; + } + + return ( + + + + + + { + return { + columns: { + event: { + value: element.deleted ? DELETED_LABEL : UPDATED_LABEL, + }, + name: { + value: element.name, + }, + value: { + value: element.value, + }, + }, + + key: String(index), + }; + })} + /> + + + ); + } +} diff --git a/src/plugins/shared_preferences/package.json b/src/plugins/shared_preferences/package.json new file mode 100644 index 000000000..d7554afdd --- /dev/null +++ b/src/plugins/shared_preferences/package.json @@ -0,0 +1,9 @@ +{ + "name": "sonar-plugin-sharedpreferences", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.5" + } +} diff --git a/src/plugins/shared_preferences/yarn.lock b/src/plugins/shared_preferences/yarn.lock new file mode 100644 index 000000000..560de8e50 --- /dev/null +++ b/src/plugins/shared_preferences/yarn.lock @@ -0,0 +1,7 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +lodash@^4.17.5: + version "4.17.5" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"