Skip to content

Commit

Permalink
Adding ban and ban from community.
Browse files Browse the repository at this point in the history
- Adding appropriate viewModels and activities.
- Adds functions to search for and update lists of posts and comments
- Context: #1182
  • Loading branch information
dessalines committed Jan 20, 2024
1 parent 151868d commit 13a18d7
Show file tree
Hide file tree
Showing 30 changed files with 1,090 additions and 76 deletions.
14 changes: 14 additions & 0 deletions app/src/main/java/com/jerboa/JerboaAppState.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@ import androidx.compose.runtime.saveable.Saver
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController
import com.jerboa.datatypes.BanFromCommunityData
import com.jerboa.model.ReplyItem
import com.jerboa.ui.components.ban.BanFromCommunityReturn
import com.jerboa.ui.components.ban.BanPersonReturn
import com.jerboa.ui.components.comment.edit.CommentEditReturn
import com.jerboa.ui.components.comment.reply.CommentReplyReturn
import com.jerboa.ui.components.common.Route
Expand All @@ -25,6 +28,7 @@ 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
import it.vercruysse.lemmyapi.v0x19.datatypes.Person
import it.vercruysse.lemmyapi.v0x19.datatypes.Post
import it.vercruysse.lemmyapi.v0x19.datatypes.PostView
import it.vercruysse.lemmyapi.v0x19.datatypes.PrivateMessageView
Expand Down Expand Up @@ -82,6 +86,16 @@ class JerboaAppState(
navController.navigate(Route.COMMENT_REMOVE)
}

fun toBanPerson(person: Person) {
sendReturnForwards(BanPersonReturn.PERSON_SEND, person)
navController.navigate(Route.BAN_PERSON)
}

fun toBanFromCommunity(banData: BanFromCommunityData) {
sendReturnForwards(BanFromCommunityReturn.BAN_DATA_SEND, banData)
navController.navigate(Route.BAN_FROM_COMMUNITY)
}

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

fun toAccountSettings() = navController.navigate(Route.ACCOUNT_SETTINGS)
Expand Down
50 changes: 35 additions & 15 deletions app/src/main/java/com/jerboa/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ import com.jerboa.model.AccountViewModelFactory
import com.jerboa.model.AppSettingsViewModel
import com.jerboa.model.AppSettingsViewModelFactory
import com.jerboa.model.SiteViewModel
import com.jerboa.ui.components.ban.BanFromCommunityActivity
import com.jerboa.ui.components.ban.BanPersonActivity
import com.jerboa.ui.components.comment.edit.CommentEditActivity
import com.jerboa.ui.components.comment.reply.CommentReplyActivity
import com.jerboa.ui.components.common.LinkDropDownMenu
Expand Down Expand Up @@ -542,35 +544,36 @@ class MainActivity : AppCompatActivity() {
}

