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()