Skip to content

PrezelAccordion 구현#55

Merged
HamBeomJoon merged 15 commits intodevelopfrom
feat/#52-prezel-accordion
Mar 14, 2026
Merged

PrezelAccordion 구현#55
HamBeomJoon merged 15 commits intodevelopfrom
feat/#52-prezel-accordion

Conversation

@HamBeomJoon
Copy link
Copy Markdown
Contributor

@HamBeomJoon HamBeomJoon commented Feb 8, 2026

📌 작업 내용

  1. PrezelAccordion 컴포넌트를 추가했습니다.

    • PrezelList를 헤더 영역으로 재사용하고, 우측 끝에는 아코디언 전용 chevron 아이콘이 항상 노출되도록 구성했습니다.
    • 펼침/접힘 시 AnimatedVisibility와 chevron 회전 애니메이션을 적용했습니다.
    • leadingContent, trailingContent, content, showDivider, nested 옵션을 지원하도록 설계했습니다.
    • collapsed / expanded / interactive preview를 추가해 상태별 UI를 확인할 수 있도록 했습니다.
  2. PrezelIcon 업데이트

    • 전체적으로 아이콘이 Outlined -> Filled로 변경되었습니다.

🧩 관련 이슈


📸 스크린샷

2026-03-12.14.05.03.mov

Summary by CodeRabbit

릴리스 노트

  • New Features

    • 새로운 Accordion 컴포넌트 추가: 클릭으로 확장/축소, 회전 애니메이션 아이콘 및 페이드/확장 콘텐츠 표시 지원
  • New Icons

    • 아이콘 라이브러리 확장/조정: Edit, Lock, Menu, Search, Setting, Storage, Upload 등 추가 및 Info/Warning의 Filled·Outlined 변형 도입
  • Style / Assets

    • 여러 아이콘 그래픽 경로 업데이트로 시각적 일관성 향상
    • 접근성 문자열(아코디언 설명) 추가
  • Previews

    • 상단바 및 컴포넌트 미리보기 아이콘 갱신으로 데모 표현 개선

디자인시스템에 아코디언 컴포넌트인 `PrezelAccordion`을 새롭게 추가했습니다.

*   `AnimatedVisibility`를 이용한 펼치기/접기 애니메이션 구현
*   헤더, 라벨, 콘텐츠 영역을 커스텀할 수 있는 슬롯 구조 적용
*   `showDivider` 옵션을 통한 구분선 표시 기능 제공
*   상태별 미리보기(Collapsed, Expanded, Interactive) 추가
아이콘 세트를 전반적으로 업데이트하고, 명명 규칙을 통일했습니다.

*   신규 아이콘 추가: `Menu`, `Search`, `Upload`, `Lock`, `Storage`, `QuestionCircle` 등
*   기존 아이콘 리팩토링: `Calendar`, `Balloon`, `Check`, `Person`, `Video` 등 벡터 패스 및 색상 수정
*   아이콘 명명 규칙 변경: `WarningCircle` -> `WarningCircleOutlined` 등 형태에 따른 접미사 추가
*   `PrezelIcons` 클래스 내 리소스 참조 업데이트 및 신규 아이콘 등록
*   불필요한 아이콘 삭제 (`ic_info`, `ic_warning`) 및 `PrezelAccordion` 코드 스타일 수정
@HamBeomJoon HamBeomJoon self-assigned this Feb 8, 2026
@HamBeomJoon HamBeomJoon added the ✨ feat 새로운 기능 추가 또는 기존 기능 확장 label Feb 8, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Feb 8, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

새로운 Compose UI 컴포넌트 PrezelAccordion(공개 함수)이 추가되었고, 이를 구성하는 private 컴포저블들(헤더, 회전 쉐브론, 구분선, 애니메이트된 콘텐츠 컨테이너)과 여러 Preview가 포함되었습니다. PrezelIcons에 다수의 아이콘 상수가 추가·재구성되었고, 여러 벡터 drawable 리소스가 신규 추가·수정·삭제되었습니다. 문자열 리소스 core_designsystem_accordion_desc가 새로 추가되었습니다.

Possibly related PRs

  • Team-Prezel/Prezel-Android PR 45: PrezelIcons.kt의 아이콘 매핑 추가/수정이 이루어져 리소스·심볼 변경이 직접적으로 겹칩니다.
  • Team-Prezel/Prezel-Android PR 19: 동일하게 PrezelIcons.kt와 관련 drawable 리소스의 추가/조정 작업이 포함되어 코드·리소스 수준의 중복 가능성이 높습니다.
  • Team-Prezel/Prezel-Android PR 49: 디자인 시스템의 drawable 및 아이콘 리소스를 대규모로 변경하는 커밋으로 리소스 파일 변경이 직접적으로 연관됩니다.
🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning Multiple icon files were modified and added beyond the PrezelAccordion implementation scope. While icon updates are mentioned in the PR description, the extensive icon geometry changes appear to be a separate refactoring effort. Consider separating icon refactoring (Outlined → Filled conversion) into a separate pull request to maintain clear scope boundaries and facilitate easier review and maintenance.
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 (3 passed)
Check name Status Explanation
Title check ✅ Passed The pull request title 'PrezelAccordion 구현' clearly and directly describes the main change: implementing the PrezelAccordion component, which is the primary focus of this changeset.
Linked Issues check ✅ Passed The pull request successfully implements the PrezelAccordion component from issue #52 with header/label/content slot API, chevron animation, AnimatedVisibility, divider option, and ripple-free interaction as required.
Description check ✅ Passed PR 설명이 필수 섹션을 포함하고 있으나, 일부 구체적인 구현 세부사항이 누락되어 있습니다.

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


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: 2

🤖 Fix all issues with AI agents
In
`@Prezel/core/designsystem/src/main/res/drawable/core_designsystem_ic_calendar.xml`:
- Around line 7-8: Update the calendar drawable's fill color: locate the
android:fillColor attribute in core_designsystem_ic_calendar.xml (the <path>
element containing the calendar android:pathData) and change its value from
"#2F3238" to "#6E737D" so it matches the other design system icons.

In
`@Prezel/core/designsystem/src/main/res/drawable/core_designsystem_ic_menu.xml`:
- Around line 1-9: The vector drawable's pathData defines three horizontal dots
(a "more" icon) but the resource is named core_designsystem_ic_menu.xml (which
implies a hamburger/menu icon); either update the pathData to the three-line
hamburger shape in the <path> (replace the current dot pathData) or rename the
asset to reflect "more" (e.g., core_designsystem_ic_more) and update any
references; locate the <vector> and its <path> (android:pathData) in
core_designsystem_ic_menu.xml to make the change so resource name and visual
match the design system convention.
🧹 Nitpick comments (5)
Prezel/core/designsystem/src/main/res/drawable/core_designsystem_ic_person.xml (1)

6-11: 하드코딩된 fillColor 대신 테마 컬러 참조 고려

