Skip to content

[feat] 동아리 등록 요청 플로우 구현#331

Merged
ff1451 merged 4 commits into
developfrom
330-feat-동아리-등록-요청-플로우-구현
May 29, 2026

Hidden character warning

The head ref may contain hidden characters: "330-feat-\ub3d9\uc544\ub9ac-\ub4f1\ub85d-\uc694\uccad-\ud50c\ub85c\uc6b0-\uad6c\ud604"
Merged

[feat] 동아리 등록 요청 플로우 구현#331
ff1451 merged 4 commits into
developfrom
330-feat-동아리-등록-요청-플로우-구현

Conversation

@ff1451
Copy link
Copy Markdown
Collaborator

@ff1451 ff1451 commented May 29, 2026

✨ 요약

-  동아리 정보 수정/신규 등록 요청 API와 화면을 구현했습니다.
- 등록 요청 공통 , 대학교 검색 드롭다운, 이미지 첨부 UI와 완료 페이지를 추가했습니다.
-  동아리 목록/상세/최근  동아리의 카테고리 이모지 표시를 반영했습니다.



😎 해결한 이슈



Summary by CodeRabbit

릴리스 노트

New Features

  • 동아리 신규 등록 기능 추가: 대학교, 동아리명, 카테고리, 한 줄 소개 등을 입력하고 이미지를 첨부하여 등록 요청 가능
  • 동아리 정보 수정 기능 추가: 기존 동아리 정보를 업데이트하고 변경 사항 제출 가능
  • 이미지 업로드 기능 추가: JPG, PNG, GIF 형식의 이미지 파일 업로드 지원

Style

  • 동아리 카드의 썸네일을 카테고리 이모지로 변경하여 더 명확한 시각 표현 제공

Review Change Stack

@ff1451 ff1451 added the ✨ Feature 기능 개발 label May 29, 2026
@ff1451 ff1451 self-assigned this May 29, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 29, 2026

Walkthrough

동아리 등록 및 정보 수정 요청 기능의 완전한 구현입니다. 먼저 API 스키마에서 imageUrlcategoryEmoji로 통일하고, 이미지 업로드 API와 요청 제출 API를 추가했습니다. 공유 폼 컴포넌트(레이아웃, 입력 필드, 미디어 업로더, 대학 검색 드롭다운)를 정의한 후, 등록 페이지와 정보 수정 페이지를 각각 구현했습니다. 완료 화면과 라우팅을 추가하고, 기존 카드 컴포넌트들의 썸네일을 이모지로 변경했으며, RegisterClub 페이지에서 특정 카드를 링크로 만들었습니다.

Possibly related PRs

  • BCSDLab/KONECT_FRONT_END#307: 메인 PR의 UniversityClub 스키마 변경(imageUrl 제거, categoryEmoji 추가)이 #307의 동아리 검색 목록 페이지 구현과 직접 연결됨.
  • BCSDLab/KONECT_FRONT_END#303: 메인 PR의 App.tsx 라우팅 확장(SentryRoutes 내 새 Route 추가)이 #303의 React Router 레이아웃 구조 변경과 동일 파일에서 맞물림.
  • BCSDLab/KONECT_FRONT_END#319: 메인 PR의 RecentClubCard·RecentClub 썸네일 변경(imageUrlcategoryEmoji)이 #319의 최근 본 동아리 기능 구현과 직접 연결됨.
🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목이 주요 변경 사항(동아리 등록 요청 플로우)을 명확하게 요약하고 있으며, 변경 세트의 핵심을 잘 표현합니다.
Linked Issues check ✅ Passed PR이 이슈 #330의 모든 코딩 요구사항을 충족합니다: 동아리 정보 수정 API 및 페이지, 신규 등록 API 및 페이지, 공통 폼/완료 페이지, 카테고리 이모지 반영이 모두 구현되었습니다.
Out of Scope Changes check ✅ Passed 모든 변경 사항이 이슈 #330의 범위 내에 있으며, 등록/수정 요청 플로우와 카테고리 이모지 표시 반영에만 집중되어 있습니다.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 330-feat-동아리-등록-요청-플로우-구현

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.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (7)
apps/web/src/apis/clubInformationUpdate/mutations.ts (1)

6-10: ⚡ Quick win

React Query 키는 팩토리 패턴으로 분리해주세요.

mutationKey를 인라인 배열로 두면 키 재사용/일관성 관리가 어려워집니다. 키 팩토리로 분리해 submit에서 참조하도록 맞추는 게 좋습니다.

