Skip to content

Commit

Permalink
Rework edit feed (#844)
Browse files Browse the repository at this point in the history
  • Loading branch information
jocmp authored Feb 11, 2025
1 parent fef36bd commit 88b83a5
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 86 deletions.
46 changes: 27 additions & 19 deletions app/src/main/java/com/capyreader/app/ui/articles/EditFeedDialog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,40 +2,48 @@ package com.capyreader.app.ui.articles

import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.window.Dialog
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.capyreader.app.ui.components.DialogCard
import com.jocmp.capy.EditFeedFormEntry
import com.jocmp.capy.Feed
import kotlinx.coroutines.launch
import org.koin.androidx.compose.koinViewModel
import java.util.UUID

@Composable
fun EditFeedDialog(
feed: Feed,
isOpen: Boolean,
form: EditFeedViewModel = koinViewModel(),
onSubmit: () -> Unit,
onSuccess: () -> Unit,
onFailure: () -> Unit,
onCancel: () -> Unit
onDismiss: () -> Unit
) {
val allFolders by form.folders.collectAsStateWithLifecycle(emptyList())
val folders = remember(UUID.randomUUID()) {
allFolders
}
val submit = { entry: EditFeedFormEntry ->
form.submit(entry, onSubmit, onFailure)
val folders by form.folders.collectAsStateWithLifecycle(emptyList())
val coroutineScope = rememberCoroutineScope()

fun submit(entry: EditFeedFormEntry) {
coroutineScope.launch {
onDismiss()

form.submit(entry)
.onSuccess { onSuccess() }
.onFailure { onFailure() }
}
}

Dialog(onDismissRequest = onCancel) {
DialogCard {
EditFeedView(
feed = feed,
folders = folders,
showMultiselect = form.showMultiselect,
onSubmit = submit,
onCancel = onCancel
)
if (isOpen) {
Dialog(onDismissRequest = onDismiss) {
DialogCard {
EditFeedView(
feed = feed,
folders = folders,
showMultiselect = form.showMultiselect,
onSubmit = ::submit,
onCancel = onDismiss
)
}
}
}
}
78 changes: 45 additions & 33 deletions app/src/main/java/com/capyreader/app/ui/articles/EditFeedView.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.capyreader.app.ui.articles

import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
Expand All @@ -10,11 +11,15 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Add
import androidx.compose.material3.Card
import androidx.compose.material3.Checkbox
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExposedDropdownMenuBox
import androidx.compose.material3.ExposedDropdownMenuDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.MenuAnchorType.Companion.PrimaryNotEditable
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
Expand All @@ -34,7 +39,6 @@ import com.capyreader.app.R
import com.capyreader.app.common.RowItem
import com.capyreader.app.ui.components.DialogHorizontalDivider
import com.capyreader.app.ui.components.FormSection
import com.capyreader.app.ui.components.TextSwitch
import com.capyreader.app.ui.fixtures.FeedSample
import com.capyreader.app.ui.theme.CapyTheme
import com.jocmp.capy.EditFeedFormEntry
Expand Down Expand Up @@ -124,14 +128,12 @@ fun EditFeedView(
modifier = Modifier.padding(bottom = 16.dp),
title = stringResource(R.string.edit_feed_tags_section)
) {
RowItem {
FolderMultiselect(
addedFolder = addedFolder,
onUpdateAddedFolder = setAddedFolder,
folders = displaySwitchFolders,
switchFolders = switchFolders,
)
}
FolderMultiselect(
addedFolder = addedFolder,
onUpdateAddedFolder = setAddedFolder,
folders = displaySwitchFolders,
switchFolders = switchFolders,
)
}
} else {
Column(
Expand Down Expand Up @@ -214,32 +216,42 @@ private fun FolderMultiselect(
folders: SortedMap<String, Boolean>,
switchFolders: MutableMap<String, Boolean>,
) {
OutlinedTextField(
value = addedFolder,
onValueChange = onUpdateAddedFolder,
label = { Text(stringResource(id = R.string.add_feed_new_folder_title)) },
keyboardOptions = KeyboardOptions(
capitalization = KeyboardCapitalization.Words,
autoCorrectEnabled = false
),
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 8.dp)
)
RowItem {
OutlinedTextField(
value = addedFolder,
onValueChange = onUpdateAddedFolder,
label = { Text(stringResource(id = R.string.add_feed_new_folder_title)) },
keyboardOptions = KeyboardOptions(
capitalization = KeyboardCapitalization.Words,
autoCorrectEnabled = false
),
trailingIcon = { Icon(Icons.Rounded.Add, contentDescription = null) },
modifier = Modifier.fillMaxWidth()
)
}
Column {
folders.forEach { (folderTitle, checked) ->
TextSwitch(
onCheckedChange = { switchFolders[folderTitle] = it },
checked = checked,
title = {
Text(
text = folderTitle,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
modifier = Modifier.padding(end = 8.dp)
)
}
)
Row(
horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.fillMaxWidth()
.clickable {
switchFolders[folderTitle] = !checked
}
) {
Checkbox(
checked = checked,
onCheckedChange = { switchFolders[folderTitle] = it },
modifier = Modifier.padding(start = 8.dp)
)
Text(
text = folderTitle,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
modifier = Modifier.padding(end = 16.dp)
)
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.capyreader.app.ui.articles

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.capyreader.app.common.AppPreferences
import com.jocmp.capy.Account
import com.jocmp.capy.ArticleFilter
Expand All @@ -10,7 +9,6 @@ import com.jocmp.capy.Folder
import com.jocmp.capy.preferences.getAndSet
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

class EditFeedViewModel(
Expand All @@ -20,28 +18,32 @@ class EditFeedViewModel(
val folders: Flow<List<Folder>> = account.folders
val showMultiselect = account.supportsMultiFolderFeeds

fun submit(
suspend fun submit(
form: EditFeedFormEntry,
onSuccess: () -> Unit,
onFailure: () -> Unit
) {
viewModelScope.launch(Dispatchers.IO) {
): Result<Unit> {
return withContext(Dispatchers.IO) {
account
.editFeed(form = form)
.onSuccess { feed ->
appPreferences.filter.getAndSet { filter ->
if (filter.isFeedSelected(feed)) {
ArticleFilter.Feeds(feedID = feed.id, folderTitle = null, filter.status)
} else {
filter
.fold(
onSuccess = { feed ->
appPreferences.filter.getAndSet { filter ->
if (filter.isFeedSelected(feed)) {
ArticleFilter.Feeds(
feedID = feed.id,
folderTitle = null,
filter.status
)
} else {
filter
}
}
}

withContext(Dispatchers.Main) {
onSuccess()
Result.success(Unit)
},
onFailure = { error ->
Result.failure(error)
}
}
.onFailure { onFailure() }
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -84,22 +84,19 @@ fun FeedActions(
)
}

if (isEditDialogOpen) {
EditFeedDialog(
feed = feed,
onSubmit = {
setEditDialogOpen(false)
onFeedEdited()
},
onCancel = {
setEditDialogOpen(false)
},
onFailure = {
setEditDialogOpen(false)
onEditFailure(editErrorMessage)
}
)
}
EditFeedDialog(
isOpen = isEditDialogOpen,
feed = feed,
onSuccess = {
onFeedEdited()
},
onDismiss = {
setEditDialogOpen(false)
},
onFailure = {
onEditFailure(editErrorMessage)
}
)
}
}
}
Expand Down

0 comments on commit 88b83a5

Please sign in to comment.