symref
Version:
Static code checker for AI code agents (Windsurf, Cline, etc.)
80 lines • 2.5 kB
JavaScript
import { useState, useEffect, useCallback } from 'react';
import { useLocalStorage } from './useLocalStorage';
/**
* 認証状態を管理するカスタムフック
*/
export function useAuth() {
// ユーザー情報の状態
const [user, setUser] = useState(null);
// ローディング状態
const [isLoading, setIsLoading] = useState(true);
// エラー状態
const [error, setError] = useState(null);
// トークンをローカルストレージに保存
const [token, setToken, removeToken] = useLocalStorage('auth-token', null);
// ユーザー情報を取得する関数
const fetchUserInfo = useCallback(async () => {
if (!token) {
setUser(null);
setIsLoading(false);
return;
}
try {
setIsLoading(true);
// 実際にはAPIリクエストを行う(この例ではモック)
const mockUser = {
id: '123',
name: 'テストユーザー',
email: 'test@example.com',
role: 'user'
};
setUser(mockUser);
setError(null);
}
catch (err) {
setError('ユーザー情報の取得に失敗しました');
setUser(null);
}
finally {
setIsLoading(false);
}
}, [token]);
// トークンが変更されたらユーザー情報を再取得
useEffect(() => {
fetchUserInfo();
}, [fetchUserInfo]);
// ログイン処理
const login = useCallback(async (credentials) => {
try {
setIsLoading(true);
// 実際にはAPIリクエストを行う(この例ではモック)
await new Promise(resolve => setTimeout(resolve, 500));
// ログイン成功を模擬
const mockToken = `token_${Date.now()}`;
setToken(mockToken);
return true;
}
catch (err) {
setError('ログインに失敗しました');
return false;
}
finally {
setIsLoading(false);
}
}, [setToken]);
// ログアウト処理
const logout = useCallback(() => {
removeToken();
setUser(null);
setError(null);
}, [removeToken]);
return {
user,
isLoading,
isAuthenticated: !!user,
error,
login,
logout
};
}
//# sourceMappingURL=useAuth.js.map