summaryrefslogtreecommitdiff
path: root/app_expo/models/character-store/character-store.ts
blob: 97511180bd992977e3ca2174cbfda818af25d16b (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import { Instance, SnapshotOut, types } from 'mobx-state-tree'
import { CharacterModel, CharacterSnapshot } from '../character/character'
import { CharacterApi } from '../../services/api/character-api'
import { withEnvironment } from '../extensions/with-environment'

/**
 * Example store containing Rick and Morty characters
 */
export const CharacterStoreModel = types
  .model('CharacterStore')
  .props({
    characters: types.optional(types.array(CharacterModel), []),
  })
  .extend(withEnvironment)
  .actions((self) => ({
    saveCharacters: (characterSnapshots: CharacterSnapshot[]) => {
      self.characters.replace(characterSnapshots)
    },
  }))
  .actions((self) => ({
    getCharacters: async () => {
      const characterApi = new CharacterApi(self.environment.api)
      const result = await characterApi.getCharacters()

      if (result.kind === 'ok') {
        self.saveCharacters(result.characters)
      } else {
        __DEV__ && console.tron.log(result.kind)
      }
    },
  }))

type CharacterStoreType = Instance<typeof CharacterStoreModel>
export interface CharacterStore extends CharacterStoreType {}
type CharacterStoreSnapshotType = SnapshotOut<typeof CharacterStoreModel>
export interface CharacterStoreSnapshot extends CharacterStoreSnapshotType {}
export const createCharacterStoreDefaultModel = () => types.optional(CharacterStoreModel, {})