From e56f3b0817345dc034e8d630de8b0bc734168b82 Mon Sep 17 00:00:00 2001
From: AkiraFukushima
Date: Sat, 8 May 2021 20:59:59 +0900
Subject: [PATCH 1/5] refs #2258 Display filters in settings
---
src/config/locales/en/translation.json | 3 +
src/renderer/components/Settings.vue | 4 ++
src/renderer/components/Settings/Filters.vue | 62 ++++++++++++++++++++
src/renderer/router/index.ts | 5 ++
src/renderer/store/Settings.ts | 5 +-
src/renderer/store/Settings/Filters.ts | 54 +++++++++++++++++
6 files changed, 132 insertions(+), 1 deletion(-)
create mode 100644 src/renderer/components/Settings/Filters.vue
create mode 100644 src/renderer/store/Settings/Filters.ts
diff --git a/src/config/locales/en/translation.json b/src/config/locales/en/translation.json
index 0f69a0e8..1960585e 100644
--- a/src/config/locales/en/translation.json
+++ b/src/config/locales/en/translation.json
@@ -114,6 +114,9 @@
"local": "Local Timeline",
"public": "Public Timeline"
}
+ },
+ "filters": {
+ "title": "Filters"
}
},
"preferences": {
diff --git a/src/renderer/components/Settings.vue b/src/renderer/components/Settings.vue
index 5ade0bd0..2a1126ad 100644
--- a/src/renderer/components/Settings.vue
+++ b/src/renderer/components/Settings.vue
@@ -28,6 +28,10 @@
{{ $t('settings.timeline.title') }}
+
+
+ {{ $t('settings.filters.title') }}
+
diff --git a/src/renderer/components/Settings/Filters.vue b/src/renderer/components/Settings/Filters.vue
new file mode 100644
index 00000000..5da58ae4
--- /dev/null
+++ b/src/renderer/components/Settings/Filters.vue
@@ -0,0 +1,62 @@
+
+
+
{{ $t('settings.filters.title') }}
+
+
+
+
+
+ {{ filters[scope.$index].context.join(',') }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/renderer/router/index.ts b/src/renderer/router/index.ts
index 0b15b505..0cdc2ae5 100644
--- a/src/renderer/router/index.ts
+++ b/src/renderer/router/index.ts
@@ -14,6 +14,7 @@ import GlobalHeader from '@/components/GlobalHeader.vue'
import Settings from '@/components/Settings.vue'
import SettingsGeneral from '@/components/Settings/General.vue'
import SettingsTimeline from '@/components/Settings/Timeline.vue'
+import SettingsFilters from '@/components/Settings/Filters.vue'
import TimelineSpace from '@/components/TimelineSpace.vue'
import TimelineSpaceContentsHome from '@/components/TimelineSpace/Contents/Home.vue'
import TimelineSpaceContentsNotifications from '@/components/TimelineSpace/Contents/Notifications.vue'
@@ -100,6 +101,10 @@ const router = new Router({
{
path: 'timeline',
component: SettingsTimeline
+ },
+ {
+ path: 'filters',
+ component: SettingsFilters
}
]
},
diff --git a/src/renderer/store/Settings.ts b/src/renderer/store/Settings.ts
index a9015a1b..431e2ba2 100644
--- a/src/renderer/store/Settings.ts
+++ b/src/renderer/store/Settings.ts
@@ -1,5 +1,6 @@
import General, { GeneralState } from './Settings/General'
import Timeline, { TimelineState } from './Settings/Timeline'
+import Filters, { FiltersState } from './Settings/Filters'
import { Module, MutationTree } from 'vuex'
import { RootState } from '@/store'
@@ -24,6 +25,7 @@ const mutations: MutationTree = {
type SettingsModule = {
General: GeneralState
Timeline: TimelineState
+ Filter: FiltersState
}
export type SettingsModuleState = SettingsModule & SettingsState
@@ -32,7 +34,8 @@ const Settings: Module = {
namespaced: true,
modules: {
General,
- Timeline
+ Timeline,
+ Filters
},
state: state,
mutations: mutations
diff --git a/src/renderer/store/Settings/Filters.ts b/src/renderer/store/Settings/Filters.ts
new file mode 100644
index 00000000..ac5f1a58
--- /dev/null
+++ b/src/renderer/store/Settings/Filters.ts
@@ -0,0 +1,54 @@
+import { Module, MutationTree, ActionTree } from 'vuex'
+import generator, { Entity } from 'megalodon'
+import { RootState } from '@/store'
+
+export type FiltersState = {
+ filters: Array
+ filtersLoading: boolean
+}
+
+const state = (): FiltersState => ({
+ filters: [],
+ filtersLoading: false
+})
+
+export const MUTATION_TYPES = {
+ UPDATE_FILTERS: 'updateFilters',
+ CHANGE_LOADING: 'changeLoading'
+}
+
+export const mutations: MutationTree = {
+ [MUTATION_TYPES.UPDATE_FILTERS]: (state, filters: Array) => {
+ state.filters = filters
+ },
+ [MUTATION_TYPES.CHANGE_LOADING]: (state, loading: boolean) => {
+ state.filtersLoading = loading
+ }
+}
+export const actions: ActionTree = {
+ fetchFilters: async ({ commit, rootState }): Promise> => {
+ const client = generator(
+ rootState.TimelineSpace.sns,
+ rootState.TimelineSpace.account.baseURL,
+ rootState.TimelineSpace.account.accessToken,
+ rootState.App.userAgent
+ )
+ try {
+ commit(MUTATION_TYPES.CHANGE_LOADING, true)
+ const res = await client.getFilters()
+ commit(MUTATION_TYPES.UPDATE_FILTERS, res.data)
+ return res.data
+ } finally {
+ commit(MUTATION_TYPES.CHANGE_LOADING, false)
+ }
+ }
+}
+
+const Filters: Module = {
+ namespaced: true,
+ state: state,
+ mutations: mutations,
+ actions: actions
+}
+
+export default Filters
From 783ddddafef57d5a6ec3677d43b2434fdbd2a457 Mon Sep 17 00:00:00 2001
From: AkiraFukushima
Date: Mon, 10 May 2021 00:49:24 +0900
Subject: [PATCH 2/5] refs #2258 Add edit filter form
---
src/config/locales/en/translation.json | 29 ++-
src/renderer/components/Settings/Filters.vue | 24 +++
.../components/Settings/Filters/Edit.vue | 195 ++++++++++++++++++
src/renderer/router/index.ts | 6 +
src/renderer/store/Settings.ts | 4 +-
src/renderer/store/Settings/Filters.ts | 12 +-
src/renderer/store/Settings/Filters/Edit.ts | 86 ++++++++
7 files changed, 351 insertions(+), 5 deletions(-)
create mode 100644 src/renderer/components/Settings/Filters/Edit.vue
create mode 100644 src/renderer/store/Settings/Filters/Edit.ts
diff --git a/src/config/locales/en/translation.json b/src/config/locales/en/translation.json
index 1960585e..06405c53 100644
--- a/src/config/locales/en/translation.json
+++ b/src/config/locales/en/translation.json
@@ -116,7 +116,31 @@
}
},
"filters": {
- "title": "Filters"
+ "title": "Filters",
+ "edit": {
+ "title": "Edit",
+ "form": {
+ "phrase": "Keyword or phrase",
+ "expire": "Expire after",
+ "context": "Filter contexts",
+ "irreversible": "Drop instead of hide",
+ "whole_word": "Whole word",
+ "submit": "Update",
+ "cancel": "Cancel"
+ },
+ "expires": {
+ "never": "Never",
+ "30_minutes": "30 minutes",
+ "1_hour": "1 hour",
+ "6_hours": "6 hours",
+ "12_hours": "12 hours",
+ "1_day": "1 day",
+ "1_week": "1 week"
+ }
+ },
+ "delete": {
+ "title": "Delete"
+ }
}
},
"preferences": {
@@ -455,7 +479,8 @@
"domain_confirmed": "{{domain}} is confirmed, please login",
"domain_doesnt_exist": "Failed to connect {{domain}}, make sure the server URL",
"loading": "Loading...",
- "language_not_support_spellchecker_error": "This language is not supported by Spellchecker"
+ "language_not_support_spellchecker_error": "This language is not supported by Spellchecker",
+ "update_filter_error": "Failed to update the filter"
},
"validation": {
"login": {
diff --git a/src/renderer/components/Settings/Filters.vue b/src/renderer/components/Settings/Filters.vue
index 5da58ae4..4751e972 100644
--- a/src/renderer/components/Settings/Filters.vue
+++ b/src/renderer/components/Settings/Filters.vue
@@ -17,6 +17,22 @@
+
+
+
+
+ {{ $t('settings.filters.edit.title') }}
+
+
+
+
+
+
+
+ {{ $t('settings.filters.delete.title') }}
+
+
+
@@ -38,6 +54,14 @@ export default {
},
async created() {
await this.$store.dispatch('Settings/Filters/fetchFilters')
+ },
+ methods: {
+ id() {
+ return this.$route.params.id
+ },
+ deleteFilter(id) {
+ console.log(id)
+ }
}
}
diff --git a/src/renderer/components/Settings/Filters/Edit.vue b/src/renderer/components/Settings/Filters/Edit.vue
new file mode 100644
index 00000000..f5927fc2
--- /dev/null
+++ b/src/renderer/components/Settings/Filters/Edit.vue
@@ -0,0 +1,195 @@
+
+
+
{{ $t('settings.filters.edit.title') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('settings.filters.edit.form.irreversible') }}
+
+
+ {{ $t('settings.filters.edit.form.whole_word') }}
+
+
+ {{ $t('settings.filters.edit.form.submit') }}
+ {{ $t('settings.filters.edit.form.cancel') }}
+
+
+
+
+
+
+
+
diff --git a/src/renderer/router/index.ts b/src/renderer/router/index.ts
index 0cdc2ae5..a8f5418f 100644
--- a/src/renderer/router/index.ts
+++ b/src/renderer/router/index.ts
@@ -15,6 +15,7 @@ import Settings from '@/components/Settings.vue'
import SettingsGeneral from '@/components/Settings/General.vue'
import SettingsTimeline from '@/components/Settings/Timeline.vue'
import SettingsFilters from '@/components/Settings/Filters.vue'
+import SettingsFiltersEdit from '@/components/Settings/Filters/Edit.vue'
import TimelineSpace from '@/components/TimelineSpace.vue'
import TimelineSpaceContentsHome from '@/components/TimelineSpace/Contents/Home.vue'
import TimelineSpaceContentsNotifications from '@/components/TimelineSpace/Contents/Notifications.vue'
@@ -105,6 +106,11 @@ const router = new Router({
{
path: 'filters',
component: SettingsFilters
+ },
+ {
+ path: 'filters/:filter_id/edit',
+ component: SettingsFiltersEdit,
+ props: true
}
]
},
diff --git a/src/renderer/store/Settings.ts b/src/renderer/store/Settings.ts
index 431e2ba2..c0e28810 100644
--- a/src/renderer/store/Settings.ts
+++ b/src/renderer/store/Settings.ts
@@ -1,6 +1,6 @@
import General, { GeneralState } from './Settings/General'
import Timeline, { TimelineState } from './Settings/Timeline'
-import Filters, { FiltersState } from './Settings/Filters'
+import Filters, { FiltersModuleState } from './Settings/Filters'
import { Module, MutationTree } from 'vuex'
import { RootState } from '@/store'
@@ -25,7 +25,7 @@ const mutations: MutationTree = {
type SettingsModule = {
General: GeneralState
Timeline: TimelineState
- Filter: FiltersState
+ Filter: FiltersModuleState
}
export type SettingsModuleState = SettingsModule & SettingsState
diff --git a/src/renderer/store/Settings/Filters.ts b/src/renderer/store/Settings/Filters.ts
index ac5f1a58..93937189 100644
--- a/src/renderer/store/Settings/Filters.ts
+++ b/src/renderer/store/Settings/Filters.ts
@@ -1,6 +1,7 @@
import { Module, MutationTree, ActionTree } from 'vuex'
import generator, { Entity } from 'megalodon'
import { RootState } from '@/store'
+import EditFilters, { EditFiltersState } from './Filters/Edit'
export type FiltersState = {
filters: Array
@@ -44,11 +45,20 @@ export const actions: ActionTree = {
}
}
+type FiltersModule = {
+ Edit: EditFiltersState
+}
+
+export type FiltersModuleState = FiltersModule & FiltersState
+
const Filters: Module = {
namespaced: true,
state: state,
mutations: mutations,
- actions: actions
+ actions: actions,
+ modules: {
+ Edit: EditFilters
+ }
}
export default Filters
diff --git a/src/renderer/store/Settings/Filters/Edit.ts b/src/renderer/store/Settings/Filters/Edit.ts
new file mode 100644
index 00000000..ef387a37
--- /dev/null
+++ b/src/renderer/store/Settings/Filters/Edit.ts
@@ -0,0 +1,86 @@
+import generator, { Entity } from 'megalodon'
+import { Module, MutationTree, ActionTree } from 'vuex'
+import { RootState } from '@/store'
+
+export type EditFiltersState = {
+ filter: Entity.Filter | null
+ loading: boolean
+}
+
+const state = (): EditFiltersState => ({
+ filter: null,
+ loading: false
+})
+
+export const MUTATION_TYPES = {
+ UPDATE_FILTER: 'updateFilter',
+ CHANGE_LOADING: 'changeLoading'
+}
+
+export const mutations: MutationTree = {
+ [MUTATION_TYPES.UPDATE_FILTER]: (state, filter: Entity.Filter) => {
+ state.filter = filter
+ },
+ [MUTATION_TYPES.CHANGE_LOADING]: (state, loading: boolean) => {
+ state.loading = loading
+ }
+}
+
+export const actions: ActionTree = {
+ fetchFilter: async ({ commit, rootState }, id: string): Promise => {
+ const client = generator(
+ rootState.TimelineSpace.sns,
+ rootState.TimelineSpace.account.baseURL,
+ rootState.TimelineSpace.account.accessToken,
+ rootState.App.userAgent
+ )
+ try {
+ commit(MUTATION_TYPES.CHANGE_LOADING, true)
+ const res = await client.getFilter(id)
+ commit(MUTATION_TYPES.UPDATE_FILTER, res.data)
+ return res.data
+ } finally {
+ commit(MUTATION_TYPES.CHANGE_LOADING, false)
+ }
+ },
+ editFilter: ({ commit, state }, filter: any) => {
+ const newFilter = Object.assign({}, state.filter, filter)
+ commit(MUTATION_TYPES.UPDATE_FILTER, newFilter)
+ },
+ updateFilter: async ({ commit, state, rootState }): Promise => {
+ if (state.filter === null) {
+ throw new Error('filter is not set')
+ }
+ const client = generator(
+ rootState.TimelineSpace.sns,
+ rootState.TimelineSpace.account.baseURL,
+ rootState.TimelineSpace.account.accessToken,
+ rootState.App.userAgent
+ )
+ try {
+ commit(MUTATION_TYPES.CHANGE_LOADING, true)
+ let options = {
+ irreversible: state.filter.irreversible,
+ whole_word: state.filter.whole_word
+ }
+ if (state.filter.expires_at !== null) {
+ options = Object.assign({}, options, {
+ expires_in: state.filter.expires_at
+ })
+ }
+ const res = await client.updateFilter(state.filter.id, state.filter.phrase, state.filter.context, options)
+ return res.data
+ } finally {
+ commit(MUTATION_TYPES.CHANGE_LOADING, false)
+ }
+ }
+}
+
+const EditFilters: Module = {
+ namespaced: true,
+ state: state,
+ mutations: mutations,
+ actions: actions
+}
+
+export default EditFilters
From 9b16716a8046a914834ab688426133a69e38568f Mon Sep 17 00:00:00 2001
From: AkiraFukushima
Date: Mon, 10 May 2021 01:05:03 +0900
Subject: [PATCH 3/5] refs #2258 Add delete filter form
---
src/config/locales/en/translation.json | 5 ++++-
src/renderer/components/Settings/Filters.vue | 8 +++++++-
src/renderer/store/Settings/Filters.ts | 15 +++++++++++++++
3 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/src/config/locales/en/translation.json b/src/config/locales/en/translation.json
index 06405c53..50a6eb82 100644
--- a/src/config/locales/en/translation.json
+++ b/src/config/locales/en/translation.json
@@ -139,7 +139,10 @@
}
},
"delete": {
- "title": "Delete"
+ "title": "Delete",
+ "confirm": "Are you sure to delete this filter?",
+ "confirm_ok": "Delete",
+ "confirm_cancel": "Cancel"
}
}
},
diff --git a/src/renderer/components/Settings/Filters.vue b/src/renderer/components/Settings/Filters.vue
index 4751e972..7bda870f 100644
--- a/src/renderer/components/Settings/Filters.vue
+++ b/src/renderer/components/Settings/Filters.vue
@@ -60,7 +60,13 @@ export default {
return this.$route.params.id
},
deleteFilter(id) {
- console.log(id)
+ this.$confirm(this.$t('settings.filters.delete.confirm'), 'Warning', {
+ confirmButtonText: this.$t('settings.filters.delete.confirm_ok'),
+ cancelButtonText: this.$t('settings.filters.delete.confirm_cancel'),
+ type: 'warning'
+ }).then(() => {
+ return this.$store.dispatch('Settings/Filters/deleteFilter', id)
+ })
}
}
}
diff --git a/src/renderer/store/Settings/Filters.ts b/src/renderer/store/Settings/Filters.ts
index 93937189..2a55b45e 100644
--- a/src/renderer/store/Settings/Filters.ts
+++ b/src/renderer/store/Settings/Filters.ts
@@ -42,6 +42,21 @@ export const actions: ActionTree = {
} finally {
commit(MUTATION_TYPES.CHANGE_LOADING, false)
}
+ },
+ deleteFilter: async ({ commit, dispatch, rootState }, id: string) => {
+ const client = generator(
+ rootState.TimelineSpace.sns,
+ rootState.TimelineSpace.account.baseURL,
+ rootState.TimelineSpace.account.accessToken,
+ rootState.App.userAgent
+ )
+ try {
+ commit(MUTATION_TYPES.CHANGE_LOADING, true)
+ await client.deleteFilter(id)
+ await dispatch('fetchFilters')
+ } finally {
+ commit(MUTATION_TYPES.CHANGE_LOADING, false)
+ }
}
}
From ee3ba1a155ef2ed52d8b2fcf2c27ffac71565cab Mon Sep 17 00:00:00 2001
From: AkiraFukushima
Date: Tue, 11 May 2021 23:11:34 +0900
Subject: [PATCH 4/5] refs #2258 Divide filter form from edit
---
src/config/locales/en/translation.json | 38 ++---
.../components/Settings/Filters/Edit.vue | 136 +---------------
.../components/Settings/Filters/form.vue | 152 ++++++++++++++++++
src/renderer/store/Settings/Filters/Edit.ts | 11 +-
4 files changed, 186 insertions(+), 151 deletions(-)
create mode 100644 src/renderer/components/Settings/Filters/form.vue
diff --git a/src/config/locales/en/translation.json b/src/config/locales/en/translation.json
index 50a6eb82..8c4556cb 100644
--- a/src/config/locales/en/translation.json
+++ b/src/config/locales/en/translation.json
@@ -117,26 +117,26 @@
},
"filters": {
"title": "Filters",
+ "form": {
+ "phrase": "Keyword or phrase",
+ "expire": "Expire after",
+ "context": "Filter contexts",
+ "irreversible": "Drop instead of hide",
+ "whole_word": "Whole word",
+ "submit": "Update",
+ "cancel": "Cancel"
+ },
+ "expires": {
+ "never": "Never",
+ "30_minutes": "30 minutes",
+ "1_hour": "1 hour",
+ "6_hours": "6 hours",
+ "12_hours": "12 hours",
+ "1_day": "1 day",
+ "1_week": "1 week"
+ },
"edit": {
- "title": "Edit",
- "form": {
- "phrase": "Keyword or phrase",
- "expire": "Expire after",
- "context": "Filter contexts",
- "irreversible": "Drop instead of hide",
- "whole_word": "Whole word",
- "submit": "Update",
- "cancel": "Cancel"
- },
- "expires": {
- "never": "Never",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "12_hours": "12 hours",
- "1_day": "1 day",
- "1_week": "1 week"
- }
+ "title": "Edit"
},
"delete": {
"title": "Delete",
diff --git a/src/renderer/components/Settings/Filters/Edit.vue b/src/renderer/components/Settings/Filters/Edit.vue
index f5927fc2..3543464c 100644
--- a/src/renderer/components/Settings/Filters/Edit.vue
+++ b/src/renderer/components/Settings/Filters/Edit.vue
@@ -1,152 +1,28 @@
{{ $t('settings.filters.edit.title') }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ $t('settings.filters.edit.form.irreversible') }}
-
-
- {{ $t('settings.filters.edit.form.whole_word') }}
-
-
- {{ $t('settings.filters.edit.form.submit') }}
- {{ $t('settings.filters.edit.form.cancel') }}
-
-
+
+
+
diff --git a/src/renderer/store/Settings/Filters/Edit.ts b/src/renderer/store/Settings/Filters/Edit.ts
index ef387a37..4b743a57 100644
--- a/src/renderer/store/Settings/Filters/Edit.ts
+++ b/src/renderer/store/Settings/Filters/Edit.ts
@@ -3,12 +3,19 @@ import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export type EditFiltersState = {
- filter: Entity.Filter | null
+ filter: Entity.Filter
loading: boolean
}
const state = (): EditFiltersState => ({
- filter: null,
+ filter: {
+ id: '',
+ phrase: '',
+ expires_at: null,
+ context: [],
+ irreversible: false,
+ whole_word: true
+ } as Entity.Filter,
loading: false
})
From 3834f41d8ab8f5123924df26c5e1a65f7808945a Mon Sep 17 00:00:00 2001
From: AkiraFukushima
Date: Wed, 12 May 2021 00:56:27 +0900
Subject: [PATCH 5/5] refs #2258 Add new filter form
---
src/config/locales/en/translation.json | 5 +-
src/renderer/components/Settings/Filters.vue | 12 +++
.../components/Settings/Filters/Edit.vue | 19 -----
.../components/Settings/Filters/New.vue | 48 +++++++++++
.../components/Settings/Filters/form.vue | 14 +++-
src/renderer/router/index.ts | 5 ++
src/renderer/store/Settings/Filters.ts | 5 +-
src/renderer/store/Settings/Filters/New.ts | 83 +++++++++++++++++++
8 files changed, 169 insertions(+), 22 deletions(-)
create mode 100644 src/renderer/components/Settings/Filters/New.vue
create mode 100644 src/renderer/store/Settings/Filters/New.ts
diff --git a/src/config/locales/en/translation.json b/src/config/locales/en/translation.json
index 8c4556cb..fab5f6bf 100644
--- a/src/config/locales/en/translation.json
+++ b/src/config/locales/en/translation.json
@@ -123,7 +123,7 @@
"context": "Filter contexts",
"irreversible": "Drop instead of hide",
"whole_word": "Whole word",
- "submit": "Update",
+ "submit": "Submit",
"cancel": "Cancel"
},
"expires": {
@@ -135,6 +135,9 @@
"1_day": "1 day",
"1_week": "1 week"
},
+ "new": {
+ "title": "New"
+ },
"edit": {
"title": "Edit"
},
diff --git a/src/renderer/components/Settings/Filters.vue b/src/renderer/components/Settings/Filters.vue
index 7bda870f..73f0c964 100644
--- a/src/renderer/components/Settings/Filters.vue
+++ b/src/renderer/components/Settings/Filters.vue
@@ -1,6 +1,13 @@
{{ $t('settings.filters.title') }}
+
+
+
+ {{ $t('settings.filters.new.title') }}
+
+
+
#filters {
+ .new-filter {
+ display: flex;
+ justify-content: flex-end;
+ }
+
.el-table /deep/ {
tr,
th,
diff --git a/src/renderer/components/Settings/Filters/Edit.vue b/src/renderer/components/Settings/Filters/Edit.vue
index 3543464c..06efccd2 100644
--- a/src/renderer/components/Settings/Filters/Edit.vue
+++ b/src/renderer/components/Settings/Filters/Edit.vue
@@ -50,22 +50,3 @@ export default {
}
}
-
-
diff --git a/src/renderer/components/Settings/Filters/New.vue b/src/renderer/components/Settings/Filters/New.vue
new file mode 100644
index 00000000..0cb481f1
--- /dev/null
+++ b/src/renderer/components/Settings/Filters/New.vue
@@ -0,0 +1,48 @@
+
+
+
{{ $t('settings.filters.new.title') }}
+
+
+
+
+
diff --git a/src/renderer/components/Settings/Filters/form.vue b/src/renderer/components/Settings/Filters/form.vue
index 492a2f7e..35ec0c11 100644
--- a/src/renderer/components/Settings/Filters/form.vue
+++ b/src/renderer/components/Settings/Filters/form.vue
@@ -149,4 +149,16 @@ export default {
}
-
+
diff --git a/src/renderer/router/index.ts b/src/renderer/router/index.ts
index a8f5418f..6c0a893b 100644
--- a/src/renderer/router/index.ts
+++ b/src/renderer/router/index.ts
@@ -16,6 +16,7 @@ import SettingsGeneral from '@/components/Settings/General.vue'
import SettingsTimeline from '@/components/Settings/Timeline.vue'
import SettingsFilters from '@/components/Settings/Filters.vue'
import SettingsFiltersEdit from '@/components/Settings/Filters/Edit.vue'
+import SettingsFiltersNew from '@/components/Settings/Filters/New.vue'
import TimelineSpace from '@/components/TimelineSpace.vue'
import TimelineSpaceContentsHome from '@/components/TimelineSpace/Contents/Home.vue'
import TimelineSpaceContentsNotifications from '@/components/TimelineSpace/Contents/Notifications.vue'
@@ -107,6 +108,10 @@ const router = new Router({
path: 'filters',
component: SettingsFilters
},
+ {
+ path: 'filters/new',
+ component: SettingsFiltersNew
+ },
{
path: 'filters/:filter_id/edit',
component: SettingsFiltersEdit,
diff --git a/src/renderer/store/Settings/Filters.ts b/src/renderer/store/Settings/Filters.ts
index 2a55b45e..2808783d 100644
--- a/src/renderer/store/Settings/Filters.ts
+++ b/src/renderer/store/Settings/Filters.ts
@@ -2,6 +2,7 @@ import { Module, MutationTree, ActionTree } from 'vuex'
import generator, { Entity } from 'megalodon'
import { RootState } from '@/store'
import EditFilters, { EditFiltersState } from './Filters/Edit'
+import NewFilters, { NewFiltersState } from './Filters/New'
export type FiltersState = {
filters: Array
@@ -62,6 +63,7 @@ export const actions: ActionTree = {
type FiltersModule = {
Edit: EditFiltersState
+ New: NewFiltersState
}
export type FiltersModuleState = FiltersModule & FiltersState
@@ -72,7 +74,8 @@ const Filters: Module = {
mutations: mutations,
actions: actions,
modules: {
- Edit: EditFilters
+ Edit: EditFilters,
+ New: NewFilters
}
}
diff --git a/src/renderer/store/Settings/Filters/New.ts b/src/renderer/store/Settings/Filters/New.ts
new file mode 100644
index 00000000..896af2a4
--- /dev/null
+++ b/src/renderer/store/Settings/Filters/New.ts
@@ -0,0 +1,83 @@
+import generator, { Entity } from 'megalodon'
+import { Module, MutationTree, ActionTree } from 'vuex'
+import { RootState } from '@/store'
+
+export type NewFiltersState = {
+ filter: Entity.Filter
+ loading: boolean
+}
+
+const defaultFilter: Entity.Filter = {
+ id: '',
+ phrase: '',
+ expires_at: null,
+ context: [],
+ irreversible: false,
+ whole_word: true
+}
+
+const state = (): NewFiltersState => ({
+ filter: defaultFilter,
+ loading: false
+})
+
+export const MUTATION_TYPES = {
+ UPDATE_FILTER: 'updateFilter',
+ CHANGE_LOADING: 'changeLoading'
+}
+
+export const mutations: MutationTree = {
+ [MUTATION_TYPES.UPDATE_FILTER]: (state, filter: Entity.Filter) => {
+ state.filter = filter
+ },
+ [MUTATION_TYPES.CHANGE_LOADING]: (state, loading: boolean) => {
+ state.loading = loading
+ }
+}
+
+export const actions: ActionTree = {
+ editFilter: ({ commit, state }, filter: any) => {
+ const newFilter = Object.assign({}, state.filter, filter)
+ commit(MUTATION_TYPES.UPDATE_FILTER, newFilter)
+ },
+ resetFilter: ({ commit }) => {
+ commit(MUTATION_TYPES.UPDATE_FILTER, defaultFilter)
+ },
+ createFilter: async ({ commit, state, dispatch, rootState }): Promise => {
+ if (state.filter === null) {
+ throw new Error('filter is not set')
+ }
+ const client = generator(
+ rootState.TimelineSpace.sns,
+ rootState.TimelineSpace.account.baseURL,
+ rootState.TimelineSpace.account.accessToken,
+ rootState.App.userAgent
+ )
+ try {
+ commit(MUTATION_TYPES.CHANGE_LOADING, true)
+ let options = {
+ irreversible: state.filter.irreversible,
+ whole_word: state.filter.whole_word
+ }
+ if (state.filter.expires_at !== null) {
+ options = Object.assign({}, options, {
+ expires_in: state.filter.expires_at
+ })
+ }
+ const res = await client.createFilter(state.filter.phrase, state.filter.context, options)
+ dispatch('resetFilter')
+ return res.data
+ } finally {
+ commit(MUTATION_TYPES.CHANGE_LOADING, false)
+ }
+ }
+}
+
+const NewFilters: Module = {
+ namespaced: true,
+ state: state,
+ mutations: mutations,
+ actions: actions
+}
+
+export default NewFilters