Skip to content

Commit

Permalink
Adding ability to remove and restore comments. #1182 (#1323)
Browse files Browse the repository at this point in the history
* Adding ability to remove and restore comments. #1182

* Fix weird formatting miss.

* Use ImmutableList instead of List.

* Surrounding canMod with remember.

* Fixing formatting.
  • Loading branch information
dessalines committed Jan 18, 2024
1 parent 21e2222 commit 47ee753
Show file tree
Hide file tree
Showing 18 changed files with 424 additions and 33 deletions.
7 changes: 7 additions & 0 deletions app/src/main/java/com/jerboa/JerboaAppState.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ import com.jerboa.ui.components.community.sidebar.CommunityViewSidebar
import com.jerboa.ui.components.post.create.CreatePostReturn
import com.jerboa.ui.components.post.edit.PostEditReturn
import com.jerboa.ui.components.privatemessage.PrivateMessage
import com.jerboa.ui.components.remove.comment.CommentRemoveReturn
import it.vercruysse.lemmyapi.v0x19.datatypes.Comment
import it.vercruysse.lemmyapi.v0x19.datatypes.CommentView
import it.vercruysse.lemmyapi.v0x19.datatypes.Community
import it.vercruysse.lemmyapi.v0x19.datatypes.CommunityView
Expand Down Expand Up @@ -68,6 +70,11 @@ class JerboaAppState(
navController.navigate(Route.PostReportArgs.makeRoute(id = "$id"))
}

fun toCommentRemove(comment: Comment) {
sendReturnForwards(CommentRemoveReturn.COMMENT_SEND, comment)
navController.navigate(Route.COMMENT_REMOVE)
}

fun toSettings() = navController.navigate(Route.SETTINGS)

fun toAccountSettings() = navController.navigate(Route.ACCOUNT_SETTINGS)
Expand Down
11 changes: 10 additions & 1 deletion app/src/main/java/com/jerboa/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import android.os.Build
import android.os.Bundle
import android.util.Patterns
import android.widget.TextView
import android.widget.Toast
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
Expand Down Expand Up @@ -62,6 +61,7 @@ import com.jerboa.ui.components.post.create.CreatePostActivity
import com.jerboa.ui.components.post.edit.PostEditActivity
import com.jerboa.ui.components.privatemessage.CreatePrivateMessageActivity
import com.jerboa.ui.components.privatemessage.PrivateMessageReplyActivity
import com.jerboa.ui.components.remove.comment.CommentRemoveActivity
import com.jerboa.ui.components.report.comment.CreateCommentReportActivity
import com.jerboa.ui.components.report.post.CreatePostReportActivity
import com.jerboa.ui.components.settings.SettingsActivity
Expand Down Expand Up @@ -557,6 +557,15 @@ class MainActivity : AppCompatActivity() {
)
}

composable(
route = Route.COMMENT_REMOVE,
) {
CommentRemoveActivity(
appState = appState,
accountViewModel = accountViewModel,
)
}

