1
1
<script setup lang="ts">
2
- import { useRoute } from " vue-router" ;
3
- import characterStore from " @/store/characters.store" ;
2
+ import { watch , watchEffect } from " vue" ;
3
+ import { useRoute , useRouter } from " vue-router" ;
4
+ import { useCharacter } from " @/characters/composables" ;
4
5
5
- import rickAndMortyApi from " @/api/rickAndMortyApi" ;
6
- import type { Character } from " @/interfaces/character" ;
7
- import { useQuery } from " @tanstack/vue-query" ;
8
6
9
7
const route = useRoute ();
8
+ const router = useRouter ();
10
9
11
10
// in this case the reactivity will be lost
12
11
const { id } = route .params as { id: string };
13
12
14
- const getCharacterCacheFirst = async (
15
- characterId : string
16
- ): Promise <Character > => {
17
- if (characterStore .checkId (characterId )) {
18
- return characterStore .ids .list [characterId ];
19
- }
20
-
21
- const { data } = await rickAndMortyApi .get <Character >(
22
- ` /character/${characterId } `
23
- );
24
- return data ;
25
- };
13
+ const { character, isLoading, hasError, errorMessage } = useCharacter (id );
26
14
27
- const { data : character } = useQuery <Character >(
28
- [" character" , id ],
29
- () => getCharacterCacheFirst (id ),
30
- {
31
- onSuccess : (data ) => {
32
- characterStore .loadId (data );
33
- },
15
+ watchEffect (() => {
16
+ if (! isLoading .value && hasError .value ) {
17
+ router .replace (" /characters" );
34
18
}
35
- );
19
+ } );
36
20
</script >
37
21
38
22
<template >
39
23
<div >
40
24
<h1 >Character #{{ id }}</h1 >
41
- <h1 v-if =" !character " >Loading...</h1 >
42
- <h1 v-else-if =" characterStore.characters. hasError" >
43
- {{ characterStore.characters. errorMessage }}
25
+ <h1 v-if =" isLoading " >Loading...</h1 >
26
+ <h1 v-else-if =" hasError" >
27
+ {{ errorMessage }}
44
28
</h1 >
45
- <div v-else class =" card" >
29
+ <div v-else-if = " character " class =" card" >
46
30
<figure >
47
- <img :src =" character.image" :alt =" character.name" class =" card-image" />
31
+ <img
32
+ :src =" character.image"
33
+ :alt =" character.name"
34
+ class =" card-image"
35
+ />
48
36
</figure >
49
37
<div class =" card-content" >
50
38
<h2 >{{ character.name }}</h2 >
@@ -83,7 +71,6 @@ figure {
83
71
object-fit : contain ;
84
72
}
85
73
86
-
87
74
.card-content {
88
75
width : 100% ;
89
76
display : flex ;
@@ -102,4 +89,8 @@ figure {
102
89
display : flex ;
103
90
justify-content : center ;
104
91
}
92
+
93
+ h1 {
94
+ margin : 2rem 0 ;
95
+ }
105
96
</style >
0 commit comments