forked from NdoleStudio/httpsms
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathauth.ts
More file actions
120 lines (104 loc) · 3.09 KB
/
Copy pathauth.ts
File metadata and controls
120 lines (104 loc) · 3.09 KB
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import { defineStore } from 'pinia'
import type { User as FirebaseUser } from 'firebase/auth'
import { setAuthHeader, setApiKey } from '~/composables/useApi'
import type { EntitiesUser } from '~~/shared/types/api'
export interface AuthUser {
email: string | null
displayName: string | null
id: string
}
export const useAuthStore = defineStore('auth', () => {
const authStateChanged = ref(false)
const authUser = ref<AuthUser | null>(null)
const user = ref<EntitiesUser | null>(null)
const { apiFetch } = useApi()
async function setAuthUserAction(newUser: AuthUser | null | undefined) {
const userChanged = newUser?.id !== authUser.value?.id
authUser.value = newUser ?? null
authStateChanged.value = true
if (userChanged && newUser !== null) {
await Promise.all([loadUser(), loadPhones()])
}
}
async function onAuthStateChanged(firebaseUser: FirebaseUser | null) {
if (firebaseUser == null) {
authUser.value = null
user.value = null
authStateChanged.value = true
setApiKey('')
return
}
setAuthHeader(await firebaseUser.getIdToken())
const { uid, email, displayName } = firebaseUser
authUser.value = { id: uid, email, displayName }
authStateChanged.value = true
}
async function onIdTokenChanged(firebaseUser: FirebaseUser | null) {
if (firebaseUser == null) {
setApiKey('')
return
}
setAuthHeader(await firebaseUser.getIdToken())
}
async function loadUser() {
const response = await apiFetch<{ data: EntitiesUser }>('/v1/users/me')
user.value = response.data
}
async function updateUser(payload: { owner?: string; timezone?: string }) {
const phonesStore = usePhonesStore()
if (payload.owner) {
phonesStore.setOwner(payload.owner)
}
const activePhone = phonesStore.activePhone
if (!activePhone) return
const response = await apiFetch<{ data: EntitiesUser }>('/v1/users/me', {
method: 'PUT',
body: {
active_phone_id: activePhone.id,
timezone: payload.timezone ?? user.value?.timezone,
},
})
setApiKey(response.data.api_key)
user.value = response.data
}
async function deleteUserAccount(): Promise<string> {
const response = await apiFetch<{ message: string }>('/v1/users/me', {
method: 'DELETE',
})
return response.message
}
async function rotateApiKey(userId: string): Promise<EntitiesUser> {
const response = await apiFetch<{ data: EntitiesUser }>(
`/v1/users/${userId}/api-keys`,
{
method: 'DELETE',
},
)
user.value = response.data
setApiKey(response.data.api_key)
return response.data
}
function resetState() {
user.value = null
authUser.value = null
authStateChanged.value = true
setApiKey('')
}
function loadPhones() {
const phonesStore = usePhonesStore()
return phonesStore.loadPhones(false)
}
return {
authStateChanged,
authUser,
user,
setAuthUserAction,
onAuthStateChanged,
onIdTokenChanged,
loadUser,
updateUser,
deleteUserAccount,
rotateApiKey,
resetState,
}
})