diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/HeaderButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/HeaderButton.kt index cdff5839..a97ad7de 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/buttons/HeaderButton.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/HeaderButton.kt @@ -10,10 +10,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource @@ -27,19 +23,17 @@ import com.texthip.thip.ui.theme.ThipTheme.typography fun HeaderButton( modifier: Modifier = Modifier, text: String, + enabled: Boolean = false, onClick: () -> Unit = {}, ) { - var isClicked by remember { mutableStateOf(false) } - Box( modifier = modifier .background( - color = if (isClicked) colors.Purple else colors.Grey02, + color = if (enabled) colors.Purple else colors.Grey02, shape = RoundedCornerShape(20.dp) ) - .clickable { - isClicked = !isClicked - onClick() + .let { + if (enabled) it.clickable(onClick = onClick) else it } .padding(vertical = 4.dp, horizontal = 12.dp), contentAlignment = Alignment.Center, @@ -60,8 +54,17 @@ private fun HeaderButtonPreview() { horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { + // 비활성 상태 + HeaderButton( + text = stringResource(R.string.finish), + enabled = false + ) + + // 활성 상태 HeaderButton( text = stringResource(R.string.finish), + enabled = true, + onClick = { } ) } } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/common/topappbar/BookTopAppBar.kt b/app/src/main/java/com/texthip/thip/ui/common/topappbar/BookTopAppBar.kt new file mode 100644 index 00000000..69e3e31f --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/topappbar/BookTopAppBar.kt @@ -0,0 +1,63 @@ +package com.texthip.thip.ui.common.topappbar + +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import com.texthip.thip.R +import com.texthip.thip.ui.common.view.CountingBar +import com.texthip.thip.ui.theme.ThipTheme + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun BookTopAppBar( + count: Int = 0, + onLeftClick: () -> Unit, + onRightClick: () -> Unit, +) { + TopAppBar( + navigationIcon = { + IconButton(onClick = onLeftClick) { + Icon( + painter = painterResource(R.drawable.ic_arrow_back), + contentDescription = "Back Button", + tint = Color.Unspecified + ) + } + }, + title = { + CountingBar( + count = count, + ) + }, + actions = { + IconButton(onClick = onRightClick) { + Icon( + painter = painterResource(R.drawable.ic_more), + contentDescription = "More Options", + tint = Color.Unspecified + ) + } + }, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = Color.Transparent, + ), + ) +} + +@Preview(showBackground = false) +@Composable +private fun BookTopAppBarPreview() { + ThipTheme { + BookTopAppBar( + onLeftClick = { }, + onRightClick = { }, + count = 210 + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/common/topappbar/DefaultTopAppBar.kt b/app/src/main/java/com/texthip/thip/ui/common/topappbar/DefaultTopAppBar.kt new file mode 100644 index 00000000..8d51b534 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/topappbar/DefaultTopAppBar.kt @@ -0,0 +1,88 @@ +package com.texthip.thip.ui.common.topappbar + +import androidx.compose.foundation.layout.Column +import androidx.compose.material3.CenterAlignedTopAppBar +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DefaultTopAppBar( + title: String = stringResource(R.string.page_name), + isTitleVisible: Boolean = true, + isRightIconVisible: Boolean = false, + onLeftClick: () -> Unit, + onRightClick: () -> Unit = {}, +) { + CenterAlignedTopAppBar( + navigationIcon = { + IconButton(onClick = onLeftClick) { + Icon( + painter = painterResource(R.drawable.ic_arrow_back), + contentDescription = "Back Button", + tint = Color.Unspecified + ) + } + }, + title = { + if (isTitleVisible) { + Text( + text = title, + color = colors.White, + style = typography.bigtitle_b700_s22_h24 + ) + } + }, + actions = { + if (isRightIconVisible) { + IconButton(onClick = onRightClick) { + Icon( + painter = painterResource(R.drawable.ic_more), + contentDescription = "More Options", + tint = Color.Unspecified + ) + } + } + }, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = Color.Transparent, + ), + ) +} + +@Preview +@Composable +private fun DefaultTopAppBarPreview() { + Column { + DefaultTopAppBar( + onLeftClick = {}, + ) + DefaultTopAppBar( + isRightIconVisible = true, + onLeftClick = {}, + onRightClick = {}, + ) + DefaultTopAppBar( + isRightIconVisible = true, + isTitleVisible = false, + onLeftClick = {}, + onRightClick = {}, + ) + DefaultTopAppBar( + isRightIconVisible = false, + isTitleVisible = false, + onLeftClick = {}, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/common/topappbar/FeedListTopAppBar.kt b/app/src/main/java/com/texthip/thip/ui/common/topappbar/FeedListTopAppBar.kt new file mode 100644 index 00000000..aace1689 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/topappbar/FeedListTopAppBar.kt @@ -0,0 +1,90 @@ +package com.texthip.thip.ui.common.topappbar + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.width +import androidx.compose.material3.CenterAlignedTopAppBar +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun FeedListTopAppBar( + nickname: String = "ThipUser 01ThipUser 01", + isRightIconVisible: Boolean = false, + onLeftClick: () -> Unit, + onRightClick: () -> Unit = {}, +) { + CenterAlignedTopAppBar( + navigationIcon = { + IconButton(onClick = onLeftClick) { + Icon( + painter = painterResource(R.drawable.ic_arrow_back), + contentDescription = "Back Button", + tint = Color.Unspecified + ) + } + }, + title = { + Row( + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + Text( + text = nickname, + color = colors.White, + style = typography.bigtitle_b700_s22_h24, + modifier = Modifier.width(100.dp), + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + Text( + text = stringResource(R.string.subscriber), + color = colors.White, + style = typography.bigtitle_b700_s22_h24, + modifier = Modifier.width(100.dp), + maxLines = 1 + ) + } + }, + actions = { + if (isRightIconVisible) { + IconButton(onClick = { + onRightClick() + }) { + Icon( + painter = painterResource(R.drawable.ic_more), + contentDescription = "More Options", + tint = Color.Unspecified + ) + } + } + }, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = Color.Transparent, + ), + ) +} + +@Preview +@Composable +private fun FeedListTopAppBarPreview() { + FeedListTopAppBar( + isRightIconVisible = true, + onLeftClick = {}, + onRightClick = {} + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/common/topappbar/InputTopAppBar.kt b/app/src/main/java/com/texthip/thip/ui/common/topappbar/InputTopAppBar.kt new file mode 100644 index 00000000..8da648f4 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/topappbar/InputTopAppBar.kt @@ -0,0 +1,88 @@ +package com.texthip.thip.ui.common.topappbar + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.CenterAlignedTopAppBar +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.common.buttons.HeaderButton +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun InputTopAppBar( + title: String = stringResource(R.string.page_name), + isRightButtonEnabled: Boolean = false, + rightButtonName: String = stringResource(R.string.finish), + isLeftIconVisible: Boolean = true, + onLeftClick: () -> Unit = {}, + onRightClick: () -> Unit = {}, +) { + CenterAlignedTopAppBar( + navigationIcon = { + if (isLeftIconVisible) { + IconButton(onClick = onLeftClick) { + Icon( + painter = painterResource(R.drawable.ic_arrow_back), + contentDescription = "Back Button", + tint = Color.Unspecified + ) + } + } + }, + title = { + Text( + text = title, + color = colors.White, + style = typography.bigtitle_b700_s22_h24 + ) + }, + actions = { + HeaderButton( + text = rightButtonName, + enabled = isRightButtonEnabled, + onClick = { + onRightClick() + }, + modifier = Modifier.padding( + end = 18.dp + ) + ) + }, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = Color.Transparent, + ), + ) +} + +@Preview +@Composable +private fun InputTopAppBarPreview() { + Column { + InputTopAppBar( + isRightButtonEnabled = true, + onLeftClick = {}, + onRightClick = {} + ) + InputTopAppBar( + title = "설정 1/2", + isRightButtonEnabled = false, + rightButtonName = stringResource(R.string.next), + isLeftIconVisible = false, + onLeftClick = {}, + onRightClick = {} + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/common/topappbar/LeftNameTopAppBar.kt b/app/src/main/java/com/texthip/thip/ui/common/topappbar/LeftNameTopAppBar.kt new file mode 100644 index 00000000..fdfb0d63 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/topappbar/LeftNameTopAppBar.kt @@ -0,0 +1,88 @@ +package com.texthip.thip.ui.common.topappbar + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R +import com.texthip.thip.ui.theme.ThipTheme.colors +import com.texthip.thip.ui.theme.ThipTheme.typography + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun LeftNameTopAppBar( + title: String = stringResource(R.string.page_name), + isLeftIconVisible: Boolean = false, + isRightIconVisible: Boolean = false, + leftIcon: Painter, + rightIcon: Painter, + onLeftClick: () -> Unit = {}, + onRightClick: () -> Unit = {} +) { + TopAppBar( + navigationIcon = { + Text( + text = title, + color = colors.White, + style = typography.bigtitle_b700_s22_h24, + modifier = Modifier.padding(start = 18.dp) + ) + }, + title = { + Spacer(modifier = Modifier) + }, + actions = { + if (isLeftIconVisible) { + IconButton(onClick = onLeftClick) { + Icon( + painter = leftIcon, + contentDescription = "Left Icon", + tint = Color.Unspecified + ) + } + } + if (isRightIconVisible) { + IconButton(onClick = onRightClick) { + Icon( + painter = rightIcon, + contentDescription = "Right Icon", + tint = Color.Unspecified + ) + } + } + }, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = Color.Transparent, + ) + ) +} + +@Preview +@Composable +private fun LeftNameTopAppBarPreview() { + Column { + LeftNameTopAppBar( + leftIcon = painterResource(R.drawable.ic_search), + rightIcon = painterResource(R.drawable.ic_plus) + ) + LeftNameTopAppBar( + leftIcon = painterResource(R.drawable.ic_search), + rightIcon = painterResource(R.drawable.ic_plus), + isLeftIconVisible = true, + isRightIconVisible = true + ) + } +} diff --git a/app/src/main/java/com/texthip/thip/ui/common/topappbar/LogoTopAppBar.kt b/app/src/main/java/com/texthip/thip/ui/common/topappbar/LogoTopAppBar.kt new file mode 100644 index 00000000..31c5fe2b --- /dev/null +++ b/app/src/main/java/com/texthip/thip/ui/common/topappbar/LogoTopAppBar.kt @@ -0,0 +1,79 @@ +package com.texthip.thip.ui.common.topappbar + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.texthip.thip.R + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun LogoTopAppBar( + leftIcon: Painter, + hasNotification: Boolean, + onLeftClick: () -> Unit = {}, + onRightClick: () -> Unit = {} +) { + val rightIcon = if (hasNotification) { + painterResource(R.drawable.ic_notice_yes) + } else { + painterResource(R.drawable.ic_notice) + } + + TopAppBar( + navigationIcon = { + Image( + painter = painterResource(R.drawable.ic_logo), + contentDescription = "Logo", + modifier = Modifier + .height(24.dp) + .padding(start = 18.dp), + ) + }, + title = { + Spacer(modifier = Modifier) + }, + actions = { + IconButton(onClick = onLeftClick) { + Icon( + painter = leftIcon, + contentDescription = "Left Icon", + tint = Color.Unspecified + ) + } + IconButton(onClick = onRightClick) { + Icon( + painter = rightIcon, + contentDescription = "Right Icon", + tint = Color.Unspecified + ) + } + }, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = Color.Transparent, + ) + ) +} + +@Preview +@Composable +private fun LogoTopAppBarPreview() { + LogoTopAppBar( + leftIcon = painterResource(R.drawable.ic_search), + hasNotification = true, + onLeftClick = { }, + onRightClick = { } + ) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_logo.xml b/app/src/main/res/drawable/ic_logo.xml new file mode 100644 index 00000000..d6a7e2b4 --- /dev/null +++ b/app/src/main/res/drawable/ic_logo.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 791b691a..83ac96c6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,7 +2,7 @@ Thip - 🔥%d명이 읽기에 참여중이에요!🔥 + 🔥 %d명이 읽기에 참여중이에요! 🔥 구독 @@ -44,6 +44,11 @@ 해당 도서는 %1$dp까지만 있습니다. + + 님의 구독자 + 다음 + 페이지명 + 진행중 모집중 @@ -60,4 +65,5 @@ "%1$s의 진행도 " 모임방 참여할 사람! + \ No newline at end of file