두 path 모두 fillColor#6E737D로 하드코딩되어 있습니다. Compose에서 tint를 통해 항상 색상을 오버라이드한다면 문제없지만, 그렇지 않은 경우 다크 모드 등 테마 전환 시 아이콘이 배경과 구분되지 않을 수 있습니다.

AI 요약에 따르면 이번 PR의 다른 아이콘들도 동일한 패턴을 사용하고 있으므로, 전체 아이콘 세트에 대해 일관된 방침이 있는지 확인해 주세요.

Prezel/core/designsystem/src/main/res/drawable/core_designsystem_ic_search.xml (1)

1-9: 새 Search 아이콘 추가 확인.

아이콘 구조와 fillColor가 일관됩니다. 참고로, TopAppBar.kt (Line 112)에서 PrezelIcons.Blank을 contentDescription "검색"으로 사용하고 있는 부분이 있습니다. 이 새로운 Search 아이콘으로 교체하는 것이 적절할 수 있습니다.

Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/PrezelAccordion.kt (3)

115-125: 접근성: chevron 아이콘에 contentDescription 추가 권장

contentDescription = null로 설정되어 있어 스크린 리더 사용자가 아코디언의 확장/축소 상태를 인지할 수 없습니다. 확장 상태에 따라 적절한 설명을 제공하는 것이 좋습니다.

또한, R.drawable.core_designsystem_ic_chevron_down을 직접 참조하는 대신 PrezelIcons.ChevronDown을 사용하면 다른 컴포넌트(PrezelRadio, PrezelCheckbox 등)와 일관성을 유지할 수 있습니다.

♻️ 제안
 `@Composable`
 private fun PrezelAccordionChevron(rotation: Float) {
     Icon(
-        painter = painterResource(R.drawable.core_designsystem_ic_chevron_down),
-        contentDescription = null,
+        painter = painterResource(PrezelIcons.ChevronDown),
+        contentDescription = "Toggle accordion",
         modifier = Modifier
             .size(24.dp)
             .rotate(rotation),
         tint = PrezelTheme.colors.iconRegular,
     )
 }

40-77: 공개 API 시그니처 검토

전체적으로 잘 구성되어 있습니다. 슬롯 기반 API로 header/label/content를 분리하고, AnimatedVisibility 기반의 확장/축소, ripple 제거 클릭 정책 등 PR 목표를 충실히 구현했습니다.

한 가지 고려할 점: enabled = false일 때 chevron이 여전히 표시되고 시각적 비활성화 표시가 없습니다. 비활성 상태의 시각적 피드백(예: 투명도 조절)을 추가하면 사용자 경험이 개선될 수 있습니다.


87-112: 헤더 영역의 클릭 영역과 접근성 시맨틱스

clickable modifier에 indication = null과 커스텀 interactionSource를 사용하여 ripple을 제거한 것은 PR 목표와 일치합니다. 다만, 접근성 향상을 위해 semantics 혹은 toggleable modifier를 활용하여 확장/축소 역할(Role)을 명시하면 TalkBack 등 보조 기술에서 더 나은 경험을 제공할 수 있습니다. 참고로 PrezelCheckbox에서는 toggleableRole.Checkbox를 사용하고 있습니다.

* 아코디언 컴포넌트에 접근성 보조를 위한 content description 리소스를 추가하고 적용했습니다.
* 아코디언 및 TopAppBar에 사용되는 아이콘 리소스를 `PrezelIcons` 상수로 교체했습니다.
* 캘린더 아이콘의 색상을 수정했습니다(`2F3238` -> `6E737D`).
* TopAppBar 프리뷰의 아이콘을 실제 아이콘으로 업데이트했습니다.
PrezelAccordion의 가독성과 유연성을 높이기 위해 파라미터 명칭을 변경하고 레이아웃을 조정하였습니다.

*   `label` 파라미터 명칭을 `trailingContent`로 변경하여 역할을 명확히 함
*   `chevron` 파라미터 명칭을 `icon`으로 변경
*   `onClick` 콜백 명칭을 `onTap`으로 변경
*   헤더 내부의 컴포넌트 간 간격(Spacer) 조정 및 레이아웃 최적화
*   Preview 코드에 변경된 파라미터 명칭 반영
…cordion

# Conflicts:
#	Prezel/core/designsystem/src/main/res/values/strings.xml
* refactor: PrezelAccordion 하드코딩된 수치를 디자인 시스템 토큰으로 교체

`PrezelAccordion` 컴포넌트 내부에서 사용되던 하드코딩된 여백 값(`12.dp`, `8.dp`)을 `PrezelTheme.spacing` 토큰(`V12`, `V8`)으로 수정하였습니다.

* style: strings.xml 리소스 위치 정렬

`core_designsystem_accordion_desc` 리소스의 위치를 가독성을 위해 상단으로 이동시켰습니다.
Copy link
Copy Markdown
Member

@moondev03 moondev03 left a comment

Choose a reason for hiding this comment

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

👍

`PrezelAccordion` 컴포넌트의 내부 구조를 정리하고 여백 및 클릭 로직을 개선했습니다.

*   **구조 및 레이아웃 개선**:
    *   `Surface`를 제거하고 `Modifier.background(Color.Transparent)`를 적용한 `Column`으로 변경했습니다.
    *   `PrezelAccordionHeader` 내부의 패딩 설정을 조정하고, `PrezelAccordionContent`의 고정 패딩(`V12`)을 제거하여 외부에서 제어할 수 있도록 수정했습니다.
    *   `PrezelAccordionChevron` 애니메이션 로직을 컴포넌트 내부로 캡슐화했습니다.
*   **코드 정리**:
    *   `clickable`의 `interactionSource`를 `null`로 설정하여 불필요한 메모리 할당을 방지했습니다.
    *   컴포저블 파라미터 순서를 표준 가이드에 맞춰 조정했습니다.
    *   Preview 코드 내의 불필요한 여백 및 스타일 적용 방식을 수정했습니다.
`PrezelAccordion` 컴포넌트의 내부 구조를 정리하고, 패딩 및 컴포저블 파라미터 설정을 유연하게 수정했습니다.

*   `header` 및 `trailingContent` 파라미터에서 불필요한 `expanded` 상태 전달 제거
*   `contentPadding` 파라미터를 추가하여 헤더의 패딩을 외부에서 조절할 수 있도록 개선
*   `PrezelAccordionDivider` 비공개 컴포저블을 제거하고 `PrezelHorizontalDivider`를 직접 사용하도록 로직 단순화
*   `PrezelAccordionHeader`에 `contentPadding` 적용 및 관련 프리뷰 코드 업데이트
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

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

