refactor: Update button components and improve lint settings

This commit refactors button components across the application to use `PepTextButton` and `SquareButton` for consistency in UI design. Additionally, it updates the lint settings in `build.gradle.kts` to disable warnings for `NullSafeMutableLiveData`.

- Replaced instances of `TextButton` and `Button` with `PepTextButton` and `SquareButton` in various composables and screens.
- Adjusted lint settings to disable warnings for `NullSafeMutableLiveData`.
- Improved color usage in `Reaction` composable for better visual consistency.
- Updated drawable resources and string resources for better clarity and organization.
This commit is contained in:
AbronStudio 2025-08-18 16:22:02 +03:30
parent 664c623aeb
commit 0471526d2f
64 changed files with 1374 additions and 1167 deletions

View File

@ -163,6 +163,8 @@ android {
lint { lint {
abortOnError = false abortOnError = false
disable += "MissingTranslation" disable += "MissingTranslation"
disable += "NullSafeMutableLiveData"
// checkReleaseBuilds false
} }
} }

View File

@ -17,13 +17,11 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@ -57,7 +55,9 @@ import chat.peptide.api.schemas.RsResult
import chat.peptide.api.settings.LoadedSettings import chat.peptide.api.settings.LoadedSettings
import chat.peptide.api.settings.SyncedSettings import chat.peptide.api.settings.SyncedSettings
import chat.peptide.composables.generic.IconPlaceholder import chat.peptide.composables.generic.IconPlaceholder
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.RemoteImage import chat.peptide.composables.generic.RemoteImage
import chat.peptide.composables.generic.SquareButton
import chat.peptide.ui.theme.PeptideTheme import chat.peptide.ui.theme.PeptideTheme
import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi
import com.bumptech.glide.integration.compose.GlideImage import com.bumptech.glide.integration.compose.GlideImage
@ -245,7 +245,7 @@ fun InviteScreen(
Spacer(modifier = Modifier.height(16.dp)) Spacer(modifier = Modifier.height(16.dp))
Row { Row {
Button( SquareButton(
onClick = { onClick = {
viewModel.joinInvite(inviteCode) viewModel.joinInvite(inviteCode)
}, },
@ -257,7 +257,7 @@ fun InviteScreen(
Spacer(modifier = Modifier.width(8.dp)) Spacer(modifier = Modifier.width(8.dp))
TextButton( PepTextButton(
onClick = onFinish, onClick = onFinish,
modifier = Modifier modifier = Modifier
.testTag("decline_invite") .testTag("decline_invite")
@ -307,7 +307,7 @@ fun InvalidInviteError(error: PeptideError? = null, onDismissRequest: () -> Unit
} }
}, },
dismissButton = { dismissButton = {
TextButton( PepTextButton(
onClick = { onClick = {
onDismissRequest() onDismissRequest()
} }
@ -347,7 +347,7 @@ fun NoInviteSpecifiedError(onDismissRequest: () -> Unit) {
} }
}, },
dismissButton = { dismissButton = {
TextButton( PepTextButton(
onClick = { onClick = {
onDismissRequest() onDismissRequest()
} }

File diff suppressed because it is too large Load Diff

View File

@ -44,7 +44,7 @@ fun Reaction(
val background by animateColorAsState( val background by animateColorAsState(
targetValue = if (hasOwn) { targetValue = if (hasOwn) {
MaterialTheme.colorScheme.primary MaterialTheme.colorScheme.secondary
} else { } else {
MaterialTheme.colorScheme.surfaceContainer MaterialTheme.colorScheme.surfaceContainer
}, },
@ -52,7 +52,7 @@ fun Reaction(
) )
val foreground by animateColorAsState( val foreground by animateColorAsState(
targetValue = if (hasOwn) { targetValue = if (hasOwn) {
MaterialTheme.colorScheme.onPrimary MaterialTheme.colorScheme.onSecondaryContainer
} else { } else {
MaterialTheme.colorScheme.onSurface MaterialTheme.colorScheme.onSurface
}, },

View File

@ -20,6 +20,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import chat.peptide.R import chat.peptide.R
import chat.peptide.composables.generic.PepTextButton
@Composable @Composable
fun TimeRift(modifier: Modifier = Modifier, onMessageLoad: () -> Unit) { fun TimeRift(modifier: Modifier = Modifier, onMessageLoad: () -> Unit) {
@ -48,7 +49,7 @@ fun TimeRift(modifier: Modifier = Modifier, onMessageLoad: () -> Unit) {
Spacer(modifier = Modifier.height(5.dp)) Spacer(modifier = Modifier.height(5.dp))
TextButton(onClick = onMessageLoad) { PepTextButton(onClick = onMessageLoad) {
Text( Text(
text = stringResource(id = R.string.time_rift_cta), text = stringResource(id = R.string.time_rift_cta),
color = LocalContentColor.current.copy( color = LocalContentColor.current.copy(

View File

@ -3,6 +3,7 @@ package chat.peptide.composables.generic
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextField import androidx.compose.material3.TextField
import androidx.compose.material3.TextFieldDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.ImeAction

View File

@ -32,7 +32,7 @@ fun HealthAlert(notice: HealthNotice, onDismiss: () -> Unit) {
confirmButton = { confirmButton = {
notice.alert?.actions?.map { action -> notice.alert?.actions?.map { action ->
when (action.type) { when (action.type) {
"external" -> TextButton( "external" -> PepTextButton(
onClick = { onClick = {
val customTab = CustomTabsIntent.Builder() val customTab = CustomTabsIntent.Builder()
.setShowTitle(true) .setShowTitle(true)
@ -42,7 +42,7 @@ fun HealthAlert(notice: HealthNotice, onDismiss: () -> Unit) {
.build() .build()
) )
.build() .build()
customTab.launchUrl(context, action.href?.toUri() ?: return@TextButton) customTab.launchUrl(context, action.href?.toUri() ?: return@PepTextButton)
} }
) { ) {
Text( Text(
@ -52,7 +52,7 @@ fun HealthAlert(notice: HealthNotice, onDismiss: () -> Unit) {
} }
} }
} }
TextButton(onClick = onDismiss) { PepTextButton(onClick = onDismiss) {
Text(stringResource(R.string.service_health_alert_actions_dismiss)) Text(stringResource(R.string.service_health_alert_actions_dismiss))
} }
} }

View File

@ -86,7 +86,7 @@ fun InlineMediaPicker(
if (canRemove) { if (canRemove) {
Spacer(modifier = Modifier.height(8.dp)) Spacer(modifier = Modifier.height(8.dp))
TextButton( PepTextButton(
onClick = { onClick = {
onRemove() onRemove()
}, },

View File

@ -95,7 +95,7 @@ fun NonIdealStatePreview() {
title = { Text("Channel") }, title = { Text("Channel") },
description = { Text("You are not in any channels.") }, description = { Text("You are not in any channels.") },
actions = { actions = {
Button(onClick = {}) { SquareButton(onClick = {}) {
Text("Create a channel") Text("Create a channel")
} }
} }

View File

@ -2,8 +2,11 @@ package chat.peptide.composables.generic
import androidx.compose.foundation.shape.CornerSize import androidx.compose.foundation.shape.CornerSize
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.ButtonColors
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ElevatedButton import androidx.compose.material3.ElevatedButton
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
@ -13,11 +16,16 @@ fun SquareButton(
onClick: () -> Unit, onClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
enabled: Boolean = true, enabled: Boolean = true,
colors: ButtonColors = ButtonDefaults.buttonColors().copy(
containerColor = MaterialTheme.colorScheme.primary,
contentColor = MaterialTheme.colorScheme.onPrimary,
),
content: @Composable () -> Unit content: @Composable () -> Unit
) { ) {
Button( Button(
onClick = onClick, onClick = onClick,
modifier = modifier, modifier = modifier,
colors = colors,
enabled = enabled, enabled = enabled,
shape = MaterialTheme.shapes.small.copy( shape = MaterialTheme.shapes.small.copy(
topStart = CornerSize(8.dp), topStart = CornerSize(8.dp),
@ -30,6 +38,31 @@ fun SquareButton(
} }
} }
@Composable
fun PepTextButton(
onClick: () -> Unit,
modifier: Modifier = Modifier,
enabled: Boolean = true,
content: @Composable () -> Unit
) {
TextButton(
onClick = onClick,
modifier = modifier,
colors = ButtonDefaults.textButtonColors().copy(
contentColor = MaterialTheme.colorScheme.onBackground,
),
shape = MaterialTheme.shapes.small.copy(
topStart = CornerSize(8.dp),
topEnd = CornerSize(8.dp),
bottomStart = CornerSize(8.dp),
bottomEnd = CornerSize(8.dp)
),
enabled = enabled,
) {
content()
}
}
@Composable @Composable
fun SquareElevatedButton( fun SquareElevatedButton(
onClick: () -> Unit, onClick: () -> Unit,
@ -39,6 +72,10 @@ fun SquareElevatedButton(
ElevatedButton( ElevatedButton(
onClick = onClick, onClick = onClick,
modifier = modifier, modifier = modifier,
colors = ButtonDefaults.buttonColors().copy(
containerColor = MaterialTheme.colorScheme.primary,
contentColor = MaterialTheme.colorScheme.onPrimary,
),
shape = MaterialTheme.shapes.small.copy( shape = MaterialTheme.shapes.small.copy(
topStart = CornerSize(8.dp), topStart = CornerSize(8.dp),
topEnd = CornerSize(8.dp), topEnd = CornerSize(8.dp),

View File

@ -1,14 +1,20 @@
package chat.peptide.composables.generic package chat.peptide.composables.generic
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material3.ListItem import androidx.compose.material3.ListItem
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Info
import androidx.compose.material3.Icon
import androidx.compose.material3.LocalContentColor import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import chat.peptide.internals.extensions.TransparentListItemColours import chat.peptide.internals.extensions.TransparentListItemColours
@ -88,4 +94,75 @@ fun SheetButton(
} }
) )
} }
} }
@Preview
@Composable
private fun SheetButtonPreview() {
MaterialTheme {
SheetButton(
headlineContent = { Text("Headline") },
leadingContent = { Icon(Icons.Default.Info, contentDescription = null) },
onClick = {},
modifier = Modifier.background(MaterialTheme.colorScheme.surface)
)
}
}
@Preview
@Composable
private fun SheetButtonWithSupportingContentPreview() {
MaterialTheme {
SheetButton(
headlineContent = { Text("Headline") },
leadingContent = { Icon(Icons.Default.Info, contentDescription = null) },
supportingContent = { Text("Supporting content") },
onClick = {},
modifier = Modifier.background(MaterialTheme.colorScheme.surface)
)
}
}
@Preview
@Composable
private fun SheetButtonWithTrailingContentPreview() {
MaterialTheme {
SheetButton(
headlineContent = { Text("Headline") },
leadingContent = { Icon(Icons.Default.Info, contentDescription = null) },
trailingContent = { Text("Trailing") },
onClick = {},
modifier = Modifier.background(MaterialTheme.colorScheme.surface)
)
}
}
@Preview
@Composable
private fun DangerousSheetButtonPreview() {
MaterialTheme {
SheetButton(
headlineContent = { Text("Headline") },
leadingContent = { Icon(Icons.Default.Info, contentDescription = null) },
onClick = {},
dangerous = true,
modifier = Modifier.background(MaterialTheme.colorScheme.surface)
)
}
}
@Preview
@Composable
private fun SpecialSheetButtonPreview() {
MaterialTheme {
SheetButton(
headlineContent = { Text("Headline") },
leadingContent = { Icon(Icons.Default.Info, contentDescription = null) },
onClick = {},
special = true,
modifier = Modifier.background(MaterialTheme.colorScheme.surface)
)
}
}

View File

@ -20,6 +20,7 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
@ -200,7 +201,7 @@ fun annotateText(node: AstNode): AnnotatedString {
pushStyle( pushStyle(
LocalTextStyle.current.toSpanStyle() LocalTextStyle.current.toSpanStyle()
.copy( .copy(
color = MaterialTheme.colorScheme.secondary color = Color(0xff4775bf)
) )
) )
append(url.value) append(url.value)

View File

@ -18,7 +18,6 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.Close
import androidx.compose.material3.Button
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.LinearProgressIndicator
@ -30,7 +29,6 @@ import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.ProgressIndicatorDefaults import androidx.compose.material3.ProgressIndicatorDefaults
import androidx.compose.material3.Switch import androidx.compose.material3.Switch
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@ -52,7 +50,9 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import chat.peptide.R import chat.peptide.R
import chat.peptide.api.routes.microservices.autumn.FileArgs import chat.peptide.api.routes.microservices.autumn.FileArgs
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.RemoteImage import chat.peptide.composables.generic.RemoteImage
import chat.peptide.composables.generic.SquareButton
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.io.File import java.io.File
@ -125,7 +125,7 @@ fun FilePreviewSheet(
} }
Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
Button(onClick = { SquareButton(onClick = {
onDismiss() onDismiss()
}, modifier = Modifier.weight(1f)) { }, modifier = Modifier.weight(1f)) {
Icon(Icons.Default.Close, contentDescription = null) Icon(Icons.Default.Close, contentDescription = null)
@ -133,7 +133,7 @@ fun FilePreviewSheet(
Text(stringResource(R.string.attachment_preview_close)) Text(stringResource(R.string.attachment_preview_close))
} }
if (canRemove) { if (canRemove) {
TextButton(onClick = { PepTextButton(onClick = {
onRemove() onRemove()
}, modifier = Modifier.weight(1f)) { }, modifier = Modifier.weight(1f)) {
Icon( Icon(

View File

@ -105,7 +105,6 @@ fun DiscoverServersList(
CircularProgressIndicator( CircularProgressIndicator(
modifier = Modifier modifier = Modifier
.padding(16.dp), .padding(16.dp),
color = MaterialTheme.colorScheme.secondary
) )
} }
} }
@ -238,7 +237,7 @@ fun ServerItem(
Text( Text(
text = server.description, text = server.description,
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onBackground.copy( color = MaterialTheme.colorScheme.onBackground.copy(
alpha = descriptionAlpha, alpha = descriptionAlpha,
), ),
@ -248,46 +247,43 @@ fun ServerItem(
} }
Spacer(modifier = Modifier.height(12.dp)) Spacer(modifier = Modifier.height(12.dp))
if (isProcessing) { IconButton(
CircularProgressIndicator( onClick = onClick,
) {
Box(
modifier = Modifier modifier = Modifier
.size(24.dp), .fillMaxSize()
strokeWidth = 2.dp
)
} else {
IconButton(
onClick = onClick,
) { ) {
Box( when {
modifier = Modifier isProcessing -> CircularProgressIndicator(
.fillMaxSize() modifier = Modifier.size(20.dp)
) { .align(Alignment.Center),
if (isJoined) { strokeWidth = 2.dp
Box( )
modifier = Modifier isJoined -> Box(
.size(20.dp) modifier = Modifier
.clip(CircleShape) .size(20.dp)
.background(Color(0xFF43bf83)) .clip(CircleShape)
.align(Alignment.Center), .background(Color(0xFF43bf83))
contentAlignment = Alignment.Center .align(Alignment.Center),
) { contentAlignment = Alignment.Center
Image( ) {
modifier = Modifier.size(16.dp), Image(
painter = painterResource(R.drawable.icn_check_24dp), modifier = Modifier.size(16.dp),
contentDescription = "Already joined", painter = painterResource(R.drawable.icn_check_24dp),
colorFilter = ColorFilter.tint(Color.White) contentDescription = "Already joined",
) colorFilter = ColorFilter.tint(Color.White)
)
} }
} else { else -> {
// Show arrow icon for servers not joined yet
Image( Image(
painter = painterResource(R.drawable.icn_arrow_forward_24dp), painter = painterResource(R.drawable.icn_arrow_forward_24dp),
contentDescription = "Join server", contentDescription = "Join server",
modifier = Modifier modifier = Modifier.align(Alignment.Center),
.align(Alignment.Center),
colorFilter = ColorFilter.tint( colorFilter = ColorFilter.tint(
color = MaterialTheme.colorScheme.onBackground.copy(alpha = contentAlpha) color = MaterialTheme.colorScheme.onBackground.copy(
alpha = contentAlpha
)
) )
) )
} }
@ -354,4 +350,22 @@ private fun JoinedServerItemPreview() {
isJoined = true, isJoined = true,
isProcessing = false isProcessing = false
) )
}
@Preview
@Composable
private fun JoinedServerItemLoadingPreview() {
val server = ServerData(
id = "1",
name = "Peptide Lounge",
description = "The official Peptide server. Hang out, chat, and get help with Peptide.",
inviteCode = "peptide",
disabled = false,
showColor = null,
)
ServerItem(
server = server,
onClick = {},
isJoined = true,
isProcessing = true
)
} }

View File

@ -35,7 +35,9 @@ import chat.peptide.api.PeptideAPI
import chat.peptide.api.PeptideError import chat.peptide.api.PeptideError
import chat.peptide.api.schemas.Invite import chat.peptide.api.schemas.Invite
import chat.peptide.composables.generic.IconPlaceholder import chat.peptide.composables.generic.IconPlaceholder
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.RemoteImage import chat.peptide.composables.generic.RemoteImage
import chat.peptide.composables.generic.SquareButton
@Composable @Composable
fun ServerInviteDialog( fun ServerInviteDialog(
@ -74,7 +76,7 @@ fun ServerInviteDialog(
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) )
Spacer(Modifier.height(32.dp)) Spacer(Modifier.height(32.dp))
Button( SquareButton(
onClick = onDismiss, onClick = onDismiss,
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
) { ) {
@ -100,7 +102,7 @@ fun ServerInviteDialog(
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Bottom // Align buttons to the bottom verticalArrangement = Arrangement.Bottom // Align buttons to the bottom
) { ) {
Button( SquareButton(
onClick = onJoinClick, onClick = onJoinClick,
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
enabled = !isLoading enabled = !isLoading
@ -121,7 +123,7 @@ fun ServerInviteDialog(
Text(text = stringResource(id = R.string.invite_join)) Text(text = stringResource(id = R.string.invite_join))
} }
} }
TextButton( PepTextButton(
onClick = onDismiss, onClick = onDismiss,
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {

View File

@ -208,13 +208,19 @@ fun ChannelSideDrawer(
onDestinationChanged(ChatRouterDestination.Home) onDestinationChanged(ChatRouterDestination.Home)
} }
.size(48.dp) .size(48.dp)
.background(MaterialTheme.colorScheme.primaryContainer), .background(
color = if (currentDestination is ChatRouterDestination.Home) {
MaterialTheme.colorScheme.secondaryContainer
} else MaterialTheme.colorScheme.primaryContainer
),
contentAlignment = Alignment.Center contentAlignment = Alignment.Center
) { ) {
Icon( Icon(
painter = painterResource(R.drawable.ic_direct_messages), painter = painterResource(R.drawable.ic_direct_messages),
contentDescription = stringResource(R.string.discover_alt), contentDescription = stringResource(R.string.discover_alt),
tint = MaterialTheme.colorScheme.onPrimaryContainer tint = if (currentDestination is ChatRouterDestination.Home) {
MaterialTheme.colorScheme.onSecondaryContainer
} else MaterialTheme.colorScheme.onBackground
) )
} }
} }
@ -292,20 +298,32 @@ fun ChannelSideDrawer(
Box( Box(
Modifier Modifier
.padding(8.dp) .padding(8.dp)
.clip(RoundedCornerShape(16.dp)) .clip(animateDpAsState(
targetValue = if (currentDestination is ChatRouterDestination.Discover) 16.dp else 24.dp,
animationSpec = spring(stiffness = Spring.StiffnessMediumLow),
label = "Discover button corner radius"
).value.let { RoundedCornerShape(it) })
.clickable { .clickable {
onDestinationChanged( onDestinationChanged(
ChatRouterDestination.Discover ChatRouterDestination.Discover
) )
} }
.size(48.dp) .size(48.dp)
.background(MaterialTheme.colorScheme.secondaryContainer), .background(animateColorAsState(
targetValue = if (currentDestination is ChatRouterDestination.Discover) {
MaterialTheme.colorScheme.secondaryContainer
} else MaterialTheme.colorScheme.primaryContainer,
animationSpec = spring(stiffness = Spring.StiffnessMediumLow),
label = "Discover button background"
).value),
contentAlignment = Alignment.Center contentAlignment = Alignment.Center
) { ) {
Icon( Icon(
painter = painterResource(R.drawable.icn_explore_24dp), painter = painterResource(R.drawable.icn_explore_24dp),
contentDescription = stringResource(R.string.discover_alt), contentDescription = stringResource(R.string.discover_alt),
tint = MaterialTheme.colorScheme.onSecondaryContainer tint = if (currentDestination is ChatRouterDestination.Discover) {
MaterialTheme.colorScheme.onSecondaryContainer
} else MaterialTheme.colorScheme.onPrimaryContainer
) )
} }
} }
@ -319,13 +337,13 @@ fun ChannelSideDrawer(
onShowAddServerSheet() onShowAddServerSheet()
} }
.size(48.dp) .size(48.dp)
.background(MaterialTheme.colorScheme.secondaryContainer), .background(MaterialTheme.colorScheme.primaryContainer),
contentAlignment = Alignment.Center contentAlignment = Alignment.Center
) { ) {
Icon( Icon(
painter = painterResource(R.drawable.icn_add_24dp), painter = painterResource(R.drawable.icn_add_24dp),
contentDescription = stringResource(R.string.server_plus_alt), contentDescription = stringResource(R.string.server_plus_alt),
tint = MaterialTheme.colorScheme.onSecondaryContainer tint = MaterialTheme.colorScheme.onPrimaryContainer
) )
} }
} }
@ -566,14 +584,13 @@ fun ChannelSideDrawer(
onClick = { onClick = {
onDestinationChanged(ChatRouterDestination.Friends) onDestinationChanged(ChatRouterDestination.Friends)
}, },
containerColor = MaterialTheme.colorScheme.secondary, containerColor = MaterialTheme.colorScheme.primary,
contentColor = MaterialTheme.colorScheme.onSecondary,
shape = CircleShape shape = CircleShape
) { ) {
Icon( Icon(
painter = painterResource(R.drawable.ic_new_message), painter = painterResource(R.drawable.ic_new_message),
contentDescription = stringResource(R.string.message_friends), contentDescription = stringResource(R.string.message_friends),
tint = MaterialTheme.colorScheme.onSecondary tint = MaterialTheme.colorScheme.onPrimary
) )
} }
} }
@ -929,9 +946,7 @@ fun ChannelItem(
horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.Start), horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.Start),
modifier = Modifier modifier = Modifier
.padding(start = 8.dp, end = 8.dp) .padding(start = 8.dp, end = 8.dp)
.clip( .clip(CircleShape)
CircleShape
)
.combinedClickable( .combinedClickable(
onLongClickLabel = stringResource(R.string.channel_context_sheet_open), onLongClickLabel = stringResource(R.string.channel_context_sheet_open),
onLongClick = { onLongClick = {

View File

@ -7,7 +7,6 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.DropdownMenuItem
@ -42,6 +41,7 @@ import chat.peptide.api.routes.user.unfriendUser
import chat.peptide.api.schemas.User import chat.peptide.api.schemas.User
import chat.peptide.callbacks.Action import chat.peptide.callbacks.Action
import chat.peptide.callbacks.ActionChannel import chat.peptide.callbacks.ActionChannel
import chat.peptide.composables.generic.SquareButton
import chat.peptide.internals.Platform import chat.peptide.internals.Platform
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import logcat.LogPriority import logcat.LogPriority
@ -61,7 +61,7 @@ fun UserButtons(
var menuOpen by remember { mutableStateOf(false) } var menuOpen by remember { mutableStateOf(false) }
if (user.id == null) return Row { if (user.id == null) return Row {
Button( SquareButton(
onClick = { onClick = {
scope.launch { scope.launch {
try { try {
@ -88,7 +88,7 @@ fun UserButtons(
when (user.relationship) { when (user.relationship) {
"None" -> { "None" -> {
if (user.bot == null) { if (user.bot == null) {
Button( SquareButton(
onClick = { onClick = {
scope.launch { scope.launch {
try { try {
@ -134,7 +134,7 @@ fun UserButtons(
} }
"User" -> { "User" -> {
Button( SquareButton(
onClick = { onClick = {
scope.launch { scope.launch {
ActionChannel.send(Action.TopNavigate("settings/profile")) ActionChannel.send(Action.TopNavigate("settings/profile"))
@ -176,7 +176,7 @@ fun UserButtons(
} }
"Outgoing" -> { "Outgoing" -> {
Button( SquareButton(
onClick = { onClick = {
scope.launch { scope.launch {
try { try {
@ -194,7 +194,7 @@ fun UserButtons(
} }
"Incoming" -> { "Incoming" -> {
Button( SquareButton(
onClick = { onClick = {
scope.launch { scope.launch {
try { try {
@ -209,7 +209,7 @@ fun UserButtons(
) { ) {
Text(stringResource(R.string.user_info_sheet_accept_request)) Text(stringResource(R.string.user_info_sheet_accept_request))
} }
Button( SquareButton(
onClick = { onClick = {
scope.launch { scope.launch {
try { try {
@ -231,7 +231,7 @@ fun UserButtons(
} }
"Blocked" -> { "Blocked" -> {
Button( SquareButton(
onClick = { onClick = {
scope.launch { scope.launch {
try { try {

View File

@ -12,12 +12,10 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Slider import androidx.compose.material3.Slider
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
@ -32,6 +30,8 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import chat.peptide.R import chat.peptide.R
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.SquareButton
enum class CornerRadiusPreset(val percentage: Int) { enum class CornerRadiusPreset(val percentage: Int) {
SHARP(0), SHARP(0),
@ -84,7 +84,7 @@ fun CornerRadiusPicker(percentage: Int, onUpdate: (Int) -> Unit, modifier: Modif
} }
}, },
confirmButton = { confirmButton = {
Button( SquareButton(
onClick = { onClick = {
showOtherModal = false showOtherModal = false
onUpdate(sliderPosition.toInt()) onUpdate(sliderPosition.toInt())
@ -94,7 +94,7 @@ fun CornerRadiusPicker(percentage: Int, onUpdate: (Int) -> Unit, modifier: Modif
} }
}, },
dismissButton = { dismissButton = {
TextButton( PepTextButton(
onClick = { onClick = {
showOtherModal = false showOtherModal = false
} }

View File

@ -17,6 +17,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import chat.peptide.R import chat.peptide.R
import chat.peptide.composables.generic.SquareButton
@Composable @Composable
fun DisconnectedScreen(onRetry: () -> Unit) { fun DisconnectedScreen(onRetry: () -> Unit) {
@ -45,7 +46,7 @@ fun DisconnectedScreen(onRetry: () -> Unit) {
.fillMaxWidth() .fillMaxWidth()
) )
Button(onClick = onRetry) { SquareButton(onClick = onRetry) {
Text(stringResource(R.string.tap_to_retry)) Text(stringResource(R.string.tap_to_retry))
} }
} }

View File

@ -19,6 +19,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import chat.peptide.composables.generic.SquareButton
@Composable @Composable
fun SettingsHintBanner( fun SettingsHintBanner(
@ -72,7 +73,7 @@ private fun SimpleSettingsHintBannerPreview() {
) )
}, },
button = { button = {
Button(onClick = {}) { SquareButton(onClick = {}) {
Text("Let's test it out!") Text("Let's test it out!")
} }
}, },

View File

@ -30,6 +30,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.core.net.toUri import androidx.core.net.toUri
import chat.peptide.R import chat.peptide.R
import chat.peptide.composables.generic.SquareButton
import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.PermissionStatus import com.google.accompanist.permissions.PermissionStatus
import com.google.accompanist.permissions.rememberMultiplePermissionsState import com.google.accompanist.permissions.rememberMultiplePermissionsState
@ -116,7 +117,7 @@ fun VoicePermissionSwitch(onCancel: () -> Unit, onPermissionGranted: @Composable
color = MaterialTheme.colorScheme.tertiary, color = MaterialTheme.colorScheme.tertiary,
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) )
Button( SquareButton(
onClick = { onClick = {
if (fullyRevoked) { if (fullyRevoked) {
// Launch settings to allow the user to manually enable permissions // Launch settings to allow the user to manually enable permissions

View File

@ -102,12 +102,12 @@ fun VoiceSheet(
Text("status = ${room.state.name}") Text("status = ${room.state.name}")
} }
item(key = "controls") { item(key = "controls") {
Button(onClick = { SquareButton(onClick = {
room.setMicrophoneMute(true) room.setMicrophoneMute(true)
}) { }) {
Text("mute 🎤🫷😤") Text("mute 🎤🫷😤")
} }
Button(onClick = { SquareButton(onClick = {
room.setMicrophoneMute(false) room.setMicrophoneMute(false)
}) { }) {
Text("unmute 🗣️📢🔥") Text("unmute 🗣️📢🔥")
@ -117,7 +117,7 @@ fun VoiceSheet(
Row( Row(
horizontalArrangement = Arrangement.spacedBy(16.dp) horizontalArrangement = Arrangement.spacedBy(16.dp)
) { ) {
Button( SquareButton(
colors = ButtonDefaults.buttonColors().copy( colors = ButtonDefaults.buttonColors().copy(
containerColor = MaterialTheme.colorScheme.errorContainer, containerColor = MaterialTheme.colorScheme.errorContainer,
contentColor = MaterialTheme.colorScheme.onErrorContainer, contentColor = MaterialTheme.colorScheme.onErrorContainer,

View File

@ -6,10 +6,8 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.layout.widthIn
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -21,6 +19,8 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import chat.peptide.BuildConfig import chat.peptide.BuildConfig
import chat.peptide.R import chat.peptide.R
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.SquareButton
@Composable @Composable
fun NotificationRationaleDialog( fun NotificationRationaleDialog(
@ -62,15 +62,17 @@ fun NotificationRationaleDialog(
} }
}, },
dismissButton = { dismissButton = {
TextButton(onClick = { PepTextButton(
onSelected(false) onClick = {
onDismiss() onSelected(false)
}) { onDismiss()
}
) {
Text(stringResource(id = R.string.spark_notifications_rationale_dismiss)) Text(stringResource(id = R.string.spark_notifications_rationale_dismiss))
} }
}, },
confirmButton = { confirmButton = {
Button(onClick = { SquareButton(onClick = {
onSelected(true) onSelected(true)
onDismiss() onDismiss()
}) { }) {

View File

@ -55,6 +55,7 @@ import chat.peptide.api.PeptideAPI
import chat.peptide.api.PeptideJson import chat.peptide.api.PeptideJson
import chat.peptide.api.routes.misc.Root import chat.peptide.api.routes.misc.Root
import chat.peptide.api.routes.misc.getRootRoute import chat.peptide.api.routes.misc.getRootRoute
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.PrimaryTabs import chat.peptide.composables.generic.PrimaryTabs
import chat.peptide.internals.Platform import chat.peptide.internals.Platform
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -250,7 +251,7 @@ fun AboutScreen(navController: NavController, viewModel: AboutViewModel = viewMo
1 -> { 1 -> {
DebugInfo(viewModel) DebugInfo(viewModel)
TextButton(onClick = ::copyDebugInformation) { PepTextButton(onClick = ::copyDebugInformation) {
Text(text = stringResource(id = R.string.copy)) Text(text = stringResource(id = R.string.copy))
} }
} }

View File

@ -75,6 +75,7 @@ import chat.peptide.api.routes.push.subscribePush
import chat.peptide.callbacks.Action import chat.peptide.callbacks.Action
import chat.peptide.callbacks.ActionChannel import chat.peptide.callbacks.ActionChannel
import chat.peptide.composables.chat.DisconnectedNotice import chat.peptide.composables.chat.DisconnectedNotice
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.screens.chat.drawer.ChannelSideDrawer import chat.peptide.composables.screens.chat.drawer.ChannelSideDrawer
import chat.peptide.dialogs.NotificationRationaleDialog import chat.peptide.dialogs.NotificationRationaleDialog
import chat.peptide.internals.Changelogs import chat.peptide.internals.Changelogs
@ -554,7 +555,7 @@ fun ChatRouterScreen(
Text(stringResource(id = R.string.notice_platform_mod_dm_description)) Text(stringResource(id = R.string.notice_platform_mod_dm_description))
}, },
confirmButton = { confirmButton = {
TextButton(onClick = { PepTextButton(onClick = {
showPlatformModDMHint = false showPlatformModDMHint = false
DirectMessages.getPlatformModerationDM()?.id?.let { DirectMessages.getPlatformModerationDM()?.id?.let {
viewModel.setSaveDestination(ChatRouterDestination.Channel(it)) viewModel.setSaveDestination(ChatRouterDestination.Channel(it))
@ -714,7 +715,7 @@ fun ChatRouterScreen(
) )
}, },
confirmButton = { confirmButton = {
TextButton(onClick = { PepTextButton(onClick = {
showChannelUnavailableAlert = false showChannelUnavailableAlert = false
}) { }) {
Text(text = stringResource(id = R.string.ok)) Text(text = stringResource(id = R.string.ok))

View File

@ -44,6 +44,8 @@ import androidx.compose.ui.unit.sp
import chat.peptide.R import chat.peptide.R
import chat.peptide.api.PeptideAPI import chat.peptide.api.PeptideAPI
import chat.peptide.api.routes.channel.createInvite import chat.peptide.api.routes.channel.createInvite
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.SquareButton
import chat.peptide.internals.Platform import chat.peptide.internals.Platform
import chat.peptide.ui.theme.FragmentMono import chat.peptide.ui.theme.FragmentMono
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
@ -196,13 +198,13 @@ fun InviteDialog(channelId: String, onDismissRequest: () -> Unit) {
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.End horizontalArrangement = Arrangement.End
) { ) {
TextButton(onClick = { PepTextButton(onClick = {
onDismissRequest() onDismissRequest()
}) { }) {
Text(stringResource(R.string.invite_dialog_close)) Text(stringResource(R.string.invite_dialog_close))
} }
Spacer(Modifier.width(8.dp)) Spacer(Modifier.width(8.dp))
Button(onClick = { SquareButton(onClick = {
clipboardManager.setText(AnnotatedString.Builder().apply { clipboardManager.setText(AnnotatedString.Builder().apply {
append(PeptideAPI.getCurrentInvitesUrl()) append(PeptideAPI.getCurrentInvitesUrl())
append("/") append("/")

View File

@ -44,6 +44,7 @@ import chat.peptide.api.routes.user.blockUser
import chat.peptide.api.schemas.ContentReportReason import chat.peptide.api.schemas.ContentReportReason
import chat.peptide.composables.chat.Message import chat.peptide.composables.chat.Message
import chat.peptide.composables.generic.FormTextField import chat.peptide.composables.generic.FormTextField
import chat.peptide.composables.generic.PepTextButton
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
enum class MessageReportFlowState { enum class MessageReportFlowState {
@ -200,7 +201,7 @@ fun ReportMessageDialog(onDismiss: () -> Unit, messageId: String) {
} }
}, },
dismissButton = { dismissButton = {
TextButton( PepTextButton(
onClick = { onClick = {
onDismiss() onDismiss()
}, },
@ -210,7 +211,7 @@ fun ReportMessageDialog(onDismiss: () -> Unit, messageId: String) {
} }
}, },
confirmButton = { confirmButton = {
TextButton( PepTextButton(
onClick = { onClick = {
state.value = MessageReportFlowState.Sending state.value = MessageReportFlowState.Sending
}, },
@ -305,7 +306,7 @@ fun ReportMessageDialog(onDismiss: () -> Unit, messageId: String) {
} }
}, },
dismissButton = { dismissButton = {
TextButton( PepTextButton(
onClick = { onClick = {
onDismiss() onDismiss()
}, },
@ -315,7 +316,7 @@ fun ReportMessageDialog(onDismiss: () -> Unit, messageId: String) {
} }
}, },
confirmButton = { confirmButton = {
TextButton( PepTextButton(
onClick = { onClick = {
scope.launch { scope.launch {
blockUser(message.author ?: return@launch) blockUser(message.author ?: return@launch)
@ -358,7 +359,7 @@ fun ReportMessageDialog(onDismiss: () -> Unit, messageId: String) {
} }
}, },
dismissButton = { dismissButton = {
TextButton( PepTextButton(
onClick = { onClick = {
onDismiss() onDismiss()
}, },

View File

@ -37,6 +37,7 @@ import chat.peptide.api.PeptideAPI
import chat.peptide.api.routes.safety.putServerReport import chat.peptide.api.routes.safety.putServerReport
import chat.peptide.api.schemas.ContentReportReason import chat.peptide.api.schemas.ContentReportReason
import chat.peptide.composables.generic.FormTextField import chat.peptide.composables.generic.FormTextField
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.screens.settings.ServerOverview import chat.peptide.composables.screens.settings.ServerOverview
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -169,7 +170,7 @@ fun ReportServerDialog(onDismiss: () -> Unit, serverId: String) {
} }
}, },
dismissButton = { dismissButton = {
TextButton( PepTextButton(
onClick = { onClick = {
onDismiss() onDismiss()
}, },
@ -179,7 +180,7 @@ fun ReportServerDialog(onDismiss: () -> Unit, serverId: String) {
} }
}, },
confirmButton = { confirmButton = {
TextButton( PepTextButton(
onClick = { onClick = {
state.value = ServerReportFlowState.Sending state.value = ServerReportFlowState.Sending
}, },
@ -263,7 +264,7 @@ fun ReportServerDialog(onDismiss: () -> Unit, serverId: String) {
} }
}, },
confirmButton = { confirmButton = {
TextButton( PepTextButton(
onClick = { onClick = {
onDismiss() onDismiss()
}, },
@ -303,7 +304,7 @@ fun ReportServerDialog(onDismiss: () -> Unit, serverId: String) {
} }
}, },
dismissButton = { dismissButton = {
TextButton( PepTextButton(
onClick = { onClick = {
onDismiss() onDismiss()
}, },

View File

@ -36,6 +36,7 @@ import chat.peptide.api.routes.safety.putUserReport
import chat.peptide.api.routes.user.blockUser import chat.peptide.api.routes.user.blockUser
import chat.peptide.api.schemas.UserReportReason import chat.peptide.api.schemas.UserReportReason
import chat.peptide.composables.generic.FormTextField import chat.peptide.composables.generic.FormTextField
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.screens.settings.UserOverview import chat.peptide.composables.screens.settings.UserOverview
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -162,7 +163,7 @@ fun ReportUserDialog(onDismiss: () -> Unit, userId: String) {
} }
}, },
dismissButton = { dismissButton = {
TextButton( PepTextButton(
onClick = { onClick = {
onDismiss() onDismiss()
}, },
@ -172,7 +173,7 @@ fun ReportUserDialog(onDismiss: () -> Unit, userId: String) {
} }
}, },
confirmButton = { confirmButton = {
TextButton( PepTextButton(
onClick = { onClick = {
state.value = UserReportFlowState.Sending state.value = UserReportFlowState.Sending
}, },
@ -267,7 +268,7 @@ fun ReportUserDialog(onDismiss: () -> Unit, userId: String) {
} }
}, },
dismissButton = { dismissButton = {
TextButton( PepTextButton(
onClick = { onClick = {
onDismiss() onDismiss()
}, },
@ -277,7 +278,7 @@ fun ReportUserDialog(onDismiss: () -> Unit, userId: String) {
} }
}, },
confirmButton = { confirmButton = {
TextButton( PepTextButton(
onClick = { onClick = {
scope.launch { scope.launch {
blockUser(userId) blockUser(userId)
@ -320,7 +321,7 @@ fun ReportUserDialog(onDismiss: () -> Unit, userId: String) {
} }
}, },
dismissButton = { dismissButton = {
TextButton( PepTextButton(
onClick = { onClick = {
onDismiss() onDismiss()
}, },

View File

@ -23,7 +23,6 @@ import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.Close
import androidx.compose.material3.Button
import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
@ -37,7 +36,6 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.TextField import androidx.compose.material3.TextField
import androidx.compose.material3.ToggleFloatingActionButton import androidx.compose.material3.ToggleFloatingActionButton
import androidx.compose.material3.ToggleFloatingActionButtonDefaults.animateIcon import androidx.compose.material3.ToggleFloatingActionButtonDefaults.animateIcon
@ -92,6 +90,8 @@ import chat.peptide.components.vectorassets.HL_USERNAME
import chat.peptide.components.vectorassets.PeptideTagIntro import chat.peptide.components.vectorassets.PeptideTagIntro
import chat.peptide.composables.chat.MemberListItem import chat.peptide.composables.chat.MemberListItem
import chat.peptide.composables.generic.CountableListHeader import chat.peptide.composables.generic.CountableListHeader
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.SquareButton
import chat.peptide.composables.generic.UserAvatar import chat.peptide.composables.generic.UserAvatar
import chat.peptide.internals.extensions.zero import chat.peptide.internals.extensions.zero
import chat.peptide.markdown.jbm.asHexString import chat.peptide.markdown.jbm.asHexString
@ -240,7 +240,7 @@ fun FriendsScreen(topNav: NavController, useDrawer: Boolean = false, onDrawerCli
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
TextButton( PepTextButton(
onClick = { onClick = {
scope.launch { scope.launch {
val clipboardText = val clipboardText =
@ -279,7 +279,7 @@ fun FriendsScreen(topNav: NavController, useDrawer: Boolean = false, onDrawerCli
) { ) {
Text(stringResource(R.string.friends_add_by_tag_sheet_paste_from_clipboard)) Text(stringResource(R.string.friends_add_by_tag_sheet_paste_from_clipboard))
} }
Button( SquareButton(
onClick = { onClick = {
scope.launch { scope.launch {
if (username.isNotBlank() && tag.isNotBlank()) { if (username.isNotBlank() && tag.isNotBlank()) {
@ -353,7 +353,7 @@ fun FriendsScreen(topNav: NavController, useDrawer: Boolean = false, onDrawerCli
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) )
Button( SquareButton(
onClick = { onClick = {
qrResult = null qrResult = null
contents = null contents = null
@ -413,7 +413,7 @@ fun FriendsScreen(topNav: NavController, useDrawer: Boolean = false, onDrawerCli
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) )
Button( SquareButton(
onClick = { onClick = {
scope.launch { scope.launch {
contents?.let { userContents -> contents?.let { userContents ->
@ -451,7 +451,7 @@ fun FriendsScreen(topNav: NavController, useDrawer: Boolean = false, onDrawerCli
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) )
Button( SquareButton(
onClick = { onClick = {
qrResult = null qrResult = null
contents = null contents = null

View File

@ -141,7 +141,9 @@ import chat.peptide.composables.chat.MessageField
import chat.peptide.composables.chat.SystemMessage import chat.peptide.composables.chat.SystemMessage
import chat.peptide.composables.emoji.EmojiPicker import chat.peptide.composables.emoji.EmojiPicker
import chat.peptide.composables.generic.GroupIcon import chat.peptide.composables.generic.GroupIcon
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.PresenceBadge import chat.peptide.composables.generic.PresenceBadge
import chat.peptide.composables.generic.SquareButton
import chat.peptide.composables.generic.UserAvatar import chat.peptide.composables.generic.UserAvatar
import chat.peptide.composables.generic.UserAvatarWidthPlaceholder import chat.peptide.composables.generic.UserAvatarWidthPlaceholder
import chat.peptide.composables.generic.presenceFromStatus import chat.peptide.composables.generic.presenceFromStatus
@ -337,6 +339,13 @@ fun ChannelScreen(
scope.launch { scope.launch {
try { try {
val cameraProvider = cameraProviderFuture.get() val cameraProvider = cameraProviderFuture.get()
// Ensure there's a camera available to bind to
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
if (!cameraProvider.hasCamera(cameraSelector)) {
Toast.makeText(context, "No camera available", Toast.LENGTH_SHORT).show()
Log.e("ChannelScreen", "No camera available to bind")
return@launch
}
cameraProvider.unbindAll() // Unbind previous use cases cameraProvider.unbindAll() // Unbind previous use cases
val name = "peptide-photo-${System.currentTimeMillis()}.jpg" val name = "peptide-photo-${System.currentTimeMillis()}.jpg"
@ -353,6 +362,14 @@ fun ChannelScreen(
) )
.build() .build()
// Bind use cases before taking picture
val preview = CameraPreview.Builder().build() // Dummy preview, not shown
cameraProvider.bindToLifecycle(
lifecycleOwner,
cameraSelector,
preview, // Bind a preview as it's often required
imageCapture
)
imageCapture.takePicture( imageCapture.takePicture(
outputOptions, outputOptions,
ContextCompat.getMainExecutor(context), ContextCompat.getMainExecutor(context),
@ -1091,7 +1108,7 @@ fun ChannelScreen(
Row( Row(
horizontalArrangement = Arrangement.spacedBy(8.dp), horizontalArrangement = Arrangement.spacedBy(8.dp),
) { ) {
Button( SquareButton(
onClick = { onClick = {
viewModel.dismissPhysicalKeyboardSpark() viewModel.dismissPhysicalKeyboardSpark()
}, },
@ -1099,7 +1116,7 @@ fun ChannelScreen(
) { ) {
Text(stringResource(R.string.spark_keyboard_shortcuts_dismiss)) Text(stringResource(R.string.spark_keyboard_shortcuts_dismiss))
} }
TextButton( PepTextButton(
onClick = { onClick = {
(context as Activity).requestShowKeyboardShortcuts() (context as Activity).requestShowKeyboardShortcuts()
}, },

View File

@ -32,6 +32,8 @@ import androidx.compose.ui.unit.dp
import chat.peptide.R import chat.peptide.R
import chat.peptide.composables.generic.DobPicker import chat.peptide.composables.generic.DobPicker
import chat.peptide.composables.generic.DobRegion import chat.peptide.composables.generic.DobRegion
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.SquareButton
import kotlinx.datetime.Clock import kotlinx.datetime.Clock
import kotlinx.datetime.LocalDateTime import kotlinx.datetime.LocalDateTime
import kotlinx.datetime.TimeZone import kotlinx.datetime.TimeZone
@ -171,11 +173,11 @@ fun ChannelScreenAgeGate(
Row( Row(
horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterHorizontally), horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterHorizontally),
) { ) {
Button(onClick = { onDeny() }) { SquareButton(onClick = { onDeny() }) {
Text(stringResource(R.string.channel_age_gate_dob_cancel)) Text(stringResource(R.string.channel_age_gate_dob_cancel))
} }
TextButton(onClick = { onAccept() }, enabled = dobValid) { PepTextButton(onClick = { onAccept() }, enabled = dobValid) {
Text(stringResource(R.string.channel_age_gate_dob_proceed)) Text(stringResource(R.string.channel_age_gate_dob_proceed))
} }
} }

View File

@ -19,6 +19,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import chat.peptide.R import chat.peptide.R
import chat.peptide.api.settings.GeoStateProvider import chat.peptide.api.settings.GeoStateProvider
import chat.peptide.composables.generic.SquareButton
import chat.peptide.composables.vectorassets.GeoGateUX import chat.peptide.composables.vectorassets.GeoGateUX
@Composable @Composable
@ -68,7 +69,7 @@ fun ChannelScreenGeoGate(
} }
} }
Button(onClick = { onAcknowledge() }) { SquareButton(onClick = { onAcknowledge() }) {
Text(stringResource(R.string.geogate_acknowledge)) Text(stringResource(R.string.geogate_acknowledge))
} }
} }

View File

@ -12,6 +12,7 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import chat.peptide.api.settings.FeatureFlags import chat.peptide.api.settings.FeatureFlags
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.screens.labs.ui.mockups.NewLoginExperienceMockup import chat.peptide.screens.labs.ui.mockups.NewLoginExperienceMockup
import chat.peptide.screens.labs.ui.sandbox.CoreLibSandbox import chat.peptide.screens.labs.ui.sandbox.CoreLibSandbox
import chat.peptide.screens.labs.ui.sandbox.GradientEditorSandbox import chat.peptide.screens.labs.ui.sandbox.GradientEditorSandbox
@ -26,7 +27,7 @@ fun LabsGuard(onTurnBack: () -> Unit = {}, content: @Composable () -> Unit) {
AlertDialog( AlertDialog(
onDismissRequest = { onTurnBack() }, onDismissRequest = { onTurnBack() },
confirmButton = { confirmButton = {
TextButton(onClick = { onTurnBack() }) { PepTextButton(onClick = { onTurnBack() }) {
Text("Turn back") Text("Turn back")
} }
}, },

View File

@ -38,6 +38,8 @@ import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import chat.peptide.R import chat.peptide.R
import chat.peptide.api.settings.LoadedSettings import chat.peptide.api.settings.LoadedSettings
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.SquareButton
import chat.peptide.ui.theme.Theme import chat.peptide.ui.theme.Theme
@OptIn(ExperimentalMaterial3ExpressiveApi::class) @OptIn(ExperimentalMaterial3ExpressiveApi::class)
@ -126,13 +128,13 @@ fun NewLoginExperienceMockup(navController: NavController) {
.padding(horizontal = 16.dp) .padding(horizontal = 16.dp)
.widthIn(max = 150.dp) .widthIn(max = 150.dp)
) { ) {
Button( SquareButton(
onClick = { loginNav.navigate("login") }, onClick = { loginNav.navigate("login") },
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text("Log In") Text("Log In")
} }
TextButton( PepTextButton(
onClick = { navController.popBackStack() }, onClick = { navController.popBackStack() },
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
@ -149,7 +151,7 @@ fun NewLoginExperienceMockup(navController: NavController) {
.fillMaxSize() .fillMaxSize()
.background(Color.Blue), Alignment.Center .background(Color.Blue), Alignment.Center
) { ) {
Button(onClick = { loginNav.navigate("greet") }) { SquareButton(onClick = { loginNav.navigate("greet") }) {
Text("Greetings!") Text("Greetings!")
} }
} }

View File

@ -1,6 +1,5 @@
package chat.peptide.screens.labs.ui.sandbox package chat.peptide.screens.labs.ui.sandbox
import androidx.compose.material3.Button
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@ -11,6 +10,7 @@ import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.navigation.NavController import androidx.navigation.NavController
import chat.peptide.composables.generic.SquareButton
import chat.peptide.settings.dsl.SettingsPage import chat.peptide.settings.dsl.SettingsPage
import chat.peptide.ui.theme.FragmentMono import chat.peptide.ui.theme.FragmentMono
@ -33,7 +33,7 @@ fun CoreLibSandbox(navController: NavController) {
) )
} }
) { ) {
Button(onClick = { SquareButton(onClick = {
greeting = librevolt.greet() greeting = librevolt.greet()
}) { }) {
Text("Greet") Text("Greet")

View File

@ -16,6 +16,7 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.navigation.NavController import androidx.navigation.NavController
import chat.peptide.composables.generic.GradientStopEditor import chat.peptide.composables.generic.GradientStopEditor
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.settings.dsl.SettingsPage import chat.peptide.settings.dsl.SettingsPage
@Composable @Composable
@ -35,7 +36,7 @@ fun GradientEditorSandbox(navController: NavController) {
Row( Row(
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
TextButton( PepTextButton(
onClick = { onClick = {
if (segmentCount >= 2) if (segmentCount >= 2)
segmentCount-- segmentCount--
@ -50,7 +51,7 @@ fun GradientEditorSandbox(navController: NavController) {
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
textAlign = TextAlign.Center textAlign = TextAlign.Center
) )
TextButton( PepTextButton(
onClick = { segmentCount++ }, onClick = { segmentCount++ },
modifier = Modifier.weight(1f) modifier = Modifier.weight(1f)
) { ) {

View File

@ -19,6 +19,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.navigation.NavController import androidx.navigation.NavController
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.markdown.jbm.JBM import chat.peptide.markdown.jbm.JBM
import chat.peptide.markdown.jbm.JBMRenderer import chat.peptide.markdown.jbm.JBMRenderer
import chat.peptide.markdown.jbm.LocalJBMarkdownTreeState import chat.peptide.markdown.jbm.LocalJBMarkdownTreeState
@ -65,12 +66,12 @@ fun JBMSandbox(navController: NavController) {
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) )
TextButton(onClick = { PepTextButton(onClick = {
submitMdSource = mdSource submitMdSource = mdSource
}) { }) {
Text("Submit") Text("Submit")
} }
TextButton(onClick = { PepTextButton(onClick = {
submitMdSource = """# Full range of MD now supported! submitMdSource = """# Full range of MD now supported!
1. Text with **bold**, *italics*, and ***both***! 1. Text with **bold**, *italics*, and ***both***!
2. You ~~can't see me~~. 2. You ~~can't see me~~.

View File

@ -39,6 +39,7 @@ import androidx.compose.ui.unit.sp
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import chat.peptide.R import chat.peptide.R
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.SquareButton import chat.peptide.composables.generic.SquareButton
import chat.peptide.composables.generic.SquareElevatedButton import chat.peptide.composables.generic.SquareElevatedButton
@ -151,7 +152,7 @@ fun LoginGreetingScreen(navController: NavController) {
AnimatedVisibility(showBoringButton) { AnimatedVisibility(showBoringButton) {
Spacer(modifier = Modifier.height(10.dp)) Spacer(modifier = Modifier.height(10.dp))
TextButton( PepTextButton(
onClick = { navController.navigate("login2/init") }, onClick = { navController.navigate("login2/init") },
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()

View File

@ -44,6 +44,7 @@ import chat.peptide.api.routes.account.authenticateWithMfaRecoveryCode
import chat.peptide.api.routes.account.authenticateWithMfaTotpCode import chat.peptide.api.routes.account.authenticateWithMfaTotpCode
import chat.peptide.composables.generic.CollapsibleCard import chat.peptide.composables.generic.CollapsibleCard
import chat.peptide.composables.generic.FormTextField import chat.peptide.composables.generic.FormTextField
import chat.peptide.composables.generic.SquareButton
import chat.peptide.persistence.KVStorage import chat.peptide.persistence.KVStorage
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -255,7 +256,7 @@ fun MfaScreen(
value = viewModel.totpCode value = viewModel.totpCode
) )
Button( SquareButton(
onClick = { viewModel.tryAuthorizeTotp(mfaTicket) }, onClick = { viewModel.tryAuthorizeTotp(mfaTicket) },
modifier = Modifier modifier = Modifier
.padding(horizontal = 20.dp, vertical = 10.dp) .padding(horizontal = 20.dp, vertical = 10.dp)
@ -309,7 +310,7 @@ fun MfaScreen(
value = viewModel.recoveryCode value = viewModel.recoveryCode
) )
Button( SquareButton(
onClick = { viewModel.tryAuthorizeRecovery(mfaTicket) }, onClick = { viewModel.tryAuthorizeRecovery(mfaTicket) },
modifier = Modifier modifier = Modifier
.padding(horizontal = 20.dp, vertical = 10.dp) .padding(horizontal = 20.dp, vertical = 10.dp)

View File

@ -38,6 +38,8 @@ import chat.peptide.R
import chat.peptide.api.PeptideAPI import chat.peptide.api.PeptideAPI
import chat.peptide.api.settings.LoadedSettings import chat.peptide.api.settings.LoadedSettings
import chat.peptide.composables.generic.AnyLink import chat.peptide.composables.generic.AnyLink
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.SquareButton
import chat.peptide.composables.generic.Weblink import chat.peptide.composables.generic.Weblink
import chat.peptide.ui.theme.Theme import chat.peptide.ui.theme.Theme
import com.chuckerteam.chucker.api.Chucker import com.chuckerteam.chucker.api.Chucker
@ -140,13 +142,13 @@ private fun LinkPart(windowSizeClass: WindowSizeClass) {
.fillMaxWidth() .fillMaxWidth()
) { ) {
Column(Modifier.widthIn(max = 150.dp)) { Column(Modifier.widthIn(max = 150.dp)) {
Button( SquareButton(
onClick = {/* navController.navigate("login2/existing/details") */ }, onClick = {/* navController.navigate("login2/existing/details") */ },
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text("Log In") // FIXME hardcoded string Text("Log In") // FIXME hardcoded string
} }
TextButton( PepTextButton(
onClick = {/* navController.navigate("login2/new/details") */ }, onClick = {/* navController.navigate("login2/new/details") */ },
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {

View File

@ -27,6 +27,8 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.navigation.NavController import androidx.navigation.NavController
import chat.peptide.R import chat.peptide.R
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.SquareButton
@Composable @Composable
fun RegisterGreetingScreen(navController: NavController) { fun RegisterGreetingScreen(navController: NavController) {
@ -83,7 +85,7 @@ fun RegisterGreetingScreen(navController: NavController) {
} }
Row { Row {
TextButton(onClick = { PepTextButton(onClick = {
navController.popBackStack() navController.popBackStack()
}) { }) {
Text(text = stringResource(R.string.back)) Text(text = stringResource(R.string.back))
@ -91,7 +93,7 @@ fun RegisterGreetingScreen(navController: NavController) {
Spacer(modifier = Modifier.width(10.dp)) Spacer(modifier = Modifier.width(10.dp))
Button(onClick = { SquareButton(onClick = {
navController.navigate("register/details") navController.navigate("register/details")
}) { }) {
Text(text = stringResource(R.string.next)) Text(text = stringResource(R.string.next))

View File

@ -8,7 +8,6 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@ -31,7 +30,6 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.dynamicDarkColorScheme import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.material3.rememberModalBottomSheetState
@ -63,6 +61,7 @@ import chat.peptide.api.PeptideJson
import chat.peptide.api.settings.LoadedSettings import chat.peptide.api.settings.LoadedSettings
import chat.peptide.api.settings.SyncedSettings import chat.peptide.api.settings.SyncedSettings
import chat.peptide.composables.generic.ListHeader import chat.peptide.composables.generic.ListHeader
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.screens.settings.appearance.ColourChip import chat.peptide.composables.screens.settings.appearance.ColourChip
import chat.peptide.composables.screens.settings.appearance.CornerRadiusPicker import chat.peptide.composables.screens.settings.appearance.CornerRadiusPicker
import chat.peptide.sheets.ColourPickerSheet import chat.peptide.sheets.ColourPickerSheet
@ -317,23 +316,12 @@ fun AppearanceSettingsScreen(
ColourChip( ColourChip(
color = Color(0xff333642), color = Color(0xff333642),
text = stringResource(id = R.string.settings_appearance_theme_peptide), text = stringResource(id = R.string.settings_appearance_theme_peptide),
selected = LoadedSettings.theme == Theme.None, selected = LoadedSettings.theme == Theme.PEPTIDE_DARK,
modifier = Modifier modifier = Modifier
.weight(1f) .weight(1f)
.testTag("set_theme_peptide") .testTag("set_theme_peptide")
) { ) {
viewModel.saveNewTheme(Theme.None) viewModel.saveNewTheme(Theme.PEPTIDE_DARK)
}
ColourChip(
color = if (isSystemInDarkTheme()) Color(0xff333642) else Color(0xfff7f7f7),
text = stringResource(id = R.string.settings_appearance_theme_none),
selected = LoadedSettings.theme == Theme.None,
modifier = Modifier
.weight(1f)
.testTag("set_theme_none")
) {
viewModel.saveNewTheme(Theme.None)
} }
if (systemSupportsDynamicColors()) { if (systemSupportsDynamicColors()) {
@ -425,7 +413,7 @@ fun AppearanceSettingsScreen(
.fillMaxWidth() .fillMaxWidth()
.padding(horizontal = 20.dp) .padding(horizontal = 20.dp)
) { ) {
TextButton( PepTextButton(
onClick = { onClick = {
filePicker.launch(arrayOf("*/*")) filePicker.launch(arrayOf("*/*"))
}, },
@ -443,7 +431,7 @@ fun AppearanceSettingsScreen(
) )
} }
TextButton( PepTextButton(
onClick = { onClick = {
fileSaver.launch("${SyncedSettings.android.theme}-colours.rato") fileSaver.launch("${SyncedSettings.android.theme}-colours.rato")
}, },

View File

@ -43,6 +43,7 @@ import chat.peptide.api.settings.MessageReplyStyle
import chat.peptide.api.settings.SpecialEmbedSettings import chat.peptide.api.settings.SpecialEmbedSettings
import chat.peptide.api.settings.SyncedSettings import chat.peptide.api.settings.SyncedSettings
import chat.peptide.composables.generic.ListHeader import chat.peptide.composables.generic.ListHeader
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.RadioItem import chat.peptide.composables.generic.RadioItem
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -141,7 +142,7 @@ fun ChatSettingsScreen(
for (key in LoadedSettings.poorlyFormedSettingsKeys.filter { for (key in LoadedSettings.poorlyFormedSettingsKeys.filter {
it in setOf("ordering", "android", "notifications") it in setOf("ordering", "android", "notifications")
}) { }) {
TextButton( PepTextButton(
onClick = { onClick = {
scope.launch { scope.launch {
when (key) { when (key) {

View File

@ -50,6 +50,8 @@ import androidx.lifecycle.viewModelScope
import androidx.navigation.NavController import androidx.navigation.NavController
import chat.peptide.R import chat.peptide.R
import chat.peptide.api.routes.push.subscribePush import chat.peptide.api.routes.push.subscribePush
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.SquareButton
import chat.peptide.dialogs.NotificationRationaleDialog import chat.peptide.dialogs.NotificationRationaleDialog
import chat.peptide.persistence.Database import chat.peptide.persistence.Database
import chat.peptide.persistence.KVStorage import chat.peptide.persistence.KVStorage
@ -178,7 +180,7 @@ fun DebugSettingsScreen(
} }
}, },
confirmButton = { confirmButton = {
TextButton(onClick = { PepTextButton(onClick = {
showC2dmDataDialogue = false showC2dmDataDialogue = false
}) { }) {
Text("OK") Text("OK")
@ -239,7 +241,7 @@ fun DebugSettingsScreen(
ElevatedButton(onClick = { viewModel.forgetSwipeToReplySpark() }) { ElevatedButton(onClick = { viewModel.forgetSwipeToReplySpark() }) {
Text("Forget swipe to reply spark") Text("Forget swipe to reply spark")
} }
Button(onClick = { viewModel.forgetAllSparks() }) { SquareButton(onClick = { viewModel.forgetAllSparks() }) {
Text("Forget all sparks") Text("Forget all sparks")
} }
} }

View File

@ -25,6 +25,8 @@ import chat.peptide.BuildConfig
import chat.peptide.PeptideApplication import chat.peptide.PeptideApplication
import chat.peptide.api.settings.Experiments import chat.peptide.api.settings.Experiments
import chat.peptide.api.settings.LoadedSettings import chat.peptide.api.settings.LoadedSettings
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.SquareButton
import chat.peptide.persistence.KVStorage import chat.peptide.persistence.KVStorage
import chat.peptide.settings.dsl.SettingsPage import chat.peptide.settings.dsl.SettingsPage
import chat.peptide.settings.dsl.SubcategoryContentInsets import chat.peptide.settings.dsl.SubcategoryContentInsets
@ -121,7 +123,7 @@ fun ExperimentsSettingsScreen(
Text("The changes you made require a restart to take effect.") Text("The changes you made require a restart to take effect.")
}, },
confirmButton = { confirmButton = {
Button( SquareButton(
onClick = { onClick = {
viewModel.restartApp(context) viewModel.restartApp(context)
} }
@ -130,7 +132,7 @@ fun ExperimentsSettingsScreen(
} }
}, },
dismissButton = { dismissButton = {
TextButton( PepTextButton(
onClick = { onClick = {
viewModel.showNeedsRestartAlert.value = false viewModel.showNeedsRestartAlert.value = false
} }

View File

@ -53,6 +53,7 @@ import chat.peptide.api.routes.user.fetchUserProfile
import chat.peptide.api.routes.user.patchSelf import chat.peptide.api.routes.user.patchSelf
import chat.peptide.api.schemas.Profile import chat.peptide.api.schemas.Profile
import chat.peptide.composables.generic.InlineMediaPicker import chat.peptide.composables.generic.InlineMediaPicker
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.screens.settings.RawUserOverview import chat.peptide.composables.screens.settings.RawUserOverview
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
@ -415,7 +416,7 @@ fun ProfileSettingsScreen(
Spacer(Modifier.height(8.dp)) Spacer(Modifier.height(8.dp))
TextButton( PepTextButton(
onClick = { onClick = {
viewModel.saveBio() viewModel.saveBio()
}, },

View File

@ -14,10 +14,7 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FilledTonalButton import androidx.compose.material3.FilledTonalButton
@ -27,7 +24,6 @@ import androidx.compose.material3.LargeTopAppBar
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
@ -55,6 +51,8 @@ import chat.peptide.api.routes.auth.logoutAllSessions
import chat.peptide.api.routes.auth.logoutSessionById import chat.peptide.api.routes.auth.logoutSessionById
import chat.peptide.api.schemas.Session import chat.peptide.api.schemas.Session
import chat.peptide.composables.generic.ListHeader import chat.peptide.composables.generic.ListHeader
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.SquareButton
import chat.peptide.composables.markdown.RichMarkdown import chat.peptide.composables.markdown.RichMarkdown
import chat.peptide.composables.settings.sessions.SessionItem import chat.peptide.composables.settings.sessions.SessionItem
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -114,7 +112,7 @@ fun SessionSettingsScreen(
) )
}, },
confirmButton = { confirmButton = {
Button( SquareButton(
onClick = { onClick = {
viewModel.showLogoutOtherConfirmation = false viewModel.showLogoutOtherConfirmation = false
viewModel.logoutOtherSessions() viewModel.logoutOtherSessions()
@ -124,7 +122,7 @@ fun SessionSettingsScreen(
} }
}, },
dismissButton = { dismissButton = {
TextButton( PepTextButton(
onClick = { onClick = {
viewModel.showLogoutOtherConfirmation = false viewModel.showLogoutOtherConfirmation = false
} }

View File

@ -8,7 +8,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
@ -19,7 +18,6 @@ import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.CompositionLocalProvider
@ -43,6 +41,8 @@ import chat.peptide.api.internals.hasPermission
import chat.peptide.api.routes.channel.leaveDeleteOrCloseChannel import chat.peptide.api.routes.channel.leaveDeleteOrCloseChannel
import chat.peptide.api.schemas.ChannelType import chat.peptide.api.schemas.ChannelType
import chat.peptide.api.settings.FeatureFlags import chat.peptide.api.settings.FeatureFlags
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.SquareButton
import chat.peptide.internals.extensions.rememberChannelPermissions import chat.peptide.internals.extensions.rememberChannelPermissions
import chat.peptide.screens.settings.SettingsIcon import chat.peptide.screens.settings.SettingsIcon
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -64,14 +64,14 @@ fun ChannelSettingsHome(navController: NavController, channelId: String) {
title = { Text(stringResource(R.string.channel_settings_delete_confirm)) }, title = { Text(stringResource(R.string.channel_settings_delete_confirm)) },
text = { Text(stringResource(R.string.channel_settings_delete_confirm_description)) }, text = { Text(stringResource(R.string.channel_settings_delete_confirm_description)) },
dismissButton = { dismissButton = {
TextButton(onClick = { PepTextButton(onClick = {
showDeletionConfirmation = false showDeletionConfirmation = false
}) { }) {
Text(stringResource(R.string.channel_settings_delete_confirm_no)) Text(stringResource(R.string.channel_settings_delete_confirm_no))
} }
}, },
confirmButton = { confirmButton = {
Button(onClick = { SquareButton(onClick = {
showDeletionConfirmation = false showDeletionConfirmation = false
scope.launch { scope.launch {
leaveDeleteOrCloseChannel(channelId) leaveDeleteOrCloseChannel(channelId)

View File

@ -64,6 +64,8 @@ import chat.peptide.api.routes.microservices.autumn.uploadToAutumn
import chat.peptide.api.schemas.Channel import chat.peptide.api.schemas.Channel
import chat.peptide.composables.generic.InlineMediaPicker import chat.peptide.composables.generic.InlineMediaPicker
import chat.peptide.composables.generic.ListHeader import chat.peptide.composables.generic.ListHeader
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.SquareButton
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import io.ktor.http.ContentType import io.ktor.http.ContentType
@ -257,7 +259,7 @@ fun ChannelSettingsOverview(
} }
}, },
confirmButton = { confirmButton = {
Button( SquareButton(
onClick = { onClick = {
viewModel.toggleNsfw() viewModel.toggleNsfw()
} }
@ -270,7 +272,7 @@ fun ChannelSettingsOverview(
} }
}, },
dismissButton = { dismissButton = {
TextButton( PepTextButton(
onClick = { onClick = {
viewModel.showNsfwToggleDialogue = false viewModel.showNsfwToggleDialogue = false
} }

View File

@ -58,6 +58,7 @@ import chat.peptide.api.PeptideAPI
import chat.peptide.api.routes.server.createServer import chat.peptide.api.routes.server.createServer
import chat.peptide.callbacks.Action import chat.peptide.callbacks.Action
import chat.peptide.callbacks.ActionChannel import chat.peptide.callbacks.ActionChannel
import chat.peptide.composables.generic.SquareButton
import chat.peptide.composables.sheets.SheetSelection import chat.peptide.composables.sheets.SheetSelection
import chat.peptide.composables.vectorassets.CreateServer import chat.peptide.composables.vectorassets.CreateServer
import chat.peptide.composables.vectorassets.JoinServer import chat.peptide.composables.vectorassets.JoinServer
@ -307,7 +308,7 @@ fun AddServerSheet(onDismiss: () -> Unit) {
.padding(vertical = 16.dp, horizontal = 8.dp) .padding(vertical = 16.dp, horizontal = 8.dp)
) )
Button( SquareButton(
onClick = { onClick = {
val intent = Intent(context, InviteActivity::class.java) val intent = Intent(context, InviteActivity::class.java)
intent.data = if (inviteState.text.startsWith("https://")) { intent.data = if (inviteState.text.startsWith("https://")) {
@ -319,7 +320,7 @@ fun AddServerSheet(onDismiss: () -> Unit) {
"Invalid URL: ${inviteState.text}", "Invalid URL: ${inviteState.text}",
e e
) )
return@Button return@SquareButton
} }
} else { } else {
"https://${PeptideAPI.getCurrentAppUrl()}/invite/${inviteState.text}".toUri() "https://${PeptideAPI.getCurrentAppUrl()}/invite/${inviteState.text}".toUri()
@ -452,7 +453,7 @@ fun AddServerSheet(onDismiss: () -> Unit) {
.padding(vertical = 16.dp, horizontal = 8.dp) .padding(vertical = 16.dp, horizontal = 8.dp)
) )
Button( SquareButton(
onClick = { onClick = {
serverCreationError = false serverCreationError = false

View File

@ -29,7 +29,6 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Check import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.CheckCircle import androidx.compose.material.icons.filled.CheckCircle
import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.Close
import androidx.compose.material3.Button
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
@ -40,7 +39,6 @@ import androidx.compose.material3.Slider
import androidx.compose.material3.SliderDefaults import androidx.compose.material3.SliderDefaults
import androidx.compose.material3.SliderState import androidx.compose.material3.SliderState
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@ -62,6 +60,8 @@ import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import chat.peptide.R import chat.peptide.R
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.SquareButton
import chat.peptide.internals.TailwindColourScheme import chat.peptide.internals.TailwindColourScheme
import org.intellij.lang.annotations.Language import org.intellij.lang.annotations.Language
@ -629,7 +629,7 @@ fun ColumnScope.ColourPickerSheet(
}, },
) )
TextButton( PepTextButton(
onClick = { onClick = {
try { try {
color = Color(android.graphics.Color.parseColor(hex)) color = Color(android.graphics.Color.parseColor(hex))
@ -671,7 +671,7 @@ fun ColumnScope.ColourPickerSheet(
Modifier.fillMaxWidth(), Modifier.fillMaxWidth(),
verticalArrangement = Arrangement.spacedBy(4.dp) verticalArrangement = Arrangement.spacedBy(4.dp)
) { ) {
TextButton(onClick = onUseDefaultColour, Modifier.fillMaxWidth()) { PepTextButton(onClick = onUseDefaultColour, Modifier.fillMaxWidth()) {
Icon(Icons.Default.CheckCircle, null) Icon(Icons.Default.CheckCircle, null)
Spacer(Modifier.width(8.dp)) Spacer(Modifier.width(8.dp))
Text(stringResource(R.string.colour_picker_use_default)) Text(stringResource(R.string.colour_picker_use_default))
@ -681,12 +681,12 @@ fun ColumnScope.ColourPickerSheet(
Modifier.fillMaxWidth(), Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(4.dp) horizontalArrangement = Arrangement.spacedBy(4.dp)
) { ) {
TextButton(onClick = onDismiss, modifier = Modifier.weight(1f)) { PepTextButton(onClick = onDismiss, modifier = Modifier.weight(1f)) {
Icon(Icons.Default.Close, null) Icon(Icons.Default.Close, null)
Spacer(Modifier.width(8.dp)) Spacer(Modifier.width(8.dp))
Text(stringResource(R.string.colour_picker_cancel)) Text(stringResource(R.string.colour_picker_cancel))
} }
Button( SquareButton(
onClick = { onColourSelected(color.toArgb()) }, onClick = { onColourSelected(color.toArgb()) },
modifier = Modifier.weight(1f) modifier = Modifier.weight(1f)
) { ) {

View File

@ -17,6 +17,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import chat.peptide.R import chat.peptide.R
import chat.peptide.composables.generic.PepTextButton
@Composable @Composable
fun EarlyAccessSheet(onClose: () -> Unit) { fun EarlyAccessSheet(onClose: () -> Unit) {
@ -55,7 +56,7 @@ fun EarlyAccessSheet(onClose: () -> Unit) {
style = MaterialTheme.typography.bodyLarge, style = MaterialTheme.typography.bodyLarge,
textAlign = TextAlign.Center textAlign = TextAlign.Center
) )
TextButton(onClick = onClose, modifier = Modifier.fillMaxWidth()) { PepTextButton(onClick = onClose, modifier = Modifier.fillMaxWidth()) {
Text(stringResource(R.string.spark_early_access_cta)) Text(stringResource(R.string.spark_early_access_cta))
} }
} }

View File

@ -10,14 +10,12 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@ -44,7 +42,9 @@ import chat.peptide.api.routes.channel.react
import chat.peptide.api.settings.Experiments import chat.peptide.api.settings.Experiments
import chat.peptide.callbacks.UiCallbacks import chat.peptide.callbacks.UiCallbacks
import chat.peptide.composables.chat.Message import chat.peptide.composables.chat.Message
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.SheetButton import chat.peptide.composables.generic.SheetButton
import chat.peptide.composables.generic.SquareButton
import chat.peptide.internals.Platform import chat.peptide.internals.Platform
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -76,7 +76,7 @@ fun MessageContextSheet(
var showDeleteMessageConfirmation by remember { mutableStateOf(false) } var showDeleteMessageConfirmation by remember { mutableStateOf(false) }
var showInspectASTSheet by remember { mutableStateOf(false) } var showInspectASTSheet by remember { mutableStateOf(false) }
val showInspectASTSheetButton = val showInspectASTSheetButton =
BuildConfig.DEBUG || (message.content != null && Experiments.useKotlinBasedMarkdownRenderer.isEnabled) BuildConfig.DEBUG && (message.content != null && Experiments.useKotlinBasedMarkdownRenderer.isEnabled)
if (showShareSheet) { if (showShareSheet) {
val shareSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) val shareSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
@ -280,7 +280,7 @@ fun MessageContextSheet(
) )
}, },
confirmButton = { confirmButton = {
Button( SquareButton(
onClick = { onClick = {
showDeleteMessageConfirmation = false showDeleteMessageConfirmation = false
coroutineScope.launch { coroutineScope.launch {
@ -295,7 +295,7 @@ fun MessageContextSheet(
} }
}, },
dismissButton = { dismissButton = {
TextButton( PepTextButton(
onClick = { onClick = {
showDeleteMessageConfirmation = false showDeleteMessageConfirmation = false
} }

View File

@ -16,14 +16,12 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.PrimaryScrollableTabRow import androidx.compose.material3.PrimaryScrollableTabRow
import androidx.compose.material3.Tab import androidx.compose.material3.Tab
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@ -52,7 +50,9 @@ import chat.peptide.api.schemas.Emoji
import chat.peptide.api.schemas.User import chat.peptide.api.schemas.User
import chat.peptide.api.settings.LoadedSettings import chat.peptide.api.settings.LoadedSettings
import chat.peptide.composables.chat.MemberListItem import chat.peptide.composables.chat.MemberListItem
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.RemoteImage import chat.peptide.composables.generic.RemoteImage
import chat.peptide.composables.generic.SquareButton
import chat.peptide.internals.text.MessageProcessor import chat.peptide.internals.text.MessageProcessor
import chat.peptide.persistence.KVStorage import chat.peptide.persistence.KVStorage
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -181,7 +181,7 @@ fun ReactionInfoSheet(messageId: String, emoji: String, onDismiss: () -> Unit) {
title = { Text("Traveller, you may not unsee your knowledge...") }, title = { Text("Traveller, you may not unsee your knowledge...") },
text = { Text("Experimental features are already unlocked.") }, text = { Text("Experimental features are already unlocked.") },
confirmButton = { confirmButton = {
TextButton(onClick = { showEnabledAlreadyAlert = false }) { PepTextButton(onClick = { showEnabledAlreadyAlert = false }) {
Text("OK") Text("OK")
} }
} }
@ -194,7 +194,7 @@ fun ReactionInfoSheet(messageId: String, emoji: String, onDismiss: () -> Unit) {
title = { Text("You hear a faint whisper in the wind...") }, title = { Text("You hear a faint whisper in the wind...") },
text = { Text("Would you like to enable experimental features? They may be unstable.") }, text = { Text("Would you like to enable experimental features? They may be unstable.") },
confirmButton = { confirmButton = {
TextButton(onClick = { PepTextButton(onClick = {
showEnabledConfirmAlert = false showEnabledConfirmAlert = false
LoadedSettings.experimentsEnabled = true LoadedSettings.experimentsEnabled = true
scope.launch { scope.launch {
@ -205,7 +205,7 @@ fun ReactionInfoSheet(messageId: String, emoji: String, onDismiss: () -> Unit) {
} }
}, },
dismissButton = { dismissButton = {
Button(onClick = { showEnabledConfirmAlert = false }) { SquareButton(onClick = { showEnabledConfirmAlert = false }) {
Text("I shall not risk it.") Text("I shall not risk it.")
} }
} }

View File

@ -14,7 +14,6 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.Checkbox import androidx.compose.material3.Checkbox
import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.HorizontalDivider
@ -22,7 +21,6 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.LocalContentColor import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@ -43,7 +41,9 @@ import androidx.core.net.toUri
import chat.peptide.R import chat.peptide.R
import chat.peptide.api.PeptideAPI import chat.peptide.api.PeptideAPI
import chat.peptide.api.routes.server.leaveOrDeleteServer import chat.peptide.api.routes.server.leaveOrDeleteServer
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.SheetButton import chat.peptide.composables.generic.SheetButton
import chat.peptide.composables.generic.SquareButton
import chat.peptide.composables.markdown.RichMarkdown import chat.peptide.composables.markdown.RichMarkdown
import chat.peptide.composables.screens.settings.ServerOverview import chat.peptide.composables.screens.settings.ServerOverview
import chat.peptide.composables.sheets.SheetSelection import chat.peptide.composables.sheets.SheetSelection
@ -116,7 +116,7 @@ fun ServerContextSheet(
} }
}, },
confirmButton = { confirmButton = {
Button( SquareButton(
onClick = { onClick = {
coroutineScope.launch { coroutineScope.launch {
onHideSheet() onHideSheet()
@ -134,7 +134,7 @@ fun ServerContextSheet(
} }
}, },
dismissButton = { dismissButton = {
TextButton( PepTextButton(
onClick = { onClick = {
showLeaveConfirmation = false showLeaveConfirmation = false
} }

View File

@ -13,14 +13,10 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.input.TextFieldLineLimits import androidx.compose.foundation.text.input.TextFieldLineLimits
import androidx.compose.foundation.text.input.rememberTextFieldState import androidx.compose.foundation.text.input.rememberTextFieldState
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Edit
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.TextField import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
@ -36,11 +32,13 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import chat.peptide.R import chat.peptide.R
import chat.peptide.api.PeptideAPI import chat.peptide.api.PeptideAPI
import chat.peptide.api.routes.user.patchSelf import chat.peptide.api.routes.user.patchSelf
import chat.peptide.api.schemas.User import chat.peptide.api.schemas.User
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.SheetButton import chat.peptide.composables.generic.SheetButton
import chat.peptide.composables.generic.asApiName import chat.peptide.composables.generic.asApiName
import chat.peptide.composables.generic.presenceFromStatus import chat.peptide.composables.generic.presenceFromStatus
@ -101,7 +99,7 @@ fun StatusTextEditDialog(
} }
}, },
confirmButton = { confirmButton = {
TextButton( PepTextButton(
enabled = isConfirmEnabled, enabled = isConfirmEnabled,
onClick = { onClick = {
errorText = null errorText = null
@ -110,11 +108,11 @@ fun StatusTextEditDialog(
} else { } else {
if (fieldState.text == initialStatus) { if (fieldState.text == initialStatus) {
onDismiss() onDismiss()
return@TextButton return@PepTextButton
} else if (fieldState.text.isBlank()) { } else if (fieldState.text.isBlank()) {
if (selfUser.status?.text == null) { if (selfUser.status?.text == null) {
onDismiss() onDismiss()
return@TextButton return@PepTextButton
} }
scope.launch { scope.launch {
try { try {
@ -150,7 +148,7 @@ fun StatusTextEditDialog(
} }
}, },
dismissButton = { dismissButton = {
TextButton( PepTextButton(
onClick = onDismiss onClick = onDismiss
) { ) {
Text( Text(
@ -161,6 +159,17 @@ fun StatusTextEditDialog(
) )
} }
@Composable
@Preview
fun StatusTextEditDialogPreview() {
StatusTextEditDialog(
selfUser = User.getPlaceholder("01G00000000000000000000000"),
initialStatus = "This is a test status",
onDismiss = {}
)
}
@Composable @Composable
fun StatusSheet(onBeforeNavigation: () -> Unit, onGoSettings: () -> Unit) { fun StatusSheet(onBeforeNavigation: () -> Unit, onGoSettings: () -> Unit) {
val selfUser = PeptideAPI.userCache[PeptideAPI.selfId]!! val selfUser = PeptideAPI.userCache[PeptideAPI.selfId]!!
@ -253,3 +262,12 @@ fun StatusSheet(onBeforeNavigation: () -> Unit, onGoSettings: () -> Unit) {
} }
@Preview
@Composable
fun StatusSheetPreview() {
StatusSheet(
onBeforeNavigation = {},
onGoSettings = {}
)
}

View File

@ -14,11 +14,9 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.material3.Button
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
@ -40,6 +38,8 @@ import chat.peptide.BuildConfig
import chat.peptide.R import chat.peptide.R
import chat.peptide.api.PeptideAPI import chat.peptide.api.PeptideAPI
import chat.peptide.api.schemas.User import chat.peptide.api.schemas.User
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.SquareButton
import chat.peptide.composables.profile.UserCard import chat.peptide.composables.profile.UserCard
import chat.peptide.internals.Platform import chat.peptide.internals.Platform
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -200,7 +200,7 @@ fun UserCardSheet(user: User?) {
horizontalArrangement = Arrangement.spacedBy(16.dp), horizontalArrangement = Arrangement.spacedBy(16.dp),
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Button( SquareButton(
onClick = { onClick = {
scope.launch { scope.launch {
shareCard() shareCard()
@ -220,7 +220,7 @@ fun UserCardSheet(user: User?) {
) )
} }
TextButton( PepTextButton(
onClick = { onClick = {
scope.launch { scope.launch {
copyCard() copyCard()

View File

@ -19,6 +19,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import chat.peptide.R import chat.peptide.R
import chat.peptide.composables.generic.SquareButton
@Composable @Composable
fun WebHookUserSheet(modifier: Modifier = Modifier) { fun WebHookUserSheet(modifier: Modifier = Modifier) {
@ -45,7 +46,7 @@ fun WebHookUserSheet(modifier: Modifier = Modifier) {
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) )
Button( SquareButton(
onClick = { onClick = {
Toast(context).apply { Toast(context).apply {
setText(context.getString(R.string.comingsoon_toast)) setText(context.getString(R.string.comingsoon_toast))

View File

@ -8,10 +8,8 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -20,6 +18,8 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import chat.peptide.R import chat.peptide.R
import chat.peptide.composables.generic.PepTextButton
import chat.peptide.composables.generic.SquareButton
import chat.peptide.composables.vectorassets.SwipeToReplySpark import chat.peptide.composables.vectorassets.SwipeToReplySpark
@Composable @Composable
@ -51,13 +51,13 @@ fun SwipeToReplySparkSheet(
Column( Column(
verticalArrangement = Arrangement.spacedBy(8.dp) verticalArrangement = Arrangement.spacedBy(8.dp)
) { ) {
TextButton( PepTextButton(
onClick = onOpenOptions, onClick = onOpenOptions,
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text(stringResource(R.string.spark_swipe_to_reply_customise)) Text(stringResource(R.string.spark_swipe_to_reply_customise))
} }
Button( SquareButton(
onClick = onDismissSheet, onClick = onDismissSheet,
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {

View File

@ -5,13 +5,13 @@ import androidx.compose.ui.graphics.Color
object AppColors { object AppColors {
val PrimaryLight = Color(0xFF662D91) val PrimaryLight = Color(0xFF662D91)
val OnPrimaryLight = Color(0xFFFFFFFF) val OnPrimaryLight = Color(0xFFFFFFFD)
val PrimaryContainerLight = Color(0xFFFFD9DC) val PrimaryContainerLight = Color(0xFF662D91)
val OnPrimaryContainerLight = Color(0xFF910031) val OnPrimaryContainerLight = Color(0xFFFFFFFF)
val SecondaryLight = Color(0xFFC0001F) val SecondaryLight = Color(0xFFFFDE17)
val OnSecondaryLight = Color(0xFFFFFFFF) val OnSecondaryLight = Color(0xFF000000)
val SecondaryContainerLight = Color(0xFFFFDAD7) val SecondaryContainerLight = Color(0xFFCBB2E5)
val OnSecondaryContainerLight = Color(0xFF930015) val OnSecondaryContainerLight = Color(0xFFFFDE17)
val TertiaryLight = Color(0xFF0060A9) val TertiaryLight = Color(0xFF0060A9)
val OnTertiaryLight = Color(0xFFFFFFFF) val OnTertiaryLight = Color(0xFFFFFFFF)
val TertiaryContainerLight = Color(0xFFD3E4FF) val TertiaryContainerLight = Color(0xFFD3E4FF)
@ -40,14 +40,14 @@ object AppColors {
val SurfaceContainerHighLight = Color(0xFFE4E8F8) val SurfaceContainerHighLight = Color(0xFFE4E8F8)
val SurfaceContainerHighestLight = Color(0xFFDEE2F2) val SurfaceContainerHighestLight = Color(0xFFDEE2F2)
val PrimaryDark = Color(0xFF3B1954) val PrimaryDark = Color(0xFFFFDE17)
val OnPrimaryDark = Color(0xFFFFFFFD) val OnPrimaryDark = Color(0xFF000000)
val PrimaryContainerDark = Color(0xFF662D91) val PrimaryContainerDark = Color(0xFF332E36)
val OnPrimaryContainerDark = Color(0xFFFFFFFF) val OnPrimaryContainerDark = Color(0xFFFFDE17)
val SecondaryDark = Color(0xFFFFDE17) val SecondaryDark = Color(0xFF662D91)
val OnSecondaryDark = Color(0xFF000000) val OnSecondaryDark = Color(0xFFFFFFFD)
val SecondaryContainerDark = Color(0xFF332E36) val SecondaryContainerDark = Color(0xFF662D91)
val OnSecondaryContainerDark = Color(0xFFFFDE17) val OnSecondaryContainerDark = Color(0xFFFFFFFF)
val TertiaryDark = Color(0xFFA2C9FF) val TertiaryDark = Color(0xFFA2C9FF)
val OnTertiaryDark = Color(0xFF00315B) val OnTertiaryDark = Color(0xFF00315B)
val TertiaryContainerDark = Color(0xFF004881) val TertiaryContainerDark = Color(0xFF004881)

View File

@ -97,7 +97,7 @@ private val PeptideColorScheme = darkColorScheme(
) )
enum class Theme { enum class Theme {
None, PEPTIDE_DARK,
M3Dynamic, M3Dynamic,
} }
@ -120,15 +120,12 @@ fun getColorScheme(
context context
) )
requestedTheme == Theme.None && systemInDarkTheme -> PeptideColorScheme requestedTheme == Theme.PEPTIDE_DARK -> PeptideColorScheme
// requestedTheme == Theme.None && !systemInDarkTheme -> LightColorScheme
else -> PeptideColorScheme else -> PeptideColorScheme
}.copy() }.copy()
val colorSchemeIsDark = when { val colorSchemeIsDark = when {
m3Supported && requestedTheme == Theme.M3Dynamic -> isSystemInDarkTheme() m3Supported && requestedTheme == Theme.M3Dynamic -> isSystemInDarkTheme()
requestedTheme == Theme.None && systemInDarkTheme -> true
requestedTheme == Theme.None && !systemInDarkTheme -> false
else -> true else -> true
} }
@ -140,6 +137,7 @@ fun getColorScheme(
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
ViewCompat.getWindowInsetsController(view)?.isAppearanceLightStatusBars = ViewCompat.getWindowInsetsController(view)?.isAppearanceLightStatusBars =
!colorSchemeIsDark !colorSchemeIsDark
} }
} }
@ -176,15 +174,13 @@ fun systemSupportsDynamicColors(): Boolean {
} }
fun getDefaultTheme(): Theme { fun getDefaultTheme(): Theme {
return when { return Theme.PEPTIDE_DARK
systemSupportsDynamicColors() -> Theme.M3Dynamic
else -> Theme.None
}
} }
fun isThemeDark(theme: Theme, systemIsDark: Boolean): Boolean { fun isThemeDark(theme: Theme, systemIsDark: Boolean): Boolean {
return when (theme) { return when (theme) {
Theme.M3Dynamic, Theme.None -> systemIsDark Theme.M3Dynamic,
Theme.PEPTIDE_DARK -> true
} }
} }

File diff suppressed because one or more lines are too long

View File

@ -485,6 +485,13 @@
<string name="add_server_sheet_step_1c_name_error_range">Server name can be up to %1$d characters in length.</string> <string name="add_server_sheet_step_1c_name_error_range">Server name can be up to %1$d characters in length.</string>
<string name="add_server_sheet_step_1c_error">An error occurred while creating your server. Please try again later.</string> <string name="add_server_sheet_step_1c_error">An error occurred while creating your server. Please try again later.</string>
<string name="add_server_sheet_step_1c_create">Create</string> <string name="add_server_sheet_step_1c_create">Create</string>
<string name="add_server_sheet_title">Add to server</string>
<string name="add_server_sheet_join_by_invite_modal_title">Invite code or link</string>
<string name="add_server_sheet_join_by_invite_modal_hint">Invite code or link</string>
<string name="add_server_sheet_join_by_invite_modal_join">Join</string>
<string name="add_server_sheet_create_new">Create a new server</string>
<string name="add_server_sheet_create_new_modal_title">Create a new server</string>
<string name="add_server_sheet_create_new_modal_under_construction">This feature is currently under construction.</string>
<string name="discover">Discover Peptide</string> <string name="discover">Discover Peptide</string>
@ -695,7 +702,7 @@
<string name="settings_appearance_theme_peptide">Peptide</string> <string name="settings_appearance_theme_peptide">Peptide</string>
<string name="settings_appearance_theme_light">Light</string> <string name="settings_appearance_theme_light">Light</string>
<string name="settings_appearance_theme_amoled">Pure Black</string> <string name="settings_appearance_theme_amoled">Pure Black</string>
<string name="settings_appearance_theme_m3dynamic">Material You</string> <string name="settings_appearance_theme_m3dynamic">Material</string>
<string name="settings_appearance_theme_m3dynamic_unsupported">Material You (unsupported)</string> <string name="settings_appearance_theme_m3dynamic_unsupported">Material You (unsupported)</string>
<string name="settings_appearance_theme_m3dynamic_unsupported_toast">Material You is not supported on this device.</string> <string name="settings_appearance_theme_m3dynamic_unsupported_toast">Material You is not supported on this device.</string>