Skip to content

Commit

Permalink
Merge branch 'develop' into Feature/#271-스터디원API
Browse files Browse the repository at this point in the history
  • Loading branch information
jasper200207 committed Aug 8, 2024
2 parents 8f8dda7 + 4144a03 commit 9c51e13
Show file tree
Hide file tree
Showing 22 changed files with 665 additions and 309 deletions.
Binary file added public/png/file.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/png/folder.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/png/noImg.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
44 changes: 24 additions & 20 deletions src/app/api/document.ts
Original file line number Diff line number Diff line change
@@ -1,42 +1,46 @@
import { fetcher } from '@/app/api/fetcher';
import { Document, DocumentType } from '@/types';
import { UpdateDocument } from '@/containers/study/CreateDocumentModal/type';

const documentFetcher = fetcher();

const postDocument = (groupType: number, groupId: number, document: Document, files: FormData) => {
const postDocument = (token: string, groupType: string, groupId: number, request: FormData) =>
documentFetcher(`/${groupType}/${groupId}/documents`, {
method: 'POST',
body: { document, files },
body: request,
headers: {
Authorization: `Bearer ${token}`,
},
});
};

const getDocumentList = (groupType: number, groupId: number, page: number = 0, size: number = 4) => {
documentFetcher(`/${groupType}/${groupId}/documents?page=${page}&size=${size}`, {
method: 'GET',
});
};
const getDocumentList = (category: string, teamId: number, page: number, size: number) =>
documentFetcher(`/${category}/${teamId}/documents?page=${page}&size=${size}`);

const getDocument = (documentId: number) => {
const getDocument = (token: string, documentId: number) =>
documentFetcher(`/${documentId}`, {
method: 'GET',
headers: {
Authorization: `Bearer ${token}`,
},
});
};

const putDocument = (documentId: number, title: string, description: string, accessType: DocumentType) => {
const putDocument = (
token: string,
documentId: number,
request: Pick<UpdateDocument, 'title' | 'description' | 'accessType'>,
) =>
documentFetcher(`/${documentId}`, {
method: 'PUT',
body: {
title,
description,
accessType,
body: request,
headers: {
Authorization: `Bearer ${token}`,
},
});
};

const deleteDocument = (documentId: number) => {
const deleteDocument = (token: string, documentId: number) =>
documentFetcher(`/${documentId}`, {
method: 'DELETE',
headers: {
Authorization: `Bearer ${token}`,
},
});
};

export { postDocument, getDocumentList, getDocument, putDocument, deleteDocument };
36 changes: 36 additions & 0 deletions src/app/team/[teamId]/document/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
'use client';

import { Button, Flex, Text } from '@chakra-ui/react';
import { useState } from 'react';

import Documents from '@/containers/document/Documents';
import CreateDocumentModal from '@/containers/study/CreateDocumentModal';
import { CreateDocument } from '@/containers/study/CreateDocumentModal/type';

const Page = ({ params }: { params: { teamId: number } }) => {
const [openCreateModal, setOpenCreateModal] = useState(false);
const categoryData: CreateDocument = { groupId: params.teamId, groupType: 'teams' };
return (
<Flex align="center" direction="column" gap="9" w="100%" p="8">
<Flex justify="space-between" w="100%">
<Flex direction="row" gap="2">
<Text textStyle="bold_2xl">학습자료 갤러리</Text>
</Flex>
<Button color="white" bg="orange_dark" onClick={() => setOpenCreateModal(true)} rounded="full">
자료 등록
</Button>
</Flex>
<Documents groupId={params.teamId} category="teams" />
<CreateDocumentModal
isOpen={openCreateModal}
onClose={() => setOpenCreateModal(false)}
categoryData={categoryData}
// groupId={params.teamId}
// groupType="teams"
category="create"
/>
</Flex>
);
};

export default Page;
53 changes: 37 additions & 16 deletions src/app/team/[teamId]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,16 @@ import { Box, Button, Flex, useBreakpointValue } from '@chakra-ui/react';
import { useEffect, useState } from 'react';
import { BsLink45Deg } from 'react-icons/bs';

import { getDocumentList } from '@/app/api/document';
import { getGarden } from '@/app/api/garden';
import { getStudies } from '@/app/api/study';
import { getTeamInfo, postInviteTeam } from '@/app/api/team';
import { DocumentCardProps } from '@/components/DocumentCard/types';
import Garden3D from '@/components/Garden3D';
import TabButton from '@/components/TabButton';
import Title from '@/components/Title';
import { CARD_PER_PAGE, TEAM_CATEGORY_INFOS } from '@/constants/team';
import CreateDocumentModal from '@/containers/study/CreateDocumentModal';
import { CreateDocument } from '@/containers/study/CreateDocumentModal/type';
import StudyModal from '@/containers/study/Modal/StudyModal';
import AttendanceRate from '@/containers/team/AttendanceRate';
import DocumentGridView from '@/containers/team/DocumentGridView';
Expand All @@ -22,24 +24,21 @@ import StudyGridView from '@/containers/team/StudyGridView';
import TeamControlPanel from '@/containers/team/TeamControlPanel';
import TeamMember from '@/containers/team/teamMember';
import { useGetFetchWithToken, useMutateWithToken } from '@/hooks/useFetchWithToken';
import documentCardData from '@/mocks/documentCard';
import { Garden, StudyRank } from '@/types';
import { DocumentList, Garden, StudyRank } from '@/types';

const Page = ({ params }: { params: { teamId: number } }) => {
const teamInfo = useGetFetchWithToken(getTeamInfo, [params.teamId]);

const [garden, setGarden] = useState<Garden[]>([]);

const [category, setCategory] = useState<string>(TEAM_CATEGORY_INFOS[0].name);
const [cardIdx, setCardIdx] = useState<number>(0);

const [studyArray, setStudyArray] = useState<StudyRank[]>([]);
const [documentArray, setDocumentArray] = useState<DocumentCardProps[]>([]);
const [documentArray, setDocumentArray] = useState<DocumentList[]>([]);
const [documentLength, setDocumentLength] = useState<number>(0);

const [isCreateStudyModalOpen, setIsCreateStudyModalOpen] = useState<boolean>(false);
const [isCreateDocumentModalOoen, setIsCreateDocumentModalOpen] = useState<boolean>(false);

const inviteTeam = useMutateWithToken(postInviteTeam);
const categoryData: CreateDocument = { groupId: params.teamId, groupType: 'teams' };

const getCardData = (start: number) => {
if (category === '스터디') {
Expand All @@ -52,25 +51,34 @@ const Page = ({ params }: { params: { teamId: number } }) => {
}
});
} else if (category === '학습자료') {
const page = Math.floor(start / CARD_PER_PAGE);
const size = CARD_PER_PAGE;

// TODO: 학습자료 목록 조회하기.
setDocumentArray(documentCardData.slice(start, start + CARD_PER_PAGE));
getDocumentList('teams', params.teamId, page, size).then((res) => {
if (res.ok) {
setDocumentArray(res.body.content);
setDocumentLength(res.body.numberOfElements);
}
});
}
};

