mirror of
				https://github.com/crater-invoice/crater.git
				synced 2025-11-03 22:13:18 -05: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
 | 
						|
      },
 | 
						|
    },
 | 
						|
  })()
 | 
						|
}
 |