useUser.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { defineStore } from 'pinia'
  2. import { ref, watch } from 'vue'
  3. import { useLogger } from '~/composables/useLogger'
  4. import { useRouter } from '#imports'
  5. interface TUserData {
  6. user_id?: number
  7. group_id?: number
  8. teacher_id?: number
  9. branch_id?: number
  10. access_token?: string
  11. is_student?: boolean
  12. }
  13. function findNewKeys(oldObj: Record<string, unknown>, newObj: Record<string, unknown>) {
  14. const newKeys: Record<string, unknown> = {}
  15. for (const key in newObj) {
  16. if (!(key in oldObj)) {
  17. newKeys[key] = newObj[key]
  18. }
  19. }
  20. if (Object.keys(newKeys).length > 0) {
  21. return newKeys
  22. }
  23. return null
  24. }
  25. export const useUser = defineStore('useUser', () => {
  26. const log = useLogger('userStore')
  27. const router = useRouter()
  28. let initialData: TUserData = {}
  29. try {
  30. const storedData = localStorage.getItem('ktc_data')
  31. if (storedData) {
  32. initialData = JSON.parse(storedData)
  33. }
  34. } catch (e) {
  35. log.error('Ошибка при чтении данных пользователя из localStorage:', e)
  36. }
  37. const data = ref<TUserData>(initialData)
  38. function setAuthData(access_token: string, user_id: number) {
  39. data.value.access_token = access_token
  40. data.value.user_id = user_id
  41. }
  42. function logout() {
  43. localStorage.removeItem('ktc_data')
  44. data.value = {}
  45. return router.push('/auth')
  46. }
  47. watch(() => ({ ...data.value }), (upd, prev) => {
  48. try {
  49. localStorage.setItem('ktc_data', JSON.stringify(upd))
  50. log.success('Store was updated:', findNewKeys(prev, upd))
  51. } catch (e) {
  52. log.error('Ошибка при сохранении данных пользователя в localStorage:', e)
  53. }
  54. }, {
  55. deep: true,
  56. })
  57. return { data, setAuthData, logout }
  58. })