feat: even project manager should not edit/delete project (#14)
* fix: remove unused import * feat: even project manager should not edit/delete project * docs: even project manager should not edit/delete project
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
import { title, subtitle } from '@/components/primitives';
|
||||
import { Card, CardHeader, CardBody, Avatar } from '@nextui-org/react';
|
||||
import { Scale, Folder, Check, Globe } from 'lucide-react';
|
||||
import { useTranslations } from 'next-intl';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { useTranslations } from 'next-intl';
|
||||
import { Image, Divider } from '@nextui-org/react';
|
||||
import { Divider } from '@nextui-org/react';
|
||||
import { title, subtitle } from '@/components/primitives';
|
||||
import PaneMainTitle from './PaneMainTitle';
|
||||
import PaneMainFeatures from './PaneMainFeatures';
|
||||
|
||||
@@ -92,7 +92,7 @@ export default function SettingsPage({ projectId, messages, locale }: Props) {
|
||||
startContent={<Trash size={16} />}
|
||||
size="sm"
|
||||
color="danger"
|
||||
isDisabled={!context.isProjectManager(Number(projectId))}
|
||||
isDisabled={!context.isProjectOwner(Number(projectId))}
|
||||
onClick={() => setIsDeleteConfirmDialogOpen(true)}
|
||||
>
|
||||
{messages.deleteProject}
|
||||
@@ -101,7 +101,7 @@ export default function SettingsPage({ projectId, messages, locale }: Props) {
|
||||
startContent={<Pencil size={16} />}
|
||||
size="sm"
|
||||
color="primary"
|
||||
isDisabled={!context.isProjectManager(Number(projectId))}
|
||||
isDisabled={!context.isProjectOwner(Number(projectId))}
|
||||
onClick={() => setIsProjectDialogOpen(true)}
|
||||
className="ms-2"
|
||||
>
|
||||
|
||||
@@ -18,16 +18,17 @@ export type TokenProps = {
|
||||
export type TokenType = {
|
||||
access_token: string;
|
||||
expires_at: number;
|
||||
user: UserType;
|
||||
user: UserType | null;
|
||||
};
|
||||
|
||||
export type TokenContextType = {
|
||||
token: {
|
||||
access_token: string;
|
||||
user: UserType;
|
||||
user: UserType | null;
|
||||
};
|
||||
isSignedIn: () => boolean;
|
||||
isAdmin: () => boolean;
|
||||
isProjectOwner: (projectId: number) => boolean;
|
||||
isProjectManager: (projectId: number) => boolean;
|
||||
isProjectDeveloper: (projectId: number) => boolean;
|
||||
isProjectReporter: (projectId: number) => boolean;
|
||||
|
||||
@@ -6,6 +6,7 @@ import { useRouter, usePathname } from '@/src/navigation';
|
||||
import {
|
||||
isSignedIn as tokenIsSinedIn,
|
||||
isAdmin as tokenIsAdmin,
|
||||
isProjectOnwer as tokenIsProjectOnwer,
|
||||
isProjectManager as tokenIsProjectManager,
|
||||
isProjectDeveloper as tokenIsProjectDeveloper,
|
||||
isProjectReporter as tokenIsProjectReporter,
|
||||
@@ -30,12 +31,19 @@ const defaultContext = {
|
||||
},
|
||||
isSignedIn: () => false,
|
||||
isAdmin: () => false,
|
||||
isProjectOwner: (projectId: number) => {
|
||||
return false;
|
||||
},
|
||||
isProjectManager: (projectId: number) => {
|
||||
return false;
|
||||
},
|
||||
isProjectDeveloper: (projectId: number) => {
|
||||
return false;
|
||||
},
|
||||
isProjectReporter: (projectId: number) => {
|
||||
return false;
|
||||
},
|
||||
refreshProjectRoles: () => {},
|
||||
setToken: (token: TokenType) => {},
|
||||
storeTokenToLocalStorage,
|
||||
removeTokenFromLocalStorage,
|
||||
@@ -63,6 +71,10 @@ const TokenProvider = ({ toastMessages, locale, children }: TokenProps) => {
|
||||
return tokenIsAdmin(token);
|
||||
};
|
||||
|
||||
const isProjectOwner = (projectId: number) => {
|
||||
return tokenIsProjectOnwer(projectRoles, projectId);
|
||||
};
|
||||
|
||||
const isProjectManager = (projectId: number) => {
|
||||
return tokenIsProjectManager(projectRoles, projectId);
|
||||
};
|
||||
@@ -93,6 +105,7 @@ const TokenProvider = ({ toastMessages, locale, children }: TokenProps) => {
|
||||
projectRoles,
|
||||
isSignedIn,
|
||||
isAdmin,
|
||||
isProjectOwner,
|
||||
isProjectManager,
|
||||
isProjectDeveloper,
|
||||
isProjectReporter,
|
||||
|
||||
@@ -30,7 +30,7 @@ function isSignedIn(token: TokenType): boolean {
|
||||
function isAdmin(token: TokenType) {
|
||||
if (tokenExists(token) && isTokenValid(token)) {
|
||||
const adminRoleIndex = roles.findIndex((entry) => entry.uid === 'administrator');
|
||||
if (token.user.role === adminRoleIndex) {
|
||||
if (token.user && token.user.role === adminRoleIndex) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -61,6 +61,26 @@ async function fetchMyRoles(jwt: string) {
|
||||
}
|
||||
}
|
||||
|
||||
function isProjectOnwer(projectRoles: ProjectRoleType[], projectId: number) {
|
||||
if (!projectRoles) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const found = projectRoles.find((role) => {
|
||||
return role.projectId === projectId;
|
||||
});
|
||||
|
||||
if (!found) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (found.isOwner === true) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function isProjectManager(projectRoles: ProjectRoleType[], projectId: number) {
|
||||
if (!projectRoles) {
|
||||
return false;
|
||||
@@ -172,6 +192,7 @@ function checkSignInPage(token: TokenType, pathname: string) {
|
||||
export {
|
||||
isSignedIn,
|
||||
isAdmin,
|
||||
isProjectOnwer,
|
||||
isProjectManager,
|
||||
isProjectDeveloper,
|
||||
isProjectReporter,
|
||||
|
||||
Reference in New Issue
Block a user