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

feat: 프로젝트 Role API 연동

parent 9b250a41
Branches
No related tags found
No related merge requests found
import { useAuthStore } from '@/stores/authStore'; import { useAuthStore } from '@/stores/authStore';
import { Check, ChevronsUpDown, GalleryVerticalEnd } from 'lucide-react'; import { Check, ChevronsUpDown, GalleryVerticalEnd } from 'lucide-react';
import { toast } from 'sonner';
import { import {
DropdownMenu, DropdownMenu,
DropdownMenuContent, DropdownMenuContent,
...@@ -7,10 +8,20 @@ import { ...@@ -7,10 +8,20 @@ import {
DropdownMenuTrigger, DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu'; } from '@/components/ui/dropdown-menu';
import { SidebarMenu, SidebarMenuButton, SidebarMenuItem } from '@/components/ui/sidebar'; import { SidebarMenu, SidebarMenuButton, SidebarMenuItem } from '@/components/ui/sidebar';
import { Project } from '@/types/project';
export function ProjectSwitcher() { export function ProjectSwitcher() {
const { projects, selectedProject, setSelectedProject } = useAuthStore(); const { projects, selectedProject, setSelectedProject } = useAuthStore();
const handleSelectProject = async (project: Project) => {
try {
await setSelectedProject(project);
} catch (error) {
console.error(error);
toast.error('프로젝트 권한을 조회할 수 없습니다.');
}
};
return ( return (
<SidebarMenu> <SidebarMenu>
<SidebarMenuItem> <SidebarMenuItem>
...@@ -38,7 +49,7 @@ export function ProjectSwitcher() { ...@@ -38,7 +49,7 @@ export function ProjectSwitcher() {
</DropdownMenuTrigger> </DropdownMenuTrigger>
<DropdownMenuContent className="w-[--radix-dropdown-menu-trigger-width]" align="start"> <DropdownMenuContent className="w-[--radix-dropdown-menu-trigger-width]" align="start">
{projects.map((project) => ( {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" />} {project.name} {project.id === selectedProject?.id && <Check className="ml-auto" />}
</DropdownMenuItem> </DropdownMenuItem>
))} ))}
......
...@@ -7,21 +7,37 @@ export interface AuthStore { ...@@ -7,21 +7,37 @@ export interface AuthStore {
username: string; username: string;
isAdmin: boolean; isAdmin: boolean;
projects: Project[]; projects: Project[];
selectedProject: Project | null; selectedProject: (Project & { role?: string }) | null;
setSelectedProject: (project: Project) => void; setSelectedProject: (project: Project) => Promise<void>;
login: (username: string, password: string) => void; login: (username: string, password: string) => void;
logout: () => void; logout: () => void;
} }
export const useAuthStore = create<AuthStore>()( export const useAuthStore = create<AuthStore>()(
persist( persist(
(set) => ({ (set, get) => ({
token: null, token: null,
username: '', username: '',
isAdmin: false, isAdmin: false,
projects: [], projects: [],
selectedProject: null, 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) => { login: async (username, password) => {
const response = await fetch('/api/auth/login', { const response = await fetch('/api/auth/login', {
method: 'POST', method: 'POST',
...@@ -36,7 +52,8 @@ export const useAuthStore = create<AuthStore>()( ...@@ -36,7 +52,8 @@ export const useAuthStore = create<AuthStore>()(
const token = response.headers.get('X-Subject-Token')!; const token = response.headers.get('X-Subject-Token')!;
const { isAdmin, projects } = await response.json(); 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 }), 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