Inline comments:
In
`@Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/PrezelAccordion.kt`:
- Around line 87-97: Add proper accessibility semantics to the accordion header:
update the Row modifier that uses Modifier.clickable(...) to include role =
Role.Button (same pattern as PrezelButton.kt) and add a semantics block
conveying the expanded state (e.g., .semantics { stateDescription = if
(expanded) "expanded" else "collapsed" } or set ToggleableState using
ToggleableState.On/Off depending on your existing boolean named expanded), and
change the Icon's contentDescription to null so it is treated as decorative
(replace the existing non-null string). Ensure you reference the
Row/Modifier.clickable usage, the expanded state variable (expanded or
isExpanded), and the Icon(contentDescription = ...) in your edits.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 051ab7a and 17b9f0c.

📒 Files selected for processing (1)
  • Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/PrezelAccordion.kt

`PrezelAccordion` 컴포넌트의 내부 구현을 `PrezelList` 기반으로 리팩토링하여 디자인 시스템 일관성을 높이고 가독성을 개선했습니다.

* **PrezelAccordion 리팩토링**:
    * 내부 헤더 로직을 `PrezelList` 컴포넌트 사용으로 대체
    * `title`, `size`, `nested`, `leadingContent` 파라미터 추가로 유연성 확장
    * `animateContentSize`를 적용하여 상태 변화 시 부드러운 애니메이션 제공
    * 불필요한 `PrezelAccordionHeader` 비공개 컴포저블 제거
* **PrezelCheckbox 수정**:
    * `Box`의 고정 크기(48.dp)를 제거하고 `modifier`를 통해 외부에서 제어하도록 수정
    * 프리뷰 코드에서 `size(48.dp)` 명시적 지정
* **기타**: 프리뷰 예제 업데이트 및 관련 리소스 정리
- `PrezelAccordionChevron` 컴포넌트의 위치를 파일 내 상단으로 이동하여 가독성을 개선했습니다.
- 개별적으로 분리되어 있던 아코디언 프리뷰(`Collapsed`, `Expanded`, `Interactive`)를 하나의 `PrezelAccordionPreview` 함수로 통합했습니다.
- 프리뷰 내에서 `Arrangement.spacedBy`를 사용하여 컴포넌트 간 간격을 조정하고 가시성을 높였습니다.
`PrezelCheckbox` 컴포넌트의 내부 여백을 추가하고, 프리뷰 코드에서 사용되던 고정 크기 설정을 커스텀 보더 스타일로 변경하였습니다.

* `PrezelCheckbox`의 `Box` 컨테이너에 `PrezelTheme.spacing.V8` 패딩 추가
* 프리뷰 내 `Modifier.size(48.dp)`를 `Modifier.drawDashBorder()`로 교체하여 시각적 구조 개선
* `drawDashBorder` 유틸리티 함수 임포트 추가
`PrezelAccordion`의 상태 관리 방식을 내부 변수로 캡슐화하고, `PrezelList`의 슬롯 파라미터 타입을 변경하여 구조를 개선했습니다.

* **PrezelAccordion**:
    * `expanded` 및 `onExpandedChange` 외부 주입 방식에서 `initiallyExpanded`를 사용한 내부 `rememberSaveable` 상태 관리 방식으로 변경
    * `LocalMinimumInteractiveComponentSize`를 `Dp.Unspecified`로 설정하여 내부 리스트 아이템의 터치 영역 최적화
    * `nested` 여부에 따라 `PrezelListSize`가 자동으로 결정되도록 로직 추가
    * `content` 파라미터를 필수 값으로 변경하고 불필요한 null 체크 제거
* **PrezelList**:
    * `leadingContent` 및 `trailingContent`의 타입을 `@Composable (RowScope.() -> Unit)?`에서 `@Composable (() -> Unit)?`으로 변경하여 `RowScope` 의존성 제거
* **기타**:
    * `PrezelAccordion` 프리뷰 코드 내 체크박스와 하이퍼링크 버튼을 활용한 복합 예시 추가 및 디자인 확인을 위한 `drawDashBorder` 적용 (테스트용)
    * `PrezelHorizontalDivider` 호출 시 불필요한 기본 색상 파라미터 제거
@HamBeomJoon HamBeomJoon requested a review from moondev03 March 12, 2026 05:31
@HamBeomJoon HamBeomJoon merged commit 14c5fd5 into develop Mar 14, 2026
2 of 3 checks passed
@HamBeomJoon HamBeomJoon deleted the feat/#52-prezel-accordion branch March 14, 2026 13:02
HamBeomJoon added a commit that referenced this pull request Mar 27, 2026
* feat: 로그인 성공 시 화면 전환 애니메이션 및 딜레이 추가

로그인 성공 후 홈 화면으로 이동할 때 갑작스러운 UI 변화를 방지하기 위해 전환 로직을 개선했습니다.
* `LoginScreen`에서 홈 이동 시 `fadeOut` 애니메이션(120ms) 및 이에 맞춘 `delay`를 적용했습니다.
* 내비게이션 바가 나타날 때 앱 콘텐츠와 자연스럽게 어우러지도록 `NAV_TRANSITION_DURATION`(100ms) 지연 후 표시되도록 수정했습니다.

* refactor: LoginScreen 상태 관리 및 UI 로직 최적화

* `isLoading` 상태 대신 `showLoginButton` 플래그를 사용하여 화면 전환 시 버튼 노출 여부를 제어하도록 변경했습니다.
* `LoginFooter`의 `AnimatedVisibility`에 `fadeOut` 효과를 추가했습니다.
* `LoginViewModel`의 `uiState` 관찰 로직을 단순화하고 불필요한 `collectAsStateWithLifecycle` 참조를 제거했습니다.
* 프리뷰 코드에서 사용하지 않는 로딩 상태 케이스를 정리했습니다.

* fix: PrezelApp 내비게이션 바 표시 조건부 렌더링 수정

`PrezelApp`에서 `appState.shouldShowNavigationBar` 변경 시 `LaunchedEffect`를 통해 상태를 비동기적으로 업데이트하여 화면 전환 애니메이션과의 싱크를 맞췄습니다.
HamBeomJoon added a commit that referenced this pull request Mar 27, 2026
* feat: 카카오 로그인 속도 제한(Rate Limit) 대응 추가

카카오 로그인 시도 횟수가 초과되었을 때의 상태를 정의하고 사용자에게 알림을 표시하도록 기능을 추가했습니다.

*   `KakaoLoginResult`: `RateLimited` 상태 추가
*   `LoginViewModel`: 로그인 실패 시나리오에 `rateLimitMessage` 처리 로직 추가
*   `strings.xml`: "로그인 시도가 너무 많습니다" 안내 문구 추가
*   `core:data`: `timber` 의존성 추가 및 `AuthError`(429) 발생 시 `RateLimited`로 변환하는 로직 구현

* refactor: 카카오 로그인 로직 고도화 및 로깅 추가

카카오톡 앱 로그인 실패 시 카카오 계정 로그인으로 자동 전환되는 로직을 개선하고, `Timber`를 통한 실행 로그를 추가했습니다.

*   카카오톡 로그인 중 사용자 취소(`ClientErrorCause.Cancelled`) 시 즉시 실패 처리
*   카카오톡 로그인 불가 혹은 오류 시 `loginWithKakaoAccount`로 fallback 처리
*   로그인 단계별(성공, 실패, 취소) 로그 기록 추가

