Skip to content

MENTOR_STUDY 참여 여부 필터링 버그 수정#556

Merged
HA-SEUNG-JEONG merged 3 commits into
developfrom
fix/my-study
Apr 10, 2026
Merged

MENTOR_STUDY 참여 여부 필터링 버그 수정#556
HA-SEUNG-JEONG merged 3 commits into
developfrom
fix/my-study

Conversation

@HA-SEUNG-JEONG

@HA-SEUNG-JEONG HA-SEUNG-JEONG commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

Summary

  • 내 스터디 섹션에서 참여 중인 스터디 ID Set 생성 시 프론트엔드에서 status를 재필터링하던 로직 제거
  • 백엔드 V2 API는 MENTOR_STUDY의 statusnull로 반환하므로, IN_PROGRESS || RECRUITING 조건이 항상 false가 되어 참여 중인 MENTOR_STUDY가 목록에서 제외되는 버그 수정
  • status 필터링은 API 쿼리 파라미터(NOT_COMPLETED)에서 이미 처리되므로 프론트엔드 재필터링이 불필요함

Changes

Bug Fixes

File Description
src/components/group-study/section/my-participating-studies-section.tsx participatingStudyIds 생성 시 status 조건 제거, type 필터만 유지

Test plan

  • MENTOR_STUDY(프리미엄 스터디) 참여 중인 유저로 로그인 후 홈 화면에서 내 스터디 섹션에 MENTOR_STUDY가 정상 노출되는지 확인
  • 일반 GROUP_STUDY 참여 중인 유저로 로그인 후 내 스터디 섹션에 정상 노출되는지 확인
  • 두 타입 스터디 모두 참여 중인 경우 각각의 탭에서 올바르게 필터링되는지 확인

🤖 Generated with Claude Code

Summary by CodeRabbit

릴리스 노트

  • 버그 수정
    • 참여 중인 스터디 섹션이 멘토 스터디(MENTOR_STUDY) 분류를 지원하도록 업데이트되었습니다.
    • 클라이언트 측 상태 필터를 제거하고 서버(API)의 상태 기반 필터링으로 통일되어 목록 정확도가 향상되었습니다(백엔드에서 일부 멘토 스터디의 상태가 null일 수 있음).

@vercel

vercel Bot commented Apr 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
study-platform-client-dev Error Error Apr 10, 2026 7:07am

@coderabbitai

coderabbitai Bot commented Apr 10, 2026

Copy link
Copy Markdown

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: f3412e01-805b-472c-907a-fb1fb2f33b8b

📥 Commits

Reviewing files that changed from the base of the PR and between 55e8d7d and 4102ba0.

📒 Files selected for processing (2)
  • src/components/group-study/pages/premium-study-list-page.tsx
  • src/components/group-study/section/my-participating-studies-section.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/components/group-study/section/my-participating-studies-section.tsx

📝 Walkthrough

Walkthrough

MyParticipatingStudiesSection의 classificationMENTOR_STUDY를 추가하고, 쿼리 매핑 및 참여 스터디 ID 생성에서 클라이언트 측 study.status 필터링을 제거하여 API(studyStatus: 'NOT_COMPLETED')에 상태 필터링을 위임하도록 변경했습니다.

Changes

Cohort / File(s) Summary
컴포넌트 변경
src/components/group-study/section/my-participating-studies-section.tsx
classification 타입에서 PREMIUM_STUDYMENTOR_STUDY로 변경. CLASSIFICATION_TO_STUDY_TYPE 매핑 업데이트. useMemberStudyListV2QuerystudyTypeMENTOR_STUDY로 전달되도록 조정. 클라이언트 측 study.status(IN_PROGRESS/RECRUITING) 재필터링 제거; 상태 필터링은 API(studyStatus: 'NOT_COMPLETED')가 처리한다고 주석 보강. participatingStudyIdsstudy.type 기준 필터링만 유지.
페이지 사용부 업데이트
src/components/group-study/pages/premium-study-list-page.tsx
MyParticipatingStudiesSection 호출에서 classification="PREMIUM_STUDY""MENTOR_STUDY"로 변경(동작 상 다른 로직 변경 없음).

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 분

Possibly related PRs

Poem

