Skip to content

Commit a669f2d

Browse files
committed
[BOOK-62] feat: 임시 로그인 화면 구현
1 parent 948373d commit a669f2d

File tree

10 files changed

+228
-3
lines changed

10 files changed

+228
-3
lines changed

build-logic/src/main/kotlin/AndroidFeatureConventionPlugin.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ internal class AndroidFeatureConventionPlugin : Plugin<Project> {
1919

2020
dependencies {
2121
implementation(project(path = ":core:designsystem"))
22+
implementation(project(path = ":core:ui"))
2223

2324
implementation(libs.bundles.circuit)
2425

core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/theme/Color.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,5 @@ val Pink80 = Color(0xFFEFB8C8)
99
val Purple40 = Color(0xFF6650a4)
1010
val PurpleGrey40 = Color(0xFF625b71)
1111
val Pink40 = Color(0xFF7D5260)
12+
13+
val Kakao = Color(0xFFFBD300)

core/ui/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build

core/ui/build.gradle.kts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
@file:Suppress("INLINE_FROM_HIGHER_PLATFORM")
2+
3+
plugins {
4+
alias(libs.plugins.booket.android.library)
5+
alias(libs.plugins.booket.android.library.compose)
6+
}
7+
8+
android {
9+
namespace = "com.ninecraft.booket.core.ui"
10+
}
11+
12+
dependencies {
13+
implementations(
14+
projects.core.designsystem,
15+
16+
libs.logger,
17+
)
18+
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package com.ninecraft.booket.core.ui.component
2+
3+
import androidx.compose.foundation.layout.Box
4+
import androidx.compose.foundation.layout.padding
5+
import androidx.compose.foundation.layout.sizeIn
6+
import androidx.compose.foundation.shape.RoundedCornerShape
7+
import androidx.compose.material.icons.Icons
8+
import androidx.compose.material.icons.filled.ArrowBackIosNew
9+
import androidx.compose.material.icons.filled.Check
10+
import androidx.compose.material3.Button
11+
import androidx.compose.material3.ButtonDefaults
12+
import androidx.compose.material3.Icon
13+
import androidx.compose.material3.MaterialTheme
14+
import androidx.compose.material3.Text
15+
import androidx.compose.runtime.Composable
16+
import androidx.compose.ui.Modifier
17+
import androidx.compose.ui.graphics.Color
18+
import androidx.compose.ui.unit.dp
19+
import com.ninecraft.booket.core.designsystem.ComponentPreview
20+
import com.ninecraft.booket.core.designsystem.theme.BooketTheme
21+
22+
@Composable
23+
fun BooketButton(
24+
onClick: () -> Unit,
25+
modifier: Modifier = Modifier,
26+
enabled: Boolean = true,
27+
containerColor: Color = MaterialTheme.colorScheme.primaryContainer,
28+
contentColor: Color = MaterialTheme.colorScheme.onPrimaryContainer,
29+
disabledContainerColor: Color = MaterialTheme.colorScheme.tertiaryContainer,
30+
disabledContentColor: Color = MaterialTheme.colorScheme.onTertiaryContainer,
31+
text: @Composable () -> Unit,
32+
leadingIcon: @Composable (() -> Unit)? = null,
33+
) {
34+
Button(
35+
onClick = onClick,
36+
modifier = modifier,
37+
enabled = enabled,
38+
shape = RoundedCornerShape(12.dp),
39+
colors = ButtonDefaults.buttonColors(
40+
containerColor = containerColor,
41+
contentColor = contentColor,
42+
disabledContainerColor = disabledContainerColor,
43+
disabledContentColor = disabledContentColor,
44+
),
45+
contentPadding = if (leadingIcon != null) {
46+
ButtonDefaults.ButtonWithIconContentPadding
47+
} else {
48+
ButtonDefaults.ContentPadding
49+
},
50+
) {
51+
TogetherButtonContent(
52+
text = text,
53+
leadingIcon = leadingIcon,
54+
)
55+
}
56+
}
57+
58+
@Composable
59+
private fun TogetherButtonContent(
60+
text: @Composable () -> Unit,
61+
leadingIcon: @Composable (() -> Unit)? = null,
62+
) {
63+
if (leadingIcon != null) {
64+
Box(Modifier.sizeIn(maxHeight = ButtonDefaults.IconSize)) {
65+
leadingIcon()
66+
}
67+
}
68+
Box(
69+
Modifier.padding(
70+
start = if (leadingIcon != null) {
71+
ButtonDefaults.IconSpacing
72+
} else {
73+
0.dp
74+
},
75+
),
76+
) {
77+
text()
78+
}
79+
}
80+
81+
@ComponentPreview
82+
@Composable
83+
private fun TogetherButtonPreview() {
84+
BooketTheme {
85+
BooketButton(
86+
onClick = {},
87+
text = {
88+
Text(text = "Button")
89+
},
90+
)
91+
}
92+
}
93+
94+
@ComponentPreview
95+
@Composable
96+
private fun TogetherButtonWithLeadingIconPreview() {
97+
BooketTheme {
98+
BooketButton(
99+
onClick = {},
100+
text = {
101+
Text("Check Button")
102+
},
103+
leadingIcon = {
104+
Icon(
105+
imageVector = Icons.Default.Check,
106+
contentDescription = "Check icon",
107+
tint = Color.White,
108+
)
109+
},
110+
)
111+
}
112+
}

feature/login/src/main/kotlin/com/ninecraft/booket/feature/login/LoginScreen.kt

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,29 @@
11
package com.ninecraft.booket.feature.login
22

33
import androidx.compose.foundation.layout.Arrangement
4+
import androidx.compose.foundation.layout.Box
45
import androidx.compose.foundation.layout.Column
56
import androidx.compose.foundation.layout.fillMaxSize
7+
import androidx.compose.foundation.layout.fillMaxWidth
8+
import androidx.compose.foundation.layout.height
9+
import androidx.compose.foundation.layout.padding
10+
import androidx.compose.material3.Icon
611
import androidx.compose.material3.Text
712
import androidx.compose.runtime.Composable
813
import androidx.compose.ui.Alignment
914
import androidx.compose.ui.Modifier
15+
import androidx.compose.ui.graphics.Color
16+
import androidx.compose.ui.graphics.vector.ImageVector
17+
import androidx.compose.ui.res.stringResource
18+
import androidx.compose.ui.res.vectorResource
19+
import androidx.compose.ui.text.TextStyle
20+
import androidx.compose.ui.text.font.FontWeight
21+
import androidx.compose.ui.unit.dp
22+
import androidx.compose.ui.unit.sp
1023
import com.ninecraft.booket.core.designsystem.DevicePreview
1124
import com.ninecraft.booket.core.designsystem.theme.BooketTheme
25+
import com.ninecraft.booket.core.designsystem.theme.Kakao
26+
import com.ninecraft.booket.core.ui.component.BooketButton
1227
import com.slack.circuit.codegen.annotations.CircuitInject
1328
import com.slack.circuit.runtime.CircuitUiEvent
1429
import com.slack.circuit.runtime.CircuitUiState
@@ -36,7 +51,7 @@ internal fun Login(
3651
horizontalAlignment = Alignment.CenterHorizontally,
3752
verticalArrangement = Arrangement.Center,
3853
) {
39-
LibraryContent(
54+
LoginContent(
4055
state = state,
4156
modifier = modifier,
4257
)
@@ -45,11 +60,44 @@ internal fun Login(
4560

4661
@Suppress("unused")
4762
@Composable
48-
internal fun LibraryContent(
63+
internal fun LoginContent(
4964
state: LoginScreen.State,
5065
modifier: Modifier = Modifier,
5166
) {
52-
Text(text = "로그인")
67+
Box(modifier = modifier.fillMaxSize()) {
68+
Text(
69+
text = "로그인",
70+
modifier = Modifier.align(Alignment.Center),
71+
)
72+
BooketButton(
73+
onClick = {},
74+
modifier = Modifier
75+
.fillMaxWidth()
76+
.padding(start = 32.dp, end = 32.dp, bottom = 32.dp)
77+
.height(56.dp)
78+
.align(Alignment.BottomCenter),
79+
containerColor = Kakao,
80+
contentColor = Color(0xFF121212),
81+
text = {
82+
Text(
83+
text = stringResource(id = R.string.kakao_login),
84+
fontSize = 18.sp,
85+
style = TextStyle(
86+
fontWeight = FontWeight.SemiBold,
87+
fontSize = 18.sp,
88+
lineHeight = 25.sp,
89+
),
90+
)
91+
},
92+
leadingIcon = {
93+
Icon(
94+
imageVector = ImageVector.vectorResource(id = R.drawable.ic_kakao),
95+
contentDescription = "Kakao Icon",
96+
tint = Color.Unspecified,
97+
)
98+
},
99+
)
100+
}
53101
}
54102

55103
@DevicePreview
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="20dp"
3+
android:height="20dp"
4+
android:viewportWidth="20"
5+
android:viewportHeight="20">
6+
<group>
7+
<clip-path
8+
android:pathData="M2,2h17v17h-17z"/>
9+
<path
10+
android:pathData="M10.5,2C5.806,2 2,5.275 2,9.314C2,11.942 3.614,14.248 6.032,15.537C5.853,16.26 5.389,18.155 5.293,18.559C5.179,19.064 5.463,19.054 5.649,18.919C5.794,18.812 7.977,17.196 8.92,16.499C9.43,16.583 9.959,16.624 10.497,16.624C15.191,16.624 18.997,13.349 18.997,9.31C18.997,5.271 15.197,2 10.5,2Z"
11+
android:fillColor="#381E1E"/>
12+
<path
13+
android:pathData="M4.539,6.984C4.019,6.984 4.019,7.977 4.539,7.977H5.426C5.426,7.977 5.432,10.66 5.426,11.276C5.426,11.727 6.347,11.75 6.347,11.299V8.071C6.347,8.071 6.647,8.001 7.232,8.001C7.782,8.001 7.782,6.984 7.232,6.984H4.539Z"
14+
android:fillColor="#EED823"/>
15+
<path
16+
android:pathData="M8.889,8.22L9.384,9.899H8.357L8.892,8.22H8.889ZM8.339,7.432C8.119,7.954 7.334,10.421 7.071,11.077C6.882,11.552 7.699,11.935 7.887,11.464L8.064,10.788H9.684C9.684,10.788 9.628,10.814 9.845,11.434C10.018,11.935 10.859,11.589 10.686,11.087C10.438,10.374 9.576,7.799 9.418,7.432C9.344,7.264 9.084,7.143 8.834,7.143C8.626,7.143 8.422,7.227 8.336,7.432"
17+
android:fillColor="#FFE600"/>
18+
<group>
19+
<clip-path
20+
android:pathData="M8.889,8.22L9.384,9.899H8.357L8.892,8.22H8.889ZM8.339,7.432C8.119,7.954 7.334,10.421 7.071,11.077C6.882,11.552 7.699,11.935 7.887,11.464L8.064,10.788H9.684C9.684,10.788 9.628,10.814 9.845,11.434C10.018,11.935 10.859,11.589 10.686,11.087C10.438,10.374 9.576,7.799 9.418,7.432C9.344,7.264 9.084,7.143 8.834,7.143C8.626,7.143 8.422,7.227 8.336,7.432"/>
21+
<path
22+
android:pathData="M10.859,7.143H6.882V11.935H10.859V7.143Z"
23+
android:fillColor="#EED823"/>
24+
</group>
25+
<path
26+
android:pathData="M11.032,7.583C11.032,8.421 11.035,11.124 11.035,11.124C11.035,11.124 10.964,11.662 11.387,11.662C11.811,11.662 12.748,11.659 13.165,11.659C13.583,11.659 13.58,10.696 13.165,10.696C12.751,10.696 11.99,10.693 11.99,10.693C11.99,10.693 11.993,8.192 11.99,7.586C11.99,7.294 11.752,7.146 11.511,7.146C11.27,7.146 11.029,7.294 11.032,7.586"
27+
android:fillColor="#EED823"/>
28+
<path
29+
android:pathData="M13.731,7.448C13.74,7.815 13.719,11.141 13.719,11.39C13.719,11.777 14.628,11.777 14.628,11.39C14.628,10.939 14.628,10.08 14.628,10.08L14.894,9.848L16.063,11.582C16.298,11.922 17.04,11.309 16.805,10.969L15.565,9.192C15.565,9.192 16.406,8.199 16.737,7.842C16.931,7.634 16.331,6.977 16.137,7.186C15.948,7.388 14.631,8.825 14.631,8.825C14.631,8.825 14.643,7.923 14.631,7.425C14.628,7.236 14.415,7.146 14.195,7.146C13.963,7.146 13.722,7.25 13.728,7.452"
30+
android:fillColor="#EED823"/>
31+
</group>
32+
</vector>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
<string name="kakao_login">카카오 로그인</string>
4+
</resources>

gradle/libs.versions.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ kotlin-ktlint-source = "0.50.0"
5858
## Test
5959
junit = "4.13.2"
6060
junit-version = "1.2.1"
61+
espresso-core = "3.6.1"
62+
material = "1.12.0"
6163

6264
[libraries]
6365
android-gradle-plugin = { group = "com.android.tools.build", name = "gradle", version.ref = "android-gradle-plugin" }
@@ -81,6 +83,7 @@ androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "u
8183
androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
8284
androidx-compose-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
8385
androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "androidx-compose-material3" }
86+
androidx-compose-material-icons-extended = { group = "androidx.compose.material", name = "material-icons-extended"}
8487

8588
hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" }
8689
hilt-android-compiler = { group = "com.google.dagger", name = "hilt-android-compiler", version.ref = "hilt" }
@@ -109,6 +112,8 @@ kakao-auth = { group = "com.kakao.sdk", name = "v2-user", version.ref = "kakao-c
109112

110113
junit = { group = "junit", name = "junit", version.ref = "junit" }
111114
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junit-version" }
115+
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espresso-core" }
116+
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
112117

113118
[plugins]
114119
gradle-dependency-handler-extensions = { id = "land.sungbin.dependency.handler.extensions", version.ref = "gradle-dependency-handler-extensions" }
@@ -146,6 +151,7 @@ androidx-compose = [
146151
"androidx-compose-ui",
147152
"androidx-compose-ui-graphics",
148153
"androidx-compose-ui-tooling-preview",
154+
"androidx-compose-material-icons-extended",
149155
]
150156

151157
circuit = [

settings.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,4 @@ include(
3333
":feature:main",
3434
":feature:search",
3535
)
36+
include(":core:ui")

0 commit comments

Comments
 (0)