Files
ComfyUI_frontend/src/stores/userStore.ts
Chenlei Hu 9e565154a9 Rework user selection (#1728)
* Move to new route

* Convert to tailwind

* Basic style

* Add userStore

* nit

* nit

* nit

* Remove app.#setUser

* Route to user-select view

* Mock login

* Use primevue UI components

* handle create new user

* Remove legacy user selection

* Add logout button on side toolbar

* Add username to logout button tooltip

* Add playwright tests

* hide logout button in single user server

* nit
2024-11-28 23:36:41 -05:00

110 lines
2.4 KiB
TypeScript

import { api } from '@/scripts/api'
import { defineStore } from 'pinia'
import { computed, ref, watchEffect } from 'vue'
import type { User as UserConfig } from '@/types/apiTypes'
export interface User {
userId: string
username: string
}
export const useUserStore = defineStore('user', () => {
/**
* The user config. null if not loaded.
*/
const userConfig = ref<UserConfig | null>(null)
/**
* The current user id. null if not logged in or in single user mode.
*/
const currentUserId = ref<string | null>(null)
const isMultiUserServer = computed(
() => userConfig.value && 'users' in userConfig.value
)
const needsLogin = computed(
() => !currentUserId.value && isMultiUserServer.value
)
const users = computed<User[]>(() =>
Object.entries(userConfig.value?.users ?? {}).map(([userId, username]) => ({
userId,
username
}))
)
const currentUser = computed<User | null>(
() =>
users.value.find((user) => user.userId === currentUserId.value) ?? null
)
const initialized = computed(() => userConfig.value !== null)
/**
* Initialize the user store.
*/
async function initialize() {
userConfig.value = await api.getUserConfig()
currentUserId.value = localStorage['Comfy.userId']
}
/**
* Create a new user.
*
* @param username - The username.
* @returns The new user.
*/
async function createUser(username: string): Promise<User> {
const resp = await api.createUser(username)
const data = await resp.json()
if (resp.status >= 300) {
throw new Error(
data.error ??
'Error creating user: ' + resp.status + ' ' + resp.statusText
)
}
return {
userId: data,
username
}
}
/**
* Login the current user.
*
* @param user - The user.
*/
async function login({
userId,
username
}: {
userId: string
username: string
}) {
currentUserId.value = userId
localStorage['Comfy.userId'] = userId
localStorage['Comfy.userName'] = username
}
watchEffect(() => {
if (isMultiUserServer.value && currentUserId.value) {
api.user = currentUserId.value
}
})
/**
* Logout the current user.
*/
async function logout() {
delete localStorage['Comfy.userId']
delete localStorage['Comfy.userName']
}
return {
users,
currentUser,
isMultiUserServer,
needsLogin,
initialized,
initialize,
createUser,
login,
logout
}
})