Skip to content

Conversation

@xx-lvr
Copy link
Collaborator

@xx-lvr xx-lvr commented Feb 24, 2025

๐Ÿ’ก ๊ฐœ์š”

SignIn ํŽ˜์ด์ง€๋ฅผ ํผ๋ธ”๋ฆฌ์‹ฑ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“ƒ ์ž‘์—…๋‚ด์šฉ

DoMaInputID, DoMaInputPassWord,DoMaLoginButton, SigninํŽ˜์ด์ง€ ๊ตฌํ˜„

๐Ÿ”€ ๋ณ€๊ฒฝ์‚ฌํ•ญ

Signin Page์— screen๊ณผ component

๐Ÿ™‹โ€โ™‚๏ธ ์งˆ๋ฌธ์‚ฌํ•ญ

  • ๊ฐœ์„ ํ•  ์ , ์˜คํƒ€, ์ฝ”๋“œ์— ์ด์‚ฐํ•œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด Comment ๋‹ฌ์•„์ฃผ์„ธ์š”.

๐Ÿด ์‚ฌ์šฉ๋ฐฉ๋ฒ•

๐ŸŽธ ๊ธฐํƒ€

Summary by CodeRabbit

  • New Features
    • ๊ฐœ์„ ๋œ ๋กœ๊ทธ์ธ ์ธํ„ฐํŽ˜์ด์Šค: ์‚ฌ์šฉ์ž ID ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ ํ•„๋“œ, ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ๊ณผ ๋”๋ถˆ์–ด ๊ตฌ๊ธ€ ์ธ์ฆ์šฉ ์›น๋ทฐ ์ง€์› ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ํ–ฅ์ƒ๋œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ: ๋ฌธ์ž ์ œํ•œ, ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ฐ€๋Šฅํ•œ ํ…์ŠคํŠธ ํ•„๋“œ๊ฐ€ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ์ƒˆ ํ…Œ๋งˆ ์ƒ‰์ƒ: ๋ฐฐ๊ฒฝ, ๊ฐ•์กฐ ์ƒ‰์ƒ ๋“ฑ ์ƒˆ๋กœ์šด ์ƒ‰์ƒ ์˜ต์…˜์œผ๋กœ ์ผ๊ด€๋œ UI ๋””์ž์ธ์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
    • ์ƒˆ๋กœ์šด ๊ธฐ๊ธฐ ์‚ฌ์–‘ ์ถ”๊ฐ€: ์—ฌ๋Ÿฌ ์ƒˆ๋กœ์šด ๊ธฐ๊ธฐ ๋ชจ๋ธ์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.

@coderabbitai
Copy link

coderabbitai bot commented Feb 24, 2025

Walkthrough

์ด PR์€ ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ ํŒŒ์ผ ๋ฐ ์†Œ์Šค ์ฝ”๋“œ์— ๊ฑธ์ณ ๋‹ค์–‘ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. XML ํŒŒ์ผ์—์„œ ๋ถˆํ•„์š”ํ•œ <SelectionState> ์š”์†Œ๊ฐ€ ์‚ญ์ œ๋˜์—ˆ์œผ๋ฉฐ, ๊ธฐ๊ธฐ ์„ ํƒ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€/์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Gradle ํŒŒ์ผ์—์„œ๋Š” Firebase ์• ๋…ธํ…Œ์ด์…˜ ์˜์กด์„ฑ์ด ์ถ”๊ฐ€๋˜์—ˆ๊ณ , Kotlin ์†Œ์Šค ์ฝ”๋“œ์—์„œ๋Š” ์ƒˆ๋กœ์šด ์ปดํฌ์ €๋ธ” UI ์ปดํฌ๋„ŒํŠธ์™€ ๋กœ๊ทธ์ธ ํ™”๋ฉด์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ํŒจํ‚ค์ง€ ๋ช… ์˜คํƒ€ ์ˆ˜์ • ๋ฐ ๊ด€๋ จ ViewModel์˜ import ๊ฒฝ๋กœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Changes

ํŒŒ์ผ ๊ฒฝ๋กœ(s) ๋ณ€๊ฒฝ ์š”์•ฝ
.idea/deploymentTargetSelector.xml <SelectionState> ์š”์†Œ 4๊ฐœ ์‚ญ์ œ (data, data2, domain, presentation)
.idea/other.xml ์ƒˆ๋กœ์šด ๊ธฐ๊ธฐ ๋ฐ์ดํ„ฐ (OnePlus, Samsung, Motorola ๋“ฑ) ์ถ”๊ฐ€ ๋ฐ ๊ธฐ์กด ๊ธฐ๊ธฐ ๋ฐ์ดํ„ฐ ์ˆ˜์ •
buildSrc/.../counters.tab ๊ฐ’ '5'๊ฐ€ '3'์œผ๋กœ ๋ณ€๊ฒฝ๋จ
gradle/libs.versions.toml
presentation/build.gradle.kts
Firebase ์• ๋…ธํ…Œ์ด์…˜ ๋ฒ„์ „ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ ์ถ”๊ฐ€
PULL_REQUEST_TEMPLATE.md ํŒŒ์ผ ์‚ญ์ œ๋จ
presentation/src/main/java/view/signin/component/{DoMaInputID.kt, DoMaInputPassWord.kt, DoMaLoginButton.kt} ๋กœ๊ทธ์ธ ๊ด€๋ จ UI ์ปดํฌ๋„ŒํŠธ์™€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ•จ์ˆ˜ ์ถ”๊ฐ€
presentation/src/main/java/view/textfield/DoMaTextField.kt ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ ํ…์ŠคํŠธํ•„๋“œ ์ปดํฌ์ €๋ธ” ์ถ”๊ฐ€
presentation/src/main/java/view/signin/screen/{SignInScreen.kt, SignInSubScreen.kt} Google ์ธ์ฆ ๋กœ๊ทธ์ธ ํฌํ•จํ•œ ๋กœ๊ทธ์ธ ํ™”๋ฉด ์ปดํฌ์ €๋ธ” ์ถ”๊ฐ€
presentation/src/main/java/view/theme/color/{ColorTheme.kt, DoMaColor.kt} ์ƒ‰์ƒ ํ…Œ๋งˆ ํ™•์žฅ: BACKGROUND, GREEN, RED, LOGIN ์ถ”๊ฐ€
presentation/src/main/java/until/Result.kt ํŒจํ‚ค์ง€๋ช… "Untill"์—์„œ "until"์œผ๋กœ ์ˆ˜์ •
presentation/src/main/java/viewModel/{admin/AdminViewModel.kt, homes/HomesViewmodel.kt, users/UsersViewModel.kt} import ๊ฒฝ๋กœ ๋ฐ ํƒ€์ž… ์ฐธ์กฐ ์ˆ˜์ • (Untill โ†’ until)

Sequence Diagram(s)

sequenceDiagram
    participant User as ์‚ฌ์šฉ์ž
    participant Screen as SignInScreen
    participant WebView as GAuthSigninWebView
    User->>Screen: ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ
    Screen-->>WebView: ํด๋ผ์ด์–ธํŠธ ID, ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ URI ์ „๋‹ฌ
    WebView-->>Screen: ์ธ์ฆ ์ฝ”๋“œ ๋ฐ˜ํ™˜
    Screen-->>User: ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ์ „๋‹ฌ
Loading

Possibly related PRs

Suggested labels

1๏ธโƒฃ Priority: High, bug

Suggested reviewers

  • nahyunuk

Poem

๋‚˜๋Š” ์ž‘์€ ํ† ๋ผ, ์ฝ”๋“œ ์ˆฒ์„ ๋‹ฌ๋ฆฌ๋ฉฐ,
๋ณ€๊ฒฝ๋œ ์ƒ‰๊ณผ UI์— ๋ฐœ๊ธธ์„ ๋ฉˆ์ถ”๊ณ , ๐Ÿ‡
Firebase ๊ฟˆ์„ ์•ˆ๊ณ  ์ƒˆ๋กœ์›€์„ ๋…ธ๋ž˜ํ•ด,
๋กœ๊ทธ์ธ ํ™”๋ฉด์— ํฌ๋ง์„ ๋‹ด์•„๋‚ด๋„ค,
๋‚ด ๋ฐœ์ž๊ตญ์€ ํ˜์‹ ์˜ ๋…ธ๋ž˜,
์–ธ์ œ๋‚˜ ์ฆ๊ฒ๊ณ  ํ™œ์ง ํ”ผ์–ด๋‚˜๋„ค!

โœจ Finishing Touches
  • ๐Ÿ“ Generate Docstrings

๐Ÿชง Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@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: 12

๐Ÿ”ญ Outside diff range comments (1)
presentation/src/main/java/view/theme/color/ColorTheme.kt (1)

6-14: ๐Ÿ› ๏ธ Refactor suggestion

์ƒ‰์ƒ ์ƒ์ˆ˜ ๋ช…๋ช… ๊ทœ์น™์˜ ์ผ๊ด€์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ƒ‰์ƒ ์ƒ์ˆ˜๋“ค์˜ ๋ช…๋ช… ๊ทœ์น™์ด ์ผ๊ด€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

  • ์ผ๋ถ€๋Š” ๋Œ€๋ฌธ์ž(MAIN, WHITE)
  • ์ผ๋ถ€๋Š” ํŒŒ์Šค์นผ ์ผ€์ด์Šค(Gold, Broze)

๋˜ํ•œ 'Broze'๋Š” 'Bronze'์˜ ์˜คํƒ€๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ชจ๋“  ์ƒ‰์ƒ ์ƒ์ˆ˜๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ํ†ต์ผํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆ๋“œ๋ฆฝ๋‹ˆ๋‹ค:

-    abstract val MAIN: Color
-    abstract val Black: Color
-    abstract val WHITE: Color
-    abstract val GRAY: Color
-    abstract val Gold: Color
-    abstract val silver: Color
-    abstract val Broze: Color
+    abstract val MAIN: Color
+    abstract val BLACK: Color
+    abstract val WHITE: Color
+    abstract val GRAY: Color
+    abstract val GOLD: Color
+    abstract val SILVER: Color
+    abstract val BRONZE: Color
๐Ÿงน Nitpick comments (6)
presentation/src/main/java/view/theme/color/DoMaColor.kt (1)

15-18: ์ฃผ์„์„ ๋” ์ž์„ธํ•˜๊ฒŒ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

ํ˜„์žฌ ์ฃผ์„์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ƒ‰์ƒ์˜ ์‚ฌ์šฉ ๋ชฉ์ ๊ณผ ์ ์šฉ ์œ„์น˜๋ฅผ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•ด์ฃผ์‹œ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

-    override val SYSTEM = Color(0xFF14C38E) // ์‹œ์Šคํ…œ ์ƒ‰์ƒ (๊ฐ•์กฐ ์ƒ‰์œผ๋กœ ์„ค์ •)
+    override val SYSTEM = Color(0xFF14C38E) // ์‹œ์Šคํ…œ ๊ฐ•์กฐ ์ƒ‰์ƒ - ์ฃผ์š” ์•ก์…˜ ๋ฒ„ํŠผ, ์ง„ํ–‰ ์ƒํƒœ ํ‘œ์‹œ ๋“ฑ์— ์‚ฌ์šฉ
presentation/src/main/java/view/signin/component/DoMaInputID.kt (1)

51-56: ์ƒ‰์ƒ ๊ฐ’์„ ํ…Œ๋งˆ๋กœ ๋ถ„๋ฆฌํ•ด์ฃผ์„ธ์š”.

ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ‰์ƒ ๊ฐ’๋“ค์„ ํ…Œ๋งˆ ์‹œ์Šคํ…œ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ์ผ๊ด€์„ฑ ์žˆ๋Š” ๋””์ž์ธ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

-                    backgroundColor = Color(0xFF1E1E1E),
-                    cursorColor = Color.White,
-                    focusedBorderColor = Color(0xFFB9B9B9),
-                    unfocusedBorderColor = Color(0xFFB9B9B9)
+                    backgroundColor = colors.inputBackground,
+                    cursorColor = colors.cursor,
+                    focusedBorderColor = colors.borderFocused,
+                    unfocusedBorderColor = colors.borderUnfocused
presentation/src/main/java/view/signin/component/DoMaLoginButton.kt (1)

41-48: ์ ‘๊ทผ์„ฑ ๊ฐœ์„ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด contentDescription์„ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.

             Text(
                 text = "๋กœ๊ทธ์ธ",
+                modifier = Modifier.semantics {
+                    contentDescription = "๋กœ๊ทธ์ธ ๋ฒ„ํŠผ"
+                },
                 style = TextStyle(
                     fontSize = 16.sp,
                     fontWeight = FontWeight(700),
                     color = colors.WHITE,
                 )
             )
presentation/src/main/java/view/signin/Screen/SignInScreen.kt (3)

23-29: ํ•จ์ˆ˜ ๋ฌธ์„œํ™” ๋ฐ ๋„ค์ด๋ฐ ๊ฐœ์„ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์‚ฌํ•ญ๋“ค์„ ์ œ์•ˆ๋“œ๋ฆฝ๋‹ˆ๋‹ค:

  1. @Composable ํ•จ์ˆ˜์— KDoc ๋ฌธ์„œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์—ญํ• ์„ ์„ค๋ช…
  2. ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ช…์„ ๋” ๊ด€์šฉ์ ์œผ๋กœ ๋ณ€๊ฒฝ (leIsClickLoginButton โ†’ onLoginClick)
 @Composable