🐰
분류 한 줄 바꿨더니, 흐름이 슬쩍 정돈되네.
상태는 뒤에서 지키고, 프론트는 가볍게.
당근 한 조각, 코드 한 줄—
훌쩍 날아오르는 새벽의 리팩토링.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 PR의 주요 변화를 명확하게 요약합니다. MENTOR_STUDY 참여 여부 필터링 버그 수정이 정확히 이 PR의 핵심 변화입니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/my-study

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@HA-SEUNG-JEONG HA-SEUNG-JEONG self-assigned this Apr 10, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/group-study/section/my-participating-studies-section.tsx`:
- Around line 66-70: The current re-filtering using CLASSIFICATION_TO_STUDY_TYPE
and study.type (in the block that builds `filtered` from
`myStudiesData.content`) can exclude legacy items (e.g., type='MENTORING');
remove this additional `study.type === studyType` filter and instead derive
`participatingStudyIds` directly from `myStudiesData.content` (or use the
API-provided classification/studyType that was sent) so all returned content is
preserved; update any downstream usage that references `filtered` to use the
full `myStudiesData.content` (or a properly mapped version) and keep references
to `CLASSIFICATION_TO_STUDY_TYPE`, `studyType`, `myStudiesData.content`, and
`participatingStudyIds` to locate the change.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: ead97ffc-ef27-47f0-8d44-60e06c7be3d4

📥 Commits

Reviewing files that changed from the base of the PR and between 1691715 and 55e8d7d.

📒 Files selected for processing (1)
  • src/components/group-study/section/my-participating-studies-section.tsx

Comment on lines 66 to 70
const studyType = CLASSIFICATION_TO_STUDY_TYPE[classification];

const filtered = myStudiesData.content.filter(
(study) =>
(study.status === 'IN_PROGRESS' || study.status === 'RECRUITING') &&
study.type === studyType,
(study) => study.type === studyType,
);

@coderabbitai coderabbitai Bot Apr 10, 2026

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 | 🟠 Major

type 재필터링이 남아 있어 레거시 참여 스터디가 다시 누락될 수 있습니다.

studyType는 이미 API 요청에서 전달되고 있으므로, 여기서 study.type을 다시 비교하면 레거시 값(MENTORING) 케이스가 제외될 수 있습니다. participatingStudyIds는 응답 content 전체에서 바로 구성하는 쪽이 안전합니다.

수정 제안
-    const studyType = CLASSIFICATION_TO_STUDY_TYPE[classification];
-
-    const filtered = myStudiesData.content.filter(
-      (study) => study.type === studyType,
-    );
-
-    return new Set(filtered.map((study) => study.studyId));
+    return new Set(myStudiesData.content.map((study) => study.studyId));

Based on learnings: In code-zero-to-one/study-platform-client, existing DB records include classification='GROUP_STUDY' with type='MENTORING', so strict frontend type re-filtering can exclude valid items.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/group-study/section/my-participating-studies-section.tsx`
around lines 66 - 70, The current re-filtering using
CLASSIFICATION_TO_STUDY_TYPE and study.type (in the block that builds `filtered`
from `myStudiesData.content`) can exclude legacy items (e.g., type='MENTORING');
remove this additional `study.type === studyType` filter and instead derive
`participatingStudyIds` directly from `myStudiesData.content` (or use the
API-provided classification/studyType that was sent) so all returned content is
preserved; update any downstream usage that references `filtered` to use the
full `myStudiesData.content` (or a properly mapped version) and keep references
to `CLASSIFICATION_TO_STUDY_TYPE`, `studyType`, `myStudiesData.content`, and
`participatingStudyIds` to locate the change.

@HA-SEUNG-JEONG HA-SEUNG-JEONG Apr 10, 2026

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.

회원의 참여 스터디 조회 요청 시(v2)

이렇게 응답이 내려오고 있어.

