nuxt-users
Version:
A comprehensive user management module for Nuxt 3 and Nuxt 4 applications with authentication, authorization, database support, and CLI tools
69 lines (68 loc) • 1.95 kB
JavaScript
import { useState, useRuntimeConfig } from "#app";
import { computed, readonly } from "vue";
export const useAuthentication = () => {
const user = useState("user", () => null);
const { public: { nuxtUsers } } = useRuntimeConfig();
const apiBasePath = nuxtUsers?.apiBasePath;
const isAuthenticated = computed(() => !!user.value);
const login = (userData) => {
const { password: _, ...userWithoutPassword } = userData;
user.value = userWithoutPassword;
if (import.meta.client) {
localStorage.setItem("user", JSON.stringify(userWithoutPassword));
}
};
const logout = async () => {
try {
await $fetch(`${apiBasePath}/session`, { method: "DELETE" });
user.value = null;
if (import.meta.client) {
localStorage.removeItem("user");
}
} catch (error) {
console.error("Logout failed:", error);
user.value = null;
}
};
const fetchUser = async () => {
try {
const response = await $fetch(`${apiBasePath}/me`, { method: "GET" });
user.value = response.user;
if (import.meta.client) {
localStorage.setItem("user", JSON.stringify(response.user));
}
return response.user;
} catch (error) {
console.error("Failed to fetch user:", error);
user.value = null;
if (import.meta.client) {
localStorage.removeItem("user");
}
return null;
}
};
const initializeUser = async () => {
if (!import.meta.client) {
return;
}
const storedUser = localStorage.getItem("user");
if (storedUser) {
try {
user.value = JSON.parse(storedUser);
await fetchUser();
} catch (error) {
console.error("Failed to parse stored user:", error);
localStorage.removeItem("user");
user.value = null;
}
}
};
return {
user: readonly(user),
isAuthenticated,
login,
logout,
fetchUser,
initializeUser
};
};