feat: add button to reveal images in timelines (#106)
This commit is contained in:
parent
92d88934aa
commit
4a8e1ce7b0
@ -4,19 +4,37 @@ import androidx.compose.animation.core.InfiniteRepeatableSpec
|
|||||||
import androidx.compose.animation.core.animateFloat
|
import androidx.compose.animation.core.animateFloat
|
||||||
import androidx.compose.animation.core.rememberInfiniteTransition
|
import androidx.compose.animation.core.rememberInfiniteTransition
|
||||||
import androidx.compose.animation.core.tween
|
import androidx.compose.animation.core.tween
|
||||||
|
import androidx.compose.foundation.border
|
||||||
|
import androidx.compose.foundation.clickable
|
||||||
|
import androidx.compose.foundation.layout.Box
|
||||||
|
import androidx.compose.foundation.layout.Row
|
||||||
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.heightIn
|
import androidx.compose.foundation.layout.heightIn
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.foundation.shape.CircleShape
|
||||||
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.filled.Visibility
|
||||||
|
import androidx.compose.material.icons.filled.VisibilityOff
|
||||||
import androidx.compose.material3.CircularProgressIndicator
|
import androidx.compose.material3.CircularProgressIndicator
|
||||||
|
import androidx.compose.material3.Icon
|
||||||
|
import androidx.compose.material3.IconButton
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
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
|
||||||
|
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.Modifier
|
||||||
|
import androidx.compose.ui.draw.clip
|
||||||
import androidx.compose.ui.graphics.FilterQuality
|
import androidx.compose.ui.graphics.FilterQuality
|
||||||
import androidx.compose.ui.layout.ContentScale
|
import androidx.compose.ui.layout.ContentScale
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
import androidx.compose.ui.unit.Dp
|
import androidx.compose.ui.unit.Dp
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
|
import com.livefast.eattrash.raccoonforlemmy.core.appearance.theme.Spacing
|
||||||
import com.livefast.eattrash.raccoonforlemmy.core.commonui.components.CustomImage
|
import com.livefast.eattrash.raccoonforlemmy.core.commonui.components.CustomImage
|
||||||
import com.livefast.eattrash.raccoonforlemmy.core.l10n.messages.LocalStrings
|
import com.livefast.eattrash.raccoonforlemmy.core.l10n.messages.LocalStrings
|
||||||
import com.livefast.eattrash.raccoonforlemmy.core.utils.compose.onClick
|
import com.livefast.eattrash.raccoonforlemmy.core.utils.compose.onClick
|
||||||
@ -32,22 +50,38 @@ fun PostCardImage(
|
|||||||
blurred: Boolean = false,
|
blurred: Boolean = false,
|
||||||
onImageClick: ((String) -> Unit)? = null,
|
onImageClick: ((String) -> Unit)? = null,
|
||||||
onDoubleClick: (() -> Unit)? = null,
|
onDoubleClick: (() -> Unit)? = null,
|
||||||
onLongClick: (() -> Unit)? = null,
|
|
||||||
) {
|
) {
|
||||||
if (imageUrl.isNotEmpty()) {
|
if (imageUrl.isEmpty()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var revealing by remember { mutableStateOf(!blurred) }
|
||||||
|
|
||||||
|
Box(
|
||||||
|
modifier =
|
||||||
|
modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.heightIn(min = minHeight, max = maxHeight)
|
||||||
|
.onClick(
|
||||||
|
onDoubleClick = onDoubleClick ?: {},
|
||||||
|
),
|
||||||
|
) {
|
||||||
CustomImage(
|
CustomImage(
|
||||||
modifier =
|
modifier =
|
||||||
modifier.fillMaxWidth()
|
Modifier
|
||||||
.heightIn(min = minHeight, max = maxHeight)
|
.fillMaxSize()
|
||||||
.onClick(
|
.then(
|
||||||
onClick = { onImageClick?.invoke(imageUrl) },
|
if (onImageClick != null) {
|
||||||
onDoubleClick = onDoubleClick ?: {},
|
Modifier.clickable {
|
||||||
onLongClick = onLongClick ?: {},
|
onImageClick(imageUrl)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Modifier
|
||||||
|
},
|
||||||
),
|
),
|
||||||
url = imageUrl,
|
url = imageUrl,
|
||||||
quality = FilterQuality.Low,
|
quality = FilterQuality.Low,
|
||||||
autoload = autoLoadImages,
|
autoload = autoLoadImages,
|
||||||
blurred = blurred,
|
blurred = !revealing,
|
||||||
loadButtonContent = loadButtonContent,
|
loadButtonContent = loadButtonContent,
|
||||||
contentScale = ContentScale.FillWidth,
|
contentScale = ContentScale.FillWidth,
|
||||||
onFailure = {
|
onFailure = {
|
||||||
@ -80,5 +114,40 @@ fun PostCardImage(
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
Row(
|
||||||
|
modifier =
|
||||||
|
Modifier.align(Alignment.BottomEnd).padding(
|
||||||
|
bottom = Spacing.xxs,
|
||||||
|
end = Spacing.xs,
|
||||||
|
),
|
||||||
|
) {
|
||||||
|
val iconModifier =
|
||||||
|
Modifier
|
||||||
|
.border(
|
||||||
|
width = Dp.Hairline,
|
||||||
|
color = MaterialTheme.colorScheme.onBackground,
|
||||||
|
shape = CircleShape,
|
||||||
|
).padding(2.5.dp)
|
||||||
|
.clip(CircleShape)
|
||||||
|
if (blurred) {
|
||||||
|
IconButton(
|
||||||
|
onClick = {
|
||||||
|
revealing = !revealing
|
||||||
|
},
|
||||||
|
) {
|
||||||
|
Icon(
|
||||||
|
modifier = iconModifier,
|
||||||
|
imageVector =
|
||||||
|
if (revealing) {
|
||||||
|
Icons.Default.VisibilityOff
|
||||||
|
} else {
|
||||||
|
Icons.Default.Visibility
|
||||||
|
},
|
||||||
|
contentDescription = null,
|
||||||
|
tint = MaterialTheme.colorScheme.onBackground,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user