Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
496cfd6
feat : serverFetch 구현했습니다
Jul 24, 2025
763029f
fix: 컴포넌트 비삭제 된 요소 삭제했습니다
Jul 24, 2025
1c5ee98
refactor : MyMentoSection 분리했습니다
Jul 24, 2025
68e8119
refactor : MyMentorSection 으로 수정했습니다
Jul 24, 2025
50642cf
refactor : Mentor 로 통일 및 폴더구조 개선했습니다
Jul 24, 2025
3eeadc5
refactor : 컴포넌트 영역의 하드코딩된 값 모두 테일윈드 값으로 수정했습니다
Jul 24, 2025
a5e22ca
refactor: body 단일화·any 제거·HttpError 추가 했습니다
Jul 25, 2025
6b2e4b5
refactor : decode 함수 분리했습니다
Jul 25, 2025
d77f2b2
fix : 일관성 위해 Buffer -> atob로 수정했습니다
Jul 25, 2025
92a1fb9
refactor : MentorCard 분리했습니다
Jul 25, 2025
9dd06cd
refactor : MentorCard 분리했습니다
Jul 25, 2025
37f8b39
refactor : component -> ui 로 수정했습니다
Jul 25, 2025
dc45f50
refactor : Article Card 분리했습니다:
Jul 25, 2025
cd0d635
refactor : ChannelSelect 숨겨진 input 삭제했습니다
Jul 25, 2025
fcd8330
refactor : MentorApply 삭제 및 clsx 추가했습니다
Jul 25, 2025
1ff3148
feat : 멘토 api 폴더 구조 정립했습니다
Jul 25, 2025
38ffc93
fix : useGetMentorList 구현 및 타입 안정성 더했습니다
Jul 25, 2025
22f494e
feat : MentorFindSection 무한스크롤 구현했습니다
Jul 25, 2025
abdc9b1
feat : useGetMyMentorProfile 구현했습니다
Jul 25, 2025
87169c6
feat : 특정 멘토 페이지 구현했습니다
Jul 25, 2025
6881396
feat : useGetArticle 연결했습니다
Jul 25, 2025
d116856
feat : ArticlePanel useDeleteArticle 연결했습니다
Jul 25, 2025
9cd64b9
feat : MentoModify 구현했습니다
Jul 25, 2025
2abfb96
fix : 멘토 챗 카드 디자인수정했습니다
Jul 25, 2025
43b7fc7
feat : MentorApplyCountModal 구현했습니다 "
Jul 25, 2025
b530159
feat : RootModal 및 신규 신청 알림 구현했습니다
Jul 25, 2025
0603cf8
fix : 디자인 및 RootModal 구조 수정했습니다
Jul 25, 2025
4fe8aef
feat : RootModal의 클라이언트 , 서버 모달 나눴습니다
Jul 25, 2025
be6290a
feat : zustnad로 커스텀 confirm 함수 구현했습니다
Jul 27, 2025
31a6cd9
fix : IconConfirmModal 수정 두개 메시지 받도록 수정및 customConfirm 으로 수정했습니다
Jul 27, 2025
4e7203c
fix : ClientModal에 useclient 추가했습니다
Jul 27, 2025
b391629
fix : merge 후 충돌사항 반영했습니다
Jul 27, 2025
2b8693b
refactor : PR 코멘트 내용이었던 set함수와 controller 의 증복을 제거했습니다
Jul 27, 2025
b548e4f
refactor : PR 코멘트 반영했습니다
Jul 27, 2025
26b5b7e
refactor : 불필요 컴포넌트 삭제 했습니다
Jul 27, 2025
4186d63
refactor : PR 코멘트 반영했습니다
Jul 27, 2025
3666f67
fix : serverFetch 글로벌 세마포어를 key로 관리하도록 수정했습니다
Jul 30, 2025
1cdfe74
fix : GlobalLayout 구현 및 useLayout 요소 모두 제거했습니다
Jul 30, 2025
3802c21
feat : mentor_api 브랜치 merge 후 rootModal 결합했습니다
Jul 30, 2025
d1c34a5
refactor : TopLogoBar 로 리팩토링했습니다
Jul 30, 2025
58a1fd6
chore : sentry.client 수정했습니다
Jul 31, 2025
2cc9a8b
fix : useGetArticleList 오타 수정 및 Tab 요소 위치 버그 수정했습니다
Jul 31, 2025
a79544d
fix : PR 내용 반영했습니다
Jul 31, 2025
bbe7411
fix : build 버그 보완했습니다
Jul 31, 2025
0bb5504
fix : conflict 해결
Jul 31, 2025
2aa6ae7
fix : conflict 해결
Jul 31, 2025
5881a78
refactor : 이동 요소 추가했습니다
Jul 31, 2025
9bbb1ea
fix :community 오타 수정했습니다
Jul 31, 2025
d84ed10
fix : conflict 버전 충돌문제 해결했습니다
Jul 31, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 4 additions & 17 deletions sentry.client.config.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,15 @@
// This file configures the initialization of Sentry on the client.
// The config you add here will be used whenever a users loads a page in their browser.
// https://docs.sentry.io/platforms/javascript/guides/nextjs/
import * as Sentry from "@sentry/nextjs";

