feat: redesign user info sheet
Signed-off-by: Infi <infi@infi.sh>
This commit is contained in:
parent
4654a29506
commit
9e3543be37
|
|
@ -7,14 +7,9 @@ import androidx.compose.runtime.Composable
|
|||
import androidx.compose.ui.graphics.Brush
|
||||
import androidx.compose.ui.graphics.Brush.Companion.linearGradient
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.SolidColor
|
||||
|
||||
// color is spelled american because Color from compose is spelled american
|
||||
fun Brush.Companion.solidColor(colour: Color) = linearGradient(
|
||||
colorStops = arrayOf(
|
||||
0f to colour,
|
||||
1f to colour
|
||||
)
|
||||
)
|
||||
fun Brush.Companion.solidColor(colour: Color) = SolidColor(colour)
|
||||
|
||||
// Some colours that are not present in Android's built-in list.
|
||||
// not exhaustive, but covers most of the ones I've seen in the wild
|
||||
|
|
|
|||
|
|
@ -65,6 +65,25 @@ data class User(
|
|||
}
|
||||
}
|
||||
|
||||
enum class UserBadges(val value: Long) {
|
||||
Developer(1L shl 0),
|
||||
Translator(1L shl 1),
|
||||
Supporter(1L shl 2),
|
||||
ResponsibleDisclosure(1L shl 3),
|
||||
Founder(1L shl 4),
|
||||
PlatformModeration(1L shl 5),
|
||||
ActiveSupporter(1L shl 6),
|
||||
Paw(1L shl 7),
|
||||
EarlyAdopter(1L shl 8),
|
||||
ReservedRelevantJokeBadge1(1L shl 9),
|
||||
ReservedRelevantJokeBadge2(1L shl 10),
|
||||
}
|
||||
|
||||
infix fun Long?.has(flag: UserBadges): Boolean {
|
||||
if (this == null) return false
|
||||
return this and flag.value == flag.value
|
||||
}
|
||||
|
||||
@Serializable
|
||||
data class Bot(
|
||||
val owner: String? = null
|
||||
|
|
|
|||
|
|
@ -0,0 +1,39 @@
|
|||
package chat.revolt.components.chat
|
||||
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.shape.CircleShape
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.graphics.Brush
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Composable
|
||||
fun RoleListEntry(label: String, brush: Brush, modifier: Modifier = Modifier) {
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
modifier = modifier
|
||||
) {
|
||||
Text(
|
||||
text = label,
|
||||
maxLines = 1,
|
||||
overflow = TextOverflow.Ellipsis
|
||||
)
|
||||
|
||||
Spacer(Modifier.weight(1f))
|
||||
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.clip(CircleShape)
|
||||
.size(14.dp)
|
||||
.background(brush = brush)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,184 @@
|
|||
package chat.revolt.components.chat
|
||||
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.ExperimentalLayoutApi
|
||||
import androidx.compose.foundation.layout.FlowRow
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.layout.width
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.painter.Painter
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
import chat.revolt.R
|
||||
import chat.revolt.api.schemas.UserBadges
|
||||
import chat.revolt.api.schemas.has
|
||||
|
||||
@Composable
|
||||
fun BadgeListEntryTemplate(
|
||||
label: String,
|
||||
icon: Painter
|
||||
) {
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
Image(
|
||||
painter = icon,
|
||||
contentDescription = null,
|
||||
modifier = Modifier
|
||||
.size(24.dp)
|
||||
)
|
||||
|
||||
Spacer(Modifier.width(8.dp))
|
||||
|
||||
Text(
|
||||
text = label
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun BadgeListEntry(badge: UserBadges) {
|
||||
when (badge.value) {
|
||||
UserBadges.Developer.value -> {
|
||||
BadgeListEntryTemplate(
|
||||
label = stringResource(R.string.user_badge_developer),
|
||||
icon = painterResource(R.drawable.user_badge_developer)
|
||||
)
|
||||
}
|
||||
|
||||
UserBadges.Translator.value -> {
|
||||
BadgeListEntryTemplate(
|
||||
label = stringResource(R.string.user_badge_translator),
|
||||
icon = painterResource(R.drawable.user_badge_translator)
|
||||
)
|
||||
}
|
||||
|
||||
UserBadges.Supporter.value -> {
|
||||
BadgeListEntryTemplate(
|
||||
label = stringResource(R.string.user_badge_supporter),
|
||||
icon = painterResource(R.drawable.user_badge_supporter)
|
||||
)
|
||||
}
|
||||
|
||||
UserBadges.ResponsibleDisclosure.value -> {
|
||||
BadgeListEntryTemplate(
|
||||
label = stringResource(R.string.user_badge_responsible_disclosure),
|
||||
icon = painterResource(R.drawable.user_badge_disclosure)
|
||||
)
|
||||
}
|
||||
|
||||
UserBadges.Founder.value -> {
|
||||
BadgeListEntryTemplate(
|
||||
label = stringResource(R.string.user_badge_founder),
|
||||
icon = painterResource(R.drawable.user_badge_founder)
|
||||
)
|
||||
}
|
||||
|
||||
UserBadges.PlatformModeration.value -> {
|
||||
BadgeListEntryTemplate(
|
||||
label = stringResource(R.string.user_badge_platform_moderation),
|
||||
icon = painterResource(R.drawable.user_badge_moderation)
|
||||
)
|
||||
}
|
||||
|
||||
UserBadges.ActiveSupporter.value -> {
|
||||
BadgeListEntryTemplate(
|
||||
label = stringResource(R.string.user_badge_active_supporter),
|
||||
icon = painterResource(R.drawable.ic_human_greeting_variant_24dp)
|
||||
)
|
||||
}
|
||||
|
||||
UserBadges.Paw.value -> {
|
||||
BadgeListEntryTemplate(
|
||||
label = stringResource(R.string.user_badge_paw),
|
||||
icon = painterResource(R.drawable.user_badge_paw)
|
||||
)
|
||||
}
|
||||
|
||||
UserBadges.EarlyAdopter.value -> {
|
||||
BadgeListEntryTemplate(
|
||||
label = stringResource(R.string.user_badge_early_adopter),
|
||||
icon = painterResource(R.drawable.user_badge_early_adopter)
|
||||
)
|
||||
}
|
||||
|
||||
UserBadges.ReservedRelevantJokeBadge1.value -> {
|
||||
BadgeListEntryTemplate(
|
||||
label = stringResource(R.string.user_badge_reserved_relevant_joke_badge_1),
|
||||
icon = painterResource(R.drawable.user_badge_reserved_relevant_one)
|
||||
)
|
||||
}
|
||||
|
||||
UserBadges.ReservedRelevantJokeBadge2.value -> {
|
||||
BadgeListEntryTemplate(
|
||||
label = stringResource(R.string.user_badge_reserved_relevant_joke_badge_2),
|
||||
icon = painterResource(R.drawable.user_badge_reserved_relevant_two)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun UserBadgeList(badges: Long) {
|
||||
Column(
|
||||
verticalArrangement = Arrangement.spacedBy(8.dp)
|
||||
) {
|
||||
UserBadges.entries
|
||||
.filter { badges has it }
|
||||
.forEach { badge ->
|
||||
BadgeListEntry(badge)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalLayoutApi::class)
|
||||
@Composable
|
||||
fun UserBadgeRow(badges: Long) {
|
||||
FlowRow(
|
||||
horizontalArrangement = Arrangement.spacedBy(8.dp),
|
||||
verticalArrangement = Arrangement.spacedBy(8.dp)
|
||||
) {
|
||||
UserBadges.entries
|
||||
.filter { badges has it }
|
||||
.forEach { badge ->
|
||||
Image(
|
||||
painter = when (badge) {
|
||||
UserBadges.Developer -> painterResource(R.drawable.user_badge_developer)
|
||||
UserBadges.Translator -> painterResource(R.drawable.user_badge_translator)
|
||||
UserBadges.Supporter -> painterResource(R.drawable.user_badge_supporter)
|
||||
UserBadges.ResponsibleDisclosure -> painterResource(R.drawable.user_badge_disclosure)
|
||||
UserBadges.Founder -> painterResource(R.drawable.user_badge_founder)
|
||||
UserBadges.PlatformModeration -> painterResource(R.drawable.user_badge_moderation)
|
||||
UserBadges.ActiveSupporter -> painterResource(R.drawable.ic_human_greeting_variant_24dp)
|
||||
UserBadges.Paw -> painterResource(R.drawable.user_badge_paw)
|
||||
UserBadges.EarlyAdopter -> painterResource(R.drawable.user_badge_early_adopter)
|
||||
UserBadges.ReservedRelevantJokeBadge1 -> painterResource(R.drawable.user_badge_reserved_relevant_one)
|
||||
UserBadges.ReservedRelevantJokeBadge2 -> painterResource(R.drawable.user_badge_reserved_relevant_two)
|
||||
},
|
||||
contentDescription = when (badge) {
|
||||
UserBadges.Developer -> stringResource(R.string.user_badge_developer)
|
||||
UserBadges.Translator -> stringResource(R.string.user_badge_translator)
|
||||
UserBadges.Supporter -> stringResource(R.string.user_badge_supporter)
|
||||
UserBadges.ResponsibleDisclosure -> stringResource(R.string.user_badge_responsible_disclosure)
|
||||
UserBadges.Founder -> stringResource(R.string.user_badge_founder)
|
||||
UserBadges.PlatformModeration -> stringResource(R.string.user_badge_platform_moderation)
|
||||
UserBadges.ActiveSupporter -> stringResource(R.string.user_badge_active_supporter)
|
||||
UserBadges.Paw -> stringResource(R.string.user_badge_paw)
|
||||
UserBadges.EarlyAdopter -> stringResource(R.string.user_badge_early_adopter)
|
||||
UserBadges.ReservedRelevantJokeBadge1 -> stringResource(R.string.user_badge_reserved_relevant_joke_badge_1)
|
||||
UserBadges.ReservedRelevantJokeBadge2 -> stringResource(R.string.user_badge_reserved_relevant_joke_badge_2)
|
||||
},
|
||||
modifier = Modifier
|
||||
.size(32.dp)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -11,7 +11,7 @@ import androidx.compose.material3.Button
|
|||
import androidx.compose.material3.ButtonDefaults
|
||||
import androidx.compose.material3.DropdownMenu
|
||||
import androidx.compose.material3.DropdownMenuItem
|
||||
import androidx.compose.material3.ElevatedButton
|
||||
import androidx.compose.material3.FilledTonalButton
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.IconButton
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
|
|
@ -100,7 +100,7 @@ fun UserButtons(
|
|||
}
|
||||
|
||||
"Friend" -> {
|
||||
ElevatedButton(
|
||||
FilledTonalButton(
|
||||
onClick = {
|
||||
scope.launch {
|
||||
val dm = openDM(user.id)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,85 @@
|
|||
package chat.revolt.components.sheets
|
||||
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.BoxWithConstraints
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.heightIn
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.width
|
||||
import androidx.compose.material3.LocalTextStyle
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.surfaceColorAtElevation
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.CompositionLocalProvider
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.graphics.Brush
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.window.Dialog
|
||||
import chat.revolt.api.internals.solidColor
|
||||
|
||||
@Composable
|
||||
fun SheetTile(
|
||||
modifier: Modifier = Modifier,
|
||||
header: @Composable () -> Unit,
|
||||
contentPreview: @Composable () -> Unit,
|
||||
clickable: Boolean = true,
|
||||
backgroundBrush: Brush = Brush.solidColor(MaterialTheme.colorScheme.surfaceColorAtElevation(2.dp)),
|
||||
content: @Composable () -> Unit,
|
||||
) {
|
||||
var isExpanded by remember { mutableStateOf(false) }
|
||||
|
||||
if (isExpanded) {
|
||||
Dialog(onDismissRequest = {
|
||||
isExpanded = false
|
||||
}) {
|
||||
BoxWithConstraints {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.clip(MaterialTheme.shapes.large)
|
||||
.background(MaterialTheme.colorScheme.surface)
|
||||
.padding(24.dp)
|
||||
.width(maxWidth * 0.85f)
|
||||
.heightIn(max = maxHeight * 0.85f)
|
||||
) {
|
||||
CompositionLocalProvider(LocalTextStyle provides MaterialTheme.typography.headlineMedium) {
|
||||
header()
|
||||
}
|
||||
|
||||
Spacer(Modifier.height(16.dp))
|
||||
|
||||
CompositionLocalProvider(LocalTextStyle provides MaterialTheme.typography.bodyMedium) {
|
||||
content()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.clip(MaterialTheme.shapes.large)
|
||||
.then(if (clickable) Modifier.clickable { isExpanded = true } else Modifier)
|
||||
.background(backgroundBrush)
|
||||
.padding(16.dp)
|
||||
.height(128.dp)
|
||||
.then(modifier)
|
||||
) {
|
||||
CompositionLocalProvider(LocalTextStyle provides MaterialTheme.typography.headlineSmall) {
|
||||
header()
|
||||
}
|
||||
|
||||
Spacer(Modifier.height(16.dp))
|
||||
|
||||
CompositionLocalProvider(LocalTextStyle provides MaterialTheme.typography.bodyMedium) {
|
||||
contentPreview()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,16 +1,15 @@
|
|||
package chat.revolt.sheets
|
||||
|
||||
import android.text.format.DateUtils
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.ExperimentalLayoutApi
|
||||
import androidx.compose.foundation.layout.FlowRow
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material3.CircularProgressIndicator
|
||||
import androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid
|
||||
import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells
|
||||
import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.LocalContentColor
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
|
|
@ -21,25 +20,30 @@ import androidx.compose.runtime.getValue
|
|||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Brush
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import chat.revolt.R
|
||||
import chat.revolt.api.RevoltAPI
|
||||
import chat.revolt.api.internals.ULID
|
||||
import chat.revolt.api.internals.WebCompat
|
||||
import chat.revolt.api.internals.solidColor
|
||||
import chat.revolt.api.routes.user.fetchUserProfile
|
||||
import chat.revolt.api.schemas.Profile
|
||||
import chat.revolt.components.chat.RoleChip
|
||||
import chat.revolt.components.chat.RoleListEntry
|
||||
import chat.revolt.components.chat.UserBadgeList
|
||||
import chat.revolt.components.chat.UserBadgeRow
|
||||
import chat.revolt.components.generic.NonIdealState
|
||||
import chat.revolt.components.generic.WebMarkdown
|
||||
import chat.revolt.components.screens.settings.RawUserOverview
|
||||
import chat.revolt.components.screens.settings.UserButtons
|
||||
import chat.revolt.components.sheets.SheetTile
|
||||
import kotlinx.datetime.Instant
|
||||
|
||||
@OptIn(ExperimentalLayoutApi::class)
|
||||
@Composable
|
||||
fun UserInfoSheet(
|
||||
userId: String,
|
||||
|
|
@ -90,72 +94,174 @@ fun UserInfoSheet(
|
|||
return
|
||||
}
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.verticalScroll(rememberScrollState())
|
||||
LazyVerticalStaggeredGrid(
|
||||
columns = StaggeredGridCells.Fixed(2),
|
||||
horizontalArrangement = Arrangement.spacedBy(16.dp),
|
||||
verticalItemSpacing = 16.dp,
|
||||
modifier = Modifier.padding(16.dp)
|
||||
) {
|
||||
RawUserOverview(user, profile)
|
||||
item(key = "overview", span = StaggeredGridItemSpan.FullLine) {
|
||||
RawUserOverview(user, profile, internalPadding = false)
|
||||
}
|
||||
|
||||
Column(
|
||||
modifier = Modifier.padding(start = 16.dp, end = 16.dp, bottom = 16.dp, top = 8.dp)
|
||||
) {
|
||||
UserButtons(
|
||||
user,
|
||||
dismissSheet
|
||||
)
|
||||
|
||||
member?.roles?.let {
|
||||
Text(
|
||||
text = stringResource(id = R.string.user_info_sheet_category_roles),
|
||||
style = MaterialTheme.typography.bodySmall,
|
||||
modifier = Modifier.padding(vertical = 10.dp)
|
||||
)
|
||||
|
||||
FlowRow(
|
||||
horizontalArrangement = Arrangement.spacedBy(8.dp),
|
||||
verticalArrangement = Arrangement.spacedBy(8.dp)
|
||||
) {
|
||||
it
|
||||
.map { roleId -> server?.roles?.get(roleId) }
|
||||
.sortedBy { it?.rank ?: 0.0 }
|
||||
.forEach { role ->
|
||||
role?.let {
|
||||
RoleChip(
|
||||
label = role.name ?: "null",
|
||||
brush = role.colour?.let { WebCompat.parseColour(it) }
|
||||
?: Brush.solidColor(LocalContentColor.current)
|
||||
)
|
||||
}
|
||||
member?.roles?.let {
|
||||
item(key = "roles") {
|
||||
SheetTile(
|
||||
header = {
|
||||
Text(stringResource(R.string.user_info_sheet_category_roles))
|
||||
},
|
||||
contentPreview = {
|
||||
Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
|
||||
it
|
||||
.map { roleId -> server?.roles?.get(roleId) }
|
||||
.sortedBy { it?.rank ?: 0.0 }
|
||||
.take(3)
|
||||
.forEach { role ->
|
||||
role?.let {
|
||||
RoleListEntry(
|
||||
label = role.name ?: "null",
|
||||
brush = role.colour?.let { WebCompat.parseColour(it) }
|
||||
?: Brush.solidColor(LocalContentColor.current)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Text(
|
||||
text = stringResource(id = R.string.user_info_sheet_category_bio),
|
||||
style = MaterialTheme.typography.bodySmall,
|
||||
modifier = Modifier.padding(vertical = 10.dp)
|
||||
)
|
||||
|
||||
if (profile?.content.isNullOrBlank().not()) {
|
||||
WebMarkdown(
|
||||
text = profile!!.content!!,
|
||||
maskLoading = true
|
||||
)
|
||||
} else if (profile != null) {
|
||||
Text(
|
||||
text = stringResource(id = R.string.user_info_sheet_bio_empty),
|
||||
color = LocalContentColor.current.copy(alpha = 0.6f)
|
||||
)
|
||||
} else if (profileNotFound) {
|
||||
Text(
|
||||
text = stringResource(id = R.string.user_info_sheet_bio_not_found),
|
||||
color = LocalContentColor.current.copy(alpha = 0.6f)
|
||||
)
|
||||
} else {
|
||||
Box(contentAlignment = Alignment.Center, modifier = Modifier.fillMaxWidth()) {
|
||||
CircularProgressIndicator()
|
||||
}
|
||||
) {
|
||||
Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
|
||||
it
|
||||
.map { roleId -> server?.roles?.get(roleId) }
|
||||
.sortedBy { it?.rank ?: 0.0 }
|
||||
.forEach { role ->
|
||||
role?.let {
|
||||
RoleListEntry(
|
||||
label = role.name ?: "null",
|
||||
brush = role.colour?.let { WebCompat.parseColour(it) }
|
||||
?: Brush.solidColor(LocalContentColor.current)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
val accountAt = user.id?.let {
|
||||
DateUtils.getRelativeTimeSpanString(
|
||||
ULID.asTimestamp(user.id),
|
||||
System.currentTimeMillis(),
|
||||
DateUtils.MINUTE_IN_MILLIS
|
||||
).toString()
|
||||
}
|
||||
val joinedAt = member?.joinedAt?.let {
|
||||
DateUtils.getRelativeTimeSpanString(
|
||||
Instant.parse(member.joinedAt).toEpochMilliseconds(),
|
||||
System.currentTimeMillis(),
|
||||
DateUtils.MINUTE_IN_MILLIS
|
||||
).toString()
|
||||
}
|
||||
|
||||
item(key = "joined") {
|
||||
SheetTile(
|
||||
header = {
|
||||
Text(stringResource(R.string.user_info_sheet_category_joined))
|
||||
},
|
||||
contentPreview = {
|
||||
if (joinedAt != null && server?.name != null) {
|
||||
Text(
|
||||
text = joinedAt,
|
||||
fontSize = 14.sp
|
||||
)
|
||||
|
||||
Text(
|
||||
text = server.name,
|
||||
style = MaterialTheme.typography.labelMedium,
|
||||
maxLines = 1,
|
||||
overflow = TextOverflow.Ellipsis
|
||||
)
|
||||
|
||||
Spacer(Modifier.height(8.dp))
|
||||
}
|
||||
|
||||
accountAt?.let { _ ->
|
||||
Text(
|
||||
text = accountAt,
|
||||
fontSize = 14.sp
|
||||
)
|
||||
|
||||
Text(
|
||||
text = stringResource(id = R.string.user_info_sheet_category_joined_revolt),
|
||||
style = MaterialTheme.typography.labelMedium
|
||||
)
|
||||
}
|
||||
}
|
||||
) {
|
||||
if (joinedAt != null && server?.name != null) {
|
||||
Text(
|
||||
text = joinedAt,
|
||||
style = MaterialTheme.typography.displaySmall
|
||||
)
|
||||
|
||||
Text(
|
||||
text = server.name,
|
||||
style = MaterialTheme.typography.labelMedium
|
||||
)
|
||||
|
||||
Spacer(Modifier.height(8.dp))
|
||||
}
|
||||
|
||||
accountAt?.let { _ ->
|
||||
Text(
|
||||
text = accountAt,
|
||||
style = MaterialTheme.typography.displaySmall
|
||||
)
|
||||
|
||||
Text(
|
||||
text = stringResource(id = R.string.user_info_sheet_category_joined_revolt),
|
||||
style = MaterialTheme.typography.labelMedium
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((user.badges ?: 0) > 0) {
|
||||
item(key = "info") {
|
||||
SheetTile(
|
||||
header = {
|
||||
Text(stringResource(R.string.user_info_sheet_category_badges))
|
||||
},
|
||||
contentPreview = {
|
||||
user.badges?.let { UserBadgeRow(badges = it) }
|
||||
}
|
||||
) {
|
||||
user.badges?.let { UserBadgeList(badges = it) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (profile?.content.isNullOrBlank().not()) {
|
||||
item(key = "bio", span = StaggeredGridItemSpan.FullLine) {
|
||||
SheetTile(
|
||||
header = {
|
||||
Text(stringResource(R.string.user_info_sheet_category_bio))
|
||||
},
|
||||
contentPreview = {
|
||||
Text(
|
||||
text = profile?.content!!,
|
||||
maxLines = 4,
|
||||
overflow = TextOverflow.Ellipsis
|
||||
)
|
||||
}
|
||||
) {
|
||||
WebMarkdown(
|
||||
text = profile?.content!!,
|
||||
maskLoading = true
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
item(key = "actions", span = StaggeredGridItemSpan.FullLine) {
|
||||
UserButtons(user, dismissSheet)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="343dp"
|
||||
android:height="343dp"
|
||||
android:viewportWidth="343"
|
||||
android:viewportHeight="343">
|
||||
<path
|
||||
android:pathData="M305.65,87.19 L247.51,145.32 194.67,92.47 252.8,34.34C217.61,19.87 175.69,26.9 147.13,55.49 118.56,84.05 111.52,125.99 125.99,161.18l-93.81,93.79c-5.84,5.84 -5.84,15.29 0,21.13l31.72,31.72c5.84,5.84 15.29,5.84 21.13,0l93.79,-93.81c35.18,14.47 77.13,7.43 105.69,-21.13 28.56,-28.58 35.59,-70.52 21.13,-105.69z"
|
||||
android:strokeWidth="1.36402"
|
||||
android:fillColor="#99aab5"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="250dp"
|
||||
android:height="306dp"
|
||||
android:viewportWidth="250"
|
||||
android:viewportHeight="306">
|
||||
<path
|
||||
android:pathData="M124.88,0L0,55.5V138.75C0,215.76 53.28,287.77 124.88,305.25C196.47,287.77 249.75,215.76 249.75,138.75V55.5L124.88,0Z"
|
||||
android:fillColor="#D93C3C"/>
|
||||
<path
|
||||
android:pathData="M125,0.06L124.88,0L0,55.5V138.75C0,215.76 53.28,287.77 124.88,305.25C124.92,305.24 124.96,305.23 125,305.22V0.06Z"
|
||||
android:fillColor="#F55252"/>
|
||||
<path
|
||||
android:pathData="M168.38,126.36H161.06V107.43C161.06,87.32 144.68,71 124.5,71C104.32,71 87.94,87.32 87.94,107.43V126.36H80.63C72.58,126.36 66,132.91 66,140.93V197.86C66,205.87 72.58,212.43 80.63,212.43H168.38C176.42,212.43 183,205.87 183,197.86V140.93C183,132.91 176.42,126.36 168.38,126.36ZM147.17,126.36H101.83V107.43C101.83,94.97 112,84.84 124.5,84.84C137,84.84 147.17,94.97 147.17,107.43V126.36Z"
|
||||
android:fillColor="#ffffff"/>
|
||||
<path
|
||||
android:pathData="M125,212.43H168.38C176.42,212.43 183,205.87 183,197.86V140.93C183,132.91 176.42,126.36 168.38,126.36H161.06V107.43C161.06,87.49 144.95,71.27 125,71V84.85C137.27,85.11 147.17,95.14 147.17,107.43V126.36H125V212.43Z"
|
||||
android:fillColor="#F1F1F1"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="343dp"
|
||||
android:height="343dp"
|
||||
android:viewportWidth="343"
|
||||
android:viewportHeight="343">
|
||||
<path
|
||||
android:pathData="M252.57,30L333.43,171.5L252.57,313H90.86L10,171.5L90.86,30H252.57Z"
|
||||
android:fillColor="#509AF0"/>
|
||||
<path
|
||||
android:pathData="M164.49,82.3C182.31,82.3 196.42,86.59 206.82,95.17C217.3,103.76 222.54,115.72 222.54,131.07C222.54,139.32 220.48,146.79 216.35,153.48C212.22,160.16 206.41,165.52 198.9,169.57C209.05,173.03 216.8,178.56 222.17,186.15C227.61,193.74 230.34,202.95 230.34,213.76C230.34,230.67 225.43,243.88 215.61,253.37C205.79,262.77 192.29,267.48 175.13,267.48C162.09,267.48 150.5,264.34 140.35,258.07V313H104.58V137.01C104.58,126.7 107.18,117.37 112.38,109.04C117.57,100.62 124.79,94.06 134.04,89.36C143.28,84.65 153.43,82.3 164.49,82.3ZM186.77,133.79C186.77,127.03 184.7,121.58 180.58,117.46C176.53,113.33 171.17,111.27 164.49,111.27C157.47,111.27 151.7,113.62 147.16,118.32C142.62,122.94 140.35,129.34 140.35,137.51V231.46C147.12,236.24 156.03,238.63 167.09,238.63C175.5,238.63 182.19,236.28 187.14,231.58C192.09,226.79 194.56,220.69 194.56,213.26C194.56,204.35 192.29,197.42 187.76,192.46C183.3,187.43 176.7,184.91 167.95,184.91H155.95V158.8H165.6C179.71,158.3 186.77,149.97 186.77,133.79Z"
|
||||
android:fillColor="#ffffff"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="343dp"
|
||||
android:height="343dp"
|
||||
android:viewportWidth="343"
|
||||
android:viewportHeight="343">
|
||||
<path
|
||||
android:pathData="m233.2,120.3c0,23.33 -12.69,37.33 -39.78,37.33h-44.85V83.82h44.86c27.08,0 39.78,14.42 39.78,36.49zM32.78,23.58 L76.21,83.96V321.36H148.57V208.96h17.35l61.8,112.42h81.68L240.84,203.44c19.14,-4.67 36.12,-15.75 48.12,-31.41 12,-15.66 18.31,-34.96 17.88,-54.7 0,-51.76 -36.39,-93.75 -109.19,-93.75H76.21Z"
|
||||
android:strokeWidth="0.97733"
|
||||
android:fillColor="#efab44"
|
||||
android:strokeColor="#efab44"/>
|
||||
</vector>
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,25 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="32dp"
|
||||
android:height="32dp"
|
||||
android:viewportWidth="32"
|
||||
android:viewportHeight="32">
|
||||
<group>
|
||||
<clip-path
|
||||
android:pathData="M0,0h32v32h-32z"/>
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M19.25,3.52c0.755,-2.176 3.064,-3.455 5.341,-2.886c2.41,0.603 3.877,3.048 3.275,5.457l-1.866,7.463l0,1.77c0.832,0.315 1.575,0.85 2.142,1.563c0.948,1.193 1.301,2.753 0.959,4.237c-0.116,0.502 -0.238,1.032 -0.363,1.574c-1.257,5.445 -6.105,9.302 -11.693,9.302l-0.045,-0.018l0,0.014c0,0 -0.412,0 -1.035,0c-5.571,0 -10.426,-3.79 -11.778,-9.194c-0.609,-2.431 -1.178,-4.706 -1.178,-4.706c-0.603,-2.409 0.864,-4.855 3.273,-5.457c0.165,-0.042 0.331,-0.073 0.495,-0.096c0.188,-1.832 1.498,-3.436 3.387,-3.909c0.358,-0.089 0.718,-0.133 1.072,-0.135l-0.602,-2.408c-0.602,-2.409 0.865,-4.854 3.275,-5.457c2.277,-0.569 4.586,0.71 5.341,2.886Z"/>
|
||||
<path
|
||||
android:pathData="M7,15c2.268,-2.268 2.496,-1.997 5,-4c0.736,-0.589 1.057,-2 2,-2c0.943,0 1.333,1.333 2,2l8,4l0,9l-8,-2l-9,0l0,-1.606c-0.517,-0.015 -1.015,-0.156 -1.455,-0.402l-0.558,-2.229l2.013,-2.763Z"
|
||||
android:fillColor="#5E3583"/>
|
||||
<path
|
||||
android:pathData="M24.229,17c0.914,0 1.778,0.417 2.348,1.132c0.569,0.716 0.781,1.652 0.575,2.543c-0.116,0.502 -0.238,1.032 -0.363,1.574c-1.047,4.537 -5.088,7.751 -9.744,7.751l-0.045,0c0.001,-0.001 0.001,-0.003 0.002,-0.004l-0.002,0l-1.035,0c-4.653,0 -8.709,-3.166 -9.838,-7.679l-0.582,-2.325c0.681,0.381 1.503,0.511 2.316,0.308c0.01,-0.002 0.021,-0.005 0.031,-0.008c0.933,-0.233 1.709,-0.877 2.111,-1.75c0.138,-0.299 0.226,-0.614 0.266,-0.933c0.694,0.426 1.549,0.577 2.385,0.368c0.001,0 0.002,-0.001 0.002,-0.001c0.201,-0.05 0.393,-0.119 0.574,-0.205c-0.02,0.019 0.978,0.078 0.909,-0.655c0.538,-0.562 0.861,-1.321 0.861,-2.141c0,-0.161 0,-0.313 0,-0.447c0,-0.405 -0.068,-0.807 -0.2,-1.19l-1.059,-3.064l-1.166,-4.668c-0.335,-1.338 0.48,-2.697 1.819,-3.031c1.338,-0.335 2.697,0.48 3.031,1.819l1.825,7.298l1.825,-7.298c0.088,-0.344 0.243,-0.666 0.463,-0.944c0.2,-0.252 0.448,-0.465 0.728,-0.624c0.271,-0.154 0.57,-0.257 0.879,-0.301c0.277,-0.04 0.561,-0.032 0.836,0.022c0.269,0.052 0.529,0.149 0.766,0.286c0.22,0.126 0.42,0.286 0.591,0.473c0.347,0.377 0.574,0.86 0.641,1.369c0.041,0.312 0.02,0.627 -0.054,0.931l-1.925,7.702l0,1.692l-8,0l0,1.663l-1,1.337c0,3.314 3.686,6 7,6l1,-1l0,-2l-1,0c-2.209,0 -4,-1.791 -4,-4l6.229,0ZM4.987,17.763l-0.038,-0.152c-0.335,-1.339 0.48,-2.697 1.818,-3.032c0.521,-0.131 1.045,-0.087 1.511,0.094l0.786,1.573c0.295,0.589 0.306,1.28 0.031,1.878c-0.275,0.598 -0.807,1.039 -1.446,1.198c-0.01,0.003 -0.02,0.005 -0.031,0.008c-1.119,0.28 -2.262,-0.365 -2.6,-1.468l-0.031,-0.099ZM8.803,13.488c-0.26,-1.299 0.546,-2.589 1.846,-2.913c0.876,-0.219 1.761,0.054 2.361,0.645l0.845,2.444c0.096,0.278 0.145,0.57 0.145,0.864c0,0.134 0,0.286 0,0.447c0,0.961 -0.654,1.798 -1.586,2.031c-0.001,0 -0.002,0.001 -0.003,0.001c-0.96,0.24 -1.958,-0.219 -2.401,-1.105l-1.207,-2.414Z"
|
||||
android:fillColor="#C596FD"/>
|
||||
<path
|
||||
android:pathData="M23,23l0,1.158c0,0.923 -0.426,1.796 -1.154,2.364c-0.728,0.569 -1.677,0.77 -2.574,0.546c-0.917,-0.229 -1.782,-0.445 -2.294,-0.574c-0.318,-0.079 -0.643,-0.119 -0.97,-0.119l-0.016,0c-0.327,0 -0.652,0.04 -0.97,0.119c-0.512,0.129 -1.377,0.345 -2.294,0.574c-0.897,0.224 -1.846,0.023 -2.574,-0.546c-0.728,-0.568 -1.154,-1.441 -1.154,-2.364c0,-0.172 0,-0.34 0,-0.501c0,-1.061 0.421,-2.078 1.172,-2.829c0.819,-0.819 1.951,-1.951 3,-3c0.019,-0.019 0.038,-0.038 0.058,-0.057c0.345,-0.163 0.652,-0.386 0.909,-0.655c0.569,-0.299 1.207,-0.459 1.861,-0.459l0,0.343c0,3.314 2.686,6 6,6l1,0Z"
|
||||
android:fillColor="#8149BC"/>
|
||||
<path
|
||||
android:pathData="M23.704,4.041c1.047,0.261 1.589,1.707 1.21,3.226c-0.378,1.52 -1.536,2.542 -2.583,2.281c-1.047,-0.261 -1.589,-1.707 -1.21,-3.227c0.379,-1.519 1.536,-2.541 2.583,-2.28ZM14.761,4.042c-1.047,0.261 -1.596,1.677 -1.227,3.16c0.37,1.483 1.52,2.475 2.567,2.214c1.047,-0.261 1.597,-1.677 1.227,-3.16c-0.37,-1.483 -1.52,-2.475 -2.567,-2.214Z"
|
||||
android:fillColor="#8149BC"/>
|
||||
</group>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="32dp"
|
||||
android:height="32dp"
|
||||
android:viewportWidth="32"
|
||||
android:viewportHeight="32">
|
||||
<group>
|
||||
<clip-path
|
||||
android:pathData="M0,0h32v32h-32z"/>
|
||||
<path
|
||||
android:pathData="M21.369,8.952c0.087,-0.295 0.247,-0.568 0.471,-0.792c0.001,-0.001 0.001,-0.001 0.002,-0.002c0.105,-0.105 0.226,-0.192 0.358,-0.258c0.792,-0.396 3.729,-1.865 5.094,-2.547c0.187,-0.094 0.404,-0.109 0.603,-0.043c0.198,0.066 0.362,0.209 0.456,0.396c0,0 0,0 0,0.001c0.407,0.814 0.407,1.772 0,2.586c-0.575,1.151 -1.401,2.803 -1.906,3.813c-0.009,0.017 -0.018,0.034 -0.027,0.051c0.715,0.946 1.222,2.054 1.462,3.255c0.536,2.68 1.118,5.588 1.118,5.588l-2,0l0,2l-2,-1c0,0 -3.283,2.189 -4.992,3.328c-0.657,0.438 -1.429,0.672 -2.219,0.672c-1.042,0 -2.536,0 -3.578,0c-0.79,0 -1.562,-0.234 -2.219,-0.672c-1.709,-1.139 -4.992,-3.328 -4.992,-3.328l-2,1l0,-2l-2,0l1.118,-5.588c0.24,-1.201 0.747,-2.309 1.462,-3.255c-0.009,-0.017 -0.018,-0.034 -0.027,-0.051c-0.505,-1.01 -1.331,-2.662 -1.906,-3.813c-0.407,-0.814 -0.407,-1.772 0,-2.586c0,-0.001 0,-0.001 0,-0.001c0.094,-0.187 0.258,-0.33 0.456,-0.396c0.199,-0.066 0.416,-0.051 0.603,0.043c1.365,0.682 4.302,2.151 5.094,2.547c0.132,0.066 0.253,0.153 0.358,0.258c0.001,0.001 0.001,0.001 0.002,0.002c0.224,0.224 0.384,0.497 0.471,0.792l1.268,-0.461c2.649,-0.963 5.553,-0.963 8.202,0l1.268,0.461Z"
|
||||
android:strokeWidth="4"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="#000"/>
|
||||
<path
|
||||
android:pathData="M3.993,16.036l0.125,-0.624c0.548,-2.74 2.485,-4.995 5.11,-5.95c0.877,-0.318 1.799,-0.654 2.671,-0.971c2.649,-0.963 5.553,-0.963 8.202,0c0.872,0.317 1.794,0.653 2.671,0.971c2.625,0.955 4.562,3.21 5.11,5.95l0.125,0.624c-2.191,-1.95 -5.028,-3.036 -7.978,-3.036c-0.009,0 -0.019,0 -0.029,0c-1.657,0 -3,1.343 -3,3c0,1.105 0.895,2 2,2c0,0 0,0 0,0l1,1l-4,4l-4,-4l1,-1l0,0c1.105,0 2,-0.895 2,-2c0,-1.657 -1.343,-3 -3,-3c-0.01,0 -0.02,0 -0.029,0c-2.95,0 -5.787,1.086 -7.978,3.036Z"
|
||||
android:fillColor="#878787"/>
|
||||
<path
|
||||
android:pathData="M19.333,19.667c0.01,0.004 3.479,0.333 3.479,0.333c0,0 -0.353,2.537 0,3.459l-2.804,1.869c-0.657,0.438 -1.429,0.672 -2.219,0.672c-1.042,0 -2.536,0 -3.578,0c-0.79,0 -1.562,-0.234 -2.219,-0.672l-2.804,-1.869c0.342,-0.893 0,-3.097 0,-3.097c0,0 3.469,-0.691 3.479,-0.695l3.333,3.333l3.333,-3.333ZM18.014,17.74c-0.606,-0.343 -1.014,-0.994 -1.014,-1.74c0,-1.657 1.343,-3 3,-3c0.01,0 0.02,0 0.029,0c2.95,0 5.787,1.086 7.978,3.036l0.993,4.964l-1.667,0c0,0 -9.328,-3.346 -9.319,-3.26ZM4.667,21l-1.667,0l0.993,-4.964c2.191,-1.95 5.028,-3.036 7.978,-3.036c0.009,0 0.019,0 0.029,0c1.657,0 3,1.343 3,3c0,0.746 -0.408,1.397 -1.014,1.74c0.009,-0.086 -9.319,3.26 -9.319,3.26Z"
|
||||
android:fillColor="#e1e1e1"/>
|
||||
<path
|
||||
android:pathData="M4.667,21l1.626,-2.927c1.054,-1.897 3.053,-3.073 5.222,-3.073c0.003,0 0.006,0 0.009,0c1.367,0 2.476,1.109 2.476,2.476c0,0.001 0,0.002 0,0.002c0,0.933 -0.527,1.785 -1.361,2.202c-0.015,0.008 -0.03,0.016 -0.046,0.023c-1.567,0.784 -2.781,2.126 -3.405,3.756l-2.188,-1.459l-2,1l0,-2l-0.333,0ZM22.812,23.459c-0.624,-1.63 -1.838,-2.972 -3.405,-3.756c-0.016,-0.007 -0.031,-0.015 -0.046,-0.023c-0.834,-0.417 -1.361,-1.269 -1.361,-2.202c0,0 0,-0.001 0,-0.002c0,-1.367 1.109,-2.476 2.476,-2.476c0.003,0 0.006,0 0.009,0c2.169,0 4.168,1.176 5.222,3.073l1.626,2.927l-0.333,0l0,2l-2,-1l-2.188,1.459Z"
|
||||
android:fillColor="#484848"/>
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M11.5,17.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"/>
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M20.5,17.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"/>
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M15.236,21c-0.155,0 -0.308,0.036 -0.447,0.106c-0.047,0.023 -0.1,0.049 -0.158,0.078c-0.901,0.451 -1.266,1.546 -0.815,2.447c0,0.001 0,0.001 0,0.001c0.113,0.226 0.343,0.368 0.595,0.368c0.768,0 2.41,0 3.178,0c0.252,0 0.482,-0.142 0.595,-0.368c0,0 0,0 0,-0.001c0.451,-0.901 0.086,-1.996 -0.815,-2.447c-0.058,-0.029 -0.111,-0.055 -0.158,-0.078c-0.139,-0.07 -0.292,-0.106 -0.447,-0.106c-0.385,0 -1.143,0 -1.528,0Z"/>
|
||||
<path
|
||||
android:pathData="M6.894,12.553c-0.494,0.247 -1.094,0.047 -1.341,-0.447c-0.505,-1.01 -1.331,-2.662 -1.906,-3.813c-0.407,-0.814 -0.407,-1.772 0,-2.586c0,-0.001 0,-0.001 0,-0.001c0.094,-0.187 0.258,-0.33 0.456,-0.396c0.199,-0.066 0.416,-0.051 0.603,0.043c1.365,0.682 4.302,2.151 5.094,2.547c0.132,0.066 0.253,0.153 0.358,0.258c0.001,0.001 0.001,0.001 0.002,0.002c0.426,0.426 0.621,1.031 0.525,1.627c-0.097,0.595 -0.474,1.107 -1.013,1.377c-0.973,0.486 -2.044,1.022 -2.778,1.389ZM25.106,12.553c0.494,0.247 1.094,0.047 1.341,-0.447c0.505,-1.01 1.331,-2.662 1.906,-3.813c0.407,-0.814 0.407,-1.772 0,-2.586c0,-0.001 0,-0.001 0,-0.001c-0.094,-0.187 -0.258,-0.33 -0.456,-0.396c-0.199,-0.066 -0.416,-0.051 -0.603,0.043c-1.365,0.682 -4.302,2.151 -5.094,2.547c-0.132,0.066 -0.253,0.153 -0.358,0.258c-0.001,0.001 -0.001,0.001 -0.002,0.002c-0.426,0.426 -0.621,1.031 -0.525,1.627c0.097,0.595 0.474,1.107 1.013,1.377c0.973,0.486 2.044,1.022 2.778,1.389Z"
|
||||
android:fillColor="#484848"/>
|
||||
</group>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="292dp"
|
||||
android:height="412dp"
|
||||
android:viewportWidth="292"
|
||||
android:viewportHeight="412">
|
||||
<path
|
||||
android:pathData="M123.5,267.04L128.54,258.86L138.24,252.16L154.5,249.78L183.05,252.16L197.73,256.52L203.28,269.6V287.79L197.73,312.32L188.6,316.72L165.6,319.57L154.5,333.7V350.9L169.97,356.45L197.73,361.61L217.16,364.38L243.73,356.45L269.41,342.97L273.81,319.57L276.24,287.79V249.78L273.81,197.23L269.41,151.32L264.38,118.61L258.72,97.23L246.77,76.48L234.19,56.98L212.18,47.55L185.76,43.77H161.24L137.97,47.55L123.5,56.98L111.56,84.02L97.72,126.79L86.4,180.25L71.93,262L63.13,290.3H57.47L38.6,287.79H26.02L15.96,295.33L10.3,307.28L15.96,316.72L31.06,328.67L57.47,333.7L105.89,328.67L128.54,312.32V299.11L123.5,280.24V267.04Z"
|
||||
android:strokeLineJoin="round"
|
||||
android:strokeWidth="10"
|
||||
android:fillColor="#BD0F11"
|
||||
android:strokeColor="#000000"/>
|
||||
<path
|
||||
android:pathData="M143.27,91.29h76.41v25.67h-76.41z"
|
||||
android:fillColor="#9DC7D7"/>
|
||||
<path
|
||||
android:pathData="M138.79,96.11L145.64,109.56L154.76,115.76L166.85,118.17L180.08,120.17H191.34C194.54,119.37 199.78,119.17 202.77,118.17C205.75,117.17 208.05,116.43 209.99,115.76H214.6L218.01,111.95L222.62,104.53"
|
||||
android:strokeLineJoin="round"
|
||||
android:strokeWidth="10"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="#4E626B"/>
|
||||
<path
|
||||
android:pathData="M148.15,123.28L135.46,111.78V99.48L140.22,91.15L148.15,86.79H160.85H175.52H189.79H202.09L212.4,91.15L221.52,99.48L223.9,109L217.95,118.12L208.04,123.28L186.23,127.24H165.6L148.15,123.28Z"
|
||||
android:strokeLineJoin="round"
|
||||
android:strokeWidth="10"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="#000000"/>
|
||||
<path
|
||||
android:pathData="M176.9,99.92L174.29,98.11V96.91L176.9,95.71H181.71H186.92H191.54L196.75,96.91L200.36,98.11L204.57,99.92L202.77,101.12H196.75H191.54H186.12L181.71,99.92H176.9Z"
|
||||
android:strokeLineJoin="bevel"
|
||||
android:strokeWidth="4"
|
||||
android:fillColor="#ffffff"
|
||||
android:strokeColor="#ffffff"/>
|
||||
</vector>
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,52 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="32dp"
|
||||
android:height="32dp"
|
||||
android:viewportWidth="32"
|
||||
android:viewportHeight="32">
|
||||
<path
|
||||
android:pathData="M29,21l-26,0l-1,1l0,3l28,0l0,-3l-1,-1Z"
|
||||
android:fillColor="#60ae33"/>
|
||||
<path
|
||||
android:pathData="M2,7h28v15h-28z"
|
||||
android:fillColor="#80c95b"/>
|
||||
<path
|
||||
android:pathData="M8.5,9.5c0,-0.828 -0.672,-1.5 -1.5,-1.5l-2.5,0c-0.398,0 -0.779,0.158 -1.061,0.439c-0.281,0.282 -0.439,0.663 -0.439,1.061c0,0.828 0.672,1.5 1.5,1.5l2.5,0c0.828,0 1.5,-0.672 1.5,-1.5l0,0Z"
|
||||
android:fillColor="#5da436"/>
|
||||
<path
|
||||
android:pathData="M8.5,19.5c0,-0.828 -0.672,-1.5 -1.5,-1.5l-2.5,0c-0.398,0 -0.779,0.158 -1.061,0.439c-0.281,0.282 -0.439,0.663 -0.439,1.061c0,0.828 0.672,1.5 1.5,1.5l2.5,0c0.828,0 1.5,-0.672 1.5,-1.5l0,0Z"
|
||||
android:fillColor="#5da436"/>
|
||||
<path
|
||||
android:pathData="M29,9.5c0,-0.828 -0.672,-1.5 -1.5,-1.5l-2.5,0c-0.398,0 -0.779,0.158 -1.061,0.439c-0.281,0.282 -0.439,0.663 -0.439,1.061c0,0.828 0.672,1.5 1.5,1.5l2.5,0c0.828,0 1.5,-0.672 1.5,-1.5l0,0Z"
|
||||
android:fillColor="#5da436"/>
|
||||
<path
|
||||
android:pathData="M29,19.5c0,-0.828 -0.672,-1.5 -1.5,-1.5l-2.5,0c-0.398,0 -0.779,0.158 -1.061,0.439c-0.281,0.282 -0.439,0.663 -0.439,1.061c0,0.828 0.672,1.5 1.5,1.5l2.5,0c0.828,0 1.5,-0.672 1.5,-1.5l0,0Z"
|
||||
android:fillColor="#5da436"/>
|
||||
<path
|
||||
android:pathData="M21,14c0,-0.552 -0.448,-1 -1,-1c-0.552,0 -1,0.448 -1,1c0,0.322 0,0.678 0,1c0,0.552 0.448,1 1,1c0.552,0 1,-0.448 1,-1c0,-0.322 0,-0.678 0,-1Z"
|
||||
android:fillColor="#5da436"/>
|
||||
<path
|
||||
android:pathData="M24,14c0,-0.552 -0.448,-1 -1,-1c-0.552,0 -1,0.448 -1,1c0,0.322 0,0.678 0,1c0,0.552 0.448,1 1,1c0.552,0 1,-0.448 1,-1c0,-0.322 0,-0.678 0,-1Z"
|
||||
android:fillColor="#5da436"/>
|
||||
<group>
|
||||
<clip-path
|
||||
android:pathData="M8,11h8v7h-8z"/>
|
||||
<path
|
||||
android:pathData="M16,14l-8,0l0,-1l8,0l0,1Z"
|
||||
android:fillColor="#fff"/>
|
||||
<path
|
||||
android:pathData="M16,16l-8,0l0,-1l8,0l0,1Z"
|
||||
android:fillColor="#fff"/>
|
||||
<path
|
||||
android:pathData="M15,10.335l0,7.665l-1,0l0,-4.5l-1.771,4.25l-0.458,0l-1.771,-4.25l0,4.5l-1,0l0,-7.665l0.706,-0.141l2.294,5.506l2.294,-5.506l0.706,0.141Z"
|
||||
android:fillColor="#fff"/>
|
||||
</group>
|
||||
<path
|
||||
android:pathData="M27,20l-22,0l0,-11l22,0l0,11ZM6,10l0,9l20,0l0,-9l-20,0Z"
|
||||
android:fillColor="#5da436"/>
|
||||
<path
|
||||
android:pathData="M20,22l-1,-1l-6,0l-1,1l0,3l8,0l0,-3Z"
|
||||
android:fillColor="#ccc"/>
|
||||
<path
|
||||
android:pathData="M12,7h8v15h-8z"
|
||||
android:fillColor="#eee"/>
|
||||
</vector>
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="343dp"
|
||||
android:height="343dp"
|
||||
android:viewportWidth="343"
|
||||
android:viewportHeight="343">
|
||||
<group>
|
||||
<clip-path
|
||||
android:pathData="M0,0h343v343h-343z"/>
|
||||
<path
|
||||
android:pathData="M141.42,31l141.42,141.42l-141.42,141.42l-141.42,-141.42z"
|
||||
android:fillColor="#01BE6E"/>
|
||||
<path
|
||||
android:pathData="M137.93,182.46C128.75,173.51 120.67,165.64 116.08,147.51H148.19V133.96H116.3V116.05H102.54V134.18H70.42V147.73H103.19C103.19,147.73 102.97,150.35 102.54,152.32C97.95,170.23 92.49,181.59 70.42,192.73L75.01,206.28C95.98,195.13 106.9,181.15 111.71,165.64C116.3,177.44 124.16,187.05 133.12,195.79L137.93,182.46Z"
|
||||
android:fillColor="#ffffff"/>
|
||||
<path
|
||||
android:pathData="M180.31,138.55H161.96L129.84,228.77H143.6L152.78,201.69H189.48L198.66,228.77H212.42L180.31,138.55ZM157.37,188.14L171.13,152.1L184.9,188.36L157.37,188.14Z"
|
||||
android:fillColor="#ffffff"/>
|
||||
<path
|
||||
android:pathData="M305.47,170.18L208.17,267.48C206.83,268.82 205.15,269.77 203.31,270.23L148.42,281.02L159.21,226.12C159.67,224.29 160.62,222.6 161.96,221.26L259.26,123.97L274.42,108.8L320.42,103.92V155.23L305.47,170.18Z"
|
||||
android:fillColor="#99AAB5"/>
|
||||
<path
|
||||
android:pathData="M208.17,267.48L305.47,170.18L259.26,123.96L161.96,221.26C160.62,222.6 159.67,224.29 159.21,226.12L148.42,281.02L203.31,270.23C205.15,269.77 206.83,268.82 208.17,267.48ZM336.88,138.77C345.06,130.59 345.06,117.34 336.88,109.16L320.28,92.55C312.1,84.38 298.85,84.38 290.67,92.55L274.06,109.16L320.28,155.38L336.88,138.77Z"
|
||||
android:fillColor="#EA596E"/>
|
||||
<path
|
||||
android:pathData="M305.47,170.18L208.17,267.48C206.83,268.82 205.15,269.77 203.31,270.23L148.42,281.02L159.21,226.12C159.67,224.29 160.62,222.6 161.96,221.26L259.26,123.97L305.47,170.18Z"
|
||||
android:fillColor="#FFCC4D"/>
|
||||
</group>
|
||||
</vector>
|
||||
|
|
@ -277,6 +277,10 @@
|
|||
<string name="user_info_sheet_bio_empty">This user hasn\'t set a bio yet.</string>
|
||||
<string name="user_info_sheet_bio_not_found">This user\'s bio could not be fetched. Please verify you share a server or are friends.</string>
|
||||
<string name="user_info_sheet_category_roles">Roles</string>
|
||||
<string name="user_info_sheet_category_joined">Joined</string>
|
||||
<string name="user_info_sheet_category_joined_revolt" translatable="false">Revolt</string>
|
||||
<string name="user_info_sheet_category_badges">Badges</string>
|
||||
<string name="user_info_sheet_category_bot">Bot</string>
|
||||
<string name="user_info_sheet_add_friend">Add Friend</string>
|
||||
<string name="user_info_sheet_send_message">Send Message</string>
|
||||
<string name="user_info_sheet_remove_friend">Remove Friend</string>
|
||||
|
|
@ -290,6 +294,17 @@
|
|||
<string name="user_info_sheet_copy_id">Copy ID</string>
|
||||
<string name="user_info_sheet_failed_to_open_dm">Could not open DM with this user.</string>
|
||||
|
||||
<string name="user_badge_developer">Developer</string>
|
||||
<string name="user_badge_translator">Translator</string>
|
||||
<string name="user_badge_supporter">Supporter</string>
|
||||
<string name="user_badge_responsible_disclosure">Responsible Disclosure</string>
|
||||
<string name="user_badge_founder">Founder</string>
|
||||
<string name="user_badge_platform_moderation">Platform Moderation</string>
|
||||
<string name="user_badge_active_supporter">Active Supporter</string>
|
||||
<string name="user_badge_paw" translatable="false">🦊</string>
|
||||
<string name="user_badge_early_adopter">Early Adopter</string>
|
||||
<string name="user_badge_reserved_relevant_joke_badge_1" translatable="false">sus</string>
|
||||
<string name="user_badge_reserved_relevant_joke_badge_2" translatable="false">It\'s Morbin Time</string>
|
||||
|
||||
<string name="add_server_sheet_title">Add a server</string>
|
||||
<string name="add_server_sheet_join_by_invite">Join by invite code or link</string>
|
||||
|
|
|
|||
Loading…
Reference in New Issue