user.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { defineStore } from 'pinia'
  2. import { computed, reactive } from 'vue'
  3. export const useUserStore = defineStore('user', () => {
  4. const state = reactive({
  5. userId: null as number | null,
  6. nickname: '',
  7. avatarUrl: '',
  8. role: '',
  9. authStatus: '',
  10. isLoggedIn: false,
  11. })
  12. const isAuthenticated = computed(() => state.authStatus === 'AUTHENTICATED')
  13. const isAdmin = computed(() => state.role === 'ADMIN')
  14. function login(user: {
  15. id: number
  16. nickname: string
  17. avatarUrl?: string
  18. role: string
  19. authStatus: string
  20. }) {
  21. state.userId = user.id
  22. state.nickname = user.nickname
  23. state.avatarUrl = user.avatarUrl ?? ''
  24. state.role = user.role
  25. state.authStatus = user.authStatus
  26. state.isLoggedIn = true
  27. }
  28. function logout() {
  29. state.userId = null
  30. state.nickname = ''
  31. state.avatarUrl = ''
  32. state.role = ''
  33. state.authStatus = ''
  34. state.isLoggedIn = false
  35. }
  36. function updateProfile(profile: { nickname?: string; avatarUrl?: string }) {
  37. if (profile.nickname !== undefined) state.nickname = profile.nickname
  38. if (profile.avatarUrl !== undefined) state.avatarUrl = profile.avatarUrl
  39. }
  40. return {
  41. state,
  42. isAuthenticated,
  43. isAdmin,
  44. login,
  45. logout,
  46. updateProfile,
  47. }
  48. })