* refactor: 앱 네비게이션 바 표시 로직 및 애니메이션 최적화

*   `PrezelApp`: 네비게이션 바 표시 여부를 결정할 때 사용하던 불필요한 `LaunchedEffect`와 `delay` 로직을 제거하고 `appState`를 직접 참조하도록 단순화했습니다.
*   `LoginScreen`: 로그인 버튼 영역의 `AnimatedVisibility` 종료 애니메이션(`exit`)을 `None`으로 변경하여 화면 전환 시 시각적 일관성을 개선했습니다.
HamBeomJoon added a commit that referenced this pull request Mar 30, 2026
* feat: login 피처 모듈 추가 및 로그인 화면 구현

- `feature:login:api` 및 `feature:login:impl` 모듈 생성 및 프로젝트 등록
- `LoginNavKey` 정의 및 `SharedTransitionScope`를 활용한 `LoginScreen` UI 구현
- `LoginViewModel`, `LoginUiState`, `LoginUiEffect`를 통한 로그인 비즈니스 로직 및 상태 관리 추가
- Hilt Multi-bindings (`IntoSet`) 기반의 `LoginEntryBuilder` 네비게이션 등록 방식 적용
- `AndroidFeatureImplConventionPlugin`에 `hilt-lifecycle-viewmodel-compose` 의존성 추가
- 디자인 시스템에 `core_designsystem_logo_prezel` 로고 에셋 추가
- `app` 모듈에 신규 로그인 피처 의존성 및 `kotlinx-serialization` 플러그인 추가

* refactor: PrezelNavigationBar의 리플 효과 제거 및 스타일 수정

`PrezelNavigationBar`의 사용자 경험과 디자인 일관성을 높이기 위해 클릭 피드백을 제거하고 스타일을 조정했습니다.

* **리플 효과 제거**: `NoRippleInteractionSource`를 추가하고 `PrezelNavigationBarItem`에 적용하여 클릭 시 발생하는 리플 애니메이션을 비활성화했습니다.
* **색상 수정**: 선택된 아이템의 강조 표시 배경색(`indicatorColor`)을 `bgRegular`에서 `Transparent`로 변경했습니다.
* **명명 규칙 변경**: `PrezelNavigationBarScope` 내의 `item` 함수를 대문자로 시작하는 `Item`으로 변경하여 컴포저블 컨벤션을 준수했습니다.
* **유틸리티 추가**: `MutableInteractionSource`를 상속받아 상호작용을 무시하는 `NoRippleInteractionSource` 객체를 추가했습니다.

* refactor: PrezelSnackbar 액션 버튼 선택 기능 추가 및 구조 개선

`PrezelSnackbar`에서 액션 버튼(`actionLabel`)이 없을 경우에도 텍스트만 표시(Toast 형태)할 수 있도록 기능을 개선했습니다.

*   `PrezelSnackbar`: `visuals.actionLabel`이 `null`인 경우 액션 버튼과 간격(`Spacer`)을 렌더링하지 않도록 수정
*   `SnackbarHost`: `PrezelSnackbarVisuals`의 `actionLabel` 타입을 옵셔널(`String?`)로 변경
*   `showPrezelSnackbar`:
    *   `actionLabel` 및 `onAction` 파라미터를 선택 사항으로 변경
    *   `actionLabel`과 `onAction`이 동시에 존재하거나 둘 다 없어야 함을 보장하는 `require` 구문 추가
*   `Preview`: 액션 버튼이 없는 경우를 위한 `PrezelToastPreview` 추가 및 기존 프리뷰 데이터 구조 수정

* feat: Kakao SDK 도입 및 관련 설정 추가

* feat: Kakao SDK 의존성 추가 및 초기화 로직 구현
    * `libs.versions.toml`에 Kakao SDK 버전 및 `kakao-user` 라이브러리 추가
    * `settings.gradle.kts`에 Kakao Maven 저장소 등록
    * `PrezelApplication`에서 `KakaoSdk.init`을 통한 SDK 초기화 로직 추가

* feat: Kakao Native App Key 설정 및 Manifest 등록
    * `app/build.gradle.kts`에서 프로젝트 속성의 `KAKAO_NATIVE_APP_KEY`를 읽어 `BuildConfig` 및 `manifestPlaceholders`에 설정
    * `AndroidManifest.xml`에 카카오 로그인을 위한 `AuthCodeHandlerActivity` 등록 및 스킴 설정

* build: 모듈별 의존성 추가
    * `app` 및 `feature:login:impl` 모듈에 `kakao-user` 의존성 추가

* refactor: PrezelApp 내 네비게이션 아이템 호출부 수정
    * `PrezelApp.kt`에서 네비게이션 아이템 생성 시 `item` 호출을 대문자 `Item`으로 수정 (컴포넌트 명칭 변경 대응)

* feat: 중복 클릭 방지를 위한 `ComposeMultipleEventCutter` 유틸리티 추가

중복 이벤트 발생을 방지하기 위해 일정 시간 내의 연속된 클릭을 제한하는 `ComposeMultipleEventCutter` 객체와 확장 함수를 추가했습니다.

*   `clickOnce`: 파라미터 유무에 따른 클릭 이벤트 중복 방지 확장 함수 추가
*   `ComposeMultipleEventCutter`: 마지막 이벤트 발생 시간을 기준으로 이벤트 실행 여부를 판단하는 내부 객체 구현

* feat: 중복 클릭 방지를 위한 `ComposeMultipleEventCutter` 유틸리티 추가

중복 이벤트 발생을 방지하기 위해 일정 시간 내의 연속된 클릭을 제한하는 `ComposeMultipleEventCutter` 객체와 확장 함수를 추가했습니다.

*   `clickOnce`: 파라미터 유무에 따른 클릭 이벤트 중복 방지 확장 함수 추가
*   `ComposeMultipleEventCutter`: 마지막 이벤트 발생 시간을 기준으로 이벤트 실행 여부를 판단하는 내부 객체 구현

* feat: 카카오 로그인 연동을 위한 KakaoLoginManager 및 KakaoLoginResult 추가

* `KakaoLoginManager`: 카카오 SDK를 활용하여 로그인(카카오톡/카카오계정) 및 로그아웃 기능을 처리하는 클래스 추가
* `KakaoLoginResult`: 로그인 성공 시 액세스 토큰을 반환하고 실패 시 에러를 전달하는 sealed interface 정의
* `suspendCancellableCoroutine`을 사용하여 비동기 SDK 콜백 로직을 코루틴 기반으로 구현

* feat: 카카오 로그인 연동 및 MVI 구조 기반 로그인 로직 구현

카카오 로그인 기능을 추가하고, 기존의 단순했던 로그인 로직을 `LoginUiIntent`, `LoginUiState`, `LoginUiEffect`를 활용한 MVI 패턴으로 리팩토링했습니다.

