@@ -8,7 +8,7 @@ import axios from 'axios'
8
8
const PetDetailPage : React . FC = ( ) => {
9
9
const [ m_petApiData , setPetApiData ] = useState < PetApiData > ( )
10
10
const m_searchParams = useSearchParams ( ) [ 0 ]
11
-
11
+
12
12
useEffect ( ( ) => {
13
13
const pet_type = m_searchParams . get ( 'pet_type' )
14
14
const pet_id = m_searchParams . get ( 'pet_id' )
@@ -18,39 +18,39 @@ const PetDetailPage: React.FC = () => {
18
18
// console.log("PetDetailPage - Pet ID: ", pet_id)
19
19
// console.log("PetDetailPage - Breed ID: ", breed_id)
20
20
21
- const imgEndpointURL = pet_type === "dog" ?
21
+ const imgEndpointURL = pet_type === "dog" ?
22
22
`https://api.thedogapi.com/v1/images/${ pet_id } ` :
23
- `https://api.thecatapi.com/v1/images/${ pet_id } `
24
-
25
- const breedEndpointURL = pet_type === 'dog' ?
23
+ `https://api.thecatapi.com/v1/images/${ pet_id } `
24
+
25
+ const breedEndpointURL = pet_type === 'dog' ?
26
26
`https://api.thedogapi.com/v1/breeds/${ breed_id } ` :
27
27
`https://api.thecatapi.com/v1/breeds/${ breed_id } `
28
28
29
- const fetchPetApiData = async ( ) : Promise < void > => {
29
+ const fetchPetApiData = async ( ) : Promise < void > => {
30
30
try {
31
31
const imgRes = await axios . get ( imgEndpointURL , {
32
32
headers : {
33
33
'x-api-key' : pet_type === 'dog' ?
34
- import . meta. env . VITE_DOG_API_KEY :
35
- import . meta. env . VITE_CAT_API_KEY
34
+ import . meta. env . VITE_DOG_API_KEY :
35
+ import . meta. env . VITE_CAT_API_KEY
36
36
}
37
37
} )
38
38
const breedRes = await axios . get ( breedEndpointURL , {
39
39
headers : {
40
40
'x-api-key' : pet_type === 'dog' ?
41
- import . meta. env . VITE_DOG_API_KEY :
42
- import . meta. env . VITE_CAT_API_KEY
41
+ import . meta. env . VITE_DOG_API_KEY :
42
+ import . meta. env . VITE_CAT_API_KEY
43
43
}
44
44
} )
45
45
46
46
const imgData = imgRes . data
47
47
const breedData = breedRes . data
48
48
const petApiData = new PetApiData (
49
49
imgData . id , imgData . url , breedData ,
50
- imgData . height , imgData . width ,
50
+ imgData . height , imgData . width ,
51
51
pet_type === "dog" ? PET_API_TYPE . DOG : PET_API_TYPE . CAT
52
52
)
53
- setPetApiData ( petApiData )
53
+ setPetApiData ( petApiData )
54
54
}
55
55
catch ( err : any ) {
56
56
console . log ( "Error fetching from Pet API: " , err . message )
@@ -59,14 +59,41 @@ const PetDetailPage: React.FC = () => {
59
59
fetchPetApiData ( )
60
60
} , [ ] )
61
61
62
+ interface IconInfoPair {
63
+ imgURL : string
64
+ info : string
65
+ }
66
+
67
+ const getAdditionalInfo = ( petApiData : PetApiData ) : IconInfoPair [ ] => {
68
+ switch ( petApiData . apiType ) {
69
+ case PET_API_TYPE . DOG :
70
+ const dogBreedData = petApiData . breedData as DogBreedData
71
+ return [
72
+ { imgURL : "" , info : dogBreedData . lifespan } ,
73
+ { imgURL : "" , info : dogBreedData . height } ,
74
+ { imgURL : "" , info : dogBreedData . temperaments . toString ( ) } ,
75
+ { imgURL : "" , info : dogBreedData . weight } ,
76
+ ]
77
+ case PET_API_TYPE . CAT :
78
+ const catBreedData = petApiData . breedData as CatBreedData
79
+ return [
80
+ { imgURL : "" , info : catBreedData . lifespan } ,
81
+ { imgURL : "" , info : catBreedData . temperaments . toString ( ) } ,
82
+ { imgURL : "" , info : catBreedData . weight }
83
+ ]
84
+ default :
85
+ return [ ]
86
+ }
87
+ }
88
+
62
89
useEffect ( ( ) => {
63
90
console . log ( "Pet api data change: " , m_petApiData )
64
91
} , [ m_petApiData ] )
65
92
66
93
return (
67
94
< main >
68
- < Navbar useSticky /> {
69
- m_petApiData &&
95
+ < Navbar useSticky /> {
96
+ m_petApiData &&
70
97
< section className = 'min-h-[30rem] text-center flex flex-col justify-start items-center' >
71
98
72
99
{ /* ---- BANNER IMAGE ---- */ }
@@ -77,25 +104,45 @@ const PetDetailPage: React.FC = () => {
77
104
{ /* --- --- */ }
78
105
< div className = 'max-w-4xl flex flex-col md:flex-row mb-margin-xl mx-margin-s' >
79
106
80
- < div className = 'text-center flex-col mb-margin-xl mr-margin-xl' >
81
- < div className = 'flex items-start justify-between mb-margin-s' >
107
+ { /* --- DESCRIPTION CONTAINER --- */ }
108
+ < div className = 'text-center flex-col items-start min-w-96 mb-margin-xl mr-margin-xl' >
109
+
110
+ { /* ---- DESC HEADER ---- */ }
111
+ < div className = 'flex items-end justify-between mb-margin-m' >
82
112
< h1 className = 'font-bold text-3xl' > { m_petApiData . breedData ?. breed . toUpperCase ( ) } </ h1 >
83
113
< button className = 'font-semibold rounded-lg outline outline-2 outline-primary-400 px-5 py-3' > Favourite</ button >
84
114
</ div >
115
+
116
+ { /* ---- DESCRIPTION ---- */ }
85
117
< p className = 'text-left' > {
86
- m_petApiData . apiType === PET_API_TYPE . DOG ?
87
- `${ m_petApiData . breedData ?. breed } 's are bred for ${ ( m_petApiData . breedData as DogBreedData ) . bredFor } ` :
88
- `${ ( m_petApiData . breedData as CatBreedData ) . description } `
118
+ m_petApiData . apiType === PET_API_TYPE . DOG ?
119
+ `${ m_petApiData . breedData ?. breed } 's are bred for ${ ( m_petApiData . breedData as DogBreedData ) . bredFor } ` :
120
+ `${ ( m_petApiData . breedData as CatBreedData ) . description } `
89
121
} </ p >
122
+
123
+ { /* ---- ADDITIONAL INFO ----- */ }
124
+ < div className = '' > {
125
+ getAdditionalInfo ( m_petApiData ) . map ( iconInfoPair => {
126
+ return (
127
+ < div className = 'flex justify-start items-center' >
128
+ { /* <img src={iconInfoPair.imgURL} alt="" /> */ }
129
+ < span > *</ span >
130
+ < span className = 'text-left' > { iconInfoPair . info } </ span >
131
+ </ div >
132
+ )
133
+ } )
134
+ } </ div >
90
135
</ div >
136
+
137
+ { /* ----- ADOPTION FEE BOX ----- */ }
91
138
< div className = '
92
- flex flex-col justify-center items-center rounded-xl
93
- w-full max-w-72 text-center text-text-50 bg-white
139
+ flex flex-col justify-center items-center rounded-xl shadow-xl
140
+ w-full max-w-96 text-center text-text-50 bg-white px-4 py-6
94
141
' >
95
- < span className = 'text-lg font-medium mb-margin-xxs' > Adoption Fee</ span >
96
- < span className = 'text-xl font-semibold mb-margin-l' > $150.0</ span >
142
+ < span className = 'text-xl font-medium mb-margin-xxs' > Adoption Fee</ span >
143
+ < span className = 'text-lg font-semibold mb-margin-l' > $150.0</ span >
97
144
< button className = '
98
- text-text-950 bg-primary-500 hover:bg-primary-600 px-6 py-2 rounded-lg
145
+ text-text-950 bg-primary-500 hover:bg-primary-600 px-6 py-3 rounded-xl
99
146
' > Adopt Me</ button >
100
147
</ div >
101
148
</ div >
0 commit comments