logo

pleroma-fe

My custom branche(s) on git.pleroma.social/pleroma/pleroma-fe
commit: 7ee87c7618bfba986ec7a04581273629a1db9983
parent: f3ca011fbedb2ce6271bcc887d290828ccd1d284
Author: lambadalambda <gitgud@rogerbraun.net>
Date:   Sun,  9 Apr 2017 16:21:54 -0400

Merge branch 'feature/filtering' into 'develop'

Feature/filtering

See merge request !68

Diffstat:

Msrc/components/settings/settings.js8+++++++-
Msrc/components/settings/settings.vue11++++++++++-
Msrc/components/status/status.js14+++++++++++++-
Msrc/components/status/status.vue11++++++++---
Msrc/lib/persisted_state.js34+++++++++++++++++++++++-----------
Msrc/main.js1+
Msrc/modules/config.js3++-
7 files changed, 64 insertions(+), 18 deletions(-)

diff --git a/src/components/settings/settings.js b/src/components/settings/settings.js @@ -1,11 +1,13 @@ import StyleSwitcher from '../style_switcher/style_switcher.vue' +import { filter, trim } from 'lodash' const settings = { data () { return { hideAttachmentsLocal: this.$store.state.config.hideAttachments, hideAttachmentsInConvLocal: this.$store.state.config.hideAttachmentsInConv, - hideNsfwLocal: this.$store.state.config.hideNsfw + hideNsfwLocal: this.$store.state.config.hideNsfw, + muteWordsString: this.$store.state.config.muteWords.join('\n') } }, components: { @@ -20,6 +22,10 @@ const settings = { }, hideNsfwLocal (value) { this.$store.dispatch('setOption', { name: 'hideNsfw', value }) + }, + muteWordsString (value) { + value = filter(value.split('\n'), (word) => trim(word).length > 0) + this.$store.dispatch('setOption', { name: 'muteWords', value }) } } } diff --git a/src/components/settings/settings.vue b/src/components/settings/settings.vue @@ -9,6 +9,11 @@ <style-switcher></style-switcher> </div> <div class="setting-item"> + <h2>Filtering</h2> + <p>All notices containing these words will be muted, one per line</p> + <textarea id="muteWords" v-model="muteWordsString"></textarea> + </div> + <div class="setting-item"> <h2>Attachments</h2> <ul class="setting-list"> <li> @@ -32,9 +37,13 @@ <script src="./settings.js"> </script> -<style> +<style lang="scss"> .setting-item { margin: 1em 1em 1.4em; + textarea { + width: 100%; + height: 100px; + } } .setting-list { list-style-type: none; diff --git a/src/components/status/status.js b/src/components/status/status.js @@ -4,6 +4,7 @@ import RetweetButton from '../retweet_button/retweet_button.vue' import DeleteButton from '../delete_button/delete_button.vue' import PostStatusForm from '../post_status_form/post_status_form.vue' import UserCardContent from '../user_card_content/user_card_content.vue' +import { filter } from 'lodash' const Status = { props: [ @@ -19,6 +20,9 @@ const Status = { userExpanded: false }), computed: { + muteWords () { + return this.$store.state.config.muteWords + }, hideAttachments () { return (this.$store.state.config.hideAttachments && !this.inConversation) || (this.$store.state.config.hideAttachmentsInConv && this.inConversation) @@ -35,7 +39,15 @@ const Status = { loggedIn () { return !!this.$store.state.users.currentUser }, - muted () { return !this.unmuted && this.status.user.muted }, + muteWordHits () { + const statusText = this.status.text.toLowerCase() + const hits = filter(this.muteWords, (muteWord) => { + return statusText.includes(muteWord.toLowerCase()) + }) + + return hits + }, + muted () { return !this.unmuted && (this.status.user.muted || this.muteWordHits.length > 0) }, isReply () { return !!this.status.in_reply_to_status_id }, borderColor () { return { diff --git a/src/components/status/status.vue b/src/components/status/status.vue @@ -3,6 +3,7 @@ <template v-if="muted"> <div class="media status container muted"> <small><router-link :to="{ name: 'user-profile', params: { id: status.user.id } }">{{status.user.screen_name}}</router-link></small> + <small class="muteWords">{{muteWordHits.join(', ')}}</small> <a href="#" class="unmute" @click.prevent="toggleMute"><i class="icon-eye-off"></i></a> </div> </template> @@ -52,10 +53,10 @@ <small> <a href="#" @click.prevent="toggleExpanded" ><i class="icon-plus-squared"></i></a> </small> - <small v-if="status.user.muted"> - <a href="#" @click.prevent="toggleMute" ><i class="icon-eye-off"></i></a> - </small> </template> + <small v-if="unmuted"> + <a href="#" @click.prevent="toggleMute" ><i class="icon-eye-off"></i></a> + </small> <small v-if="!status.is_local" class="source_url"> <a :href="status.external_url" target="_blank" ><i class="icon-binoculars"></i></a> </small> @@ -167,6 +168,10 @@ button { margin-left: auto; } + + .muteWords { + margin-left: 10px; + } } a.unmute { diff --git a/src/lib/persisted_state.js b/src/lib/persisted_state.js @@ -3,6 +3,8 @@ import objectPath from 'object-path' import localforage from 'localforage' import { throttle, each } from 'lodash' +let loaded = false + const defaultReducer = (state, paths) => ( paths.length === 0 ? state : paths.reduce((substate, path) => { objectPath.set(substate, path, objectPath.get(state, path)) @@ -15,7 +17,11 @@ const defaultStorage = (() => { })() const defaultSetState = (key, state, storage) => { - return storage.setItem(key, state) + if (!loaded) { + console.log('waiting for old state to be loaded...') + } else { + return storage.setItem(key, state) + } } export default function createPersistedState ({ @@ -32,17 +38,23 @@ export default function createPersistedState ({ } = {}) { return store => { getState(key, storage).then((savedState) => { - if (typeof savedState === 'object') { - // build user cache - const usersState = savedState.users || {} - usersState.usersObject = {} - const users = usersState.users || [] - each(users, (user) => { usersState.usersObject[user.id] = user }) - savedState.users = usersState + try { + if (typeof savedState === 'object') { + // build user cache + const usersState = savedState.users || {} + usersState.usersObject = {} + const users = usersState.users || [] + each(users, (user) => { usersState.usersObject[user.id] = user }) + savedState.users = usersState - store.replaceState( - merge({}, store.state, savedState) - ) + store.replaceState( + merge({}, store.state, savedState) + ) + } + loaded = true + } catch (e) { + console.log("Couldn't load state") + loaded = true } }) diff --git a/src/main.js b/src/main.js @@ -33,6 +33,7 @@ const persistedStateOptions = { 'config.hideAttachments', 'config.hideAttachmentsInConv', 'config.hideNsfw', + 'config.muteWords', 'statuses.notifications', 'users.users' ] diff --git a/src/modules/config.js b/src/modules/config.js @@ -6,7 +6,8 @@ const defaultState = { colors: {}, hideAttachments: false, hideAttachmentsInConv: false, - hideNsfw: true + hideNsfw: true, + muteWords: [] } const config = {