* **feat: 카카오 로그인 연동 및 상태 관리 개선**
    * `LoginUiIntent`를 추가하여 로그인 클릭, 성공, 실패 액션을 정의했습니다.
    * `LoginUiState`를 `sealed interface`에서 `data class`로 변경하고 `isLoading` 상태를 관리하도록 수정했습니다.
    * `LoginUiEffect`에 `LaunchKakaoLogin` 및 `ShowSnackbar` 효과를 추가했습니다.
    * `LoginViewModel`에서 `onIntent` 메서드를 통해 비즈니스 로직을 처리하도록 구현했습니다.

* **feat: 로그인 화면 UI 업데이트 및 스낵바 추가**
    * `KakaoLoginManager`를 연동하여 실제 카카오 로그인 프로세스를 호출합니다.
    * 로그인 버튼을 디자인 시스템의 `PrezelButtonArea` 및 카카오 아이콘을 사용한 '카카오로 시작하기' 버튼으로 교체했습니다.
    * 로그인 실패 시 에러 메시지를 표시하기 위한 `SnackbarHost` 및 `PrezelSnackbar`를 추가했습니다.
    * 중복 클릭 방지를 위해 `clickOnce` 확장 함수를 적용하고 `isLoading` 상태에 따른 버튼 활성화 로직을 추가했습니다.

* **refactor: 로그인 화면 레이아웃 및 코드 구조 정리**
    * `LoginScreen`의 최상위 레이아웃을 `Box`로 변경하여 스낵바 위치를 조정했습니다.
    * 불필요한 `fillMaxWidth` 및 패딩 설정을 정리하고 프리뷰 코드를 업데이트했습니다.

* refactor: LoginScreen 하드코딩된 문자열 리소스화 및 코드 정리

`LoginScreen` 내에서 사용되던 카카오 로그인 실패 메시지를 문자열 리소스로 분리하고, 레이아웃 한정자 및 컴포저블 구조를 정리했습니다.

*   `strings.xml`: 카카오 로그인 실패 메시지(`feature_login_impl_kakao_failure`) 추가
*   `LoginScreen.kt`:
    *   `stringResource`를 사용하여 로그인 실패 메시지 적용
    *   `Column`의 `modifier` 파라미터 중복 참조 수정 (`modifier` -> `Modifier`)
    *   `SnackbarHost` 내부 람다 형식 및 코드 정렬 수정

* build: local.properties를 통한 KAKAO_NATIVE_APP_KEY 로드 방식 변경

`app/build.gradle.kts`에서 `KAKAO_NATIVE_APP_KEY`를 가져오는 방식을 `project.findProperty`에서 `local.properties` 파일을 직접 로드하여 읽어오는 방식으로 수정했습니다. 키가 존재하지 않을 경우 에러를 발생시키도록 변경하여 빌드 시점의 안정성을 강화했습니다.

* refactor: LoginViewModel 로직 개선 및 Intent 구조 정리

`LoginViewModel`의 내부 로직을 정리하고, 외부에서 직접 호출 가능한 메서드를 도입하여 네비게이션 및 결과 처리 구조를 개선했습니다.

* **LoginViewModel**:
    * `onIntent`에서 처리하던 `LoginSucceeded`, `LoginFailed` 로직을 별도의 public 메서드인 `onLoginSuccess()`, `onLoginFailure()`로 분리했습니다.
    * 불필요한 들여쓰기를 수정하고 코드를 정리했습니다.
* **LoginUiIntent**: 더 이상 사용되지 않는 `LoginSucceeded`, `LoginFailed` intent를 제거했습니다.
* **LoginScreen**: 카카오 로그인 결과에 따라 `viewModel.onLoginSuccess()` 또는 `viewModel.onLoginFailure()`를 직접 호출하도록 수정했습니다.
* **기타**:
    * `feature:login:api` 모듈의 불필요한 `AndroidManifest.xml`을 삭제했습니다.
    * `feature:login:impl` 모듈의 `AndroidManifest.xml` 형식을 간소화했습니다.

* refactor: Snackbar 컴포넌트 개선 및 LoginScreen UI 정리

*   **core:designsystem**: `PrezelSnackbar`에서 `actionLabel`이 없을 경우 버튼을 렌더링하지 않도록 방어 로직을 추가하고, 관련 프리뷰 코드를 `BasicPreview` 및 `PreviewSection` 구조로 개선했습니다.
*   **core:designsystem**: `showPrezelSnackbar` 확장 함수에서 불필요하게 복잡했던 파라미터 정의와 `require` 제약 조건을 제거하여 호출부를 단순화했습니다.
*   **feature:login**: `LoginScreen` 내 스낵바 호출 시 누락된 액션 파라미터를 추가하고, 사용하지 않는 `PrezelButtonArea` 관련 코드 및 임포트를 정리했습니다.
*   **style**: `PrezelNavigationBar` 내 불필요한 공백 및 임포트 순서를 정리했습니다.

* feat: 로그인 화면 카카오 로그인 버튼 추가 및 UI 레이아웃 개선

* **feat: 카카오 로그인 버튼 추가**
    * `LoginFooter` 내부에 카카오 브랜드 색상(`0xFFFEE500`)이 적용된 `PrezelButtonArea` 및 커스텀 버튼을 구현했습니다.
    * `PrezelIcons.Kakao` 아이콘과 "카카오로 시작하기" 라벨을 적용했습니다.
    * `isLoading` 상태에 따른 버튼 활성화 로직을 추가했습니다.

* **refactor: 로그인 화면 레이아웃 및 애니메이션 구조 개선**
    * `LoginScreen`의 전체 구조를 `Column`에서 `Box`로 변경하여 로고와 푸터의 배치를 최적화했습니다.
    * 로고 이미지가 화면 중앙에 올바르게 위치하도록 `Alignment.Center` 및 `Box` 래퍼를 추가했습니다.
    * `SharedElement` 전환 효과가 적용되는 로고 이미지의 레이아웃 제약 조건을 수정했습니다.

* **refactor: ButtonAreaScope 내부 로직 수정**
    * `validateButtonCount`에서 버튼이 2개인 경우 리스트를 초기화하는 로직을 추가하여 버튼 선언 제한 로직을 보완했습니다.

* **test: 미리보기(Preview) 추가**
    * 로딩 상태를 확인할 수 있는 `LoginScreenLoadingPreview`를 추가했습니다.

* refactor: LoginScreen 카카오 로그인 버튼 설정 및 구조 개선

* `LoginScreen` 내 카카오 로그인 버튼의 `PrezelButtonConfig`를 별도 변수(`kakaoButtonConfig`)로 분출하여 가독성을 개선했습니다.
* `PrezelButtonArea`에서 불필요한 `isNested = true` 파라미터를 제거했습니다.
* 사용하지 않는 import문을 정리했습니다.

* refactor: 카카오 로그인 로직 리팩터링 및 의존성 구조 개선

* refactor: 카카오 로그인 로직 core:data 모듈 이동 및 인터페이스화