Sentry.init({
dsn: process.env.SENTRY_DSN || "",
environment: process.env.SENTRY_ENVIRONMENT || "development",
tracesSampleRate: 1.0,

// Adjust this value in production, or use tracesSampler for greater control
tracesSampleRate: 1,

// Setting this option to true will print useful information to the console while you're setting up Sentry.
debug: false,

replaysOnErrorSampleRate: 1.0,

// This sets the sample rate to be 10%. You may want this to be 100% while
// in development and sample at a lower rate in production
replaysSessionSampleRate: 0.1,

// You can remove this option if you're not planning to use the Sentry Session Replay feature:
integrations: [
Sentry.browserTracingIntegration({
tracePropagationTargets: ["localhost", /^https:\/\/(www\.)?solid\-connection\.com/],
}),
Sentry.replayIntegration({
// Additional Replay configuration goes in here, for example:
maskAllText: true,
blockAllMedia: true,
}),
Expand Down
40 changes: 40 additions & 0 deletions src/api/article/client/useGetArticleList.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { useEffect, useState } from "react";

import useFetch from "@/utils/apiUtils";

import { ArticleResponse } from "../type/response";

/* ---------- 타입 ---------- */

interface ArticleListResponse {
news: ArticleResponse[]; // 최대 5개
}

const useGetArticleList = (userId: number | null) => {
const { result, loading, error, fetchData } = useFetch<ArticleListResponse>();

const [articleList, setArticleList] = useState<ArticleResponse[]>([]);

/* 페이지 변경 시 데이터 요청 */
useEffect(() => {
if (userId === null) return;

fetchData({
method: "get",
url: `/news?site-user-id=${userId}`,
body: undefined,
isToken: true,
});
}, [userId, fetchData]);

/* 응답 처리 */
useEffect(() => {
if (result) {
setArticleList(result.data.news);
}
}, [result]);

return { articleList, loading, error };
};

export default useGetArticleList;
4 changes: 4 additions & 0 deletions src/api/mentor/client/useGetMyMentorProfile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,11 @@ interface UseGetMyMentorDataReturn {

const useGetMyMentorProfile = (): UseGetMyMentorDataReturn => {
const { result, loading, error, fetchData } = useFetch<MentorCardPreview>();
<<<<<<< HEAD
const [myMentorProfile, setMyMentorProfile] = useState<MentorCardPreview>(null);
=======
const [myMentorProfile, setMyMentorProfile] = useState<MentorCardPreview>({} as MentorCardPreview);
>>>>>>> main

Comment on lines +15 to 20
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

1. 병합 충돌이 해결되지 않았습니다

- Git 병합 마커(<<<<<<< HEAD, =======, >>>>>>> main)가 남아있음
- 정적 분석 도구에서 파싱 에러 발생
- 타입 안전성을 위해 null 초기화(HEAD 브랜치)가 올바른 선택으로 보임

다음과 같이 병합 충돌을 해결해주세요:

-<<<<<<< HEAD
-  const [myMentorProfile, setMyMentorProfile] = useState<MentorCardPreview>(null);
-=======
-  const [myMentorProfile, setMyMentorProfile] = useState<MentorCardPreview>({} as MentorCardPreview);
->>>>>>> main
+  const [myMentorProfile, setMyMentorProfile] = useState<MentorCardPreview>(null);

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 Biome (2.1.2)

[error] 16-17: Expected a statement but instead found '======='.

Expected a statement here.

(parse)


[error] 18-18: Shouldn't redeclare 'myMentorProfile'. Consider to delete it or rename it.

'myMentorProfile' is defined here:

(lint/suspicious/noRedeclare)


[error] 18-18: Shouldn't redeclare 'setMyMentorProfile'. Consider to delete it or rename it.

'setMyMentorProfile' is defined here:

(lint/suspicious/noRedeclare)

🤖 Prompt for AI Agents
In src/api/mentor/client/useGetMyMentorProfile.ts around lines 15 to 20, there
are unresolved Git merge conflict markers (<<<<<<< HEAD, =======, >>>>>>> main)
present. Remove all these conflict markers and keep the initialization of
myMentorProfile state with null for type safety, as in the HEAD branch. Ensure
the code compiles without parsing errors by having a clean state initialization
without any conflict markers.

useEffect(() => {
fetchData({
Expand Down
2 changes: 1 addition & 1 deletion src/api/mentor/type/response.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export interface MentorCardBase {
}

/** 리스트(미리보기) 용 – passTip / isApplied 없이 사용 */
export type MentorCardPreview = MentorCardBase & { studyStatus: "24-1" | "24-2" }; // 학업 상태 (예: "24-1")
export type MentorCardPreview = (MentorCardBase & { studyStatus: "24-1" | "24-2" }) | null; // 학업 상태 (예: "24-1")

/** 상세 뷰 용 – 추가 정보 포함 */
export interface MentorCardDetail extends MentorCardBase {
Expand Down
2 changes: 1 addition & 1 deletion src/app/application/ScorePageContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
import { useRouter } from "next/navigation";
import { useEffect, useRef, useState } from "react";

import CloudSpinnerPage from "@/components/loading/CloudSpinnerPage";
import ConfirmCancelModal from "@/components/modal/ConfirmCancelModal";
import ButtonTab from "@/components/ui/ButtonTab";
import CloudSpinnerPage from "@/components/ui/CloudSpinnerPage";
import Tab from "@/components/ui/Tab";

import ScoreSearchBar from "./ScoreSearchBar";
Expand Down
2 changes: 1 addition & 1 deletion src/app/community/[boardCode]/CommunityPageContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import { useRouter } from "next/navigation";
import { useEffect, useState } from "react";

import CloudSpinnerPage from "@/components/loading/CloudSpinnerPage";
import ButtonTab from "@/components/ui/ButtonTab";
import CloudSpinnerPage from "@/components/ui/CloudSpinnerPage";

import CommunityRegionSelector from "./CommunityRegionSelector";
import PostCards from "./PostCards";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { useRouter } from "next/navigation";
import { useEffect, useState } from "react";

import TopDetailNavigation from "@/components/layout/TopDetailNavigation";
import CloudSpinnerPage from "@/components/loading/CloudSpinnerPage";
import CloudSpinnerPage from "@/components/ui/CloudSpinnerPage";

import CommentSection from "./CommentSection";
import Content from "./Content";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import { useRouter } from "next/navigation";
import { useEffect, useState } from "react";

import CloudSpinnerPage from "@/components/loading/CloudSpinnerPage";
import CloudSpinnerPage from "@/components/ui/CloudSpinnerPage";

import PostModifyForm from "./PostModifyForm";

Expand Down
27 changes: 11 additions & 16 deletions src/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,13 @@ import type { Metadata, Viewport } from "next";
import { Inter } from "next/font/google";
import localFont from "next/font/local";

import AppleScriptLoader from "@/components/layout/AppleScriptLoader";
import KakaoScriptLoader from "@/components/layout/KakaoScriptLoader";
import Layout from "@/components/layout/Layout";
import RootModal from "@/components/layout/RootModal";
import GlobalLayout from "@/components/layout/GlobalLayout";

import "../styles/globals.css";

import { AlertProvider } from "@/context/AlertContext";
import { LayoutProvider } from "@/context/LayoutContext";
import AppleScriptLoader from "@/lib/ScriptLoader/AppleScriptLoader";
import KakaoScriptLoader from "@/lib/ScriptLoader/KakaoScriptLoader";
import { GoogleAnalytics } from "@next/third-parties/google";

export const metadata: Metadata = {
Expand Down Expand Up @@ -46,17 +44,14 @@ export const viewport: Viewport = {

const RootLayout = ({ children }: { children: React.ReactNode }) => (
<AlertProvider>
<LayoutProvider>
<html lang="ko" className="font-serif">
<KakaoScriptLoader />
<AppleScriptLoader />
<GoogleAnalytics gaId="G-V1KLYZC1DS" />
<body className={`${pretendard.className} ${inter.className}`}>
<Layout>{children}</Layout>
<RootModal />
</body>
</html>
</LayoutProvider>
<html lang="ko" className="font-serif">
<KakaoScriptLoader />
<AppleScriptLoader />
<GoogleAnalytics gaId="G-V1KLYZC1DS" />
<body className={`${pretendard.className} ${inter.className}`}>
<GlobalLayout>{children}</GlobalLayout>
</body>
</html>
</AlertProvider>
);

Expand Down
7 changes: 0 additions & 7 deletions src/app/login/LoginContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,14 @@ import KakaoLoginButton from "./KakaoLoginButton";
import { appleOAuth2CodeResponse } from "@/types/auth";

import { emailAuthApi } from "@/api/auth";
import { useLayout } from "@/context/LayoutContext";
import { IconSolidConnectionFullBlackLogo } from "@/public/svgs";

const LoginContent = () => {
const router = useRouter();
const { setHideBottomNavigation } = useLayout();

const [email, setEmail] = useState("");
const [password, setPassword] = useState("");

useEffect(() => {
setHideBottomNavigation(true);
return () => setHideBottomNavigation(false);
}, [setHideBottomNavigation]);

const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
if (e.key === "Enter") {
handleEmailLogin();
Expand Down
10 changes: 1 addition & 9 deletions src/app/login/apple/callback/AppleLoginCallbackPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,10 @@ import axios from "axios";

import { saveAccessToken, saveRefreshToken } from "@/utils/localStorage";

import CloudSpinnerPage from "@/components/loading/CloudSpinnerPage";
import SignupSurvey from "@/components/login/signup/SignupSurvey";
import CloudSpinnerPage from "@/components/ui/CloudSpinnerPage";

import { appleAuthApi } from "@/api/auth";
import { useLayout } from "@/context/LayoutContext";

const AppleLoginCallbackPage = () => {
const router = useRouter();
Expand All @@ -20,13 +19,6 @@ const AppleLoginCallbackPage = () => {
// const [signUpToken, setSignUpToken] = useState<string>("");
// const [email, setEmail] = useState<string>("");

const { setHideBottomNavigation } = useLayout();

useEffect(() => {
setHideBottomNavigation(true);
return () => setHideBottomNavigation(false); // 컴포넌트 언마운트 시 다시 보이게 설정
}, [setHideBottomNavigation]);

useEffect(() => {
const code = searchParams?.get("code");
if (code) {
Expand Down
10 changes: 1 addition & 9 deletions src/app/login/kakao/callback/KakaoLoginCallbackPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,10 @@ import axios from "axios";

import { saveAccessToken, saveRefreshToken } from "@/utils/localStorage";

import CloudSpinnerPage from "@/components/loading/CloudSpinnerPage";
import SignupSurvey from "@/components/login/signup/SignupSurvey";
import CloudSpinnerPage from "@/components/ui/CloudSpinnerPage";

import { kakaoAuthApi } from "@/api/auth";
import { useLayout } from "@/context/LayoutContext";

const KakaoLoginCallbackPage = () => {
const router = useRouter();
Expand All @@ -22,13 +21,6 @@ const KakaoLoginCallbackPage = () => {
// const [kakaoEmail, setKakaoEmail] = useState<string>("");
// const [kakaoProfileImageUrl, setKakaoProfileImageUrl] = useState<string>("");

const { setHideBottomNavigation } = useLayout();

useEffect(() => {
setHideBottomNavigation(true);
return () => setHideBottomNavigation(false); // 컴포넌트 언마운트 시 다시 보이게 설정
}, [setHideBottomNavigation]);

useEffect(() => {
const code = searchParams?.get("code");
if (code) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,22 @@ import { useState } from "react";

import { ArticleResponse } from "@/api/article/type/response";
import { IconLikeFill, IconLikeNotFill } from "@/public/svgs/mentor";
<<<<<<< HEAD

<<<<<<< HEAD
interface MentorArticleProps {
article: ArticleResponse;
=======
import { IconLikeFill, IconLkieNotFill } from "@/public/svgs/mentor";

interface MentorArticleProps {
article: Article;
>>>>>>> upstream/main
=======

interface MentorArticleProps {
article: ArticleResponse;
>>>>>>> main
}
Comment on lines +8 to 24
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

여러 병합 충돌을 해결해주세요

이 파일에 해결되지 않은 병합 충돌이 여러 개 있습니다. 충돌 해결 시 다음 사항을 고려하세요:

  1. 아이콘 임포트: IconLkieNotFill은 오타입니다. IconLikeNotFill이 올바른 이름입니다.
  2. 타입 선택: 새로운 API 구조에 맞춰 ArticleResponse 타입을 사용하는 것이 적절해 보입니다.

다음과 같이 수정하세요:

-import { ArticleResponse } from "@/api/article/type/response";
-import { IconLikeFill, IconLikeNotFill } from "@/public/svgs/mentor";
-<<<<<<< HEAD
-
-<<<<<<< HEAD
-interface MentorArticleProps {
-  article: ArticleResponse;
-=======
-import { IconLikeFill, IconLkieNotFill } from "@/public/svgs/mentor";
-
-interface MentorArticleProps {
-  article: Article;
->>>>>>> upstream/main
-=======
-
-interface MentorArticleProps {
-  article: ArticleResponse;
->>>>>>> main
-}
+import { ArticleResponse } from "@/api/article/type/response";
+import { IconLikeFill, IconLikeNotFill } from "@/public/svgs/mentor";
+
+interface MentorArticleProps {
+  article: ArticleResponse;
+}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<<<<<<< HEAD
<<<<<<< HEAD
interface MentorArticleProps {
article: ArticleResponse;
=======
import { IconLikeFill, IconLkieNotFill } from "@/public/svgs/mentor";
interface MentorArticleProps {
article: Article;
>>>>>>> upstream/main
=======
interface MentorArticleProps {
article: ArticleResponse;
>>>>>>> main
}
import { ArticleResponse } from "@/api/article/type/response";
import { IconLikeFill, IconLikeNotFill } from "@/public/svgs/mentor";
interface MentorArticleProps {
article: ArticleResponse;
}
🧰 Tools
🪛 Biome (2.1.2)

[error] 12-13: Expected a property, or a signature but instead found '==='.

Expected a property, or a signature here.

(parse)


[error] 17-18: Expected a property, or a signature but instead found '>'.

Expected a property, or a signature here.

(parse)


[error] 22-23: Expected a property, or a signature but instead found '>'.

Expected a property, or a signature here.

(parse)


[error] 14-14: Shouldn't redeclare 'IconLikeFill'. Consider to delete it or rename it.

'IconLikeFill' is defined here:

(lint/suspicious/noRedeclare)

🤖 Prompt for AI Agents
In src/app/mentor/[id]/_ui/MentorDetialContent/_ui/MentorArticle/index.tsx
between lines 8 and 24, resolve the merge conflicts by removing all conflict
markers and duplicated code. Correct the import statement to import IconLikeFill
and IconLikeNotFill (fixing the typo from IconLkieNotFill). Use the
ArticleResponse type for the article prop to align with the new API structure.
Ensure the final code has clean imports and a single interface definition
without conflict markers.


const MentorArticle = ({ article }: MentorArticleProps) => {
Expand Down
2 changes: 1 addition & 1 deletion src/app/mentor/[id]/_ui/MentorDetialContent/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import ProfileWithBadge from "@/components/ui/ProfileWithBadge";

import MentorArticle from "./_ui/MentorArticle";

import useGetArticleList from "@/api/article/client/useGetAriticleList";
import useGetArticleList from "@/api/article/client/useGetArticleList";
import useGetMentorDetailPage from "@/api/mentor/client/useGetMentorDetailPage";
import { ChannelType } from "@/api/mentor/type/response";
import { customConfirm } from "@/lib/zustand/useConfirmModalStore";
Expand Down
20 changes: 20 additions & 0 deletions src/app/mentor/_ui/MentorClient/_ui/MentorFindSection/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,31 @@ import useGetMentorList from "@/api/mentor/client/useGetMentorList";

const MentorFindSection = () => {
const [selectedFilter, setSelectedFilter] = useState<FilterTab>(FilterTab.ALL);
<<<<<<< HEAD
<<<<<<< HEAD
=======
>>>>>>> main
const { page, lastElementRef } = useInfinityScroll();
const { mentorList } = useGetMentorList({
page,
region: selectedFilter !== FilterTab.ALL ? selectedFilter : undefined,
});
<<<<<<< HEAD
=======
const mentorListData = getMentorListData();

const filteredMentors = useMemo(() => {
return mentorListData.filter((mentor) => {
if (selectedFilter === FilterTab.ALL) return true;
if (selectedFilter === FilterTab.EUROPE) return mentor.country === FilterTab.EUROPE;
if (selectedFilter === FilterTab.AMERICAS) return mentor.country === FilterTab.AMERICAS;
if (selectedFilter === FilterTab.ASIA) return mentor.country === FilterTab.ASIA;
return false;
});
}, [mentorListData, selectedFilter]);
Comment on lines +27 to +37
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot Jul 31, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

필터링 로직 개선이 필요합니다

병합 충돌 해결 시 필터링 로직을 포함하기로 결정하신다면, 다음 문제들을 해결해야 합니다:

  1. 누락된 import 추가:

    • useMemo를 React에서 import
    • getMentorListData 함수 import
  2. 잘못된 필터링 비교 로직:

    • mentor.country(문자열)를 FilterTab enum 값과 비교하고 있어 항상 false를 반환합니다
    • 국가별 필터링을 위한 적절한 매핑이 필요합니다
  3. 데이터 소스 충돌:

    • API 데이터(mentorList)와 목 데이터(mentorListData)를 동시에 사용하고 있습니다
    • 하나의 데이터 소스를 선택해야 합니다

API 데이터를 사용하는 현재 구현을 유지하는 것을 권장합니다. 필터링은 이미 useGetMentorList 훅에서 처리되고 있습니다.

🤖 Prompt for AI Agents
In src/app/mentor/_ui/MentorClient/_ui/MentorFindSection/index.tsx lines 27 to
37, the filtering logic has multiple issues: useMemo and getMentorListData are
not imported, mentor.country is incorrectly compared to FilterTab enum values
causing always false results, and there is a conflict between using API data and
mock data simultaneously. To fix this, import useMemo and getMentorListData if
needed, but preferably remove the manual filtering here and rely on the
filtering already done by the useGetMentorList hook to maintain a single data
source and correct filtering logic.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 부분 기능구현시 추후 삭제 에정입니다

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@manNomi 알겠습니다! 기능 구현 시 해당 부분을 삭제할 예정이시라면 현재 상태로 두시는 것이 맞습니다.

임시 코드에 대한 명확한 설명 감사합니다. 추후 기능 완성 시 깔끔하게 정리되겠네요.


✏️ Learnings added
Learnt from: manNomi
PR: solid-connection/solid-connect-web#203
File: src/app/mentor/_ui/MentorClient/_ui/MentorFindSection/index.tsx:27-37
Timestamp: 2025-07-31T10:48:45.913Z
Learning: In the solid-connect-web project, manNomi handles merge conflicts and temporary code by leaving it in place during development with plans to remove it during proper feature implementation, rather than immediately fixing non-critical temporary code.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.


🧠 Learnings used
Learnt from: manNomi
PR: solid-connection/solid-connect-web#195
File: src/app/mento/modify/_components/MentoArticlePanel/index.tsx:7-7
Timestamp: 2025-07-20T09:46:18.121Z
Learning: In the solid-connect-web project, the team prefers using "mentor" terminology over "mento" for consistency. They are currently in the process of unifying all naming from "mento" to "mentor" including page routes, component names, and other references.

Learnt from: manNomi
PR: solid-connection/solid-connect-web#195
File: src/app/mento/_components/MentorPageTabs/_components/MentorDropDown/index.tsx:21-31
Timestamp: 2025-07-20T09:46:19.818Z
Learning: In TypeScript projects, manNomi prefers simpler solutions over complex type safety measures when the added complexity outweighs the benefits, especially for controlled components with statically defined enum values.

>>>>>>> upstream/main
=======
>>>>>>> main
Comment on lines +16 to +40
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot Jul 31, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

병합 충돌을 해결해주세요

현재 코드에 해결되지 않은 병합 충돌 마커가 있습니다. 이로 인해 빌드가 실패합니다.

다음과 같이 수정하세요:

-<<<<<<< HEAD
-<<<<<<< HEAD
-=======
->>>>>>> main
   const { page, lastElementRef } = useInfinityScroll();
   const { mentorList } = useGetMentorList({
     page,
     region: selectedFilter !== FilterTab.ALL ? selectedFilter : undefined,
   });
-<<<<<<< HEAD
-=======
-  const mentorListData = getMentorListData();
-
-  const filteredMentors = useMemo(() => {
-    return mentorListData.filter((mentor) => {
-      if (selectedFilter === FilterTab.ALL) return true;
-      if (selectedFilter === FilterTab.EUROPE) return mentor.country === FilterTab.EUROPE;
-      if (selectedFilter === FilterTab.AMERICAS) return mentor.country === FilterTab.AMERICAS;
-      if (selectedFilter === FilterTab.ASIA) return mentor.country === FilterTab.ASIA;
-      return false;
-    });
-  }, [mentorListData, selectedFilter]);
->>>>>>> upstream/main
-=======
->>>>>>> main

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 Biome (2.1.2)

[error] 24-26: Expected a statement but instead found '<<<<<<< HEAD
======='.

Expected a statement here.

(parse)


[error] 37-40: Expected a statement but instead found '>>>>>>> upstream/main

main'.

Expected a statement here.

(parse)

🤖 Prompt for AI Agents
In src/app/mentor/_ui/MentorClient/_ui/MentorFindSection/index.tsx between lines
16 and 40, there are unresolved merge conflict markers (<<<<<<<, =======,
>>>>>>>) present in the code. Remove all these conflict markers and ensure the
code is properly merged by choosing the correct logic or combining both changes
as needed to maintain functionality and allow the project to build successfully.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이미 해결된 사항입니다

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧩 Analysis chain

@manNomi 확인해보겠습니다.


🏁 Script executed:

#!/bin/bash
# Check the current state of the file to verify if merge conflicts are resolved
cat "src/app/mentor/_ui/MentorClient/_ui/MentorFindSection/index.tsx"

Length of output: 2525


@manNomi 확인해보니 현재 파일에는 여전히 병합 충돌 마커들이 남아있는 것으로 보입니다:

16-18번 라인:

<<<<<<< HEAD
<<<<<<< HEAD
=======
>>>>>>> main

24-33번 라인:

<<<<<<< HEAD
=======
  const mentorListData = getMentorListData();
  // ... 필터링 로직
>>>>>>> upstream/main
=======
>>>>>>> main

로컬에서 해결하셨다면 변경사항을 푸시해주세요. 혹시 다른 파일을 말씀하신 건가요? 🤔

  (\   /)
 ( ._.)
o_(")(")

🧬 Code Graph Analysis Results

Possibly relevant snippets from src/utils/mockingGetData.ts (lines 25-72)

export const getMentorListData = () => {
  const mentors: Mentor[] = [
    {
      id: 1,
      profileImageUrl: undefined,
      nickname: "김솔거너",
      country: "미국",
      universityName: "노스캐롤라이나 웨일런대학교(A성)",
      studyStatus: MentorStudyStatus.STUDYING,
      menteeCount: 7,
      hasBadge: true,
      introduction: "안녕하세요! 저는 미국 노스캐롤라이나 웨일런대학교에서 교환학생을 3년간 재학중인 김솔거너입니다!",
      channels: [
        { type: ChannelType.BLOG, url: "https://blog.example.com" },
        { type: ChannelType.BRUNCH, url: "https://brunch.example.com" },
      ],
      isApplied: false,
    },
    {
      id: 2,
      profileImageUrl: undefined,
      nickname: "박솔거너",
      country: "스웨덴",
      universityName: "보라스대학",
      studyStatus: MentorStudyStatus.SCHEDULED,
      menteeCount: 0,
      hasBadge: false,
      introduction: "안녕하세요! 스웨덴 교환학생입니다.",
      channels: [],
      isApplied: false,
    },
    {
      id: 3,
      profileImageUrl: undefined,
      nickname: "정솔거너",
      country: "독일",
      universityName: "푸르트바겐스마르크 경영실무대학교",
      studyStatus: MentorStudyStatus.COMPLETED,
      menteeCount: 7,
      hasBadge: true,
      introduction: "독일 교환학생 경험을 나누고 싶습니다.",
      channels: [],
      isApplied: false,
    },
  ];

  return mentors;
};
  • This function returns a static list of mentor objects with detailed properties such as id, nickname, country, universityName, studyStatus, menteeCount, hasBadge, introduction, channels, and isApplied.
  • It is relevant because the main file references getMentorListData() in a commented-out or alternative code block for filtering mentors by region.
  • The mentor data structure and fields here provide context for how mentors are represented and filtered in the UI component.

🧠 Learnings used
Learnt from: manNomi
PR: solid-connection/solid-connect-web#195
File: src/app/mento/modify/_components/MentoArticlePanel/index.tsx:7-7
Timestamp: 2025-07-20T09:46:18.121Z
Learning: In the solid-connect-web project, the team prefers using "mentor" terminology over "mento" for consistency. They are currently in the process of unifying all naming from "mento" to "mentor" including page routes, component names, and other references.

Learnt from: manNomi
PR: solid-connection/solid-connect-web#195
File: src/app/mento/_components/MentorPageTabs/_components/MentorDropDown/index.tsx:21-31
Timestamp: 2025-07-20T09:46:19.818Z
Learning: In TypeScript projects, manNomi prefers simpler solutions over complex type safety measures when the added complexity outweighs the benefits, especially for controlled components with statically defined enum values.


return (
<div className="px-4">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ const MyMentorSection = () => {
<>
<h2 className="text-lg font-bold text-gray-900">나의 멘토 페이지</h2>
<div className="mt-[14px]">
<MentorCard key={myMentorProfile.id} isMine mentor={myMentorProfile} />
<MentorCard key={myMentorProfile?.id} isMine mentor={myMentorProfile} />
</div>
</>
);
Expand Down
8 changes: 8 additions & 0 deletions src/app/mentor/_ui/MentorClient/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,15 @@ const MentorClient = () => {
const isMentor = false;
return (
<>
<<<<<<< HEAD
<<<<<<< HEAD
{isMentor ? (
=======
{!isMentor ? (
>>>>>>> upstream/main
=======
{isMentor ? (
>>>>>>> main
Comment on lines +10 to +18
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Git 병합 충돌을 해결해야 합니다.

코드에 병합 충돌 마커(<<<<<<<, =======, >>>>>>>)가 남아있어서 파일이 파싱되지 않습니다.

로직을 보면 isMentortrue일 때 멘토 페이지를, false일 때 멘티 페이지를 보여주는 것이 맞습니다.

다음 diff를 적용하여 병합 충돌을 해결하세요:

-<<<<<<< HEAD
-<<<<<<< HEAD
-      {isMentor ? (
-=======
-      {!isMentor ? (
->>>>>>> upstream/main
-=======
       {isMentor ? (
->>>>>>> main

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 Biome (2.1.2)

[error] 11-11: Expected a type parameter but instead found '<<<<<<'.

Expected a type parameter here.

(parse)


[error] 11-11: expected , but instead found HEAD

Remove HEAD

(parse)


[error] 12-12: expected , but instead found {

Remove {

(parse)


[error] 12-13: Expected a parameter but instead found '==='.

Expected a parameter here.

(parse)


[error] 14-14: expected ... but instead found !

Remove !

(parse)


[error] 14-15: Expected an expression for the left hand side of the >>> operator.

This operator requires a left hand side value

(parse)


[error] 15-15: Expected an expression but instead found '>>>'.

Expected an expression here.

(parse)


[error] 15-15: Expected an expression but instead found '>'.

Expected an expression here.

(parse)


[error] 16-16: Expected an expression but instead found '==='.

Expected an expression here.

(parse)


[error] 16-16: Expected an expression but instead found '='.

Expected an expression here.

(parse)


[error] 14-16: Invalid assignment to >>>>>>> upstream/main ======

This expression cannot be assigned to

(parse)


[error] 17-17: expected , but instead found ?

Remove ?

(parse)


[error] 17-18: expected , but instead found >

Remove >

(parse)


[error] 18-18: Expected an expression but instead found '>>>'.

Expected an expression here.

(parse)


[error] 18-18: Expected an expression but instead found '>'.

Expected an expression here.

(parse)


[error] 10-28: Expected corresponding JSX closing tag for 'HEAD'.

Opening tag

closing tag

(parse)

🤖 Prompt for AI Agents
In src/app/mentor/_ui/MentorClient/index.tsx around lines 10 to 18, there are
leftover Git merge conflict markers causing parsing errors. Remove all conflict
markers (<<<<<<<, =======, >>>>>>>) and ensure the conditional rendering uses
{isMentor ? ( ... ) : ( ... )} to show the mentor page when isMentor is true and
the mentee page when false, reflecting the intended logic.

// 멘토페이지
<>
{/* 나의 멘토 - 멘티 탭 및 채팅카드 */}
Expand Down
4 changes: 2 additions & 2 deletions src/app/mentor/chat/[chatId]/_ui/ChatContent/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { useForm } from "react-hook-form";

import ProfileWithBadge from "@/components/ui/ProfileWithBadge";

import ChatMessageBox from "./_components/ChatMessageBox";
import ChatMessageBox from "./_ui/ChatMessageBox";

import { ChatMessage } from "@/types/mentor";

Expand Down Expand Up @@ -131,7 +131,7 @@ const ChatContent = () => {
</div>

{/* 메시지 입력 영역 - 하단 고정 */}
<div className="shadow-top w-full border-b border-t border-k-50 bg-k-0">
<div className="w-full border-b border-t border-k-50 bg-k-0 shadow-top">
<form onSubmit={handleSubmit(onSubmit)} className="flex items-center gap-2 p-4">
<button className="h-[18px] w-5">
<IconCamera />
Expand Down
4 changes: 2 additions & 2 deletions src/app/mentor/chat/[chatId]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Metadata } from "next";

import ChatContent from "./_components/ChatContent";
import ChatNavBar from "./_components/ChatNavBar";
import ChatContent from "./_ui/ChatContent";
import ChatNavBar from "./_ui/ChatNavBar";

export const metadata: Metadata = {
title: "멘토와 채팅 | Solid Connect",
Expand Down
Loading