export const useIsLoggedIn = () => { const isLoggedIn = useState( 'isLoggedIn', () => localStorage.getItem('isLoggedIn') === 'true', ) return computed({ get: () => isLoggedIn.value, set: (value) => { isLoggedIn.value = value localStorage.setItem('isLoggedIn', value.toString()) }, }) } export const useRedirectUrl = () => useState('redirectUrl', () => null) // SETTINGS export interface Settings { domain: string public: boolean portal_logo: string portal_theme: string portal_title: string show_other_domains_apps: 0 | 1 apps: Record } const useSettingsState = () => useState('settings') export const useSettings = async () => { const settings = useSettingsState() if (!settings.value) { const { data } = await useApi('/public') settings.value = data.value as Settings const colorMode = useColorMode() colorMode.preference = settings.value.portal_theme } return settings } // USER export interface User { username: string fullname: string mail: string mailalias: string[] mailforward: string[] groups: string[] apps: Record } export const useUserState = () => useState('user', () => null) export const useUser = async () => { const user = useUserState() const isLoggedIn = useIsLoggedIn() if (!user.value && isLoggedIn.value) { const { data } = await useApi('/me') user.value = data.value } return user as Ref } // APP export const useApps = async () => { const isLoggedIn = useIsLoggedIn() const settings = await useSettings() const user = await useUser() return computed(() => { return isLoggedIn.value ? user.value?.apps : settings.value.apps }) }