- `feature:login:impl`에 위치하던 `KakaoLoginManager`를 `core:data` 모듈로 이동했습니다.
- `KakaoLoginManager`를 인터페이스로 정의하고, `KakaoLoginManagerImpl`에서 상세 로직을 구현하도록 변경했습니다.
- `KakaoLoginResult` sealed interface를 `core:data`로 이동했습니다.
- Hilt를 사용하여 `RepositoryModule`에서 `KakaoLoginManager` 의존성을 주입하도록 설정했습니다.

* refactor: LoginViewModel 내 카카오 로그인 비즈니스 로직 통합

- `LoginUiIntent`를 제거하고 `onClickLogin` 메서드로 직접 이벤트를 처리하도록 변경했습니다.
- `LoginScreen`에서 수행하던 카카오 로그인 호출 로직을 `LoginViewModel` 내부로 이동하여 뷰모델의 책임을 강화했습니다.
- `LoginUiEffect`에서 더 이상 사용되지 않는 `LaunchKakaoLogin`을 제거했습니다.
- 로그인 성공/실패 시의 상태 업데이트 및 Side Effect 처리 로직을 정리했습니다.

* build: 모듈 간 의존성 정리

- `core:data` 모듈에 `kakao.user` 라이브러리 의존성을 추가했습니다.
- `feature:login:impl`에서 `kakao.user` 의존성을 제거하고 `core:data`를 참조하도록 수정했습니다.
- `app` 모듈의 `build.gradle.kts`에서 불필요하게 명시되어 있던 `feature:login` 관련 의존성을 제거했습니다.

* style: LoginViewModel 및 LoginScreen 코드 스타일 정리

- `LoginViewModel` 및 `LoginScreen` 내 불필요한 공백을 제거하고 코드를 정렬했습니다.
- `LoginScreen`의 `onLogin` 콜백에서 Context와 실패 메시지를 ViewModel로 전달하도록 수정했습니다.

* refactor: 디자인 시스템 유틸리티 함수 및 InteractionSource 개선

*   **ComposeMultipleEventCutter**: `clickOnce` 확장 함수가 값을 직접 받아 실행하던 방식에서, 중복 클릭 방지 로직이 적용된 람다 함수를 반환하도록 구조를 변경했습니다.
*   **NoRippleInteractionSource**: `tryEmit`의 반환값을 `true`에서 `false`로 수정하여 상호작용 이벤트가 실제로 방출되지 않음을 명확히 했습니다.

* refactor: KakaoLoginResult 클래스 구조 개선 및 관련 로직 수정

* refactor: KakaoLoginResult에서 액세스 토큰 제거 및 데이터 객체로 변경

`KakaoLoginResult.Success`에서 불필요한 `accessToken` 필드를 제거하고 `data object`로 전환했습니다.

*   `KakaoLoginResult.Success`를 `data class`에서 `data object`로 변경
*   `KakaoLoginManagerImpl`에서 로그인 성공 시 토큰을 전달하지 않고 `KakaoLoginResult.Success`만 반환하도록 수정

* build: buildConfig 및 local.properties 키 네이밍 컨벤션 수정

`local.properties` 및 `buildConfig`에서 사용하는 키 명칭을 대문자 스네이크 케이스(Upper Snake Case)에서 소문자 도트 표기법(Dot notation)으로 변경하여 일관성을 높였습니다.

*   `app`: 카카오 네이티브 앱 키 참조명을 `KAKAO_NATIVE_APP_KEY`에서 `kakao.native.app.key`로 수정
*   `core:network`: 빌드 타입별 베이스 URL 키 생성 로직을 `${buildType.uppercase()}_BASE_URL`에서 `${buildType}.base.url` 형식으로 수정