예시 diff
+const clubInformationUpdateMutationKeys = {
+  all: ['clubInformationUpdate'] as const,
+  submit: () => [...clubInformationUpdateMutationKeys.all, 'submit'] as const,
+};
+
 export const clubInformationUpdateMutations = {
   submit: () =>
     mutationOptions({
-      mutationKey: ['clubInformationUpdate', 'submit'],
+      mutationKey: clubInformationUpdateMutationKeys.submit(),
       mutationFn: ({ clubId, body }: SubmitClubInformationUpdateRequestParams) =>
         submitClubInformationUpdateRequest(clubId, body),
     }),
 };

As per coding guidelines, "Use query key factory pattern for React Query key organization".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/apis/clubInformationUpdate/mutations.ts` around lines 6 - 10,
Currently the React Query key is inlined in
clubInformationUpdateMutations.submit (mutationKey:
['clubInformationUpdate','submit']), which makes reuse and consistency hard;
refactor by creating a key factory (e.g., clubInformationUpdateKeys or
getClubInformationUpdateKey) that exposes a submit() method/field returning the
array, then replace the inline mutationKey in submit within
clubInformationUpdateMutations to call that factory (use the new key factory
wherever this key is needed) while keeping mutationOptions and mutationFn
unchanged.
apps/web/src/apis/clubRegistration/mutations.ts (1)

6-10: ⚡ Quick win

여기도 mutationKey를 키 팩토리로 통일하는 게 좋습니다.

현재 인라인 키 배열이라 확장 시 중복/불일치 위험이 있습니다. 키 팩토리로 맞춰주세요.

As per coding guidelines, "Use query key factory pattern for React Query key organization".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/apis/clubRegistration/mutations.ts` around lines 6 - 10, The
mutation currently uses an inline array for mutationKey in
clubRegistrationMutations.submit inside the mutationOptions call; replace the
inline ['clubRegistration','submit'] with your query key factory call (e.g.,
clubRegistrationKeys.submit() or clubRegistrationKeyFactory.submit()) to follow
the query key factory pattern and avoid duplication, leaving the rest of the
mutationFn (SubmitClubRegistrationRequestParams ->
submitClubRegistrationRequest) unchanged.
apps/web/src/App.tsx (1)

6-8: ⚡ Quick win

내부 페이지 import는 @/* 별칭을 사용하는 쪽으로 맞춰주세요.

Line 6-8은 현재 상대경로인데, 이 PR에서 추가된 import는 @/pages/...로 통일하면 규칙 일관성이 좋아집니다.

As per coding guidelines, "Use path alias @/* for internal app imports (preferred over relative paths)".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/App.tsx` around lines 6 - 8, Update the three internal imports
in App.tsx to use the project path alias rather than relative paths: replace the
current relative imports of ClubInformationUpdate, ClubRegistration, and
ClubRequestComplete with alias imports using "`@/pages/`..." so they align with
the codebase convention and keep all internal page imports consistent.
apps/web/src/pages/RegisterClub/index.tsx (2)

37-37: ⚡ Quick win

텍스트 크기 유틸을 시맨틱 타이포그래피로 통일해주세요.

Line 37, 41, 50-52의 text-[24px], text-[20px], text-[14px]text-h*/text-body* 계열로 맞추는 편이 좋습니다.

As per coding guidelines, "Prioritize semantic typography utilities (e.g., text-h1, text-body1) over generic utilities".

Also applies to: 41-41, 50-52

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/pages/RegisterClub/index.tsx` at line 37, The components in
RegisterClub with utility classes text-[24px], text-[20px], and text-[14px]
should be replaced with the semantic typography utilities; update the div using
text-[24px] to text-h3 (or your project's matching heading size), replace
text-[20px] occurrences with text-body1, and replace text-[14px] occurrences
with text-body2 (or the equivalent semantic tokens your design system uses) so
all typography uses semantic classes; locate these in the RegisterClub component
(the outer rounded div and the elements around lines showing text-[20px] and
text-[14px]) and swap the generic pixel utilities for the corresponding
text-h*/text-body* classes.

76-76: ⚡ Quick win

하드코딩 색상 대신 디자인 토큰 기반 클래스를 사용해주세요.

Line 76의 bg-[#ffffff]는 토큰 기반 스타일(bg-white 또는 토큰 매핑 클래스)로 바꾸는 게 규칙에 맞습니다.

As per coding guidelines, "Use CSS export from @konect/design-tokens for design tokens, prioritized over inline values".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/pages/RegisterClub/index.tsx` at line 76, The class string
containing the hardcoded color `bg-[`#ffffff`]` should be replaced with the
design-token based class (e.g. `bg-white` or the specific token class exported
from `@konect/design-tokens`) wherever that class string is used in the
RegisterClub component; import the token CSS or class mapping from
`@konect/design-tokens` and swap `bg-[`#ffffff`]` for the corresponding token
class in the same JSX/variable (the long class string that includes
'border-text-100 ... bg-[`#ffffff`] ...'); ensure you remove the hex token and use
the token name so the component conforms to design-token rules.
apps/web/src/pages/ClubRequestComplete/index.tsx (1)

