Skip to content

Commit 65a0aed

Browse files
committed
[BOOK-273] feat: 커스텀 툴팁 적용
1 parent adc1905 commit 65a0aed

File tree

6 files changed

+113
-16
lines changed

6 files changed

+113
-16
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.ninecraft.booket.feature.record.component
2+
3+
import androidx.annotation.StringRes
4+
import androidx.compose.foundation.background
5+
import androidx.compose.foundation.layout.Box
6+
import androidx.compose.foundation.layout.Row
7+
import androidx.compose.foundation.layout.offset
8+
import androidx.compose.foundation.layout.padding
9+
import androidx.compose.foundation.layout.size
10+
import androidx.compose.foundation.shape.RoundedCornerShape
11+
import androidx.compose.material3.Text
12+
import androidx.compose.runtime.Composable
13+
import androidx.compose.ui.Alignment
14+
import androidx.compose.ui.Modifier
15+
import androidx.compose.ui.draw.shadow
16+
import androidx.compose.ui.graphics.graphicsLayer
17+
import androidx.compose.ui.res.stringResource
18+
import androidx.compose.ui.unit.dp
19+
import com.ninecraft.booket.core.designsystem.ComponentPreview
20+
import com.ninecraft.booket.core.designsystem.theme.ReedTheme
21+
import com.ninecraft.booket.feature.record.R
22+
23+
@Composable
24+
internal fun CustomTooltipBox(
25+
@StringRes messageResId: Int,
26+
) {
27+
Row(verticalAlignment = Alignment.CenterVertically) {
28+
Box(
29+
Modifier
30+
.shadow(ReedTheme.radius.xs, RoundedCornerShape(ReedTheme.radius.xs), clip = false)
31+
.background(
32+
ReedTheme.colors.contentPrimary,
33+
RoundedCornerShape(ReedTheme.radius.xs),
34+
)
35+
.padding(
36+
horizontal = ReedTheme.spacing.spacing3,
37+
vertical = ReedTheme.spacing.spacing2,
38+
),
39+
) {
40+
Text(
41+
text = stringResource(messageResId),
42+
color = ReedTheme.colors.contentInverse,
43+
style = ReedTheme.typography.label2Regular,
44+
)
45+
}
46+
Box(
47+
Modifier
48+
.padding(start = 2.dp)
49+
.size(ReedTheme.spacing.spacing3)
50+
.offset(
51+
x = (-10).dp,
52+
)
53+
.graphicsLayer {
54+
rotationZ = 45f
55+
shadowElevation = 8.dp.toPx()
56+
clip = true
57+
}
58+
.background(ReedTheme.colors.contentPrimary),
59+
)
60+
}
61+
}
62+
63+
@ComponentPreview
64+
@Composable
65+
private fun CustomTooltipBoxPreview() {
66+
ReedTheme {
67+
CustomTooltipBox(messageResId = R.string.scan_tooltip_message)
68+
}
69+
}

feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterPresenter.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import dagger.assisted.AssistedFactory
3232
import dagger.assisted.AssistedInject
3333
import dagger.hilt.android.components.ActivityRetainedComponent
3434
import kotlinx.collections.immutable.toPersistentList
35-
import kotlinx.coroutines.delay
3635
import kotlinx.coroutines.launch
3736

3837
class RecordRegisterPresenter @AssistedInject constructor(
@@ -94,6 +93,8 @@ class RecordRegisterPresenter @AssistedInject constructor(
9493
}
9594
}
9695
}
96+
var isScanTooltipVisible by rememberRetained { mutableStateOf(true) }
97+
var isImpressionGuideTooltipVisible by rememberRetained { mutableStateOf(true) }
9798