+/**
+ * ๋กœ๊ทธ์ธ ํ™”๋ฉด์„ ํ‘œ์‹œํ•˜๋Š” Composable ํ•จ์ˆ˜
+ *
+ * @param modifier ๋ ˆ์ด์•„์›ƒ ์ˆ˜์ •์ž
+ * @param clickButton Google ์ธ์ฆ ์›น๋ทฐ ํ‘œ์‹œ ์—ฌ๋ถ€
+ * @param gAuthLogin Google ์ธ์ฆ ์™„๋ฃŒ ์‹œ ํ˜ธ์ถœ๋˜๋Š” ์ฝœ๋ฐฑ
+ * @param onLoginClick ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ˜ธ์ถœ๋˜๋Š” ์ฝœ๋ฐฑ
+ */
 fun SignInScreen(
     modifier: Modifier = Modifier,
     clickButton: Boolean,
     gAuthLogin: (String) -> Unit,
-    leIsClickLoginButton: () -> Unit,
+    onLoginClick: () -> Unit,
 )

37-53: ๋ ˆ์ด์•„์›ƒ ๊ตฌ์กฐ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ค‘์ฒฉ๋œ Column์—์„œ modifier๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์žฌ์„ ์–ธ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  2. Typography ์Šคํƒ€์ผ์„ ๋งค๋ฒˆ copyํ•˜๋Š” ๋Œ€์‹  ๋ณ„๋„์˜ ์Šคํƒ€์ผ์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
 Column(
-    modifier = modifier
+    modifier = Modifier
         .fillMaxWidth()
         .padding(start = 20.dp, end = 20.dp, bottom = 20.dp)
         .weight(1f),
     horizontalAlignment = Alignment.Start,
     verticalArrangement = Arrangement.Bottom
 ) {
+    val greetingStyle = DoMaTypography.headlineSmall
     Text(
         text = "์•ˆ๋…•ํ•˜์„ธ์š”!",
-        style = DoMaTypography.headlineSmall.copy(color = colors.WHITE),
+        style = greetingStyle.copy(color = colors.WHITE),
     )
     Text(
         text = "๋กœ๊ทธ์ธ์„ ํ•ด๋ณผ๊นŒ์š”?",
-        style = DoMaTypography.headlineSmall.copy(color = colors.Green),
+        style = greetingStyle.copy(color = colors.Green),
     )
 }

133-141: ํ”„๋ฆฌ๋ทฐ ํ•จ์ˆ˜ ๊ฐœ์„ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ”„๋ฆฌ๋ทฐ ํ•จ์ˆ˜๋ฅผ ํ™•์žฅํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 @Preview
 @Composable
-fun PreviewSignInScreen() {
+fun PreviewSignInScreen() = DoMaAndroidTheme {
     SignInScreen(
         clickButton = false,
         gAuthLogin = {},
         leIsClickLoginButton = {}
     )
 }
+
+@Preview(name = "Google Auth WebView Visible")
+@Composable
+fun PreviewSignInScreenWithWebView() = DoMaAndroidTheme {
+    SignInScreen(
+        clickButton = true,
+        gAuthLogin = {},
+        leIsClickLoginButton = {}
+    )
+}
๐Ÿ“œ Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between 512b3d3 and e5a9f37.

โ›” Files ignored due to path filters (3)
  • buildSrc/build/kotlin/compileKotlin/cacheable/last-build.bin is excluded by !**/*.bin
  • buildSrc/build/kotlin/compileKotlin/local-state/build-history.bin is excluded by !**/*.bin
  • buildSrc/build/libs/buildSrc.jar is excluded by !**/*.jar
๐Ÿ“’ Files selected for processing (11)
  • .idea/deploymentTargetSelector.xml (0 hunks)
  • buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/counters.tab (1 hunks)
  • gradle/libs.versions.toml (2 hunks)
  • presentation/build.gradle.kts (1 hunks)
  • presentation/src/main/java/view/signin/Screen/SignInScreen.kt (1 hunks)
  • presentation/src/main/java/view/signin/Screen/SignInSubScreen.kt (1 hunks)
  • presentation/src/main/java/view/signin/component/DoMaInputID.kt (1 hunks)
  • presentation/src/main/java/view/signin/component/DoMaInputPassWord.kt (1 hunks)
  • presentation/src/main/java/view/signin/component/DoMaLoginButton.kt (1 hunks)
  • presentation/src/main/java/view/theme/color/ColorTheme.kt (1 hunks)
  • presentation/src/main/java/view/theme/color/DoMaColor.kt (1 hunks)
๐Ÿ’ค Files with no reviewable changes (1)
  • .idea/deploymentTargetSelector.xml
โœ… Files skipped from review due to trivial changes (1)
  • buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/counters.tab
โฐ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build
๐Ÿ”‡ Additional comments (1)
gradle/libs.versions.toml (1)

16-16:

Details

โœ… Verification successful

Firebase Annotations ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์„ค์ •๋œ Firebase Annotations ๋ฒ„์ „(16.2.0)์ด ์ตœ์‹  ๋ฒ„์ „์ด ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์˜์กด์„ฑ๋“ค๊ณผ์˜ ํ˜ธํ™˜์„ฑ๋„ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Also applies to: 37-37


๐ŸŒ Web query:

What is the latest version of Firebase Annotations library and its compatibility with Firebase SDK?

๐Ÿ’ก Result:

The latest version of Firebase Annotations (Java library) is 16.2.0, as referenced by its bindings in Xamarin.Firebase.Annotions v116.2.0[1]. This annotation library provides tooling support for ProGuard rules and API stability markers like @KeepForSdk and @PublicApi[2].

Compatibility with Firebase SDKs:

  1. Android:

    • Integrated into modern Firebase Android SDKs via Bill of Materials (BoM) v33.x[7][9].
    • Compatible with .NET for Android projects targeting net8.0-android34+ when using Xamarin bindings[1].
  2. Cross-SDK Usage:

    • Annotations are honored across all Android-based Firebase libraries (e.g., Firestore v24.x[7], Crashlytics v19.x[7]) through shared ProGuard configurations[2].
    • Kotlin Multiplatform support exists experimentally via Jetpack Annotation v1.x[4][10].

Key Features:

Annotation Purpose ProGuard Behavior
@Keep Preserve APIs during optimization Enforced by default rules[2]
@KeepForSdk Restrict usage to Firebase SDKs Linter enforcement in Android Studio[2]
@PublicApi Versioning guidance for API changes Tooling integration[2]

For .NET developers using Xamarin bindings (Xamarin.Firebase.Annotions), ensure compatibility with .NET 8+ and verify dependencies like Xamarin.JavaX.Inject v1+[1].

Citations:


Firebase Annotations ๋ฒ„์ „ ํ™•์ธ ์™„๋ฃŒ โ€“ ์—…๋ฐ์ดํŠธ ๋ถˆํ•„์š”

  • gradle/libs.versions.toml์˜ 16๋ฒˆ ๋ฐ 37๋ฒˆ ๋ผ์ธ์— ์„ค์ •๋œ firebaseAnnotations = "16.2.0"์€ ์ตœ์‹  ๋ฒ„์ „์ž„์ด ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ตœ์‹  Firebase Annotations ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์€ 16.2.0์œผ๋กœ, ๋‹ค๋ฅธ Firebase SDK ์˜์กด์„ฑ๊ณผ์˜ ํ˜ธํ™˜์„ฑ์—๋„ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

implementation(Dependency.Compose.COMPOSE_MATERIAL3)
implementation(Dependency.Compose.COMPOSE_MATERIAL)
implementation(Dependency.Compose.COMPOSE_NAVIGATION)
implementation(libs.firebase.annotations)
Copy link

Choose a reason for hiding this comment

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

๐Ÿ’ก Verification agent

๐Ÿงฉ Analysis chain

Firebase Annotations ๋ฒ„์ „ ๊ฒ€์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Firebase Annotations ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฒ„์ „์ด 16.2.0์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด์•ˆ ๋ฐ ๊ธฐ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์ตœ์‹  ๋ฒ„์ „ ์‚ฌ์šฉ์„ ๊ถŒ์žฅ๋“œ๋ฆฝ๋‹ˆ๋‹ค.


๐ŸŒ Web query:

What is the latest version of Firebase Annotations library?

๐Ÿ’ก Result:

The latest version of Firebase Annotations depends on its implementation context:

Java/Kotlin (Android)

For native Android development:

  • Version: 16.0 ([source][10])
  • Artifact: com.google.firebase:firebase-annotations
    This version appears stable but has not been updated recently in public repositories like Maven Central[10].

Xamarin (.NET for Android)

For .NET bindings via NuGet:

  • Version: 116.2 ([source][1])
  • Package: Xamarin.Firebase.Annotaโ€Œtions
    This package provides bindings for Googleโ€™s Java-based firebase-annotations library and follows Googleโ€™s major versioning scheme with incremental updates[1].

Key Observations

1๏ธโƒฃ AndroidX vs Firebase
The androidx.annotation library (version 1โ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œโ€Œ.8` as of Mayย 2024) serves similar purposes but is distinct from Firebase-specific annotations[2].

2๏ธโƒฃ SDK Integration
Firebase SDKs use annotations like @KeepForSdk internally for ProGuard rules and API stability checks[8]. These are part of core SDK dependencies rather than standalone libraries[9].

3๏ธโƒฃ Version Alignment
Firebaseโ€™s Bill of Materials (BoM) simplifies dependency management by aligning SDK versions[9]. For example:

implementation platform("com.google.firebase:firebase-bom:33โ€Œโ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹`.8``")

Citations:


Firebase Annotations ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ ํ™•์ธ

ํ˜„์žฌ presentation/build.gradle.kts์—์„œ Firebase Annotations ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ libs.firebase.annotations๋ฅผ ํ†ตํ•ด 16.2.0 ๋ฒ„์ „์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. Maven Repository ([source][10]) ๋“ฑ ์ตœ์‹  ์ž๋ฃŒ์— ๋”ฐ๋ฅด๋ฉด, ๋„ค์ดํ‹ฐ๋ธŒ Android ํ™˜๊ฒฝ์—์„œ ๊ณต์‹์ ์œผ๋กœ ๋ฆด๋ฆฌ์ฆˆ๋œ ์•ˆ์ • ๋ฒ„์ „์€ 16.0.0์ž…๋‹ˆ๋‹ค.

  • ์กฐ์น˜ ์‚ฌํ•ญ
    • Firebase Annotations ๋ฒ„์ „์ด 16.2.0 ๋Œ€์‹  16.0.0์œผ๋กœ ์„ค์ •๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ํ™•์ธ ๋ฐ”๋ž๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ ์˜๋„ํ•œ ๋ฒ„์ „์ด ์•„๋‹ˆ๋ผ๋ฉด, ๋ณด์•ˆ ๋ฐ ๊ธฐ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ 16.0.0์œผ๋กœ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

Comment on lines 21 to 22
abstract val Background: Color
abstract val Green: Color
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

์ƒˆ๋กœ์šด ์ƒ‰์ƒ ์ƒ์ˆ˜๋„ ๋ช…๋ช… ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ์ƒ‰์ƒ ์ƒ์ˆ˜๋“ค๋„ ์ผ๊ด€๋œ ๋ช…๋ช… ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

-    abstract val Background: Color
-    abstract val Green: Color
+    abstract val BACKGROUND: Color
+    abstract val GREEN: Color
๐Ÿ“ 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
abstract val Background: Color
abstract val Green: Color
abstract val BACKGROUND: Color
abstract val GREEN: Color

Comment on lines 20 to 21
override val Background = Color(0xFF1E1E1E)
override val Green = Color(0xFF9AD54A)
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

์ƒ‰์ƒ ์ƒ์ˆ˜ ์ด๋ฆ„์„ ColorTheme ํด๋ž˜์Šค์™€ ์ผ์น˜์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ColorTheme ํด๋ž˜์Šค์˜ ๋ช…๋ช… ๊ทœ์น™ ๋ณ€๊ฒฝ์— ๋งž์ถฐ ๊ตฌํ˜„๋„ ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

-    override val Background = Color(0xFF1E1E1E)
-    override val Green = Color(0xFF9AD54A)
+    override val BACKGROUND = Color(0xFF1E1E1E)
+    override val GREEN = Color(0xFF9AD54A)
๐Ÿ“ 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
override val Background = Color(0xFF1E1E1E)
override val Green = Color(0xFF9AD54A)
override val BACKGROUND = Color(0xFF1E1E1E)
override val GREEN = Color(0xFF9AD54A)

fun DoMaInputID(
modifier: Modifier = Modifier,
) {
val idState = remember { mutableStateOf(TextFieldValue("")) } // viewmodel ๊ตฌํ˜„ ํ›„ ์ˆ˜์ • ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

ViewModel๋กœ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฆฌํŒฉํ† ๋ง์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

TODO ์ฃผ์„์—์„œ ์–ธ๊ธ‰๋œ ๋Œ€๋กœ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ViewModel๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ตฌํ˜„์€ ์ƒํƒœ๋ฅผ ์ปดํฌ์ €๋ธ” ๋‚ด๋ถ€์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์–ด ํ…Œ์ŠคํŠธ์™€ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

-    val idState = remember { mutableStateOf(TextFieldValue("")) } // viewmodel ๊ตฌํ˜„ ํ›„ ์ˆ˜์ • ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
+    // ViewModel์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋„๋ก ์ˆ˜์ •
+    val idState: TextFieldValue,
+    val onIdChange: (TextFieldValue) -> Unit,
๐Ÿ“ 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
val idState = remember { mutableStateOf(TextFieldValue("")) } // viewmodel ๊ตฌํ˜„ ํ›„ ์ˆ˜์ • ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
// ViewModel์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋„๋ก ์ˆ˜์ •
val idState: TextFieldValue,
val onIdChange: (TextFieldValue) -> Unit,

Comment on lines +22 to +25
fun DoMaLoginButton(
modifier: Modifier = Modifier,
onClick: () -> Unit,
) {
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

๋กœ๋”ฉ ์ƒํƒœ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์— ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋กœ๊ทธ์ธ ์ง„ํ–‰ ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 fun DoMaLoginButton(
     modifier: Modifier = Modifier,
+    isLoading: Boolean = false,
     onClick: () -> Unit,
 ) {
๐Ÿ“ 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
fun DoMaLoginButton(
modifier: Modifier = Modifier,
onClick: () -> Unit,
) {
fun DoMaLoginButton(
modifier: Modifier = Modifier,
isLoading: Boolean = false,
onClick: () -> Unit,
) {

Comment on lines 95 to 96
clientId = "ghskfend",
redirectUri = "ghskfen"
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue

๋ณด์•ˆ ์ทจ์•ฝ์ : ํด๋ผ์ด์–ธํŠธ ์ž๊ฒฉ ์ฆ๋ช…์ด ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ID์™€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ URI๋ฅผ ํ™˜๊ฒฝ ์„ค์ •์ด๋‚˜ ๋ณด์•ˆ ์ €์žฅ์†Œ๋กœ ์ด๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

-                    clientId = "ghskfend",
-                    redirectUri = "ghskfen"
+                    clientId = BuildConfig.GAUTH_CLIENT_ID,
+                    redirectUri = BuildConfig.GAUTH_REDIRECT_URI
๐Ÿ“ 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
clientId = "ghskfend",
redirectUri = "ghskfen"
clientId = BuildConfig.GAUTH_CLIENT_ID,
redirectUri = BuildConfig.GAUTH_REDIRECT_URI

Comment on lines 93 to 100
if (clickButton) {
GAuthSigninWebView(
clientId = "ghskfend",
redirectUri = "ghskfen"
) { code ->
gAuthLogin(code)
}
}
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

๋กœ๊ทธ์ธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Google ์ธ์ฆ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.

             if (clickButton) {
                 GAuthSigninWebView(
                     clientId = BuildConfig.GAUTH_CLIENT_ID,
                     redirectUri = BuildConfig.GAUTH_REDIRECT_URI,
+                    onError = { error ->
+                        // ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋กœ์ง
+                        onLoginError(error)
+                    }
                 ) { code ->
                     gAuthLogin(code)
                 }
             }
๐Ÿ“ 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
if (clickButton) {
GAuthSigninWebView(
clientId = "ghskfend",
redirectUri = "ghskfen"
) { code ->
gAuthLogin(code)
}
}
if (clickButton) {
GAuthSigninWebView(
clientId = BuildConfig.GAUTH_CLIENT_ID,
redirectUri = BuildConfig.GAUTH_REDIRECT_URI,
onError = { error ->
// ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋กœ์ง
onLoginError(error)
}
) { code ->
gAuthLogin(code)
}
}

Comment on lines 121 to 128
if (clickButton) {
GAuthSigninWebView(
clientId = "ghskfend",
redirectUri = "ghskfen"
) { code ->
gAuthLogin(code)
}
}
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue

๋ณด์•ˆ ๊ฐœ์„  ๋ฐ ๋ณ€์ˆ˜๋ช… ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ ID์™€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ URI๊ฐ€ ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์–ด ๋ณด์•ˆ์ƒ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค.
  2. clickButton ๋ณ€์ˆ˜๋ช…์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
-if (clickButton) {
+if (showGoogleAuthWebView) {
     GAuthSigninWebView(
-        clientId = "ghskfend",
-        redirectUri = "ghskfen"
+        clientId = BuildConfig.GOOGLE_AUTH_CLIENT_ID,
+        redirectUri = BuildConfig.GOOGLE_AUTH_REDIRECT_URI
     ) { code ->
         gAuthLogin(code)
     }
 }
๐Ÿ“ 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
if (clickButton) {
GAuthSigninWebView(
clientId = "ghskfend",
redirectUri = "ghskfen"
) { code ->
gAuthLogin(code)
}
}
if (showGoogleAuthWebView) {
GAuthSigninWebView(
clientId = BuildConfig.GOOGLE_AUTH_CLIENT_ID,
redirectUri = BuildConfig.GOOGLE_AUTH_REDIRECT_URI
) { code ->
gAuthLogin(code)
}
}

Comment on lines 96 to 119
Row(
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 20.dp),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically,

) {
Text(
text = "์•„์ง ํ•จ๊ป˜ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด?",
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)

Spacer(modifier = Modifier.width(4.dp))

Text(
text = "ํšŒ์›๊ฐ€์ž… ํ•˜๊ธฐ",
modifier = Modifier
.clickable { /* TODO: ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด์œผ๋กœ ์ด๋™ */ }
.semantics { contentDescription = "ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋กœ ์ด๋™" },
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
textAlign = TextAlign.Center
)
}
Copy link