17-18: ⚡ Quick win

시맨틱 타이포그래피 유틸로 교체해주세요.

Line 17-18의 text-[28px], sm:text-[36px], sm:text-[20px]는 디자인 시스템 일관성을 깨기 쉬워서 text-h*, text-body* 계열로 맞추는 게 좋습니다.

As per coding guidelines, "Prioritize semantic typography utilities (e.g., text-h1, text-body1) over generic utilities".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/pages/ClubRequestComplete/index.tsx` around lines 17 - 18,
Replace the raw pixel utilities on the heading and paragraph in
ClubRequestComplete/index.tsx with the design-system semantic typography
classes: update the <h1> (currently using text-[28px] and sm:text-[36px]) to the
appropriate heading token (e.g., text-h* per your design system) and update the
<p> (currently using sm:text-[20px]) to the appropriate body token (e.g.,
text-body*); locate the className on the <h1> and <p> elements and swap the
generic size utilities for the corresponding semantic utilities (text-hX for the
heading and text-bodyY for the paragraph) so they follow the typography scale.
apps/web/src/pages/ClubInformationUpdate/index.tsx (1)

55-58: ⚡ Quick win

clubQuery를 디바운스해 키 입력마다 발생하는 요청을 줄이세요.

onChange에서 매 키 입력마다 setClubQuery(value.trim())을 호출하고 해당 쿼리가 enabled 상태라, 동아리명을 한 글자씩 칠 때마다 목록 조회 요청이 발생합니다. @konect/utils/use-debounced-callbackclubQuery 갱신을 디바운스하는 것을 권장합니다.

♻️ 제안
+  const updateClubQuery = useDebouncedCallback((value: string) => {
+    setClubQuery(value.trim());
+  });
+
   ...
              onChange={(event) => {
                const value = event.target.value;
                setClubName(value);
-                setClubQuery(value.trim());
+                updateClubQuery(value);
                setFormMessage('');
              }}

Also applies to: 202-207

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/pages/ClubInformationUpdate/index.tsx` around lines 55 - 58,
clubQuery를 매타이핑마다 setClubQuery로 즉시 업데이트해 useQuery가 잦은 요청을 보냅니다; import된
useDebouncedCallback(`@konect/utils/use-debounced-callback`)를 사용해 setClubQuery 호출을
디바운스하고, useQuery의 enabled와 쿼리 인자로는 디바운스된 값(예: debouncedClubQuery)을 사용하도록 변경하세요;
구체적으로 onChange 핸들러에서 setClubQuery 대신 debounced setter(예: debouncedSetClubQuery)를
호출하고, universityClubQueries.list 호출 및 useQuery(enabled)에서 clubQuery 대신
debouncedClubQuery를 참조하도록 수정하며 같은 패턴을 다른 clubQuery 설정 위치에도 적용하세요.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/web/src/pages/ClubRequest/components.tsx`:
- Around line 180-188: The component uses useSuspenseQuery for the autocomplete
which causes fallback flicker when the debounced query (state managed by
query/updateQuery) changes; replace useSuspenseQuery(homeQueries.detail(query ?
{ query } : {})) with react-query's useQuery so you can pass placeholderData (or
keep previousData) to avoid UI fallback—call useQuery with the same query key
(homeQueries.detail(query ? { query } : {})) and set placeholderData: previous
result (e.g., from a ref or react-query's keepPreviousData option) or use
keepPreviousData: true; alternatively, if you prefer minimal change, wrap the
state update that causes the query key change (updateQuery or the setQuery call)
in startTransition to smooth UI updates—adjust code around updateQuery, query,
useSuspenseQuery -> useQuery, and homeQueries.detail accordingly.

---

Nitpick comments:
In `@apps/web/src/apis/clubInformationUpdate/mutations.ts`:
- Around line 6-10: Currently the React Query key is inlined in
clubInformationUpdateMutations.submit (mutationKey:
['clubInformationUpdate','submit']), which makes reuse and consistency hard;
refactor by creating a key factory (e.g., clubInformationUpdateKeys or
getClubInformationUpdateKey) that exposes a submit() method/field returning the
array, then replace the inline mutationKey in submit within
clubInformationUpdateMutations to call that factory (use the new key factory
wherever this key is needed) while keeping mutationOptions and mutationFn
unchanged.

In `@apps/web/src/apis/clubRegistration/mutations.ts`:
- Around line 6-10: The mutation currently uses an inline array for mutationKey
in clubRegistrationMutations.submit inside the mutationOptions call; replace the
inline ['clubRegistration','submit'] with your query key factory call (e.g.,
clubRegistrationKeys.submit() or clubRegistrationKeyFactory.submit()) to follow
the query key factory pattern and avoid duplication, leaving the rest of the
mutationFn (SubmitClubRegistrationRequestParams ->
submitClubRegistrationRequest) unchanged.

In `@apps/web/src/App.tsx`:
- Around line 6-8: Update the three internal imports in App.tsx to use the
project path alias rather than relative paths: replace the current relative
imports of ClubInformationUpdate, ClubRegistration, and ClubRequestComplete with
alias imports using "`@/pages/`..." so they align with the codebase convention and
keep all internal page imports consistent.

In `@apps/web/src/pages/ClubInformationUpdate/index.tsx`:
- Around line 55-58: clubQuery를 매타이핑마다 setClubQuery로 즉시 업데이트해 useQuery가 잦은 요청을
보냅니다; import된 useDebouncedCallback(`@konect/utils/use-debounced-callback`)를 사용해
setClubQuery 호출을 디바운스하고, useQuery의 enabled와 쿼리 인자로는 디바운스된 값(예:
debouncedClubQuery)을 사용하도록 변경하세요; 구체적으로 onChange 핸들러에서 setClubQuery 대신 debounced
setter(예: debouncedSetClubQuery)를 호출하고, universityClubQueries.list 호출 및
useQuery(enabled)에서 clubQuery 대신 debouncedClubQuery를 참조하도록 수정하며 같은 패턴을 다른
clubQuery 설정 위치에도 적용하세요.

In `@apps/web/src/pages/ClubRequestComplete/index.tsx`:
- Around line 17-18: Replace the raw pixel utilities on the heading and
paragraph in ClubRequestComplete/index.tsx with the design-system semantic
typography classes: update the <h1> (currently using text-[28px] and
sm:text-[36px]) to the appropriate heading token (e.g., text-h* per your design
system) and update the <p> (currently using sm:text-[20px]) to the appropriate
body token (e.g., text-body*); locate the className on the <h1> and <p> elements
and swap the generic size utilities for the corresponding semantic utilities
(text-hX for the heading and text-bodyY for the paragraph) so they follow the
typography scale.

In `@apps/web/src/pages/RegisterClub/index.tsx`:
- Line 37: The components in RegisterClub with utility classes text-[24px],
text-[20px], and text-[14px] should be replaced with the semantic typography
utilities; update the div using text-[24px] to text-h3 (or your project's
matching heading size), replace text-[20px] occurrences with text-body1, and
replace text-[14px] occurrences with text-body2 (or the equivalent semantic
tokens your design system uses) so all typography uses semantic classes; locate
these in the RegisterClub component (the outer rounded div and the elements
around lines showing text-[20px] and text-[14px]) and swap the generic pixel
utilities for the corresponding text-h*/text-body* classes.
- Line 76: The class string containing the hardcoded color `bg-[`#ffffff`]` should
be replaced with the design-token based class (e.g. `bg-white` or the specific
token class exported from `@konect/design-tokens`) wherever that class string is
used in the RegisterClub component; import the token CSS or class mapping from
`@konect/design-tokens` and swap `bg-[`#ffffff`]` for the corresponding token
class in the same JSX/variable (the long class string that includes
'border-text-100 ... bg-[`#ffffff`] ...'); ensure you remove the hex token and use
the token name so the component conforms to design-token rules.
🪄 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: 9728cf2a-452a-4d95-b415-0bca6e5ab081

