summaryrefslogtreecommitdiff
path: root/app/models/character-store
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/character-store')
-rw-r--r--app/models/character-store/character-store.test.ts7
-rw-r--r--app/models/character-store/character-store.ts37
2 files changed, 44 insertions, 0 deletions
diff --git a/app/models/character-store/character-store.test.ts b/app/models/character-store/character-store.test.ts
new file mode 100644
index 0000000..6d82079
--- /dev/null
+++ b/app/models/character-store/character-store.test.ts
@@ -0,0 +1,7 @@
+import { CharacterStoreModel } from "./character-store"
+
+test("can be created", () => {
+ const instance = CharacterStoreModel.create({})
+
+ expect(instance).toBeTruthy()
+})
diff --git a/app/models/character-store/character-store.ts b/app/models/character-store/character-store.ts
new file mode 100644
index 0000000..bd92615
--- /dev/null
+++ b/app/models/character-store/character-store.ts
@@ -0,0 +1,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, {})