Skip to content

Commit 1a45e8e

Browse files
authored
Merge pull request #105 from codeit9-temporary/feature/Link-페이지
Working: 링크 카드 눌렀을 때 수정하고, 삭제하는 기능 해야됨
2 parents 4ac896a + 34c5a82 commit 1a45e8e

File tree

19 files changed

+230
-82
lines changed

19 files changed

+230
-82
lines changed

components/Folder/AddFolderButton.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,24 @@ import useRerenderFolderList from "@/hooks/useRerenderFolderList";
44

55
interface AddFolderButtonProps {
66
setFolderList: React.Dispatch<React.SetStateAction<FolderData[]>>;
7+
isModal?: boolean;
78
}
89

9-
export const AddFolderButton = ({ setFolderList }: AddFolderButtonProps) => {
10+
export const AddFolderButton = ({
11+
setFolderList,
12+
isModal = false,
13+
}: AddFolderButtonProps) => {
1014
const { isOpen, openModal } = useModalStore();
1115

1216
useRerenderFolderList(isOpen, setFolderList);
1317

1418
return (
1519
<button
16-
className="w-[79px] h-[19px] text-purple100"
20+
className={
21+
!isModal
22+
? "w-[100px] mt-auto text-purple100"
23+
: "fixed-bottom w-[120px] h-[35px] rounded-[20px] bg-purple100 text-white hover:bg-purple50"
24+
}
1725
onClick={() => openModal("AddFolderModal")}
1826
>
1927
폴더 추가 +

components/Folder/FolderActionsMenu.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,15 @@ import useRerenderFolderList from "../../hooks/useRerenderFolderList";
55

66
interface FolderActionsMenuProps {
77
setFolderList: React.Dispatch<React.SetStateAction<FolderData[]>>;
8+
folderId: string | string[] | undefined;
9+
linkCount: number;
810
}
911

10-
const FolderActionsMenu = ({ setFolderList }: FolderActionsMenuProps) => {
12+
const FolderActionsMenu = ({
13+
setFolderList,
14+
folderId,
15+
linkCount,
16+
}: FolderActionsMenuProps) => {
1117
const { isOpen, openModal } = useModalStore();
1218

1319
const handleModalOpen = (text: string) => {
@@ -16,10 +22,15 @@ const FolderActionsMenu = ({ setFolderList }: FolderActionsMenuProps) => {
1622
openModal("SNSModal");
1723
break;
1824
case "이름 변경":
19-
openModal("EditModal");
25+
openModal("EditModal", {
26+
folderId: Number(folderId),
27+
});
2028
break;
2129
case "삭제":
22-
openModal("DeleteFolderModal");
30+
openModal("DeleteFolderModal", {
31+
folderId: Number(folderId),
32+
linkCount: linkCount,
33+
});
2334
break;
2435
default:
2536
break;

components/Folder/FolderTag.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,23 @@ const FolderTag = ({ folderList }: FolderListData) => {
66
const { folder: currentFolderId } = router.query;
77

88
const folderStyle =
9-
"py-[8px] px-[12px] border border-purple100 rounded-md hover:bg-purple100 hover:text-white";
9+
"w-[100px] h-[35px] px-[15px] text-sm whitespace-nowrap truncate border border-purple100 rounded-md hover:bg-purple100 hover:text-white";
1010

11-
const handleSubmit = (id: number | string) => {
11+
const handleSubmit = (selectedFolderId: number | string) => {
1212
router.push({
1313
pathname: router.pathname,
14-
query: id ? { folder: id } : {},
14+
query: selectedFolderId ? { folder: selectedFolderId } : {},
1515
});
1616
};
1717

1818
return (
19-
<ul className="flex flex-wrap gap-[8px]">
19+
<ul className="flex flex-wrap gap-[8px] lg:w-[80%] md:w-[80%]">
2020
<li>
2121
<button className={folderStyle} onClick={() => handleSubmit("")}>
2222
전체
2323
</button>
2424
</li>
25-
{folderList.map((folder) => (
25+
{folderList.slice(0, 8).map((folder) => (
2626
<li key={folder.id}>
2727
<button
2828
className={`${folderStyle} ${folder.id === Number(currentFolderId) && "bg-purple100 text-white"}`}

components/Link/LinkCard.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { useRouter } from "next/router";
33
import { putLinkFavorite } from "@/lib/api/link";
44
import { useLinkCardStore } from "@/store/useLinkCardStore";
55
import { ensureAbsoluteUrl } from "@/lib/utils";
6-
import timeAgo from "@/util/timAgo";
6+
import timeAgo from "@/util/timeAgo";
77
import Image from "next/image";
88
import Dropdown from "../Dropdown";
99
import useModalStore from "@/store/useModalStore";
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
const RenderEmptyLinkMessage = () => {
2+
return (
3+
<span className="w-full h-[200px] flex justify-center items-center">
4+
저장된 링크가 없습니다.
5+
</span>
6+
);
7+
};
8+
9+
export default RenderEmptyLinkMessage;

components/Search/SearchInput.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export const SearchInput = () => {
2424
return (
2525
<form
2626
onSubmit={handleSubmit}
27-
className="flex gap-[8px] w-[1024px] h-[54px] items-center px-[16px] py-[15px] bg-gray-100 rounded-[10px] md:w-[704px] md:h-[54px] sm:w-[325px] sm:h-[43px] transition-all"
27+
className="flex gap-[8px] w-full h-[54px] items-center px-[16px] py-[15px] bg-gray-100 rounded-[10px] md:h-[54px] sm:h-[43px] transition-all"
2828
>
2929
<Image
3030
src="/icons/search.svg"

components/modal/DeleteFolderModal.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1+
import { deleteFolder } from "@/lib/api/folder";
12
import useModalStore from "@/store/useModalStore";
23
import SubmitButton from "../SubMitButton";
34
import ModalContainer from "./modalComponents/ModalContainer";
4-
import { deleteFolder } from "@/lib/api/folder";
55
import toast from "react-hot-toast";
66
import toastMessages from "@/lib/toastMessage";
77

components/modal/modalManager/ModalManager.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ export type ModalKeysType = keyof typeof ModalType;
2121

2222
export const Modal = () => {
2323
const { modalType, isOpen, props } = useModalStore();
24-
2524
if (!modalType || !isOpen) return null;
2625

2726
switch (modalType) {

hooks/useFetchLinks.tsx

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,43 @@
1-
import { useEffect, useState } from "react";
1+
import { useEffect } from "react";
22
import { proxy } from "@/lib/api/axiosInstanceApi";
33
import { LinkData } from "@/types/linkTypes";
4-
import { useRouter } from "next/router";
4+
import { ParsedUrlQuery } from "querystring";
5+
import useViewport from "./useViewport";
56

6-
// 링크페이지의 query가 바뀌면 새로운 리스트로 업데이트 해주는
7+
// 링크페이지의 query가 바뀌면 그에 맞는 링크들을 보여주는
78
const useFetchLinks = (
8-
setLinkCardList: (list: LinkData[], totalCount: number) => void
9+
setLinkCardList: React.Dispatch<React.SetStateAction<LinkData[]>>,
10+
setTotalCount?: React.Dispatch<React.SetStateAction<number>>,
11+
query?: ParsedUrlQuery,
12+
pathname?: string
913
) => {
10-
const router = useRouter();
14+
const { isTablet } = useViewport();
1115

1216
useEffect(() => {
1317
const fetchLinks = async () => {
1418
// 경로에 따라 API 엔드포인트 분기
15-
let endpoint = "/api/links";
16-
const params: any = {
17-
page: router.query.page,
18-
pageSize: 6,
19-
search: router.query.search,
20-
};
19+
let endpoint =
20+
pathname === "/favorite"
21+
? "/api/favorites"
22+
: query?.folder
23+
? `/api/folders/${query.folder}/links`
24+
: "/api/links";
2125

22-
if (router.pathname === "/favorite") {
23-
endpoint = "/api/favorites";
24-
}
25-
26-
try {
27-
const res = await proxy.get(endpoint, { params });
28-
setLinkCardList(res.data.list, res.data.totalCount);
29-
} catch (error) {
30-
console.error("Error fetching links:", error);
26+
const res = await proxy.get(endpoint, {
27+
params: {
28+
page: query?.page,
29+
pageSize: isTablet ? 6 : 10,
30+
search: query?.search,
31+
},
32+
});
33+
console.log("query가 바뀌었을 때 다시 받아온 리스트:", res.data.list);
34+
setLinkCardList(res.data.list);
35+
{
36+
setTotalCount && setTotalCount(res.data.totalCount);
3137
}
3238
};
33-
34-
if (router.query) fetchLinks();
35-
}, [router.query, setLinkCardList, router.pathname]);
39+
if (query) fetchLinks();
40+
}, [setLinkCardList, query, isTablet]);
3641
};
3742

3843
export default useFetchLinks;

hooks/useGetFolderInfo.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { useEffect, useState } from "react";
2+
import { useRouter } from "next/router";
3+
import { getFolder } from "@/lib/api/folder";
4+
5+
const useGetFolderInfo = () => {
6+
const router = useRouter();
7+
const folderId = router.query.folder;
8+
const [folderName, setFolderName] = useState("폴더이름");
9+
10+
useEffect(() => {
11+
if (!folderId) return;
12+
13+
const fetchFolderData = async () => {
14+
const res = await getFolder(folderId);
15+
if (res) setFolderName(res.data?.name);
16+
};
17+
fetchFolderData();
18+
}, [folderId]);
19+
20+
return { folderName, folderId };
21+
};
22+
export default useGetFolderInfo;

0 commit comments

Comments
 (0)