diff --git a/app/build.gradle b/app/build.gradle index ba6967ee3..3ebe3966e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -110,6 +110,7 @@ dependencies { // optional - Paging 3 Integration implementation "androidx.room:room-paging:$room_version" + implementation "io.arrow-kt:arrow-core:1.0.1" implementation "androidx.compose.material:material-icons-extended:$compose_version" implementation 'org.ocpsoft.prettytime:prettytime:5.0.3.Final' implementation 'io.coil-kt:coil-compose:1.3.1' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8d4e75130..1f46d7860 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ + - @@ -38,6 +40,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/jerboa/MainActivity.kt b/app/src/main/java/com/jerboa/MainActivity.kt index 4e74190ed..8790ea49e 100644 --- a/app/src/main/java/com/jerboa/MainActivity.kt +++ b/app/src/main/java/com/jerboa/MainActivity.kt @@ -9,6 +9,7 @@ import android.util.Patterns import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.viewModels +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.platform.LocalContext import androidx.navigation.NavType import androidx.navigation.compose.NavHost @@ -16,6 +17,7 @@ import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument import androidx.navigation.navDeepLink +import arrow.core.Either import com.jerboa.db.AccountRepository import com.jerboa.db.AccountViewModel import com.jerboa.db.AccountViewModelFactory @@ -86,12 +88,18 @@ class MainActivity : ComponentActivity() { setContent { JerboaTheme { val navController = rememberNavController() + val ctx = LocalContext.current NavHost( navController = navController, startDestination = "splashScreen" ) { - composable(route = "login") { + composable( + route = "login", + deepLinks = DEFAULT_LEMMY_INSTANCES.map { instance -> + navDeepLink { uriPattern = "$instance/login" } + } + ) { LoginActivity( navController = navController, loginViewModel = loginViewModel, @@ -105,56 +113,163 @@ class MainActivity : ComponentActivity() { navController = navController ) } - composable(route = "home") { + composable( + route = "home", + deepLinks = DEFAULT_LEMMY_INSTANCES.map { instance -> + navDeepLink { uriPattern = instance } + } + ) { HomeActivity( navController = navController, homeViewModel = homeViewModel, - communityViewModel = communityViewModel, - personProfileViewModel = personProfileViewModel, - postViewModel = postViewModel, - inboxViewModel = inboxViewModel, accountViewModel = accountViewModel, siteViewModel = siteViewModel, + postEditViewModel = postEditViewModel + ) + } + composable( + route = "community/{id}", + arguments = listOf( + navArgument("id") { + type = NavType.IntType + } + ) + ) { + LaunchedEffect(Unit) { + val communityId = it.arguments?.getInt("id")!! + val idOrName = Either.Left(communityId) + + communityViewModel.fetchCommunity( + idOrName = idOrName, + auth = account?.jwt + ) + + communityViewModel.fetchPosts( + communityIdOrName = idOrName, + account = account, + clear = true, + ctx = ctx + ) + } + + CommunityActivity( + navController = navController, + communityViewModel = communityViewModel, + accountViewModel = accountViewModel, + homeViewModel = homeViewModel, postEditViewModel = postEditViewModel, - createReportViewModel = createReportViewModel + communityListViewModel = communityListViewModel ) } - composable(route = "community") { + // Only necessary for community deeplinks + composable( + route = "c/{name}", + deepLinks = DEFAULT_LEMMY_INSTANCES.map { instance -> + navDeepLink { uriPattern = "$instance/c/{name}" } + }, + arguments = listOf( + navArgument("name") { + type = NavType.StringType + } + ) + ) { + LaunchedEffect(Unit) { + val name = it.arguments?.getString("name")!! + val idOrName = Either.Right(name) + + communityViewModel.fetchCommunity( + idOrName = idOrName, + auth = account?.jwt + ) + + communityViewModel.fetchPosts( + communityIdOrName = idOrName, + account = account, + clear = true, + ctx = ctx + ) + } + CommunityActivity( navController = navController, communityViewModel = communityViewModel, - personProfileViewModel = personProfileViewModel, - postViewModel = postViewModel, accountViewModel = accountViewModel, homeViewModel = homeViewModel, - inboxViewModel = inboxViewModel, postEditViewModel = postEditViewModel, - createReportViewModel = createReportViewModel, communityListViewModel = communityListViewModel ) } composable( - route = "profile?saved={saved}", + route = "profile/{id}?saved={saved}", arguments = listOf( + navArgument("id") { + type = NavType.IntType + }, navArgument("saved") { defaultValue = false type = NavType.BoolType } ) ) { + val savedMode = it.arguments?.getBoolean("saved")!! + + LaunchedEffect(Unit) { + val personId = it.arguments?.getInt("id")!! + val idOrName = Either.Left(personId) + + personProfileViewModel.fetchPersonDetails( + idOrName = idOrName, + account = account, + clear = true, + ctx = ctx, + changeSavedOnly = savedMode + ) + } + PersonProfileActivity( - savedMode = it.arguments?.getBoolean("saved")!!, + savedMode = savedMode, navController = navController, personProfileViewModel = personProfileViewModel, - postViewModel = postViewModel, - communityViewModel = communityViewModel, accountViewModel = accountViewModel, homeViewModel = homeViewModel, - inboxViewModel = inboxViewModel, commentEditViewModel = commentEditViewModel, commentReplyViewModel = commentReplyViewModel, - postEditViewModel = postEditViewModel, - createReportViewModel = createReportViewModel + postEditViewModel = postEditViewModel + ) + } + // Necessary for deep links + composable( + route = "u/{name}", + deepLinks = DEFAULT_LEMMY_INSTANCES.map { instance -> + navDeepLink { uriPattern = "$instance/u/{name}" } + }, + arguments = listOf( + navArgument("name") { + type = NavType.StringType + } + ) + ) { + LaunchedEffect(Unit) { + val name = it.arguments?.getString("name")!! + val idOrName = Either.Right(name) + + personProfileViewModel.fetchPersonDetails( + idOrName = idOrName, + account = account, + clear = true, + ctx = ctx + ) + } + + PersonProfileActivity( + savedMode = false, + navController = navController, + personProfileViewModel = personProfileViewModel, + accountViewModel = accountViewModel, + homeViewModel = homeViewModel, + commentEditViewModel = commentEditViewModel, + commentReplyViewModel = commentReplyViewModel, + postEditViewModel = postEditViewModel ) } composable( @@ -172,7 +287,6 @@ class MainActivity : ComponentActivity() { CommunityListActivity( navController = navController, accountViewModel = accountViewModel, - communityViewModel = communityViewModel, communityListViewModel = communityListViewModel, selectMode = it.arguments?.getBoolean("select")!! ) @@ -184,8 +298,7 @@ class MainActivity : ComponentActivity() { navDeepLink { mimeType = "image/*" } ) ) { - val context = LocalContext.current - val activity = context.findActivity() + val activity = ctx.findActivity() val text = activity?.intent?.getStringExtra(Intent.EXTRA_TEXT) ?: "" val image = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { @@ -218,32 +331,67 @@ class MainActivity : ComponentActivity() { ) activity?.intent?.replaceExtras(Bundle()) } - composable(route = "inbox") { + composable( + route = "inbox", + deepLinks = DEFAULT_LEMMY_INSTANCES.map { instance -> + navDeepLink { uriPattern = "$instance/inbox" } + } + ) { + if (account != null) { + LaunchedEffect(Unit) { + inboxViewModel.fetchReplies( + account = account, + clear = true, + ctx = ctx + ) + inboxViewModel.fetchPersonMentions( + account = account, + clear = true, + ctx = ctx + ) + inboxViewModel.fetchPrivateMessages( + account = account, + clear = true, + ctx = ctx + ) + } + } + InboxActivity( navController = navController, inboxViewModel = inboxViewModel, - personProfileViewModel = personProfileViewModel, - postViewModel = postViewModel, - communityViewModel = communityViewModel, accountViewModel = accountViewModel, homeViewModel = homeViewModel, commentEditViewModel = commentEditViewModel, - commentReplyViewModel = commentReplyViewModel, - createReportViewModel = createReportViewModel + commentReplyViewModel = commentReplyViewModel ) } composable( - route = "post" + route = "post/{id}", + deepLinks = DEFAULT_LEMMY_INSTANCES.map { instance -> + navDeepLink { uriPattern = "$instance/post/{id}" } + }, + arguments = listOf( + navArgument("id") { + type = NavType.IntType + } + ) ) { + LaunchedEffect(Unit) { + val postId = it.arguments?.getInt("id")!! + postViewModel.fetchPost( + id = postId, + account = account, + clear = true, + ctx = ctx + ) + } PostActivity( postViewModel = postViewModel, accountViewModel = accountViewModel, - communityViewModel = communityViewModel, - personProfileViewModel = personProfileViewModel, commentEditViewModel = commentEditViewModel, commentReplyViewModel = commentReplyViewModel, postEditViewModel = postEditViewModel, - createReportViewModel = createReportViewModel, navController = navController ) } @@ -306,13 +454,18 @@ class MainActivity : ComponentActivity() { PrivateMessageReplyActivity( inboxViewModel = inboxViewModel, accountViewModel = accountViewModel, - personProfileViewModel = personProfileViewModel, navController = navController ) } composable( - route = "commentReport" + route = "commentReport/{id}", + arguments = listOf( + navArgument("id") { + type = NavType.IntType + } + ) ) { + createReportViewModel.setCommentId(it.arguments?.getInt("id")!!) CreateCommentReportActivity( createReportViewModel = createReportViewModel, accountViewModel = accountViewModel, @@ -320,8 +473,14 @@ class MainActivity : ComponentActivity() { ) } composable( - route = "postReport" + route = "postReport/{id}", + arguments = listOf( + navArgument("id") { + type = NavType.IntType + } + ) ) { + createReportViewModel.setPostId(it.arguments?.getInt("id")!!) CreatePostReportActivity( createReportViewModel = createReportViewModel, accountViewModel = accountViewModel, @@ -329,7 +488,10 @@ class MainActivity : ComponentActivity() { ) } composable( - route = "settings" + route = "settings", + deepLinks = DEFAULT_LEMMY_INSTANCES.map { instance -> + navDeepLink { uriPattern = "$instance/settings" } + } ) { SettingsActivity( navController = navController, diff --git a/app/src/main/java/com/jerboa/Utils.kt b/app/src/main/java/com/jerboa/Utils.kt index 29af53db8..74fc0f56e 100644 --- a/app/src/main/java/com/jerboa/Utils.kt +++ b/app/src/main/java/com/jerboa/Utils.kt @@ -55,10 +55,13 @@ const val MAX_POST_TITLE_LENGTH = 200 val DEFAULT_LEMMY_INSTANCES = listOf( "lemmy.ml", - "szmer.info", "lemmygrad.ml", - "lemmy.eus", - "lemmy.pt" + "mujico.org", + "feddit.de", + "szmer.info", + "beehaw.org", + "feddit.it", + "sopuli.xyz" ) // convert a data class to a map diff --git a/app/src/main/java/com/jerboa/api/Http.kt b/app/src/main/java/com/jerboa/api/Http.kt index 8cea5fa58..2f3a4d261 100644 --- a/app/src/main/java/com/jerboa/api/Http.kt +++ b/app/src/main/java/com/jerboa/api/Http.kt @@ -2,6 +2,7 @@ package com.jerboa.api import android.content.Context import android.util.Log +import arrow.core.Either import com.jerboa.VoteType import com.jerboa.datatypes.* import com.jerboa.datatypes.api.* @@ -338,7 +339,7 @@ suspend fun getSiteMetadataWrapper( suspend fun fetchPostsWrapper( account: Account?, ctx: Context?, - communityId: Int? = null, + communityIdOrName: Either? = null, sortType: SortType, listingType: ListingType, page: Int @@ -347,9 +348,13 @@ suspend fun fetchPostsWrapper( var posts = listOf() val api = API.getInstance() + val communityId = communityIdOrName?.fold({ it }, { null }) + val communityName = communityIdOrName?.fold({ null }, { it }) + try { val form = GetPosts( community_id = communityId, + community_name = communityName, sort = sortType.toString(), type_ = listingType.toString(), page = page, diff --git a/app/src/main/java/com/jerboa/datatypes/api/Community.kt b/app/src/main/java/com/jerboa/datatypes/api/Community.kt index 6cb572d30..03f1682bc 100644 --- a/app/src/main/java/com/jerboa/datatypes/api/Community.kt +++ b/app/src/main/java/com/jerboa/datatypes/api/Community.kt @@ -10,7 +10,7 @@ import com.jerboa.datatypes.PersonViewSafe val * To get a federated community by name, use `name@instance.tld` . */ data class GetCommunity( - val id: Int?, + val id: Int? = null, val name: String? = null, val auth: String? ) diff --git a/app/src/main/java/com/jerboa/db/AppDB.kt b/app/src/main/java/com/jerboa/db/AppDB.kt index 429f09eb7..aeb87353c 100644 --- a/app/src/main/java/com/jerboa/db/AppDB.kt +++ b/app/src/main/java/com/jerboa/db/AppDB.kt @@ -1,7 +1,6 @@ package com.jerboa.db import android.content.Context -import androidx.annotation.NonNull import androidx.annotation.WorkerThread import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel @@ -22,12 +21,12 @@ data class Account( @ColumnInfo( name = "default_listing_type", defaultValue = "0" - ) @NonNull + ) val defaultListingType: Int, @ColumnInfo( name = "default_sort_type", defaultValue = "0" - ) @NonNull + ) val defaultSortType: Int ) diff --git a/app/src/main/java/com/jerboa/ui/components/comment/CommentRoutines.kt b/app/src/main/java/com/jerboa/ui/components/comment/CommentRoutines.kt index 0c0845eb6..aed09f45c 100644 --- a/app/src/main/java/com/jerboa/ui/components/comment/CommentRoutines.kt +++ b/app/src/main/java/com/jerboa/ui/components/comment/CommentRoutines.kt @@ -154,7 +154,7 @@ fun createCommentRoutine( insertCommentIntoTree(postViewModel.commentTree, commentView) // Maybe a back button would view this page. - if (account.id == personProfileViewModel.personId.value) { + if (account.id == personProfileViewModel.res?.person_view?.person?.id) { addCommentToMutableList(personProfileViewModel.comments, commentView) } } diff --git a/app/src/main/java/com/jerboa/ui/components/comment/edit/CommentEdit.kt b/app/src/main/java/com/jerboa/ui/components/comment/edit/CommentEdit.kt index 75cc32dbb..9064da842 100644 --- a/app/src/main/java/com/jerboa/ui/components/comment/edit/CommentEdit.kt +++ b/app/src/main/java/com/jerboa/ui/components/comment/edit/CommentEdit.kt @@ -1,8 +1,9 @@ package com.jerboa.ui.components.comment.edit +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.material.* import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Close @@ -12,10 +13,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.text.input.TextFieldValue import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController -import com.jerboa.datatypes.CommentView import com.jerboa.db.Account import com.jerboa.ui.components.common.MarkdownTextField -import com.jerboa.ui.components.common.simpleVerticalScrollbar import com.jerboa.ui.theme.APP_BAR_ELEVATION @Composable @@ -74,29 +73,17 @@ fun CommentEdit( onContentChange: (TextFieldValue) -> Unit, account: Account? ) { - val listState = rememberLazyListState() + val scrollState = rememberScrollState() - LazyColumn( - state = listState, - modifier = Modifier.simpleVerticalScrollbar(listState) + Column( + modifier = Modifier.verticalScroll(scrollState) ) { - item { - MarkdownTextField( - text = content, - onTextChange = onContentChange, - account = account, - modifier = Modifier.fillMaxWidth(), - placeholder = "Type your comment" - ) - } + MarkdownTextField( + text = content, + onTextChange = onContentChange, + account = account, + modifier = Modifier.fillMaxWidth(), + placeholder = "Type your comment" + ) } } - -fun commentEditClickWrapper( - commentEditViewModel: CommentEditViewModel, - commentView: CommentView, - navController: NavController -) { - commentEditViewModel.setCommentView(commentView) - navController.navigate("commentEdit") -} diff --git a/app/src/main/java/com/jerboa/ui/components/comment/edit/CommentEditViewModel.kt b/app/src/main/java/com/jerboa/ui/components/comment/edit/CommentEditViewModel.kt index 4189273f2..f0db2436d 100644 --- a/app/src/main/java/com/jerboa/ui/components/comment/edit/CommentEditViewModel.kt +++ b/app/src/main/java/com/jerboa/ui/components/comment/edit/CommentEditViewModel.kt @@ -20,7 +20,7 @@ class CommentEditViewModel : ViewModel() { var loading = mutableStateOf(false) private set - fun setCommentView( + fun initialize( newCommentView: CommentView ) { commentView.value = newCommentView diff --git a/app/src/main/java/com/jerboa/ui/components/comment/reply/CommentReply.kt b/app/src/main/java/com/jerboa/ui/components/comment/reply/CommentReply.kt index 9b518cc67..d2f7f27ac 100644 --- a/app/src/main/java/com/jerboa/ui/components/comment/reply/CommentReply.kt +++ b/app/src/main/java/com/jerboa/ui/components/comment/reply/CommentReply.kt @@ -3,9 +3,9 @@ package com.jerboa.ui.components.comment.reply import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.selection.SelectionContainer +import androidx.compose.foundation.verticalScroll import androidx.compose.material.* import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Close @@ -22,7 +22,6 @@ import com.jerboa.datatypes.sampleCommentView import com.jerboa.db.Account import com.jerboa.ui.components.comment.CommentNodeHeader import com.jerboa.ui.components.common.MarkdownTextField -import com.jerboa.ui.components.common.simpleVerticalScrollbar import com.jerboa.ui.components.post.PostNodeHeader import com.jerboa.ui.theme.LARGE_PADDING import com.jerboa.ui.theme.MEDIUM_PADDING @@ -132,32 +131,26 @@ fun CommentReply( onReplyChange: (TextFieldValue) -> Unit, onPersonClick: (personId: Int) -> Unit, isModerator: Boolean, - account: Account? + account: Account?, + modifier: Modifier = Modifier ) { - val listState = rememberLazyListState() + val scrollState = rememberScrollState() - LazyColumn( - state = listState, - modifier = Modifier.simpleVerticalScrollbar(listState) + Column( + modifier = modifier.verticalScroll(scrollState) ) { - item { - RepliedComment( - commentView = commentView, - onPersonClick = onPersonClick, - isModerator = isModerator - ) - } - item { - Divider(modifier = Modifier.padding(vertical = LARGE_PADDING)) - } - item { - MarkdownTextField( - text = reply, - onTextChange = onReplyChange, - account = account, - modifier = Modifier.fillMaxWidth() - ) - } + RepliedComment( + commentView = commentView, + onPersonClick = onPersonClick, + isModerator = isModerator + ) + Divider(modifier = Modifier.padding(vertical = LARGE_PADDING)) + MarkdownTextField( + text = reply, + onTextChange = onReplyChange, + account = account, + modifier = Modifier.fillMaxWidth() + ) } } @@ -168,46 +161,26 @@ fun PostReply( onReplyChange: (TextFieldValue) -> Unit, onPersonClick: (personId: Int) -> Unit, isModerator: Boolean, - account: Account? + account: Account?, + modifier: Modifier = Modifier ) { - val listState = rememberLazyListState() + val scrollState = rememberScrollState() - LazyColumn( - state = listState, - modifier = Modifier.simpleVerticalScrollbar(listState) + Column( + modifier = modifier.verticalScroll(scrollState) ) { - item { - RepliedPost( - postView = postView, - onPersonClick = onPersonClick, - isModerator = isModerator - ) - } - item { - Divider(modifier = Modifier.padding(vertical = LARGE_PADDING)) - } - item { - MarkdownTextField( - text = reply, - onTextChange = onReplyChange, - account = account, - modifier = Modifier.fillMaxWidth(), - placeholder = "Type your comment" - ) - } + RepliedPost( + postView = postView, + onPersonClick = onPersonClick, + isModerator = isModerator + ) + Divider(modifier = Modifier.padding(vertical = LARGE_PADDING)) + MarkdownTextField( + text = reply, + onTextChange = onReplyChange, + account = account, + modifier = Modifier.fillMaxWidth(), + placeholder = "Type your comment" + ) } } - -fun commentReplyClickWrapper( - commentReplyViewModel: CommentReplyViewModel, - postId: Int, - parentCommentView: CommentView? = null, - postView: PostView? = null, - navController: NavController -) { - // Post id is mandatory, but the other two only one must be set - commentReplyViewModel.setPostId(postId) - commentReplyViewModel.setCommentParentView(parentCommentView) - commentReplyViewModel.setPostView(postView) - navController.navigate("commentReply") -} diff --git a/app/src/main/java/com/jerboa/ui/components/comment/reply/CommentReplyActivity.kt b/app/src/main/java/com/jerboa/ui/components/comment/reply/CommentReplyActivity.kt index e09126ed2..fefc7566e 100644 --- a/app/src/main/java/com/jerboa/ui/components/comment/reply/CommentReplyActivity.kt +++ b/app/src/main/java/com/jerboa/ui/components/comment/reply/CommentReplyActivity.kt @@ -2,6 +2,7 @@ package com.jerboa.ui.components.comment.reply import android.util.Log import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding import androidx.compose.material.LinearProgressIndicator import androidx.compose.material.MaterialTheme import androidx.compose.material.Scaffold @@ -18,7 +19,6 @@ import com.jerboa.isModerator import com.jerboa.ui.components.common.getCurrentAccount import com.jerboa.ui.components.inbox.InboxViewModel import com.jerboa.ui.components.person.PersonProfileViewModel -import com.jerboa.ui.components.person.personClickWrapper import com.jerboa.ui.components.post.PostViewModel @Composable @@ -65,51 +65,43 @@ fun CommentReplyActivity( } ) }, - content = { + content = { padding -> if (commentReplyViewModel.loading.value) { LinearProgressIndicator(modifier = Modifier.fillMaxWidth()) } else { - commentReplyViewModel.commentParentView.value?.also { commentView -> + commentReplyViewModel.replyItem?.fold({ commentView -> CommentReply( commentView = commentView, account = account, reply = reply, onReplyChange = { reply = it }, onPersonClick = { personId -> - personClickWrapper( - personProfileViewModel, - personId, - account, - navController, - ctx - ) + navController.navigate(route = "profile/$personId") }, isModerator = isModerator( commentView.creator, postViewModel .moderators - ) + ), + modifier = Modifier.padding(padding) ) - } ?: run { - commentReplyViewModel.postView.value?.also { postView -> - PostReply( - postView = postView, - account = account, - reply = reply, - onReplyChange = { reply = it }, - onPersonClick = { personId -> - personClickWrapper( - personProfileViewModel, - personId, - account, - navController, - ctx - ) - }, - isModerator = isModerator(postView.creator, postViewModel.moderators) - ) - } - } + }, { postView -> + PostReply( + postView = postView, + account = account, + reply = reply, + onReplyChange = { reply = it }, + onPersonClick = { personId -> + navController.navigate(route = "profile/$personId") + }, + isModerator = isModerator( + postView.creator, + postViewModel + .moderators + ), + modifier = Modifier.padding(padding) + ) + }) } } ) diff --git a/app/src/main/java/com/jerboa/ui/components/comment/reply/CommentReplyViewModel.kt b/app/src/main/java/com/jerboa/ui/components/comment/reply/CommentReplyViewModel.kt index d61e103be..17facc766 100644 --- a/app/src/main/java/com/jerboa/ui/components/comment/reply/CommentReplyViewModel.kt +++ b/app/src/main/java/com/jerboa/ui/components/comment/reply/CommentReplyViewModel.kt @@ -1,11 +1,14 @@ package com.jerboa.ui.components.comment.reply import android.content.Context +import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue import androidx.compose.ui.focus.FocusManager import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.navigation.NavController +import arrow.core.Either import com.jerboa.datatypes.CommentView import com.jerboa.datatypes.PostView import com.jerboa.db.Account @@ -16,31 +19,15 @@ import com.jerboa.ui.components.post.PostViewModel class CommentReplyViewModel : ViewModel() { - var commentParentView = mutableStateOf(null) - private set - var postId = mutableStateOf(null) - private set - var postView = mutableStateOf(null) + var replyItem by mutableStateOf?>(null) private set var loading = mutableStateOf(false) private set - fun setCommentParentView( - newCommentParentView: CommentView? - ) { - commentParentView.value = newCommentParentView - } - - fun setPostView( - newPostView: PostView? + fun initialize( + newReplyItem: Either ) { - postView.value = newPostView - } - - fun setPostId( - newPostId: Int - ) { - postId.value = newPostId + replyItem = newReplyItem } fun createComment( @@ -53,21 +40,22 @@ class CommentReplyViewModel : ViewModel() { postViewModel: PostViewModel, inboxViewModel: InboxViewModel ) { - postId.value?.also { postId -> - createCommentRoutine( - content = content, - parentCommentView = commentParentView.value, - postId = postId, - account = account, - loading = loading, - ctx = ctx, - scope = viewModelScope, - navController = navController, - focusManager = focusManager, - personProfileViewModel = personProfileViewModel, - postViewModel = postViewModel, - inboxViewModel = inboxViewModel - ) - } + val commentParentView = replyItem?.fold({ it }, { null }) + val postId = replyItem?.fold({ it.post.id }, { it.post.id })!! + + createCommentRoutine( + content = content, + parentCommentView = commentParentView, + postId = postId, + account = account, + loading = loading, + ctx = ctx, + scope = viewModelScope, + navController = navController, + focusManager = focusManager, + personProfileViewModel = personProfileViewModel, + postViewModel = postViewModel, + inboxViewModel = inboxViewModel + ) } } diff --git a/app/src/main/java/com/jerboa/ui/components/common/InputFields.kt b/app/src/main/java/com/jerboa/ui/components/common/InputFields.kt index d71cd5b16..b21295454 100644 --- a/app/src/main/java/com/jerboa/ui/components/common/InputFields.kt +++ b/app/src/main/java/com/jerboa/ui/components/common/InputFields.kt @@ -75,7 +75,7 @@ fun MarkdownTextField( ) } - Column { + Column(modifier = modifier) { if (outlined) { OutlinedTextField( value = text, diff --git a/app/src/main/java/com/jerboa/ui/components/common/PictrsImage.kt b/app/src/main/java/com/jerboa/ui/components/common/PictrsImage.kt index e41ea292f..ad58b492c 100644 --- a/app/src/main/java/com/jerboa/ui/components/common/PictrsImage.kt +++ b/app/src/main/java/com/jerboa/ui/components/common/PictrsImage.kt @@ -14,7 +14,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp @@ -92,7 +91,6 @@ fun PictrsUrlImage( url: String, modifier: Modifier = Modifier ) { - val configuration = LocalConfiguration.current Image( painter = rememberImagePainter( data = pictrsImageThumbnail(url, MAX_IMAGE_SIZE), @@ -149,16 +147,18 @@ fun PickImage( LaunchedEffect(image) { imageUri = image bitmap.value = decodeUriToBitmap(ctx, imageUri!!) + Log.d("jerboa", "Uploading image...") Log.d("jerboa", imageUri.toString()) onPickedImage(image) } } val launcher = rememberLauncherForActivityResult( - contract = ActivityResultContracts.GetContent() - ) { uri: Uri? -> + ActivityResultContracts.GetContent() + ) { uri -> imageUri = uri bitmap.value = decodeUriToBitmap(ctx, imageUri!!) + Log.d("jerboa", "Uploading image...") Log.d("jerboa", imageUri.toString()) onPickedImage(uri!!) } diff --git a/app/src/main/java/com/jerboa/ui/components/community/CommunityActivity.kt b/app/src/main/java/com/jerboa/ui/components/community/CommunityActivity.kt index b16ce9df1..2d017acbd 100644 --- a/app/src/main/java/com/jerboa/ui/components/community/CommunityActivity.kt +++ b/app/src/main/java/com/jerboa/ui/components/community/CommunityActivity.kt @@ -14,6 +14,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.navigation.NavController +import arrow.core.Either import com.jerboa.VoteType import com.jerboa.db.AccountViewModel import com.jerboa.loginFirstToast @@ -23,30 +24,17 @@ import com.jerboa.ui.components.common.BottomAppBarAll import com.jerboa.ui.components.common.getCurrentAccount import com.jerboa.ui.components.community.list.CommunityListViewModel import com.jerboa.ui.components.home.HomeViewModel -import com.jerboa.ui.components.inbox.InboxViewModel -import com.jerboa.ui.components.inbox.inboxClickWrapper -import com.jerboa.ui.components.person.PersonProfileViewModel -import com.jerboa.ui.components.person.personClickWrapper import com.jerboa.ui.components.post.PostListings -import com.jerboa.ui.components.post.PostViewModel import com.jerboa.ui.components.post.edit.PostEditViewModel -import com.jerboa.ui.components.post.edit.postEditClickWrapper -import com.jerboa.ui.components.post.postClickWrapper -import com.jerboa.ui.components.report.CreateReportViewModel -import com.jerboa.ui.components.report.postReportClickWrapper @Composable fun CommunityActivity( navController: NavController, communityViewModel: CommunityViewModel, communityListViewModel: CommunityListViewModel, - personProfileViewModel: PersonProfileViewModel, - postViewModel: PostViewModel, accountViewModel: AccountViewModel, homeViewModel: HomeViewModel, - inboxViewModel: InboxViewModel, - postEditViewModel: PostEditViewModel, - createReportViewModel: CreateReportViewModel + postEditViewModel: PostEditViewModel ) { Log.d("jerboa", "got to community activity") @@ -69,6 +57,7 @@ fun CommunityActivity( onClickRefresh = { scrollToTop(scope, postListState) communityViewModel.fetchPosts( + communityIdOrName = Either.Left(com.id), account = account, clear = true, ctx = ctx @@ -77,6 +66,7 @@ fun CommunityActivity( onClickSortType = { sortType -> scrollToTop(scope, postListState) communityViewModel.fetchPosts( + communityIdOrName = Either.Left(com.id), account = account, clear = true, changeSortType = sortType, @@ -105,12 +95,12 @@ fun CommunityActivity( listState = postListState, padding = it, contentAboveListings = { - communityViewModel.communityView?.also { + communityViewModel.communityView?.also { cv -> CommunityTopSection( - communityView = it, - onClickFollowCommunity = { cv -> + communityView = cv, + onClickFollowCommunity = { cfv -> communityViewModel.followCommunity( - cv = cv, + cv = cfv, account = account, ctx = ctx ) @@ -136,13 +126,7 @@ fun CommunityActivity( ) }, onPostClick = { postView -> - postClickWrapper( - postViewModel = postViewModel, - postId = postView.post.id, - account = account, - navController = navController, - ctx = ctx - ) + navController.navigate(route = "post/${postView.post.id}") }, onPostLinkClick = { url -> openLink(url, ctx) @@ -174,20 +158,11 @@ fun CommunityActivity( } }, onCommunityClick = { community -> - communityClickWrapper( - communityViewModel, - community.id, - account, - navController, - ctx = ctx - ) + navController.navigate(route = "community/${community.id}") }, onEditPostClick = { postView -> - postEditClickWrapper( - postEditViewModel, - postView, - navController - ) + postEditViewModel.initialize(postView) + navController.navigate("postEdit") }, onDeletePostClick = { postView -> account?.also { acct -> @@ -199,14 +174,14 @@ fun CommunityActivity( } }, onReportClick = { postView -> - postReportClickWrapper( - createReportViewModel, - postView.post.id, - navController - ) + navController.navigate("postReport/${postView.post.id}") }, onSwipeRefresh = { communityViewModel.fetchPosts( + communityIdOrName = Either.Left( + communityViewModel.communityView!! + .community.id + ), account = account, clear = true, ctx = ctx @@ -218,6 +193,10 @@ fun CommunityActivity( isScrolledToEnd = { if (communityViewModel.posts.size > 0) { communityViewModel.fetchPosts( + communityIdOrName = Either.Left( + communityViewModel.communityView!! + .community.id + ), account = account, nextPage = true, ctx = ctx @@ -225,13 +204,7 @@ fun CommunityActivity( } }, onPersonClick = { personId -> - personClickWrapper( - personProfileViewModel = personProfileViewModel, - personId = personId, - account = account, - navController = navController, - ctx = ctx - ) + navController.navigate(route = "profile/$personId") }, account = account ) @@ -259,28 +232,23 @@ fun CommunityActivity( unreadCounts = homeViewModel.unreadCountResponse, onClickProfile = { account?.id?.also { - personClickWrapper( - personProfileViewModel = personProfileViewModel, - personId = it, - account = account, - navController = navController, - ctx = ctx - ) + navController.navigate(route = "profile/$it") + } ?: run { + loginFirstToast(ctx) } }, onClickInbox = { - inboxClickWrapper(inboxViewModel, account, navController, ctx) + account?.also { + navController.navigate(route = "inbox") + } ?: run { + loginFirstToast(ctx) + } }, onClickSaved = { account?.id?.also { - personClickWrapper( - personProfileViewModel = personProfileViewModel, - personId = it, - account = account, - navController = navController, - ctx = ctx, - saved = true - ) + navController.navigate(route = "profile/$it?saved=${true}") + } ?: run { + loginFirstToast(ctx) } }, navController = navController diff --git a/app/src/main/java/com/jerboa/ui/components/community/CommunityLink.kt b/app/src/main/java/com/jerboa/ui/components/community/CommunityLink.kt index 5837acb58..bb52957dc 100644 --- a/app/src/main/java/com/jerboa/ui/components/community/CommunityLink.kt +++ b/app/src/main/java/com/jerboa/ui/components/community/CommunityLink.kt @@ -1,6 +1,5 @@ package com.jerboa.ui.components.community -import android.content.Context import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.material.MaterialTheme @@ -12,13 +11,11 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.TextStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp -import androidx.navigation.NavController import com.jerboa.communityNameShown import com.jerboa.datatypes.CommunitySafe import com.jerboa.datatypes.CommunityView import com.jerboa.datatypes.sampleCommunitySafe import com.jerboa.datatypes.sampleCommunityView -import com.jerboa.db.Account import com.jerboa.ui.components.common.CircularIcon import com.jerboa.ui.theme.* @@ -133,24 +130,3 @@ fun CommunityLinkWithUsersPreview() { onClick = {} ) } - -fun communityClickWrapper( - communityViewModel: CommunityViewModel, - communityId: Int, - account: Account?, - navController: NavController, - ctx: Context -) { - communityViewModel.fetchCommunity( - id = communityId, - auth = account?.jwt - ) - - communityViewModel.fetchPosts( - changeCommunityId = communityId, - account = account, - clear = true, - ctx = ctx - ) - navController.navigate(route = "community") -} diff --git a/app/src/main/java/com/jerboa/ui/components/community/CommunityViewModel.kt b/app/src/main/java/com/jerboa/ui/components/community/CommunityViewModel.kt index 0400f3fd1..2d5079326 100644 --- a/app/src/main/java/com/jerboa/ui/components/community/CommunityViewModel.kt +++ b/app/src/main/java/com/jerboa/ui/components/community/CommunityViewModel.kt @@ -8,6 +8,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import arrow.core.Either import com.jerboa.VoteType import com.jerboa.api.API import com.jerboa.api.followCommunityWrapper @@ -31,7 +32,6 @@ class CommunityViewModel : ViewModel() { var moderators = mutableStateListOf() private set - var communityId = mutableStateOf(null) var loading = mutableStateOf(false) private set var posts = mutableStateListOf() @@ -43,23 +43,22 @@ class CommunityViewModel : ViewModel() { fun fetchPosts( account: Account?, + communityIdOrName: Either, nextPage: Boolean = false, clear: Boolean = false, changeSortType: SortType? = null, - changeCommunityId: Int? = null, ctx: Context ) { fetchPostsRoutine( posts = posts, loading = loading, page = page, - communityId = communityId, + communityIdOrName = communityIdOrName, listingType = mutableStateOf(ListingType.Community), sortType = sortType, nextPage = nextPage, clear = clear, changeSortType = changeSortType, - changeCommunityId = changeCommunityId, account = account, ctx = ctx, scope = viewModelScope @@ -93,21 +92,29 @@ class CommunityViewModel : ViewModel() { } } - fun fetchCommunity(id: Int, auth: String?) { + fun fetchCommunity( + idOrName: Either, + auth: String? + ) { val api = API.getInstance() viewModelScope.launch { + val idOrNameStr = idOrName.fold({ id -> id.toString() }, { it }) + try { Log.d( "jerboa", - "Fetching community id: $id" + "Fetching community: $idOrNameStr" ) loading.value = true - val form = GetCommunity(id = id, auth = auth) + val form = idOrName.fold({ id -> + GetCommunity(id = id, auth = auth) + }, { name -> + GetCommunity(name = name, auth = auth) + }) val out = retrofitErrorHandler(api.getCommunity(form = form.serializeToMap())) communityView = out.community_view - communityId.value = id moderators.clear() moderators.addAll(out.moderators) } catch (e: Exception) { diff --git a/app/src/main/java/com/jerboa/ui/components/community/list/CommunityList.kt b/app/src/main/java/com/jerboa/ui/components/community/list/CommunityList.kt index cfd3b08b9..52ac3d40e 100644 --- a/app/src/main/java/com/jerboa/ui/components/community/list/CommunityList.kt +++ b/app/src/main/java/com/jerboa/ui/components/community/list/CommunityList.kt @@ -74,13 +74,14 @@ fun CommunityListHeader( @Composable fun CommunityListings( communities: List, - onClickCommunity: (community: CommunitySafe) -> Unit + onClickCommunity: (community: CommunitySafe) -> Unit, + modifier: Modifier = Modifier ) { val listState = rememberLazyListState() LazyColumn( state = listState, - modifier = Modifier.simpleVerticalScrollbar(listState) + modifier = modifier.simpleVerticalScrollbar(listState) ) { items( communities, diff --git a/app/src/main/java/com/jerboa/ui/components/community/list/CommunityListActivity.kt b/app/src/main/java/com/jerboa/ui/components/community/list/CommunityListActivity.kt index 779f537f6..d1f9ff3cb 100644 --- a/app/src/main/java/com/jerboa/ui/components/community/list/CommunityListActivity.kt +++ b/app/src/main/java/com/jerboa/ui/components/community/list/CommunityListActivity.kt @@ -2,6 +2,7 @@ package com.jerboa.ui.components.community.list import android.util.Log import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding import androidx.compose.material.LinearProgressIndicator import androidx.compose.material.MaterialTheme import androidx.compose.material.Scaffold @@ -18,8 +19,6 @@ import androidx.navigation.NavController import com.jerboa.DEBOUNCE_DELAY import com.jerboa.db.AccountViewModel import com.jerboa.ui.components.common.getCurrentAccount -import com.jerboa.ui.components.community.CommunityViewModel -import com.jerboa.ui.components.community.communityClickWrapper import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -30,7 +29,6 @@ private var fetchCommunitiesJob: Job? = null fun CommunityListActivity( navController: NavController, communityListViewModel: CommunityListViewModel, - communityViewModel: CommunityViewModel, accountViewModel: AccountViewModel, selectMode: Boolean = false ) { @@ -63,26 +61,21 @@ fun CommunityListActivity( } ) }, - content = { + content = { padding -> if (communityListViewModel.loading.value) { LinearProgressIndicator(modifier = Modifier.fillMaxWidth()) } else { CommunityListings( communities = communityListViewModel.communityList, - onClickCommunity = { + onClickCommunity = { cs -> if (selectMode) { - communityListViewModel.selectCommunity(it) + communityListViewModel.selectCommunity(cs) navController.navigateUp() } else { - communityClickWrapper( - communityViewModel = communityViewModel, - communityId = it.id, - account = account, - navController = navController, - ctx = ctx - ) + navController.navigate(route = "community/${cs.id}") } - } + }, + modifier = Modifier.padding(padding) ) } } diff --git a/app/src/main/java/com/jerboa/ui/components/home/HomeActivity.kt b/app/src/main/java/com/jerboa/ui/components/home/HomeActivity.kt index 292e1e001..55fc43a9b 100644 --- a/app/src/main/java/com/jerboa/ui/components/home/HomeActivity.kt +++ b/app/src/main/java/com/jerboa/ui/components/home/HomeActivity.kt @@ -28,34 +28,17 @@ import com.jerboa.openLink import com.jerboa.scrollToTop import com.jerboa.ui.components.common.BottomAppBarAll import com.jerboa.ui.components.common.getCurrentAccount -import com.jerboa.ui.components.community.CommunityViewModel -import com.jerboa.ui.components.community.communityClickWrapper -import com.jerboa.ui.components.inbox.InboxViewModel -import com.jerboa.ui.components.inbox.inboxClickWrapper -import com.jerboa.ui.components.person.PersonProfileViewModel -import com.jerboa.ui.components.person.personClickWrapper import com.jerboa.ui.components.post.PostListings -import com.jerboa.ui.components.post.PostViewModel import com.jerboa.ui.components.post.edit.PostEditViewModel -import com.jerboa.ui.components.post.edit.postEditClickWrapper -import com.jerboa.ui.components.post.postClickWrapper -import com.jerboa.ui.components.report.CreateReportViewModel -import com.jerboa.ui.components.report.postReportClickWrapper -import com.jerboa.ui.components.settings.settingsClickWrapper import kotlinx.coroutines.CoroutineScope @Composable fun HomeActivity( navController: NavController, homeViewModel: HomeViewModel, - communityViewModel: CommunityViewModel, - personProfileViewModel: PersonProfileViewModel, - postViewModel: PostViewModel, - inboxViewModel: InboxViewModel, accountViewModel: AccountViewModel, siteViewModel: SiteViewModel, - postEditViewModel: PostEditViewModel, - createReportViewModel: CreateReportViewModel + postEditViewModel: PostEditViewModel ) { Log.d("jerboa", "got to home activity") @@ -88,10 +71,7 @@ fun HomeActivity( accounts = accounts, navController = navController, accountViewModel = accountViewModel, - communityViewModel = communityViewModel, homeViewModel = homeViewModel, - personProfileViewModel = personProfileViewModel, - inboxViewModel = inboxViewModel, scope = scope, scaffoldState = scaffoldState, account = account, @@ -102,11 +82,7 @@ fun HomeActivity( MainPostListingsContent( padding = it, homeViewModel = homeViewModel, - communityViewModel = communityViewModel, - personProfileViewModel = personProfileViewModel, - postViewModel = postViewModel, postEditViewModel = postEditViewModel, - createReportViewModel = createReportViewModel, account = account, ctx = ctx, navController = navController, @@ -133,30 +109,21 @@ fun HomeActivity( unreadCounts = homeViewModel.unreadCountResponse, onClickProfile = { account?.id?.also { - personClickWrapper( - personProfileViewModel = personProfileViewModel, - personId = it, - account = account, - navController = navController, - ctx = ctx - ) + navController.navigate(route = "profile/$it") } ?: run { loginFirstToast(ctx) } }, onClickInbox = { - inboxClickWrapper(inboxViewModel, account, navController, ctx) + account?.also { + navController.navigate(route = "inbox") + } ?: run { + loginFirstToast(ctx) + } }, onClickSaved = { account?.id?.also { - personClickWrapper( - personProfileViewModel = personProfileViewModel, - personId = it, - account = account, - navController = navController, - ctx = ctx, - saved = true - ) + navController.navigate(route = "profile/$it?saved=${true}") } ?: run { loginFirstToast(ctx) } @@ -171,11 +138,7 @@ fun HomeActivity( @Composable fun MainPostListingsContent( homeViewModel: HomeViewModel, - communityViewModel: CommunityViewModel, - personProfileViewModel: PersonProfileViewModel, - postViewModel: PostViewModel, postEditViewModel: PostEditViewModel, - createReportViewModel: CreateReportViewModel, account: Account?, ctx: Context, navController: NavController, @@ -203,13 +166,7 @@ fun MainPostListingsContent( ) }, onPostClick = { postView -> - postClickWrapper( - postViewModel = postViewModel, - postId = postView.post.id, - account = account, - navController = navController, - ctx = ctx - ) + navController.navigate(route = "post/${postView.post.id}") }, onPostLinkClick = { url -> openLink(url, ctx) @@ -242,11 +199,8 @@ fun MainPostListingsContent( } }, onEditPostClick = { postView -> - postEditClickWrapper( - postEditViewModel, - postView, - navController - ) + postEditViewModel.initialize(postView) + navController.navigate("postEdit") }, onDeletePostClick = { postView -> account?.also { acct -> @@ -258,29 +212,13 @@ fun MainPostListingsContent( } }, onReportClick = { postView -> - postReportClickWrapper( - createReportViewModel, - postView.post.id, - navController - ) + navController.navigate("postReport/${postView.post.id}") }, onCommunityClick = { community -> - communityClickWrapper( - communityViewModel = communityViewModel, - communityId = community.id, - account = account, - navController = navController, - ctx = ctx - ) + navController.navigate(route = "community/${community.id}") }, onPersonClick = { personId -> - personClickWrapper( - personProfileViewModel = personProfileViewModel, - personId = personId, - account = account, - navController = navController, - ctx = ctx - ) + navController.navigate(route = "profile/$personId") }, onSwipeRefresh = { homeViewModel.fetchPosts( @@ -311,9 +249,6 @@ fun MainDrawer( accounts: List?, navController: NavController, accountViewModel: AccountViewModel, - communityViewModel: CommunityViewModel, - personProfileViewModel: PersonProfileViewModel, - inboxViewModel: InboxViewModel, homeViewModel: HomeViewModel, scope: CoroutineScope, scaffoldState: ScaffoldState, @@ -367,55 +302,35 @@ fun MainDrawer( closeDrawer(scope, scaffoldState) }, onCommunityClick = { community -> - communityClickWrapper( - communityViewModel, - community.id, - account, - navController, - ctx = ctx - ) + navController.navigate(route = "community/${community.id}") closeDrawer(scope, scaffoldState) }, onClickProfile = { account?.id?.also { - personClickWrapper( - personProfileViewModel = personProfileViewModel, - personId = it, - account = account, - navController = navController, - ctx = ctx, - saved = false - ) + navController.navigate(route = "profile/$it") closeDrawer(scope, scaffoldState) } }, onClickSaved = { account?.id?.also { - personClickWrapper( - personProfileViewModel = personProfileViewModel, - personId = it, - account = account, - navController = navController, - ctx = ctx, - saved = true - ) + navController.navigate(route = "profile/$it?saved=${true}") closeDrawer(scope, scaffoldState) } }, onClickInbox = { - inboxClickWrapper( - inboxViewModel = inboxViewModel, - account = account, - navController = navController, - ctx = ctx - ) + account?.also { + navController.navigate(route = "inbox") + } ?: run { + loginFirstToast(ctx) + } closeDrawer(scope, scaffoldState) }, onClickSettings = { - settingsClickWrapper( - navController = navController, - account = account - ) + account.also { + navController.navigate(route = "settings") + } ?: run { + loginFirstToast(ctx) + } closeDrawer(scope, scaffoldState) } ) diff --git a/app/src/main/java/com/jerboa/ui/components/inbox/Inbox.kt b/app/src/main/java/com/jerboa/ui/components/inbox/Inbox.kt index 1770d081b..d7ceb91be 100644 --- a/app/src/main/java/com/jerboa/ui/components/inbox/Inbox.kt +++ b/app/src/main/java/com/jerboa/ui/components/inbox/Inbox.kt @@ -1,6 +1,5 @@ package com.jerboa.ui.components.inbox -import android.content.Context import androidx.compose.foundation.layout.Column import androidx.compose.material.* import androidx.compose.material.icons.Icons @@ -11,40 +10,10 @@ import androidx.compose.runtime.* import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController import com.jerboa.UnreadOrAll -import com.jerboa.db.Account -import com.jerboa.loginFirstToast import com.jerboa.ui.components.common.UnreadOrAllOptionsDialog import com.jerboa.ui.theme.APP_BAR_ELEVATION import com.jerboa.ui.theme.muted -fun inboxClickWrapper( - inboxViewModel: InboxViewModel, - account: Account?, - navController: NavController, - ctx: Context -) { - account?.also { - inboxViewModel.fetchReplies( - account = account, - clear = true, - ctx = ctx - ) - inboxViewModel.fetchPersonMentions( - account = account, - clear = true, - ctx = ctx - ) - inboxViewModel.fetchPrivateMessages( - account = account, - clear = true, - ctx = ctx - ) - navController.navigate(route = "inbox") - } ?: run { - loginFirstToast(ctx) - } -} - @Composable fun InboxHeader( navController: NavController = rememberNavController(), diff --git a/app/src/main/java/com/jerboa/ui/components/inbox/InboxActivity.kt b/app/src/main/java/com/jerboa/ui/components/inbox/InboxActivity.kt index e1e8b4901..0fdae5543 100644 --- a/app/src/main/java/com/jerboa/ui/components/inbox/InboxActivity.kt +++ b/app/src/main/java/com/jerboa/ui/components/inbox/InboxActivity.kt @@ -13,6 +13,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.navigation.NavController +import arrow.core.Either import com.google.accompanist.pager.ExperimentalPagerApi import com.google.accompanist.pager.HorizontalPager import com.google.accompanist.pager.pagerTabIndicatorOffset @@ -24,21 +25,12 @@ import com.jerboa.db.Account import com.jerboa.db.AccountViewModel import com.jerboa.ui.components.comment.CommentNodes import com.jerboa.ui.components.comment.edit.CommentEditViewModel -import com.jerboa.ui.components.comment.edit.commentEditClickWrapper import com.jerboa.ui.components.comment.reply.CommentReplyViewModel -import com.jerboa.ui.components.comment.reply.commentReplyClickWrapper import com.jerboa.ui.components.common.BottomAppBarAll import com.jerboa.ui.components.common.getCurrentAccount -import com.jerboa.ui.components.community.CommunityViewModel -import com.jerboa.ui.components.community.communityClickWrapper +import com.jerboa.ui.components.common.simpleVerticalScrollbar import com.jerboa.ui.components.home.HomeViewModel -import com.jerboa.ui.components.person.PersonProfileViewModel -import com.jerboa.ui.components.person.personClickWrapper -import com.jerboa.ui.components.post.PostViewModel -import com.jerboa.ui.components.post.postClickWrapper import com.jerboa.ui.components.privatemessage.PrivateMessage -import com.jerboa.ui.components.report.CreateReportViewModel -import com.jerboa.ui.components.report.commentReportClickWrapper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -47,13 +39,9 @@ fun InboxActivity( navController: NavController, inboxViewModel: InboxViewModel, homeViewModel: HomeViewModel, - personProfileViewModel: PersonProfileViewModel, - postViewModel: PostViewModel, - communityViewModel: CommunityViewModel, accountViewModel: AccountViewModel, commentEditViewModel: CommentEditViewModel, - commentReplyViewModel: CommentReplyViewModel, - createReportViewModel: CreateReportViewModel + commentReplyViewModel: CommentReplyViewModel ) { Log.d("jerboa", "got to inbox activity") @@ -109,14 +97,10 @@ fun InboxActivity( InboxTabs( padding = it, navController = navController, - personProfileViewModel = personProfileViewModel, commentEditViewModel = commentEditViewModel, commentReplyViewModel = commentReplyViewModel, inboxViewModel = inboxViewModel, - postViewModel = postViewModel, - communityViewModel = communityViewModel, homeViewModel = homeViewModel, - createReportViewModel = createReportViewModel, ctx = ctx, account = account, scope = scope @@ -128,28 +112,21 @@ fun InboxActivity( unreadCounts = homeViewModel.unreadCountResponse, onClickProfile = { account?.id?.also { - personClickWrapper( - personProfileViewModel = personProfileViewModel, - personId = it, - account = account, - navController = navController, - ctx = ctx - ) + navController.navigate(route = "profile/$it") } }, onClickInbox = { - inboxClickWrapper(inboxViewModel, account, navController, ctx) + account?.also { + navController.navigate(route = "inbox") + } ?: run { + loginFirstToast(ctx) + } }, onClickSaved = { account?.id?.also { - personClickWrapper( - personProfileViewModel = personProfileViewModel, - personId = it, - account = account, - navController = navController, - ctx = ctx, - saved = true - ) + navController.navigate(route = "profile/$it?saved=${true}") + } ?: run { + loginFirstToast(ctx) } }, navController = navController @@ -170,21 +147,16 @@ enum class InboxTab { @Composable fun InboxTabs( navController: NavController, - personProfileViewModel: PersonProfileViewModel, inboxViewModel: InboxViewModel, - communityViewModel: CommunityViewModel, homeViewModel: HomeViewModel, ctx: Context, account: Account?, scope: CoroutineScope, - postViewModel: PostViewModel, commentEditViewModel: CommentEditViewModel, commentReplyViewModel: CommentReplyViewModel, - createReportViewModel: CreateReportViewModel, padding: PaddingValues ) { val tabTitles = InboxTab.values().map { it.toString() } - val pagerState = rememberPagerState() Column( @@ -199,20 +171,21 @@ fun InboxTabs( tabPositions ) ) + }, + tabs = { + tabTitles.forEachIndexed { index, title -> + Tab( + selected = pagerState.currentPage == index, + onClick = { + scope.launch { + pagerState.animateScrollToPage(index) + } + }, + text = { Text(text = title) } + ) + } } - ) { - tabTitles.forEachIndexed { index, title -> - Tab( - selected = pagerState.currentPage == index, - onClick = { - scope.launch { - pagerState.animateScrollToPage(index) - } - }, - text = { Text(text = title) } - ) - } - } + ) if (inboxViewModel.loading.value) { LinearProgressIndicator(modifier = Modifier.fillMaxWidth()) } @@ -239,14 +212,16 @@ fun InboxTabs( } // act when end of list reached - LaunchedEffect(endOfListReached) { - account?.also { acct -> - if (inboxViewModel.replies.size > 0) { - inboxViewModel.fetchReplies( - account = acct, - nextPage = true, - ctx = ctx - ) + if (endOfListReached) { + LaunchedEffect(Unit) { + account?.also { acct -> + if (inboxViewModel.replies.size > 0) { + inboxViewModel.fetchReplies( + account = acct, + nextPage = true, + ctx = ctx + ) + } } } } @@ -286,19 +261,14 @@ fun InboxTabs( } }, onReplyClick = { commentView -> - commentReplyClickWrapper( - commentReplyViewModel = commentReplyViewModel, - parentCommentView = commentView, - postId = commentView.post.id, - navController = navController + commentReplyViewModel.initialize( + Either.Left(commentView) ) + navController.navigate("commentReply") }, onEditCommentClick = { commentView -> - commentEditClickWrapper( - commentEditViewModel, - commentView, - navController - ) + commentEditViewModel.initialize(commentView) + navController.navigate("commentEdit") }, onDeleteCommentClick = { commentView -> account?.also { acct -> @@ -310,11 +280,7 @@ fun InboxTabs( } }, onReportClick = { commentView -> - commentReportClickWrapper( - createReportViewModel, - commentView.comment.id, - navController - ) + navController.navigate("commentReport/${commentView.comment.id}") }, onSaveClick = { commentView -> account?.also { acct -> @@ -345,31 +311,13 @@ fun InboxTabs( } }, onPersonClick = { personId -> - personClickWrapper( - personProfileViewModel, - personId, - account, - navController, - ctx - ) + navController.navigate(route = "profile/$personId") }, onCommunityClick = { community -> - communityClickWrapper( - communityViewModel = communityViewModel, - communityId = community.id, - account = account, - navController = navController, - ctx = ctx - ) + navController.navigate(route = "community/${community.id}") }, onPostClick = { postId -> - postClickWrapper( - postViewModel = postViewModel, - postId = postId, - account = account, - navController = navController, - ctx = ctx - ) + navController.navigate(route = "post/$postId") }, showPostAndCommunityContext = true, showRead = true, @@ -396,14 +344,16 @@ fun InboxTabs( } // act when end of list reached - LaunchedEffect(endOfListReached) { - account?.also { acct -> - if (inboxViewModel.messages.size > 0) { - inboxViewModel.fetchPrivateMessages( - account = acct, - nextPage = true, - ctx = ctx - ) + if (endOfListReached) { + LaunchedEffect(Unit) { + account?.also { acct -> + if (inboxViewModel.messages.size > 0) { + inboxViewModel.fetchPrivateMessages( + account = acct, + nextPage = true, + ctx = ctx + ) + } } } } @@ -423,7 +373,7 @@ fun InboxTabs( LazyColumn( state = listState, modifier = Modifier.fillMaxSize() - // .simpleVerticalScrollbar(listState) + .simpleVerticalScrollbar(listState) ) { items( inboxViewModel.messages, @@ -447,13 +397,7 @@ fun InboxTabs( homeViewModel.updateUnreads(privateMessageView) }, onPersonClick = { personId -> - personClickWrapper( - personProfileViewModel, - personId, - account, - navController, - ctx - ) + navController.navigate(route = "profile/$personId") }, account = acct ) diff --git a/app/src/main/java/com/jerboa/ui/components/login/Login.kt b/app/src/main/java/com/jerboa/ui/components/login/Login.kt index 36d61608a..2a0b5685e 100644 --- a/app/src/main/java/com/jerboa/ui/components/login/Login.kt +++ b/app/src/main/java/com/jerboa/ui/components/login/Login.kt @@ -81,7 +81,8 @@ fun PasswordField( @Composable fun LoginForm( loading: Boolean = false, - onClickLogin: (form: Login, instance: String) -> Unit = { _: Login, _: String -> } + onClickLogin: (form: Login, instance: String) -> Unit = { _: Login, _: String -> }, + modifier: Modifier = Modifier ) { var instance by rememberSaveable { mutableStateOf("") } var username by rememberSaveable { mutableStateOf("") } @@ -98,7 +99,7 @@ fun LoginForm( ) Column( - modifier = Modifier + modifier = modifier .fillMaxSize(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally diff --git a/app/src/main/java/com/jerboa/ui/components/login/LoginActivity.kt b/app/src/main/java/com/jerboa/ui/components/login/LoginActivity.kt index a87e375cd..d4519b3b4 100644 --- a/app/src/main/java/com/jerboa/ui/components/login/LoginActivity.kt +++ b/app/src/main/java/com/jerboa/ui/components/login/LoginActivity.kt @@ -1,6 +1,7 @@ package com.jerboa.ui.components.login import android.util.Log +import androidx.compose.foundation.layout.padding import androidx.compose.material.MaterialTheme import androidx.compose.material.Scaffold import androidx.compose.material.Surface @@ -8,6 +9,7 @@ import androidx.compose.material.rememberScaffoldState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.navigation.NavController import com.jerboa.db.AccountViewModel @@ -37,9 +39,10 @@ fun LoginActivity( accounts = accounts ) }, - content = { + content = { padding -> LoginForm( loading = loginViewModel.loading, + modifier = Modifier.padding(padding), onClickLogin = { form, instance -> loginViewModel.login( navController = navController, diff --git a/app/src/main/java/com/jerboa/ui/components/person/PersonProfileActivity.kt b/app/src/main/java/com/jerboa/ui/components/person/PersonProfileActivity.kt index 52452f90f..c5860ef31 100644 --- a/app/src/main/java/com/jerboa/ui/components/person/PersonProfileActivity.kt +++ b/app/src/main/java/com/jerboa/ui/components/person/PersonProfileActivity.kt @@ -14,6 +14,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.navigation.NavController +import arrow.core.Either import com.google.accompanist.pager.ExperimentalPagerApi import com.google.accompanist.pager.HorizontalPager import com.google.accompanist.pager.pagerTabIndicatorOffset @@ -25,29 +26,19 @@ import com.jerboa.commentsToFlatNodes import com.jerboa.db.Account import com.jerboa.db.AccountViewModel import com.jerboa.isScrolledToEnd +import com.jerboa.loginFirstToast import com.jerboa.openLink import com.jerboa.scrollToTop import com.jerboa.ui.components.comment.CommentNodes import com.jerboa.ui.components.comment.edit.CommentEditViewModel -import com.jerboa.ui.components.comment.edit.commentEditClickWrapper import com.jerboa.ui.components.comment.reply.CommentReplyViewModel -import com.jerboa.ui.components.comment.reply.commentReplyClickWrapper import com.jerboa.ui.components.common.BottomAppBarAll import com.jerboa.ui.components.common.getCurrentAccount +import com.jerboa.ui.components.common.simpleVerticalScrollbar import com.jerboa.ui.components.community.CommunityLink -import com.jerboa.ui.components.community.CommunityViewModel -import com.jerboa.ui.components.community.communityClickWrapper import com.jerboa.ui.components.home.HomeViewModel -import com.jerboa.ui.components.inbox.InboxViewModel -import com.jerboa.ui.components.inbox.inboxClickWrapper import com.jerboa.ui.components.post.PostListings -import com.jerboa.ui.components.post.PostViewModel import com.jerboa.ui.components.post.edit.PostEditViewModel -import com.jerboa.ui.components.post.edit.postEditClickWrapper -import com.jerboa.ui.components.post.postClickWrapper -import com.jerboa.ui.components.report.CreateReportViewModel -import com.jerboa.ui.components.report.commentReportClickWrapper -import com.jerboa.ui.components.report.postReportClickWrapper import com.jerboa.ui.theme.MEDIUM_PADDING import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -57,15 +48,11 @@ fun PersonProfileActivity( savedMode: Boolean, navController: NavController, personProfileViewModel: PersonProfileViewModel, - postViewModel: PostViewModel, - communityViewModel: CommunityViewModel, accountViewModel: AccountViewModel, homeViewModel: HomeViewModel, - inboxViewModel: InboxViewModel, commentEditViewModel: CommentEditViewModel, commentReplyViewModel: CommentReplyViewModel, - postEditViewModel: PostEditViewModel, - createReportViewModel: CreateReportViewModel + postEditViewModel: PostEditViewModel ) { Log.d("jerboa", "got to person activity") @@ -93,12 +80,15 @@ fun PersonProfileActivity( onClickSortType = { sortType -> scrollToTop(scope, postListState) personProfileViewModel.fetchPersonDetails( - id = personProfileViewModel.personId.value!!, + idOrName = Either.Left( + personProfileViewModel.res!!.person_view + .person.id + ), account = account, clear = true, changeSortType = sortType, - ctx = ctx, - changeSavedOnly = savedMode + changeSavedOnly = savedMode, + ctx = ctx ) }, onBlockPersonClick = { @@ -120,16 +110,13 @@ fun PersonProfileActivity( padding = it, navController = navController, personProfileViewModel = personProfileViewModel, - postViewModel = postViewModel, - communityViewModel = communityViewModel, ctx = ctx, account = account, scope = scope, postListState = postListState, commentEditViewModel = commentEditViewModel, commentReplyViewModel = commentReplyViewModel, - postEditViewModel = postEditViewModel, - createReportViewModel = createReportViewModel + postEditViewModel = postEditViewModel ) }, bottomBar = { @@ -138,28 +125,21 @@ fun PersonProfileActivity( unreadCounts = homeViewModel.unreadCountResponse, onClickProfile = { account?.id?.also { - personClickWrapper( - personProfileViewModel = personProfileViewModel, - personId = it, - account = account, - navController = navController, - ctx = ctx - ) + navController.navigate(route = "profile/$it") } }, onClickInbox = { - inboxClickWrapper(inboxViewModel, account, navController, ctx) + account?.also { + navController.navigate(route = "inbox") + } ?: run { + loginFirstToast(ctx) + } }, onClickSaved = { account?.id?.also { - personClickWrapper( - personProfileViewModel = personProfileViewModel, - personId = it, - account = account, - navController = navController, - ctx = ctx, - saved = true - ) + navController.navigate(route = "profile/$it?saved=${true}") + } ?: run { + loginFirstToast(ctx) } }, navController = navController @@ -181,16 +161,13 @@ fun UserTabs( savedMode: Boolean, navController: NavController, personProfileViewModel: PersonProfileViewModel, - communityViewModel: CommunityViewModel, ctx: Context, account: Account?, scope: CoroutineScope, postListState: LazyListState, - postViewModel: PostViewModel, commentEditViewModel: CommentEditViewModel, commentReplyViewModel: CommentReplyViewModel, postEditViewModel: PostEditViewModel, - createReportViewModel: CreateReportViewModel, padding: PaddingValues ) { val tabTitles = if (savedMode) { @@ -248,7 +225,7 @@ fun UserTabs( LazyColumn( state = listState, modifier = Modifier.fillMaxSize() - // .simpleVerticalScrollbar(listState), + .simpleVerticalScrollbar(listState) ) { item { personProfileViewModel.res?.person_view?.also { @@ -275,13 +252,7 @@ fun UserTabs( community = cmv.community, modifier = Modifier.padding(MEDIUM_PADDING), onClick = { community -> - communityClickWrapper( - communityViewModel, - community.id, - account, - navController, - ctx = ctx - ) + navController.navigate(route = "community/${community.id}") } ) } @@ -327,13 +298,7 @@ fun UserTabs( } }, onPostClick = { postView -> - postClickWrapper( - postViewModel = postViewModel, - postId = postView.post.id, - account = account, - navController = navController, - ctx = ctx - ) + navController.navigate(route = "post/${postView.post.id}") }, onPostLinkClick = { url -> openLink(url, ctx) @@ -348,11 +313,8 @@ fun UserTabs( } }, onEditPostClick = { postView -> - postEditClickWrapper( - postEditViewModel, - postView, - navController - ) + postEditViewModel.initialize(postView) + navController.navigate("postEdit") }, onDeletePostClick = { postView -> account?.also { acct -> @@ -364,38 +326,22 @@ fun UserTabs( } }, onReportClick = { postView -> - postReportClickWrapper( - createReportViewModel, - postView.post.id, - navController - ) + navController.navigate("postReport/${postView.post.id}") }, onCommunityClick = { community -> - communityClickWrapper( - communityViewModel, - community.id, - account, - navController, - ctx = ctx - ) + navController.navigate(route = "community/${community.id}") }, onPersonClick = { personId -> - personClickWrapper( - personProfileViewModel = personProfileViewModel, - personId = personId, - account = account, - navController = navController, - ctx = ctx - ) + navController.navigate(route = "profile/$personId") }, onSwipeRefresh = { - personProfileViewModel.personId.value?.also { + personProfileViewModel.res?.person_view?.person?.id?.also { personProfileViewModel.fetchPersonDetails( - id = it, + idOrName = Either.Left(it), account = account, clear = true, - ctx = ctx, - changeSavedOnly = savedMode + changeSavedOnly = savedMode, + ctx = ctx ) } }, @@ -404,13 +350,13 @@ fun UserTabs( personProfileViewModel.posts.isNotEmpty(), isScrolledToEnd = { if (personProfileViewModel.posts.size > 0) { - personProfileViewModel.personId.value?.also { + personProfileViewModel.res?.person_view?.person?.id?.also { personProfileViewModel.fetchPersonDetails( - id = it, + idOrName = Either.Left(it), account = account, nextPage = true, - ctx = ctx, - changeSavedOnly = savedMode + changeSavedOnly = savedMode, + ctx = ctx ) } } @@ -434,16 +380,18 @@ fun UserTabs( } // act when end of list reached - LaunchedEffect(endOfListReached) { - if (personProfileViewModel.comments.size > 0) { - personProfileViewModel.personId.value?.also { - personProfileViewModel.fetchPersonDetails( - id = it, - account = account, - nextPage = true, - ctx = ctx, - changeSavedOnly = savedMode - ) + if (endOfListReached) { + LaunchedEffect(Unit) { + if (personProfileViewModel.comments.size > 0) { + personProfileViewModel.res?.person_view?.person?.id?.also { + personProfileViewModel.fetchPersonDetails( + idOrName = Either.Left(it), + account = account, + nextPage = true, + changeSavedOnly = savedMode, + ctx = ctx + ) + } } } } @@ -451,13 +399,13 @@ fun UserTabs( SwipeRefresh( state = rememberSwipeRefreshState(loading), onRefresh = { - personProfileViewModel.personId.value?.also { + personProfileViewModel.res?.person_view?.person?.id?.also { personProfileViewModel.fetchPersonDetails( - id = it, + idOrName = Either.Left(it), account = account, clear = true, - ctx = ctx, - changeSavedOnly = savedMode + changeSavedOnly = savedMode, + ctx = ctx ) } } @@ -486,12 +434,8 @@ fun UserTabs( } }, onReplyClick = { commentView -> - commentReplyClickWrapper( - commentReplyViewModel = commentReplyViewModel, - parentCommentView = commentView, - postId = commentView.post.id, - navController = navController - ) + commentReplyViewModel.initialize(Either.Left(commentView)) + navController.navigate("commentReply") }, onSaveClick = { commentView -> account?.also { acct -> @@ -503,38 +447,17 @@ fun UserTabs( } }, onPersonClick = { personId -> - personClickWrapper( - personProfileViewModel, - personId, - account, - navController, - ctx - ) + navController.navigate(route = "profile/$personId") }, onCommunityClick = { community -> - communityClickWrapper( - communityViewModel = communityViewModel, - communityId = community.id, - account = account, - navController = navController, - ctx = ctx - ) + navController.navigate(route = "community/${community.id}") }, onPostClick = { postId -> - postClickWrapper( - postViewModel = postViewModel, - postId = postId, - account = account, - navController = navController, - ctx = ctx - ) + navController.navigate(route = "post/$postId") }, onEditCommentClick = { commentView -> - commentEditClickWrapper( - commentEditViewModel, - commentView, - navController - ) + commentEditViewModel.initialize(commentView) + navController.navigate("commentEdit") }, onDeleteCommentClick = { commentView -> account?.also { acct -> @@ -546,11 +469,7 @@ fun UserTabs( } }, onReportClick = { commentView -> - commentReportClickWrapper( - createReportViewModel, - commentView.comment.id, - navController - ) + navController.navigate("commentReport/${commentView.comment.id}") }, onBlockCreatorClick = { account?.also { acct -> diff --git a/app/src/main/java/com/jerboa/ui/components/person/PersonProfileLink.kt b/app/src/main/java/com/jerboa/ui/components/person/PersonProfileLink.kt index 98429f042..cf9e63388 100644 --- a/app/src/main/java/com/jerboa/ui/components/person/PersonProfileLink.kt +++ b/app/src/main/java/com/jerboa/ui/components/person/PersonProfileLink.kt @@ -1,6 +1,5 @@ package com.jerboa.ui.components.person -import android.content.Context import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row @@ -16,10 +15,8 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview -import androidx.navigation.NavController import com.jerboa.datatypes.PersonSafe import com.jerboa.datatypes.samplePersonSafe -import com.jerboa.db.Account import com.jerboa.personNameShown import com.jerboa.ui.components.common.CircularIcon import com.jerboa.ui.theme.SMALL_PADDING @@ -123,21 +120,3 @@ fun PersonProfileLinkPreviewTags() { onClick = {} ) } - -fun personClickWrapper( - personProfileViewModel: PersonProfileViewModel, - personId: Int, - account: Account?, - navController: NavController, - ctx: Context, - saved: Boolean = false -) { - personProfileViewModel.fetchPersonDetails( - id = personId, - account = account, - clear = true, - ctx = ctx, - changeSavedOnly = saved - ) - navController.navigate(route = "profile?saved=$saved") -} diff --git a/app/src/main/java/com/jerboa/ui/components/person/PersonProfileViewModel.kt b/app/src/main/java/com/jerboa/ui/components/person/PersonProfileViewModel.kt index b3d40a342..9f43d5a4a 100644 --- a/app/src/main/java/com/jerboa/ui/components/person/PersonProfileViewModel.kt +++ b/app/src/main/java/com/jerboa/ui/components/person/PersonProfileViewModel.kt @@ -8,6 +8,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import arrow.core.Either import com.jerboa.VoteType import com.jerboa.api.API import com.jerboa.api.retrofitErrorHandler @@ -30,7 +31,6 @@ class PersonProfileViewModel : ViewModel() { var res by mutableStateOf(null) private set - var personId = mutableStateOf(null) var loading = mutableStateOf(false) private set var posts = mutableStateListOf() @@ -41,8 +41,7 @@ class PersonProfileViewModel : ViewModel() { private set var sortType = mutableStateOf(SortType.New) private set - var savedOnly = mutableStateOf(false) - private set + private var savedOnly = mutableStateOf(false) fun likePost(voteType: VoteType, postView: PostView, account: Account?, ctx: Context) { likePostRoutine(mutableStateOf(postView), posts, voteType, account, ctx, viewModelScope) @@ -88,7 +87,7 @@ class PersonProfileViewModel : ViewModel() { } fun fetchPersonDetails( - id: Int, + idOrName: Either, account: Account?, clear: Boolean = false, nextPage: Boolean = false, @@ -99,10 +98,11 @@ class PersonProfileViewModel : ViewModel() { val api = API.getInstance() viewModelScope.launch { + val idOrNameStr = idOrName.fold({ it.toString() }, { it }) try { Log.d( "jerboa", - "Fetching person details id: $id" + "Fetching person details: $idOrNameStr" ) loading.value = true @@ -123,10 +123,11 @@ class PersonProfileViewModel : ViewModel() { savedOnly.value = it } - personId.value = id - + val personId = idOrName.fold({ it }, { null }) + val userName = idOrName.fold({ null }, { it }) val form = GetPersonDetails( - person_id = id, + person_id = personId, + username = userName, auth = account?.jwt, sort = sortType.value.toString(), page = page.value, diff --git a/app/src/main/java/com/jerboa/ui/components/post/PostActivity.kt b/app/src/main/java/com/jerboa/ui/components/post/PostActivity.kt index a1dadf614..71838e1cc 100644 --- a/app/src/main/java/com/jerboa/ui/components/post/PostActivity.kt +++ b/app/src/main/java/com/jerboa/ui/components/post/PostActivity.kt @@ -15,6 +15,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.navigation.NavController +import arrow.core.Either import com.google.accompanist.swiperefresh.SwipeRefresh import com.google.accompanist.swiperefresh.rememberSwipeRefreshState import com.jerboa.VoteType @@ -23,32 +24,19 @@ import com.jerboa.isModerator import com.jerboa.openLink import com.jerboa.ui.components.comment.commentNodeItems import com.jerboa.ui.components.comment.edit.CommentEditViewModel -import com.jerboa.ui.components.comment.edit.commentEditClickWrapper import com.jerboa.ui.components.comment.reply.CommentReplyViewModel -import com.jerboa.ui.components.comment.reply.commentReplyClickWrapper import com.jerboa.ui.components.common.SimpleTopAppBar import com.jerboa.ui.components.common.getCurrentAccount import com.jerboa.ui.components.common.simpleVerticalScrollbar -import com.jerboa.ui.components.community.CommunityViewModel -import com.jerboa.ui.components.community.communityClickWrapper -import com.jerboa.ui.components.person.PersonProfileViewModel -import com.jerboa.ui.components.person.personClickWrapper import com.jerboa.ui.components.post.edit.PostEditViewModel -import com.jerboa.ui.components.post.edit.postEditClickWrapper -import com.jerboa.ui.components.report.CreateReportViewModel -import com.jerboa.ui.components.report.commentReportClickWrapper -import com.jerboa.ui.components.report.postReportClickWrapper @Composable fun PostActivity( postViewModel: PostViewModel, - communityViewModel: CommunityViewModel, - personProfileViewModel: PersonProfileViewModel, accountViewModel: AccountViewModel, commentEditViewModel: CommentEditViewModel, commentReplyViewModel: CommentReplyViewModel, postEditViewModel: PostEditViewModel, - createReportViewModel: CreateReportViewModel, navController: NavController ) { Log.d("jerboa", "got to post activity") @@ -143,40 +131,21 @@ fun PostActivity( } }, onReplyClick = { postView -> - commentReplyClickWrapper( - commentReplyViewModel = commentReplyViewModel, - postId = postView.post.id, - postView = postView, - navController = navController - ) + commentReplyViewModel.initialize(Either.Right(postView)) + navController.navigate("commentReply") }, onPostLinkClick = { url -> openLink(url, ctx) }, onCommunityClick = { community -> - communityClickWrapper( - communityViewModel, - community.id, - account, - navController, - ctx - ) + navController.navigate(route = "community/${community.id}") }, onPersonClick = { personId -> - personClickWrapper( - personProfileViewModel, - personId, - account, - navController, - ctx - ) + navController.navigate(route = "profile/$personId") }, onEditPostClick = { postView -> - postEditClickWrapper( - postEditViewModel, - postView, - navController - ) + postEditViewModel.initialize(postView) + navController.navigate("postEdit") }, onDeletePostClick = { account?.also { acct -> @@ -187,11 +156,7 @@ fun PostActivity( } }, onReportClick = { postView -> - postReportClickWrapper( - createReportViewModel, - postView.post.id, - navController - ) + navController.navigate("postReport/${postView.post.id}") }, onPostClick = {}, // Do nothing showReply = true, @@ -231,12 +196,8 @@ fun PostActivity( } }, onReplyClick = { commentView -> - commentReplyClickWrapper( - commentReplyViewModel = commentReplyViewModel, - parentCommentView = commentView, - postId = commentView.post.id, - navController = navController - ) + commentReplyViewModel.initialize(Either.Left(commentView)) + navController.navigate("commentReply") }, onSaveClick = { commentView -> account?.also { acct -> @@ -248,20 +209,11 @@ fun PostActivity( } }, onPersonClick = { personId -> - personClickWrapper( - personProfileViewModel, - personId, - account, - navController, - ctx - ) + navController.navigate(route = "profile/$personId") }, onEditCommentClick = { commentView -> - commentEditClickWrapper( - commentEditViewModel, - commentView, - navController - ) + commentEditViewModel.initialize(commentView) + navController.navigate("commentEdit") }, onDeleteCommentClick = { commentView -> account?.also { acct -> @@ -273,10 +225,9 @@ fun PostActivity( } }, onReportClick = { commentView -> - commentReportClickWrapper( - createReportViewModel, - commentView.comment.id, - navController + navController.navigate( + "commentReport/${commentView.comment + .id}" ) }, onBlockCreatorClick = { @@ -289,13 +240,7 @@ fun PostActivity( } }, onCommunityClick = { community -> - communityClickWrapper( - communityViewModel, - community.id, - account, - navController, - ctx - ) + navController.navigate(route = "community/${community.id}") }, onPostClick = {}, // Do nothing account = account, diff --git a/app/src/main/java/com/jerboa/ui/components/post/PostListing.kt b/app/src/main/java/com/jerboa/ui/components/post/PostListing.kt index 441fabf75..6e4d6c48d 100644 --- a/app/src/main/java/com/jerboa/ui/components/post/PostListing.kt +++ b/app/src/main/java/com/jerboa/ui/components/post/PostListing.kt @@ -1,6 +1,5 @@ package com.jerboa.ui.components.post -import android.content.Context import android.widget.Toast import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* @@ -16,7 +15,6 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController import com.google.accompanist.flowlayout.FlowCrossAxisAlignment import com.google.accompanist.flowlayout.FlowRow @@ -36,9 +34,9 @@ fun PostHeaderLine( onCommunityClick: (community: CommunitySafe) -> Unit, onPersonClick: (personId: Int) -> Unit, isModerator: Boolean, + modifier: Modifier = Modifier, isSameInstance: Boolean = false, - showCommunityName: Boolean = true, - modifier: Modifier = Modifier + showCommunityName: Boolean = true ) { FlowRow( crossAxisAlignment = FlowCrossAxisAlignment.Center, @@ -300,9 +298,9 @@ fun PostFooterLine( onCommunityClick: (community: CommunitySafe) -> Unit, onBlockCreatorClick: (person: PersonSafe) -> Unit, onBlockCommunityClick: (community: CommunitySafe) -> Unit, + modifier: Modifier = Modifier, showReply: Boolean = false, - account: Account?, - modifier: Modifier = Modifier + account: Account? ) { // TODO val score = postView.counts.score val myVote = postView.my_vote @@ -627,22 +625,6 @@ fun PostListingHeaderPreview() { SimpleTopAppBar("Post", navController) } -fun postClickWrapper( - postViewModel: PostViewModel, - postId: Int, - account: Account?, - navController: NavController, - ctx: Context -) { - postViewModel.fetchPost( - id = postId, - account = account, - clear = true, - ctx = ctx - ) - navController.navigate(route = "post") -} - @Composable fun MetadataCard(post: Post) { Card( diff --git a/app/src/main/java/com/jerboa/ui/components/post/PostListings.kt b/app/src/main/java/com/jerboa/ui/components/post/PostListings.kt index 2aade1468..abce31c7f 100644 --- a/app/src/main/java/com/jerboa/ui/components/post/PostListings.kt +++ b/app/src/main/java/com/jerboa/ui/components/post/PostListings.kt @@ -96,8 +96,10 @@ fun PostListings( } // Act when end of list reached - LaunchedEffect(endOfListReached) { - isScrolledToEnd() + if (endOfListReached) { + LaunchedEffect(Unit) { + isScrolledToEnd() + } } } diff --git a/app/src/main/java/com/jerboa/ui/components/post/PostRoutines.kt b/app/src/main/java/com/jerboa/ui/components/post/PostRoutines.kt index a69215a4c..5348d5657 100644 --- a/app/src/main/java/com/jerboa/ui/components/post/PostRoutines.kt +++ b/app/src/main/java/com/jerboa/ui/components/post/PostRoutines.kt @@ -2,7 +2,7 @@ package com.jerboa.ui.components.post import android.content.Context import androidx.compose.runtime.MutableState -import androidx.compose.runtime.mutableStateOf +import arrow.core.Either import com.jerboa.VoteType import com.jerboa.api.deletePostWrapper import com.jerboa.api.fetchPostsWrapper @@ -18,14 +18,13 @@ import kotlinx.coroutines.launch fun fetchPostsRoutine( posts: MutableList, + communityIdOrName: Either? = null, loading: MutableState, page: MutableState, - communityId: MutableState = mutableStateOf(null), listingType: MutableState, sortType: MutableState, nextPage: Boolean = false, clear: Boolean = false, - changeCommunityId: Int? = null, changeListingType: ListingType? = null, changeSortType: SortType? = null, account: Account?, @@ -51,14 +50,10 @@ fun fetchPostsRoutine( sortType.value = it } - changeCommunityId?.also { - communityId.value = it - } - val newPosts = fetchPostsWrapper( account = account, ctx = ctx, - communityId = communityId.value, + communityIdOrName = communityIdOrName, sortType = sortType.value, listingType = listingType.value, page = page.value diff --git a/app/src/main/java/com/jerboa/ui/components/post/create/CreatePost.kt b/app/src/main/java/com/jerboa/ui/components/post/create/CreatePost.kt index 699402061..72bb0e26d 100644 --- a/app/src/main/java/com/jerboa/ui/components/post/create/CreatePost.kt +++ b/app/src/main/java/com/jerboa/ui/components/post/create/CreatePost.kt @@ -3,9 +3,9 @@ package com.jerboa.ui.components.post.create import android.net.Uri import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.verticalScroll import androidx.compose.material.* import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add @@ -26,7 +26,6 @@ import com.jerboa.db.Account import com.jerboa.ui.components.common.CircularIcon import com.jerboa.ui.components.common.MarkdownTextField import com.jerboa.ui.components.common.PickImage -import com.jerboa.ui.components.common.simpleVerticalScrollbar import com.jerboa.ui.theme.* import com.jerboa.validatePostName import com.jerboa.validateUrl @@ -108,120 +107,106 @@ fun CreatePostBody( (community !== null) ) - val listState = rememberLazyListState() + val scrollState = rememberScrollState() - LazyColumn( - state = listState, + Column( modifier = Modifier .padding(MEDIUM_PADDING) .fillMaxWidth() - .simpleVerticalScrollbar(listState), + .verticalScroll(scrollState), verticalArrangement = Arrangement.spacedBy(MEDIUM_PADDING) ) { - item { - OutlinedTextField( - value = name, - onValueChange = onNameChange, - isError = nameField.hasError, - label = { - Text(text = nameField.label) - }, - modifier = Modifier - .fillMaxWidth() - ) - } - item { - OutlinedTextField( - label = { - Text(text = urlField.label) - }, - value = url, - isError = urlField.hasError, - onValueChange = onUrlChange, - keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Uri), - modifier = Modifier - .fillMaxWidth() - ) - } - item { - suggestedTitle?.also { - Text( - text = "copy suggested title: $it", - style = MaterialTheme.typography.subtitle2, - color = MaterialTheme.colors.onBackground.muted, - modifier = Modifier.clickable { onNameChange(it) } - ) - } - } - item { - PickImage( - onPickedImage = onPickedImage, - image = image, - modifier = Modifier.fillMaxWidth(), - horizontalAlignment = Alignment.End - ) - } - item { - MarkdownTextField( - text = body, - onTextChange = onBodyChange, - modifier = Modifier - .fillMaxWidth(), - outlined = true, - account = account, - focusImmediate = false, - placeholder = "Body" + OutlinedTextField( + value = name, + onValueChange = onNameChange, + isError = nameField.hasError, + label = { + Text(text = nameField.label) + }, + modifier = Modifier + .fillMaxWidth() + ) + OutlinedTextField( + label = { + Text(text = urlField.label) + }, + value = url, + isError = urlField.hasError, + onValueChange = onUrlChange, + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Uri), + modifier = Modifier + .fillMaxWidth() + ) + suggestedTitle?.also { + Text( + text = "copy suggested title: $it", + style = MaterialTheme.typography.subtitle2, + color = MaterialTheme.colors.onBackground.muted, + modifier = Modifier.clickable { onNameChange(it) } ) } - item { - Box { - community?.also { - OutlinedTextField( - value = community.name, - readOnly = true, - onValueChange = {}, // TODO what? - label = { - Text("Community") - }, - leadingIcon = { - community.icon?.let { - CircularIcon( - icon = it, - size = ICON_SIZE, - thumbnailSize = THUMBNAIL_SIZE - ) - } - }, - trailingIcon = { - Icon( - imageVector = Icons.Default.ArrowDropDown, - contentDescription = "TODO" + PickImage( + onPickedImage = onPickedImage, + image = image, + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.End + ) + MarkdownTextField( + text = body, + onTextChange = onBodyChange, + modifier = Modifier.fillMaxWidth(), + outlined = true, + account = account, + focusImmediate = false, + placeholder = "Body" + ) + Box { + community?.also { + OutlinedTextField( + value = community.name, + readOnly = true, + onValueChange = {}, // TODO what? + label = { + Text("Community") + }, + leadingIcon = { + community.icon?.let { + CircularIcon( + icon = it, + size = ICON_SIZE, + thumbnailSize = THUMBNAIL_SIZE ) - }, - modifier = Modifier - .fillMaxWidth() - ) - } ?: run { - OutlinedTextField( - value = "", - onValueChange = {}, // TODO what? - label = { - Text("Community") - }, - modifier = Modifier - .fillMaxWidth() - ) - } - // A box to draw over the textview and override clicks - Box( + } + }, + trailingIcon = { + Icon( + imageVector = Icons.Default.ArrowDropDown, + contentDescription = "TODO" + ) + }, + modifier = Modifier + .fillMaxWidth() + ) + } ?: run { + OutlinedTextField( + value = "", + onValueChange = {}, // TODO what? + label = { + Text("Community") + }, modifier = Modifier - .height(60.dp) .fillMaxWidth() - .clickable { - navController.navigate("communityList?select=true") - } ) } + // A box to draw over the textview and override clicks + Box( + modifier = Modifier + .height(60.dp) + .fillMaxWidth() + .clickable { + navController.navigate("communityList?select=true") + } + ) } } } diff --git a/app/src/main/java/com/jerboa/ui/components/post/edit/PostEdit.kt b/app/src/main/java/com/jerboa/ui/components/post/edit/PostEdit.kt index 85efd7652..c55ab5d4a 100644 --- a/app/src/main/java/com/jerboa/ui/components/post/edit/PostEdit.kt +++ b/app/src/main/java/com/jerboa/ui/components/post/edit/PostEdit.kt @@ -17,7 +17,6 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController -import com.jerboa.datatypes.PostView import com.jerboa.db.Account import com.jerboa.ui.components.common.MarkdownTextField import com.jerboa.ui.components.common.PickImage @@ -25,7 +24,6 @@ import com.jerboa.ui.theme.APP_BAR_ELEVATION import com.jerboa.ui.theme.MEDIUM_PADDING import com.jerboa.validatePostName import com.jerboa.validateUrl -import org.w3c.dom.Text @Composable fun EditPostHeader( @@ -90,7 +88,8 @@ fun EditPostBody( onUrlChange: (url: String) -> Unit, onPickedImage: (image: Uri) -> Unit, formValid: (valid: Boolean) -> Unit, - account: Account? + account: Account?, + modifier: Modifier = Modifier ) { val nameField = validatePostName(name) val urlField = validateUrl(url) @@ -101,7 +100,7 @@ fun EditPostBody( ) Column( - modifier = Modifier + modifier = modifier .padding(MEDIUM_PADDING) .fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(MEDIUM_PADDING) @@ -158,12 +157,3 @@ fun EditPostBodyPreview() { account = null ) } - -fun postEditClickWrapper( - postEditViewModel: PostEditViewModel, - postView: PostView, - navController: NavController -) { - postEditViewModel.setPostView(postView) - navController.navigate("postEdit") -} diff --git a/app/src/main/java/com/jerboa/ui/components/post/edit/PostEditActivity.kt b/app/src/main/java/com/jerboa/ui/components/post/edit/PostEditActivity.kt index 9edc6735e..f38e90307 100644 --- a/app/src/main/java/com/jerboa/ui/components/post/edit/PostEditActivity.kt +++ b/app/src/main/java/com/jerboa/ui/components/post/edit/PostEditActivity.kt @@ -3,6 +3,7 @@ package com.jerboa.ui.components.post.edit import android.util.Log import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding import androidx.compose.material.LinearProgressIndicator import androidx.compose.material.MaterialTheme import androidx.compose.material.Scaffold @@ -39,7 +40,7 @@ fun PostEditActivity( val account = getCurrentAccount(accountViewModel = accountViewModel) val scope = rememberCoroutineScope() - val pv = postEditViewModel.postView.value + val pv = postEditViewModel.postView var name by rememberSaveable { mutableStateOf(pv?.post?.name.orEmpty()) } var url by rememberSaveable { mutableStateOf(pv?.post?.url.orEmpty()) } var body by rememberSaveable(stateSaver = TextFieldValue.Saver) { @@ -86,7 +87,7 @@ fun PostEditActivity( } } }, - content = { + content = { padding -> EditPostBody( name = name, onNameChange = { name = it }, @@ -103,7 +104,8 @@ fun PostEditActivity( } } }, - account = account + account = account, + modifier = Modifier.padding(padding) ) } ) diff --git a/app/src/main/java/com/jerboa/ui/components/post/edit/PostEditViewModel.kt b/app/src/main/java/com/jerboa/ui/components/post/edit/PostEditViewModel.kt index 0e08a3364..0c0b23f6a 100644 --- a/app/src/main/java/com/jerboa/ui/components/post/edit/PostEditViewModel.kt +++ b/app/src/main/java/com/jerboa/ui/components/post/edit/PostEditViewModel.kt @@ -19,15 +19,15 @@ import kotlinx.coroutines.launch class PostEditViewModel : ViewModel() { - var postView = mutableStateOf(null) + var postView by mutableStateOf(null) private set var loading by mutableStateOf(false) private set - fun setPostView( + fun initialize( newPostView: PostView ) { - postView.value = newPostView + postView = newPostView } fun editPost( @@ -43,9 +43,9 @@ class PostEditViewModel : ViewModel() { homeViewModel: HomeViewModel ) { viewModelScope.launch { - postView.value?.also { pv -> + postView?.also { pv -> loading = true - postView.value = editPostWrapper( + postView = editPostWrapper( postView = pv, account = account, body = body, @@ -53,10 +53,10 @@ class PostEditViewModel : ViewModel() { name = name, ctx = ctx ) - postViewModel.postView.value = postView.value - findAndUpdatePost(personProfileViewModel.posts, postView.value) - findAndUpdatePost(communityViewModel.posts, postView.value) - findAndUpdatePost(homeViewModel.posts, postView.value) + postViewModel.postView.value = postView + findAndUpdatePost(personProfileViewModel.posts, postView) + findAndUpdatePost(communityViewModel.posts, postView) + findAndUpdatePost(homeViewModel.posts, postView) loading = false navController.popBackStack() diff --git a/app/src/main/java/com/jerboa/ui/components/privatemessage/PrivateMessageReply.kt b/app/src/main/java/com/jerboa/ui/components/privatemessage/PrivateMessageReply.kt index cd54cf973..9a924043d 100644 --- a/app/src/main/java/com/jerboa/ui/components/privatemessage/PrivateMessageReply.kt +++ b/app/src/main/java/com/jerboa/ui/components/privatemessage/PrivateMessageReply.kt @@ -3,9 +3,9 @@ package com.jerboa.ui.components.privatemessage import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.selection.SelectionContainer +import androidx.compose.foundation.verticalScroll import androidx.compose.material.* import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Close @@ -20,7 +20,6 @@ import com.jerboa.datatypes.PrivateMessageView import com.jerboa.datatypes.samplePrivateMessageView import com.jerboa.db.Account import com.jerboa.ui.components.common.MarkdownTextField -import com.jerboa.ui.components.common.simpleVerticalScrollbar import com.jerboa.ui.theme.APP_BAR_ELEVATION import com.jerboa.ui.theme.LARGE_PADDING import com.jerboa.ui.theme.MEDIUM_PADDING @@ -107,31 +106,25 @@ fun PrivateMessageReply( reply: TextFieldValue, onReplyChange: (TextFieldValue) -> Unit, onPersonClick: (personId: Int) -> Unit, - account: Account? + account: Account?, + modifier: Modifier = Modifier ) { - val listState = rememberLazyListState() + val scrollState = rememberScrollState() - LazyColumn( - state = listState, - modifier = Modifier.simpleVerticalScrollbar(listState) + Column( + modifier = modifier.verticalScroll(scrollState) ) { - item { - RepliedPrivateMessage( - privateMessageView = privateMessageView, - onPersonClick = onPersonClick - ) - } - item { - Divider(modifier = Modifier.padding(vertical = LARGE_PADDING)) - } - item { - MarkdownTextField( - text = reply, - onTextChange = onReplyChange, - account = account, - modifier = Modifier.fillMaxWidth(), - placeholder = "Type your message" - ) - } + RepliedPrivateMessage( + privateMessageView = privateMessageView, + onPersonClick = onPersonClick + ) + Divider(modifier = Modifier.padding(vertical = LARGE_PADDING)) + MarkdownTextField( + text = reply, + onTextChange = onReplyChange, + account = account, + modifier = Modifier.fillMaxWidth(), + placeholder = "Type your message" + ) } } diff --git a/app/src/main/java/com/jerboa/ui/components/privatemessage/PrivateMessageReplyActivity.kt b/app/src/main/java/com/jerboa/ui/components/privatemessage/PrivateMessageReplyActivity.kt index 714735d10..ac047db67 100644 --- a/app/src/main/java/com/jerboa/ui/components/privatemessage/PrivateMessageReplyActivity.kt +++ b/app/src/main/java/com/jerboa/ui/components/privatemessage/PrivateMessageReplyActivity.kt @@ -2,6 +2,7 @@ package com.jerboa.ui.components.privatemessage import android.util.Log import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding import androidx.compose.material.LinearProgressIndicator import androidx.compose.material.MaterialTheme import androidx.compose.material.Scaffold @@ -17,14 +18,11 @@ import com.jerboa.datatypes.api.CreatePrivateMessage import com.jerboa.db.AccountViewModel import com.jerboa.ui.components.common.getCurrentAccount import com.jerboa.ui.components.inbox.InboxViewModel -import com.jerboa.ui.components.person.PersonProfileViewModel -import com.jerboa.ui.components.person.personClickWrapper @Composable fun PrivateMessageReplyActivity( inboxViewModel: InboxViewModel, accountViewModel: AccountViewModel, - personProfileViewModel: PersonProfileViewModel, navController: NavController ) { Log.d("jerboa", "got to private message reply activity") @@ -63,7 +61,7 @@ fun PrivateMessageReplyActivity( } ) }, - content = { + content = { padding -> if (inboxViewModel.privateMessageReplyLoading.value) { LinearProgressIndicator(modifier = Modifier.fillMaxWidth()) } else { @@ -74,14 +72,9 @@ fun PrivateMessageReplyActivity( reply = reply, onReplyChange = { reply = it }, onPersonClick = { personId -> - personClickWrapper( - personProfileViewModel, - personId, - account, - navController, - ctx - ) - } + navController.navigate(route = "profile/$personId") + }, + modifier = Modifier.padding(padding) ) } } diff --git a/app/src/main/java/com/jerboa/ui/components/report/CreateReport.kt b/app/src/main/java/com/jerboa/ui/components/report/CreateReport.kt index 8aede7446..edd58485e 100644 --- a/app/src/main/java/com/jerboa/ui/components/report/CreateReport.kt +++ b/app/src/main/java/com/jerboa/ui/components/report/CreateReport.kt @@ -1,8 +1,9 @@ package com.jerboa.ui.components.report +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.material.* import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Close @@ -14,7 +15,6 @@ import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController import com.jerboa.db.Account import com.jerboa.ui.components.common.MarkdownTextField -import com.jerboa.ui.components.common.simpleVerticalScrollbar import com.jerboa.ui.theme.APP_BAR_ELEVATION @Composable @@ -73,38 +73,17 @@ fun CreateReportBody( onReasonChange: (TextFieldValue) -> Unit, account: Account? ) { - val listState = rememberLazyListState() + val scrollState = rememberScrollState() - LazyColumn( - state = listState, - modifier = Modifier.simpleVerticalScrollbar(listState) + Column( + modifier = Modifier.verticalScroll(scrollState) ) { - item { - MarkdownTextField( - text = reason, - onTextChange = onReasonChange, - account = account, - modifier = Modifier.fillMaxWidth(), - placeholder = "Type your reason" - ) - } + MarkdownTextField( + text = reason, + onTextChange = onReasonChange, + account = account, + modifier = Modifier.fillMaxWidth(), + placeholder = "Type your reason" + ) } } - -fun commentReportClickWrapper( - createReportViewModel: CreateReportViewModel, - commentId: Int, - navController: NavController -) { - createReportViewModel.setCommentId(commentId) - navController.navigate("commentReport") -} - -fun postReportClickWrapper( - createReportViewModel: CreateReportViewModel, - postId: Int, - navController: NavController -) { - createReportViewModel.setPostId(postId) - navController.navigate("postReport") -} diff --git a/app/src/main/java/com/jerboa/ui/components/settings/Settings.kt b/app/src/main/java/com/jerboa/ui/components/settings/Settings.kt index 6809af837..eb9274ca0 100644 --- a/app/src/main/java/com/jerboa/ui/components/settings/Settings.kt +++ b/app/src/main/java/com/jerboa/ui/components/settings/Settings.kt @@ -28,15 +28,6 @@ import com.jerboa.ui.components.home.SiteViewModel import com.jerboa.ui.theme.* import kotlinx.coroutines.launch -fun settingsClickWrapper( - navController: NavController, - account: Account? -) { - account.also { - navController.navigate(route = "settings") - } -} - @Composable fun SettingsHeader( navController: NavController = rememberNavController() @@ -95,7 +86,7 @@ fun SettingsTextField( @Composable fun ImageWithClose( onClick: () -> Unit, - composable: @Composable() () -> Unit // ktlint-disable annotation + composable: @Composable () -> Unit ) { Box(contentAlignment = Alignment.TopEnd) { composable()