all repos — stealth-developers @ b9d33cd3b741a8075a82d4d1403b7cee6eec9f48

pkgs/frontend/src/stores/state.ts (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
import { ref } from 'vue'
import { defineStore } from 'pinia'
import type { MeResponse, User } from '@/types'

export const useStateStore = defineStore('state', () => {
	const isAuthenticated = ref(false)
	const isLoading = ref(true)
	const user = ref<User | null>(null)

	const viewedTickets = ref<string[]>([])

	async function getUser() {
		try {
			const response = await fetch('/api/me')
			const data = (await response.json()) as MeResponse
			user.value = data
			isAuthenticated.value = true
		} catch {}

		isLoading.value = false
	}

	function addViewedTicket(ticket: string) {
		if (!viewedTickets.value.includes(ticket)) viewedTickets.value.push(ticket)
	}

	async function waitForAuth() {
		while (isLoading.value) {
			await getUser()
		}
	}

	return {
		isAuthenticated,
		user,
		getUser,
		waitForAuth,
		viewedTickets,
		addViewedTicket,
	}
})