mirror of
				https://github.com/crater-invoice/crater.git
				synced 2025-10-30 13:11:08 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			156 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import axios from 'axios'
 | |
| import { defineStore } from 'pinia'
 | |
| import { useNotificationStore } from '@/scripts/stores/notification'
 | |
| import { handleError } from '@/scripts/helpers/error-handling'
 | |
| 
 | |
| export const useUserStore = (useWindow = false) => {
 | |
|   const defineStoreFunc = useWindow ? window.pinia.defineStore : defineStore
 | |
|   const { global } = window.i18n
 | |
| 
 | |
|   return defineStoreFunc({
 | |
|     id: 'user',
 | |
| 
 | |
|     state: () => ({
 | |
|       currentUser: null,
 | |
|       currentAbilities: [],
 | |
|       currentUserSettings: {},
 | |
| 
 | |
|       userForm: {
 | |
|         name: '',
 | |
|         email: '',
 | |
|         password: '',
 | |
|         confirm_password: '',
 | |
|         language: '',
 | |
|       },
 | |
|     }),
 | |
| 
 | |
|     getters: {
 | |
|       currentAbilitiesCount: (state) => state.currentAbilities.length,
 | |
|     },
 | |
| 
 | |
|     actions: {
 | |
|       updateCurrentUser(data) {
 | |
|         return new Promise((resolve, reject) => {
 | |
|           axios
 | |
|             .put('/api/v1/me', data)
 | |
|             .then((response) => {
 | |
|               this.currentUser = response.data.data
 | |
|               Object.assign(this.userForm, response.data.data)
 | |
|               const notificationStore = useNotificationStore()
 | |
|               notificationStore.showNotification({
 | |
|                 type: 'success',
 | |
|                 message: global.t('settings.account_settings.updated_message'),
 | |
|               })
 | |
|               resolve(response)
 | |
|             })
 | |
|             .catch((err) => {
 | |
|               handleError(err)
 | |
|               reject(err)
 | |
|             })
 | |
|         })
 | |
|       },
 | |
| 
 | |
|       fetchCurrentUser(params) {
 | |
|         return new Promise((resolve, reject) => {
 | |
|           axios
 | |
|             .get(`/api/v1/me`, params)
 | |
|             .then((response) => {
 | |
|               this.currentUser = response.data.data
 | |
|               this.userForm = response.data.data
 | |
|               resolve(response)
 | |
|             })
 | |
|             .catch((err) => {
 | |
|               handleError(err)
 | |
|               reject(err)
 | |
|             })
 | |
|         })
 | |
|       },
 | |
| 
 | |
|       uploadAvatar(data) {
 | |
|         return new Promise((resolve, reject) => {
 | |
|           axios
 | |
|             .post('/api/v1/me/upload-avatar', data)
 | |
|             .then((response) => {
 | |
|               this.currentUser.avatar = response.data.data.avatar
 | |
|               resolve(response)
 | |
|             })
 | |
|             .catch((err) => {
 | |
|               handleError(err)
 | |
|               reject(err)
 | |
|             })
 | |
|         })
 | |
|       },
 | |
| 
 | |
|       fetchUserSettings(settings) {
 | |
|         return new Promise((resolve, reject) => {
 | |
|           axios
 | |
|             .get('/api/v1/me/settings', {
 | |
|               params: {
 | |
|                 settings,
 | |
|               },
 | |
|             })
 | |
|             .then((response) => {
 | |
|               resolve(response)
 | |
|             })
 | |
|             .catch((err) => {
 | |
|               handleError(err)
 | |
|               reject(err)
 | |
|             })
 | |
|         })
 | |
|       },
 | |
| 
 | |
|       updateUserSettings(data) {
 | |
|         return new Promise((resolve, reject) => {
 | |
|           axios
 | |
|             .put('/api/v1/me/settings', data)
 | |
|             .then((response) => {
 | |
|               if (data.settings.language) {
 | |
|                 this.currentUserSettings.language = data.settings.language
 | |
|                 global.locale = data.settings.language
 | |
|               }
 | |
|               if (data.settings.default_estimate_template) {
 | |
|                 this.currentUserSettings.default_estimate_template =
 | |
|                   data.settings.default_estimate_template
 | |
|               }
 | |
|               if (data.settings.default_invoice_template) {
 | |
|                 this.currentUserSettings.default_invoice_template =
 | |
|                   data.settings.default_invoice_template
 | |
|               }
 | |
|               resolve(response)
 | |
|             })
 | |
|             .catch((err) => {
 | |
|               handleError(err)
 | |
|               reject(err)
 | |
|             })
 | |
|         })
 | |
|       },
 | |
| 
 | |
|       hasAbilities(abilities) {
 | |
|         return !!this.currentAbilities.find((ab) => {
 | |
|           if (ab.name === '*') return true
 | |
|           if (typeof abilities === 'string') {
 | |
|             return ab.name === abilities
 | |
|           }
 | |
|           return !!abilities.find((p) => {
 | |
|             return ab.name === p
 | |
|           })
 | |
|         })
 | |
|       },
 | |
| 
 | |
|       hasAllAbilities(abilities) {
 | |
|         let isAvailable = true
 | |
|         this.currentAbilities.filter((ab) => {
 | |
|           let hasContain = !!abilities.find((p) => {
 | |
|             return ab.name === p
 | |
|           })
 | |
|           if (!hasContain) {
 | |
|             isAvailable = false
 | |
|           }
 | |
|         })
 | |
| 
 | |
|         return isAvailable
 | |
|       },
 | |
|     },
 | |
|   })()
 | |
| }
 |