From 7433082d1d2b770ff8d0e786fcd73294a1380854 Mon Sep 17 00:00:00 2001 From: Docile-Alligator <25734209+Docile-Alligator@users.noreply.github.com> Date: Sun, 30 Nov 2025 22:47:50 -0500 Subject: [PATCH] Continue implementing copying multireddits. --- .../activities/CopyMultiRedditActivity.kt | 31 ++++++---------- .../customviews/compose/CustomTextField.kt | 35 +++++++++++++++++-- .../CopyMultiRedditActivityViewModel.kt | 30 +++++++++++++--- 3 files changed, 69 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CopyMultiRedditActivity.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CopyMultiRedditActivity.kt index f1c6f3ae..a3cbe32a 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CopyMultiRedditActivity.kt +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/CopyMultiRedditActivity.kt @@ -24,8 +24,6 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items -import androidx.compose.foundation.text.input.rememberTextFieldState -import androidx.compose.foundation.text.input.setTextAndPlaceCursorAtEnd import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.IconButton import androidx.compose.material3.Scaffold @@ -130,22 +128,14 @@ class CopyMultiRedditActivity : BaseActivity() { val scrollBehavior = enterAlwaysScrollBehavior() val multiRedditState by copyMultiRedditActivityViewModel.multiRedditState.collectAsStateWithLifecycle() val copyMultiRedditState by copyMultiRedditActivityViewModel.copyMultiRedditState.collectAsStateWithLifecycle() - val name = rememberTextFieldState() - val description = rememberTextFieldState() + val name by copyMultiRedditActivityViewModel.name.collectAsStateWithLifecycle() + val description by copyMultiRedditActivityViewModel.description.collectAsStateWithLifecycle() var isPrivate by remember { mutableStateOf(true) } val scope = rememberCoroutineScope() val snackbarHostState = remember { SnackbarHostState() } val copyingMultiRedditMessage = stringResource(R.string.copying_multi_reddit) - LaunchedEffect(multiRedditState) { - if (multiRedditState is DataLoadState.Success) { - val multiReddit = (multiRedditState as DataLoadState.Success).data - name.setTextAndPlaceCursorAtEnd(multiReddit.name) - description.setTextAndPlaceCursorAtEnd(multiReddit.description) - } - } - LaunchedEffect(copyMultiRedditState) { when (copyMultiRedditState) { is ActionState.Error -> { @@ -178,10 +168,7 @@ class CopyMultiRedditActivity : BaseActivity() { actions = { IconButton(onClick = { if (multiRedditState is DataLoadState.Success) { - copyMultiRedditActivityViewModel.copyMultiRedditInfo( - name.text.toString(), - description.text.toString() - ) + copyMultiRedditActivityViewModel.copyMultiRedditInfo() } }) { ToolbarIcon( @@ -254,9 +241,11 @@ class CopyMultiRedditActivity : BaseActivity() { .fillMaxWidth() .padding(horizontal = 16.dp) .padding(top = 16.dp, bottom = 8.dp), - state = name, + value = name, placeholder = stringResource(R.string.multi_reddit_name_hint) - ) + ) { + copyMultiRedditActivityViewModel.setName(it) + } } item { @@ -265,9 +254,11 @@ class CopyMultiRedditActivity : BaseActivity() { .fillMaxWidth() .padding(horizontal = 16.dp) .padding(top = 8.dp, bottom = 8.dp), - state = description, + value = description, placeholder = stringResource(R.string.multi_reddit_description_hint) - ) + ) { + copyMultiRedditActivityViewModel.setDescription(it) + } } item { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/customviews/compose/CustomTextField.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/customviews/compose/CustomTextField.kt index 272c9fac..48108c0f 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/customviews/compose/CustomTextField.kt +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/customviews/compose/CustomTextField.kt @@ -1,7 +1,5 @@ package ml.docilealligator.infinityforreddit.customviews.compose -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.text.input.TextFieldLineLimits import androidx.compose.foundation.text.input.TextFieldState import androidx.compose.material3.OutlinedTextField @@ -36,4 +34,37 @@ fun CustomTextField( cursorColor = Color(LocalAppTheme.current.colorPrimary) ) ) +} + +@Composable +fun CustomTextField( + modifier: Modifier = Modifier, + value: String, + placeholder: String, + singleLine: Boolean = false, + maxLines: Int = if (singleLine) 1 else Int.MAX_VALUE, + minLines: Int = 1, + onValueChange: (String) -> Unit +) { + OutlinedTextField( + value = value, + modifier = modifier, + placeholder = { + Text( + text = placeholder, + color = Color(LocalAppTheme.current.secondaryTextColor) + ) + }, + singleLine = singleLine, + maxLines = maxLines, + minLines = minLines, + colors = OutlinedTextFieldDefaults.colors( + focusedTextColor = Color(LocalAppTheme.current.primaryTextColor), + unfocusedTextColor = Color(LocalAppTheme.current.primaryTextColor), + focusedBorderColor = Color(LocalAppTheme.current.primaryTextColor), + unfocusedBorderColor = Color(LocalAppTheme.current.secondaryTextColor), + cursorColor = Color(LocalAppTheme.current.colorPrimary) + ), + onValueChange = onValueChange + ) } \ No newline at end of file diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/viewmodels/CopyMultiRedditActivityViewModel.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/viewmodels/CopyMultiRedditActivityViewModel.kt index 0ec834e9..87d92bf0 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/viewmodels/CopyMultiRedditActivityViewModel.kt +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/viewmodels/CopyMultiRedditActivityViewModel.kt @@ -1,6 +1,5 @@ package ml.docilealligator.infinityforreddit.viewmodels -import android.app.Notification import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope @@ -14,29 +13,50 @@ import ml.docilealligator.infinityforreddit.ActionState import ml.docilealligator.infinityforreddit.DataLoadState import ml.docilealligator.infinityforreddit.multireddit.MultiReddit import ml.docilealligator.infinityforreddit.repositories.CopyMultiRedditActivityRepository -import ml.docilealligator.infinityforreddit.repositories.EditCommentActivityRepository class CopyMultiRedditActivityViewModel( val multipath: String, val copyMultiRedditActivityRepository: CopyMultiRedditActivityRepository ): ViewModel() { + private val _name = MutableStateFlow("") + val name = _name.asStateFlow() + + private val _description = MutableStateFlow("") + val description = _description.asStateFlow() + private val _multiRedditState = MutableStateFlow>(DataLoadState.Loading) val multiRedditState: StateFlow> = _multiRedditState.asStateFlow() private val _copyMultiRedditState = MutableStateFlow(ActionState.Idle) val copyMultiRedditState: StateFlow = _copyMultiRedditState.asStateFlow() + fun setName(name: String) { + _name.value = name + } + + fun setDescription(description: String) { + _description.value = description + } + fun fetchMultiRedditInfo() { + if (_multiRedditState.value is DataLoadState.Success) { + return + } + + _multiRedditState.value = DataLoadState.Loading + viewModelScope.launch { - _multiRedditState.value = DataLoadState.Loading val multiReddit = copyMultiRedditActivityRepository.fetchMultiRedditInfo(multipath) _multiRedditState.value = multiReddit?.let { + _name.value = it.name + _description.value = it.description + DataLoadState.Success(it) } ?: DataLoadState.Error("Failed to load multiReddit") } } - fun copyMultiRedditInfo(name: String, description: String) { + fun copyMultiRedditInfo() { if (_copyMultiRedditState.value == ActionState.Running) { return } @@ -44,7 +64,7 @@ class CopyMultiRedditActivityViewModel( _copyMultiRedditState.value = ActionState.Running viewModelScope.launch { - when (val result = copyMultiRedditActivityRepository.copyMultiReddit(multipath, name, description)) { + when (val result = copyMultiRedditActivityRepository.copyMultiReddit(multipath, _name.value, _description.value)) { is APIResult.Success -> { _copyMultiRedditState.value = ActionState.Success(result.data) }