composable(
route = Route.COMMENT_REPORT,
arguments =
listOf(
navArgument(Route.CommentReportArgs.ID) {
type = Route.CommentReportArgs.ID_TYPE
},
),
route = Route.POST_REMOVE,
) {
val args = Route.CommentReportArgs(it)
CreateCommentReportActivity(
commentId = args.id,
PostRemoveActivity(
appState = appState,
accountViewModel = accountViewModel,
onBack = appState::navigateUp,
)
}

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

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

composable(
route = Route.BAN_FROM_COMMUNITY,
) {
BanFromCommunityActivity(
appState = appState,
accountViewModel = accountViewModel,
)
Expand All @@ -593,6 +596,23 @@ class MainActivity : AppCompatActivity() {
)
}

composable(
route = Route.COMMENT_REPORT,
arguments =
listOf(
navArgument(Route.CommentReportArgs.ID) {
type = Route.CommentReportArgs.ID_TYPE
},
),
) {
val args = Route.CommentReportArgs(it)
CreateCommentReportActivity(
commentId = args.id,
accountViewModel = accountViewModel,
onBack = appState::navigateUp,
)
}

composable(route = Route.SETTINGS) {
SettingsActivity(
accountViewModel = accountViewModel,
Expand Down
69 changes: 69 additions & 0 deletions app/src/main/java/com/jerboa/Utils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ import coil.annotation.ExperimentalCoilApi
import coil.imageLoader
import com.jerboa.api.API
import com.jerboa.api.ApiState
import com.jerboa.datatypes.BanFromCommunityData
import com.jerboa.db.APP_SETTINGS_DEFAULT
import com.jerboa.db.entity.AppSettings
import com.jerboa.ui.components.common.Route
Expand All @@ -70,6 +71,8 @@ import java.io.InputStream
import java.net.MalformedURLException
import java.net.URL
import java.text.DecimalFormat
import java.time.Duration
import java.time.Instant
import java.util.*
import kotlin.math.abs
import kotlin.math.pow
Expand Down Expand Up @@ -1204,6 +1207,66 @@ fun findAndUpdateComment(
}
}

fun findAndUpdatePostCreator(
posts: List<PostView>,
person: Person,
): List<PostView> {
val newPosts = posts.toMutableList()
newPosts.replaceAll {
if (it.creator.id == person.id) {
it.copy(creator = person)
} else {
it
}
}
return newPosts
}

fun findAndUpdatePostCreatorBannedFromCommunity(
posts: List<PostView>,
banData: BanFromCommunityData,
): List<PostView> {
val newPosts = posts.toMutableList()
newPosts.replaceAll {
if (it.creator.id == banData.person.id && it.community.id == banData.community.id) {
it.copy(creator_banned_from_community = banData.banned)
} else {
it
}
}
return newPosts
}

fun findAndUpdateCommentCreator(
comments: List<CommentView>,
person: Person,
): List<CommentView> {
val newComments = comments.toMutableList()
newComments.replaceAll {
if (it.creator.id == person.id) {
it.copy(creator = person)
} else {
it
}
}
return newComments
}

fun findAndUpdateCommentCreatorBannedFromCommunity(
comments: List<CommentView>,
banData: BanFromCommunityData,
): List<CommentView> {
val newComments = comments.toMutableList()
newComments.replaceAll {
if (it.creator.id == banData.person.id && it.community.id == banData.community.id) {
it.copy(creator_banned_from_community = banData.banned)
} else {
it
}
}
return newComments
}

fun findAndUpdateCommentReply(
replies: List<CommentReplyView>,
updatedCommentView: CommentView,
Expand Down Expand Up @@ -1568,3 +1631,9 @@ fun canMod(
false
}
}

fun futureDaysToUnixTime(days: Int?): Int? {
return days?.let {
(Date.from(Instant.now().plus(Duration.ofDays(it.toLong()))).time / 1000L).toInt()
}
}
13 changes: 13 additions & 0 deletions app/src/main/java/com/jerboa/datatypes/Others.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ import com.jerboa.ui.components.person.UserTab
import it.vercruysse.lemmyapi.dto.CommentSortType
import it.vercruysse.lemmyapi.dto.ListingType
import it.vercruysse.lemmyapi.dto.SortType
import it.vercruysse.lemmyapi.v0x19.datatypes.Community
import it.vercruysse.lemmyapi.v0x19.datatypes.Person
import kotlinx.serialization.Serializable


data class CommentSortData(
Expand Down Expand Up @@ -187,3 +190,13 @@ fun getLocalizedStringForInboxTab(
}
return returnString
}

/**
* A wrapper to store extra community ban info
*/
@Serializable
data class BanFromCommunityData(
val person: Person,
val community: Community,
val banned: Boolean,
)
95 changes: 95 additions & 0 deletions app/src/main/java/com/jerboa/model/BanFromCommunityViewModel.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
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.communityNameShown
import com.jerboa.datatypes.BanFromCommunityData
import com.jerboa.futureDaysToUnixTime
import com.jerboa.personNameShown
import com.jerboa.ui.components.common.apiErrorToast
import it.vercruysse.lemmyapi.v0x19.datatypes.BanFromCommunity
import it.vercruysse.lemmyapi.v0x19.datatypes.BanFromCommunityResponse
import it.vercruysse.lemmyapi.v0x19.datatypes.Community
import it.vercruysse.lemmyapi.v0x19.datatypes.PersonId
import kotlinx.coroutines.launch

class BanFromCommunityViewModel : ViewModel() {
var banFromCommunityRes: ApiState<BanFromCommunityResponse> by mutableStateOf(ApiState.Empty)
private set

fun banOrUnbanFromCommunity(
personId: PersonId,
community: Community,
ban: Boolean,
removeData: Boolean? = null,
reason: String,
expireDays: Int? = null,
ctx: Context,
focusManager: FocusManager,
onSuccess: (BanFromCommunityData) -> Unit,
) {
viewModelScope.launch {
val form =
BanFromCommunity(
person_id = personId,
community_id = community.id,
ban = ban,
remove_data = removeData,
reason = reason,
expires = futureDaysToUnixTime(expireDays),
)

banFromCommunityRes = ApiState.Loading
banFromCommunityRes = API.getInstance().banFromCommunity(form).toApiState()

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

is ApiState.Success -> {
val personNameShown = personNameShown(res.data.person_view.person, true)
val communityNameShown = communityNameShown(community)
val message =
if (ban) {
if (expireDays !== null) {
ctx.getString(
R.string.person_banned_from_community_for_x_days,
personNameShown,
communityNameShown,
expireDays,
)
} else {
ctx.getString(R.string.person_banned_from_community, personNameShown, communityNameShown)
}
} else {
ctx.getString(R.string.person_unbanned_from_community, personNameShown, communityNameShown)
}
Toast.makeText(ctx, message, Toast.LENGTH_SHORT).show()

focusManager.clearFocus()
onSuccess(
BanFromCommunityData(
person = res.data.person_view.person,
community = community,
banned = res.data.banned,
),
)
}
else -> {}
}
}
}
}
Loading

0 comments on commit 13a18d7

Please sign in to comment.