-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
226 lines (191 loc) · 7.27 KB
/
Copy pathscript.js
File metadata and controls
226 lines (191 loc) · 7.27 KB
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
// // fetch("https://easy-simple-users-rest-api.onrender.com")
// // .then((response) => response.text())
// // .then((data) => console.log(data))
// OR
// const fetchData = async () => {
// const response = await fetch(
// "https://easy-simple-users-rest-api.onrender.com"
// )
// const data = await response.text()
// console.log(data);
// }
// fetchData()
import { fetchData } from "./utils/fetchData.js";
import { formFactory } from "./utils/formFactory.js";
import { putData } from "./utils/putData.js";
const remoteUrl = "https://easy-simple-users-rest-api.onrender.com/api/users"; // try with /api/users too
const localUrl = "../New/mock-data/response.json";
const factory = (type) => {
return "Hello from factory ";
};
console.log(factory());
let users = []; // to hold fetched users data
// ...existing code...
// DOM elements (use IDs and safe fallbacks)
const alert = document.querySelector(".alert") || null;
//const spinner = document.getElementById("spin") || document.querySelector(".spinner-border") || null;
// ...existing code...
// Some codde has been review with GPT to improve error handling and user feedback
//
//
const loadData = async () => {
// query spinner when we need it (DOM is ready because we call loadData on DOMContentLoaded)
const spinner = document.getElementById("spin") || document.querySelector(".spinner-border");
if (spinner?.classList) spinner.classList.remove("d-none");
try {
console.log("Please We are Fetching your....");
const data = await fetchData(remoteUrl); // fetch data from remoteUrl or localUrl
if (data) {
if (spinner?.classList) spinner.classList.add("d-none");
users = data.data; // set the users variable
displayUsers(users); // pass users to displayUsers
addEventListeners(); // call addEventListeners after displaying users
updateCard();
}
} catch (error) {
console.error("Error fetching data:", error.message);
if (spinner?.classList) spinner.classList.add("d-none");
if (alert) {
alert.classList.remove("d-none");
alert.classList.add("alert-danger");
alert.innerHTML = `Failed to load data: ${error.message}`;
}
}
};
// ...existing code...
// run after DOM is ready to ensure elements exist
document.addEventListener("DOMContentLoaded", () => {
loadData();
});
// ...existing code...
// const data = await fetchData(url) // using await outside the async func will cause a syntax error if not define in the script as type="module"
// console.log(data);
const updateCard = (user) => {
const cardsArray = Array.from(document.querySelectorAll(".card"));
const foundCard = cardsArray.find((card) => {
return (
card.querySelector("button").getAttribute("data-user-id") === user.id
);
});
foundCard.innerHTML = `
<div class="card-image p-3">
<img src="${user.avatar_url}" alt="${user.name}" height="254px" class="card-img-top object-fit-cover" />
<span class="card-title">${user.name}</span>
</div>
<div class="card-content">
<ul class="list-group">
<li class="list-group-item"><strong>Name: </strong>${user.name}</li>
<li class="list-group-item"><strong>Age: </strong>${user.age}</li>
<li class="list-group-item">
<strong>Gender: </strong> ${user.gender}
</li>
</ul>
<button data-user-id="${user.id}" data-bs-target="#exampleModal" data-bs-toggle="modal" class="edit-btn btn btn-secondary m-2">Edit</button>
</div>
`;
console.log(foundCard);
};
const displayUsers = (localUsers) => {
if (!localUsers || localUsers.length === 0) {
alert.classList.remove("d-none");
alert.classList.add("alert-danger");
alert.innerHTML = "No users found.";
return;
}
localUsers.forEach((user) => {
const usersContainer = document.getElementById("users-container");
usersContainer.innerHTML += `
<article class="card">
<div class="card-image">
<img src="${user.avatar_url}" alt="${user.name}" class="card-img-top" />
<span class="card-title">${user.name}</span>
</div>
<div class="card-content">
<ul class="list-group">
<li class="list-group-item"><strong>Name:</strong>${user.name}</li>
<li class="list-group-item"><strong>Age:</strong>${user.age}</li>
<li class="list-group-item">
<strong>Role:</strong> ${user.gender}
</li>
</ul>
<button data-user-id="${user.id}" data-bs-target="#exampleModal" data-bs-toggle="modal" class="edit-btn btn btn-secondary m-2">Edit</button>
</div>
</article>
`;
});
};
const addEventListeners = () => {
const editButtons = document.querySelectorAll(".edit-btn");
editButtons.forEach((button) => {
button.addEventListener("click", (e) => {
document.querySelector(".modal-body").innerHTML = "";
document.querySelector(".modal-body").appendChild(formFactory());
const foundUser = users.find(
(user) => user.id === parseInt(e.target.getAttribute("data-user-id"))
);
getModalForm(foundUser);
});
});
const getModalForm = (foundUser) => {
const modalForm = document
.querySelector(".modal-body")
.querySelector("form");
modalForm.userName.value = foundUser.name;
modalForm.userAge.value = foundUser.age;
modalForm.userImage.value = foundUser.avatar_url;
modalForm.userGender.value = foundUser.gender;
submitBtn.setAttribute("data-user-id", foundUser.id);
};
const submitBtn = document.querySelector(".submit-btn");
submitBtn.addEventListener("click", async () => {
const dataToSend = {
name: document.querySelector("#userName").value,
age: document.querySelector("#userAge").value,
avatar_url: document.querySelector("#userImage").value,
gender: document.querySelector("#userGender").value,
id: document.querySelector(".submit-btn").getAttribute("data-user-id"),
};
//add spinner
document.querySelector(".modal-body").innerHTML = `
<div class="d-flex justify-content-center align-items-center" style="height: 312px;">
<div class="spinner-border" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
`;
// const putDataResponse = await putData(remoteUrl, dataToSend)
// console.log(putDataResponse)
try {
const response = await putData(remoteUrl, dataToSend);
if (response) {
document.querySelector(".modal-body").innerHTML = `
<div class="d-flex justify-content-center align-items-center" style="height: 312px;">
<div class="alert alert-success" role="alert">
${response.message}
</div>
</div>
`;
//console.log(response)
// dismiss modal
const myModal = document.getElementById("exampleModal");
const modal = bootstrap.Modal.getInstance(myModal);
updateCard(dataToSend);
setTimeout(() => {
modal.hide();
addEventListeners(); // re-attach event listeners
}, 700);
}
} catch (error) {
console.error("Failed to update data:", error);
document.querySelector(".modal-body").innerHTML = `
<div class="d-flex flex-column justify-content-center align-items-center" style="height: 312px;">
<div class="alert alert-danger w-100" role="alert">
${error.message}
</div>
<p class="mark">${error.stack}</p>
</div>
`;
}
//putData(remoteUrl, dataToSend);
});
};