-
+
+
+
+
{post.username}
-
- {relativeDateToKorean(post.createdAt)}
-
+
{relativeDateToKorean(post.createdAt)}
{/*
*/}
{/*
*/}
@@ -40,16 +41,12 @@ function PostCard({ post }: { post: PostResponse }) {
{/*
*/}
-
- {post.title}
-
+
{post.title}
-
- {removeHtmlTags(safeContent)}
-
+
{removeHtmlTags(safeContent)}
);
}
-export default PostCard;
\ No newline at end of file
+export default PostCard;
diff --git a/src/components/post/TagCard.tsx b/src/components/post/TagCard.tsx
index af46502..8d7b510 100644
--- a/src/components/post/TagCard.tsx
+++ b/src/components/post/TagCard.tsx
@@ -1,14 +1,15 @@
-import { TagResponse } from "../../common/types/post.tsx";
+import { TagResponse } from '../../common/types/post.tsx';
-function TagCard({ tag, onClick }: { tag: TagResponse, onClick: () => void }) {
+function TagCard({ tag, onClick }: { tag: TagResponse; onClick: () => void }) {
return (
);
}
-export default TagCard;
\ No newline at end of file
+export default TagCard;
diff --git a/src/components/post/TagChip.tsx b/src/components/post/TagChip.tsx
index 16b2e8d..5c6cf46 100644
--- a/src/components/post/TagChip.tsx
+++ b/src/components/post/TagChip.tsx
@@ -1,14 +1,15 @@
-import { MdOutlineClear } from "react-icons/md";
+import { MdOutlineClear } from 'react-icons/md';
-function TagChip({ name, removeTag }: { name: string, removeTag: (selectTag: string) => void }) {
+function TagChip({ name, removeTag }: { name: string; removeTag: (selectTag: string) => void }) {
return (
);
}
-export default TagChip;
\ No newline at end of file
+export default TagChip;
diff --git a/src/components/setting/SettingSideBar.tsx b/src/components/setting/SettingSideBar.tsx
index 6af3d88..6d7048f 100644
--- a/src/components/setting/SettingSideBar.tsx
+++ b/src/components/setting/SettingSideBar.tsx
@@ -3,15 +3,17 @@ interface TabType {
title: string;
}
-function SettingSideBar({ setSelectedSection, side }: {
- setSelectedSection: (section: string) => void,
- side: boolean,
+function SettingSideBar({
+ setSelectedSection,
+ side,
+}: {
+ setSelectedSection: (section: string) => void;
+ side: boolean;
}) {
-
const tabList: TabType[] = [
- { section: "profile", title: "프로필" },
- { section: "folder", title: "폴더" },
- { section: "post", title: "게시글" },
+ { section: 'profile', title: '프로필' },
+ { section: 'folder', title: '폴더' },
+ { section: 'post', title: '게시글' },
];
const handleSelectedTab = (tabSection: string) => {
@@ -19,23 +21,24 @@ function SettingSideBar({ setSelectedSection, side }: {
if (tab) {
setSelectedSection(tab.section);
}
- }
+ };
return (
-
-
- {tabList.map((tab) =>
+
+
+ {tabList.map(tab => (
-
)}
+
+ ))}
);
}
-export default SettingSideBar;
\ No newline at end of file
+export default SettingSideBar;
diff --git a/src/index.css b/src/index.css
index 08045e2..a1c22f8 100644
--- a/src/index.css
+++ b/src/index.css
@@ -1,4 +1,4 @@
-@import "tailwindcss";
+@import 'tailwindcss';
@layer base {
h1 {
@@ -44,68 +44,68 @@
@theme {
--font-*: initial;
- --default-font-family: "SCDream";
- --font-jalnan: "Jalnan2";
+ --default-font-family: 'SCDream';
+ --font-jalnan: 'Jalnan2';
}
@font-face {
- font-family: "Jalnan2";
- src: url("./common/assets/fonts/Jalnan2.otf");
+ font-family: 'Jalnan2';
+ src: url('./common/assets/fonts/Jalnan2.otf');
font-weight: 400;
font-style: normal;
}
@font-face {
- font-family: "SCDream";
- src: url("./common/assets/fonts/s-core/SCDream1.otf");
+ font-family: 'SCDream';
+ src: url('./common/assets/fonts/s-core/SCDream1.otf');
font-weight: 100;
font-style: normal;
}
@font-face {
- font-family: "SCDream";
- src: url("./common/assets/fonts/s-core/SCDream2.otf");
+ font-family: 'SCDream';
+ src: url('./common/assets/fonts/s-core/SCDream2.otf');
font-weight: 200;
font-style: normal;
}
@font-face {
- font-family: "SCDream";
- src: url("./common/assets/fonts/s-core/SCDream3.otf");
+ font-family: 'SCDream';
+ src: url('./common/assets/fonts/s-core/SCDream3.otf');
font-weight: 300;
font-style: normal;
}
@font-face {
- font-family: "SCDream";
- src: url("./common/assets/fonts/s-core/SCDream4.otf");
+ font-family: 'SCDream';
+ src: url('./common/assets/fonts/s-core/SCDream4.otf');
font-weight: 400;
font-style: normal;
}
@font-face {
- font-family: "SCDream";
- src: url("./common/assets/fonts/s-core/SCDream5.otf");
+ font-family: 'SCDream';
+ src: url('./common/assets/fonts/s-core/SCDream5.otf');
font-weight: 500;
font-style: normal;
}
@font-face {
- font-family: "SCDream";
- src: url("./common/assets/fonts/s-core/SCDream6.otf");
+ font-family: 'SCDream';
+ src: url('./common/assets/fonts/s-core/SCDream6.otf');
font-weight: 600;
font-style: normal;
}
@font-face {
- font-family: "SCDream";
- src: url("./common/assets/fonts/s-core/SCDream7.otf");
+ font-family: 'SCDream';
+ src: url('./common/assets/fonts/s-core/SCDream7.otf');
font-weight: 700;
font-style: normal;
}
@font-face {
- font-family: "SCDream";
- src: url("./common/assets/fonts/s-core/SCDream8.otf");
+ font-family: 'SCDream';
+ src: url('./common/assets/fonts/s-core/SCDream8.otf');
font-weight: 800;
font-style: normal;
}
@font-face {
- font-family: "SCDream";
- src: url("./common/assets/fonts/s-core/SCDream9.otf");
+ font-family: 'SCDream';
+ src: url('./common/assets/fonts/s-core/SCDream9.otf');
font-weight: 900;
font-style: normal;
}
diff --git a/src/layout/BasicLayout.tsx b/src/layout/BasicLayout.tsx
index e622965..0274428 100644
--- a/src/layout/BasicLayout.tsx
+++ b/src/layout/BasicLayout.tsx
@@ -1,13 +1,16 @@
-import { ReactNode } from "react";
-import Header from "../components/common/Header.tsx";
-import Footer from "../components/common/Footer.tsx";
-
-function BasicLayout({ children, center }: { children: ReactNode, center?: boolean }) {
+import { ReactNode } from 'react';
+import Header from '../components/common/Header.tsx';
+import Footer from '../components/common/Footer.tsx';
+function BasicLayout({ children, center }: { children: ReactNode; center?: boolean }) {
return (
-
+
-
+
{children}
@@ -15,4 +18,4 @@ function BasicLayout({ children, center }: { children: ReactNode, center?: boole
);
}
-export default BasicLayout;
\ No newline at end of file
+export default BasicLayout;
diff --git a/src/layout/LoadingLayout.tsx b/src/layout/LoadingLayout.tsx
index 8a4b5b1..bf2de23 100644
--- a/src/layout/LoadingLayout.tsx
+++ b/src/layout/LoadingLayout.tsx
@@ -1,24 +1,29 @@
function LoadingLayout({ loading }: { loading: boolean }) {
-
return (
- loading &&
-
-
-
-
Loading...
+ loading && (
+
-
+ )
);
}
-export default LoadingLayout;
\ No newline at end of file
+export default LoadingLayout;
diff --git a/src/layout/ModalLayout.tsx b/src/layout/ModalLayout.tsx
index 5a55413..074b676 100644
--- a/src/layout/ModalLayout.tsx
+++ b/src/layout/ModalLayout.tsx
@@ -1,13 +1,17 @@
-import { ReactNode, Ref } from "react";
+import { ReactNode, Ref } from 'react';
-function ModalLayout({ children, customRef, addStyle }: {
- children: ReactNode,
- customRef?: Ref
,
- addStyle?: string,
+function ModalLayout({
+ children,
+ customRef,
+ addStyle,
+}: {
+ children: ReactNode;
+ customRef?: Ref;
+ addStyle?: string;
}) {
return (
-
-
+
+
{children}
@@ -15,4 +19,4 @@ function ModalLayout({ children, customRef, addStyle }: {
);
}
-export default ModalLayout;
\ No newline at end of file
+export default ModalLayout;
diff --git a/src/main.tsx b/src/main.tsx
index 4b2e26b..b043ec9 100644
--- a/src/main.tsx
+++ b/src/main.tsx
@@ -1,11 +1,11 @@
-import { createRoot } from 'react-dom/client'
-import './index.css'
-import App from './App.tsx'
-import { Provider } from "react-redux";
-import store from "./store.tsx";
+import { createRoot } from 'react-dom/client';
+import './index.css';
+import App from './App.tsx';
+import { Provider } from 'react-redux';
+import store from './store.tsx';
createRoot(document.getElementById('root')!).render(
,
-)
+);
diff --git a/src/pages/MainPage.tsx b/src/pages/MainPage.tsx
index bdcbefc..6173c73 100644
--- a/src/pages/MainPage.tsx
+++ b/src/pages/MainPage.tsx
@@ -1,12 +1,11 @@
-import BasicLayout from "../layout/BasicLayout.tsx";
-import PostCard from "../components/post/PostCard.tsx";
-import { useEffect, useRef, useState } from "react";
-import { getPosts } from "../common/apis/post.tsx";
-import { PostResponse } from "../common/types/post.tsx";
-import useInfiniteScroll from "../common/util/infiniteScroll.tsx";
+import BasicLayout from '../layout/BasicLayout.tsx';
+import PostCard from '../components/post/PostCard.tsx';
+import { useEffect, useRef, useState } from 'react';
+import { getPosts } from '../common/apis/post.tsx';
+import { PostResponse } from '../common/types/post.tsx';
+import useInfiniteScroll from '../common/util/infiniteScroll.tsx';
function MainPage() {
-
const pageRef = useRef
(null);
const [posts, setPosts] = useState([]);
const { page } = useInfiniteScroll({
@@ -19,29 +18,27 @@ function MainPage() {
useEffect(() => {
getPosts({
- sorts: ["createdAt"],
+ sorts: ['createdAt'],
page: page,
size: pageSize,
isDescending: true,
})
- .then((res) => {
+ .then(res => {
setPosts([...posts, ...res.data.content]);
})
- .catch(() => alert("데이터 로드 중 문제가 발생했습니다. 다시 시도해주세요."));
+ .catch(() => alert('데이터 로드 중 문제가 발생했습니다. 다시 시도해주세요.'));
}, [page]);
return (
-
-
- 최근 게시글
-
-
- {posts.map((post) => (
-
+
+
최근 게시글
+
+ {posts.map(post => (
+
))}
@@ -49,4 +46,4 @@ function MainPage() {
);
}
-export default MainPage;
\ No newline at end of file
+export default MainPage;
diff --git a/src/pages/blog/BlogPage.tsx b/src/pages/blog/BlogPage.tsx
index ee3acae..c8bb77e 100644
--- a/src/pages/blog/BlogPage.tsx
+++ b/src/pages/blog/BlogPage.tsx
@@ -1,21 +1,20 @@
-import BasicLayout from "../../layout/BasicLayout.tsx";
-import { useParams, useSearchParams } from "react-router-dom";
-import PostCard from "../../components/post/PostCard.tsx";
-import { useEffect, useRef, useState } from "react";
-import { MdMenu, MdOutlineExitToApp } from "react-icons/md";
-import PaginationButton from "../../components/common/PaginationButton.tsx";
-import { FolderType, toFolderTypeList } from "../../common/types/blog.tsx";
-import BlogSideBar from "../../components/blog/BlogSideBar.tsx";
-import IconButton from "../../components/common/IconButton.tsx";
-import { PageResponse } from "../../common/types/common.tsx";
-import { getMemberFolders, getMemberPosts, getMemberTags } from "../../common/apis/blog.tsx";
-import { PostResponse, TagResponse } from "../../common/types/post.tsx";
-import { MemberProfileResponse } from "../../common/types/member.tsx";
-import { getProfileByUsername } from "../../common/apis/member.tsx";
-import { TextLink } from "../../components/common/TextButton.tsx";
+import BasicLayout from '../../layout/BasicLayout.tsx';
+import { useParams, useSearchParams } from 'react-router-dom';
+import PostCard from '../../components/post/PostCard.tsx';
+import { useEffect, useRef, useState } from 'react';
+import { MdMenu, MdOutlineExitToApp } from 'react-icons/md';
+import PaginationButton from '../../components/common/PaginationButton.tsx';
+import { FolderType, toFolderTypeList } from '../../common/types/blog.tsx';
+import BlogSideBar from '../../components/blog/BlogSideBar.tsx';
+import IconButton from '../../components/common/IconButton.tsx';
+import { PageResponse } from '../../common/types/common.tsx';
+import { getMemberFolders, getMemberPosts, getMemberTags } from '../../common/apis/blog.tsx';
+import { PostResponse, TagResponse } from '../../common/types/post.tsx';
+import { MemberProfileResponse } from '../../common/types/member.tsx';
+import { getProfileByUsername } from '../../common/apis/member.tsx';
+import { TextLink } from '../../components/common/TextButton.tsx';
function BlogPage() {
-
const { username } = useParams();
const [folderParam, setFolderParam] = useSearchParams();
@@ -24,10 +23,10 @@ function BlogPage() {
number: 0,
size: 3,
totalElements: 0,
- totalPages: 0
+ totalPages: 0,
});
const [posts, setPosts] = useState
([]);
- const [member, setMember] = useState({ username: username || "", profileUrl: null });
+ const [member, setMember] = useState({ username: username || '', profileUrl: null });
const [folders, setFolders] = useState([]);
const [tags, setTags] = useState([]);
@@ -38,7 +37,7 @@ function BlogPage() {
const handleMenuOpen = () => {
setIsOpen(cur => !cur);
- }
+ };
const handleClickOutside = (event: MouseEvent) => {
if (sideBarRef.current && !sideBarRef.current.contains(event.target as Node)) {
setIsOpen(false);
@@ -46,15 +45,15 @@ function BlogPage() {
};
const handlePage = (page: number) => {
- setFolderParam({ ...folderParam, "page": page.toString() });
+ setFolderParam({ ...folderParam, page: page.toString() });
setPage(page);
- }
+ };
const handleSelectedFolder = (folder: FolderType) => {
setSelectedFolder(folder);
- setFolderParam({ "folder": folder.id, "page": page.toString() });
+ setFolderParam({ folder: folder.id, page: page.toString() });
setPage(0);
- }
+ };
const getSelectedFolderById = (folders: FolderType[], folderId: string): FolderType | null => {
for (const folder of folders) {
@@ -71,7 +70,7 @@ function BlogPage() {
}
return null;
- }
+ };
const getSelectedFolders = (folder: FolderType | null) => {
if (!folder) {
@@ -86,15 +85,15 @@ function BlogPage() {
});
}
return folderIds;
- }
+ };
useEffect(() => {
document.addEventListener('mousedown', handleClickOutside);
- document.title = username || "DIGLOG";
+ document.title = username || 'DIGLOG';
return () => {
document.removeEventListener('mousedown', handleClickOutside);
- document.title = "DIGLOG";
+ document.title = 'DIGLOG';
};
}, []);
@@ -116,36 +115,35 @@ function BlogPage() {
}
getProfileByUsername(username)
- .then((res) => {
+ .then(res => {
setMember(res.data);
})
.catch(error => alert(error.response.data.message));
- getMemberFolders(username)
- .then(res => {
- const folders = toFolderTypeList(res.data);
- setFolders(folders);
- setFolders(prev => [
- {
- id: "",
- title: "전체",
- postCount: 0,
- subFolders: []
- },
- ...prev,
- ])
-
- setPage(Number(folderParam.get("page")) || 0);
-
- const initialSelectedFolderId = folderParam.get("folder");
- if (!initialSelectedFolderId) {
- return;
- }
- const initialSelectedFolder = getSelectedFolderById(folders, initialSelectedFolderId);
- if (initialSelectedFolder) {
- setSelectedFolder(initialSelectedFolder);
- }
- });
+ getMemberFolders(username).then(res => {
+ const folders = toFolderTypeList(res.data);
+ setFolders(folders);
+ setFolders(prev => [
+ {
+ id: '',
+ title: '전체',
+ postCount: 0,
+ subFolders: [],
+ },
+ ...prev,
+ ]);
+
+ setPage(Number(folderParam.get('page')) || 0);
+
+ const initialSelectedFolderId = folderParam.get('folder');
+ if (!initialSelectedFolderId) {
+ return;
+ }
+ const initialSelectedFolder = getSelectedFolderById(folders, initialSelectedFolderId);
+ if (initialSelectedFolder) {
+ setSelectedFolder(initialSelectedFolder);
+ }
+ });
getMemberTags(username)
.then(res => {
@@ -165,7 +163,7 @@ function BlogPage() {
page: page,
size: pageInfo.size,
})
- .then((res) => {
+ .then(res => {
setPosts(res.data.content);
setPageInfo(res.data.page);
})
@@ -175,48 +173,45 @@ function BlogPage() {
return (
-
-
-
}
- onClick={handleMenuOpen}
- addStyle="lg:hidden" />
+ className={`${
+ isOpen ? 'opacity-50 backdrop-blur-sm z-10 overflow-y-hidden' : 'z-10'
+ } w-full flex flex-col`}
+ >
+
+
+ } onClick={handleMenuOpen} addStyle='lg:hidden' />
-
-
- {posts.map((post) => (
-
+
+
+ {posts.map(post => (
+
))}
- {posts.length === 0 &&
-
- 작성된 게시글이 없습니다.
-
}
-
+ {posts.length === 0 && (
+
작성된 게시글이 없습니다.
+ )}
+
-
+
+ setSelectedFolder={handleSelectedFolder}
+ />
-
-