useEffect(() => {
// TODO: 아래의 handleNextClick의 조건문을 기능시키기 위해,
// 팀 상세 정보 조회 api에서 팀의 스터디와 학습자료 갯수를 받아와야할 것 같습니다.
setDocumentLength(documentCardData.length);

getGarden(params.teamId).then((res) => {
setGarden(res.body);
});
TEAM_CATEGORY_INFOS[1].page = `/team/${params.teamId}/document`;
}, []);

useEffect(() => {
getCardData(cardIdx);
}, [cardIdx]);

useEffect(() => {
getCardData(0);
}, [category]);

const handlePrevClick = () => {
if (cardIdx - CARD_PER_PAGE < 0) return;

Expand All @@ -90,17 +98,24 @@ const Page = ({ params }: { params: { teamId: number } }) => {
}
});
} else if (category === '학습자료') {
if (cardIdx + CARD_PER_PAGE >= documentLength) return;
if (cardIdx + CARD_PER_PAGE > documentLength) return;

const nextPage = Math.floor((cardIdx + CARD_PER_PAGE) / CARD_PER_PAGE);
const size = CARD_PER_PAGE;

setCardIdx((idx) => idx + CARD_PER_PAGE);
getDocumentList('teams', params.teamId, nextPage, size).then((res) => {
if (res.ok) {
setCardIdx((idx) => idx + CARD_PER_PAGE);
}
});
}
};

const handlePlusClick = () => {
if (category === '스터디') {
setIsCreateStudyModalOpen(true);
} else if (category === '학습자료') {
// TODO: create study `asset` modal 띄우기
setIsCreateDocumentModalOpen(true);
}
};

Expand Down Expand Up @@ -190,6 +205,12 @@ const Page = ({ params }: { params: { teamId: number } }) => {
setIsModalOpen={setIsCreateStudyModalOpen}
studyInfo={null}
/>
<CreateDocumentModal
isOpen={isCreateDocumentModalOoen}
onClose={() => setIsCreateDocumentModalOpen(false)}
categoryData={categoryData}
category="create"
/>
</>
);
};
Expand Down
17 changes: 14 additions & 3 deletions src/app/team/[teamId]/study/[studyId]/document/page.tsx
Original file line number Diff line number Diff line change
@@ -1,21 +1,32 @@
'use client';

