import generator , { Entity } from 'megalodon' ; import { Module , MutationTree , ActionTree } from 'vuex' ; import { RootState } from '@/store' ; export type EditFiltersState = { filter : Entity . Filter ; loading : boolean ; } ; const state = ( ) : EditFiltersState => ( { filter : { id : '' , phrase : '' , expires_at : null , context : [ ] , irreversible : false , whole_word : true } as Entity . Filter , loading : false } ) ; export const MUTATION_TYPES = { UPDATE_FILTER : 'updateFilter' , CHANGE_LOADING : 'changeLoading' } ; export const mutations = { [ MUTATION_TYPES . UPDATE_FILTER ] : ( state , filter ) => { state . filter = filter ; } , [ MUTATION_TYPES . CHANGE_LOADING ] : ( state , loading ) => { state . loading = loading ; } } ; export const actions = { fetchFilter : async ( { commit , rootState } , id ) : Promise < Entity . Filter > => { 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 ) => { const newFilter = Object . assign ( { } , state . filter , filter ) ; commit ( MUTATION_TYPES . UPDATE_FILTER , newFilter ) ; } , updateFilter : async ( { commit , state , rootState } ) : Promise < Entity . Filter > => { 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 = { namespaced : true , state : state , mutations : mutations , actions : actions } ; export default EditFilters ;