diff --git a/.eslintignore b/.eslintignore index 4805e34a4..c558f1256 100644 --- a/.eslintignore +++ b/.eslintignore @@ -22,5 +22,6 @@ plugins/* !plugins/talk-plugin-author-menu !plugins/talk-plugin-member-since !plugins/talk-plugin-ignore-user +!plugins/talk-plugin-remember-sort node_modules diff --git a/.gitignore b/.gitignore index 0a2ac00df..05e41eac3 100644 --- a/.gitignore +++ b/.gitignore @@ -38,5 +38,6 @@ plugins/* !plugins/talk-plugin-author-menu !plugins/talk-plugin-member-since !plugins/talk-plugin-ignore-user +!plugins/talk-plugin-remember-sort **/node_modules/* diff --git a/plugins/talk-plugin-remember-sort/client/.babelrc b/plugins/talk-plugin-remember-sort/client/.babelrc new file mode 100644 index 000000000..60be246eb --- /dev/null +++ b/plugins/talk-plugin-remember-sort/client/.babelrc @@ -0,0 +1,14 @@ +{ + "presets": [ + "es2015" + ], + "plugins": [ + "add-module-exports", + "transform-class-properties", + "transform-decorators-legacy", + "transform-object-assign", + "transform-object-rest-spread", + "transform-async-to-generator", + "transform-react-jsx" + ] +} \ No newline at end of file diff --git a/plugins/talk-plugin-remember-sort/client/.eslintrc.json b/plugins/talk-plugin-remember-sort/client/.eslintrc.json new file mode 100644 index 000000000..9fe56bd14 --- /dev/null +++ b/plugins/talk-plugin-remember-sort/client/.eslintrc.json @@ -0,0 +1,23 @@ +{ + "env": { + "browser": true, + "es6": true, + "mocha": true + }, + "parserOptions": { + "sourceType": "module", + "ecmaFeatures": { + "experimentalObjectRestSpread": true, + "jsx": true + } + }, + "parser": "babel-eslint", + "plugins": [ + "react" + ], + "rules": { + "react/jsx-uses-react": "error", + "react/jsx-uses-vars": "error", + "no-console": ["warn", { "allow": ["warn", "error"] }] + } +} diff --git a/plugins/talk-plugin-remember-sort/client/index.js b/plugins/talk-plugin-remember-sort/client/index.js new file mode 100644 index 000000000..515eda186 --- /dev/null +++ b/plugins/talk-plugin-remember-sort/client/index.js @@ -0,0 +1,34 @@ +import {setSort} from 'plugin-api/beta/client/actions/stream'; +import {sortOrderSelector, sortBySelector} from 'plugin-api/beta/client/selectors/stream'; + +const STORAGE_PATH = 'talkPluginRememberSort'; + +export default { + init: ({store, storage, introspection}) => { + + // TODO: workaround as this plugin is included in any target and + // embeds (e.g. admin), but should only be included inside the stream. + + // Detect if we are currently running inside the stream. + if (!store.getState().stream) { + return; + } + + const sort = JSON.parse(storage.getItem(STORAGE_PATH)); + if ( + sort && + introspection.isValidEnumValue('SORT_ORDER', sort.sortOrder) && + introspection.isValidEnumValue('SORT_COMMENTS_BY', sort.sortBy) + ) { + store.dispatch(setSort(sort)); + } + store.subscribe(() => { + const state = store.getState(); + const sortOrder = sortOrderSelector(state); + const sortBy = sortBySelector(state); + if (!sort || sort.sortOrder !== sortOrder || sort.sortBy !== sortBy) { + storage.setItem(STORAGE_PATH, JSON.stringify({sortOrder, sortBy})); + } + }); + } +}; diff --git a/plugins/talk-plugin-remember-sort/index.js b/plugins/talk-plugin-remember-sort/index.js new file mode 100644 index 000000000..f053ebf79 --- /dev/null +++ b/plugins/talk-plugin-remember-sort/index.js @@ -0,0 +1 @@ +module.exports = {};