import { Button, Flex, Text } from '@chakra-ui/react';
import { useState } from 'react';

import Documents from '@/containers/document/Documents';
import CreateDocumentModal from '@/containers/study/CreateDocumentModal';
import { CreateDocument } from '@/containers/study/CreateDocumentModal/type';

const Page = () => {
const Page = ({ params }: { params: { teamId: number; studyId: number } }) => {
const [openCreateModal, setOpenCreateModal] = useState(false);
const categoryData: CreateDocument = { groupId: params.studyId, groupType: 'studies' };
return (
<Flex align="center" direction="column" gap="9" w="100%" p="8">
<Flex justify="space-between" w="100%">
<Flex direction="row" gap="2">
<Text textStyle="bold_2xl">학습자료 갤러리</Text>
</Flex>
<Button color="white" bg="orange_dark" rounded="full">
<Button color="white" bg="orange_dark" onClick={() => setOpenCreateModal(true)} rounded="full">
자료 등록
</Button>
</Flex>
<Documents />
<Documents groupId={params.studyId} category="studies" />
<CreateDocumentModal
isOpen={openCreateModal}
onClose={() => setOpenCreateModal(false)}
categoryData={categoryData}
category="create"
/>
</Flex>
);
};
Expand Down
30 changes: 23 additions & 7 deletions src/app/team/[teamId]/study/[studyId]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import NextLink from 'next/link';
import { useEffect, useState } from 'react';
import { MdOutlineArrowForwardIos } from 'react-icons/md';

import { getDocumentList } from '@/app/api/document';
import { getStudy } from '@/app/api/study';
import DocumentCard from '@/components/DocumentCard';
import Title from '@/components/Title';
Expand All @@ -19,18 +20,24 @@ import StudyInfoCard from '@/containers/study/StudyInfoCard';
import StudyParticipantMenu from '@/containers/study/StudyParticipantMenu';
import documentCardData from '@/mocks/documentCard';
import participantData from '@/mocks/participant';
import { Study } from '@/types';
import { DocumentList, Study } from '@/types';

const Page = ({ params }: { params: { studyId: number } }) => {
const Page = ({ params }: { params: { teamId: number; studyId: number } }) => {
const [studyData, setStudyData] = useState<Study>();
const [isEditModalOpen, setIsEditModalOpen] = useState<boolean>(false);
const [isDeleteModalOpen, setIsDeleteModalOpen] = useState<boolean>(false);
const [isTerminateModalOpen, setIsTerminateModalOpen] = useState<boolean>(false);
const [documentArray, setDocumentArray] = useState<DocumentList[]>([]);

useEffect(() => {
getStudy(params.studyId).then((data) => {
setStudyData(data.body);
});
getDocumentList('studies', params.studyId, 0, 4).then((res) => {
if (res.ok) {
setDocumentArray(res.body.content);
}
});
}, [params.studyId]);

return (
Expand All @@ -57,7 +64,14 @@ const Page = ({ params }: { params: { studyId: number } }) => {
<Flex direction="column" rowGap={{ base: '6', '2xl': '12' }}>
<CurriculumCard />
<Flex align="right" direction="column" rowGap="3">
<Link as={NextLink} gap="3" display="flex" w="fit-content" ml="auto" href="/team/1/study/1/document">
<Link
as={NextLink}
gap="3"
display="flex"
w="fit-content"
ml="auto"
href={`/team/${params.teamId}/study/${params.studyId}/document`}
>
<IconButton
fontSize="16px"
aria-label=""
Expand All @@ -69,15 +83,17 @@ const Page = ({ params }: { params: { studyId: number } }) => {
<Text>전체 보기</Text>
</Link>
<Grid gap="2" templateColumns={{ base: 'repeat(2, 1fr)', lg: 'repeat(4, 1fr)' }}>
{documentCardData.map((data) => (
{documentArray.map((data) => (
<DocumentCard
id={data.id}
key={data.title}
title={data.title}
content={data.content}
description={data.description}
date={data.date}
bookmark={data.bookmark}
img={data.img}
uploaderName={data.uploaderName}
setReload={() => {}}
files={data.files}
type={data.type}
/>
))}
</Grid>
Expand Down
Loading

0 comments on commit 9c51e13

Please sign in to comment.