diff --git a/src/pages/certificate/List.tsx b/src/pages/certificate/List.tsx index cd223a0b813eee500cf2ba7fcb305cad308fb456..170943d6166b4128d0fe53cbfd02b736ed8b2a61 100644 --- a/src/pages/certificate/List.tsx +++ b/src/pages/certificate/List.tsx @@ -1,11 +1,12 @@ +import { Link } from 'react-router'; import { Filter, Plus, Trash, HardDrive, Globe } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Card, CardContent } from '@/components/ui/card'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { HoverCard, HoverCardContent, HoverCardTrigger } from '@/components/ui/hover-card'; import { Input } from '@/components/ui/input'; -import { Link } from 'react-router'; import { Badge } from '@/components/ui/badge'; +import { useAuthStore } from '@/stores/authStore'; const certificates = [ { @@ -47,6 +48,8 @@ const certificates = [ ]; export default function CertificateList() { + const { selectedProject } = useAuthStore(); + return ( <div className="flex flex-1 flex-col gap-4 p-6"> <div className="flex flex-col sm:flex-row gap-4 justify-between mb-2"> @@ -55,7 +58,7 @@ export default function CertificateList() { <p className="mt-1 text-base text-gray-500">현재 {certificates.length}개의 SSL 인증서가 등록되어 있습니다.</p> </div> <Button asChild> - <Link to="./create"> + <Link to="./create" className={selectedProject?.role !== 'admin' ? 'opacity-50 pointer-events-none' : ''}> <Plus className="h-4 w-4" /> 새 인증서 추가 </Link> </Button> @@ -125,7 +128,7 @@ export default function CertificateList() { </TableCell> <TableCell> <div className="flex justify-center items-center gap-2"> - <Button variant="secondary" className="size-8"> + <Button disabled={selectedProject?.role !== 'admin'} variant="secondary" className="size-8"> <Link to={`./delete/${certificate.id}`}> <Trash /> </Link> diff --git a/src/pages/forwarding/Create.tsx b/src/pages/forwarding/Create.tsx index a1d9a56e6604adfd44eed42c59a5990b90ab8fad..7c44fcb619fc1e58e08ea5cf24c1ab917d422459 100644 --- a/src/pages/forwarding/Create.tsx +++ b/src/pages/forwarding/Create.tsx @@ -61,6 +61,8 @@ export default function ForwardingCreate() { } else if (code == 'DUPLICATED_SERVER_PORT') { form.setError('serverPort', { type: 'custom' }); toast.error('이미 사용 중인 포트 번호입니다'); + } else if (code == 'UNAUTHORIZED_USER') { + toast.error('권한이 없는 사용자입니다'); } else { toast.error('포트포워딩 설정 등록에 실패했습니다'); } diff --git a/src/pages/forwarding/List.tsx b/src/pages/forwarding/List.tsx index 94371e14876ca785ca62792e3c275af5472d5239..446bd0cfd145e9aa40e09d2bf4ed1f3665429829 100644 --- a/src/pages/forwarding/List.tsx +++ b/src/pages/forwarding/List.tsx @@ -74,7 +74,7 @@ export default function ForwardingList() { )} </div> <Button asChild> - <Link to="./create"> + <Link to="./create" className={selectedProject?.role !== 'admin' ? 'opacity-50 pointer-events-none' : ''}> <Plus className="h-4 w-4" /> 새 포트포워딩 추가 </Link> </Button> @@ -145,12 +145,13 @@ export default function ForwardingList() { <TableCell>{forwarding.instanceIp}</TableCell> <TableCell> <div className="flex justify-center items-center gap-2"> - <Button variant="secondary" className="size-8"> + <Button disabled={selectedProject?.role !== 'admin'} variant="secondary" className="size-8"> <Link to={`./edit/${forwarding.id}`}> <Pencil /> </Link> </Button> <Button + disabled={selectedProject?.role !== 'admin'} variant="secondary" className="size-8" onClick={() => setSelectedForwarding(forwarding)} diff --git a/src/pages/routing/Create.tsx b/src/pages/routing/Create.tsx index c60b5f13db5b9af3d360c73fadf4d8e24cbac90e..44150f9a1ab363dc60530e6f3a193622e18d84fa 100644 --- a/src/pages/routing/Create.tsx +++ b/src/pages/routing/Create.tsx @@ -109,6 +109,8 @@ export default function RoutingCreate() { if (code == 'DUPLICATED_DOMAIN_NAME') { form.setError('domain', { type: 'custom', message: '이미 사용중인 도메인입니다' }); toast.error('이미 사용중인 도메인입니다'); + } else if (code == 'UNAUTHORIZED_USER') { + toast.error('권한이 없는 사용자입니다'); } else { toast.error('라우팅 설정을 등록할 수 없습니다'); } diff --git a/src/pages/routing/List.tsx b/src/pages/routing/List.tsx index 0e232c7710e4b8a5f0b0e40fc58810e4f72c2965..ab57550dd5aefe2986cd8a4b33edf7236e23366a 100644 --- a/src/pages/routing/List.tsx +++ b/src/pages/routing/List.tsx @@ -9,8 +9,6 @@ import { HoverCard, HoverCardContent, HoverCardTrigger } from '@/components/ui/h import { Input } from '@/components/ui/input'; import { Badge } from '@/components/ui/badge'; import { Skeleton } from '@/components/ui/skeleton'; -import { useAuthStore } from '@/stores/authStore'; -import { Routing } from '@/types/routing'; import { AlertDialog, AlertDialogContent, @@ -21,6 +19,8 @@ import { AlertDialogDescription, AlertDialogFooter, } from '@/components/ui/alert-dialog'; +import { useAuthStore } from '@/stores/authStore'; +import { Routing } from '@/types/routing'; export default function RoutingList() { const { authFetch, selectedProject } = useAuthStore(); @@ -75,7 +75,7 @@ export default function RoutingList() { )} </div> <Button asChild> - <Link to="./create"> + <Link to="./create" className={selectedProject?.role !== 'admin' ? 'opacity-50 pointer-events-none' : ''}> <Plus className="h-4 w-4" /> 새 프록시 추가 </Link> </Button> @@ -174,12 +174,17 @@ export default function RoutingList() { </TableCell> <TableCell> <div className="flex justify-center items-center gap-2"> - <Button variant="secondary" className="size-8"> + <Button disabled={selectedProject?.role !== 'admin'} variant="secondary" className="size-8"> <Link to={`./edit/${routing.id}`}> <Pencil /> </Link> </Button> - <Button variant="secondary" className="size-8" onClick={() => setSelectedRouting(routing)}> + <Button + disabled={selectedProject?.role !== 'admin'} + variant="secondary" + className="size-8" + onClick={() => setSelectedRouting(routing)} + > <Trash /> </Button> </div>