Skip to content
Snippets Groups Projects
Commit 7a33ae17 authored by 한동현's avatar 한동현
Browse files

feat: 프로젝트 Role API 연동

parent 9b250a41
No related branches found
No related tags found
No related merge requests found
import { useAuthStore } from '@/stores/authStore';
import { Check, ChevronsUpDown, GalleryVerticalEnd } from 'lucide-react';
import { toast } from 'sonner';
import {
DropdownMenu,
DropdownMenuContent,
......@@ -7,10 +8,20 @@ import {
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
import { SidebarMenu, SidebarMenuButton, SidebarMenuItem } from '@/components/ui/sidebar';
import { Project } from '@/types/project';
export function ProjectSwitcher() {
const { projects, selectedProject, setSelectedProject } = useAuthStore();
const handleSelectProject = async (project: Project) => {
try {
await setSelectedProject(project);
} catch (error) {
console.error(error);
toast.error('프로젝트 권한을 조회할 수 없습니다.');
}
};
return (
<SidebarMenu>
<SidebarMenuItem>
......@@ -38,7 +49,7 @@ export function ProjectSwitcher() {
</DropdownMenuTrigger>
<DropdownMenuContent className="w-[--radix-dropdown-menu-trigger-width]" align="start">
{projects.map((project) => (
<DropdownMenuItem key={project.id} onSelect={() => setSelectedProject(project)}>
<DropdownMenuItem key={project.id} onSelect={() => handleSelectProject(project)}>
{project.name} {project.id === selectedProject?.id && <Check className="ml-auto" />}
</DropdownMenuItem>
))}
......
......@@ -7,21 +7,37 @@ export interface AuthStore {
username: string;
isAdmin: boolean;
projects: Project[];
selectedProject: Project | null;
setSelectedProject: (project: Project) => void;
selectedProject: (Project & { role?: string }) | null;
setSelectedProject: (project: Project) => Promise<void>;
login: (username: string, password: string) => void;
logout: () => void;
}
export const useAuthStore = create<AuthStore>()(
persist(
(set) => ({
(set, get) => ({
token: null,
username: '',
isAdmin: false,
projects: [],
selectedProject: null,
setSelectedProject: (project) => set({ selectedProject: project }),
setSelectedProject: async (project) => {
set({ selectedProject: project });
console.log(project);
const response = await fetch(`/api/auth/role?projectId=${project.id}`, {
headers: { 'X-Subject-Token': get().token! },
});
if (!response.ok) {
throw new Error('프로젝트 정보를 가져오지 못했습니다.');
}
const { role } = await response.json();
set({ selectedProject: { ...project, role } });
console.log(role);
},
login: async (username, password) => {
const response = await fetch('/api/auth/login', {
method: 'POST',
......@@ -36,7 +52,8 @@ export const useAuthStore = create<AuthStore>()(
const token = response.headers.get('X-Subject-Token')!;
const { isAdmin, projects } = await response.json();
set({ token, username, isAdmin, projects, selectedProject: projects[0] });
set({ token, username, isAdmin, projects });
get().setSelectedProject(projects[0]);
},
logout: () => set({ token: null, username: '', isAdmin: false, projects: [], selectedProject: null }),
}),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment