46 lines
1 KiB
TypeScript
46 lines
1 KiB
TypeScript
function decodeJwt(token: string) {
|
|
try {
|
|
const payload = token.split(".")[1]
|
|
const decoded = JSON.parse(atob(payload))
|
|
return decoded
|
|
} catch {
|
|
return null
|
|
}
|
|
}
|
|
export function useAuth() {
|
|
const token = useState<string | null>("token", () => null)
|
|
|
|
function setToken(t: string) {
|
|
token.value = t
|
|
|
|
if (typeof window !== "undefined") {
|
|
localStorage.setItem("token", t)
|
|
}
|
|
}
|
|
|
|
function loadToken() {
|
|
if (typeof window !== "undefined") {
|
|
const stored = localStorage.getItem("token")
|
|
if (!stored) return
|
|
|
|
const payload = decodeJwt(stored)
|
|
if( !payload || !payload.exp || payload.exp * 1000 < Date.now()) {
|
|
console.info("Token expired - removing it from storage")
|
|
localStorage.removeItem("token")
|
|
token.value = null
|
|
}
|
|
token.value = stored
|
|
|
|
}
|
|
}
|
|
|
|
function logout() {
|
|
token.value = null
|
|
|
|
if (typeof window !== "undefined") {
|
|
localStorage.removeItem("token")
|
|
}
|
|
}
|
|
|
|
return { token, setToken, loadToken, logout }
|
|
}
|