Gitnuro/src/main/kotlin/com/jetpackduba/gitnuro/ui/components/SideMenuEntry.kt
2023-03-08 01:41:10 +01:00

87 lines
2.9 KiB
Kotlin

package com.jetpackduba.gitnuro.ui.components
import androidx.compose.foundation.hoverable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.collectIsHoveredAsState
import androidx.compose.foundation.layout.*
import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
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.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import com.jetpackduba.gitnuro.AppIcons
import com.jetpackduba.gitnuro.extensions.handMouseClickable
import com.jetpackduba.gitnuro.theme.onBackgroundSecondary
@Composable
fun SideMenuHeader(
text: String,
icon: Painter? = null,
itemsCount: Int,
isExpanded: Boolean,
onExpand: () -> Unit = {},
hoverIcon: @Composable (() -> Unit)? = null,
) {
val hoverInteraction = remember { MutableInteractionSource() }
val isHovered by hoverInteraction.collectIsHoveredAsState()
Row(
modifier = Modifier
.height(36.dp)
.fillMaxWidth()
.hoverable(hoverInteraction)
.handMouseClickable { onExpand() },
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
painter = painterResource(if (isExpanded) AppIcons.EXPAND_MORE else AppIcons.CHEVRON_RIGHT),
contentDescription = null,
tint = MaterialTheme.colors.onBackground,
modifier = Modifier
.padding(horizontal = 8.dp)
.size(16.dp),
)
if (icon != null) {
Icon(
painter = icon,
contentDescription = null,
tint = MaterialTheme.colors.onBackground,
modifier = Modifier
.size(16.dp),
)
}
Text(
text = text,
modifier = Modifier
.padding(horizontal = 8.dp)
.weight(1f),
maxLines = 1,
style = MaterialTheme.typography.body2,
fontWeight = FontWeight.Medium,
color = MaterialTheme.colors.onBackground,
overflow = TextOverflow.Ellipsis,
)
if (hoverIcon != null && isHovered) {
hoverIcon()
} else
Text(
text = itemsCount.toString(),
style = MaterialTheme.typography.body2,
fontWeight = FontWeight.Medium,
color = MaterialTheme.colors.onBackgroundSecondary,
modifier = Modifier.padding(end = 16.dp),
)
}
}