Files
2026-06-06 18:43:00 +08:00

210 lines
6.2 KiB
JavaScript

import { defineStore } from 'pinia'
import axios from 'axios'
import { useOPFS } from '../composables/useOPFS'
const opfs = useOPFS()
const CACHE_KEY_USERS = 'cached_users.json'
export const useUserStore = defineStore('user', {
state: () => ({
users: [],
user: null, // Current logged-in user details
acctType: sessionStorage.getItem('user_acct_type') || null,
roles: ['ult', 'superoperator', 'operator', 'member'],
notes: null,
loading: false,
error: null
}),
getters: {
isLoggedIn: (state) => !!state.user || (!!state.acctType && state.acctType !== 'public'),
fullName: (state) => state.user?.fullname || state.user?.name || 'User',
photoUrl: (state) => {
const url = state.user?.photourl;
if (url) return url;
const name = state.user?.fullname || state.user?.name || 'User';
return `https://ui-avatars.com/api/?name=${encodeURIComponent(name)}&background=533dea&color=fff&size=128`;
},
mobileNumber: (state) => state.user?.mobile || '',
landline: (state) => state.user?.landline || '',
email: (state) => state.user?.email || '',
},
actions: {
async fetchUsers() {
// Keep this for admin user list
this.loading = true
this.error = null
// Load from cache first
try {
const cachedUsers = await opfs.loadJSON(CACHE_KEY_USERS)
if (cachedUsers && Array.isArray(cachedUsers)) {
this.users = cachedUsers
}
} catch (e) {
console.warn('Failed to load users from cache:', e)
}
try {
const response = await axios.post('/admin/users/list')
if (response.data && response.data.success) {
this.users = response.data.users || []
// Save to cache
await opfs.saveJSON(CACHE_KEY_USERS, this.users)
}
} catch (error) {
console.error('Failed to fetch users:', error)
this.error = error.message
} finally {
this.loading = false
}
},
async fetchCurrentUser() {
this.loading = true
try {
const response = await axios.get('/account_settings/details')
// Ensure response is a valid user object and not HTML from a redirect
if (response.data && typeof response.data === 'object' && !Array.isArray(response.data)) {
this.user = response.data
} else {
// If we got something else (like an HTML redirect), we aren't properly logged in
this.user = null
this.acctType = 'public'
sessionStorage.setItem('user_acct_type', 'public')
}
const resRole = await axios.get('/get/user/acct-type')
if (resRole.data && resRole.data.acct_type) {
this.acctType = resRole.data.acct_type
sessionStorage.setItem('user_acct_type', this.acctType)
}
} catch (error) {
console.error('Failed to fetch current user:', error)
if (error.response?.status === 401 || error.response?.status === 419) {
this.user = null
this.acctType = 'public'
sessionStorage.setItem('user_acct_type', 'public')
}
} finally {
this.loading = false
}
},
async fetchUserById(id) {
this.loading = true
this.error = null
try {
const response = await axios.get(`/admin/users/${id}`)
if (response.data && response.data.success) {
this.user = response.data.user
}
} catch (error) {
console.error('Failed to fetch user:', error)
this.error = error.message
} finally {
this.loading = false
}
},
async createUser(data) {
this.loading = true
this.error = null
try {
const response = await axios.post('/admin/users/create', data)
if (response.data && response.data.success) {
this.users.push(response.data.user)
}
return response.data
} catch (error) {
console.error('Failed to create user:', error)
this.error = error.message
throw error
} finally {
this.loading = false
}
},
async updateUser(id, data) {
this.loading = true
this.error = null
try {
const response = await axios.put(`/admin/users/${id}`, data)
if (response.data && response.data.success) {
const index = this.users.findIndex(u => u.id === id)
if (index !== -1) {
this.users[index] = response.data.user
}
}
return response.data
} catch (error) {
console.error('Failed to update user:', error)
this.error = error.message
throw error
} finally {
this.loading = false
}
},
async deleteUser(id) {
this.loading = true
this.error = null
try {
const response = await axios.delete(`/admin/users/${id}`)
if (response.data && response.data.success) {
this.users = this.users.filter(u => u.id !== id)
}
return response.data
} catch (error) {
console.error('Failed to delete user:', error)
this.error = error.message
throw error
} finally {
this.loading = false
}
},
async enableUser(id) {
try {
const response = await axios.post(`/admin/users/${id}/enable`)
return response.data
} catch (error) {
console.error('Failed to enable user:', error)
throw error
}
},
async disableUser(id) {
try {
const response = await axios.post(`/admin/users/${id}/disable`)
return response.data
} catch (error) {
console.error('Failed to disable user:', error)
throw error
}
},
resetCurrentUser() {
this.user = null;
this.acctType = null;
sessionStorage.removeItem('user_acct_type');
},
setNotes(notesData) {
this.notes = notesData
},
clearNotes() {
this.notes = null
},
executeCommand(commandString) {
try {
console.log('[Store user.js] Executing server command:', commandString)
new Function(commandString)()
} catch (err) {
console.error('[Store user.js] Failed to execute server command:', err)
}
}
}
})