9899
val ocrNavigator = rememberAnsweringNavigator<OcrScreen.OcrResult>(navigator) { result ->
99100
recordSentenceState.edit {
@@ -180,6 +181,7 @@ class RecordRegisterPresenter @AssistedInject constructor(
180181
}
181182

182183
is RecordRegisterUiEvent.OnSentenceScanButtonClick -> {
184+
isScanTooltipVisible = false
183185
ocrNavigator.goTo(OcrScreen)
184186
}
185187

@@ -188,6 +190,7 @@ class RecordRegisterPresenter @AssistedInject constructor(
188190
}
189191

190192
is RecordRegisterUiEvent.OnImpressionGuideButtonClick -> {
193+
isImpressionGuideTooltipVisible = false
191194
beforeSelectedImpressionGuide = selectedImpressionGuide
192195
if (impressionState.text.isEmpty()) {
193196
selectedImpressionGuide = ""
@@ -282,6 +285,8 @@ class RecordRegisterPresenter @AssistedInject constructor(
282285
isImpressionGuideBottomSheetVisible = isImpressionGuideBottomSheetVisible,
283286
isExitDialogVisible = isExitDialogVisible,
284287
isRecordSavedDialogVisible = isRecordSavedDialogVisible,
288+
isScanTooltipVisible = isScanTooltipVisible,
289+
isImpressionGuideTooltipVisible = isImpressionGuideTooltipVisible,
285290
sideEffect = sideEffect,
286291
eventSink = ::handleEvent,
287292
)

feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterUiState.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ data class RecordRegisterUiState(
2727
val isImpressionGuideBottomSheetVisible: Boolean = false,
2828
val isExitDialogVisible: Boolean = false,
2929
val isRecordSavedDialogVisible: Boolean = false,
30+
val isScanTooltipVisible: Boolean = true,
31+
val isImpressionGuideTooltipVisible: Boolean = true,
3032
val sideEffect: RecordRegisterSideEffect? = null,
3133
val eventSink: (RecordRegisterUiEvent) -> Unit,
3234
) : CircuitUiState

feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/step/ImpressionStep.kt

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.ninecraft.booket.feature.record.step
22

33
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.layout.Arrangement
45
import androidx.compose.foundation.layout.Box
56
import androidx.compose.foundation.layout.Column
7+
import androidx.compose.foundation.layout.Row
68
import androidx.compose.foundation.layout.Spacer
79
import androidx.compose.foundation.layout.fillMaxSize
810
import androidx.compose.foundation.layout.fillMaxWidth
@@ -44,8 +46,8 @@ import com.ninecraft.booket.core.designsystem.component.button.smallRoundedButto
4446
import com.ninecraft.booket.core.designsystem.component.textfield.ReedRecordTextField
4547
import com.ninecraft.booket.core.designsystem.theme.ReedTheme
4648
import com.ninecraft.booket.core.designsystem.theme.White
47-
import com.ninecraft.booket.core.ui.component.ReedLoadingIndicator
4849
import com.ninecraft.booket.feature.record.R
50+
import com.ninecraft.booket.feature.record.component.CustomTooltipBox
4951
import com.ninecraft.booket.feature.record.component.ImpressionGuideBottomSheet
5052
import com.ninecraft.booket.feature.record.register.RecordRegisterUiEvent
5153
import com.ninecraft.booket.feature.record.register.RecordRegisterUiState
@@ -121,21 +123,32 @@ fun ImpressionStep(
121123
),
122124
)
123125
Spacer(modifier = Modifier.height(ReedTheme.spacing.spacing3))
124-
ReedButton(
125-
onClick = {
126-
state.eventSink(RecordRegisterUiEvent.OnImpressionGuideButtonClick)
127-
},
128-
colorStyle = ReedButtonColorStyle.STROKE,
129-
sizeStyle = smallRoundedButtonStyle,
130-
modifier = Modifier.align(Alignment.End),
131-
text = stringResource(R.string.impression_step_guide),
132-
leadingIcon = {
133-
Icon(
134-
imageVector = ImageVector.vectorResource(designR.drawable.ic_book_open),
135-
contentDescription = "Impression Guide Icon",
126+
Row(
127+
modifier = Modifier.fillMaxWidth(),
128+
horizontalArrangement = Arrangement.End,
129+
verticalAlignment = Alignment.CenterVertically,
130+
) {
131+
if (state.isImpressionGuideTooltipVisible) {
132+
CustomTooltipBox(
133+
messageResId = R.string.impression_guide_tooltip_message,
136134
)
137-
},
138-
)
135+
}
136+
137+
ReedButton(
138+
onClick = {
139+
state.eventSink(RecordRegisterUiEvent.OnImpressionGuideButtonClick)
140+
},
141+
colorStyle = ReedButtonColorStyle.STROKE,
142+
sizeStyle = smallRoundedButtonStyle,
143+
text = stringResource(R.string.impression_step_guide),
144+
leadingIcon = {
145+
Icon(
146+
imageVector = ImageVector.vectorResource(designR.drawable.ic_book_open),
147+
contentDescription = "Impression Guide Icon",
148+
)
149+
},
150+
)
151+
}
139152
}
140153

141154
ReedButton(

feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/step/QuoteStep.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import com.ninecraft.booket.core.designsystem.component.textfield.digitOnlyInput
4545
import com.ninecraft.booket.core.designsystem.theme.ReedTheme
4646
import com.ninecraft.booket.core.designsystem.theme.White
4747
import com.ninecraft.booket.feature.record.R
48+
import com.ninecraft.booket.feature.record.component.CustomTooltipBox
4849
import com.ninecraft.booket.feature.record.register.RecordRegisterUiEvent
4950
import com.ninecraft.booket.feature.record.register.RecordRegisterUiState
5051
import tech.thdev.compose.extensions.keyboard.state.foundation.rememberKeyboardVisible
@@ -134,7 +135,12 @@ internal fun QuoteStep(
134135
Row(
135136
modifier = Modifier.fillMaxWidth(),
136137
horizontalArrangement = Arrangement.End,
138+
verticalAlignment = Alignment.CenterVertically,
137139
) {
140+
if (state.isScanTooltipVisible) {
141+
CustomTooltipBox(messageResId = R.string.scan_tooltip_message)
142+
}
143+
138144
ReedButton(
139145
onClick = {
140146
state.eventSink(RecordRegisterUiEvent.OnSentenceScanButtonClick)

feature/record/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,6 @@
3838
<string name="record_saved_dialog_move_to_detail">기록 보러가기</string>
3939
<string name="record_saved_dialog_close">닫기</string>
4040
<string name="quote_step_page_input_error">해당 책의 마지막 페이지 수를 초과했습니다</string>
41+
<string name="impression_guide_tooltip_message">예시 문장을 알려드려요</string>
42+
<string name="scan_tooltip_message">스캔으로 빠르게 입력해요</string>
4143
</resources>

0 commit comments

Comments
 (0)