{
    "statusCode": 200,
    "timestamp": "2026-04-10T14:14:32.259494826",
    "content": {
        "content": [
            {
                "studyId": 62,
                "thumbnail": {
                    "imageId": 80157,
                    "resizedImages": [
                        {
                            "resizedImageId": 157,
                            "resizedImageUrl": "https://test-api.zeroone.it.kr/images/group-study-thumbnail/a032cb52-d430-4754-b008-e4ddfe563bc3_1775612256117.jpeg",
                            "imageSizeType": {
                                "imageTypeName": "ORIGINAL",
                                "width": null,
                                "height": null
                            }
                        }
                    ]
                },
                "title": "디자이너",
                "maxMembersCount": 6,
                "participantsCount": 2,
                "startTime": "2026-04-09T00:00:00",
                "endTime": "2026-04-16T00:00:00",
                "studyRole": "LEADER",
                "status": "IN_PROGRESS",
                "type": "GROUP_STUDY"
            },
            {
                "studyId": 60,
                "thumbnail": {
                    "imageId": 80155,
                    "resizedImages": [
                        {
                            "resizedImageId": 155,
                            "resizedImageUrl": "https://test-api.zeroone.it.kr/images/group-study-thumbnail/e132a2de-0487-470a-a1d9-999af98d467b_1775531732165.jpeg",
                            "imageSizeType": {
                                "imageTypeName": "ORIGINAL",
                                "width": null,
                                "height": null
                            }
                        }
                    ]
                },
                "title": "멘토스터디 테스트",
                "maxMembersCount": 11,
                "participantsCount": 1,
                "startTime": "2026-04-08T00:00:00",
                "endTime": "2026-04-15T00:00:00",
                "studyRole": "LEADER",
                "status": null,
                "type": "MENTOR_STUDY"
            },
            {
                "studyId": 59,
                "thumbnail": {
                    "imageId": 80154,
                    "resizedImages": [
                        {
                            "resizedImageId": 154,
                            "resizedImageUrl": "https://test-api.zeroone.it.kr/images/group-study-thumbnail/7d6bc39a-b94a-4fd3-9174-4e242cfed651_1775480552977.png",
                            "imageSizeType": {
                                "imageTypeName": "ORIGINAL",
                                "width": null,
                                "height": null
                            }
                        }
                    ]
                },
                "title": "문의삭제를 위한 새로운 스터디 개설",
                "maxMembersCount": 2,
                "participantsCount": 2,
                "startTime": "2026-04-07T00:00:00",
                "endTime": "2026-04-13T00:00:00",
                "studyRole": "LEADER",
                "status": "IN_PROGRESS",
                "type": "GROUP_STUDY"
            },
            {
                "studyId": 6,
                "thumbnail": null,
                "title": null,
                "maxMembersCount": 2,
                "participantsCount": 2,
                "startTime": "2026-04-06T00:00:00",
                "endTime": "2026-04-11T00:00:00",
                "studyRole": "PARTICIPANT",
                "status": "IN_PROGRESS",
                "type": "ONE_ON_ONE_STUDY"
            },
            {
                "studyId": 55,
                "thumbnail": {
                    "imageId": 80118,
                    "resizedImages": [
                        {
                            "resizedImageId": 118,
                            "resizedImageUrl": "https://test-api.zeroone.it.kr/images/group-study-thumbnail/caeadbc4-6543-4811-ab71-b50e0116a31e_1775298990423.webp",
                            "imageSizeType": {
                                "imageTypeName": "ORIGINAL",
                                "width": null,
                                "height": null
                            }
                        }
                    ]
                },
                "title": "토스 기획",
                "maxMembersCount": 5,
                "participantsCount": 2,
                "startTime": "2026-04-06T00:00:00",
                "endTime": "2026-04-11T00:00:00",
                "studyRole": "LEADER",
                "status": "IN_PROGRESS",
                "type": "GROUP_STUDY"
            }
        ],
        "page": 1,
        "size": 6,
        "totalElements": 5,
        "totalPages": 1,
        "hasNext": false,
        "hasPrevious": false
    },
    "message": null
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@HA-SEUNG-JEONG, 공유해 주신 실제 API 응답을 보니 제 코멘트가 잘못되었습니다. 사과드립니다.

응답에 type: "ONE_ON_ONE_STUDY" (studyId: 6) 항목이 포함되어 있는 것처럼, V2 API는 studyType 쿼리 파라미터를 보내도 여러 타입을 혼합하여 반환합니다. 따라서 현재 PR의 study.type === studyType 재필터링은 정확히 필요한 로직입니다 — 이 필터 없이 전체 content를 그대로 사용하면 ONE_ON_ONE_STUDY ID가 participatingStudyIds에 포함되어 하위 필터링에서 잘못된 매칭이 발생할 수 있습니다.

현재 구현이 올바릅니다. 제 코멘트를 무시해 주세요.


✏️ Learnings added
Learnt from: HA-SEUNG-JEONG
Repo: code-zero-to-one/study-platform-client PR: 556
File: src/components/group-study/section/my-participating-studies-section.tsx:66-70
Timestamp: 2026-04-10T05:29:23.692Z
Learning: In `code-zero-to-one/study-platform-client`, the V2 member study list API (`useMemberStudyListV2Query`) returns mixed study types in a single response (e.g., GROUP_STUDY, MENTOR_STUDY, ONE_ON_ONE_STUDY) even when a specific `studyType` query parameter is passed. Therefore, the frontend MUST re-filter by `study.type === studyType` when building the `participatingStudyIds` Set in `src/components/group-study/section/my-participating-studies-section.tsx`. Removing this type filter would incorrectly include unrelated study types (like ONE_ON_ONE_STUDY) in the ID set.

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: seong-jin-jo
Repo: code-zero-to-one/study-platform-client PR: 370
File: src/components/section/my-participating-studies-section.tsx:81-89
Timestamp: 2026-02-03T18:49:58.709Z
Learning: The component `src/components/section/my-participating-studies-section.tsx` is a temporary implementation that fetches all studies and filters them client-side against the user's participating study ID set. This approach is used due to the lack of a suitable backend API. The component should be refactored or potentially removed in the future when a proper backend API becomes available.

Learnt from: HA-SEUNG-JEONG
Repo: code-zero-to-one/study-platform-client PR: 379
File: src/features/study/group/ui/step/step1-group.tsx:61-65
Timestamp: 2026-02-05T02:17:57.573Z
Learning: In the repository `code-zero-to-one/study-platform-client`, there are existing database records where `classification='GROUP_STUDY'` and `type='MENTORING'`. When editing such records in `src/features/study/group/ui/step/step1-group.tsx`, the form must handle the case where the loaded type value is filtered out from the available options.

Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 439
File: src/features/mentoring/ui/registration/mentor-career-entries-editor.tsx:376-376
Timestamp: 2026-03-23T14:43:32.829Z
Learning: In `code-zero-to-one/study-platform-client`, the settlement (정산) feature is intentionally under development and not yet finalized. Do not flag the replacement of settlement verification status (완료/미완료) with placeholder text as a regression — the settlement contract between frontend and backend does not yet exist. This applies to files like `src/features/admin/mentoring/ui/mentor-applications-page-client.tsx`.

Learnt from: HA-SEUNG-JEONG
Repo: code-zero-to-one/study-platform-client PR: 441
File: src/types/schemas/group-study-form.schema.ts:30-37
Timestamp: 2026-03-24T06:57:32.892Z
Learning: In `code-zero-to-one/study-platform-client`, the `type` field in `GroupStudyBaseObjectSchema` (defined in `src/types/schemas/group-study-form.schema.ts`) is intentionally required (`z.enum(STUDY_TYPES)`) and must NOT be made optional. When handling legacy records with `type='MENTORING'` (not in STUDY_TYPES), the correct fix is to update the data-mapping function (e.g., `refineStudyDetail()`) to map the invalid value to a valid fallback (e.g., 'PROJECT') rather than `undefined`, so the schema stays strict.

Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 439
File: src/features/mentoring/model/mentor-registration-preview.ts:286-294
Timestamp: 2026-03-23T14:43:33.363Z
Learning: In `src/features/mentoring/model/mentor-registration-preview.ts` `getChangedSections`, only `companyName` and `hideCompanyName` need to be compared for the `headline` highlight section — `companyCategory` does NOT affect the headline display in `src/features/mentoring/ui/detail/mentor-detail-page.tsx`.

Learnt from: HA-SEUNG-JEONG
Repo: code-zero-to-one/study-platform-client PR: 435
File: src/hooks/common/use-reminder-review.tsx:0-0
Timestamp: 2026-03-21T07:12:53.063Z
Learning: In `code-zero-to-one/study-platform-client`, `StudyReviewModalStateResponse.targetStudySpaceId` is typed as `number` (not `number | null`). Do not suggest `?? undefined` normalization for this field — it is unnecessary as there is no null case in the type.

Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 451
File: src/features/mentoring/ui/registration/step-content/mentor-registration-pricing-step.constants.ts:25-26
Timestamp: 2026-03-25T19:29:42.728Z
Learning: In `code-zero-to-one/study-platform-client`, `contactEmail` and `contactCountryCode` are legacy dead fields that remain only in schema/model/preview/api mapper code but are no longer exposed in the mentor registration UI. `contactPhone` is still a hidden field written via `setValue('contactPhone', ...)` from identity verification in `use-mentor-registration-controller.ts`. If these dead fields are flagged as missing from merge logic, the correct resolution is to remove them from the frontend entirely rather than restoring them in session draft merge. Do not treat their absence from merge as a Major regression.

Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 451
File: src/features/mentoring/ui/registration/step-content/mentor-registration-mentor-information-step.tsx:12-12
Timestamp: 2026-03-25T19:29:57.833Z
Learning: In `code-zero-to-one/study-platform-client`, `contactEmail` and `contactCountryCode` are legacy dead fields that only exist in the frontend schema/model/preview/api mapper (e.g., `src/types/schemas/mentor-registration-schema.ts`, `src/features/mentoring/api/mentor-settings.mapper.ts`, `src/features/mentoring/model/use-mentor-registration-preview-model.ts`). They are NOT shown in the registration UI. `contactPhone` is still a live hidden field set via `setValue('contactPhone', ...)` from identity verification results in `src/features/mentoring/model/use-mentor-registration-controller.ts`. Do not flag missing `contactEmail` in merge logic as a Major bug; the correct direction is to remove these dead fields from the frontend entirely.

Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 451
File: src/features/mentoring/ui/registration/step-content/mentor-registration-schedule-step.tsx:9-9
Timestamp: 2026-03-25T19:29:36.394Z
Learning: In `code-zero-to-one/study-platform-client`, `contactEmail` and `contactCountryCode` are legacy dead fields remaining in `src/types/schemas/mentor-registration-schema.ts`, `src/features/mentoring/api/mentor-settings.mapper.ts`, and `src/features/mentoring/model/use-mentor-registration-preview-model.ts`. There is no UI input for these fields in the current registration form (`src/features/mentoring/ui/registration/step-content/mentor-registration-basic-information-step.tsx`). `contactPhone` is still alive as a hidden saved field updated via `setValue('contactPhone', ...)` from phone verification in the controller. The correct remediation direction for `contactEmail`/`contactCountryCode` is to remove these dead fields from the frontend entirely, not to patch the merge/session draft logic.

Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 451
File: src/features/mentoring/ui/registration/step-content/mentor-registration-pricing-step.tsx:17-18
Timestamp: 2026-03-25T19:29:35.110Z
Learning: In `code-zero-to-one/study-platform-client`, `contactEmail` and `contactCountryCode` are legacy dead fields that remain only in schema/model/preview/API mapper layers (`src/types/schemas/mentor-registration-schema.ts`, `src/features/mentoring/api/mentor-settings.mapper.ts`, `src/features/mentoring/model/use-mentor-registration-preview-model.ts`). There is no UI input for `contactEmail` in the current registration flow. `contactPhone` is still active as a hidden field populated by the identity verification controller. The appropriate fix direction is to remove the dead `contactEmail`/`contactCountryCode` fields from the frontend entirely, not to treat their absence from session draft merge as a Major bug.

Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 439
File: src/features/admin/mentoring/ui/mentor-applications-page-client.tsx:292-292
Timestamp: 2026-03-23T14:42:57.176Z
Learning: In `code-zero-to-one/study-platform-client`, the mentoring apply (`/apply`) flow is intentionally blocked at the product level in the current development stage. `src/features/mentoring/ui/apply/mentoring-apply-route-client.tsx` always renders `MentorRouteUnavailableState` regardless of readiness state, and `src/features/mentoring/ui/detail/mentor-detail-sidebar-cta.tsx` follows the same policy. Do not flag this as a functional regression or bug — it is an intentional product policy.

Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 439
File: src/features/admin/mentoring/ui/mentor-applications-page-client.tsx:292-292
Timestamp: 2026-03-23T14:42:57.176Z
Learning: In `code-zero-to-one/study-platform-client`, the settlement (정산) contract/API integration is intentionally not yet implemented. The `settlementDraft` field and its `verified` status on `MentorSettings` should not be treated as a source of truth for settlement readiness. The admin UI in `src/features/admin/mentoring/ui/mentor-applications-page-client.tsx` intentionally shows a placeholder message ("서버 정산 readiness 계약 필요") for the settlement verification field until the server-side settlement contract is established. Do not flag this as a regression.

Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 439
File: src/features/mentoring/ui/apply/mentoring-apply-route-client.tsx:80-87
Timestamp: 2026-03-23T14:43:28.726Z
Learning: In `code-zero-to-one/study-platform-client`, the mentoring application flow (`/mentoring/[id]/apply`) is intentionally blocked for all mentors regardless of `isApplicationReady` status. The `/apply` route client (`src/features/mentoring/ui/apply/mentoring-apply-route-client.tsx`) always returns `MentorRouteUnavailableState` with `MENTOR_APPLY_UNSUPPORTED_MESSAGE` as a deliberate product policy while the application submission feature is still under development. Do not flag this as a bug. The sidebar CTA in `src/features/mentoring/ui/detail/mentor-detail-sidebar-cta.tsx` follows the same premise.

Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 439
File: src/features/mentoring/ui/registration/mentor-career-entries-editor.tsx:376-376
Timestamp: 2026-03-23T14:43:32.829Z
Learning: In `code-zero-to-one/study-platform-client`, the mentoring application (/apply) route is intentionally blocked as a product policy — mentoring applications are not yet supported. Do not flag `src/features/mentoring/ui/apply/mentoring-apply-route-client.tsx` always rendering an unavailable state as a bug; it is deliberate. The same policy is reflected in `src/features/mentoring/ui/detail/mentor-detail-sidebar-cta.tsx`.

Learnt from: HA-SEUNG-JEONG
Repo: code-zero-to-one/study-platform-client PR: 415
File: src/components/common/layout/page-container.tsx:14-14
Timestamp: 2026-03-08T13:57:25.733Z
Learning: In this project, treat 'w-7xl' as a valid Tailwind CSS v4 width utility (from the container scale) equivalent to 80rem (1280px). Do not flag 'w-7xl' as non-existent; it is a semantic, preferred replacement for 'w-[1280px]'. Apply this guidance to TSX files across the codebase.

Learnt from: HA-SEUNG-JEONG
Repo: code-zero-to-one/study-platform-client PR: 427
File: src/components/common/ui/avatar-stack.tsx:75-75
Timestamp: 2026-03-16T03:02:43.294Z
Learning: In TSX files, do not flag Tailwind class usages that map to project CSS tokens defined in the global CSS (e.g., --color-gray-200: `#e9eaeb` in src/app/global.css) such as border-gray-200, bg-gray-200, or text-gray-200, since they are intentional custom tokens. Treat these as valid project token usages and avoid false positives. If enforcing, document this as a repository-wide exception and consider an automated check that recognizes token-based class names when a corresponding CSS variable exists in global.css.

Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 451
File: src/features/mentoring/ui/registration/step-content/mentor-registration-pricing-step.constants.ts:25-26
Timestamp: 2026-03-25T19:29:32.084Z
Learning: In this repository (code-zero-to-one/study-platform-client), do not treat same-folder relative imports (e.g., `./some-module`) as a style violation or major issue. The `@/*` path alias may be used but is optional for intra-feature/local imports; acceptable intra-folder imports include `./...` (and similarly-scoped relative paths) when referencing files in the same directory.

Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 451
File: src/features/mentoring/ui/registration/step-content/mentor-registration-pricing-step.constants.ts:25-26
Timestamp: 2026-03-25T19:29:32.084Z
Learning: In `code-zero-to-one/study-platform-client`, when reviewing Tailwind class strings that use arbitrary *selector* syntax for styling (e.g., `[appearance:textfield]` or `[&::-webkit-inner-spin-button]:appearance-none` to hide number-input spin buttons), treat it as a style guideline issue (Minor/style) rather than a Major functional bug. Prefer extracting the behavior into a shared utility class (e.g., `no-number-spin`) in the global stylesheet, and use that utility in component class strings instead of repeating the arbitrary selector syntax.

Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 526
File: src/features/community/ui/community-qna-question-card.tsx:103-110
Timestamp: 2026-04-06T07:51:36.931Z
Learning: When using Next.js `<Image>` in this project with user-provided or API-sourced URLs (e.g., image URLs like `previewImage`), validate the URL up front against the allowed hostnames in `next.config.ts` (`remotePatterns`). Prefer pre-render validation/guard logic over relying on the `onError` handler, because `onError` only runs after Next.js rejects the request in the image optimizer. Use a shared guard utility (for example, `isCommunityAllowedImageUrl`) to prevent rendering `<Image>` entirely when the URL’s hostname/domain is not allowed (render a fallback instead).

@HA-SEUNG-JEONG HA-SEUNG-JEONG merged commit f4b458a into develop Apr 10, 2026
8 of 9 checks passed
@HA-SEUNG-JEONG HA-SEUNG-JEONG deleted the fix/my-study branch April 10, 2026 06:08
@HA-SEUNG-JEONG HA-SEUNG-JEONG restored the fix/my-study branch April 10, 2026 06:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant