refactor: Use type instead of interface

This commit is contained in:
AkiraFukushima 2019-06-06 23:44:50 +09:00
parent 824ac51cd8
commit ab8c74b481
70 changed files with 241 additions and 275 deletions

View File

@ -2,7 +2,7 @@ import { createLocalVue } from '@vue/test-utils'
import Vuex from 'vuex'
import { ipcMain } from '~/spec/mock/electron'
import Account, { AccountState } from '@/store/Preferences/Account'
import LocalAccount from '~/src/types/localAccount'
import { LocalAccount } from '~/src/types/localAccount'
const account: LocalAccount = {
_id: 'sample',
@ -54,10 +54,9 @@ describe('Account', () => {
event.sender.send('error-list-accounts', new Error())
})
await store.dispatch('Account/loadAccounts')
.catch((err: Error) => {
expect(err instanceof Error).toEqual(true)
})
await store.dispatch('Account/loadAccounts').catch((err: Error) => {
expect(err instanceof Error).toEqual(true)
})
})
it('success', async () => {
ipcMain.once('list-accounts', (event: any, _) => {
@ -73,10 +72,9 @@ describe('Account', () => {
ipcMain.once('remove-account', (event: any, _) => {
event.sender.send('error-remove-account', new Error())
})
await store.dispatch('Account/removeAccount', account)
.catch((err: Error) => {
expect(err instanceof Error).toEqual(true)
})
await store.dispatch('Account/removeAccount', account).catch((err: Error) => {
expect(err instanceof Error).toEqual(true)
})
})
it('success', async () => {
ipcMain.once('remove-account', (event: any, _) => {
@ -92,10 +90,9 @@ describe('Account', () => {
ipcMain.once('forward-account', (event: any, _) => {
event.sender.send('error-forward-account', new Error())
})
await store.dispatch('Account/forwardAccount', account)
.catch((err: Error) => {
expect(err instanceof Error).toEqual(true)
})
await store.dispatch('Account/forwardAccount', account).catch((err: Error) => {
expect(err instanceof Error).toEqual(true)
})
})
it('success', async () => {
ipcMain.once('forward-account', (event: any, _) => {
@ -111,10 +108,9 @@ describe('Account', () => {
ipcMain.once('backward-account', (event: any, _) => {
event.sender.send('error-backward-account', new Error())
})
await store.dispatch('Account/backwardAccount', account)
.catch((err: Error) => {
expect(err instanceof Error).toEqual(true)
})
await store.dispatch('Account/backwardAccount', account).catch((err: Error) => {
expect(err instanceof Error).toEqual(true)
})
})
it('success', async () => {
ipcMain.once('backward-account', (event: any, _) => {
@ -130,10 +126,9 @@ describe('Account', () => {
ipcMain.once('remove-all-accounts', (event: any, _) => {
event.sender.send('error-remove-all-accounts', new Error())
})
await store.dispatch('Account/removeAllAccounts', account)
.catch((err: Error) => {
expect(err instanceof Error).toEqual(true)
})
await store.dispatch('Account/removeAllAccounts', account).catch((err: Error) => {
expect(err instanceof Error).toEqual(true)
})
})
it('success', async () => {
ipcMain.once('remove-all-accounts', (event: any, _) => {

View File

@ -4,7 +4,7 @@ import { createLocalVue } from '@vue/test-utils'
import Vuex from 'vuex'
import { ipcMain } from '~/spec/mock/electron'
import SideMenu, { SideMenuState } from '~/src/renderer/store/TimelineSpace/SideMenu'
import LocalTag from '~/src/types/localTag'
import { LocalTag } from '~/src/types/localTag'
jest.mock('megalodon')

View File

@ -1,5 +1,5 @@
import Account, { AccountState, MUTATION_TYPES } from '@/store/Preferences/Account'
import LocalAccount from '~/src/types/localAccount'
import { LocalAccount } from '~/src/types/localAccount'
const account: LocalAccount = {
_id: 'sample',

View File

@ -1,6 +1,6 @@
import i18n from '~/src/config/i18n'
import Jump, { JumpState, MUTATION_TYPES, Channel } from '@/store/TimelineSpace/Modals/Jump'
import LocalTag from '~/src/types/localTag'
import { LocalTag } from '~/src/types/localTag'
import { List } from 'megalodon'
describe('TimelineSpace/Modals/Jump', () => {

View File

@ -1,11 +1,11 @@
export interface DisplayStyleType {
name: string,
export type DisplayStyleType = {
name: string
value: number
}
export interface DisplayStyleList {
DisplayNameAndUsername: DisplayStyleType,
DisplayName: DisplayStyleType,
export type DisplayStyleList = {
DisplayNameAndUsername: DisplayStyleType
DisplayName: DisplayStyleType
Username: DisplayStyleType
}

View File

@ -1,13 +1,13 @@
export interface VisibilityType {
name: string,
value: number,
export type VisibilityType = {
name: string
value: number
key: string
}
export interface VisibilityList {
Public: VisibilityType,
Unlisted: VisibilityType,
Private: VisibilityType,
export type VisibilityList = {
Public: VisibilityType
Unlisted: VisibilityType
Private: VisibilityType
Direct: VisibilityType
}

View File

@ -2,7 +2,7 @@ import { isEmpty } from 'lodash'
import Mastodon, { Account as RemoteAccount } from 'megalodon'
import Datastore from 'nedb'
import log from 'electron-log'
import LocalAccount from '~/src/types/localAccount'
import { LocalAccount } from '~/src/types/localAccount'
export default class Account {
private db: Datastore

View File

@ -1,6 +1,6 @@
import Mastodon, { OAuth } from 'megalodon'
import Account from './account'
import LocalAccount from '~/src/types/localAccount'
import { LocalAccount } from '~/src/types/localAccount'
const appName = 'Whalebird'
const appURL = 'https://whalebird.org'

View File

@ -1,15 +1,15 @@
import Datastore from 'nedb'
import LocalTag from '~/src/types/localTag'
import { LocalTag } from '~/src/types/localTag'
export default class Hashtags {
private db: Datastore
constructor (db: Datastore) {
constructor(db: Datastore) {
this.db = db
this.db.ensureIndex({ fieldName: 'tagName', unique: true }, (_) => {})
this.db.ensureIndex({ fieldName: 'tagName', unique: true }, _ => {})
}
listTags (): Promise<Array<LocalTag>> {
listTags(): Promise<Array<LocalTag>> {
return new Promise((resolve, reject) => {
this.db.find<LocalTag>({}, (err, docs) => {
if (err) return reject(err)
@ -18,7 +18,7 @@ export default class Hashtags {
})
}
insertTag (tag: string): Promise<LocalTag> {
insertTag(tag: string): Promise<LocalTag> {
return new Promise((resolve, reject) => {
this.db.insert({ tagName: tag }, (err, doc) => {
if (err) return reject(err)
@ -27,7 +27,7 @@ export default class Hashtags {
})
}
removeTag (localTag: LocalTag): Promise<number> {
removeTag(localTag: LocalTag): Promise<number> {
return new Promise((resolve, reject) => {
this.db.remove(
{

View File

@ -31,8 +31,8 @@ import Hashtags from './hashtags'
import UnreadNotification from './unreadNotification'
import i18n from '../config/i18n'
import Language from '../constants/language'
import LocalAccount from '~/src/types/localAccount'
import LocalTag from '~/src/types/localTag'
import { LocalAccount } from '~/src/types/localAccount'
import { LocalTag } from '~/src/types/localTag'
import { UnreadNotification as UnreadNotificationConfig } from '~/src/types/unreadNotification'
/**

View File

@ -1,6 +1,6 @@
import Mastodon, { StreamListener, Status, Notification } from 'megalodon'
import log from 'electron-log'
import LocalAccount from '~/src/types/localAccount'
import { LocalAccount } from '~/src/types/localAccount'
export default class Streaming {
private client: Mastodon

View File

@ -1,6 +1,6 @@
import Streaming from './streaming'
import WebSocket from './websocket'
import LocalAccount from '~/src/types/localAccount'
import { LocalAccount } from '~/src/types/localAccount'
export default class StreamingManager {
private streaming: Streaming

View File

@ -1,6 +1,6 @@
import Mastodon, { WebSocket as SocketListener, Status, Notification } from 'megalodon'
import log from 'electron-log'
import LocalAccount from '~/src/types/localAccount'
import { LocalAccount } from '~/src/types/localAccount'
export default class WebSocket {
private client: Mastodon

View File

@ -2,7 +2,7 @@ import { ipcRenderer } from 'electron'
import { Module, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface AuthorizeState {}
export type AuthorizeState = {}
const state = (): AuthorizeState => ({})

View File

@ -1,12 +1,12 @@
import { ipcRenderer } from 'electron'
import router from '@/router'
import LocalAccount from '~/src/types/localAccount'
import { LocalAccount } from '~/src/types/localAccount'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface GlobalHeaderState {
accounts: Array<LocalAccount>,
changing: boolean,
export type GlobalHeaderState = {
accounts: Array<LocalAccount>
changing: boolean
hide: boolean
}
@ -70,7 +70,7 @@ const actions: ActionTree<GlobalHeaderState, RootState> = {
if (state.changing) {
return null
}
if (rootState.route.params.id as string === account._id!) {
if ((rootState.route.params.id as string) === account._id!) {
return null
}
// When the modal window is active, don't change account

View File

@ -3,8 +3,8 @@ import axios from 'axios'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface LoginState {
selectedInstance: string | null,
export type LoginState = {
selectedInstance: string | null
searching: boolean
}
@ -46,10 +46,9 @@ const actions: ActionTree<LoginState, RootState> = {
},
confirmInstance: async ({ commit }, domain: string): Promise<boolean> => {
commit(MUTATION_TYPES.CHANGE_SEARCHING, true)
await axios.get(`https://${domain}/api/v1/instance`)
.finally(() => {
commit(MUTATION_TYPES.CHANGE_SEARCHING, false)
})
await axios.get(`https://${domain}/api/v1/instance`).finally(() => {
commit(MUTATION_TYPES.CHANGE_SEARCHING, false)
})
commit(MUTATION_TYPES.CHANGE_INSTANCE, domain)
return true
}

View File

@ -6,18 +6,20 @@ import Notification, { NotificationState } from './Preferences/Notification'
import { Module } from 'vuex'
import { RootState } from '@/store'
export interface PreferencesState {}
export type PreferencesState = {}
const state = (): PreferencesState => ({})
export interface PreferencesModuleState extends PreferencesState {
General: GeneralState,
Account: AccountState,
Language: LanguageState,
Notification: NotificationState,
type PreferencesModule = {
General: GeneralState
Account: AccountState
Language: LanguageState
Notification: NotificationState
Appearance: AppearanceState
}
export type PreferencesModuleState = PreferencesState & PreferencesModule
const Preferences: Module<PreferencesState, RootState> = {
namespaced: true,
modules: {

View File

@ -1,10 +1,10 @@
import { ipcRenderer } from 'electron'
import { Module, MutationTree, ActionTree } from 'vuex'
import LocalAccount from '~/src/types/localAccount'
import { LocalAccount } from '~/src/types/localAccount'
import { RootState } from '@/store'
export interface AccountState {
accounts: Array<LocalAccount>,
export type AccountState = {
accounts: Array<LocalAccount>
accountLoading: boolean
}

View File

@ -5,7 +5,7 @@ import { Sound } from '~/src/types/sound'
import { Timeline } from '~/src/types/timeline'
import { BaseConfig, General } from '~/src/types/preference'
export interface GeneralState {
export type GeneralState = {
general: General
loading: boolean
}

View File

@ -5,7 +5,7 @@ import { RootState } from '@/store'
import { Language as LanguageSet } from '~/src/types/language'
import { BaseConfig } from '~/src/types/preference'
export interface LanguageState {
export type LanguageState = {
language: LanguageSet
}

View File

@ -4,7 +4,7 @@ import { RootState } from '@/store'
import { Notify } from '~/src/types/notify'
import { BaseConfig, Notification } from '~/src/types/preference'
export interface NotificationState {
export type NotificationState = {
notification: Notification
}

View File

@ -3,7 +3,7 @@ import Timeline, { TimelineState } from './Settings/Timeline'
import { Module, MutationTree } from 'vuex'
import { RootState } from '@/store'
export interface SettingsState {
export type SettingsState = {
accountID: string | null
}
@ -21,11 +21,13 @@ const mutations: MutationTree<SettingsState> = {
}
}
export interface SettingsModuleState extends SettingsState {
type SettingsModule = {
General: GeneralState
Timeline: TimelineState
}
export type SettingsModuleState = SettingsModule & SettingsState
const Settings: Module<SettingsState, RootState> = {
namespaced: true,
modules: {

View File

@ -3,8 +3,8 @@ import { Module, MutationTree, ActionTree } from 'vuex'
import Visibility, { VisibilityType } from '~/src/constants/visibility'
import { RootState } from '@/store'
export interface GeneralState {
visibility: number,
export type GeneralState = {
visibility: number
sensitive: boolean
}
@ -29,12 +29,9 @@ const mutations: MutationTree<GeneralState> = {
const actions: ActionTree<GeneralState, RootState> = {
fetchSettings: async ({ commit, rootState }): Promise<Account> => {
const client = new Mastodon(
rootState.TimelineSpace.account.accessToken!,
rootState.TimelineSpace.account.baseURL + '/api/v1'
)
const client = new Mastodon(rootState.TimelineSpace.account.accessToken!, rootState.TimelineSpace.account.baseURL + '/api/v1')
const res = await client.get<Account>('/accounts/verify_credentials')
const visibility: VisibilityType | undefined = (Object.values(Visibility) as Array<VisibilityType>).find((v) => {
const visibility: VisibilityType | undefined = (Object.values(Visibility) as Array<VisibilityType>).find(v => {
return v.key === res.data.source!.privacy
})
commit(MUTATION_TYPES.CHANGE_VISIBILITY, visibility!.value)
@ -42,11 +39,8 @@ const actions: ActionTree<GeneralState, RootState> = {
return res.data
},
setVisibility: async ({ commit, rootState }, value: number) => {
const client = new Mastodon(
rootState.TimelineSpace.account.accessToken!,
rootState.TimelineSpace.account.baseURL + '/api/v1'
)
const visibility: VisibilityType | undefined = (Object.values(Visibility) as Array<VisibilityType>).find((v) => {
const client = new Mastodon(rootState.TimelineSpace.account.accessToken!, rootState.TimelineSpace.account.baseURL + '/api/v1')
const visibility: VisibilityType | undefined = (Object.values(Visibility) as Array<VisibilityType>).find(v => {
return v.value === value
})
const res = await client.patch<Account>('/accounts/update_credentials', {
@ -58,10 +52,7 @@ const actions: ActionTree<GeneralState, RootState> = {
return res.data
},
setSensitive: async ({ commit, rootState }, value: boolean) => {
const client = new Mastodon(
rootState.TimelineSpace.account.accessToken!,
rootState.TimelineSpace.account.baseURL + '/api/v1'
)
const client = new Mastodon(rootState.TimelineSpace.account.accessToken!, rootState.TimelineSpace.account.baseURL + '/api/v1')
const res = await client.patch<Account>('/accounts/update_credentials', {
source: {
sensitive: value

View File

@ -4,7 +4,7 @@ import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
import { UnreadNotification } from '~/src/types/unreadNotification'
export interface TimelineState {
export type TimelineState = {
unreadNotification: UnreadNotification
}

View File

@ -8,7 +8,7 @@ import Contents, { ContentsModuleState } from './TimelineSpace/Contents'
import router from '@/router'
import unreadSettings from '~/src/constants/unreadNotification'
import { Module, MutationTree, ActionTree } from 'vuex'
import LocalAccount from '~/src/types/localAccount'
import { LocalAccount } from '~/src/types/localAccount'
import { Notify } from '~/src/types/notify'
import { RootState } from '@/store'
import { UnreadNotification } from '~/src/types/unreadNotification'
@ -17,12 +17,12 @@ import { TimelineFetchError } from '@/errors/fetch'
declare var Notification: any
interface MyEmoji {
type MyEmoji = {
name: string
image: string
}
export interface TimelineSpaceState {
export type TimelineSpaceState = {
account: LocalAccount
loading: boolean
emojis: Array<MyEmoji>
@ -479,13 +479,15 @@ const actions: ActionTree<TimelineSpaceState, RootState> = {
}
}
export interface TimelineSpaceModuleState extends TimelineSpaceState {
type TimelineSpaceModule = {
SideMenu: SideMenuState
HeaderMenu: HeaderMenuState
Modals: ModalsModuleState
Contents: ContentsModuleState
}
export type TimelineSpaceModuleState = TimelineSpaceModule & TimelineSpaceState
const TimelineSpace: Module<TimelineSpaceState, RootState> = {
namespaced: true,
modules: {

View File

@ -13,11 +13,11 @@ import Mentions, { MentionsState } from './Contents/Mentions'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface ContentsState {
export type ContentsState = {
loading: boolean
}
export interface ContentsModuleState extends ContentsState {
type ContentsModule = {
SideBar: SideBarModuleState
Home: HomeState
Notifications: NotificationsState
@ -31,6 +31,8 @@ export interface ContentsModuleState extends ContentsState {
FollowRequests: FollowRequestsState
}
export type ContentsModuleState = ContentsModule & ContentsState
const state = (): ContentsState => ({
loading: false
})

View File

@ -2,7 +2,7 @@ import Mastodon, { Status, Response } from 'megalodon'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface DirectMessagesState {
export type DirectMessagesState = {
lazyLoading: boolean
heading: boolean
timeline: Array<Status>

View File

@ -2,9 +2,9 @@ import Mastodon, { Status, Response } from 'megalodon'
import parse from 'parse-link-header'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
import LocalAccount from '~/src/types/localAccount'
import { LocalAccount } from '~/src/types/localAccount'
export interface FavouritesState {
export type FavouritesState = {
favourites: Array<Status>
lazyLoading: boolean
filter: string

View File

@ -2,7 +2,7 @@ import Mastodon, { Account, Response } from 'megalodon'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface FollowRequestsState {
export type FollowRequestsState = {
requests: Array<Account>
}

View File

@ -4,13 +4,15 @@ import Tag, { TagState } from './Hashtag/Tag'
import { Module, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface HashtagState {}
export type HashtagState = {}
export interface HashtagModuleState extends HashtagState {
List: ListState,
type HashtagModule = {
List: ListState
Tag: TagState
}
export type HashtagModuleState = HashtagModule & HashtagState
const state = (): HashtagState => ({})
const actions: ActionTree<HashtagState, RootState> = {

View File

@ -1,9 +1,9 @@
import { ipcRenderer } from 'electron'
import LocalTag from '~/src/types/localTag'
import { LocalTag } from '~/src/types/localTag'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface ListState {
export type ListState = {
tags: Array<LocalTag>
}

View File

@ -4,7 +4,7 @@ import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
import { LoadPositionWithTag } from '@/types/loadPosition'
export interface TagState {
export type TagState = {
timeline: Array<Status>
unreadTimeline: Array<Status>
lazyLoading: boolean

View File

@ -2,7 +2,7 @@ import Mastodon, { Status, Response } from 'megalodon'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface HomeState {
export type HomeState = {
lazyLoading: boolean
heading: boolean
showReblogs: boolean

View File

@ -4,14 +4,16 @@ import Edit, { EditState } from './Lists/Edit'
import { Module } from 'vuex'
import { RootState } from '@/store'
export interface ListsState {}
export type ListsState = {}
export interface ListsModuleState extends ListsState {
Index: IndexState,
Show: ShowState,
type ListModule = {
Index: IndexState
Show: ShowState
Edit: EditState
}
export type ListsModuleState = ListModule & ListsState
const state = (): ListsState => ({})
export default {

View File

@ -3,7 +3,7 @@ import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
import { RemoveAccountFromList } from '@/types/removeAccountFromList'
export interface EditState {
export type EditState = {
members: Array<Account>
}

View File

@ -2,7 +2,7 @@ import Mastodon, { List, Response } from 'megalodon'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface IndexState {
export type IndexState = {
lists: Array<List>
}
@ -22,19 +22,13 @@ const mutations: MutationTree<IndexState> = {
const actions: ActionTree<IndexState, RootState> = {
fetchLists: async ({ commit, rootState }): Promise<Array<List>> => {
const client = new Mastodon(
rootState.TimelineSpace.account.accessToken!,
rootState.TimelineSpace.account.baseURL + '/api/v1'
)
const client = new Mastodon(rootState.TimelineSpace.account.accessToken!, rootState.TimelineSpace.account.baseURL + '/api/v1')
const res: Response<Array<List>> = await client.get<Array<List>>('/lists')
commit(MUTATION_TYPES.CHANGE_LISTS, res.data)
return res.data
},
createList: async ({ rootState }, title: string): Promise<List> => {
const client = new Mastodon(
rootState.TimelineSpace.account.accessToken!,
rootState.TimelineSpace.account.baseURL + '/api/v1'
)
const client = new Mastodon(rootState.TimelineSpace.account.accessToken!, rootState.TimelineSpace.account.baseURL + '/api/v1')
const res: Response<List> = await client.post<List>('/lists', {
title: title
})

View File

@ -4,7 +4,7 @@ import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
import { LoadPositionWithList } from '@/types/loadPosition'
export interface ShowState {
export type ShowState = {
timeline: Array<Status>
unreadTimeline: Array<Status>
lazyLoading: boolean

View File

@ -2,7 +2,7 @@ import Mastodon, { Status, Response } from 'megalodon'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface LocalState {
export type LocalState = {
timeline: Array<Status>
unreadTimeline: Array<Status>
lazyLoading: boolean

View File

@ -2,7 +2,7 @@ import Mastodon, { Notification, Response } from 'megalodon'
import { Module, MutationTree, ActionTree, GetterTree } from 'vuex'
import { RootState } from '@/store'
export interface MentionsState {
export type MentionsState = {
lazyLoading: boolean
heading: boolean
mentions: Array<Notification>

View File

@ -3,7 +3,7 @@ import Mastodon, { Notification, Status, Response } from 'megalodon'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface NotificationsState {
export type NotificationsState = {
lazyLoading: boolean
heading: boolean
notifications: Array<Notification>

View File

@ -2,7 +2,7 @@ import Mastodon, { Status, Response } from 'megalodon'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface PublicState {
export type PublicState = {
timeline: Array<Status>
unreadTimeline: Array<Status>
lazyLoading: boolean

View File

@ -4,14 +4,16 @@ import Toots, { TootsState } from './Search/Toots'
import { Module } from 'vuex'
import { RootState } from '@/store'
export interface SearchState {}
export type SearchState = {}
export interface SearchModuleState extends SearchState {
type SearchModule = {
Account: AccountState
Tag: TagState
Toots: TootsState
}
export type SearchModuleState = SearchModule & SearchState
const state = (): SearchState => ({})
const Search: Module<SearchState, RootState> = {

View File

@ -2,7 +2,7 @@ import Mastodon, { Account } from 'megalodon'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface AccountState {
export type AccountState = {
results: Array<Account>
}

View File

@ -2,7 +2,7 @@ import Mastodon, { Tag, Results } from 'megalodon'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface TagState {
export type TagState = {
results: Array<Tag>
}

View File

@ -2,7 +2,7 @@ import Mastodon, { Status, Results } from 'megalodon'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface TootsState {
export type TootsState = {
results: Array<Status>
}

View File

@ -3,19 +3,21 @@ import TootDetail, { TootDetailState } from './SideBar/TootDetail'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface SideBarState {
openSideBar: boolean,
export type SideBarState = {
openSideBar: boolean
// 0: blank
// 1: account-profile
// 2: toot-detail
component: number
}
export interface SideBarModuleState extends SideBarState {
TootDetail: TootDetailState,
type SideBarModule = {
TootDetail: TootDetailState
AccountProfile: AccountProfileModuleState
}
export type SideBarModuleState = SideBarModule & SideBarState
const state = (): SideBarState => ({
openSideBar: false,
component: 0

View File

@ -5,18 +5,20 @@ import Followers, { FollowersState } from './AccountProfile/Followers'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface AccountProfileState {
export type AccountProfileState = {
account: Account | null
relationship: Relationship | null
loading: boolean
}
export interface AccountProfileModuleState extends AccountProfileState {
type AccountProfileModule = {
Followers: FollowersState
Follows: FollowsState
Timeline: TimelineState
}
export type AccountProfileModuleState = AccountProfileModule & AccountProfileState
const state = (): AccountProfileState => ({
account: null,
relationship: null,

View File

@ -2,8 +2,8 @@ import Mastodon, { Account, Relationship, Response } from 'megalodon'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface FollowersState {
followers: Array<Account>,
export type FollowersState = {
followers: Array<Account>
relationships: Array<Relationship>
}
@ -28,20 +28,14 @@ const mutations: MutationTree<FollowersState> = {
const actions: ActionTree<FollowersState, RootState> = {
fetchFollowers: async ({ commit, rootState }, account: Account) => {
const client = new Mastodon(
rootState.TimelineSpace.account.accessToken!,
rootState.TimelineSpace.account.baseURL + '/api/v1'
)
const client = new Mastodon(rootState.TimelineSpace.account.accessToken!, rootState.TimelineSpace.account.baseURL + '/api/v1')
const res: Response<Array<Account>> = await client.get<Array<Account>>(`/accounts/${account.id}/followers`, { limit: 80 })
commit(MUTATION_TYPES.UPDATE_FOLLOWERS, res.data)
return res.data
},
fetchRelationships: async ({ commit, rootState }, accounts: Array<Account>) => {
const ids = accounts.map(a => a.id)
const client = new Mastodon(
rootState.TimelineSpace.account.accessToken!,
rootState.TimelineSpace.account.baseURL + '/api/v1'
)
const client = new Mastodon(rootState.TimelineSpace.account.accessToken!, rootState.TimelineSpace.account.baseURL + '/api/v1')
const res: Response<Array<Relationship>> = await client.get<Array<Relationship>>(`/accounts/relationships`, {
id: ids
})

View File

@ -2,8 +2,8 @@ import Mastodon, { Account, Relationship, Response } from 'megalodon'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface FollowsState {
follows: Array<Account>,
export type FollowsState = {
follows: Array<Account>
relationships: Array<Relationship>
}
@ -28,20 +28,14 @@ const mutations: MutationTree<FollowsState> = {
const actions: ActionTree<FollowsState, RootState> = {
fetchFollows: async ({ commit, rootState }, account: Account) => {
const client = new Mastodon(
rootState.TimelineSpace.account.accessToken!,
rootState.TimelineSpace.account.baseURL + '/api/v1'
)
const client = new Mastodon(rootState.TimelineSpace.account.accessToken!, rootState.TimelineSpace.account.baseURL + '/api/v1')
const res: Response<Array<Account>> = await client.get<Array<Account>>(`/accounts/${account.id}/following`, { limit: 80 })
commit(MUTATION_TYPES.UPDATE_FOLLOWS, res.data)
return res.data
},
fetchRelationships: async ({ commit, rootState }, accounts: Array<Account>) => {
const ids = accounts.map(a => a.id)
const client = new Mastodon(
rootState.TimelineSpace.account.accessToken!,
rootState.TimelineSpace.account.baseURL + '/api/v1'
)
const client = new Mastodon(rootState.TimelineSpace.account.accessToken!, rootState.TimelineSpace.account.baseURL + '/api/v1')
const res: Response<Array<Relationship>> = await client.get<Array<Relationship>>(`/accounts/relationships`, {
id: ids
})

View File

@ -3,9 +3,9 @@ import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
import { LoadPositionWithAccount } from '@/types/loadPosition'
export interface TimelineState {
timeline: Array<Status>,
pinnedToots: Array<Status>,
export type TimelineState = {
timeline: Array<Status>
pinnedToots: Array<Status>
lazyLoading: boolean
}
@ -39,7 +39,7 @@ const mutations: MutationTree<TimelineState> = {
state.lazyLoading = value
},
[MUTATION_TYPES.UPDATE_PINNED_TOOT]: (state, message: Status) => {
state.pinnedToots = state.pinnedToots.map((toot) => {
state.pinnedToots = state.pinnedToots.map(toot => {
if (toot.id === message.id) {
return message
} else if (toot.reblog !== null && toot.reblog.id === message.id) {
@ -56,7 +56,7 @@ const mutations: MutationTree<TimelineState> = {
},
[MUTATION_TYPES.UPDATE_TOOT]: (state, message: Status) => {
// Replace target message in timeline
state.timeline = state.timeline.map((toot) => {
state.timeline = state.timeline.map(toot => {
if (toot.id === message.id) {
return message
} else if (toot.reblog !== null && toot.reblog.id === message.id) {
@ -72,7 +72,7 @@ const mutations: MutationTree<TimelineState> = {
})
},
[MUTATION_TYPES.DELETE_TOOT]: (state, message: Status) => {
state.timeline = state.timeline.filter((toot) => {
state.timeline = state.timeline.filter(toot => {
if (toot.reblog !== null && toot.reblog.id === message.id) {
return false
} else {
@ -85,10 +85,7 @@ const mutations: MutationTree<TimelineState> = {
const actions: ActionTree<TimelineState, RootState> = {
fetchTimeline: async ({ commit, rootState }, account: Account) => {
commit('TimelineSpace/Contents/SideBar/AccountProfile/changeLoading', true, { root: true })
const client = new Mastodon(
rootState.TimelineSpace.account.accessToken!,
rootState.TimelineSpace.account.baseURL + '/api/v1'
)
const client = new Mastodon(rootState.TimelineSpace.account.accessToken!, rootState.TimelineSpace.account.baseURL + '/api/v1')
const pinned: Response<Array<Status>> = await client.get<Array<Status>>(`/accounts/${account.id}/statuses`, { limit: 10, pinned: true })
commit(MUTATION_TYPES.UPDATE_PINNED_TOOTS, pinned.data)
const res: Response<Array<Status>> = await client.get<Array<Status>>(`/accounts/${account.id}/statuses`, { limit: 40 })
@ -101,12 +98,12 @@ const actions: ActionTree<TimelineState, RootState> = {
return Promise.resolve(null)
}
commit(MUTATION_TYPES.CHANGE_LAZY_LOADING, true)
const client = new Mastodon(
rootState.TimelineSpace.account.accessToken!,
rootState.TimelineSpace.account.baseURL + '/api/v1'
)
const client = new Mastodon(rootState.TimelineSpace.account.accessToken!, rootState.TimelineSpace.account.baseURL + '/api/v1')
try {
const res: Response<Array<Status>> = await client.get<Array<Status>>(`/accounts/${loadPosition.account.id}/statuses`, { max_id: loadPosition.status.id, limit: 40 })
const res: Response<Array<Status>> = await client.get<Array<Status>>(`/accounts/${loadPosition.account.id}/statuses`, {
max_id: loadPosition.status.id,
limit: 40
})
commit(MUTATION_TYPES.INSERT_TIMELINE, res.data)
} finally {
commit(MUTATION_TYPES.CHANGE_LAZY_LOADING, false)

View File

@ -2,9 +2,9 @@ import Mastodon, { Status, Context, Response } from 'megalodon'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface TootDetailState {
message: Status | null,
ancestors: Array<Status>,
export type TootDetailState = {
message: Status | null
ancestors: Array<Status>
descendants: Array<Status>
}
@ -38,7 +38,7 @@ const mutations: MutationTree<TootDetailState> = {
},
[MUTATION_TYPES.UPDATE_ANCESTORS_TOOT]: (state, message: Status) => {
// Replace target message in ancestors
state.ancestors = state.ancestors.map((toot) => {
state.ancestors = state.ancestors.map(toot => {
if (toot.id === message.id) {
return message
} else if (toot.reblog !== null && toot.reblog.id === message.id) {
@ -54,7 +54,7 @@ const mutations: MutationTree<TootDetailState> = {
})
},
[MUTATION_TYPES.DELETE_ANCESTORS_TOOT]: (state, message: Status) => {
state.ancestors = state.ancestors.filter((toot) => {
state.ancestors = state.ancestors.filter(toot => {
if (toot.reblog !== null && toot.reblog.id === message.id) {
return false
} else {
@ -87,7 +87,7 @@ const mutations: MutationTree<TootDetailState> = {
},
[MUTATION_TYPES.UPDATE_DESCENDANTS_TOOT]: (state, message: Status) => {
// Replace target message in descendants
state.descendants = state.descendants.map((toot) => {
state.descendants = state.descendants.map(toot => {
if (toot.id === message.id) {
return message
} else if (toot.reblog !== null && toot.reblog.id === message.id) {
@ -103,7 +103,7 @@ const mutations: MutationTree<TootDetailState> = {
})
},
[MUTATION_TYPES.DELETE_DESCENDANTS_TOOT]: (state, message: Status) => {
state.descendants = state.descendants.filter((toot) => {
state.descendants = state.descendants.filter(toot => {
if (toot.reblog !== null && toot.reblog.id === message.id) {
return false
} else {
@ -120,10 +120,7 @@ const actions: ActionTree<TootDetailState, RootState> = {
commit(MUTATION_TYPES.CHANGE_TOOT, message)
},
fetchToot: async ({ commit, rootState }, message: Status) => {
const client = new Mastodon(
rootState.TimelineSpace.account.accessToken!,
rootState.TimelineSpace.account.baseURL + '/api/v1'
)
const client = new Mastodon(rootState.TimelineSpace.account.accessToken!, rootState.TimelineSpace.account.baseURL + '/api/v1')
const res: Response<Context> = await client.get<Context>(`/statuses/${message.id}/context`, { limit: 40 })
commit(MUTATION_TYPES.UPDATE_ANCESTORS, res.data.ancestors)

View File

@ -3,7 +3,7 @@ import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
import AxiosLoading from '@/utils/axiosLoading'
export interface HeaderMenuState {
export type HeaderMenuState = {
title: string
reload: boolean
loading: boolean

View File

@ -9,19 +9,21 @@ import Report, { ReportState } from './Modals/Report'
import { Module, GetterTree } from 'vuex'
import { RootState } from '@/store/index'
export interface ModalsState {}
export type ModalsState = {}
export interface ModalsModuleState extends ModalsState {
Jump: JumpState,
AddListMember: AddListMemberState,
ImageViewer: ImageViewerState,
ListMembership: ListMembershipState,
MuteConfirm: MuteConfirmState,
NewToot: NewTootModuleState,
Report: ReportState,
type ModalsModule = {
Jump: JumpState
AddListMember: AddListMemberState
ImageViewer: ImageViewerState
ListMembership: ListMembershipState
MuteConfirm: MuteConfirmState
NewToot: NewTootModuleState
Report: ReportState
Shortcut: ShortcutState
}
export type ModalsModuleState = ModalsModule & ModalsState
const state = (): ModalsState => ({})
const getters: GetterTree<ModalsState, RootState> = {

View File

@ -2,7 +2,7 @@ import Mastodon, { Account, Response } from 'megalodon'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface AddListMemberState {
export type AddListMemberState = {
modalOpen: boolean
accounts: Array<Account>
targetListId: string | null

View File

@ -2,10 +2,10 @@ import { Module, MutationTree, ActionTree, GetterTree } from 'vuex'
import { Attachment } from 'megalodon'
import { RootState } from '@/store'
export interface ImageViewerState {
modalOpen: boolean,
currentIndex: number,
mediaList: Array<Attachment>,
export type ImageViewerState = {
modalOpen: boolean
currentIndex: number
mediaList: Array<Attachment>
loading: boolean
}
@ -35,10 +35,10 @@ const mutations: MutationTree<ImageViewerState> = {
[MUTATION_TYPES.CHANGE_MEDIA_LIST]: (state, mediaList: Array<Attachment>) => {
state.mediaList = mediaList
},
[MUTATION_TYPES.INCREMENT_INDEX]: (state) => {
[MUTATION_TYPES.INCREMENT_INDEX]: state => {
state.currentIndex++
},
[MUTATION_TYPES.DECREMENT_INDEX]: (state) => {
[MUTATION_TYPES.DECREMENT_INDEX]: state => {
state.currentIndex--
},
[MUTATION_TYPES.CHANGE_LOADING]: (state, value: boolean) => {
@ -86,14 +86,14 @@ const getters: GetterTree<ImageViewerState, RootState> = {
return null
},
showLeft: (state): boolean => {
const notFirst = (state.currentIndex > 0)
const isManyItem = (state.mediaList.length > 1)
return (notFirst && isManyItem)
const notFirst = state.currentIndex > 0
const isManyItem = state.mediaList.length > 1
return notFirst && isManyItem
},
showRight: (state): boolean => {
const notLast = (state.currentIndex < (state.mediaList.length - 1))
const isManyItem = (state.mediaList.length > 1)
return (notLast && isManyItem)
const notLast = state.currentIndex < state.mediaList.length - 1
const isManyItem = state.mediaList.length > 1
return notLast && isManyItem
}
}

View File

@ -2,20 +2,20 @@ import router from '@/router'
import i18n from '~/src/config/i18n'
import { Module, MutationTree, ActionTree } from 'vuex'
import { List } from 'megalodon'
import LocalTag from '~/src/types/localTag'
import { LocalTag } from '~/src/types/localTag'
import { RootState } from '@/store'
export interface Channel {
name: string,
export type Channel = {
name: string
path: string
}
export interface JumpState {
modalOpen: boolean,
channel: string,
defaultChannelList: Array<Channel>,
listChannelList: Array<Channel>,
tagChannelList: Array<Channel>,
export type JumpState = {
modalOpen: boolean
channel: string
defaultChannelList: Array<Channel>
listChannelList: Array<Channel>
tagChannelList: Array<Channel>
selectedChannel: Channel
}
@ -87,7 +87,7 @@ const mutations: MutationTree<JumpState> = {
state.selectedChannel = channel
},
[MUTATION_TYPES.UPDATE_LIST_CHANNEL]: (state, lists: Array<List>) => {
state.listChannelList = lists.map((l) => {
state.listChannelList = lists.map(l => {
const channel: Channel = {
name: `#${l.title}`,
path: `lists/${l.id}`

View File

@ -3,10 +3,10 @@ import lodash from 'lodash'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface ListMembershipState {
modalOpen: boolean,
account: Account | null,
lists: Array<List>,
export type ListMembershipState = {
modalOpen: boolean
account: Account | null
lists: Array<List>
belongToLists: Array<List>
}
@ -47,19 +47,13 @@ const actions: ActionTree<ListMembershipState, RootState> = {
commit(MUTATION_TYPES.CHANGE_ACCOUNT, account)
},
fetchListMembership: async ({ commit, rootState }, account: Account) => {
const client = new Mastodon(
rootState.TimelineSpace.account.accessToken!,
rootState.TimelineSpace.account.baseURL + '/api/v1'
)
const client = new Mastodon(rootState.TimelineSpace.account.accessToken!, rootState.TimelineSpace.account.baseURL + '/api/v1')
const res: Response<Array<List>> = await client.get<Array<List>>(`/accounts/${account.id}/lists`)
commit(MUTATION_TYPES.CHANGE_BELONG_TO_LISTS, res.data.map(l => l.id))
return res.data
},
fetchLists: async ({ commit, rootState }) => {
const client = new Mastodon(
rootState.TimelineSpace.account.accessToken!,
rootState.TimelineSpace.account.baseURL + '/api/v1'
)
const client = new Mastodon(rootState.TimelineSpace.account.accessToken!, rootState.TimelineSpace.account.baseURL + '/api/v1')
const res: Response<Array<List>> = await client.get<Array<List>>('/lists')
commit(MUTATION_TYPES.CHANGE_LISTS, res.data)
return res.data
@ -69,10 +63,7 @@ const actions: ActionTree<ListMembershipState, RootState> = {
const removedLists = lodash.difference(state.belongToLists, belongToLists)
const addedLists = lodash.difference(belongToLists, state.belongToLists)
commit(MUTATION_TYPES.CHANGE_BELONG_TO_LISTS, belongToLists)
const client = new Mastodon(
rootState.TimelineSpace.account.accessToken!,
rootState.TimelineSpace.account.baseURL + '/api/v1'
)
const client = new Mastodon(rootState.TimelineSpace.account.accessToken!, rootState.TimelineSpace.account.baseURL + '/api/v1')
const removedPromise = removedLists.map(id => {
return client.del<{}>(`/lists/${id}/accounts`, {
account_ids: [state.account!.id]

View File

@ -2,8 +2,8 @@ import Mastodon, { Account, Response, Relationship } from 'megalodon'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface MuteConfirmState {
modalOpen: boolean,
export type MuteConfirmState = {
modalOpen: boolean
account: Account | null
}
@ -34,10 +34,7 @@ const actions: ActionTree<MuteConfirmState, RootState> = {
commit(MUTATION_TYPES.CHANGE_ACCOUNT, account)
},
submit: async ({ state, rootState, dispatch }, notify: boolean) => {
const client = new Mastodon(
rootState.TimelineSpace.account.accessToken!,
rootState.TimelineSpace.account.baseURL + '/api/v1'
)
const client = new Mastodon(rootState.TimelineSpace.account.accessToken!, rootState.TimelineSpace.account.baseURL + '/api/v1')
const res: Response<Relationship> = await client.post<Relationship>(`/accounts/${state.account!.id}/mute`, {
notifications: notify
})

View File

@ -20,7 +20,7 @@ type MediaDescription = {
description: string
}
export interface NewTootState {
export type NewTootState = {
modalOpen: boolean
initialStatus: string
initialSpoiler: string
@ -36,10 +36,12 @@ export interface NewTootState {
loading: boolean
}
export interface NewTootModuleState extends NewTootState {
type NewTootModule = {
Status: StatusState
}
export type NewTootModuleState = NewTootModule & NewTootState
const state = (): NewTootState => ({
modalOpen: false,
initialStatus: '',

View File

@ -11,7 +11,7 @@ interface SuggestAccount extends Suggest {}
interface SuggestHashtag extends Suggest {}
export interface StatusState {
export type StatusState = {
filteredAccounts: Array<SuggestAccount>
filteredHashtags: Array<SuggestHashtag>
}

View File

@ -2,8 +2,8 @@ import Mastodon, { Status } from 'megalodon'
import { Module, MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface ReportState {
modalOpen: boolean,
export type ReportState = {
modalOpen: boolean
message: Status | null
}
@ -32,10 +32,7 @@ const actions: ActionTree<ReportState, RootState> = {
commit(MUTATION_TYPES.CHANGE_MODAL_OPEN, true)
},
submit: async ({ rootState }, { account_id, status_id, comment }) => {
const client = new Mastodon(
rootState.TimelineSpace.account.accessToken!,
rootState.TimelineSpace.account.baseURL + '/api/v1'
)
const client = new Mastodon(rootState.TimelineSpace.account.accessToken!, rootState.TimelineSpace.account.baseURL + '/api/v1')
return client.post<{}>(`/reports`, {
account_id: account_id,
status_ids: [status_id],

View File

@ -1,7 +1,7 @@
import { Module, MutationTree } from 'vuex'
import { RootState } from '@/store'
export interface ShortcutState {
export type ShortcutState = {
modalOpen: boolean
}

View File

@ -1,11 +1,11 @@
import Mastodon, { List, Response, Account } from 'megalodon'
import { ipcRenderer } from 'electron'
import { Module, MutationTree, ActionTree } from 'vuex'
import LocalTag from '~/src/types/localTag'
import LocalAccount from '~/src/types/localAccount'
import { LocalTag } from '~/src/types/localTag'
import { LocalAccount } from '~/src/types/localAccount'
import { RootState } from '@/store'
export interface SideMenuState {
export type SideMenuState = {
unreadHomeTimeline: boolean
unreadNotifications: boolean
unreadMentions: boolean

View File

@ -14,23 +14,21 @@ import molecules, { MoleculesModuleState } from './molecules'
Vue.use(Vuex)
export interface RootState {
App: AppState,
GlobalHeader: GlobalHeaderState,
Login: LoginState,
Authorize: AuthorizeState,
TimelineSpace: TimelineSpaceModuleState,
Preferences: PreferencesModuleState,
Settings: SettingsModuleState,
molecules: MoleculesModuleState,
export type RootState = {
App: AppState
GlobalHeader: GlobalHeaderState
Login: LoginState
Authorize: AuthorizeState
TimelineSpace: TimelineSpaceModuleState
Preferences: PreferencesModuleState
Settings: SettingsModuleState
molecules: MoleculesModuleState
route: Route
}
export default new Vuex.Store({
strict: process.env.NODE_ENV !== 'production',
plugins: process.env.NODE_ENV !== 'production'
? [createLogger({})]
: [],
plugins: process.env.NODE_ENV !== 'production' ? [createLogger({})] : [],
modules: {
App,
GlobalHeader,

View File

@ -1,6 +1,6 @@
import Toot, { TootState } from './molecules/Toot'
export interface MoleculesModuleState {
export type MoleculesModuleState = {
Toot: TootState
}

View File

@ -3,7 +3,7 @@ import { ipcRenderer } from 'electron'
import { Module, ActionTree } from 'vuex'
import { RootState } from '@/store'
export interface TootState {}
export type TootState = {}
const state = (): TootState => ({})

View File

@ -1,17 +1,17 @@
import { Status, Account } from 'megalodon'
export interface LoadPosition {
export type LoadPosition = {
status: Status
}
export interface LoadPositionWithAccount extends LoadPosition {
export type LoadPositionWithAccount = LoadPosition & {
account: Account
}
export interface LoadPositionWithList extends LoadPosition {
export type LoadPositionWithList = LoadPosition & {
list_id: string
}
export interface LoadPositionWithTag extends LoadPosition {
export type LoadPositionWithTag = LoadPosition & {
tag: string
}

View File

@ -1,6 +1,6 @@
import { Account } from 'megalodon'
export interface RemoveAccountFromList {
export type RemoveAccountFromList = {
account: Account
listId: string
}

View File

@ -1,4 +1,4 @@
export default interface LocalAccount {
export type LocalAccount = {
_id?: string
baseURL: string
domain: string

View File

@ -1,4 +1,4 @@
export default interface LocalTag {
tagName: string,
export type LocalTag = {
tagName: string
_id?: string
}