src/store/index.ts

Summary

Maintainability
B
6 hrs
Test Coverage
F
56%
import { GetterTree } from 'vuex'
import {
  getAccessorType,
  getterTree,
  actionTree,
  mutationTree,
} from 'typed-vuex'
import { Token } from '~/entity/token'
import { PnutResponse } from '~/entity/pnut-response'
import { User } from '~/entity/user'

export type State = {
  // this is fake type
  auth: Partial<{
    user: Partial<PnutResponse<Token>>
    loggedIn: boolean
  }> | null
  unreadMessages: boolean
  unreadHomeStream: boolean
  unreadMentions: boolean
}

export const state = (): State => ({
  auth: null,
  unreadMessages: false,
  unreadHomeStream: false,
  unreadMentions: false,
})

export const mutations = mutationTree(state, {
  updateUnreadMessages(state, newState: boolean) {
    state.unreadMessages = newState
  },
  updateUnreadHomeStream(state, newState: boolean) {
    state.unreadHomeStream = newState
  },
  updateUnreadMentions(state, newState: boolean) {
    state.unreadMentions = newState
  },
})

export const rawGetters: GetterTree<State, any> = {
  user({ auth }): User | null {
    return auth?.user?.data?.user || null
  },
  storage({ auth }): Token.Storage {
    return (
      auth?.user?.data?.storage ?? {
        available: 0,
        total: 0,
      }
    )
  },
}

export const getters = getterTree(state, {
  user({ auth }): User | null {
    return auth?.user?.data?.user || null
  },
  storage({ auth }): Token.Storage {
    return (
      auth?.user?.data?.storage ?? {
        available: 0,
        total: 0,
      }
    )
  },
})

export const actions = actionTree(
  { state, getters, mutations: {} },
  {
    nuxtClientInit(): void {},
    async fetchUnread(): Promise<void> {
      const { hasUnread } = await this.$interactors.getUnreadCount.run(
        undefined
      )
      this.app.$accessor.updateUnreadMessages(hasUnread)
    },
  }
)

export const accessorType = getAccessorType({
  state,
  mutations,
  getters,
  actions,
})