|
1
|
|
|
import { useState, useEffect } from 'react'; |
|
2
|
|
|
import { useSelector } from 'react-redux'; |
|
3
|
|
|
import { RootState } from '../../redux/store/store'; |
|
4
|
|
|
import { Link } from 'react-router-dom'; |
|
5
|
|
|
import userImage from '../../assets/images/user.jpg'; |
|
6
|
|
|
import axios, {AxiosError} from 'axios'; |
|
7
|
|
|
import { API_URL, getHeader } from '../../helpers/config'; |
|
8
|
|
|
import { Button, ToggleSwitch, TextInput, Label } from "flowbite-react"; |
|
9
|
|
|
import { useNavigate } from 'react-router-dom'; |
|
10
|
|
|
import { toast } from 'react-toastify'; |
|
11
|
|
|
import UserGate from '../../components/UserGate'; |
|
12
|
|
|
|
|
13
|
2 |
|
const UserInfoPage: React.FC = () => { |
|
14
|
2 |
|
const navigate = useNavigate(); |
|
15
|
|
|
|
|
16
|
3 |
|
const { isLoggedIn, token, user, role } = useSelector((state: RootState) => state.auth); |
|
17
|
2 |
|
const [userData, setUserData] = useState<any>(null); |
|
18
|
2 |
|
const [githubId, setGithubId] = useState(""); |
|
19
|
2 |
|
const [isMonthlyPayment, setIsMonthlyPayment] = useState(false); |
|
20
|
2 |
|
const [accumulatedCost, setAccumulatedCost] = useState(0); |
|
21
|
2 |
|
const [balance, setBalance] = useState(0); |
|
22
|
|
|
|
|
23
|
2 |
|
const updateUserPay = async (e: React.FormEvent<HTMLFormElement>) => { |
|
24
|
|
|
e.preventDefault(); |
|
25
|
|
|
const updatedData = { |
|
26
|
|
|
'isMonthlyPayment': isMonthlyPayment, |
|
27
|
|
|
'balance': balance, |
|
28
|
|
|
}; |
|
29
|
|
|
try { |
|
30
|
|
|
const response = await axios.patch(`${API_URL}/users/${githubId}/adjust-funds`, updatedData, getHeader(token)); |
|
31
|
|
|
console.log(response); |
|
32
|
|
|
toast.success("Payment was successful was updated"); |
|
33
|
|
|
} catch(error) |
|
34
|
|
|
{ |
|
35
|
|
|
const axiosError = error as AxiosError; |
|
36
|
|
|
toast.error(`Payment was not processed ${axiosError.message}`); |
|
37
|
2 |
|
console.error("Error:", axiosError.response || axiosError.toJSON()); |
|
38
|
|
|
} |
|
39
|
|
|
} |
|
40
|
|
|
|
|
41
|
2 |
|
useEffect(() => { |
|
42
|
2 |
|
if (!isLoggedIn) |
|
43
|
1 |
|
navigate("/") |
|
44
|
1 |
|
const getAuthMe = async () => { |
|
45
|
1 |
|
try { |
|
46
|
1 |
|
const response = await axios.get(`${API_URL}/auth/me`, getHeader(token)); |
|
47
|
|
|
console.log(response.data); |
|
48
|
|
|
const data = response.data; |
|
49
|
|
|
setUserData(data); |
|
50
|
|
|
setGithubId(data.githubId); |
|
51
|
|
|
setIsMonthlyPayment(data.isMonthlyPayment); |
|
52
|
|
|
setAccumulatedCost(data.accumulatedCost); |
|
53
|
|
|
setBalance(data.balance); |
|
54
|
|
|
} catch (error) { |
|
55
|
|
|
console.error('Error fetching user data', error); |
|
56
|
|
|
} |
|
57
|
|
|
}; |
|
58
|
1 |
|
getAuthMe(); |
|
59
|
|
|
},[]); |
|
60
|
|
|
|
|
61
|
2 |
|
return ( |
|
62
|
|
|
<div className="flex justify-center items-center min-h-screen" data-testid="user-info-page"> |
|
63
|
|
|
<UserGate/> |
|
64
|
|
|
<div className="block h-fit w-96 overflow-scroll p-6 bg-white border border-gray-200 rounded-lg shadow hover:bg-gray-100 dark:bg-gray-800 dark:border-gray-700 dark:hover:bg-gray-700 flex flex-col"> |
|
65
|
|
|
<img className="w-24 h-24 mb-3 rounded-full shadow-lg object-contain" src={userImage} alt="User image" /> |
|
66
|
|
|
|
|
67
|
|
|
<p className="font-normal text-gray-700 dark:text-gray-400 p-2"> |
|
68
|
|
|
Användare: <b>{userData?.username || "No User"}</b> |
|
69
|
|
|
</p> |
|
70
|
|
|
|
|
71
|
|
|
<p className="font-normal text-gray-700 dark:text-gray-400 p-2"> |
|
72
|
|
|
Email: <b>{userData?.email|| "No Email"}</b> |
|
73
|
|
|
</p> |
|
74
|
|
|
|
|
75
|
|
|
<p className="font-normal text-gray-700 dark:text-gray-400 p-2"> |
|
76
|
|
|
Skapat: <b>{userData?.createdAt || "No User"}</b> |
|
77
|
|
|
</p> |
|
78
|
|
|
|
|
79
|
|
|
<p className="font-normal text-gray-700 dark:text-gray-400 p-2"> |
|
80
|
|
|
Roll: <b>{role}</b> |
|
81
|
|
|
</p> |
|
82
|
|
|
|
|
83
|
|
|
<p className="font-normal text-gray-700 dark:text-gray-400 p-2"> |
|
84
|
|
|
Github Id: <b>{userData?.githubId || ":("}</b> |
|
85
|
|
|
</p> |
|
86
|
|
|
|
|
87
|
|
|
<section className="bg-white dark:bg-gray-900"> |
|
88
|
|
|
<div className="max-w-2xl px-4 py-8 mx-auto lg:py-16"> |
|
89
|
|
|
<h2 className="mb-4 text-xl font-bold text-gray-900 dark:text-white">Betalning för <b>{ userData?.username || "No User" }</b> </h2> |
|
90
|
|
|
<form action="#" onSubmit={(e) => updateUserPay(e)}> |
|
91
|
|
|
<div className="grid gap-4 mb-4 sm:grid-cols-2 sm:gap-6 sm:mb-5"> |
|
92
|
|
|
<div className="flex items-center gap-2"> |
|
93
|
|
|
<ToggleSwitch color="blue" checked={isMonthlyPayment} label="Månatlig betalning" onChange={() => setIsMonthlyPayment(!isMonthlyPayment)} /> |
|
94
|
|
|
</div> |
|
95
|
|
|
<div className="w-full"> |
|
96
|
|
|
<Label htmlFor="ackkost" >Ackumulerad kostnad</Label> |
|
97
|
|
|
<TextInput color="blue" id="ackkost" type="text" value= {accumulatedCost} placeholder="" disabled/> |
|
98
|
|
|
</div> |
|
99
|
|
|
|
|
100
|
|
|
<div className="w-full"> |
|
101
|
|
|
<Label htmlFor=" balans" >Hur mycket vill du fylla på med?</Label> |
|
102
|
2 |
|
<TextInput color="blue" id="balans" type="text" value={balance} onChange={(e)=> setBalance(parseFloat(e.target.value) || 0) } placeholder="" required/> |
|
103
|
|
|
</div> |
|
104
|
|
|
</div> |
|
105
|
|
|
<div className="flex items-center space-x-4"> |
|
106
|
|
|
<Button type="submit" color="blue"> |
|
107
|
|
|
Fyll på eller uppdatera! |
|
108
|
|
|
</Button> |
|
109
|
|
|
<Button color="light"> |
|
110
|
|
|
<Link to="/userlistpage">Gå tillbaka</Link> |
|
111
|
|
|
</Button> |
|
112
|
|
|
</div> |
|
113
|
|
|
</form> |
|
114
|
|
|
</div> |
|
115
|
|
|
</section> |
|
116
|
|
|
</div> |
|
117
|
|
|
</div> |
|
118
|
|
|
); |
|
119
|
|
|
}; |
|
120
|
|
|
|
|
121
|
|
|
export default UserInfoPage; |
|
122
|
|
|
|