Add some Preview
This commit is contained in:
parent
23c4b9041a
commit
395d432220
19 changed files with 248 additions and 29 deletions
|
|
@ -49,22 +49,33 @@ import androidx.compose.ui.Modifier
|
|||
import androidx.compose.ui.platform.LocalFocusManager
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
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.sp
|
||||
import io.element.android.features.messages.actionlist.ActionListEvents
|
||||
import io.element.android.features.messages.actionlist.ActionListView
|
||||
import io.element.android.features.messages.actionlist.anActionListState
|
||||
import io.element.android.features.messages.actionlist.model.TimelineItemAction
|
||||
import io.element.android.features.messages.textcomposer.MessageComposerView
|
||||
import io.element.android.features.messages.textcomposer.aMessageComposerState
|
||||
import io.element.android.features.messages.timeline.TimelineView
|
||||
import io.element.android.features.messages.timeline.aTimelineState
|
||||
import io.element.android.features.messages.timeline.createTimelineItemContent
|
||||
import io.element.android.features.messages.timeline.createTimelineItems
|
||||
import io.element.android.features.messages.timeline.model.TimelineItem
|
||||
import io.element.android.libraries.core.data.StableCharSequence
|
||||
import io.element.android.libraries.designsystem.components.avatar.Avatar
|
||||
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
||||
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
|
||||
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
|
||||
import io.element.android.libraries.designsystem.theme.components.Icon
|
||||
import io.element.android.libraries.designsystem.theme.components.IconButton
|
||||
import io.element.android.libraries.designsystem.theme.components.Scaffold
|
||||
import io.element.android.libraries.designsystem.theme.components.Text
|
||||
import io.element.android.libraries.designsystem.theme.components.TopAppBar
|
||||
import io.element.android.libraries.designsystem.utils.LogCompositions
|
||||
import io.element.android.libraries.matrix.core.RoomId
|
||||
import io.element.android.libraries.textcomposer.MessageComposerMode
|
||||
import kotlinx.coroutines.launch
|
||||
import timber.log.Timber
|
||||
|
||||
|
|
@ -72,7 +83,7 @@ import timber.log.Timber
|
|||
fun MessagesView(
|
||||
state: MessagesState,
|
||||
modifier: Modifier = Modifier,
|
||||
onBackPressed: () -> Unit,
|
||||
onBackPressed: () -> Unit = {},
|
||||
) {
|
||||
LogCompositions(tag = "MessagesScreen", msg = "Root")
|
||||
val itemActionsBottomSheetState = rememberModalBottomSheetState(
|
||||
|
|
@ -197,6 +208,35 @@ fun MessagesViewTopBar(
|
|||
)
|
||||
}
|
||||
}
|
||||
|
||||
)
|
||||
}
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun MessagesViewLightPreview() = ElementPreviewLight { ContentToPreview() }
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun MessagesViewDarkPreview() = ElementPreviewDark { ContentToPreview() }
|
||||
|
||||
@Composable
|
||||
private fun ContentToPreview() {
|
||||
MessagesView(
|
||||
MessagesState(
|
||||
roomId = RoomId(""),
|
||||
roomName = "Room name",
|
||||
roomAvatar = AvatarData("Room name"),
|
||||
composerState = aMessageComposerState().copy(
|
||||
text = StableCharSequence("Hello"),
|
||||
isFullScreen = false,
|
||||
mode = MessageComposerMode.Normal("Hello"),
|
||||
),
|
||||
timelineState = aTimelineState().copy(
|
||||
timelineItems = createTimelineItems(createTimelineItemContent()),
|
||||
hasMoreToLoad = false,
|
||||
),
|
||||
actionListState = anActionListState(),
|
||||
eventSink = {}
|
||||
)
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,3 +36,8 @@ data class ActionListState(
|
|||
) : Target
|
||||
}
|
||||
}
|
||||
|
||||
fun anActionListState() = ActionListState(
|
||||
target = ActionListState.Target.None,
|
||||
eventSink = {}
|
||||
)
|
||||
|
|
|
|||
|
|
@ -28,7 +28,6 @@ import androidx.compose.foundation.lazy.LazyColumn
|
|||
import androidx.compose.foundation.lazy.items
|
||||
import androidx.compose.material.ExperimentalMaterialApi
|
||||
import androidx.compose.material.ListItem
|
||||
import androidx.compose.material.LocalContentColor
|
||||
import androidx.compose.material.ModalBottomSheetState
|
||||
import androidx.compose.material.ModalBottomSheetValue
|
||||
import androidx.compose.material.Text
|
||||
|
|
@ -38,12 +37,16 @@ import androidx.compose.runtime.LaunchedEffect
|
|||
import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.runtime.snapshotFlow
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
import io.element.android.features.messages.actionlist.model.TimelineItemAction
|
||||
import io.element.android.features.messages.timeline.createMessageEvent
|
||||
import io.element.android.features.messages.timeline.model.TimelineItem
|
||||
import io.element.android.libraries.designsystem.components.VectorIcon
|
||||
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
|
||||
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
|
||||
import io.element.android.libraries.designsystem.theme.components.ModalBottomSheetLayout
|
||||
import kotlinx.collections.immutable.persistentListOf
|
||||
import kotlinx.coroutines.flow.filter
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
|
|
@ -115,13 +118,13 @@ private fun SheetContent(
|
|||
text = {
|
||||
Text(
|
||||
text = action.title,
|
||||
color = if (action.destructive) MaterialTheme.colorScheme.error else Color.Unspecified,
|
||||
color = if (action.destructive) MaterialTheme.colorScheme.error else MaterialTheme.colorScheme.primary,
|
||||
)
|
||||
},
|
||||
icon = {
|
||||
VectorIcon(
|
||||
resourceId = action.icon,
|
||||
tint = if (action.destructive) MaterialTheme.colorScheme.error else LocalContentColor.current,
|
||||
tint = if (action.destructive) MaterialTheme.colorScheme.error else MaterialTheme.colorScheme.primary,
|
||||
)
|
||||
}
|
||||
)
|
||||
|
|
@ -130,3 +133,57 @@ private fun SheetContent(
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun SheetContentNoneLightPreview() = ElementPreviewLight { ContentNoneToPreview() }
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun SheetContentNoneDarkPreview() = ElementPreviewDark { ContentNoneToPreview() }
|
||||
|
||||
@Composable
|
||||
private fun ContentNoneToPreview() {
|
||||
SheetContent(anActionListState())
|
||||
}
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun SheetContentLoadingLightPreview() = ElementPreviewLight { ContentLoadingToPreview() }
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun SheetContentLoadingDarkPreview() = ElementPreviewDark { ContentLoadingToPreview() }
|
||||
|
||||
@Composable
|
||||
private fun ContentLoadingToPreview() {
|
||||
SheetContent(
|
||||
anActionListState().copy(target = ActionListState.Target.Loading(createMessageEvent()))
|
||||
)
|
||||
}
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun SheetContentSuccessLightPreview() = ElementPreviewLight { ContentSuccessToPreview() }
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun SheetContentSuccessDarkPreview() = ElementPreviewDark { ContentSuccessToPreview() }
|
||||
|
||||
@Composable
|
||||
private fun ContentSuccessToPreview() {
|
||||
SheetContent(
|
||||
anActionListState().copy(
|
||||
target = ActionListState.Target.Success(
|
||||
messageEvent = createMessageEvent(),
|
||||
actions = persistentListOf(
|
||||
TimelineItemAction.Reply,
|
||||
TimelineItemAction.Forward,
|
||||
TimelineItemAction.Copy,
|
||||
TimelineItemAction.Edit,
|
||||
TimelineItemAction.Redact,
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,3 +29,10 @@ data class MessageComposerState(
|
|||
) {
|
||||
val isSendButtonVisible: Boolean = text?.charSequence.isNullOrEmpty().not()
|
||||
}
|
||||
|
||||
fun aMessageComposerState() = MessageComposerState(
|
||||
text = StableCharSequence(""),
|
||||
isFullScreen = false,
|
||||
mode = MessageComposerMode.Normal(content = ""),
|
||||
eventSink = {}
|
||||
)
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ import androidx.compose.runtime.Immutable
|
|||
import io.element.android.features.messages.timeline.model.TimelineItem
|
||||
import io.element.android.libraries.matrix.core.EventId
|
||||
import kotlinx.collections.immutable.ImmutableList
|
||||
import kotlinx.collections.immutable.persistentListOf
|
||||
|
||||
@Immutable
|
||||
data class TimelineState(
|
||||
|
|
@ -28,3 +29,10 @@ data class TimelineState(
|
|||
val highlightedEventId: EventId?,
|
||||
val eventSink: (TimelineEvents) -> Unit
|
||||
)
|
||||
|
||||
fun aTimelineState() = TimelineState(
|
||||
timelineItems = persistentListOf(),
|
||||
hasMoreToLoad = false,
|
||||
highlightedEventId = null,
|
||||
eventSink = {}
|
||||
)
|
||||
|
|
|
|||
|
|
@ -64,7 +64,6 @@ import io.element.android.features.messages.timeline.components.TimelineItemUnkn
|
|||
import io.element.android.features.messages.timeline.model.AggregatedReaction
|
||||
import io.element.android.features.messages.timeline.model.MessagesItemGroupPosition
|
||||
import io.element.android.features.messages.timeline.model.TimelineItem
|
||||
import io.element.android.features.messages.timeline.model.TimelineItemGroupPositionProvider
|
||||
import io.element.android.features.messages.timeline.model.TimelineItemReactions
|
||||
import io.element.android.features.messages.timeline.model.content.MessagesTimelineItemContentProvider
|
||||
import io.element.android.features.messages.timeline.model.content.TimelineItemContent
|
||||
|
|
@ -72,6 +71,7 @@ import io.element.android.features.messages.timeline.model.content.TimelineItemE
|
|||
import io.element.android.features.messages.timeline.model.content.TimelineItemImageContent
|
||||
import io.element.android.features.messages.timeline.model.content.TimelineItemRedactedContent
|
||||
import io.element.android.features.messages.timeline.model.content.TimelineItemTextBasedContent
|
||||
import io.element.android.features.messages.timeline.model.content.TimelineItemTextContent
|
||||
import io.element.android.features.messages.timeline.model.content.TimelineItemUnknownContent
|
||||
import io.element.android.libraries.designsystem.components.avatar.Avatar
|
||||
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
||||
|
|
@ -81,7 +81,6 @@ import io.element.android.libraries.designsystem.theme.components.CircularProgre
|
|||
import io.element.android.libraries.designsystem.theme.components.FloatingActionButton
|
||||
import io.element.android.libraries.designsystem.theme.components.Icon
|
||||
import io.element.android.libraries.designsystem.theme.components.Text
|
||||
import io.element.android.libraries.designsystem.utils.PairCombinedPreviewParameter
|
||||
import io.element.android.libraries.matrix.core.EventId
|
||||
import kotlinx.collections.immutable.ImmutableList
|
||||
import kotlinx.collections.immutable.persistentListOf
|
||||
|
|
@ -366,7 +365,17 @@ fun LoginRootScreenDarkPreview(
|
|||
|
||||
@Composable
|
||||
private fun ContentToPreview(content: TimelineItemContent) {
|
||||
val timelineItems = persistentListOf(
|
||||
val timelineItems = createTimelineItems(content)
|
||||
TimelineView(
|
||||
state = aTimelineState().copy(
|
||||
timelineItems = timelineItems,
|
||||
hasMoreToLoad = true,
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
internal fun createTimelineItems(content: TimelineItemContent): ImmutableList<TimelineItem> {
|
||||
return persistentListOf(
|
||||
// 3 items (First Middle Last) with isMine = false
|
||||
createMessageEvent(
|
||||
isMine = false,
|
||||
|
|
@ -400,21 +409,13 @@ private fun ContentToPreview(content: TimelineItemContent) {
|
|||
groupPosition = MessagesItemGroupPosition.First
|
||||
),
|
||||
)
|
||||
TimelineView(
|
||||
state = TimelineState(
|
||||
timelineItems = timelineItems,
|
||||
hasMoreToLoad = true,
|
||||
highlightedEventId = null,
|
||||
eventSink = {}
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
private fun createMessageEvent(
|
||||
isMine: Boolean,
|
||||
content: TimelineItemContent,
|
||||
groupPosition: MessagesItemGroupPosition
|
||||
): TimelineItem {
|
||||
internal fun createMessageEvent(
|
||||
isMine: Boolean = false,
|
||||
content: TimelineItemContent = createTimelineItemContent(),
|
||||
groupPosition: MessagesItemGroupPosition = MessagesItemGroupPosition.First
|
||||
): TimelineItem.MessageEvent {
|
||||
return TimelineItem.MessageEvent(
|
||||
id = EventId(Math.random().toString()),
|
||||
senderId = "senderId",
|
||||
|
|
@ -430,3 +431,10 @@ private fun createMessageEvent(
|
|||
groupPosition = groupPosition,
|
||||
)
|
||||
}
|
||||
|
||||
internal fun createTimelineItemContent(): TimelineItemContent {
|
||||
return TimelineItemTextContent(
|
||||
body = "Text",
|
||||
htmlDocument = null
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ import io.element.android.features.roomlist.components.RoomSummaryRow
|
|||
import io.element.android.features.roomlist.model.RoomListEvents
|
||||
import io.element.android.features.roomlist.model.RoomListRoomSummary
|
||||
import io.element.android.features.roomlist.model.RoomListState
|
||||
import io.element.android.features.roomlist.model.aRoomListState
|
||||
import io.element.android.features.roomlist.model.stubbedRoomSummaries
|
||||
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
||||
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
|
||||
|
|
@ -165,12 +166,11 @@ fun RoomListViewDarkPreview() = ElementPreviewDark { ContentToPreview() }
|
|||
|
||||
@Composable
|
||||
private fun ContentToPreview() {
|
||||
RoomListContent(
|
||||
roomSummaries = stubbedRoomSummaries(),
|
||||
matrixUser = MatrixUser(id = UserId("@id"), username = "User#1", avatarData = AvatarData("U")),
|
||||
onRoomClicked = {},
|
||||
filter = "filter",
|
||||
onFilterChanged = {},
|
||||
onScrollOver = {}
|
||||
RoomListView(
|
||||
aRoomListState().copy(
|
||||
matrixUser = MatrixUser(id = UserId("@id"), username = "User#1", avatarData = AvatarData("U")),
|
||||
roomList = stubbedRoomSummaries(),
|
||||
filter = "filter",
|
||||
)
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ package io.element.android.features.roomlist.model
|
|||
import androidx.compose.runtime.Immutable
|
||||
import io.element.android.libraries.matrix.ui.model.MatrixUser
|
||||
import kotlinx.collections.immutable.ImmutableList
|
||||
import kotlinx.collections.immutable.persistentListOf
|
||||
|
||||
@Immutable
|
||||
data class RoomListState(
|
||||
|
|
@ -27,3 +28,10 @@ data class RoomListState(
|
|||
val filter: String,
|
||||
val eventSink: (RoomListEvents) -> Unit
|
||||
)
|
||||
|
||||
fun aRoomListState() = RoomListState(
|
||||
matrixUser = null,
|
||||
roomList = persistentListOf(),
|
||||
filter = "",
|
||||
eventSink = {}
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue