Skip to content

Commit

Permalink
Move save to the topbar of user settings and deduplicate topbar code (#…
Browse files Browse the repository at this point in the history
…1243)

* Move save to the topbar of user settings and deduplicate topbar code

* Refactor SaveTopBar to ActionTopBar

* Refactor naming

* Fix formatting
  • Loading branch information
MV-GH authored Sep 20, 2023
1 parent ec2aef7 commit a463c69
Show file tree
Hide file tree
Showing 38 changed files with 175 additions and 815 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class AccountSettingsViewModel(
siteViewModel: SiteViewModel,
account: Account,
ctx: Context,
onSuccess: () -> Unit,
) {
viewModelScope.launch {
saveUserSettingsRes = ApiState.Loading
Expand All @@ -45,6 +46,7 @@ class AccountSettingsViewModel(
)

maybeUpdateAccountSettings(account, form)
onSuccess()
}

is ApiState.Failure -> {
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/java/com/jerboa/model/SiteViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import com.jerboa.datatypes.types.GetSite
import com.jerboa.datatypes.types.GetSiteResponse
import com.jerboa.datatypes.types.GetUnreadCount
import com.jerboa.datatypes.types.GetUnreadCountResponse
import com.jerboa.datatypes.types.SaveUserSettings
import com.jerboa.db.entity.AnonAccount
import com.jerboa.db.entity.getJWT
import com.jerboa.db.entity.isAnon
Expand All @@ -43,6 +44,7 @@ class SiteViewModel(private val accountRepository: AccountRepository) : ViewMode
private var unreadCountRes: ApiState<GetUnreadCountResponse> by mutableStateOf(ApiState.Empty)

val unreadCount by derivedStateOf { getUnreadCountTotal(unreadCountRes) }
lateinit var saveUserSettings: SaveUserSettings

init {
viewModelScope.launch {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.*
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
Expand All @@ -19,49 +18,6 @@ import com.jerboa.R
import com.jerboa.db.entity.Account
import com.jerboa.ui.components.common.MarkdownTextField

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun CommentEditHeader(
onBackClick: () -> Unit,
onSaveClick: () -> Unit,
loading: Boolean,
) {
TopAppBar(
title = {
Text(
text = stringResource(R.string.comment_edit_edit),
)
},
actions = {
IconButton(
onClick = onSaveClick,
enabled = !loading,
) {
if (loading) {
CircularProgressIndicator(
color = MaterialTheme.colorScheme.onSurface,
)
} else {
Icon(
imageVector = Icons.Outlined.Save,
contentDescription = stringResource(R.string.commentEdit_save),
)
}
}
},
navigationIcon = {
IconButton(
onClick = onBackClick,
) {
Icon(
Icons.Outlined.Close,
contentDescription = stringResource(R.string.comment_edit_back),
)
}
},
)
}

@Composable
fun CommentEdit(
content: TextFieldValue,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,17 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.TextFieldValue
import androidx.lifecycle.viewmodel.compose.viewModel
import com.jerboa.JerboaAppState
import com.jerboa.R
import com.jerboa.api.ApiState
import com.jerboa.datatypes.types.CommentView
import com.jerboa.feat.doIfReadyElseDisplayInfo
import com.jerboa.model.AccountViewModel
import com.jerboa.model.CommentEditViewModel
import com.jerboa.ui.components.common.ActionTopBar
import com.jerboa.ui.components.common.JerboaSnackbarHost
import com.jerboa.ui.components.common.getCurrentAccount

Expand Down Expand Up @@ -60,10 +63,10 @@ fun CommentEditActivity(
Scaffold(
snackbarHost = { JerboaSnackbarHost(snackbarHostState) },
topBar = {
CommentEditHeader(
ActionTopBar(
loading = loading,
onBackClick = appState::popBackStack,
onSaveClick = {
onActionClick = {
account.doIfReadyElseDisplayInfo(
appState,
ctx,
Expand All @@ -84,6 +87,8 @@ fun CommentEditActivity(
}
}
},
title = stringResource(R.string.comment_edit_edit),
actionText = R.string.comment_edit_save,
)
},
content = { padding ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.*
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
Expand All @@ -30,49 +29,6 @@ import com.jerboa.ui.components.post.PostNodeHeader
import com.jerboa.ui.theme.LARGE_PADDING
import com.jerboa.ui.theme.MEDIUM_PADDING

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun CommentReplyHeader(
onClickBack: () -> Unit,
onSendClick: () -> Unit,
loading: Boolean,
) {
TopAppBar(
title = {
Text(
text = stringResource(R.string.comment_reply_reply),
)
},
actions = {
IconButton(
onClick = onSendClick,
enabled = !loading,
) {
if (loading) {
CircularProgressIndicator(
color = MaterialTheme.colorScheme.onSurface,
)
} else {
Icon(
imageVector = Icons.Outlined.Send,
contentDescription = stringResource(R.string.commentReply_send),
)
}
}
},
navigationIcon = {
IconButton(
onClick = onClickBack,
) {
Icon(
Icons.Outlined.Close,
contentDescription = stringResource(R.string.comment_reply_back),
)
}
},
)
}

@Composable
fun RepliedComment(
commentView: CommentView,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package com.jerboa.ui.components.comment.reply
import android.util.Log
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Send
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
Expand All @@ -12,15 +14,18 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.TextFieldValue
import androidx.lifecycle.viewmodel.compose.viewModel
import com.jerboa.JerboaAppState
import com.jerboa.R
import com.jerboa.api.ApiState
import com.jerboa.db.entity.isAnon
import com.jerboa.model.AccountViewModel
import com.jerboa.model.CommentReplyViewModel
import com.jerboa.model.ReplyItem
import com.jerboa.model.SiteViewModel
import com.jerboa.ui.components.common.ActionTopBar
import com.jerboa.ui.components.common.LoadingBar
import com.jerboa.ui.components.common.getCurrentAccount

Expand Down Expand Up @@ -58,10 +63,11 @@ fun CommentReplyActivity(

Scaffold(
topBar = {
CommentReplyHeader(
ActionTopBar(
title = stringResource(R.string.comment_reply_reply),
loading = loading,
onClickBack = appState::popBackStack,
onSendClick = {
onBackClick = appState::popBackStack,
onActionClick = {
if (!account.isAnon()) {
commentReplyViewModel.createComment(
replyItem,
Expand All @@ -77,6 +83,8 @@ fun CommentReplyActivity(
}
}
},
actionText = R.string.commentReply_send,
actionIcon = Icons.Outlined.Send,
)
},
content = { padding ->
Expand Down
80 changes: 44 additions & 36 deletions app/src/main/java/com/jerboa/ui/components/common/AppBars.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.jerboa.ui.components.common

import android.annotation.SuppressLint
import android.app.Activity
import androidx.annotation.StringRes
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.core.tween
import androidx.compose.foundation.ExperimentalFoundationApi
Expand Down Expand Up @@ -642,13 +643,45 @@ fun LoadingBar(
)
}

/**
* M3 doesn't have a built-in way to do this yet, so we have to do it ourselves.
*
* Supports M3 theming
*/
@OptIn(ExperimentalMaterialApi::class)
@Composable
fun JerboaPullRefreshIndicator(
refreshing: Boolean,
state: PullRefreshState,
modifier: Modifier = Modifier,
backgroundColor: Color = MaterialTheme.colorScheme.surfaceColorAtElevation(6.dp),
contentColor: Color = MaterialTheme.colorScheme.onSurface,
scale: Boolean = true,
) {
PullRefreshIndicator(
refreshing,
state,
modifier,
backgroundColor,
contentColor,
scale,
)
}

/**
* A simple top bar with a action that defaults to save
*
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun CreateSubmitHeader(
title: String,
onClickBack: () -> Unit,
onSubmitClick: () -> Unit,
fun ActionTopBar(
onBackClick: () -> Unit,
onActionClick: () -> Unit,
loading: Boolean,
title: String,
@StringRes actionText: Int = R.string.save,
actionIcon: ImageVector = Icons.Outlined.Save,
formValid: Boolean = true,
) {
TopAppBar(
title = {
Expand All @@ -658,55 +691,30 @@ fun CreateSubmitHeader(
},
actions = {
IconButton(
onClick = onSubmitClick,
enabled = !loading,
onClick = onActionClick,
enabled = formValid && !loading,
) {
if (loading) {
CircularProgressIndicator(
color = MaterialTheme.colorScheme.onSurface,
)
} else {
Icon(
imageVector = Icons.Outlined.Send,
contentDescription = stringResource(R.string.form_submit),
imageVector = actionIcon,
contentDescription = stringResource(actionText),
)
}
}
},
navigationIcon = {
IconButton(
onClick = onClickBack,
onClick = onBackClick,
) {
Icon(
Icons.Outlined.Close,
contentDescription = stringResource(R.string.create_report_back),
Icons.Outlined.ArrowBack,
contentDescription = stringResource(R.string.topAppBar_back),
)
}
},
)
}

/**
* M3 doesn't have a built-in way to do this yet, so we have to do it ourselves.
*
* Supports M3 theming
*/
@OptIn(ExperimentalMaterialApi::class)
@Composable
fun JerboaPullRefreshIndicator(
refreshing: Boolean,
state: PullRefreshState,
modifier: Modifier = Modifier,
backgroundColor: Color = MaterialTheme.colorScheme.surfaceColorAtElevation(6.dp),
contentColor: Color = MaterialTheme.colorScheme.onSurface,
scale: Boolean = true,
) {
PullRefreshIndicator(
refreshing,
state,
modifier,
backgroundColor,
contentColor,
scale,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ fun CommunityHeader(
IconButton(onClick = onClickBack) {
Icon(
Icons.Outlined.ArrowBack,
contentDescription = stringResource(R.string.community_back),
contentDescription = stringResource(R.string.topAppBar_back),
)
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ fun ViewerHeader(
Icon(
Icons.Outlined.ArrowBack,
tint = Color.White,
contentDescription = stringResource(R.string.login_back),
contentDescription = stringResource(R.string.topAppBar_back),
)
}
},
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/jerboa/ui/components/login/Login.kt
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ fun LoginHeader(
) {
Icon(
Icons.Outlined.ArrowBack,
contentDescription = stringResource(R.string.login_back),
contentDescription = stringResource(R.string.topAppBar_back),
)
}
},
Expand Down
Loading

0 comments on commit a463c69

Please sign in to comment.