A social knowledge tool for researchers built on ATProto
1/**
2 * Authentication utilities for the client-side application
3 */
4
5import { TokenManager } from './TokenManager';
6import { ClientTokenStorage } from './storage/ClientTokenStorage';
7import { ServerTokenStorage } from './storage/ServerTokenStorage';
8import { ApiTokenRefresher } from './TokenRefresher';
9
10// Check if the user is authenticated
11export const isAuthenticated = (): boolean => {
12 if (typeof window === 'undefined') {
13 return false; // Not authenticated in server-side context
14 }
15
16 const accessToken = localStorage.getItem('accessToken');
17 return !!accessToken;
18};
19
20// Get the access token
21export const getAccessToken = (): string | null => {
22 if (typeof window === 'undefined') {
23 return null;
24 }
25
26 return localStorage.getItem('accessToken');
27};
28
29export const getAccessTokenInServerComponent = async (): Promise<
30 string | null
31> => {
32 // Get access token on server side
33 const { cookies } = await import('next/headers');
34 const cookiesStore = await cookies();
35 const accessToken = cookiesStore.get('accessToken')?.value || null;
36 return accessToken;
37};
38
39// Get the refresh token
40export const getRefreshToken = (): string | null => {
41 if (typeof window === 'undefined') {
42 return null;
43 }
44
45 return localStorage.getItem('refreshToken');
46};
47
48// Clear authentication tokens (logout)
49export const clearAuth = (): void => {
50 if (typeof window === 'undefined') {
51 return;
52 }
53
54 localStorage.removeItem('accessToken');
55 localStorage.removeItem('refreshToken');
56};
57
58// Client-side token manager
59export const createClientTokenManager = () => {
60 const storage = new ClientTokenStorage();
61 const refresher = new ApiTokenRefresher(
62 process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:3000',
63 );
64 return new TokenManager(storage, refresher);
65};
66
67// Server-side token manager (read-only, no refresh capability)
68export const createServerTokenManager = async () => {
69 const { cookies } = await import('next/headers');
70 const cookiesStore = await cookies();
71 const storage = new ServerTokenStorage(cookiesStore);
72 const refresher = new ApiTokenRefresher(''); // Won't be used
73 return new TokenManager(storage, refresher);
74};
75
76export const createExtensionTokenManager = () => {
77 const storage = new ClientTokenStorage();
78 const refresher = new ApiTokenRefresher(
79 process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:3000',
80 );
81 return new TokenManager(storage, refresher);
82};