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