Skip to content

Commit fb5dee4

Browse files
committed
session storing, clearing, and api fetching for users
1 parent b80e639 commit fb5dee4

File tree

7 files changed

+233
-64
lines changed

7 files changed

+233
-64
lines changed

main.js

Lines changed: 98 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ const { User, UserSetting } = require('./backend/database');
1010
const { Op } = require('sequelize');
1111
const axios = require('axios');
1212
const crypto = require('crypto');
13+
const Store = require('electron-store');
14+
const store = new Store();
15+
1316

1417
const apiUrl = process.env.API_URL;
1518
const serverKey = process.env.SERVER_KEY;
@@ -208,7 +211,14 @@ app.on('before-quit', async (event) => {
208211
}
209212
});
210213

211-
ipcMain.handle('save-personal-info', async (event, formData) => {
214+
//session clearing
215+
ipcMain.handle('session:clear', () => {
216+
store.delete('userSession');
217+
return true;
218+
});
219+
220+
221+
/*ipcMain.handle('save-personal-info', async (event, formData) => {
212222
try {
213223
const user = await User.findByPk(formData.id);
214224
@@ -236,11 +246,62 @@ ipcMain.handle('save-personal-info', async (event, formData) => {
236246
console.error('Error saving personal info:', err);
237247
return { success: false, error: err.message };
238248
}
249+
});*/
250+
251+
ipcMain.handle('save-personal-info', async (event, formData) => {
252+
try {
253+
const id = formData.id;
254+
255+
if (!id) {
256+
return { success: false, error: 'Missing user ID.' };
257+
}
258+
259+
//const response = await fetch('http://localhost/api/profile/my_profile_update', {
260+
const response = await fetch('http://www.vrbattles.gg/api/profile/my_profile_update', {
261+
method: 'POST',
262+
headers: {
263+
'Content-Type': 'application/json'
264+
},
265+
body: JSON.stringify({
266+
edit: true,
267+
editid: id,
268+
username: formData.username,
269+
ign: formData.ign,
270+
platform: formData.platform,
271+
timezone: formData.timezone,
272+
bio: formData.bio
273+
})
274+
});
275+
276+
const text = await response.text();
277+
let result;
278+
279+
try {
280+
result = JSON.parse(text);
281+
} catch (e) {
282+
return { success: false, error: 'Invalid JSON from API', raw: text };
283+
}
284+
285+
if (result.status === 'success') {
286+
return { success: true, data: result.data || {} };
287+
} else {
288+
return { success: false, error: result.message || 'Update failed' };
289+
}
290+
291+
} catch (err) {
292+
console.error('API Error saving personal info:', err);
293+
return { success: false, error: err.message };
294+
}
239295
});
240296

241297

242298

243299

300+
301+
302+
303+
304+
244305
/*ipcMain.handle('login', async (event, username, password) => {
245306
try {
246307
const user = await User.findOne({
@@ -615,57 +676,69 @@ ipcMain.handle('register-user', async (event, formData, file) => {
615676

616677
ipcMain.handle('get-user-by-id', async (event, id) => {
617678
try {
618-
if (!id) {
619-
const session = store.get('userSession');
620-
if (!session || !session.id) {
621-
return { success: false, message: 'No session or user ID found.' };
622-
}
623-
id = session.id;
679+
const session = store.get('userSession');
680+
if (!id && (!session || !session.id)) {
681+
return { success: false, message: 'No session or user ID found.' };
624682
}
625683

626-
const user = await User.findByPk(id);
627-
if (!user) return { success: false, message: 'User not found' };
684+
id = id || session.id;
685+
686+
//const response = await fetch('http://localhost/api/fetch/user', {
687+
const response = await fetch('http://www.vrbattles.gg/api/fetch/user', {
688+
method: 'POST',
689+
headers: { 'Content-Type': 'application/json' },
690+
body: JSON.stringify({ id })
691+
});
628692

629-
const userSetting = await UserSetting.findOne({ where: { user_id: id } });
693+
const text = await response.text();
694+
let result;
630695

631-
let parsedData = {};
632696
try {
633-
parsedData = user.player_data ? JSON.parse(user.player_data) : {};
634-
} catch (e) {
635-
console.warn('Failed to parse player_data:', e);
697+
result = JSON.parse(text);
698+
//console.log('[Fetch User] API Raw Result:', result);
699+
} catch (err) {
700+
return { success: false, message: 'Invalid JSON response from API', raw: text };
701+
}
702+
703+
const user = result.user || result.data?.[0];
704+
705+
if (result.status !== 'success' || !user) {
706+
return { success: false, message: result.message || 'Failed to fetch user' };
636707
}
637708

638709
return {
639710
success: true,
640711
user: {
641712
id: user.id,
642713
username: user.username,
643-
ign: user.ign,
714+
ign: user.ign || '',
644715
email: user.email,
645716
platform: user.platform || '',
646-
timezone: userSetting?.time_zone || '',
647-
displayName: parsedData.username || '',
717+
timezone: user.timezone || '',
718+
displayName: user.username || '',
648719
fullName: `${user.firstname || ''} ${user.lastname || ''}`.trim(),
649-
phone: parsedData.phone || '',
650-
bio: parsedData.profile?.bio || '',
720+
phone: '',
721+
bio: '',
651722
avatar: user.profile || '',
652-
player_banner: user.player_banner || '',
723+
banner: user.player_banner || '',
653724
player_session_id: user.player_session_id,
654725
wallet_id: user.wallet_id,
655-
stats: parsedData.stats || {},
656-
mmr: parsedData.player_mmr || {},
657-
teams: parsedData.teams || {}
726+
stats: {},
727+
mmr: {},
728+
teams: {}
658729
}
659730
};
660731
} catch (error) {
661-
console.error('Error fetching user by ID:', error);
662-
return { success: false, message: 'Error fetching user profile.' };
732+
//console.error('[Electron] API fetch error:', error);
733+
return { success: false, message: 'Error fetching user profile from API' };
663734
}
664735
});
665736

666737

667738

668739

740+
741+
669742
//lootlocker
670743
ipcMain.handle('lootlocker-login', async (event, { email, password }) => {
671744
try {

preload.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ contextBridge.exposeInMainWorld(
5353
//registerUser: (formData) => ipcRenderer.invoke('register-user', formData),
5454

5555
//login: (username, password) => ipcRenderer.invoke('login', username, password),
56-
clearSession: () => localStorage.removeItem('userSession'),
56+
//clearSession: () => localStorage.removeItem('userSession'),
57+
clearSession: () => {localStorage.removeItem('userSession'); ipcRenderer.invoke('session:clear'); },
5758
saveSession: (user) => localStorage.setItem('userSession', JSON.stringify(user)),
5859
getSession: () => JSON.parse(localStorage.getItem('userSession')),
5960
getUserById: (id) => ipcRenderer.invoke('get-user-by-id', id),

renderer/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@
141141
const personalInfo = {
142142
username: document.getElementById('username').value,
143143
displayName: document.getElementById('ign').value,
144-
email: document.getElementById('email').value,
144+
//email: document.getElementById('email').value,
145145
platform: document.getElementById('platform').value,
146146
timezone: document.getElementById('timezone').value,
147147
bio: document.getElementById('bio').value

renderer/js/modules/profile/personalInfo.js

Lines changed: 96 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ function initPersonalInfo() {
1818
}
1919

2020
// Handle form submission
21-
function handlePersonalInfoSubmit(e) {
21+
/*function handlePersonalInfoSubmit(e) {
2222
e.preventDefault();
2323
2424
const formData = new FormData(e.target);
@@ -94,13 +94,89 @@ async function savePersonalInfo(personalInfo) {
9494
console.error('Error calling savePersonalInfo:', error);
9595
window.uiModule.showNotification('An unexpected error occurred', 'error');
9696
}
97+
}*/
98+
99+
function handlePersonalInfoSubmit(e) {
100+
e.preventDefault();
101+
102+
const formData = new FormData(e.target);
103+
104+
const personalInfo = {
105+
username: formData.get('username'),
106+
ign: formData.get('ign'),
107+
email: formData.get('email'),
108+
platform: formData.get('platform'),
109+
timezone: formData.get('timezone'),
110+
bio: formData.get('bio')
111+
};
112+
113+
savePersonalInfo(personalInfo);
114+
}
115+
116+
function handleLoadPersonalInfo(e) {
117+
const personalInfo = e.detail;
118+
119+
document.getElementById('username').value = personalInfo.username || '';
120+
document.getElementById('ign').value = personalInfo.ign || '';
121+
document.getElementById('email').value = personalInfo.email || '';
122+
document.getElementById('platform').value = personalInfo.platform || '';
123+
document.getElementById('timezone').value = personalInfo.timezone || '';
124+
document.getElementById('bio').value = personalInfo.bio || '';
125+
126+
document.getElementById('full-name').textContent = personalInfo.fullName || '';
127+
document.getElementById('display-name').textContent = personalInfo.displayName || '';
128+
129+
if (personalInfo.avatar) {
130+
document.getElementById('profile-picture').src = `assets/uploads/profile/${personalInfo.avatar}`;
131+
}
132+
133+
if (personalInfo.banner) {
134+
document.getElementById('profile-banner').style.backgroundImage = `url('assets/uploads/banner/${personalInfo.banner}')`;
135+
}
136+
}
137+
138+
async function savePersonalInfo(personalInfo) {
139+
try {
140+
const session = window.api.getSession();
141+
if (!session || !session.id) {
142+
window.uiModule.showNotification('User session not found', 'error');
143+
return;
144+
}
145+
146+
const dataToSend = {
147+
...personalInfo,
148+
id: session.id
149+
};
150+
151+
const result = await window.api.savePersonalInfo(dataToSend);
152+
153+
if (result.success) {
154+
console.log('Personal info updated:', result.data);
155+
window.uiModule.showNotification('Profile updated successfully!', 'success');
156+
157+
window.dispatchEvent(new CustomEvent('profile:load-personal-info', {
158+
detail: {
159+
...dataToSend,
160+
fullName: `${result.data.firstname || ''} ${result.data.lastname || ''}`.trim(),
161+
displayName: result.data.username || '',
162+
avatar: result.data.profile || '',
163+
banner: result.data.player_banner || ''
164+
}
165+
}));
166+
} else {
167+
window.uiModule.showNotification(result.error || 'Failed to save info', 'error');
168+
}
169+
} catch (error) {
170+
console.error('savePersonalInfo failed:', error);
171+
window.uiModule.showNotification('Unexpected error occurred', 'error');
172+
}
97173
}
98174

99175

100176
initPersonalInfo();
101177

102178

103-
function loadTimezones() {
179+
/*function loadTimezones() {
104180
const timezoneSelect = document.getElementById('timezone');
105181
if (!timezoneSelect) return;
106182
@@ -110,7 +186,24 @@ function loadTimezones() {
110186
timezones.forEach(tz => {
111187
timezoneSelect.innerHTML += `<option value="${tz}">${tz}</option>`;
112188
});
113-
}
189+
}*/
190+
191+
function loadTimezones() {
192+
const timezoneSelect = document.getElementById('timezone');
193+
if (!timezoneSelect) return;
194+
195+
const timezones = Intl.supportedValuesOf("timeZone") || [];
196+
197+
timezoneSelect.innerHTML = '';
198+
const defaultOption = new Option('Select Timezone', '');
199+
timezoneSelect.appendChild(defaultOption);
200+
201+
timezones.forEach(tz => {
202+
const option = new Option(tz, tz);
203+
timezoneSelect.appendChild(option);
204+
});
205+
}
206+
114207

115208
window.addEventListener('DOMContentLoaded', loadTimezones);
116209

0 commit comments

Comments
 (0)