feat: hackathon

This commit is contained in:
Maulana Sodiqin
2025-11-25 01:47:56 +07:00
parent 5a99f216cb
commit 9e9bfc2793
53 changed files with 6892 additions and 927 deletions
@@ -0,0 +1,76 @@
import { useTeamById, useTeamMembers, useUserMe, useTeamSubmission } from '@imphnen-frontend-service/service';
/**
* Hook to check if current user is a member of the team
*/
export const useTeamMembership = (teamId: string) => {
const { data: userData } = useUserMe();
const { data: membersData } = useTeamMembers(teamId);
const currentUser = userData?.data;
const members = membersData?.data || [];
const isMember = members.some(m => m.user_id === currentUser?.id);
const currentMember = members.find(m => m.user_id === currentUser?.id);
return {
isMember,
currentMember,
memberRole: currentMember?.role,
memberStatus: currentMember?.status,
};
};
/**
* Hook to check if current user is the team leader
*/
export const useIsTeamLeader = (teamId: string) => {
const { data: teamData } = useTeamById(teamId);
const { data: userData } = useUserMe();
const team = teamData?.data;
const currentUser = userData?.data;
const isLeader = currentUser?.id === team?.leader_id;
return {
isLeader,
leaderId: team?.leader_id,
};
};
/**
* Hook to get team submission status
*/
export const useTeamSubmissionStatus = (teamId: string) => {
const { data: submissionData, isLoading } = useTeamSubmission(teamId, !!teamId);
const hasSubmission = !!submissionData?.data;
const submission = submissionData?.data;
const isSubmitted = submission?.status === 'submitted';
return {
hasSubmission,
isSubmitted,
submission,
isLoading,
};
};
/**
* Hook to check if current user can perform team actions
*/
export const useTeamPermissions = (teamId: string) => {
const { isLeader } = useIsTeamLeader(teamId);
const { isMember } = useTeamMembership(teamId);
const { hasSubmission } = useTeamSubmissionStatus(teamId);
return {
canEditTeam: isLeader,
canManageMembers: isLeader,
canSubmitProject: isLeader && !hasSubmission,
canViewTeam: isMember,
canViewSubmission: isMember,
canAccessChat: isMember,
};
};