Choose a reason for hiding this comment

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

๐Ÿ’ก Verification agent

๐Ÿงฉ Analysis chain

ํšŒ์›๊ฐ€์ž… ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ตฌํ˜„ ๋ฐ ์ ‘๊ทผ์„ฑ ๊ฐœ์„ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  1. ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด์œผ๋กœ์˜ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ตฌํ˜„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ ‘๊ทผ์„ฑ ์„ค๋ช…์„ ๋” ์ž์„ธํ•˜๊ฒŒ ์ œ๊ณตํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด์ด ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

 Text(
     text = "ํšŒ์›๊ฐ€์ž… ํ•˜๊ธฐ",
     modifier = Modifier
-        .clickable { /* TODO: ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด์œผ๋กœ ์ด๋™ */ }
-        .semantics { contentDescription = "ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋กœ ์ด๋™" },
+        .clickable { /* TODO: implement navigation to SignUpScreen */ }
+        .semantics { 
+            contentDescription = "์ƒˆ๋กœ์šด ๊ณ„์ •์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค"
+        },
     style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
     textAlign = TextAlign.Center
 )

๐Ÿ Script executed:

#!/bin/bash
# ํšŒ์›๊ฐ€์ž… ๊ด€๋ จ ํŒŒ์ผ ๊ฒ€์ƒ‰
rg -l "ํšŒ์›๊ฐ€์ž…|SignUp" --type kotlin

Length of output: 97


ํšŒ์›๊ฐ€์ž… ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ ์ ‘๊ทผ์„ฑ ๊ฐœ์„  ํ•„์š”

  • ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด์œผ๋กœ ๋„ค๋น„๊ฒŒ์ด์…˜ํ•˜๋Š” ๋กœ์ง์ด ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ํ™”๋ฉด ์ „ํ™˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.
  • ์ ‘๊ทผ์„ฑ ์„ค๋ช…์ด ๊ฐ„๊ฒฐํ•˜์ง€๋งŒ, ๊ตฌ์ฒด์ ์ธ ์„ค๋ช…์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋กœ ์ด๋™" ๋Œ€์‹  "์ƒˆ๋กœ์šด ๊ณ„์ •์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค"์ฒ˜๋Ÿผ ๋ช…ํ™•ํžˆ ๊ธฐ์ˆ ํ•ด์ฃผ์„ธ์š”.
 Text(
     text = "ํšŒ์›๊ฐ€์ž… ํ•˜๊ธฐ",
     modifier = Modifier
-        .clickable { /* TODO: ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด์œผ๋กœ ์ด๋™ */ }
-        .semantics { contentDescription = "ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋กœ ์ด๋™" },
+        .clickable { /* TODO: ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋กœ์ง ๊ตฌํ˜„ */ }
+        .semantics {
+            contentDescription = "์ƒˆ๋กœ์šด ๊ณ„์ •์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค"
+        },
     style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
     textAlign = TextAlign.Center
 )
๐Ÿ“ 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
Row(
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 20.dp),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = "์•„์ง ํ•จ๊ป˜ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด?",
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
Spacer(modifier = Modifier.width(4.dp))
Text(
text = "ํšŒ์›๊ฐ€์ž… ํ•˜๊ธฐ",
modifier = Modifier
.clickable { /* TODO: ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด์œผ๋กœ ์ด๋™ */ }
.semantics { contentDescription = "ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋กœ ์ด๋™" },
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
textAlign = TextAlign.Center
)
}
Row(
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 20.dp),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = "์•„์ง ํ•จ๊ป˜ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด?",
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
Spacer(modifier = Modifier.width(4.dp))
Text(
text = "ํšŒ์›๊ฐ€์ž… ํ•˜๊ธฐ",
modifier = Modifier
.clickable { /* TODO: ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋กœ์ง ๊ตฌํ˜„ */ }
.semantics {
contentDescription = "์ƒˆ๋กœ์šด ๊ณ„์ •์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค"
},
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
textAlign = TextAlign.Center
)
}