📥 Commits

Reviewing files that changed from the base of the PR and between f49d2ad and 618e340.

⛔ Files ignored due to path filters (2)
  • apps/web/src/assets/image/complete-cat.jpg is excluded by !**/*.jpg, !apps/*/src/assets/** and included by **
  • apps/web/src/assets/svg/arrow_drop_down-icon.svg is excluded by !**/*.svg, !apps/*/src/assets/** and included by **
📒 Files selected for processing (21)
  • apps/web/src/App.tsx
  • apps/web/src/apis/clubDetail/entity.ts
  • apps/web/src/apis/clubInformationUpdate/entity.ts
  • apps/web/src/apis/clubInformationUpdate/index.ts
  • apps/web/src/apis/clubInformationUpdate/mutations.ts
  • apps/web/src/apis/clubRegistration/entity.ts
  • apps/web/src/apis/clubRegistration/index.ts
  • apps/web/src/apis/clubRegistration/mutations.ts
  • apps/web/src/apis/recentClub/entity.ts
  • apps/web/src/apis/universityClub/entity.ts
  • apps/web/src/apis/upload/entity.ts
  • apps/web/src/apis/upload/index.ts
  • apps/web/src/components/RecentClubCard/index.tsx
  • apps/web/src/pages/ClubDetail/index.tsx
  • apps/web/src/pages/ClubInformationUpdate/index.tsx
  • apps/web/src/pages/ClubRegistration/index.tsx
  • apps/web/src/pages/ClubRequest/components.tsx
  • apps/web/src/pages/ClubRequest/utils.ts
  • apps/web/src/pages/ClubRequestComplete/index.tsx
  • apps/web/src/pages/RegisterClub/index.tsx
  • apps/web/src/pages/UniversityClubList/index.tsx

Comment on lines +180 to +188
const [query, setQuery] = useState('');
const [isOpen, setIsOpen] = useState(false);
const listboxId = useId();
const updateQuery = useDebouncedCallback((value: string) => {
setQuery(value.trim());
});

const { data: homeData } = useSuspenseQuery(homeQueries.detail(query ? { query } : {}));
const universityOptions = homeData.universities ?? [];
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🌐 Web query:

React Query v5 useSuspenseQuery suspend on query key change input focus loss placeholderData

💡 Result:

In TanStack Query v5, the useSuspenseQuery hook is designed specifically for React Suspense integration [1][2]. Because it manages loading and error states via React's native Suspense and Error Boundary mechanisms, it intentionally deviates from the behavior of the standard useQuery hook in several ways relevant to your query [1][3][2]: 1. placeholderData Is Not Supported: The placeholderData option is not available in useSuspenseQuery [3][4]. When the query key changes, useSuspenseQuery will trigger the nearest Suspense fallback instead of keeping the previous data on screen [1][5][6]. 2. Handling Transitions to Avoid UI Flickering: To prevent the UI from being replaced by a Suspense fallback when the query key changes (which can cause input focus loss or jarring UI transitions), you should wrap the update to the query key in React's startTransition [1][5][6]. Using startTransition tells React to treat the state update as a non-urgent transition, allowing the previous UI to remain visible while the new data fetches in the background [6]. 3. Input Focus Loss: Input focus is often lost when a component suspends because the component unmounts or re-renders in a way that destroys the DOM node holding focus [1][6]. By using startTransition, you keep the current component mounted with its existing data while the new data is fetched, which helps maintain the input's focus and prevents the UI from resetting [1][6]. In summary, because useSuspenseQuery does not support placeholderData, you must rely on React's transition APIs (startTransition) to manage the UI state during query key changes [1][5]. If you require the specific behavior provided by placeholderData (like keeping previous data visible without triggering a suspense fallback), consider using the standard useQuery hook instead, as it provides finer control over these states [6]. Top Results: [1][5][6]

Citations:


검색 자동완성 콤보박스에 useSuspenseQuery 사용은 부적합합니다.

useSuspenseQueryplaceholderData를 지원하지 않아 디바운스된 query로 쿼리 키가 바뀔 때 Suspense fallback이 뜨면서 입력 포커스/드롭다운이 깜빡일 수 있습니다. 검색형 입력에는 useQuery + placeholderData(이전 결과 유지)로 처리하거나, 최소한 쿼리 키 변경을 startTransition으로 감싸 UI 전환을 완화하는 방향을 권장합니다(다른 화면에서도 유사 로직이 있다면 동일 패턴으로 맞추세요).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/pages/ClubRequest/components.tsx` around lines 180 - 188, The
component uses useSuspenseQuery for the autocomplete which causes fallback
flicker when the debounced query (state managed by query/updateQuery) changes;
replace useSuspenseQuery(homeQueries.detail(query ? { query } : {})) with
react-query's useQuery so you can pass placeholderData (or keep previousData) to
avoid UI fallback—call useQuery with the same query key
(homeQueries.detail(query ? { query } : {})) and set placeholderData: previous
result (e.g., from a ref or react-query's keepPreviousData option) or use
keepPreviousData: true; alternatively, if you prefer minimal change, wrap the
state update that causes the query key change (updateQuery or the setQuery call)
in startTransition to smooth UI updates—adjust code around updateQuery, query,
useSuspenseQuery -> useQuery, and homeQueries.detail accordingly.

@ff1451 ff1451 merged commit e054e9c into develop May 29, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature 기능 개발

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feat] 동아리 등록 요청 플로우 구현

1 participant