fix: connect API to tracker.db via SQLite repository
Deploy / Deploy Staging (push) Failing after 9s
Deploy / Deploy Production (push) Has been skipped
Tests / test (push) Failing after 14s
Tests / lint (push) Failing after 15s

This commit is contained in:
Xiaoxia AI
2026-06-17 13:21:38 +08:00
parent 3bf90f8614
commit 2cda8dec39
67 changed files with 5737 additions and 123 deletions
+79
View File
@@ -0,0 +1,79 @@
/**
* 认证相关 Hooks
*/
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { useNavigate } from 'react-router-dom';
import * as authApi from '@/api/auth';
import { useAuthStore } from '@/store/authStore';
// 登录 Hook
export const useLogin = () => {
const navigate = useNavigate();
const setAuth = useAuthStore((state) => state.setAuth);
return useMutation({
mutationFn: authApi.login,
onSuccess: (data) => {
// 先保存 token
localStorage.setItem('access_token', data.access_token);
localStorage.setItem('refresh_token', data.refresh_token);
// 获取用户信息
authApi.getCurrentUser().then((user) => {
setAuth(user, data.access_token, data.refresh_token);
navigate('/workspaces');
});
},
});
};
// 注册 Hook
export const useRegister = () => {
const navigate = useNavigate();
return useMutation({
mutationFn: authApi.register,
onSuccess: () => {
navigate('/login', {
state: { message: '注册成功!请查收验证邮件。' },
});
},
});
};
// 登出 Hook
export const useLogout = () => {
const navigate = useNavigate();
const clearAuth = useAuthStore((state) => state.clearAuth);
const queryClient = useQueryClient();
return useMutation({
mutationFn: authApi.logout,
onSuccess: () => {
clearAuth();
queryClient.clear();
navigate('/login');
},
onError: () => {
// 即使登出失败也清除本地状态
clearAuth();
queryClient.clear();
navigate('/login');
},
});
};
// 获取当前用户 Hook
export const useCurrentUser = () => {
const isAuthenticated = useAuthStore((state) => state.isAuthenticated);
const setUser = useAuthStore((state) => state.setUser);
return useQuery({
queryKey: ['currentUser'],
queryFn: authApi.getCurrentUser,
enabled: isAuthenticated,
onSuccess: (user) => {
setUser(user);
},
});
};
+64
View File
@@ -0,0 +1,64 @@
/**
* 工作空间相关 Hooks
*/
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import * as workspaceApi from '@/api/workspace';
import { useWorkspaceStore } from '@/store/workspaceStore';
// 获取工作空间列表
export const useWorkspaces = () => {
const setWorkspaces = useWorkspaceStore((state) => state.setWorkspaces);
return useQuery({
queryKey: ['workspaces'],
queryFn: workspaceApi.getWorkspaces,
onSuccess: (data) => {
setWorkspaces(data);
},
});
};
// 获取工作空间详情
export const useWorkspace = (id: string) => {
return useQuery({
queryKey: ['workspace', id],
queryFn: () => workspaceApi.getWorkspace(id),
enabled: !!id,
});
};
// 创建工作空间
export const useCreateWorkspace = () => {
const queryClient = useQueryClient();
const addWorkspace = useWorkspaceStore((state) => state.addWorkspace);
return useMutation({
mutationFn: workspaceApi.createWorkspace,
onSuccess: (data) => {
addWorkspace(data);
queryClient.invalidateQueries({ queryKey: ['workspaces'] });
},
});
};
// 获取成员列表
export const useWorkspaceMembers = (workspaceId: string) => {
return useQuery({
queryKey: ['workspaceMembers', workspaceId],
queryFn: () => workspaceApi.getMembers(workspaceId),
enabled: !!workspaceId,
});
};
// 邀请成员
export const useInviteMember = (workspaceId: string) => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (data: workspaceApi.InviteMemberRequest) =>
workspaceApi.inviteMember(workspaceId, data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['workspaceMembers', workspaceId] });
},
});
};