* refactor: 로그인 화면 전환 및 내비게이션 바 표시 로직 개선 (#55)

* feat: 로그인 성공 시 화면 전환 애니메이션 및 딜레이 추가

로그인 성공 후 홈 화면으로 이동할 때 갑작스러운 UI 변화를 방지하기 위해 전환 로직을 개선했습니다.
* `LoginScreen`에서 홈 이동 시 `fadeOut` 애니메이션(120ms) 및 이에 맞춘 `delay`를 적용했습니다.
* 내비게이션 바가 나타날 때 앱 콘텐츠와 자연스럽게 어우러지도록 `NAV_TRANSITION_DURATION`(100ms) 지연 후 표시되도록 수정했습니다.

* refactor: LoginScreen 상태 관리 및 UI 로직 최적화

* `isLoading` 상태 대신 `showLoginButton` 플래그를 사용하여 화면 전환 시 버튼 노출 여부를 제어하도록 변경했습니다.
* `LoginFooter`의 `AnimatedVisibility`에 `fadeOut` 효과를 추가했습니다.
* `LoginViewModel`의 `uiState` 관찰 로직을 단순화하고 불필요한 `collectAsStateWithLifecycle` 참조를 제거했습니다.
* 프리뷰 코드에서 사용하지 않는 로딩 상태 케이스를 정리했습니다.

* fix: PrezelApp 내비게이션 바 표시 조건부 렌더링 수정

`PrezelApp`에서 `appState.shouldShowNavigationBar` 변경 시 `LaunchedEffect`를 통해 상태를 비동기적으로 업데이트하여 화면 전환 애니메이션과의 싱크를 맞췄습니다.

* refactor: LoginViewModel 상태 관리 방식 개선 및 LoginUiState 제거

`LoginViewModel`에서 `StateFlow` 기반의 `LoginUiState`를 제거하고, 내부 변수를 사용하는 방식으로 상태 관리 로직을 단순화했습니다.

* `LoginUiState` 클래스 삭제
* `LoginViewModel` 내 `MutableStateFlow` 형태의 `_uiState`를 삭제하고 `isLoginInProgress` 플래그 변수로 대체
* 로그인 진행 상태에 따른 중복 호출 방지 및 상태 업데이트 로직 수정 (Flow 업데이트 대신 변수 값 할당)

* feat: 카카오 로그인 프로세스 개선 및 예외 처리 강화 (#55)

* feat: 카카오 로그인 속도 제한(Rate Limit) 대응 추가

카카오 로그인 시도 횟수가 초과되었을 때의 상태를 정의하고 사용자에게 알림을 표시하도록 기능을 추가했습니다.

*   `KakaoLoginResult`: `RateLimited` 상태 추가
*   `LoginViewModel`: 로그인 실패 시나리오에 `rateLimitMessage` 처리 로직 추가
*   `strings.xml`: "로그인 시도가 너무 많습니다" 안내 문구 추가
*   `core:data`: `timber` 의존성 추가 및 `AuthError`(429) 발생 시 `RateLimited`로 변환하는 로직 구현

* refactor: 카카오 로그인 로직 고도화 및 로깅 추가

카카오톡 앱 로그인 실패 시 카카오 계정 로그인으로 자동 전환되는 로직을 개선하고, `Timber`를 통한 실행 로그를 추가했습니다.

*   카카오톡 로그인 중 사용자 취소(`ClientErrorCause.Cancelled`) 시 즉시 실패 처리
*   카카오톡 로그인 불가 혹은 오류 시 `loginWithKakaoAccount`로 fallback 처리
*   로그인 단계별(성공, 실패, 취소) 로그 기록 추가

* refactor: 앱 네비게이션 바 표시 로직 및 애니메이션 최적화

*   `PrezelApp`: 네비게이션 바 표시 여부를 결정할 때 사용하던 불필요한 `LaunchedEffect`와 `delay` 로직을 제거하고 `appState`를 직접 참조하도록 단순화했습니다.
*   `LoginScreen`: 로그인 버튼 영역의 `AnimatedVisibility` 종료 애니메이션(`exit`)을 `None`으로 변경하여 화면 전환 시 시각적 일관성을 개선했습니다.

* chore: ktlint 적용

* refactor: 로그인 기능 개선 및 UI 로직 리팩터링

* refactor: LoginScreen 내 SnackbarHostState 전역 관리 적용

`LocalSnackbarHostState` CompositionLocal을 사용하여 `LoginScreen`에서 직접 관리하던 `SnackbarHostState`를 전역 상태로 전환했습니다.

*   `LoginScreen`에서 로컬 `remember { SnackbarHostState() }` 제거 및 `LocalSnackbarHostState.current` 사용
*   `LoginContent`에서 불필요한 `snackbarHostState` 파라미터 및 `SnackbarHost` 컴포저블 제거
*   Preview 코드에 `CompositionLocalProvider`를 적용하여 `LocalSnackbarHostState` 주입

* refactor: LoginViewModel 코드 스타일 및 로직 최적화

*   클래스 선언 및 생성자 주입 부분의 들여쓰기 스타일을 수정했습니다.
*   `onClickLogin` 내 `when` 식에서 불필요한 변수 할당(`val result = ...`)을 제거했습니다.

* fix: ButtonAreaScope 내 버튼 개수 검증 로직 수정

`validateButtonCount` 함수에서 버튼이 2개일 때 리스트를 초기화하던 잘못된 로직을 삭제하고, 2개 미만인지 확인하는 `require` 구문만 남겨 검증 로직을 올바르게 수정했습니다.

* feat: 로그인 기능 고도화 및 Intent 기반 MVI 구조 적용

* feat: LoginUiIntent 및 LoginUiState 정의

로그인 화면의 상태 관리와 사용자 액션 처리를 위해 MVI 패턴의 기초가 되는 Intent와 State 클래스를 추가했습니다.

*   `LoginUiIntent`: `OnClickLogin` 액션 정의 (Context 및 에러 메시지 포함)
*   `LoginUiState`: 로딩 상태(`isLoading`)를 관리하도록 정의

* refactor: LoginViewModel MVI 패턴 적용 및 로직 개선

`LoginViewModel`의 상태 관리 방식을 개선하고 사용자 입력을 `onIntent`를 통해 처리하도록 리팩토링했습니다.

*   `isLoginInProgress`와 `isNavigatingToHome`으로 분산되어 있던 상태를 `isLoading`으로 통합
*   `onClickLogin` 직접 호출 방식에서 `LoginUiIntent`를 통한 처리 방식으로 변경
*   로그인 성공 시 UI State를 통한 네비게이션 제어 대신 `LoginUiEffect`를 통한 단발성 이벤트 처리로 통일

* refactor: LoginScreen 상태 연동 및 UI 로직 개선

ViewModel의 `uiState`를 화면에 반영하고, 로그인 진행 중 버튼 비활성화 로직을 추가했습니다.

*   `collectAsStateWithLifecycle`을 사용하여 `uiState` 구독
*   `LoginFooter` 및 `LoginScreen`에 `isLoginEnabled` 파라미터를 추가하여 로딩 중 버튼 중복 클릭 방지
*   ViewModel의 `onIntent`를 호출하여 로그인 로직을 실행하도록 수정
*   Preview 코드에 신규 파라미터 대응 및 구조 업데이트

* feat: core:auth 모듈 추가 및 카카오 로그인 로직 이관

카카오 로그인 관련 기능을 `core:data` 모듈에서 신규 생성한 `core:auth` 모듈로 분리하여 모듈화 구조를 개선했습니다.

* **신규 모듈 생성 및 설정**:
    * `core:auth` 모듈을 추가하고 `settings.gradle.kts`에 등록했습니다.
    * `app` 모듈에 집중되어 있던 `KAKAO_NATIVE_APP_KEY` 설정 및 빌드 로직을 `core:auth` 모듈로 이동했습니다.
    * `AndroidManifest.xml` 내 카카오 인증 관련 `AuthCodeHandlerActivity` 설정을 `core:auth` 모듈로 이관했습니다.

* **인증 로직 이관**:
    * `KakaoLoginManager`, `KakaoLoginManagerImpl`, `KakaoLoginResult` 클래스를 `core:data.auth`에서 `core:auth` 패키지로 이동했습니다.
    * `KakaoAuthInitializer`를 추가하여 `Application` 클래스에서 수행하던 SDK 초기화 로직을 캡슐화했습니다.
    * Hilt 의존성 주입을 위한 `AuthModule`을 추가하고 기존 `RepositoryModule`의 바인딩을 정리했습니다.

* **의존성 및 참조 수정**:
    * `app`, `feature:login:impl` 모듈에서 `core:data` 대신 `core:auth`를 참조하도록 의존성을 수정했습니다.
    * `LoginViewModel` 등 관련 코드의 import 경로를 새 패키지에 맞게 업데이트했습니다.
    * `core:data` 및 `app` 모듈의 `build.gradle.kts`에서 불필요해진 카카오 SDK 및 Timber 의존성을 제거했습니다.

* chore: ktlint 적용

* refactor: 로그인 로직 리팩터링 및 KakaoLoginManager 의존성 주입 구조 개선 (#52)

* refactor: LoginViewModel 내 KakaoLoginManager 의존성 제거 및 로직 이동

`LoginViewModel`에서 직접 수행하던 카카오 로그인 로직을 `LoginScreen`으로 이동하고, ViewModel은 상태 관리와 UI Effect 전달에 집중하도록 개선했습니다.

*   `LoginViewModel`: `KakaoLoginManager` 의존성 제거 및 `LaunchKakaoLogin` Effect 추가
*   `LoginUiIntent`: `OnClickLogin`에서 불필요한 `Context` 및 메시지 파라미터 제거, `OnLoginSuccess`, `OnLoginFailure` 인텐트 추가
*   `LoginUiEffect`: `LaunchKakaoLogin` 추가 및 `NavigateToHome` 처리 로직 단순화
*   `reduce` 확장 함수를 추가하여 `LoginUiState` 업데이트 로직 정형화

* refactor: LoginScreen 내 로그인 로직 구현 및 네비게이션 연동

`LoginScreen`에서 `KakaoLoginManager`를 직접 호출하여 로그인을 수행하고, 결과에 따라 ViewModel에 인텐트를 전달하도록 수정했습니다.

*   `LoginScreen`: `KakaoLoginManager` 파라미터 추가 및 `LaunchedEffect` 내에서 `LaunchKakaoLogin` Effect 처리 로직 구현
*   로그인 성공/실패 시 `viewModel.onIntent`를 통해 상태 업데이트 요청
*   `isNavigatingToHome` 상태에 따른 화면 전환 및 딜레이 로직 개선

* build: LoginEntryBuilder 의존성 주입 수정

`LoginEntryBuilder` 및 `FeatureLoginModule`에서 `KakaoLoginManager`를 주입받아 `LoginScreen`으로 전달하도록 수정했습니다.

*   `featureLoginEntryBuilder`: `KakaoLoginManager` 파라미터 추가 및 `LoginScreen` 호출부에 전달
*   `FeatureLoginModule`: `provideFeatureLoginEntryBuilder`에서 Hilt를 통해 `KakaoLoginManager` 주입 설정

* chore: ktlint 적용

* refactor: 로그인 화면 리팩터링 및 스낵바 문구 리소스화 (#52)

* refactor: LoginScreen 내 Side Effect 처리 로직 분리

`LoginScreen` 컴포저블의 가독성을 높이기 위해 UI 효과(Effect)를 처리하는 로직을 별도의 `HandleLoginEffects` 컴포저블로 추출했습니다.

*   `HandleLoginEffects` 추가: 카카오 로그인 실행, 홈 화면 이동, 스낵바 표시 등 비즈니스 로직 수반 효과 분리
*   `LaunchedEffect` 키 수정: `Unit`에서 `uiEffect` 흐름(Flow)으로 변경하여 안정성 강화
*   `LoginScreen` 구조 개선: 상태 관리 로직과 UI 렌더링 부분을 명확히 구분

* feat: 로그인 관련 스낵바 확인 문구 리소스 추가

스낵바에서 사용되는 "확인" 버튼 텍스트를 하드코딩 대신 문자열 리소스로 관리하도록 수정했습니다.

*   `strings.xml`에 `feature_login_impl_snackbar_confirm` 리소스 추가
*   `showPrezelSnackbar` 호출 시 해당 리소스를 `actionLabel`로 사용하도록 반영

* refactor: 로그인 화면의 카카오 로그인 처리 로직 리팩터링

* refactor: `LoginScreen` 내 카카오 로그인 로직 분리 및 최적화

`LoginScreen` 컴포저블 내에 인라인으로 작성되어 있던 카카오 로그인 실행 및 결과 처리 로직을 별도의 함수로 추출하여 가독성을 개선했습니다.

*   `loginWithKakao`: `KakaoLoginManager`를 호출하고 결과를 `LoginUiIntent`로 변환하는 suspend 함수 추가
*   `toLoginIntent`: `KakaoLoginResult` 상태를 `LoginUiIntent`의 성공/실패 상태로 매핑하는 확장 함수 추가
*   `LoginScreen` 내 `uiEffect` 수집 로직에서 위 함수들을 사용하도록 변경하여 코드 간소화

* refactor: 빌드 타입별 Kakao Native App Key 분리 적용

`local.properties`에서 관리하는 Kakao Native App Key를 빌드 타입(debug, release)에 따라 개별적으로 설정할 수 있도록 개선하였습니다.

* `build.gradle.kts` 내 `setKakaoNativeAppKey` 확장 함수를 추가하여 중복 로직을 제거했습니다.
* `debug` 및 `release` 빌드 타입에서 각각 `${buildType}.kakao.native.app.key` 프로퍼티를 참조하도록 수정했습니다.
* `buildConfigField` 및 `manifestPlaceholders`에 빌드 타입별 키 값이 적용되도록 구성했습니다.

Co-authored-by: moondev03 <moondev03@gmail.com>

* refactor: 인증 시스템 아키텍처 개선 및 KakaoAuthClient 리팩터링

- 기존의 카카오 전용 인증 로직을 범용적인 `AuthManager` 및 `AuthClient` 구조로 추상화하여 확장성을 높였습니다.

Co-authored-by: moondev03 <moondev03@gmail.com>

* feat: 로그인 기능 고도화 및 추상화된 인증 레이어 적용

Co-authored-by: moondev03 <moondev03@gmail.com>

* refactor: SplashScreen 로직 및 레이아웃 최적화

- `SplashScreen`의 로직을 간소화하고, 로고 이미지의 레이아웃 방식을 개선하였습니다.

Co-authored-by: moondev03 <moondev03@gmail.com>

* refactor: SnackbarHostState.showPrezelSnackbar 파라미터 개선

- `showPrezelSnackbar` 확장 함수를 더 유연하게 사용할 수 있도록 파라미터 구조를 개선했습니다.

Co-authored-by: moondev03 <moondev03@gmail.com>

* refactor: KakaoAuthInitializer를 AuthInitializer로 추상화 및 명칭 변경

- `PrezelApplication`에서 특정 플랫폼(Kakao)에 종속된 초기화 클래스 명칭을 더 범용적인 `AuthInitializer`로 변경하였습니다.

Co-authored-by: moondev03 <moondev03@gmail.com>

* refactor: PrezelApp 내 뒤로 가기 애니메이션(predictivePopTransitionSpec) 추가

Co-authored-by: moondev03 <moondev03@gmail.com>

* refactor: PrezelNavigationBar 가시성 전환 시 애니메이션 적용

Co-authored-by: moondev03 <moondev03@gmail.com>

* chore: LoginScreen 내 사용되지 않는 상수 제거

`LoginScreen.kt`에서 사용되지 않는 상수 `LOGIN_EXIT_DURATION`을 삭제하였습니다.

Co-authored-by: moondev03 <moondev03@gmail.com>

* refactor: 로그인 실패 및 취소 관련 알림 문구 수정

- 로그인 과정에서 발생하는 예외 상황에 대한 사용자 메시지를 더 부드러운 어조로 개선하고, 취소 케이스를 분리하였습니다.

Co-authored-by: moondev03 <moondev03@gmail.com>

* refactor: 로그인 로직 임시 수정: 홈 화면 바로 이동하도록 변경

* refactor: `LoginViewModel` 내 로그인 클릭 핸들링 로직 수정

- `LoginUiIntent.OnClickLogin`에서 `AuthProvider` 파라미터를 제거했습니다.
- 로그인 버튼 클릭 시 실제 인증 프로세스를 시작하는 대신, `LoginUiEffect.NavigateToHome`을 전송하여 즉시 홈 화면으로 이동하도록 임시 수정했습니다.
- 불필요한 `AuthProvider` 임포트 문을 제거했습니다.

---------

Co-authored-by: moondev03 <moondev03@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ feat 새로운 기능 추가 또는 기존 기능 확장

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PrezelAccordion 구현

2 participants