Continue implementing copying multireddits.

This commit is contained in:
Docile-Alligator
2025-11-30 22:47:50 -05:00
parent 471abcf80c
commit 7433082d1d
3 changed files with 69 additions and 27 deletions

View File

@ -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 {

View File

@ -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
)
}

View File

@ -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<MultiReddit>>(DataLoadState.Loading)
val multiRedditState: StateFlow<DataLoadState<MultiReddit>> = _multiRedditState.asStateFlow()
private val _copyMultiRedditState = MutableStateFlow<ActionState>(ActionState.Idle)
val copyMultiRedditState: StateFlow<ActionState> = _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)
}