From 5066dfe01b0bd696938204bac22e425acc69a8a8 Mon Sep 17 00:00:00 2001 From: ckals413 Date: Sun, 3 May 2026 21:40:03 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=EC=A0=80=EC=9E=A5=20=EC=9E=91?= =?UTF-8?q?=ED=92=88=20=ED=99=94=EB=A9=B4=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../profile/SavedContentScreen.kt | 195 ++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 app/src/main/java/com/flint/presentation/profile/SavedContentScreen.kt diff --git a/app/src/main/java/com/flint/presentation/profile/SavedContentScreen.kt b/app/src/main/java/com/flint/presentation/profile/SavedContentScreen.kt new file mode 100644 index 00000000..5b657843 --- /dev/null +++ b/app/src/main/java/com/flint/presentation/profile/SavedContentScreen.kt @@ -0,0 +1,195 @@ +package com.flint.presentation.profile + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +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.Modifier +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.flint.core.designsystem.component.textfield.FlintSearchTextField +import com.flint.core.designsystem.component.topappbar.FlintBackTopAppbar +import com.flint.core.designsystem.theme.FlintTheme +import com.flint.domain.model.content.BookmarkedContentItemModel +import com.flint.domain.model.content.BookmarkedContentListModel +import com.flint.domain.type.OttType +import com.flint.presentation.profile.component.CollectionCreateContentBookmark +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf + +@Composable +fun SavedContentRoute( + paddingValues: PaddingValues, + navigateUp: () -> Unit, +) { + // TODO: ViewModel 연결 후 실제 데이터로 교체 + val contents = remember { SavedContentPreviewData.FakeList } + + SavedContentScreen( + contents = contents, + navigateUp = navigateUp, + modifier = Modifier.padding(paddingValues), + ) +} + +@Composable +fun SavedContentScreen( + contents: ImmutableList, + navigateUp: () -> Unit, + modifier: Modifier = Modifier, +) { + val keyboardController = LocalSoftwareKeyboardController.current + var searchKeyword by remember { mutableStateOf("") } + + Column( + modifier = modifier + .fillMaxSize() + .background(color = FlintTheme.colors.background), + ) { + FlintBackTopAppbar( + onClick = navigateUp, + title = "저장 작품", + ) + + Spacer(modifier = Modifier.height(12.dp)) + + FlintSearchTextField( + value = searchKeyword, + onValueChanged = { searchKeyword = it }, + placeholder = "작품을 검색해보세요", + modifier = Modifier.padding(horizontal = 16.dp), + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search), + keyboardActions = KeyboardActions( + onSearch = { + keyboardController?.hide() + }, + ), + ) + + Spacer(modifier = Modifier.height(16.dp)) + + Text( + text = "총 ${contents.size}개", + modifier = Modifier.padding(horizontal = 16.dp), + color = FlintTheme.colors.white, + style = FlintTheme.typography.body1M16, + ) + + Spacer(modifier = Modifier.height(10.dp)) + + LazyColumn( + modifier = Modifier.fillMaxSize(), + ) { + items( + items = contents, + key = { it.id }, + ) { content -> + CollectionCreateContentBookmark( + onBookmarkClick = {}, + onMoreClick = {}, + isBookmarked = true, + bookmarkCount = 123, + imageUrl = content.imageUrl, + title = content.title, + director = "감독이름", + createdYear = content.year, + ottList = content.getOttSimpleList, + ) + } + } + } +} + +private object SavedContentPreviewData { + val FakeList: ImmutableList = persistentListOf( + BookmarkedContentItemModel( + id = "0", + title = "은하수를 여행하는 히치하이커를 위한 안내서", + year = 2005, + imageUrl = "", + getOttSimpleList = listOf( + OttType.Netflix, + OttType.Disney, + OttType.Tving, + ), + ), + BookmarkedContentItemModel( + id = "1", + title = "해리포터와 불의잔", + year = 2005, + imageUrl = "", + getOttSimpleList = listOf( + OttType.Netflix, + OttType.CoupangPlay + ), + ), + BookmarkedContentItemModel( + id = "2", + title = "해리포터와 불의잔", + year = 2005, + imageUrl = "", + getOttSimpleList = listOf(OttType.Netflix), + ), + BookmarkedContentItemModel( + id = "3", + title = "해리포터와 불의잔", + year = 2005, + imageUrl = "", + getOttSimpleList = listOf(OttType.Netflix), + ), + BookmarkedContentItemModel( + id = "4", + title = "해리포터와 불의잔", + year = 2005, + imageUrl = "", + getOttSimpleList = listOf(OttType.Netflix), + ), + BookmarkedContentItemModel( + id = "5", + title = "해리포터와 불의잔", + year = 2005, + imageUrl = "", + getOttSimpleList = listOf(OttType.Netflix), + ), + BookmarkedContentItemModel( + id = "6", + title = "해리포터와 불의잔", + year = 2005, + imageUrl = "", + getOttSimpleList = listOf(OttType.Netflix), + ), + BookmarkedContentItemModel( + id = "7", + title = "해리포터와 불의잔", + year = 2005, + imageUrl = "", + getOttSimpleList = listOf(OttType.Netflix), + ), + ) +} + +@Preview(showBackground = true) +@Composable +private fun SavedContentScreenPreview() { + FlintTheme { + SavedContentScreen( + contents = SavedContentPreviewData.FakeList, + navigateUp = {}, + ) + } +} From 3746161780ff989d607234d7d02e2e52c93682eb Mon Sep 17 00:00:00 2001 From: ckals413 Date: Sat, 9 May 2026 14:47:05 +0900 Subject: [PATCH 2/5] =?UTF-8?q?style:=20=EC=BB=AC=EB=A0=89=EC=85=98=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B6=81=EB=A7=88=ED=81=AC=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=ED=85=9C=EC=9D=98=20=EC=97=B0=EB=8F=84=20=ED=85=8D?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../profile/component/CollectionCreateContentBookmark.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/flint/presentation/profile/component/CollectionCreateContentBookmark.kt b/app/src/main/java/com/flint/presentation/profile/component/CollectionCreateContentBookmark.kt index d3affeca..ac96f0a6 100644 --- a/app/src/main/java/com/flint/presentation/profile/component/CollectionCreateContentBookmark.kt +++ b/app/src/main/java/com/flint/presentation/profile/component/CollectionCreateContentBookmark.kt @@ -141,7 +141,7 @@ private fun CollectionCreateContentBookmarkInfo( text = createdYear.toString(), modifier = Modifier.fillMaxWidth(), color = FlintTheme.colors.gray300, - style = FlintTheme.typography.body1R16, + style = FlintTheme.typography.caption1M12, ) Spacer(modifier = Modifier.weight(1f)) From c1be2adcde42750f6b8258bdc0b83f87b65e5b9c Mon Sep 17 00:00:00 2001 From: ckals413 Date: Sat, 9 May 2026 14:47:47 +0900 Subject: [PATCH 3/5] =?UTF-8?q?feat:=20=EC=A0=80=EC=9E=A5=ED=95=9C=20?= =?UTF-8?q?=EC=9E=91=ED=92=88=20=ED=99=94=EB=A9=B4,=20ViewModel=20?= =?UTF-8?q?=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../profile/SavedContentScreen.kt | 221 +++++++++++++++--- .../profile/SavedContentViewModel.kt | 82 +++++++ .../profile/uistate/SavedContentUiState.kt | 51 ++++ 3 files changed, 317 insertions(+), 37 deletions(-) create mode 100644 app/src/main/java/com/flint/presentation/profile/SavedContentViewModel.kt create mode 100644 app/src/main/java/com/flint/presentation/profile/uistate/SavedContentUiState.kt diff --git a/app/src/main/java/com/flint/presentation/profile/SavedContentScreen.kt b/app/src/main/java/com/flint/presentation/profile/SavedContentScreen.kt index 5b657843..91f95f64 100644 --- a/app/src/main/java/com/flint/presentation/profile/SavedContentScreen.kt +++ b/app/src/main/java/com/flint/presentation/profile/SavedContentScreen.kt @@ -1,6 +1,7 @@ package com.flint.presentation.profile import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer @@ -14,21 +15,27 @@ import androidx.compose.foundation.text.KeyboardOptions 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.platform.LocalSoftwareKeyboardController import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.flint.R +import com.flint.core.common.util.UiState +import com.flint.core.designsystem.component.indicator.FlintLoadingIndicator +import com.flint.core.designsystem.component.modal.OneButtonModal import com.flint.core.designsystem.component.textfield.FlintSearchTextField import com.flint.core.designsystem.component.topappbar.FlintBackTopAppbar +import com.flint.core.designsystem.component.view.FlintSearchEmptyView import com.flint.core.designsystem.theme.FlintTheme import com.flint.domain.model.content.BookmarkedContentItemModel import com.flint.domain.model.content.BookmarkedContentListModel import com.flint.domain.type.OttType import com.flint.presentation.profile.component.CollectionCreateContentBookmark +import com.flint.presentation.profile.uistate.SavedContentUiState import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf @@ -36,25 +43,32 @@ import kotlinx.collections.immutable.persistentListOf fun SavedContentRoute( paddingValues: PaddingValues, navigateUp: () -> Unit, + viewModel: SavedContentViewModel = hiltViewModel(), ) { - // TODO: ViewModel 연결 후 실제 데이터로 교체 - val contents = remember { SavedContentPreviewData.FakeList } + val uiState by viewModel.uiState.collectAsStateWithLifecycle() SavedContentScreen( - contents = contents, + uiState = uiState, navigateUp = navigateUp, + onSearchKeywordChanged = viewModel::updateSearchKeyword, + onClearSearch = viewModel::clearSearchKeyword, + onBookmarkClick = viewModel::toggleBookmark, + onDismissRestrictionModal = viewModel::dismissBookmarkRestrictionModal, modifier = Modifier.padding(paddingValues), ) } @Composable fun SavedContentScreen( - contents: ImmutableList, + uiState: SavedContentUiState, navigateUp: () -> Unit, + onSearchKeywordChanged: (String) -> Unit, + onClearSearch: () -> Unit, + onBookmarkClick: (contentId: String) -> Unit, + onDismissRestrictionModal: () -> Unit, modifier: Modifier = Modifier, ) { val keyboardController = LocalSoftwareKeyboardController.current - var searchKeyword by remember { mutableStateOf("") } Column( modifier = modifier @@ -69,8 +83,8 @@ fun SavedContentScreen( Spacer(modifier = Modifier.height(12.dp)) FlintSearchTextField( - value = searchKeyword, - onValueChanged = { searchKeyword = it }, + value = uiState.searchKeyword, + onValueChanged = onSearchKeywordChanged, placeholder = "작품을 검색해보세요", modifier = Modifier.padding(horizontal = 16.dp), keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search), @@ -79,40 +93,115 @@ fun SavedContentScreen( keyboardController?.hide() }, ), + onClearAction = onClearSearch, ) - Spacer(modifier = Modifier.height(16.dp)) + // "총 n개"는 실제 데이터가 있는 Success 상태에서만 노출 + if (uiState.contents is UiState.Success) { + Spacer(modifier = Modifier.height(16.dp)) - Text( - text = "총 ${contents.size}개", - modifier = Modifier.padding(horizontal = 16.dp), - color = FlintTheme.colors.white, - style = FlintTheme.typography.body1M16, - ) + Text( + text = "총 ${uiState.totalCount}개", + modifier = Modifier.padding(horizontal = 16.dp), + color = FlintTheme.colors.gray100, + style = FlintTheme.typography.body2R14, + ) - Spacer(modifier = Modifier.height(10.dp)) + Spacer(modifier = Modifier.height(10.dp)) + } - LazyColumn( - modifier = Modifier.fillMaxSize(), - ) { - items( - items = contents, - key = { it.id }, - ) { content -> - CollectionCreateContentBookmark( - onBookmarkClick = {}, - onMoreClick = {}, - isBookmarked = true, - bookmarkCount = 123, - imageUrl = content.imageUrl, - title = content.title, - director = "감독이름", - createdYear = content.year, - ottList = content.getOttSimpleList, - ) + when (uiState.contents) { + is UiState.Loading -> { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center, + ) { + FlintLoadingIndicator() + } + } + is UiState.Success -> { + if (uiState.filteredContents.isEmpty()) { + // 검색 결과가 없을 때 + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center, + ) { + FlintSearchEmptyView( + title = "작품을 찾을 수 없어요", + ) + } + } else { + SavedContentList( + contents = uiState.filteredContents, + onBookmarkClick = onBookmarkClick, + ) + } + } + is UiState.Empty, + is UiState.Failure -> { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center, + ) { + FlintSearchEmptyView( + title = "작품을 찾을 수 없어요", + ) + } } } } + + // 저장 취소 제한 안내 모달 (저장 작품이 5개일 때 북마크 토글 시 노출) + if (uiState.showBookmarkRestrictionModal) { + OneButtonModal( + title = "작품 저장을 취소할 수 없어요", + message = "취향 키워드 분석을 위해\n최소 5개의 작품을 저장해주세요", + buttonText = "확인", + onConfirm = onDismissRestrictionModal, + onDismiss = onDismissRestrictionModal, + icon = R.drawable.ic_gradient_bookmark, + ) + } +} + +@Composable +private fun SavedContentList( + contents: ImmutableList, + onBookmarkClick: (contentId: String) -> Unit, + modifier: Modifier = Modifier, +) { + if (contents.isEmpty()) { + Box( + modifier = modifier.fillMaxSize(), + contentAlignment = Alignment.Center, + ) { + FlintSearchEmptyView( + title = "작품을 찾을 수 없어요", + ) + } + return + } + + LazyColumn( + modifier = modifier.fillMaxSize(), + ) { + items( + items = contents, + key = { it.id }, + ) { content -> + CollectionCreateContentBookmark( + onBookmarkClick = { onBookmarkClick(content.id) }, + onMoreClick = {}, + isBookmarked = true, + bookmarkCount = 123, + imageUrl = content.imageUrl, + title = content.title, + director = "감독이름", + createdYear = content.year, + ottList = content.getOttSimpleList, + ) + } + } } private object SavedContentPreviewData { @@ -188,8 +277,66 @@ private object SavedContentPreviewData { private fun SavedContentScreenPreview() { FlintTheme { SavedContentScreen( - contents = SavedContentPreviewData.FakeList, + uiState = SavedContentUiState( + contents = UiState.Success( + BookmarkedContentListModel(contents = SavedContentPreviewData.FakeList), + ), + ), + navigateUp = {}, + onSearchKeywordChanged = {}, + onClearSearch = {}, + onBookmarkClick = {}, + onDismissRestrictionModal = {}, + ) + } +} + +@Preview(showBackground = true, name = "Empty") +@Composable +private fun SavedContentScreenEmptyPreview() { + FlintTheme { + SavedContentScreen( + uiState = SavedContentUiState(contents = UiState.Empty), + navigateUp = {}, + onSearchKeywordChanged = {}, + onClearSearch = {}, + onBookmarkClick = {}, + onDismissRestrictionModal = {}, + ) + } +} + +@Preview(showBackground = true, name = "Loading") +@Composable +private fun SavedContentScreenLoadingPreview() { + FlintTheme { + SavedContentScreen( + uiState = SavedContentUiState(contents = UiState.Loading), + navigateUp = {}, + onSearchKeywordChanged = {}, + onClearSearch = {}, + onBookmarkClick = {}, + onDismissRestrictionModal = {}, + ) + } +} + +@Preview(showBackground = true, name = "Restriction Modal") +@Composable +private fun SavedContentScreenRestrictionModalPreview() { + FlintTheme { + SavedContentScreen( + uiState = SavedContentUiState( + contents = UiState.Success( + BookmarkedContentListModel(contents = SavedContentPreviewData.FakeList), + ), + showBookmarkRestrictionModal = true, + ), navigateUp = {}, + onSearchKeywordChanged = {}, + onClearSearch = {}, + onBookmarkClick = {}, + onDismissRestrictionModal = {}, ) } } diff --git a/app/src/main/java/com/flint/presentation/profile/SavedContentViewModel.kt b/app/src/main/java/com/flint/presentation/profile/SavedContentViewModel.kt new file mode 100644 index 00000000..52813265 --- /dev/null +++ b/app/src/main/java/com/flint/presentation/profile/SavedContentViewModel.kt @@ -0,0 +1,82 @@ +package com.flint.presentation.profile + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.flint.core.common.util.UiState +import com.flint.domain.repository.ContentRepository +import com.flint.presentation.profile.uistate.SavedContentUiState +import com.flint.presentation.profile.uistate.SavedContentUiState.Companion.MIN_REQUIRED_COUNT +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + +@HiltViewModel +class SavedContentViewModel @Inject constructor( + private val contentRepository: ContentRepository, +) : ViewModel() { + + private val _uiState = MutableStateFlow(SavedContentUiState()) + val uiState: StateFlow = _uiState.asStateFlow() + + init { + loadBookmarkedContents() + } + + + // 사용자 저장한 작품 목록 호출 + fun loadBookmarkedContents() { + viewModelScope.launch { + _uiState.update { it.copy(contents = UiState.Loading) } + + contentRepository.getBookmarkedContentList() + .onSuccess { list -> + _uiState.update { + it.copy( + contents = if (list.contents.isEmpty()) { + UiState.Empty + } else { + UiState.Success(list) + }, + ) + } + } + .onFailure { throwable -> + _uiState.update { it.copy(contents = UiState.Failure) } + Timber.e(throwable) + } + } + } + + + fun updateSearchKeyword(keyword: String) { + _uiState.update { it.copy(searchKeyword = keyword) } + } + + // 검색어 초기화 + fun clearSearchKeyword() { + _uiState.update { it.copy(searchKeyword = "") } + } + + + // 북마크 토글 (저장 취소) + // 저장된 작품이 MIN_REQUIRED_COUNT(5)개일 때는 취소를 막고 안내 모달을 노출한다. + fun toggleBookmark(contentId: String) { + val currentCount = uiState.value.totalCount + if (currentCount <= MIN_REQUIRED_COUNT) { + _uiState.update { it.copy(showBookmarkRestrictionModal = true) } + return + } + // TODO: 북마크 토글 API 연동 + Timber.d("toggleBookmark: $contentId") + } + + // 저장 취소 제한 안내 모달 닫기 + fun dismissBookmarkRestrictionModal() { + _uiState.update { it.copy(showBookmarkRestrictionModal = false) } + } +} diff --git a/app/src/main/java/com/flint/presentation/profile/uistate/SavedContentUiState.kt b/app/src/main/java/com/flint/presentation/profile/uistate/SavedContentUiState.kt new file mode 100644 index 00000000..03c435a7 --- /dev/null +++ b/app/src/main/java/com/flint/presentation/profile/uistate/SavedContentUiState.kt @@ -0,0 +1,51 @@ +package com.flint.presentation.profile.uistate + +import androidx.compose.runtime.Immutable +import com.flint.core.common.util.UiState +import com.flint.domain.model.content.BookmarkedContentItemModel +import com.flint.domain.model.content.BookmarkedContentListModel +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toPersistentList + +@Immutable +data class SavedContentUiState( + val searchKeyword: String = "", + val contents: UiState = UiState.Loading, + val showBookmarkRestrictionModal: Boolean = false, +) { + /** + * 검색어로 필터링된 콘텐츠 목록 + * 검색어가 비어있으면 전체 목록을 반환 + */ + val filteredContents: ImmutableList + get() { + val all = (contents as? UiState.Success)?.data?.contents ?: persistentListOf() + return if (searchKeyword.isBlank()) { + all + } else { + all.filter { it.title.contains(searchKeyword.trim(), ignoreCase = true) } + .toPersistentList() + } + } + + /** + * 화면 상단 "총 n개"에 사용할 카운트 (전체 저장 작품 수). + */ + val totalCount: Int + get() = (contents as? UiState.Success)?.data?.contents?.size ?: 0 + + companion object { + /** + * 취향 키워드 분석을 위해 최소 유지해야 하는 저장 작품 수. + * 저장 작품이 이 값과 같을 때 북마크 취소를 시도하면 안내 모달을 노출한다. + */ + const val MIN_REQUIRED_COUNT = 5 + + val Empty = SavedContentUiState() + + val Fake = SavedContentUiState( + contents = UiState.Success(BookmarkedContentListModel.FakeList), + ) + } +} From 7fd509b6b80550bbfb3ef1845f37e69e6353c19c Mon Sep 17 00:00:00 2001 From: ckals413 Date: Tue, 12 May 2026 15:45:44 +0900 Subject: [PATCH 4/5] =?UTF-8?q?fix:=20=EC=BB=AC=EB=A0=89=EC=85=98=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B6=81=EB=A7=88=ED=81=AC=20=EB=82=B4=20?= =?UTF-8?q?=EB=9D=BC=EC=9D=B4=ED=8C=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../profile/component/CollectionCreateContentBookmark.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/flint/presentation/profile/component/CollectionCreateContentBookmark.kt b/app/src/main/java/com/flint/presentation/profile/component/CollectionCreateContentBookmark.kt index ac96f0a6..b681a12d 100644 --- a/app/src/main/java/com/flint/presentation/profile/component/CollectionCreateContentBookmark.kt +++ b/app/src/main/java/com/flint/presentation/profile/component/CollectionCreateContentBookmark.kt @@ -196,7 +196,7 @@ private fun CollectionCreateContentBookmarkMore( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = "작품 보러가기", + text = "시청 가능한 OTT", color = FlintTheme.colors.white, style = FlintTheme.typography.body2R14, ) From 07dd43cd000209e586c8047f1b652e872e600c87 Mon Sep 17 00:00:00 2001 From: ckals413 Date: Wed, 13 May 2026 21:05:04 +0900 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20=EC=A0=80=EC=9E=A5=20=EC=9E=91?= =?UTF-8?q?=ED=92=88=20=EC=B5=9C=EC=86=8C=20=EA=B0=9C=EC=88=98=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=EC=97=90=20=EC=83=81=EC=88=98=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/flint/presentation/profile/SavedContentScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/flint/presentation/profile/SavedContentScreen.kt b/app/src/main/java/com/flint/presentation/profile/SavedContentScreen.kt index 91f95f64..9a10de52 100644 --- a/app/src/main/java/com/flint/presentation/profile/SavedContentScreen.kt +++ b/app/src/main/java/com/flint/presentation/profile/SavedContentScreen.kt @@ -155,7 +155,7 @@ fun SavedContentScreen( if (uiState.showBookmarkRestrictionModal) { OneButtonModal( title = "작품 저장을 취소할 수 없어요", - message = "취향 키워드 분석을 위해\n최소 5개의 작품을 저장해주세요", + message = "취향 키워드 분석을 위해\n최소 ${SavedContentUiState.MIN_REQUIRED_COUNT}개의 작품을 저장해주세요", buttonText = "확인", onConfirm = onDismissRestrictionModal, onDismiss = onDismissRestrictionModal,