Skip to content

Commit

Permalink
Add blocks screen (#1545)
Browse files Browse the repository at this point in the history
* Add blocks screen

* Fix linter

* Refresh site upon entering

---------

Co-authored-by: Dessalines <[email protected]>
  • Loading branch information
MV-GH and dessalines authored Jun 13, 2024
1 parent 9a7c7f8 commit 955accc
Show file tree
Hide file tree
Showing 31 changed files with 595 additions and 131 deletions.
1 change: 0 additions & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,6 @@ dependencies {
// LiveData
implementation("androidx.compose.runtime:runtime-livedata")
implementation("androidx.lifecycle:lifecycle-runtime-compose")
implementation("androidx.lifecycle:lifecycle-livedata-ktx")

// Images
implementation("io.coil-kt:coil-compose:2.6.0")
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/java/com/jerboa/JerboaAppState.kt
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,8 @@ class JerboaAppState(

fun toLookAndFeel() = navController.navigate(Route.LOOK_AND_FEEL)

fun toBlockView() = navController.navigate(Route.BLOCK_VIEW)

fun toAbout() = navController.navigate(Route.ABOUT)

fun toCrashLogs() = navController.navigate(Route.CRASH_LOGS)
Expand Down
9 changes: 9 additions & 0 deletions app/src/main/java/com/jerboa/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ import com.jerboa.ui.components.reports.ReportsScreen
import com.jerboa.ui.components.settings.SettingsActivity
import com.jerboa.ui.components.settings.about.AboutScreen
import com.jerboa.ui.components.settings.account.AccountSettingsScreen
import com.jerboa.ui.components.settings.block.BlocksScreen
import com.jerboa.ui.components.settings.crashlogs.CrashLogsScreen
import com.jerboa.ui.components.settings.lookandfeel.LookAndFeelScreen
import com.jerboa.ui.components.viewvotes.comment.CommentLikesScreen
Expand Down Expand Up @@ -715,6 +716,7 @@ class MainActivity : AppCompatActivity() {
onBack = appState::popBackStack,
onClickAbout = appState::toAbout,
onClickAccountSettings = appState::toAccountSettings,
onClickBlocks = appState::toBlockView,
onClickLookAndFeel = appState::toLookAndFeel,
)
}
Expand Down Expand Up @@ -751,6 +753,13 @@ class MainActivity : AppCompatActivity() {
)
}

composable(route = Route.BLOCK_VIEW) {
BlocksScreen(
siteViewModel = siteViewModel,
onBack = appState::popBackStack,
)
}

composable(route = Route.CRASH_LOGS) {
CrashLogsScreen(
onClickBack = appState::popBackStack,
Expand Down
49 changes: 0 additions & 49 deletions app/src/main/java/com/jerboa/Utils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ import androidx.navigation.NavController
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.datatypes.getDisplayName
import com.jerboa.db.APP_SETTINGS_DEFAULT
Expand Down Expand Up @@ -1046,54 +1045,6 @@ fun findAndUpdatePrivateMessageReport(
}
}

fun showBlockPersonToast(
blockPersonRes: ApiState<BlockPersonResponse>,
ctx: Context,
) {
when (blockPersonRes) {
is ApiState.Success -> {
Toast.makeText(
ctx,
"${blockPersonRes.data.person_view.person.name} Blocked",
Toast.LENGTH_SHORT,
)
.show()
}

else -> {}
}
}

fun showBlockCommunityToast(
blockCommunityRes: ApiState<BlockCommunityResponse>,
ctx: Context,
) {
when (blockCommunityRes) {
is ApiState.Success -> {
Toast.makeText(
ctx,
ctx.getString(
if (blockCommunityRes.data.blocked) {
R.string.blocked_community_toast
} else {
R.string.unblocked_community_toast
},
blockCommunityRes.data.community_view.community.name,
),
Toast.LENGTH_SHORT,
).show()
}

else -> {
Toast.makeText(
ctx,
ctx.getText(R.string.community_block_toast_failure),
Toast.LENGTH_SHORT,
).show()
}
}
}

fun findAndUpdatePersonMention(
mentions: List<PersonMentionView>,
updatedCommentView: CommentView,
Expand Down
9 changes: 9 additions & 0 deletions app/src/main/java/com/jerboa/api/ApiAction.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.jerboa.api

sealed class ApiAction<out T>(val data: T) {
class Ok<T>(data: T) : ApiAction<T>(data)

class Loading<T>(data: T) : ApiAction<T>(data)

class Failed<T>(data: T, val err: Throwable) : ApiAction<T>(data)
}
19 changes: 19 additions & 0 deletions app/src/main/java/com/jerboa/api/ApiState.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.jerboa.api

sealed class ApiState<out T> {
abstract class Holder<T>(val data: T) : ApiState<T>()

class Success<T>(data: T) : Holder<T>(data)

class Appending<T>(data: T) : Holder<T>(data)

class AppendingFailure<T>(data: T) : Holder<T>(data)

class Failure(val msg: Throwable) : ApiState<Nothing>()

data object Loading : ApiState<Nothing>()

data object Refreshing : ApiState<Nothing>()

data object Empty : ApiState<Nothing>()
}
18 changes: 0 additions & 18 deletions app/src/main/java/com/jerboa/api/Http.kt
Original file line number Diff line number Diff line change
Expand Up @@ -208,24 +208,6 @@ object API {
}
}

sealed class ApiState<out T> {
abstract class Holder<T>(val data: T) : ApiState<T>()

class Success<T>(data: T) : Holder<T>(data)

class Appending<T>(data: T) : Holder<T>(data)

class AppendingFailure<T>(data: T) : Holder<T>(data)

class Failure(val msg: Throwable) : ApiState<Nothing>()

data object Loading : ApiState<Nothing>()

data object Refreshing : ApiState<Nothing>()

data object Empty : ApiState<Nothing>()
}

fun <T> Result<T>.toApiState(): ApiState<T> {
return this.fold(
onSuccess = { ApiState.Success(it) },
Expand Down
87 changes: 72 additions & 15 deletions app/src/main/java/com/jerboa/feat/Block.kt
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package com.jerboa.feat

import android.content.Context
import android.util.Log
import android.widget.Toast
import com.jerboa.R
import com.jerboa.api.API
import com.jerboa.api.toApiState
import com.jerboa.showBlockCommunityToast
import com.jerboa.showBlockPersonToast
import it.vercruysse.lemmyapi.v0x19.datatypes.BlockCommunity
import it.vercruysse.lemmyapi.v0x19.datatypes.BlockCommunityResponse
import it.vercruysse.lemmyapi.v0x19.datatypes.BlockInstanceResponse
import it.vercruysse.lemmyapi.v0x19.datatypes.BlockPerson
import it.vercruysse.lemmyapi.v0x19.datatypes.BlockPersonResponse
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
Expand All @@ -25,7 +25,7 @@ fun blockCommunity(
ctx: Context,
) {
scope.launch {
val res = API.getInstance().blockCommunity(form).toApiState()
val res = API.getInstance().blockCommunity(form)
withContext(Dispatchers.Main) {
showBlockCommunityToast(res, ctx)
}
Expand All @@ -38,38 +38,95 @@ fun blockPerson(
ctx: Context,
) {
scope.launch {
val res = API.getInstance().blockPerson(form).toApiState()
val res = API.getInstance().blockPerson(form)
withContext(Dispatchers.Main) {
showBlockPersonToast(res, ctx)
}
}
}

fun showBlockCommunityToast(
fun showBlockInstanceToast(
blockInstanceResp: Result<BlockInstanceResponse>,
instance: String,
ctx: Context,
) {
blockInstanceResp
.onSuccess {
makeSuccessfulBlockMessage(
it.blocked,
instance,
ctx,
)
}
.onFailure {
Toast.makeText(
ctx,
ctx.getString(
if (it.blocked) {
R.string.blocked_community_toast
} else {
R.string.unblocked_community_toast
},
instance,
),
ctx.getText(R.string.instance_block_toast_failure),
Toast.LENGTH_SHORT,
).show()
Log.i("Block", "failed", it)
}
}

fun showBlockPersonToast(
blockPersonRes: Result<BlockPersonResponse>,
ctx: Context,
) {
blockPersonRes
.onSuccess {
makeSuccessfulBlockMessage(
it.blocked,
it.person_view.person.name,
ctx,
)
}
.onFailure {
Toast.makeText(
ctx,
ctx.getText(R.string.instance_block_toast_failure),
ctx.getText(R.string.user_block_toast_failure),
Toast.LENGTH_SHORT,
).show()
Log.i("Block", "failed", it)
}
}

fun showBlockCommunityToast(
blockCommunityRes: Result<BlockCommunityResponse>,
ctx: Context,
) {
blockCommunityRes
.onSuccess {
makeSuccessfulBlockMessage(
it.blocked,
it.community_view.community.name,
ctx,
)
}
.onFailure {
Toast.makeText(
ctx,
ctx.getText(R.string.community_block_toast_failure),
Toast.LENGTH_SHORT,
).show()
Log.i("Block", "failed", it)
}
}

private fun makeSuccessfulBlockMessage(
isBlocked: Boolean,
name: String,
context: Context,
) {
Toast.makeText(
context,
context.getString(
if (isBlocked) {
R.string.blocked_element_toast
} else {
R.string.unblocked_element_toast
},
name,
),
Toast.LENGTH_SHORT,
).show()
}
42 changes: 42 additions & 0 deletions app/src/main/java/com/jerboa/feed/ApiActionController.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.jerboa.feed

import com.jerboa.api.ApiAction

class ApiActionController<T>(
val idSelect: (T) -> Long,
) {
private val controller = FeedController<ApiAction<T>>()

val feed: List<ApiAction<T>>
get() = controller.feed

fun init(newItems: List<T>) {
controller.init(newItems.map { ApiAction.Ok(it) })
}

fun setLoading(item: T) {
controller.safeUpdate({ items ->
items.indexOfFirst { idSelect(it.data) == idSelect(item) }
}) { ApiAction.Loading(it.data) }
}

fun setOk(item: T) {
controller.safeUpdate({ items ->
items.indexOfFirst { idSelect(it.data) == idSelect(item) }
}) { ApiAction.Ok(it.data) }
}

fun setFailed(
item: T,
error: Throwable,
) {
controller.safeUpdate({ items ->
items.indexOfFirst { idSelect(it.data) == idSelect(item) }
}) { ApiAction.Failed(it.data, error) }
}

fun removeItem(item: T) {
val index = feed.indexOfFirst { idSelect(it.data) == idSelect(item) }
controller.removeAt(index)
}
}
13 changes: 13 additions & 0 deletions app/src/main/java/com/jerboa/feed/FeedController.kt
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,23 @@ open class FeedController<T> {
}
}

fun init(newItems: List<T>) {
items.clear()
items.addAll(newItems)
}

fun get(index: Int): T? = items.getOrNull(index)

fun add(item: T) = items.add(item)

fun remove(item: T) = items.remove(item)

fun removeAt(index: Int) {
if (isValidIndex(index)) {
items.removeAt(index)
}
}

fun clear() = items.clear()

fun addAll(newItems: List<T>) = items.addAll(newItems)
Expand Down
Loading

0 comments on commit 955accc

Please sign in to comment.