composable(
route = Route.POST_REPORT,
arguments =
Expand Down
50 changes: 46 additions & 4 deletions app/src/main/java/com/jerboa/Utils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -459,10 +459,15 @@ suspend fun openLink(
val communityUrl = looksLikeCommunityUrl(parsedUrl)

if (userUrl != null && (formatted || API.checkIfLemmyInstance(url))) {
val route = Route.ProfileFromUrlArgs.makeRoute(instance = userUrl.first, name = userUrl.second)
val route =
Route.ProfileFromUrlArgs.makeRoute(instance = userUrl.first, name = userUrl.second)
navController.navigate(route)
} else if (communityUrl != null && (formatted || API.checkIfLemmyInstance(url))) {
val route = Route.CommunityFromUrlArgs.makeRoute(instance = communityUrl.first, name = communityUrl.second)
val route =
Route.CommunityFromUrlArgs.makeRoute(
instance = communityUrl.first,
name = communityUrl.second,
)
navController.navigate(route)
} else {
openLinkRaw(url, navController, useCustomTab, usePrivateTab)
Expand Down Expand Up @@ -1070,7 +1075,11 @@ fun convertSpToPx(
sp: TextUnit,
ctx: Context,
): Int {
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp.value, ctx.resources.displayMetrics).toInt()
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP,
sp.value,
ctx.resources.displayMetrics,
).toInt()
}

fun findAndUpdatePrivateMessage(
Expand Down Expand Up @@ -1288,7 +1297,8 @@ fun copyToClipboard(
): Boolean {
val activity = context.findActivity()
activity?.let {
val clipboard: ClipboardManager = it.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clipboard: ClipboardManager =
it.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText(clipLabel, textToCopy)
clipboard.setPrimaryClip(clip)
return true
Expand Down Expand Up @@ -1526,3 +1536,35 @@ fun String.padUrlWithHttps(): String {
"https://$this"
}
}

/**
* Determines whether someone can moderate an item. Uses a hierarchy of admins then mods.
*/
fun canMod(
creatorId: PersonId,
admins: ImmutableList<PersonView>?,
moderators: ImmutableList<CommunityModeratorView>?,
myId: PersonId?,
onSelf: Boolean = false,
): Boolean {
return if (myId !== null) {
// You can do moderator actions only on the mods added after you.
val adminIds = admins?.map { a -> a.person.id }.orEmpty()
val modIds = moderators?.map { m -> m.moderator.id }.orEmpty()

val adminsThenMods = adminIds.toMutableList()
adminsThenMods.addAll(modIds)

val myIndex = adminsThenMods.indexOf(myId)
if (myIndex == -1) {
false
} else {
// onSelf +1 on mod actions not for yourself, IE ban, remove, etc
val subList = adminsThenMods.subList(0, myIndex.plus(if (onSelf) 0 else 1))

!subList.contains(creatorId)
}
} else {
false
}
}
68 changes: 68 additions & 0 deletions app/src/main/java/com/jerboa/model/RemoveViewModel.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.jerboa.model

import android.content.Context
import android.util.Log
import android.widget.Toast
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 com.jerboa.R
import com.jerboa.api.API
import com.jerboa.api.ApiState
import com.jerboa.api.toApiState
import com.jerboa.ui.components.common.apiErrorToast
import it.vercruysse.lemmyapi.v0x19.datatypes.CommentResponse
import it.vercruysse.lemmyapi.v0x19.datatypes.CommentView
import it.vercruysse.lemmyapi.v0x19.datatypes.RemoveComment
import kotlinx.coroutines.launch

class RemoveViewModel : ViewModel() {
var commentRemoveRes: ApiState<CommentResponse> by mutableStateOf(ApiState.Empty)
private set

fun removeOrRestoreComment(
commentId: Int,
removed: Boolean,
reason: String,
ctx: Context,
focusManager: FocusManager,
onSuccess: (CommentView) -> Unit,
) {
viewModelScope.launch {
val form =
RemoveComment(
comment_id = commentId,
removed = removed,
reason = reason,
)

commentRemoveRes = ApiState.Loading
commentRemoveRes = API.getInstance().removeComment(form).toApiState()

when (val res = commentRemoveRes) {
is ApiState.Failure -> {
Log.d("removeComment", "failed", res.msg)
apiErrorToast(msg = res.msg, ctx = ctx)
}

is ApiState.Success -> {
val message =
if (removed) {
ctx.getString(R.string.remove_view_model_comment_removed)
} else {
ctx.getString(R.string.remove_view_model_comment_restored)
}
val commentView = res.data.comment_view
Toast.makeText(ctx, message, Toast.LENGTH_SHORT).show()

focusManager.clearFocus()
onSuccess(commentView)
}
else -> {}
}
}
}
}
8 changes: 8 additions & 0 deletions app/src/main/java/com/jerboa/model/SiteViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import com.jerboa.jerboaApplication
import it.vercruysse.lemmyapi.v0x19.datatypes.CommunityFollowerView
import it.vercruysse.lemmyapi.v0x19.datatypes.GetSiteResponse
import it.vercruysse.lemmyapi.v0x19.datatypes.GetUnreadCountResponse
import it.vercruysse.lemmyapi.v0x19.datatypes.PersonView
import it.vercruysse.lemmyapi.v0x19.datatypes.SaveUserSettings
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
Expand Down Expand Up @@ -165,6 +166,13 @@ class SiteViewModel(private val accountRepository: AccountRepository) : ViewMode
}
}

fun admins(): ImmutableList<PersonView> {
return when (val res = siteRes) {
is ApiState.Success -> res.data.admins.toImmutableList()
else -> persistentListOf()
}
}

companion object {
val Factory =
viewModelFactory {
Expand Down
Loading

0 comments on commit 47ee753

Please sign in to comment.