69 lines
1.6 KiB
TypeScript
69 lines
1.6 KiB
TypeScript
import { defineStore } from "pinia"
|
|
import { ref } from "vue"
|
|
import { request } from "@/scripts/request"
|
|
import { Preferences } from "@capacitor/preferences"
|
|
import { useRealms } from "@/stores/realms"
|
|
import { useChannels } from "@/stores/channels"
|
|
|
|
export interface Userinfo {
|
|
isReady: boolean
|
|
isLoggedIn: boolean
|
|
displayName: string
|
|
data: any
|
|
}
|
|
|
|
const defaultUserinfo: Userinfo = {
|
|
isReady: false,
|
|
isLoggedIn: false,
|
|
displayName: "Citizen",
|
|
data: null
|
|
}
|
|
|
|
export async function getAtk() {
|
|
return (await Preferences.get({ key: "identity.access_token" })).value
|
|
}
|
|
|
|
export async function getRtk() {
|
|
return (await Preferences.get({ key: "identity.refresh_token" })).value
|
|
}
|
|
|
|
export async function checkLoggedIn(): Promise<boolean> {
|
|
return (await Preferences.get({ key: "identity.access_token" })).value != null
|
|
}
|
|
|
|
export const useUserinfo = defineStore("userinfo", () => {
|
|
const userinfoHooks = {
|
|
after: [useRealms().list, useChannels().list, useChannels().connect]
|
|
}
|
|
|
|
const userinfo = ref(defaultUserinfo)
|
|
const isReady = ref(false)
|
|
|
|
async function readProfiles() {
|
|
if (!(await checkLoggedIn())) {
|
|
isReady.value = true
|
|
}
|
|
|
|
const res = await request("identity", "/api/users/me", {
|
|
headers: { Authorization: `Bearer ${await getAtk()}` }
|
|
})
|
|
|
|
if (res.status !== 200) {
|
|
return
|
|
}
|
|
|
|
const data = await res.json()
|
|
|
|
userinfo.value = {
|
|
isReady: true,
|
|
isLoggedIn: true,
|
|
displayName: data["nick"],
|
|
data: data
|
|
}
|
|
|
|
userinfoHooks.after.forEach((call) => call())
|
|
}
|
|
|
|
return { userinfo, isReady, readProfiles }
|
|
})
|