Conversation
⦠무ν¨ν λλ½λ κ² μμ (#272) * refactor: λ΄ ν μΌ λͺ©λ‘ κ°μ (ν¬λ μΆκ° μ€ν¨ μ μλ¬λ©μμ§ ν μ€νΈ, μ κ·Όμ± λ±) * refactor: μΊμ 무ν¨ν λ‘μ§ μΆκ° - μΊμ 무ν¨ν λ‘μ§μ΄ λλ½λμ΄ μμ΄, ν¬λ crud μ μλ‘κ³ μΉ¨ νμ§ μμΌλ©΄ λ°μ΄ν° κ°±μ x - μΊμ 무ν¨ν λ‘μ§μ ꡬννμ¬ μ μμ μΌλ‘ κ°±μ o - λ§΄λ² ν μΌ μΉμ μ λ¬μ±λ₯ μ λ°±μλμμ λκΈ°ν λλ½μ΄ μμΈ. λ°±μλ ν΄κ²° ν μ μ λμ * fix: ν΄λ‘λ 리뷰 λ°μ * fix: ν΄λ‘λ 리뷰 λ°μ
* chore: μ€μκ° νμ κ΄λ ¨ λΌμ΄λΈλ¬λ¦¬ μΆκ° * feat: μ€μκ° νΈλνΉμ μν ν΄λΌμ΄μΈνΈ μ΄κΈ°ν * feat: μλ²μ¬μ΄λ API μμ² μ²λ¦¬λ₯Ό μν serverFetch μ νΈ κ°μ * feat: λΉλμ€ κ΅¬λ κ³ μ μ μν μ μ μ€νμΌ μΆκ° * refactor: supabase ν΄λΌμ΄μΈνΈ μ΄κΈ°ν 보μ₯ λ‘μ§ μΆκ° λ° μμ μ± κ°ν - supabase ν΄λΌμ΄μΈνΈκ° nullμΌ κ²½μ°λ₯Ό λλΉν ensureSupabase ν¬νΌ ν¨μ ꡬν - νκ²½ λ³μ λ―Έμ€μ μ λͺ μμ μΈ μλ¬ λ©μμ§λ₯Ό λ°μμμΌ λλ²κΉ λ° νμ μμ μ± ν₯μ - μ½λ 리뷰 λ°μ - μ¬μ©νλ μΈ‘μμ null μ²΄ν¬ μμ΄ νμ μμ νκ² μ¬μ© κ°λ₯νλλ‘ κ°μ
* feat: μ€μκ° νμ μ μ₯μ μν ν ν° λ°κΈ API ꡬν - μ°Έμ¬μ Identity λ° Grantκ° ν¬ν¨λ AccessToken μμ± - μλ² λ¨μμ requestBackendλ₯Ό μ΄μ©ν΄ μ€μ λͺ¨μ λ©€λ²μΈμ§ 보μ κ²μ¦ λ‘μ§ μΆκ° * feat: μ€μκ° νμ μν λ° UI μ μ΄λ₯Ό μν λμ보λ μμ μΆκ° * refactor: λ³λ ¬ Promiseλ‘ κ°μ (ν΄λ‘λ 리뷰 λ°μ) * fix: 보μ ν ν° μ ν¨μκ° λ³κ²½
* feat: μ€μκ° μ°Έμ¬μ νΈλνΉ λ‘μ§ κ΅¬ν - μ€μκ° μ±λμ μ°Έμ¬μ λκΈ°ν λ‘μ§ κ΅¬ν - isJoined μνμ λ°λ₯Έ μλ μ¨λΌμΈ/μ€νλΌμΈ μ ν μ²λ¦¬ - ν λ«κΈ° λ± μκΈ°μΉ λͺ»ν μ’ λ£ μν© μ²λ¦¬ * fix: ν΄λ‘λ 리뷰 λ°μ * fix: ν΄λ‘λ 리뷰 λ°μ * fix: beforeunload μ΄λ²€νΈ νκ³ λ³΄μ, λͺ¨λ°μΌ νκ²½ κ°μ * fix: ν΄λ‘λ 리뷰 λ°μ
* feat: νμ μΉμ μμ ꡬ쑰 λ° λ°μ΄ν° μ°λ λ‘μ§ κ΅¬ν - MeetingSectionμμ ν ν° λ°κΈ λ° Suspense μ€μ - MeetingContentμμ μ μ μ 보 λ° Presence λ°μ΄ν° μ°λ λ‘μ§ λΆλ¦¬ * feat: μ€μκ° νμ μ μ₯ μ λκΈ°μ€ UI κ°λ° * feat: νμ νμμ€ λ° μ°Έμ¬μ 그리λ ꡬν * feat: λμ보λ νμ μΆκ° (μμ€νμ€λ°μ΄λ리 μ μ©) * fix: ν΄λ‘λ 리뷰 λ°μ * fix: νμμ€ μ 체μ μΈ μ€νμΌλ§ μμ
Updated README to include project details and user journey.
β¦ ν μλͺ»λ νμ₯μ μμ ) (#286) * fix: λͺ¨μ CRUD ν λ°μ΄ν° μ¦μ λ°μ λ‘μ§ λ³΄μ λ° λ°νμ μλ¬ μμ - MemberListSection: λ¦¬λ·°μ΄ μ 보 λΆμ¬ μ λ°μνλ TypeError μμ (Optional Chaining μΆκ°) - API: getMainGatherings, getMyGatheringsμ Cache-Control: no-cache ν€λ μΆκ°νμ¬ μ΅μ λ°μ΄ν° 보μ₯ - Queries: λͺ¨μ μμ±/μμ /μμ μ memberships 쿼리 무ν¨ν μΆκ° λ° invalidateQueries await μ²λ¦¬ - Components: μμ±/μμ /μμ μ±κ³΅ ν μ΄λ μ router.refresh() νΈμΆνμ¬ App Router μΊμ κ°±μ * fix: λͺ¨μ λμ보λ λ§΄λ² ν μ΄λ―Έμ§ 500μλ¬ μ μ ν λ°©μ§λ₯Ό μν λ°©μ΄λ‘μ§ * fix: hooks μλͺ»λ νμ₯μ μμ * fix: ν΄λ‘λ 리뷰 λ°μ
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Claude finished @kwonjin2's task in 3m 36s ββ View job PR Review: dev β main (ver 0.75)리뷰 μ§ν μν©
리뷰 κ²°κ³Ό μμ½β CRITICAL μ΄μ: μμμ£Όμ μν€ν μ² κ·μΉμ μ μ€μνκ³ μμ΅λλ€:
|
|
|
||
| import { GridLayout, ParticipantTile, useTracks } from '@livekit/components-react'; | ||
| import '@livekit/components-styles'; | ||
| import { Track } from 'livekit-client'; |
There was a problem hiding this comment.
HIGH: import μμ μλ°
μ€νμΌ import(@livekit/components-styles)λ λͺ¨λ μ½λ import νμ μμΌ ν©λλ€.
νμ¬:
import { GridLayout, ParticipantTile, useTracks } from '@livekit/components-react';
import '@livekit/components-styles';
import { Track } from 'livekit-client';μμ :
| import { Track } from 'livekit-client'; | |
| 'use client'; | |
| import { GridLayout, ParticipantTile, useTracks } from '@livekit/components-react'; | |
| import { Track } from 'livekit-client'; | |
| import '@livekit/components-styles'; |
.claude/rules/code-style.md μ°Έκ³ : importλ React/Next.js β μΈλΆ λΌμ΄λΈλ¬λ¦¬ β λ΄λΆ λͺ¨λ β μλ κ²½λ‘ β νμ
import μμλ‘ μ λ ¬νκ³ , μ€νμΌμ λ§μ§λ§μ μμΉν©λλ€.
| await channel.untrack(); | ||
| } | ||
| } catch (error) { | ||
| // μ°κ²°μ΄ λ―Έμ² μ λ μνμμ μλνλ©΄ μλ¬κ° λ μ μμΌλ 무μ (μ SUBSCRIBED μμ νμ²λ¦¬λ¨) | ||
| } |
There was a problem hiding this comment.
MEDIUM: μλ¬ μ²λ¦¬ κ°μ νμ
try-catch λΈλ‘μμ μλ¬λ₯Ό μμ ν 무μνκ³ μμ΅λλ€. λλ²κΉ μ μν΄ μ΅μν μ½μ μλ¬λ μΆλ ₯νλ κ²μ΄ μ’μ΅λλ€.
| await channel.untrack(); | |
| } | |
| } catch (error) { | |
| // μ°κ²°μ΄ λ―Έμ² μ λ μνμμ μλνλ©΄ μλ¬κ° λ μ μμΌλ 무μ (μ SUBSCRIBED μμ νμ²λ¦¬λ¨) | |
| } | |
| } catch (error) { | |
| // μ°κ²°μ΄ λ―Έμ² μ λ μνμμ μλνλ©΄ μλ¬κ° λ μ μμΌλ 무μ (μ SUBSCRIBED μμ νμ²λ¦¬λ¨) | |
| console.error('[useMeetingPresence] Track status update failed:', error); | |
| } |
μλ¬κ° μμλλ κ²½μ°λΌλ λ‘κ·Έλ₯Ό λ¨κΈ°λ©΄ μ€μ λ¬Έμ λ°μ μ μμΈ νμ μ λμμ΄ λ©λλ€.
| } | ||
|
|
||
| // DEBUG LOG | ||
| // TODO: νλ‘λμ ν μ€νΈ μλ£ ν μ κ±° |
There was a problem hiding this comment.
INFO: νλ‘λμ λ‘κΉ μ 리 νμ
TODO μ£Όμλλ‘ νλ‘λμ λ°°ν¬ μ μ λλ²κ·Έ λ‘κ·Έλ€μ μ κ±°νκ±°λ, νκ²½ λ³μλ‘ μ μ΄νλ κ²μ κΆμ₯ν©λλ€.
μ μ:
const DEBUG = process.env.NODE_ENV !== 'production';
if (DEBUG) {
console.log(`[BFF -> Backend] ${init.method} ${url}`);
// ... κΈ°ν λ‘κ·Έλ€
}νλ‘λμ μμλ λ―Όκ°ν μ 보(Authorization ν€λ λ±)κ° λ‘κ·Έμ λ ΈμΆλμ§ μλλ‘ μ£Όμκ° νμν©λλ€.
| const gatheringId = parseInt(room.split('-')[1], 10); | ||
| const [memberResponse, userResponse] = await Promise.all([ | ||
| requestBackend({ | ||
| request: req, | ||
| endpoint: `v1/gatherings/${gatheringId}/members`, | ||
| overrideSearchParams: new URLSearchParams(), | ||
| }), | ||
| requestBackend({ | ||
| request: req, | ||
| endpoint: 'v1/users/me', | ||
| overrideSearchParams: new URLSearchParams(), | ||
| }), | ||
| ]); |
There was a problem hiding this comment.
π μ μμ±λ μ : λ³λ ¬ fetch ν¨ν΄
Promise.allμ μ¬μ©νμ¬ λ©€λ² νμΈκ³Ό μ μ μ 보 μ‘°νλ₯Ό λ³λ ¬λ‘ μ²λ¦¬ν κ²μ΄ μ’μ΅λλ€. μ΄λ .claude/CLAUDE.mdμ "λ³λ ¬ fetchλ Promise.all νμ" κ·μΉμ μ λ°λ₯΄κ³ μμ΅λλ€.
λν μλ² μ»΄ν¬λνΈ/API Routeμμ requestBackend (fetch κΈ°λ°)μ μ¬μ©ν κ²λ μ¬λ°λ₯Έ ν¨ν΄μ
λλ€.
| onSuccess: async (data, variables, onMutateResult, context) => { | ||
| await invalidateServerCache(GATHERING_TAGS.all); | ||
| await Promise.all([ | ||
| queryClient.invalidateQueries({ queryKey: gatheringKeys.all }), | ||
| queryClient.invalidateQueries({ queryKey: ['memberships'] }), | ||
| ]); |
There was a problem hiding this comment.
π μ μμ±λ μ : μ΄μ€ μΊμ 무ν¨ν ν¨ν΄
λͺ¨μ λ°μ΄ν°λ μλ²μμ prefetchQuery + next.tagsλ‘ μΊμλλ―λ‘, mutation μ±κ³΅ μ λ€μκ³Ό κ°μ΄ μ΄μ€ μΊμ 무ν¨νκ° νμν©λλ€:
invalidateServerCache(GATHERING_TAGS.all)β μλ² Data Cache 무ν¨ν (λ€λ₯Έ μ μ λ μ΅μ λ°μ΄ν° νμΈ)invalidateQueriesβ νμ¬ μ μ νλ©΄ μ¦μ κ°±μ
μ΄ ν¨ν΄μ .claude/rules/tanstack-query.mdμ "κ³΅κ° λ°μ΄ν° (prefetchQuery + next.tagsλ‘ μλ² μΊμλ¨)" κ·μΉμ μ νν λ°λ₯΄κ³ μμ΅λλ€. π
λν Promise.allλ‘ λ³λ ¬ 무ν¨ννκ³ , awaitλ‘ μμλ₯Ό 보μ₯ν κ²λ μ’μ ν¨ν΄μ
λλ€.
β μ΄μ
βοΈ Description
πΈ μ€ν¬λ¦°μ· (UI λ³κ²½ μ)
β Checklist
PR
Test
npm run build)npm run lint)Additional Notes