Comment on lines 62 to 92
Row(
horizontalArrangement = Arrangement.End,
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 20.dp),
) {
Text(
text = "์•„์ด๋”” ์ฐพ๊ธฐ",
modifier = Modifier
.clickable(
interactionSource = remember { MutableInteractionSource() },
indication = rememberRipple(),
onClick = { /* TODO: ์•„์ด๋”” ์ฐพ๊ธฐ ์ฒ˜๋ฆฌ */ }
),
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
Text(
text = " | ",
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
Text(
text = "๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ",
modifier = Modifier
.clickable(
interactionSource = remember { MutableInteractionSource() },
indication = rememberRipple(),
onClick = { /* TODO: ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ์ฒ˜๋ฆฌ */ }
),
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
}
Copy link

Choose a reason for hiding this comment

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

๐Ÿ’ก Verification agent

๐Ÿ› ๏ธ Refactor suggestion

๐Ÿงฉ Analysis chain

์ฝ”๋“œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  TODO ํ•ญ๋ชฉ ๊ตฌํ˜„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  1. ์•„์ด๋””/๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ํ…์ŠคํŠธ์˜ ์ค‘๋ณต๋œ ์ฝ”๋“œ๋ฅผ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌ
  2. TODO ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์ด ํ•„์š”
+@Composable
+private fun ClickableText(
+    text: String,
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    style: TextStyle = DoMaTypography.labelLarge,
+    color: Color = colors.WHITE
+) {
+    Text(
+        text = text,
+        modifier = modifier.clickable(
+            interactionSource = remember { MutableInteractionSource() },
+            indication = rememberRipple(),
+            onClick = onClick
+        ),
+        style = style.copy(color = color)
+    )
+}

 Row(
     horizontalArrangement = Arrangement.End,
     modifier = Modifier
         .fillMaxWidth()
         .padding(horizontal = 20.dp),
 ) {
-    Text(
-        text = "์•„์ด๋”” ์ฐพ๊ธฐ",
-        modifier = Modifier.clickable(...),
-        style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
-    )
+    ClickableText(
+        text = "์•„์ด๋”” ์ฐพ๊ธฐ",
+        onClick = { /* TODO: ์•„์ด๋”” ์ฐพ๊ธฐ ํ™”๋ฉด์œผ๋กœ ์ด๋™ */ }
+    )
     Text(
         text = " | ",
         style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
     )
-    Text(
-        text = "๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ",
-        modifier = Modifier.clickable(...),
-        style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
-    )
+    ClickableText(
+        text = "๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ",
+        onClick = { /* TODO: ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ํ™”๋ฉด์œผ๋กœ ์ด๋™ */ }
+    )
 }

์•„์ด๋””/๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:


๐Ÿ Script executed:

#!/bin/bash
# ์•„์ด๋””/๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ๊ด€๋ จ ํŒŒ์ผ ๊ฒ€์ƒ‰
rg -l "์•„์ด๋”” ์ฐพ๊ธฐ|๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ" --type kotlin

Length of output: 100


์ค‘๋ณต ์ฝ”๋“œ ์ œ๊ฑฐ ๋ฐ TODO ๊ตฌํ˜„ ํ•„์š”

  • ์•„์ด๋”” ์ฐพ๊ธฐ์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์ด๋ฅผ ๋ณ„๋„์˜ Composable ์ปดํฌ๋„ŒํŠธ(์˜ˆ: ClickableText)๋กœ ๋ถ„๋ฆฌํ•ด ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์ฃผ์„ธ์š”.
  • ํ˜„์žฌ ๋‘ ํ•ญ๋ชฉ์— TODO ์ฃผ์„์ด ๋‚จ์•„์žˆ์œผ๋ฏ€๋กœ, ์ดํ›„ ํ™”๋ฉด ์ด๋™ ๋“ฑ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„ ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•ด ๊ธฐ๋Šฅ์„ ์™„์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
+ @Composable
+ private fun ClickableText(
+     text: String,
+     onClick: () -> Unit,
+     modifier: Modifier = Modifier,
+     style: TextStyle = DoMaTypography.labelLarge,
+     color: Color = colors.WHITE
+ ) {
+     Text(
+         text = text,
+         modifier = modifier.clickable(
+             interactionSource = remember { MutableInteractionSource() },
+             indication = rememberRipple(),
+             onClick = onClick
+         ),
+         style = style.copy(color = color)
+     )
+ }
 
 Row(
     horizontalArrangement = Arrangement.End,
     modifier = Modifier
         .fillMaxWidth()
         .padding(horizontal = 20.dp),
 ) {
-    Text(
-        text = "์•„์ด๋”” ์ฐพ๊ธฐ",
-        modifier = Modifier.clickable(
-            interactionSource = remember { MutableInteractionSource() },
-            indication = rememberRipple(),
-            onClick = { /* TODO: ์•„์ด๋”” ์ฐพ๊ธฐ ์ฒ˜๋ฆฌ */ }
-        ),
-        style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
-    )
+    ClickableText(
+        text = "์•„์ด๋”” ์ฐพ๊ธฐ",
+        onClick = { /* TODO: ์•„์ด๋”” ์ฐพ๊ธฐ ํ™”๋ฉด์œผ๋กœ ์ด๋™ */ }
+    )
     Text(
         text = " | ",
         style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
     )
-    Text(
-        text = "๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ",
-        modifier = Modifier.clickable(
-            interactionSource = remember { MutableInteractionSource() },
-            indication = rememberRipple(),
-            onClick = { /* TODO: ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ์ฒ˜๋ฆฌ */ }
-        ),
-        style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
-    )
+    ClickableText(
+        text = "๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ",
+        onClick = { /* TODO: ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ํ™”๋ฉด์œผ๋กœ ์ด๋™ */ }
+    )
 }
๐Ÿ“ 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
Row(
horizontalArrangement = Arrangement.End,
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 20.dp),
) {
Text(
text = "์•„์ด๋”” ์ฐพ๊ธฐ",
modifier = Modifier
.clickable(
interactionSource = remember { MutableInteractionSource() },
indication = rememberRipple(),
onClick = { /* TODO: ์•„์ด๋”” ์ฐพ๊ธฐ ์ฒ˜๋ฆฌ */ }
),
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
Text(
text = " | ",
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
Text(
text = "๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ",
modifier = Modifier
.clickable(
interactionSource = remember { MutableInteractionSource() },
indication = rememberRipple(),
onClick = { /* TODO: ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ์ฒ˜๋ฆฌ */ }
),
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
}
@Composable
private fun ClickableText(
text: String,
onClick: () -> Unit,
modifier: Modifier = Modifier,
style: TextStyle = DoMaTypography.labelLarge,
color: Color = colors.WHITE
) {
Text(
text = text,
modifier = modifier.clickable(
interactionSource = remember { MutableInteractionSource() },
indication = rememberRipple(),
onClick = onClick
),
style = style.copy(color = color)
)
}
Row(
horizontalArrangement = Arrangement.End,
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 20.dp),
) {
ClickableText(
text = "์•„์ด๋”” ์ฐพ๊ธฐ",
onClick = { /* TODO: ์•„์ด๋”” ์ฐพ๊ธฐ ํ™”๋ฉด์œผ๋กœ ์ด๋™ */ }
)
Text(
text = " | ",
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
ClickableText(
text = "๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ",
onClick = { /* TODO: ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ํ™”๋ฉด์œผ๋กœ ์ด๋™ */ }
)
}

Copy link

@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

โ™ป๏ธ Duplicate comments (3)
presentation/src/main/java/view/signin/Screen/SignInSubScreen.kt (1)

93-100: โš ๏ธ Potential issue

๋ณด์•ˆ ์ทจ์•ฝ์ : ํด๋ผ์ด์–ธํŠธ ์ž๊ฒฉ ์ฆ๋ช…์ด ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ID์™€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ URI๋ฅผ ํ™˜๊ฒฝ ์„ค์ •์ด๋‚˜ ๋ณด์•ˆ ์ €์žฅ์†Œ๋กœ ์ด๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 if (clickButton) {
     GAuthSigninWebView(
-        clientId = "ghskfend",
-        redirectUri = "ghskfen"
+        clientId = BuildConfig.GAUTH_CLIENT_ID,
+        redirectUri = BuildConfig.GAUTH_REDIRECT_URI
     ) { code ->
         gAuthLogin(code)
     }
 }
presentation/src/main/java/view/signin/Screen/SignInScreen.kt (2)

111-119: ๐Ÿ› ๏ธ Refactor suggestion

ํšŒ์›๊ฐ€์ž… ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ ์ ‘๊ทผ์„ฑ ๊ฐœ์„ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํšŒ์›๊ฐ€์ž… ๋ฒ„ํŠผ์˜ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ตฌํ˜„์ด ๋ˆ„๋ฝ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ ‘๊ทผ์„ฑ ์„ค๋ช…์ด ๋” ์ž์„ธํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 Text(
     text = "ํšŒ์›๊ฐ€์ž… ํ•˜๊ธฐ",
     modifier = Modifier
-        .clickable { /* TODO: ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด์œผ๋กœ ์ด๋™ */ }
-        .semantics { contentDescription = "ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋กœ ์ด๋™" },
+        .clickable { navController.navigate("signup") }
+        .semantics { 
+            contentDescription = "์ƒˆ๋กœ์šด ๊ณ„์ •์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค"
+        },
     style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
     textAlign = TextAlign.Center
 )

121-128: โš ๏ธ Potential issue

๋ณด์•ˆ ์ทจ์•ฝ์ : ํด๋ผ์ด์–ธํŠธ ์ž๊ฒฉ ์ฆ๋ช…์ด ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ID์™€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ URI๋ฅผ ํ™˜๊ฒฝ ์„ค์ •์ด๋‚˜ ๋ณด์•ˆ ์ €์žฅ์†Œ๋กœ ์ด๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 if (clickButton) {
     GAuthSigninWebView(
-        clientId = "ghskfend",
-        redirectUri = "ghskfen"
+        clientId = BuildConfig.GAUTH_CLIENT_ID,
+        redirectUri = BuildConfig.GAUTH_REDIRECT_URI
     ) { code ->
         gAuthLogin(code)
     }
 }
๐Ÿงน Nitpick comments (1)
presentation/src/main/java/view/signin/Screen/SignInSubScreen.kt (1)

26-31: ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๊ฐœ์„ ํ•ด์ฃผ์„ธ์š”.

๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ์˜๋„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

  • clickButton์€ showGAuthWebView๋‚˜ isGAuthEnabled๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋” ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.
  • leIsClickLoginButton์€ Kotlin ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ๋”ฐ๋ผ onLoginClick์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
 fun SignInSubScreen(
     modifier: Modifier = Modifier,
-    clickButton: Boolean,
+    showGAuthWebView: Boolean,
     gAuthLogin: (String) -> Unit,
-    leIsClickLoginButton: () -> Unit,
+    onLoginClick: () -> Unit,
 )
๐Ÿ“œ Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between e5a9f37 and efe622f.

๐Ÿ“’ Files selected for processing (4)
  • presentation/src/main/java/view/signin/Screen/SignInScreen.kt (1 hunks)
  • presentation/src/main/java/view/signin/Screen/SignInSubScreen.kt (1 hunks)
  • presentation/src/main/java/view/theme/color/ColorTheme.kt (1 hunks)
  • presentation/src/main/java/view/theme/color/DoMaColor.kt (1 hunks)
๐Ÿšง Files skipped from review as they are similar to previous changes (2)
  • presentation/src/main/java/view/theme/color/DoMaColor.kt
  • presentation/src/main/java/view/theme/color/ColorTheme.kt
โฐ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build
๐Ÿ”‡ Additional comments (1)
presentation/src/main/java/view/signin/Screen/SignInScreen.kt (1)

62-92: ์ค‘๋ณต ์ฝ”๋“œ ์ œ๊ฑฐ๋ฅผ ์œ„ํ•ด ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•ด์ฃผ์„ธ์š”.

์•„์ด๋”” ์ฐพ๊ธฐ์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ํ…์ŠคํŠธ์˜ ์ค‘๋ณต๋œ ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

+@Composable
+private fun ClickableText(
+    text: String,
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    style: TextStyle = DoMaTypography.labelLarge,
+    color: Color = colors.WHITE
+) {
+    Text(
+        text = text,
+        modifier = modifier.clickable(
+            interactionSource = remember { MutableInteractionSource() },
+            indication = rememberRipple(),
+            onClick = onClick
+        ),
+        style = style.copy(color = color)
+    )
+}

 Row(
     horizontalArrangement = Arrangement.End,
     modifier = Modifier
         .fillMaxWidth()
         .padding(horizontal = 20.dp),
 ) {
-    Text(
-        text = "์•„์ด๋”” ์ฐพ๊ธฐ",
-        modifier = Modifier.clickable(...),
-        style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
-    )
+    ClickableText(
+        text = "์•„์ด๋”” ์ฐพ๊ธฐ",
+        onClick = { /* TODO: ์•„์ด๋”” ์ฐพ๊ธฐ ํ™”๋ฉด์œผ๋กœ ์ด๋™ */ }
+    )
     Text(
         text = " | ",
         style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
     )
-    Text(
-        text = "๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ",
-        modifier = Modifier.clickable(...),
-        style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
-    )
+    ClickableText(
+        text = "๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ",
+        onClick = { /* TODO: ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ํ™”๋ฉด์œผ๋กœ ์ด๋™ */ }
+    )
 }

Comment on lines 73 to 83
DoMaInputID(
modifier = Modifier
.fillMaxWidth()
)

Spacer(modifier = Modifier.height(12.dp))

DoMaInputPassword(
modifier = Modifier
.fillMaxWidth()
)
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

์ž…๋ ฅ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์™€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.

์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋Œ€ํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์™€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ธฐ๋Šฅ๋“ค์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค:

  • ID/๋น„๋ฐ€๋ฒˆํ˜ธ ํ˜•์‹ ๊ฒ€์ฆ
  • ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ
  • ์ž…๋ ฅ ์ œํ•œ ์ฒ˜๋ฆฌ
 DoMaInputID(
     modifier = Modifier
-        .fillMaxWidth()
+        .fillMaxWidth(),
+    onValueChange = { id ->
+        validateId(id)?.let { error ->
+            // ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ
+        }
+    }
 )

 DoMaInputPassword(
     modifier = Modifier
-        .fillMaxWidth()
+        .fillMaxWidth(),
+    onValueChange = { password ->
+        validatePassword(password)?.let { error ->
+            // ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ
+        }
+    }
 )
๐Ÿ“ 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
DoMaInputID(
modifier = Modifier
.fillMaxWidth()
)
Spacer(modifier = Modifier.height(12.dp))
DoMaInputPassword(
modifier = Modifier
.fillMaxWidth()
)
DoMaInputID(
modifier = Modifier
.fillMaxWidth(),
onValueChange = { id ->
validateId(id)?.let { error ->
// ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ
}
}
)
Spacer(modifier = Modifier.height(12.dp))
DoMaInputPassword(
modifier = Modifier
.fillMaxWidth(),
onValueChange = { password ->
validatePassword(password)?.let { error ->
// ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ
}
}
)

@xx-lvr xx-lvr changed the title SignIn page๋ฅผ ํผ๋ธ”๋ฆฌ์‹ฑ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ”€(::63) SignIn page๋ฅผ ํผ๋ธ”๋ฆฌ์‹ฑ ํ–ˆ์Šต๋‹ˆ๋‹ค. Feb 24, 2025
@kimjeakwan
Copy link
Collaborator

TextField ์— ์ž…๋ ฅ๋งŒ ๋˜๊ฒŒ ํ•˜์ง€๋ง๊ณ  ์ตœ๋Œ€๊ธ€์ž์ˆ˜, keyboardActions, ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”

fun DoMaInputID(
modifier: Modifier = Modifier,
) {
val idState = remember { mutableStateOf(TextFieldValue("")) } // viewmodel ๊ตฌํ˜„ ํ›„ ์ˆ˜์ • ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
Copy link
Collaborator

Choose a reason for hiding this comment

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

๊ทธ๋ฆฌ๊ณ  ์ด๊ฑธ viewmodel ๊ด€๋ฆฌํ•˜๊ฒŒ ๋ฐ”๊ฟ”์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค,
์ง€๊ธˆ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด stasteful ํ•ฉ๋‹ˆ๋‹ค. Statelessํ•œ Composable ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

fun DoMaInputPassword(
modifier: Modifier = Modifier,
) {
val passwordState = remember { mutableStateOf(TextFieldValue("")) } // viewmodel ๊ตฌํ˜„ ํ›„ ์ˆ˜์ • ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
Copy link
Collaborator

Choose a reason for hiding this comment

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

๊ทธ๋ฆฌ๊ณ  ์ด๊ฑธ viewmode ์—์„œ l ๊ด€๋ฆฌํ•˜๊ฒŒ ๋ฐ”๊ฟ”์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค,
์ง€๊ธˆ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด stasteful ํ•ฉ๋‹ˆ๋‹ค. Statelessํ•œ Composable ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

modifier = modifier
.fillMaxWidth()
.clickablesingle(onClick = onClick)
.background(color = Color(0xFF494949), shape = RoundedCornerShape(size = 10.dp))
Copy link
Collaborator

Choose a reason for hiding this comment

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

domaandroidTheme ์— colors ์„ ์ด์šฉํ•ด ์ƒ‰๊น”์„ ์‚ฌ์šฉํ•ด์ฃผ์„ธ์š”

jetbrainsKotlinJvm = "1.9.0"
identityJvm = "202411.1"
lifecycleViewmodelAndroid = "2.8.6"
firebaseAnnotations = "16.2.0"
Copy link
Collaborator

Choose a reason for hiding this comment

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

firebase ๋Š” ์™œ ์ถ”๊ฐ€ํ•˜์…จ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค

.background(color = colors.BACKGROUND)
) {
Column(
modifier = modifier
Copy link
Collaborator

Choose a reason for hiding this comment

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

๋Œ€๋ฌธ์ž Modifier ๋กœ ์ ์–ด์ฃผ์„ธ์š”

)
},
colors = TextFieldDefaults.outlinedTextFieldColors(
backgroundColor = Color(0xFF1E1E1E),
Copy link
Collaborator

Choose a reason for hiding this comment

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

DomaColortheme ์„ ์ด์šฉํ•ด ์ƒ‰๊น”์„ ์ง€์ •ํ•ด์ฃผ์„ธ์š”

DoMaAndroidTheme { colors, typography ->

Column(
modifier = Modifier
Copy link
Collaborator

Choose a reason for hiding this comment

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

์ฒ˜์Œ modifier ์€ ์†Œ๋ฌธ์ž ์ž…๋‹ˆ๋‹ค

)
},
colors = TextFieldDefaults.outlinedTextFieldColors(
backgroundColor = Color(0xFF1E1E1E),
Copy link
Collaborator

Choose a reason for hiding this comment

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

DomaColortheme ์„ ์ด์šฉํ•ด ์ƒ‰๊น”์„ ์ง€์ •ํ•ด์ฃผ์„ธ์š”

),

) {
Text(
Copy link
Collaborator

Choose a reason for hiding this comment

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

DomaAndroid ๋ฅผ ์ด์šฉํ•ด ๊ธ€์‹œ์ฒด๋ฅผ ์ง€์ •ํ•ด์ฃผ์„ธ์š”

.padding(bottom = 20.dp),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically,

Copy link
Collaborator

Choose a reason for hiding this comment

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

๊ณต๋ฐฑ์‚ญ์ œํ•ด์ฃผ์„ธ์š”

Copy link

@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

โ™ป๏ธ Duplicate comments (3)
presentation/src/main/java/view/signin/Screen/SignInScreen.kt (3)

62-92: ๐Ÿ› ๏ธ Refactor suggestion

์ค‘๋ณต ์ฝ”๋“œ ์ œ๊ฑฐ ๋ฐ TODO ๊ตฌํ˜„ ํ•„์š”

์•„์ด๋”” ์ฐพ๊ธฐ์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์ด๋ฅผ ๋ณ„๋„์˜ Composable ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•ด ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์ฃผ์„ธ์š”. ํ˜„์žฌ ๋‘ ํ•ญ๋ชฉ์— TODO ์ฃผ์„์ด ๋‚จ์•„์žˆ์œผ๋ฏ€๋กœ, ์ดํ›„ ํ™”๋ฉด ์ด๋™ ๋“ฑ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„ ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

+ @Composable
+ private fun ClickableText(
+     text: String,
+     onClick: () -> Unit,
+     modifier: Modifier = Modifier,
+     style: TextStyle = DoMaTypography.labelLarge,
+     color: Color = colors.WHITE
+ ) {
+     Text(
+         text = text,
+         modifier = modifier.clickable(
+             interactionSource = remember { MutableInteractionSource() },
+             indication = rememberRipple(),
+             onClick = onClick
+         ),
+         style = style.copy(color = color)
+     )
+ }
 
 Row(
     horizontalArrangement = Arrangement.End,
     modifier = Modifier
         .fillMaxWidth()
         .padding(horizontal = 20.dp),
 ) {
-    Text(
-        text = "์•„์ด๋”” ์ฐพ๊ธฐ",
-        modifier = Modifier.clickable(
-            interactionSource = remember { MutableInteractionSource() },
-            indication = rememberRipple(),
-            onClick = { /* TODO: ์•„์ด๋”” ์ฐพ๊ธฐ ์ฒ˜๋ฆฌ */ }
-        ),
-        style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
-    )
+    ClickableText(
+        text = "์•„์ด๋”” ์ฐพ๊ธฐ",
+        onClick = { /* TODO: ์•„์ด๋”” ์ฐพ๊ธฐ ํ™”๋ฉด์œผ๋กœ ์ด๋™ */ }
+    )
     Text(
         text = " | ",
         style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
     )
-    Text(
-        text = "๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ",
-        modifier = Modifier.clickable(
-            interactionSource = remember { MutableInteractionSource() },
-            indication = rememberRipple(),
-            onClick = { /* TODO: ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ์ฒ˜๋ฆฌ */ }
-        ),
-        style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
-    )
+    ClickableText(
+        text = "๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ",
+        onClick = { /* TODO: ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ํ™”๋ฉด์œผ๋กœ ์ด๋™ */ }
+    )
 }

110-117: ๐Ÿ› ๏ธ Refactor suggestion

ํšŒ์›๊ฐ€์ž… ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ ์ ‘๊ทผ์„ฑ ๊ฐœ์„  ํ•„์š”

ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด์œผ๋กœ ๋„ค๋น„๊ฒŒ์ด์…˜ํ•˜๋Š” ๋กœ์ง์ด ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ํ™”๋ฉด ์ „ํ™˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”. ๋˜ํ•œ ์ ‘๊ทผ์„ฑ ์„ค๋ช…์ด ๊ฐ„๊ฒฐํ•˜์ง€๋งŒ, ๋” ๊ตฌ์ฒด์ ์ธ ์„ค๋ช…์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

 Text(
     text = "ํšŒ์›๊ฐ€์ž… ํ•˜๊ธฐ",
     modifier = Modifier
-        .clickable { /* TODO: ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด์œผ๋กœ ์ด๋™ */ }
-        .semantics { contentDescription = "ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋กœ ์ด๋™" },
+        .clickable { /* TODO: ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋กœ์ง ๊ตฌํ˜„ */ }
+        .semantics {
+            contentDescription = "์ƒˆ๋กœ์šด ๊ณ„์ •์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค"
+        },
     style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
     textAlign = TextAlign.Center
 )

120-127: โš ๏ธ Potential issue

๋ณด์•ˆ ๊ฐœ์„  ๋ฐ ๋ณ€์ˆ˜๋ช… ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ID์™€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ URI๊ฐ€ ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์–ด ๋ณด์•ˆ์ƒ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ clickButton ๋ณ€์ˆ˜๋ช…์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

-if (clickButton) {
+if (showGoogleAuthWebView) {
     GAuthSigninWebView(
-        clientId = "ghskfend",
-        redirectUri = "ghskfen"
+        clientId = BuildConfig.GOOGLE_AUTH_CLIENT_ID,
+        redirectUri = BuildConfig.GOOGLE_AUTH_REDIRECT_URI
     ) { code ->
         gAuthLogin(code)
     }
 }
๐Ÿงน Nitpick comments (5)
presentation/src/main/java/view/theme/color/DoMaColor.kt (1)

5-14: ์ƒ‰์ƒ ์ƒ์ˆ˜ ๋ช…๋ช… ๊ทœ์น™์„ ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉํ•ด์ฃผ์„ธ์š”.

ํ˜„์žฌ ํŒŒ์ผ์—๋Š” ๋Œ€๋ฌธ์ž๋กœ ๋œ ์ƒ‰์ƒ ์ƒ์ˆ˜(MAIN, WHITE, GRAY)์™€ ํŒŒ์Šค์นผ ์ผ€์ด์Šค๋กœ ๋œ ์ƒ‰์ƒ ์ƒ์ˆ˜(Black, Gold, silver, Broze)๊ฐ€ ํ˜ผํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ์ƒ‰์ƒ ์ƒ์ˆ˜๋“ค์ฒ˜๋Ÿผ ๊ธฐ์กด ์ƒ‰์ƒ ์ƒ์ˆ˜๋“ค๋„ ๋ชจ๋‘ ๋Œ€๋ฌธ์ž๋กœ ํ†ต์ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 override val MAIN = Color(0xFF252525)
-override val Black = Color(0xFF000000)
+override val BLACK = Color(0xFF000000)
 override val WHITE = Color(0xFFFFFFFF)

 override val GRAY = Color(0xFF74C27D)
-override val Gold = Color(0xFFFFD651)
-override val silver = Color(0xFFBEBEBE)
-override val Broze = Color(0xFFF7A080)
+override val GOLD = Color(0xFFFFD651)
+override val SILVER = Color(0xFFBEBEBE)
+override val BRONZE = Color(0xFFF7A080)

์ฐธ๊ณ : "Broze"๋Š” ์ฒ ์ž ์˜ค๋ฅ˜๊ฐ€ ์žˆ์–ด "BRONZE"๋กœ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

presentation/src/main/java/view/textfield/DoMaTextField.kt (4)

102-102: ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ‰์ƒ ๊ฐ’์„ ์ƒ‰์ƒ ์ƒ์ˆ˜๋กœ ๊ต์ฒดํ•ด์ฃผ์„ธ์š”.

์ƒ‰์ƒ ๊ฐ’ Color(0xFF4C4C4C)๊ฐ€ ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ DoMaColor.kt์— ์ถ”๊ฐ€๋œ LOGIN ์ƒ‰์ƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ƒ‰์ƒ ํ…Œ๋งˆ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๊ฐ’ ๋Œ€์‹  colors.LOGIN์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

-                        color = if (isError) colors.RED else Color(0xFF4C4C4C),
+                        color = if (isError) colors.RED else colors.LOGIN,

81-84: ๊ณต๋ฐฑ ์ œ๊ฑฐ์™€ ์ตœ๋Œ€ ๊ธธ์ด ์ œํ•œ ๋กœ์ง์ด ํ•จ๊ป˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ตฌํ˜„์€ ์ž…๋ ฅ๊ฐ’์˜ ๊ณต๋ฐฑ์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์•„์ด๋””๋‚˜ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ์—๋Š” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‹ค๋ฅธ ์šฉ๋„์˜ ํ…์ŠคํŠธ ํ•„๋“œ์—์„œ๋Š” ์›์น˜ ์•Š๋Š” ๋™์ž‘์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต๋ฐฑ ์ œ๊ฑฐ ์˜ต์…˜์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.

 fun DoMaTextField(
     ...
+    removeWhitespace: Boolean = true,
     ...
 ) {
     ...
     onValueChange = {
         if (it.length <= maxLength) { // ์ตœ๋Œ€ ๊ธ€์ž ์ˆ˜ ์ œํ•œ
-            val filteredText = it.filterNot { text -> text.isWhitespace() }
+            val filteredText = if (removeWhitespace) it.filterNot { text -> text.isWhitespace() } else it
             onValueChange(filteredText)
         }
     },
     ...
 }

35-35: ๋ถˆํ•„์š”ํ•œ ์ƒ์ˆ˜ ์ •์˜์ž…๋‹ˆ๋‹ค.

EMPTY ์ƒ์ˆ˜๋Š” ๋‹จ์ˆœํžˆ ๋นˆ ๋ฌธ์ž์—ด์„ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ, ์ด๋Š” ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค์ง€ ์•Š์œผ๋ฉฐ Kotlin์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ง์ ‘ "" ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ƒ์ˆ˜๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ํ•„์š”ํ•œ ๊ณณ์— ์ง์ ‘ ๋นˆ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

-const val EMPTY = ""
-
 @Composable
 fun DoMaTextField(
     modifier: Modifier = Modifier,
     debounceTime: Long = 300L,
-    placeHolder: String = EMPTY,
+    placeHolder: String = "",
     ...
 ) {
     ...
 }

137-140: Preview ํ•จ์ˆ˜์—์„œ ๋” ๋‹ค์–‘ํ•œ ์ƒํƒœ๋ฅผ ์‹œ์—ฐํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ Preview ํ•จ์ˆ˜๋Š” ๊ธฐ๋ณธ ์ƒํƒœ๋งŒ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—๋Ÿฌ ์ƒํƒœ, ํฌ์ปค์Šค ์ƒํƒœ ๋“ฑ ๋‹ค์–‘ํ•œ ์ƒํƒœ๋ฅผ ๋ฏธ๋ฆฌ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์—ฌ๋Ÿฌ Preview ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 @Preview
 @Composable
 private fun PreView() {
     DoMaTextField(
         setText = "๊ฒ€์ƒ‰",
         onSearchTextChange = {}
     )
 }
+
+@Preview
+@Composable
+private fun PreViewWithError() {
+    DoMaTextField(
+        setText = "๊ฒ€์ƒ‰",
+        isError = true,
+        errorMessage = "์ž˜๋ชป๋œ ์ž…๋ ฅ์ž…๋‹ˆ๋‹ค.",
+        onSearchTextChange = {}
+    )
+}
๐Ÿ“œ Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between bb75022 and e5ecf96.

โ›” Files ignored due to path filters (3)
  • buildSrc/build/kotlin/compileKotlin/cacheable/last-build.bin is excluded by !**/*.bin
  • buildSrc/build/kotlin/compileKotlin/local-state/build-history.bin is excluded by !**/*.bin
  • buildSrc/build/libs/buildSrc.jar is excluded by !**/*.jar
๐Ÿ“’ Files selected for processing (13)
  • .idea/other.xml (7 hunks)
  • presentation/src/main/java/until/Result.kt (1 hunks)
  • presentation/src/main/java/view/signin/Screen/SignInScreen.kt (1 hunks)
  • presentation/src/main/java/view/signin/Screen/SignInSubScreen.kt (1 hunks)
  • presentation/src/main/java/view/signin/component/DoMaInputID.kt (1 hunks)
  • presentation/src/main/java/view/signin/component/DoMaInputPassWord.kt (1 hunks)
  • presentation/src/main/java/view/signin/component/DoMaLoginButton.kt (1 hunks)
  • presentation/src/main/java/view/textfield/DoMaTextField.kt (1 hunks)
  • presentation/src/main/java/view/theme/color/ColorTheme.kt (1 hunks)
  • presentation/src/main/java/view/theme/color/DoMaColor.kt (1 hunks)
  • presentation/src/main/java/viewModel/admin/AdminViewModel.kt (6 hunks)
  • presentation/src/main/java/viewModel/homes/HomesViewmodel.kt (1 hunks)
  • presentation/src/main/java/viewModel/users/UsersViewModel.kt (1 hunks)
โœ… Files skipped from review due to trivial changes (4)
  • presentation/src/main/java/until/Result.kt
  • presentation/src/main/java/viewModel/users/UsersViewModel.kt
  • presentation/src/main/java/viewModel/admin/AdminViewModel.kt
  • presentation/src/main/java/viewModel/homes/HomesViewmodel.kt
๐Ÿšง Files skipped from review as they are similar to previous changes (5)
  • presentation/src/main/java/view/signin/component/DoMaInputID.kt
  • presentation/src/main/java/view/theme/color/ColorTheme.kt
  • presentation/src/main/java/view/signin/component/DoMaLoginButton.kt
  • presentation/src/main/java/view/signin/component/DoMaInputPassWord.kt
  • presentation/src/main/java/view/signin/Screen/SignInSubScreen.kt
โฐ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build
๐Ÿ”‡ Additional comments (11)
.idea/other.xml (8)

17-27: OnePlus CPH2415 ๊ธฐ๊ธฐ ์ถ”๊ฐ€ ํ™•์ธ:
์ƒˆ๋กœ์šด OnePlus CPH2415 ๊ธฐ๊ธฐ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์˜ต์…˜( api, brand, codename, id, manufacturer, name, screenDensity, screenX, screenY )์ด ๋ช…์„ธ์— ๋งž๊ฒŒ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.


72-82: Samsung A35 ๊ธฐ๊ธฐ ์ถ”๊ฐ€ ํ™•์ธ:
์ƒˆ๋กœ์šด Samsung A35 ๊ธฐ๊ธฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅ๋œ ๊ฐ’( api, brand, codename, id, manufacturer, name, screenDensity, screenX, screenY )๋“ค์ด ๊ธฐ๊ธฐ ์ŠคํŽ™๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ๊ฒ€ํ† ํ•ด ์ฃผ์„ธ์š”.


116-126: Motorola moto g 5G (2022) ๊ธฐ๊ธฐ ์ถ”๊ฐ€ ํ™•์ธ:
์‹ ๊ทœ Motorola ๊ธฐ๊ธฐ 'moto g 5G (2022)' ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์ข… ๋ฐ ํ™”๋ฉด ์ •๋ณด(api, screenDensity, screenX, screenY)๊ฐ€ ์ตœ์‹  ์‚ฌ์–‘์„ ๋ฐ˜์˜ํ•˜๋Š”์ง€ ํ™•์ธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.


293-301: Samsung ๊ธฐ๊ธฐ ๋ณ€๊ฒฝ์‚ฌํ•ญ (SM-T738U):
๊ธฐ์กด Samsung ๊ธฐ๊ธฐ์˜ codename๊ณผ id๊ฐ€ "gts7xllite"๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๊ณ , ๊ธฐ๊ธฐ ์ด๋ฆ„์ด "SM-T738U"๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์˜๋„๊ฐ€ ๋ช…ํ™•ํ•ด ๋ณด์ด๋ฉฐ, ๊ด€๋ จ ์†์„ฑ๋“ค์ด ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ์žฌ๊ฒ€ํ†  ํ•ด์ฃผ์„ธ์š”.


314-324: Samsung Galaxy Tab S8 ๊ธฐ๊ธฐ ์ถ”๊ฐ€ ํ™•์ธ:
์ƒˆ๋กœ์šด Samsung Galaxy Tab S8 ๊ธฐ๊ธฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์Šคํฌ๋ฆฐ ๋ฐ€๋„์™€ ํ•ด์ƒ๋„ ๊ด€๋ จ ์˜ต์…˜๋“ค์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.


325-335: Samsung Galaxy Tab S9 FE 5G ๊ธฐ๊ธฐ ์ถ”๊ฐ€ ํ™•์ธ:
์‹ ๊ทœ Samsung Galaxy Tab S9 FE 5G ๊ธฐ๊ธฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๊ธฐ ์‚ฌ์–‘์— ๋ถ€ํ•ฉํ•˜๋Š”์ง€, ํ™”๋ฉด ๊ด€๋ จ ์˜ต์…˜( screenDensity, screenX, screenY )๋“ค์ด ์ •ํ™•ํ•œ์ง€ ๊ฒ€ํ†  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.


391-401: Samsung Galaxy S21 ๊ธฐ๊ธฐ ์ถ”๊ฐ€ ํ™•์ธ:
์ƒˆ๋กœ์šด Samsung Galaxy S21 ๊ธฐ๊ธฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅ๋œ ์˜ต์…˜ ๊ฐ’๋“ค์ด ์ตœ์‹  ๊ธฐ๊ธฐ ์ŠคํŽ™๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.


491-501: Samsung Galaxy S21 Plus ๊ธฐ๊ธฐ ์ถ”๊ฐ€ ํ™•์ธ:
์‹ ๊ทœ Samsung Galaxy S21 Plus ๊ธฐ๊ธฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์˜ต์…˜(ํŠนํžˆ screenDensity, screenX, screenY)์ด ์ •ํ™•ํ•œ์ง€ ์žฌ๊ฒ€ํ†  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

presentation/src/main/java/view/theme/color/DoMaColor.kt (1)

20-23: ์ƒ‰์ƒ ์ƒ์ˆ˜ ์ถ”๊ฐ€๋ฅผ ์ž˜ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค!

์ถ”๊ฐ€๋œ ์ƒ‰์ƒ ์ƒ์ˆ˜๋“ค์ด ๋ชจ๋‘ ๋Œ€๋ฌธ์ž๋กœ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด์ „ ๋ฆฌ๋ทฐ์—์„œ ์ œ์•ˆํ•œ ๋ช…๋ช… ๊ทœ์น™์„ ์ ์ ˆํžˆ ๋ฐ˜์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

presentation/src/main/java/view/textfield/DoMaTextField.kt (1)

37-62: ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ตฌ์„ฑ์ด ์ž˜ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

TextField ์ปดํฌ๋„ŒํŠธ์— ํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์ด ์ž˜ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ ๋ฌธ์ž ์ˆ˜ ์ œํ•œ, ์—๋Ÿฌ ์ƒํƒœ ์ฒ˜๋ฆฌ, ํ‚ค๋ณด๋“œ ์•ก์…˜ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

presentation/src/main/java/view/signin/Screen/SignInScreen.kt (1)

38-44: ์ปฌ๋Ÿผ ๋ฐฐ์น˜ ๋ฐ ์ •๋ ฌ์ด ์ž˜ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™”๋ฉด์˜ ์ƒ๋‹จ, ์ค‘๋‹จ, ํ•˜๋‹จ ๋ฐฐ์น˜๊ฐ€ ์ž˜ ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฉฐ, ํŠนํžˆ weight ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ๋™์ ์ธ ๊ณต๊ฐ„ ๋ฐฐ์น˜๋ฅผ ํ•œ ์ ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Comment on lines 133 to 140
@Composable
fun PreviewSignInScreen() {
SignInScreen(
clickButton = false,
gAuthLogin = {},
leIsClickLoginButton = {}
)
} No newline at end of file
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

Preview ํ•จ์ˆ˜์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Preview ํ•จ์ˆ˜์—์„œ๋„ clickButton ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ showGoogleAuthWebView๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , leIsClickLoginButton์„ onLoginButtonClick์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 @Preview
 @Composable
 fun PreviewSignInScreen() {
     SignInScreen(
-        clickButton = false,
+        showGoogleAuthWebView = false,
         gAuthLogin = {},
-        leIsClickLoginButton = {}
+        onLoginButtonClick = {}
     )
 }
๐Ÿ“ 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
@Composable
fun PreviewSignInScreen() {
SignInScreen(
clickButton = false,
gAuthLogin = {},
leIsClickLoginButton = {}
)
}
@Composable
fun PreviewSignInScreen() {
SignInScreen(
- clickButton = false,
+ showGoogleAuthWebView = false,
gAuthLogin = {},
- leIsClickLoginButton = {}
+ onLoginButtonClick = {}
)
}

Comment on lines 25 to 28
modifier: Modifier = Modifier,
clickButton: Boolean,
gAuthLogin: (String) -> Unit,
leIsClickLoginButton: () -> Unit,
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•ด์ฃผ์„ธ์š”.

clickButton ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์ด ๋ฌด์—‡์„ ๋‚˜ํƒ€๋‚ด๋Š”์ง€ ๋ช…ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ๋„๋ก showGoogleAuthWebView์™€ ๊ฐ™์ด ๋” ๊ตฌ์ฒด์ ์ธ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ leIsClickLoginButton ํ•จ์ˆ˜๋ช…๋„ ๋ช…ํ™•ํ•˜์ง€ ์•Š์œผ๋‹ˆ onLoginButtonClick๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 fun SignInScreen(
     modifier: Modifier = Modifier,
-    clickButton: Boolean,
+    showGoogleAuthWebView: Boolean,
     gAuthLogin: (String) -> Unit,
-    leIsClickLoginButton: () -> Unit,
+    onLoginButtonClick: () -> Unit,
 ) {
๐Ÿ“ 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
modifier: Modifier = Modifier,
clickButton: Boolean,
gAuthLogin: (String) -> Unit,
leIsClickLoginButton: () -> Unit,
fun SignInScreen(
modifier: Modifier = Modifier,
showGoogleAuthWebView: Boolean,
gAuthLogin: (String) -> Unit,
onLoginButtonClick: () -> Unit,
) {

Copy link

@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: 5

๐Ÿงน Nitpick comments (5)
presentation/src/main/java/view/signin/screen/SignInScreen.kt (2)

27-28: ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„ ๊ฐœ์„  ํ•„์š”

leIsClickLoginButton์˜ ์ด๋ฆ„์ด ์ง๊ด€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ๊ทธ ์šฉ๋„๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค:

-    leIsClickLoginButton: () -> Unit,
+    onLoginButtonClick: () -> Unit,

๊ทธ๋ฆฌ๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜ ์‚ฌ์šฉ ์œ„์น˜๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

-    onClick = leIsClickLoginButton,
+    onClick = onLoginButtonClick,

119-127: PreviewSignInScreen ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋ณ€๊ฒฝ ํ•„์š”

๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ•จ์ˆ˜๋„ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜์„ธ์š”:

@Preview
@Composable
fun PreviewSignInScreen() {
    SignInScreen(
        clickButton = false,
        gAuthLogin = {},
-       leIsClickLoginButton = {}
+       onLoginButtonClick = {}
    )
}
presentation/src/main/java/view/signin/screen/SignInSubScreen.kt (3)

32-32: ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„ ๊ฐœ์„  ํ•„์š”

leIsClickLoginButton์˜ ์ด๋ฆ„์ด ์ง๊ด€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ๊ทธ ์šฉ๋„๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค:

-    leIsClickLoginButton: () -> Unit,
+    onLoginButtonClick: () -> Unit,

๊ทธ๋ฆฌ๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜ ์‚ฌ์šฉ ์œ„์น˜๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

-    onClick = leIsClickLoginButton,
+    onClick = onLoginButtonClick,

95-103: PreviewSignInSubScreen ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋ณ€๊ฒฝ ํ•„์š”

๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ•จ์ˆ˜๋„ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜์„ธ์š”:

@Preview
@Composable
fun PreviewSignInSubScreen() {
    SignInSubScreen(
        clickButton = false,
        gAuthLogin = {},
-       leIsClickLoginButton = {}
+       onLoginButtonClick = {}
    )
}

1-103: SignInScreen.kt์™€ ์ค‘๋ณต ์ฝ”๋“œ ๋ฐ ๊ตฌ์กฐ ์žฌ๊ฒ€ํ†  ํ•„์š”

SignInScreen.kt์™€ SignInSubScreen.kt ํŒŒ์ผ ๊ฐ„์— ์ค‘๋ณต๋œ ์ฝ”๋“œ์™€ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ํ™”๋ฉด์˜ ์ฐจ์ด์ ๊ณผ ๊ณตํ†ต์ ์„ ๊ณ ๋ คํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”:

  1. ๋‘ ํ™”๋ฉด์˜ ๊ด€๊ณ„๋ฅผ ๋‹ค์‹œ ๊ฒ€ํ† ํ•˜๊ณ  ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ํ™”๋ฉด์œผ๋กœ ํ†ตํ•ฉํ•˜๊ฑฐ๋‚˜ ๋ ˆ์ด์•„์›ƒ์„ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์žฌ๊ตฌ์„ฑ
  2. ๊ณตํ†ต ์š”์†Œ(์˜ˆ: GAuthSigninWebView, ๋ฒ„ํŠผ ์ฒ˜๋ฆฌ ๋“ฑ)๋Š” ๋ณ„๋„์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ์ถ”์ถœ
  3. ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ๊ฒ€ํ† ํ•˜์—ฌ SignInScreen์ด SignInSubScreen์„ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ตฌ์กฐ๊ฐ€ ๋” ์ ์ ˆํ•œ์ง€ ํ™•์ธ

์˜ˆ๋ฅผ ๋“ค์–ด:

  • SignInScreen์ด ๋ฉ”์ธ ์ปจํ…Œ์ด๋„ˆ ์—ญํ• ์„ ํ•˜๊ณ  SignInSubScreen์„ ๋‚ด๋ถ€์— ํฌํ•จํ•˜๋Š” ๊ตฌ์กฐ
  • ๋˜๋Š” ๋‘ ํ™”๋ฉด์„ ์™„์ „ํžˆ ๋ณ„๊ฐœ์˜ ํ™”๋ฉด์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ณตํ†ต ๋กœ์ง์€ ViewModel์ด๋‚˜ ๊ณต์œ  ์ปดํฌ๋„ŒํŠธ๋กœ ์ถ”์ถœ
๐Ÿ“œ Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between e5ecf96 and 67600c3.

โ›” Files ignored due to path filters (3)
  • buildSrc/build/kotlin/compileKotlin/cacheable/last-build.bin is excluded by !**/*.bin
  • buildSrc/build/kotlin/compileKotlin/local-state/build-history.bin is excluded by !**/*.bin
  • buildSrc/build/libs/buildSrc.jar is excluded by !**/*.jar
๐Ÿ“’ Files selected for processing (2)
  • presentation/src/main/java/view/signin/screen/SignInScreen.kt (1 hunks)
  • presentation/src/main/java/view/signin/screen/SignInSubScreen.kt (1 hunks)

Comment on lines +109 to +110
clientId = "ghskfend",
redirectUri = "ghskfen"
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue

ํด๋ผ์ด์–ธํŠธ ID์™€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ URI๋ฅผ ์ƒ์ˆ˜๋กœ ๋ถ„๋ฆฌ ํ•„์š”

ํ˜„์žฌ "ghskfend"์™€ "ghskfen"์€ ํ…Œ์ŠคํŠธ ๋˜๋Š” ์ž„์‹œ ๊ฐ’์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ’์€ ์ƒ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•˜๊ฑฐ๋‚˜ ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜์„ธ์š”:

  1. ์ƒ์ˆ˜ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ์ƒ์ˆ˜ ํด๋ž˜์Šค์— ์ถ”๊ฐ€:
object AuthConfig {
    const val CLIENT_ID = "์‹ค์ œ_ํด๋ผ์ด์–ธํŠธ_ID"
    const val REDIRECT_URI = "์‹ค์ œ_๋ฆฌ๋‹ค์ด๋ ‰ํŠธ_URI"
}
  1. ํ•ด๋‹น ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉ:
GAuthSigninWebView(
-   clientId = "ghskfend",
-   redirectUri = "ghskfen"
+   clientId = AuthConfig.CLIENT_ID,
+   redirectUri = AuthConfig.REDIRECT_URI
) { code ->
    gAuthLogin(code)
}

Comment on lines +100 to +104
Text(
text = "ํšŒ์›๊ฐ€์ž… ํ•˜๊ธฐ",
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
textAlign = TextAlign.Center
)
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

ํšŒ์›๊ฐ€์ž… ํ…์ŠคํŠธ์— clickable ์ˆ˜์ •์ž ์ถ”๊ฐ€ ํ•„์š”

"ํšŒ์›๊ฐ€์ž… ํ•˜๊ธฐ" ํ…์ŠคํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•  ์ˆ˜ ์žˆ๋Š” ์š”์†Œ๋กœ ๋ณด์ด์ง€๋งŒ, clickable ์ˆ˜์ •์ž๊ฐ€ ์—†์–ด ์‹ค์ œ๋กœ๋Š” ํด๋ฆญํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด clickable ์ˆ˜์ •์ž์™€ ํด๋ฆญ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

Text(
    text = "ํšŒ์›๊ฐ€์ž… ํ•˜๊ธฐ",
+   modifier = Modifier
+       .clickable { /* ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด์œผ๋กœ ์ด๋™ */ }
+       .semantics { contentDescription = "ํšŒ์›๊ฐ€์ž… ํ•˜๊ธฐ" },
    style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
    textAlign = TextAlign.Center
)
๐Ÿ“ 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
Text(
text = "ํšŒ์›๊ฐ€์ž… ํ•˜๊ธฐ",
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
textAlign = TextAlign.Center
)
Text(
text = "ํšŒ์›๊ฐ€์ž… ํ•˜๊ธฐ",
modifier = Modifier
.clickable { /* ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด์œผ๋กœ ์ด๋™ */ }
.semantics { contentDescription = "ํšŒ์›๊ฐ€์ž… ํ•˜๊ธฐ" },
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
textAlign = TextAlign.Center
)

Comment on lines +68 to +82
Text(
text = "์•„์ด๋”” ์ฐพ๊ธฐ",
modifier = Modifier,
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
Text(
text = " | ",
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
Text(
text = "๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ",
modifier = Modifier,
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
}
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

ํด๋ฆญ ๊ฐ€๋Šฅํ•œ ํ…์ŠคํŠธ์— clickable ์ˆ˜์ •์ž ์ถ”๊ฐ€ ํ•„์š”

"์•„์ด๋”” ์ฐพ๊ธฐ"์™€ "๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ" ํ…์ŠคํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•  ์ˆ˜ ์žˆ๋Š” ์š”์†Œ๋กœ ๋ณด์ด์ง€๋งŒ, clickable ์ˆ˜์ •์ž๊ฐ€ ์—†์–ด ์‹ค์ œ๋กœ๋Š” ํด๋ฆญํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด clickable ์ˆ˜์ •์ž์™€ ํด๋ฆญ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

Text(
    text = "์•„์ด๋”” ์ฐพ๊ธฐ",
-   modifier = Modifier,
+   modifier = Modifier
+       .clickable { /* ์•„์ด๋”” ์ฐพ๊ธฐ ๊ธฐ๋Šฅ ์‹คํ–‰ */ }
+       .semantics { contentDescription = "์•„์ด๋”” ์ฐพ๊ธฐ" },
    style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
Text(
    text = " | ",
    style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
Text(
    text = "๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ",
-   modifier = Modifier,
+   modifier = Modifier
+       .clickable { /* ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ๊ธฐ๋Šฅ ์‹คํ–‰ */ }
+       .semantics { contentDescription = "๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ" },
    style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
๐Ÿ“ 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
Text(
text = "์•„์ด๋”” ์ฐพ๊ธฐ",
modifier = Modifier,
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
Text(
text = " | ",
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
Text(
text = "๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ",
modifier = Modifier,
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
}
Text(
text = "์•„์ด๋”” ์ฐพ๊ธฐ",
modifier = Modifier
.clickable { /* ์•„์ด๋”” ์ฐพ๊ธฐ ๊ธฐ๋Šฅ ์‹คํ–‰ */ }
.semantics { contentDescription = "์•„์ด๋”” ์ฐพ๊ธฐ" },
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
Text(
text = " | ",
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
Text(
text = "๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ",
modifier = Modifier
.clickable { /* ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ๊ธฐ๋Šฅ ์‹คํ–‰ */ }
.semantics { contentDescription = "๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ" },
style = DoMaTypography.labelLarge.copy(color = colors.WHITE),
)
}

Comment on lines +85 to +86
clientId = "ghskfend",
redirectUri = "ghskfen"
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue

ํด๋ผ์ด์–ธํŠธ ID์™€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ URI๋ฅผ ์ƒ์ˆ˜๋กœ ๋ถ„๋ฆฌ ํ•„์š”

ํ˜„์žฌ "ghskfend"์™€ "ghskfen"์€ ํ…Œ์ŠคํŠธ ๋˜๋Š” ์ž„์‹œ ๊ฐ’์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ’์€ ์ƒ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•˜๊ฑฐ๋‚˜ ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜์„ธ์š”:

  1. ์ƒ์ˆ˜ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ์ƒ์ˆ˜ ํด๋ž˜์Šค์— ์ถ”๊ฐ€:
object AuthConfig {
    const val CLIENT_ID = "์‹ค์ œ_ํด๋ผ์ด์–ธํŠธ_ID"
    const val REDIRECT_URI = "์‹ค์ œ_๋ฆฌ๋‹ค์ด๋ ‰ํŠธ_URI"
}
  1. ํ•ด๋‹น ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉ:
GAuthSigninWebView(
-   clientId = "ghskfend",
-   redirectUri = "ghskfen"
+   clientId = AuthConfig.CLIENT_ID,
+   redirectUri = AuthConfig.REDIRECT_URI
) { code ->
    gAuthLogin(code)
}

Comment on lines 69 to 73
DoMaInputID(modifier = Modifier.fillMaxWidth())

Spacer(modifier = Modifier.height(12.dp))

DoMaInputPassword(modifier = Modifier.fillMaxWidth())
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

์ž…๋ ฅ ํ•„๋“œ์— ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ํ•„์š”

DoMaInputID์™€ DoMaInputPassword ์ปดํฌ๋„ŒํŠธ์—๋Š” ์ž…๋ ฅ ๊ฐ’์„ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ์™€ PR ์ฝ”๋ฉ˜ํŠธ์—์„œ ์–ธ๊ธ‰๋œ ์ตœ๋Œ€ ๊ธ€์ž ์ˆ˜ ์ œํ•œ, ํ‚ค๋ณด๋“œ ์•ก์…˜, ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋“ฑ์˜ ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ์ƒํƒœ ๊ด€๋ฆฌ์™€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์„ธ์š”:

+ import androidx.compose.runtime.mutableStateOf
+ import androidx.compose.runtime.remember
+ import androidx.compose.ui.text.input.ImeAction

@Composable
fun SignInSubScreen(
    modifier: Modifier = Modifier,
    clickButton: Boolean,
    gAuthLogin: (String) -> Unit,
-   leIsClickLoginButton: () -> Unit,
+   onLoginButtonClick: () -> Unit,
) {
    DoMaAndroidTheme { colors, typography ->
+       val (id, setId) = remember { mutableStateOf("") }
+       val (password, setPassword) = remember { mutableStateOf("") }
+       val (idError, setIdError) = remember { mutableStateOf<String?>(null) }
+       val (passwordError, setPasswordError) = remember { mutableStateOf<String?>(null) }

        Column(
            /* ... ๊ธฐ์กด ์ฝ”๋“œ ... */
        ) {
            /* ... ๊ธฐ์กด ์ฝ”๋“œ ... */

-           DoMaInputID(modifier = Modifier.fillMaxWidth())
+           DoMaInputID(
+               value = id,
+               onValueChange = { 
+                   if (it.length <= 20) { // ์ตœ๋Œ€ ๊ธธ์ด ์ œํ•œ
+                       setId(it)
+                       setIdError(null)
+                   }
+               },
+               error = idError,
+               imeAction = ImeAction.Next,
+               modifier = Modifier.fillMaxWidth()
+           )

            Spacer(modifier = Modifier.height(12.dp))

-           DoMaInputPassword(modifier = Modifier.fillMaxWidth())
+           DoMaInputPassword(
+               value = password,
+               onValueChange = { 
+                   if (it.length <= 20) { // ์ตœ๋Œ€ ๊ธธ์ด ์ œํ•œ
+                       setPassword(it)
+                       setPasswordError(null)
+                   }
+               },
+               error = passwordError,
+               imeAction = ImeAction.Done,
+               onDone = {
+                   // ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋กœ์ง
+                   if (id.isEmpty()) {
+                       setIdError("์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”")
+                   } else if (password.isEmpty()) {
+                       setPasswordError("๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”")
+                   } else {
+                       onLoginButtonClick()
+                   }
+               },
+               modifier = Modifier.fillMaxWidth()
+           )

์ถ”๊ฐ€๋กœ DoMaInputID.kt์™€ DoMaInputPassword.kt ํŒŒ์ผ์—๋„ ํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ 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
DoMaInputID(modifier = Modifier.fillMaxWidth())
Spacer(modifier = Modifier.height(12.dp))
DoMaInputPassword(modifier = Modifier.fillMaxWidth())
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.text.input.ImeAction
@Composable
fun SignInSubScreen(
modifier: Modifier = Modifier,
clickButton: Boolean,
gAuthLogin: (String) -> Unit,
onLoginButtonClick: () -> Unit,
) {
DoMaAndroidTheme { colors, typography ->
val (id, setId) = remember { mutableStateOf("") }
val (password, setPassword) = remember { mutableStateOf("") }
val (idError, setIdError) = remember { mutableStateOf<String?>(null) }
val (passwordError, setPasswordError) = remember { mutableStateOf<String?>(null) }
Column(
/* ... ๊ธฐ์กด ์ฝ”๋“œ ... */
) {
/* ... ๊ธฐ์กด ์ฝ”๋“œ ... */
DoMaInputID(
value = id,
onValueChange = {
if (it.length <= 20) { // ์ตœ๋Œ€ ๊ธธ์ด ์ œํ•œ
setId(it)
setIdError(null)
}
},
error = idError,
imeAction = ImeAction.Next,
modifier = Modifier.fillMaxWidth()
)
Spacer(modifier = Modifier.height(12.dp))
DoMaInputPassword(
value = password,
onValueChange = {
if (it.length <= 20) { // ์ตœ๋Œ€ ๊ธธ์ด ์ œํ•œ
setPassword(it)
setPasswordError(null)
}
},
error = passwordError,
imeAction = ImeAction.Done,
onDone = {
// ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋กœ์ง
if (id.isEmpty()) {
setIdError("์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”")
} else if (password.isEmpty()) {
setPasswordError("๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”")
} else {
onLoginButtonClick()
}
},
modifier = Modifier.fillMaxWidth()
)
}
}
}

Copy link

@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

โ™ป๏ธ Duplicate comments (5)
presentation/src/main/java/view/signin/component/DoMaInputPassWord.kt (2)

23-63: โš ๏ธ Potential issue

๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ ํ•„๋“œ์˜ ๋ณด์•ˆ ๊ธฐ๋Šฅ์ด ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ ํ•„๋“œ์— ๋‹ค์Œ ๋ณด์•ˆ ๊ธฐ๋Šฅ๋“ค์„ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”:

  1. ๋น„๋ฐ€๋ฒˆํ˜ธ ๋งˆ์Šคํ‚น (PasswordVisualTransformation)
  2. ๋น„๋ฐ€๋ฒˆํ˜ธ ํ‘œ์‹œ/์ˆจ๊น€ ํ† ๊ธ€
  3. ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ ํƒ€์ž… ์„ค์ •

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”:

+import androidx.compose.material.Icon
+import androidx.compose.material.IconButton
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Visibility
+import androidx.compose.material.icons.filled.VisibilityOff
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.text.input.KeyboardType
+import androidx.compose.ui.text.input.PasswordVisualTransformation
+import androidx.compose.ui.text.input.VisualTransformation

@Composable
fun DoMaInputPassword(
    modifier: Modifier = Modifier,
    passwordValue: TextFieldValue,
    onPasswordValueChange: (TextFieldValue) -> Unit
) {
+   var passwordVisible by remember { mutableStateOf(false) }
    DoMaAndroidTheme { colors, typography ->

        Column(
            modifier = modifier
        ) {
            // ... ๊ธฐ์กด ์ฝ”๋“œ ...
            OutlinedTextField(
                modifier = Modifier.fillMaxWidth(),
                value = passwordValue,
                onValueChange = onPasswordValueChange,
+               visualTransformation = if (passwordVisible) VisualTransformation.None else PasswordVisualTransformation(),
+               keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password),
+               trailingIcon = {
+                   IconButton(onClick = { passwordVisible = !passwordVisible }) {
+                       Icon(
+                           imageVector = if (passwordVisible) Icons.Default.Visibility else Icons.Default.VisibilityOff,
+                           contentDescription = if (passwordVisible) "๋น„๋ฐ€๋ฒˆํ˜ธ ์ˆจ๊ธฐ๊ธฐ" else "๋น„๋ฐ€๋ฒˆํ˜ธ ํ‘œ์‹œ",
+                           tint = colors.WHITE
+                       )
+                   }
+               },
                // ... ๊ธฐ์กด ์ฝ”๋“œ ...
            )
        }
    }
}

54-59: ๐Ÿ› ๏ธ Refactor suggestion

์ƒ‰์ƒ ์ฐธ์กฐ๊ฐ€ ์ผ๊ด€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

DoMaAndroidTheme์—์„œ ์ œ๊ณตํ•˜๋Š” colors ๋ณ€์ˆ˜ ๋Œ€์‹  ์ง์ ‘ DoMaColor๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ ์ „์ฒด์—์„œ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ์ƒ‰์ƒ์„ ์ฐธ์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”:

colors = TextFieldDefaults.outlinedTextFieldColors(
-   backgroundColor = DoMaColor.BACKGROUND,
-   cursorColor = DoMaColor.WHITE,
-   focusedBorderColor = DoMaColor.GRAY,
-   unfocusedBorderColor = DoMaColor.GRAY
+   backgroundColor = colors.BACKGROUND,
+   cursorColor = colors.WHITE,
+   focusedBorderColor = colors.GRAY,
+   unfocusedBorderColor = colors.GRAY
)
presentation/src/main/java/view/signin/screen/SignInSubScreen.kt (3)

76-88: ๐Ÿ› ๏ธ Refactor suggestion

์ž…๋ ฅ ํ•„๋“œ์— ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์™€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค.

ID์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ ํ•„๋“œ์— ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์™€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. PR ์ฝ”๋ฉ˜ํŠธ์—์„œ ์–ธ๊ธ‰๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์ตœ๋Œ€ ๊ธ€์ž ์ˆ˜ ์ œํ•œ, ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋“ฑ์˜ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

DoMaInputID์™€ DoMaInputPassword ์ปดํฌ๋„ŒํŠธ์— ์˜ค๋ฅ˜ ์ƒํƒœ์™€ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๊ณ , ์ด๋ฅผ ํ™”๋ฉด์—์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒํƒœ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค:

fun SignInSubScreen(
    // ๊ธฐ์กด ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค
) {
    DoMaAndroidTheme { colors, typography ->
+       val (idError, setIdError) = remember { mutableStateOf<String?>(null) }
+       val (passwordError, setPasswordError) = remember { mutableStateOf<String?>(null) }

        // ๊ธฐ์กด ์ฝ”๋“œ

        DoMaInputID(
            modifier = Modifier.fillMaxWidth(),
            idValue = idValue,
            onIdValueChange = { newValue -> 
+               // ์ตœ๋Œ€ ๊ธธ์ด ์ œํ•œ (์˜ˆ: 20์ž)
+               if (newValue.text.length <= 20) {
                    onIdValueChange(newValue)
+                   setIdError(null)
+               }
            },
+           error = idError,
+           imeAction = ImeAction.Next
        )

        Spacer(modifier = Modifier.height(12.dp))

        DoMaInputPassword(
            modifier = Modifier.fillMaxWidth(),
            passwordValue = passwordValue,
            onPasswordValueChange = { newValue ->
+               // ์ตœ๋Œ€ ๊ธธ์ด ์ œํ•œ (์˜ˆ: 20์ž)
+               if (newValue.text.length <= 20) {
                    onPasswordValueChange(newValue)
+                   setPasswordError(null)
+               }
            },
+           error = passwordError,
+           imeAction = ImeAction.Done,
+           onDone = {
+               // ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ ์ „ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
+               if (idValue.text.isEmpty()) {
+                   setIdError("์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”")
+               } else if (passwordValue.text.isEmpty()) {
+                   setPasswordError("๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”")
+               } else {
+                   onLoginButtonClick()
+               }
+           }
        )

99-104: โš ๏ธ Potential issue

ํด๋ผ์ด์–ธํŠธ ID์™€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ URI๋ฅผ ์ƒ์ˆ˜๋กœ ๋ถ„๋ฆฌ ํ•„์š”

ํ˜„์žฌ "ghskfend"์™€ "ghskfen"์€ ํ…Œ์ŠคํŠธ ๋˜๋Š” ์ž„์‹œ ๊ฐ’์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ’์€ ์ƒ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•˜๊ฑฐ๋‚˜ ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜์„ธ์š”:

  1. ์ƒ์ˆ˜ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ์ƒ์ˆ˜ ํด๋ž˜์Šค์— ์ถ”๊ฐ€:
object AuthConfig {
    const val CLIENT_ID = "์‹ค์ œ_ํด๋ผ์ด์–ธํŠธ_ID"
    const val REDIRECT_URI = "์‹ค์ œ_๋ฆฌ๋‹ค์ด๋ ‰ํŠธ_URI"
}
  1. ํ•ด๋‹น ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉ:
GAuthSigninWebView(
-   clientId = "ghskfend",
-   redirectUri = "ghskfen"
+   clientId = AuthConfig.CLIENT_ID,
+   redirectUri = AuthConfig.REDIRECT_URI
) { code ->
    gAuthLogin(code)
}

30-40: ๐Ÿ› ๏ธ Refactor suggestion

ํ•จ์ˆ˜ ์ด๋ฆ„๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ ๋„ค์ด๋ฐ์ด ์ผ๊ด€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์ค‘ leIsClickLoginButton์€ ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ณ  ์ผ๊ด€๋œ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ๋”ฐ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”:

fun SignInSubScreen(
    modifier: Modifier = Modifier,
    clickButton: Boolean,
    gAuthLogin: (String) -> Unit,
-   leIsClickLoginButton: () -> Unit,
+   onLoginButtonClick: () -> Unit,
    idValue: TextFieldValue,
    onIdValueChange: (TextFieldValue) -> Unit,
    passwordValue: TextFieldValue,
    onPasswordValueChange: (TextFieldValue) -> Unit
)

๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ณณ๋„ ํ•จ๊ป˜ ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”:

DoMaLoginButton(
-   onClick = leIsClickLoginButton,
+   onClick = onLoginButtonClick,
    // ... ๋‚˜๋จธ์ง€ ์ฝ”๋“œ
)
๐Ÿงน Nitpick comments (2)
presentation/src/main/java/view/signin/component/DoMaInputID.kt (1)

37-56: TextField์— ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

PR ์ฝ”๋ฉ˜ํŠธ์—์„œ ์–ธ๊ธ‰๋œ ๊ฒƒ์ฒ˜๋Ÿผ TextField์— ์ตœ๋Œ€ ๊ธ€์ž ์ˆ˜ ์ œํ•œ, ํ‚ค๋ณด๋“œ ์•ก์…˜, ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋“ฑ์˜ ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค:

OutlinedTextField(
    modifier = Modifier.fillMaxWidth(),
    value = idValue,
    onValueChange = onIdValueChange,
+   isError = error != null,
+   keyboardOptions = KeyboardOptions(
+       imeAction = imeAction,
+       keyboardType = KeyboardType.Text
+   ),
+   keyboardActions = KeyboardActions(
+       onNext = { onNext?.invoke() },
+       onDone = { onDone?.invoke() }
+   ),
    textStyle = DoMaTypography.labelLarge.copy(color = colors.WHITE),
    shape = RoundedCornerShape(12.dp),
    singleLine = true,
    placeholder = {
        Text(
            text = "์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.",
            style = DoMaTypography.labelLarge.copy(color = colors.silver)
        )
    },
+   supportingText = error?.let {
+       { Text(text = it, color = colors.ERROR) }
+   },
    colors = TextFieldDefaults.outlinedTextFieldColors(
        backgroundColor = colors.BACKGROUND,
        cursorColor = colors.WHITE,
        focusedBorderColor = colors.GRAY,
        unfocusedBorderColor = colors.GRAY
    )
)

๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”:

fun DoMaInputID(
    modifier: Modifier = Modifier,
    idValue: TextFieldValue,
    onIdValueChange: (TextFieldValue) -> Unit,
+   error: String? = null,
+   imeAction: ImeAction = ImeAction.Next,
+   onNext: (() -> Unit)? = null,
+   onDone: (() -> Unit)? = null
)
presentation/src/main/java/view/signin/component/DoMaInputPassWord.kt (1)

67-74: ๋น„๋ฐ€๋ฒˆํ˜ธ ์ปดํฌ๋„ŒํŠธ์— ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ID ์ž…๋ ฅ ์ปดํฌ๋„ŒํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ตœ๋Œ€ ๊ธ€์ž ์ˆ˜ ์ œํ•œ, ํ‚ค๋ณด๋“œ ์•ก์…˜, ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค:

fun DoMaInputPassword(
    modifier: Modifier = Modifier,
    passwordValue: TextFieldValue,
    onPasswordValueChange: (TextFieldValue) -> Unit,
+   error: String? = null,
+   imeAction: ImeAction = ImeAction.Done,
+   onDone: (() -> Unit)? = null
)

๊ทธ๋ฆฌ๊ณ  TextField์— ๊ด€๋ จ ์†์„ฑ๋“ค์„ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.

๐Ÿ“œ Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between 67600c3 and d61a77f.

โ›” Files ignored due to path filters (3)
  • buildSrc/build/kotlin/compileKotlin/cacheable/last-build.bin is excluded by !**/*.bin
  • buildSrc/build/kotlin/compileKotlin/local-state/build-history.bin is excluded by !**/*.bin
  • buildSrc/build/libs/buildSrc.jar is excluded by !**/*.jar
๐Ÿ“’ Files selected for processing (4)
  • presentation/src/main/java/view/signin/component/DoMaInputID.kt (1 hunks)
  • presentation/src/main/java/view/signin/component/DoMaInputPassWord.kt (1 hunks)
  • presentation/src/main/java/view/signin/screen/SignInSubScreen.kt (1 hunks)
  • presentation/src/main/java/view/theme/color/DoMaColor.kt (2 hunks)
๐Ÿšง Files skipped from review as they are similar to previous changes (1)
  • presentation/src/main/java/view/theme/color/DoMaColor.kt
๐Ÿ”‡ Additional comments (1)
presentation/src/main/java/view/signin/component/DoMaInputID.kt (1)

19-59: ์ปดํฌ๋„ŒํŠธ๊ฐ€ Stateless๋กœ ๊ตฌํ˜„๋˜์–ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ƒํƒœ๋ฅผ ์™ธ๋ถ€์—์„œ ์ฃผ์ž… ๋ฐ›๋„๋ก ๊ตฌํ˜„ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด์ „ ๋ฆฌ๋ทฐ ์˜๊ฒฌ์„ ์ž˜ ๋ฐ˜์˜ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Comment on lines +91 to +96
DoMaLoginButton(
onClick = leIsClickLoginButton,
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 30.dp)
)
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ž…๋ ฅ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋กœ์ง์ด ์—†์Šต๋‹ˆ๋‹ค.

๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋Š” ๋กœ์ง์ด ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜์„ธ์š”:

DoMaLoginButton(
-   onClick = leIsClickLoginButton,
+   onClick = {
+       // ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
+       if (idValue.text.isEmpty()) {
+           setIdError("์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”")
+       } else if (passwordValue.text.isEmpty()) {
+           setPasswordError("๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”")
+       } else {
+           leIsClickLoginButton()
+       }
+   },
    modifier = Modifier
        .fillMaxWidth()
        .padding(bottom = 30.dp)
)

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

fun DoMaInputID(
modifier: Modifier = Modifier,
idValue: TextFieldValue,
onIdValueChange: (TextFieldValue) -> Unit
Copy link
Collaborator

Choose a reason for hiding this comment

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

์ด๋Ÿฌ๋ฉด ๋ญ”๊ฐ€ ์ƒํƒœ๊ฐ€ ๊ทธ๋Œ€๋กœ ์ผ๊ฒƒ ๊ฐ™์œผ๋‹ˆ viewmodel ์ด์šฉํ•ด์ฃผ์„ธ์š”

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.

3 participants