Remove default value for lambda.

We enforce a value to be provided and it's better for code coverage.
This commit is contained in:
Benoit Marty 2023-11-22 17:20:00 +01:00
parent 542de5a487
commit 4ae0790cc1
49 changed files with 424 additions and 225 deletions

View file

@ -134,8 +134,8 @@ class RootFlowNode @AssistedInject constructor(
private suspend fun restoreSessionIfNeeded( private suspend fun restoreSessionIfNeeded(
sessionId: SessionId, sessionId: SessionId,
onFailure: () -> Unit = {}, onFailure: () -> Unit,
onSuccess: (SessionId) -> Unit = {}, onSuccess: (SessionId) -> Unit,
) { ) {
matrixClientsHolder.getOrRestore(sessionId) matrixClientsHolder.getOrRestore(sessionId)
.onSuccess { .onSuccess {
@ -149,8 +149,8 @@ class RootFlowNode @AssistedInject constructor(
} }
private suspend fun tryToRestoreLatestSession( private suspend fun tryToRestoreLatestSession(
onSuccess: (SessionId) -> Unit = {}, onSuccess: (SessionId) -> Unit,
onFailure: () -> Unit = {} onFailure: () -> Unit
) { ) {
val latestSessionId = authenticationService.getLatestSessionId() val latestSessionId = authenticationService.getLatestSessionId()
if (latestSessionId == null) { if (latestSessionId == null) {

View file

@ -35,8 +35,8 @@ import io.element.android.services.apperror.impl.AppErrorView
@Composable @Composable
fun RootView( fun RootView(
state: RootState, state: RootState,
onOpenBugReport: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onOpenBugReport: () -> Unit = {},
children: @Composable BoxScope.() -> Unit, children: @Composable BoxScope.() -> Unit,
) { ) {
Box( Box(
@ -69,7 +69,10 @@ fun RootView(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun RootPreview(@PreviewParameter(RootStateProvider::class) rootState: RootState) = ElementPreview { internal fun RootPreview(@PreviewParameter(RootStateProvider::class) rootState: RootState) = ElementPreview {
RootView(rootState) { RootView(
state = rootState,
onOpenBugReport = {},
) {
Text("Children") Text("Children")
} }
} }

View file

@ -32,8 +32,8 @@ import io.element.android.features.createroom.impl.components.UserListView
import io.element.android.features.createroom.impl.userlist.UserListEvents import io.element.android.features.createroom.impl.userlist.UserListEvents
import io.element.android.features.createroom.impl.userlist.UserListState import io.element.android.features.createroom.impl.userlist.UserListState
import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.aliasScreenTitle import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.Scaffold 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.Text
@ -46,9 +46,9 @@ import io.element.android.libraries.ui.strings.CommonStrings
@Composable @Composable
fun AddPeopleView( fun AddPeopleView(
state: UserListState, state: UserListState,
onBackPressed: () -> Unit,
onNextPressed: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onBackPressed: () -> Unit = {},
onNextPressed: () -> Unit = {},
) { ) {
Scaffold( Scaffold(
modifier = modifier, modifier = modifier,
@ -77,6 +77,8 @@ fun AddPeopleView(
.fillMaxWidth(), .fillMaxWidth(),
state = state, state = state,
showBackButton = false, showBackButton = false,
onUserSelected = { },
onUserDeselected = {},
) )
} }
} }
@ -86,9 +88,9 @@ fun AddPeopleView(
@Composable @Composable
private fun AddPeopleViewTopBar( private fun AddPeopleViewTopBar(
hasSelectedUsers: Boolean, hasSelectedUsers: Boolean,
onBackPressed: () -> Unit,
onNextPressed: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onBackPressed: () -> Unit = {},
onNextPressed: () -> Unit = {},
) { ) {
TopAppBar( TopAppBar(
modifier = modifier, modifier = modifier,
@ -112,5 +114,9 @@ private fun AddPeopleViewTopBar(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun AddPeopleViewPreview(@PreviewParameter(AddPeopleUserListStateProvider::class) state: UserListState) = ElementPreview { internal fun AddPeopleViewPreview(@PreviewParameter(AddPeopleUserListStateProvider::class) state: UserListState) = ElementPreview {
AddPeopleView(state = state) AddPeopleView(
state = state,
onBackPressed = {},
onNextPressed = {},
)
} }

View file

@ -41,9 +41,9 @@ import io.element.android.libraries.theme.ElementTheme
@Composable @Composable
fun RoomPrivacyOption( fun RoomPrivacyOption(
roomPrivacyItem: RoomPrivacyItem, roomPrivacyItem: RoomPrivacyItem,
onOptionSelected: (RoomPrivacyItem) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
isSelected: Boolean = false, isSelected: Boolean = false,
onOptionSelected: (RoomPrivacyItem) -> Unit = {},
) { ) {
Row( Row(
modifier modifier
@ -97,10 +97,12 @@ internal fun RoomPrivacyOptionPreview() = ElementPreview {
Column { Column {
RoomPrivacyOption( RoomPrivacyOption(
roomPrivacyItem = aRoomPrivacyItem, roomPrivacyItem = aRoomPrivacyItem,
onOptionSelected = {},
isSelected = true, isSelected = true,
) )
RoomPrivacyOption( RoomPrivacyOption(
roomPrivacyItem = aRoomPrivacyItem, roomPrivacyItem = aRoomPrivacyItem,
onOptionSelected = {},
isSelected = false, isSelected = false,
) )
} }

View file

@ -33,8 +33,8 @@ import io.element.android.libraries.usersearch.api.UserSearchResult
fun SearchMultipleUsersResultItem( fun SearchMultipleUsersResultItem(
searchResult: UserSearchResult, searchResult: UserSearchResult,
isUserSelected: Boolean, isUserSelected: Boolean,
onCheckedChange: (Boolean) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onCheckedChange: (Boolean) -> Unit = {},
) { ) {
if (searchResult.isUnresolved) { if (searchResult.isUnresolved) {
CheckableUnresolvedUserRow( CheckableUnresolvedUserRow(
@ -62,12 +62,40 @@ internal fun SearchMultipleUsersResultItemPreview() = ElementThemedPreview { Con
@Composable @Composable
private fun ContentToPreview() { private fun ContentToPreview() {
Column { Column {
SearchMultipleUsersResultItem(searchResult = UserSearchResult(aMatrixUser(), isUnresolved = false), isUserSelected = false) SearchMultipleUsersResultItem(
searchResult = UserSearchResult(
aMatrixUser(),
isUnresolved = false
),
isUserSelected = false,
onCheckedChange = {}
)
HorizontalDivider() HorizontalDivider()
SearchMultipleUsersResultItem(searchResult = UserSearchResult(aMatrixUser(), isUnresolved = false), isUserSelected = true) SearchMultipleUsersResultItem(
searchResult = UserSearchResult(
aMatrixUser(),
isUnresolved = false
),
isUserSelected = true,
onCheckedChange = {}
)
HorizontalDivider() HorizontalDivider()
SearchMultipleUsersResultItem(searchResult = UserSearchResult(aMatrixUser(), isUnresolved = true), isUserSelected = false) SearchMultipleUsersResultItem(
searchResult = UserSearchResult(
aMatrixUser(),
isUnresolved = true
),
isUserSelected = false,
onCheckedChange = {}
)
HorizontalDivider() HorizontalDivider()
SearchMultipleUsersResultItem(searchResult = UserSearchResult(aMatrixUser(), isUnresolved = true), isUserSelected = true) SearchMultipleUsersResultItem(
searchResult = UserSearchResult(
aMatrixUser(),
isUnresolved = true
),
isUserSelected = true,
onCheckedChange = {}
)
} }
} }

View file

@ -33,8 +33,8 @@ import io.element.android.libraries.usersearch.api.UserSearchResult
@Composable @Composable
fun SearchSingleUserResultItem( fun SearchSingleUserResultItem(
searchResult: UserSearchResult, searchResult: UserSearchResult,
onClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onClick: () -> Unit = {},
) { ) {
if (searchResult.isUnresolved) { if (searchResult.isUnresolved) {
UnresolvedUserRow( UnresolvedUserRow(
@ -58,8 +58,14 @@ internal fun SearchSingleUserResultItemPreview() = ElementThemedPreview { Conten
@Composable @Composable
private fun ContentToPreview() { private fun ContentToPreview() {
Column { Column {
SearchSingleUserResultItem(searchResult = UserSearchResult(aMatrixUser(), isUnresolved = false)) SearchSingleUserResultItem(
searchResult = UserSearchResult(aMatrixUser(), isUnresolved = false),
onClick = {},
)
HorizontalDivider() HorizontalDivider()
SearchSingleUserResultItem(searchResult = UserSearchResult(aMatrixUser(), isUnresolved = true)) SearchSingleUserResultItem(
searchResult = UserSearchResult(aMatrixUser(), isUnresolved = true),
onClick = {},
)
} }
} }

View file

@ -52,13 +52,13 @@ fun SearchUserBar(
selectedUsers: ImmutableList<MatrixUser>, selectedUsers: ImmutableList<MatrixUser>,
active: Boolean, active: Boolean,
isMultiSelectionEnabled: Boolean, isMultiSelectionEnabled: Boolean,
onActiveChanged: (Boolean) -> Unit,
onTextChanged: (String) -> Unit,
onUserSelected: (MatrixUser) -> Unit,
onUserDeselected: (MatrixUser) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
showBackButton: Boolean = true, showBackButton: Boolean = true,
placeHolderTitle: String = stringResource(CommonStrings.common_search_for_someone), placeHolderTitle: String = stringResource(CommonStrings.common_search_for_someone),
onActiveChanged: (Boolean) -> Unit = {},
onTextChanged: (String) -> Unit = {},
onUserSelected: (MatrixUser) -> Unit = {},
onUserDeselected: (MatrixUser) -> Unit = {},
) { ) {
val columnState = rememberLazyListState() val columnState = rememberLazyListState()

View file

@ -26,18 +26,18 @@ import androidx.compose.ui.unit.dp
import io.element.android.features.createroom.impl.userlist.UserListEvents import io.element.android.features.createroom.impl.userlist.UserListEvents
import io.element.android.features.createroom.impl.userlist.UserListState import io.element.android.features.createroom.impl.userlist.UserListState
import io.element.android.features.createroom.impl.userlist.UserListStateProvider import io.element.android.features.createroom.impl.userlist.UserListStateProvider
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.ui.components.SelectedUsersList import io.element.android.libraries.matrix.ui.components.SelectedUsersList
@Composable @Composable
fun UserListView( fun UserListView(
state: UserListState, state: UserListState,
onUserSelected: (MatrixUser) -> Unit,
onUserDeselected: (MatrixUser) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
showBackButton: Boolean = true, showBackButton: Boolean = true,
onUserSelected: (MatrixUser) -> Unit = {},
onUserDeselected: (MatrixUser) -> Unit = {},
) { ) {
Column( Column(
modifier = modifier, modifier = modifier,
@ -79,5 +79,9 @@ fun UserListView(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun UserListViewPreview(@PreviewParameter(UserListStateProvider::class) state: UserListState) = ElementPreview { internal fun UserListViewPreview(@PreviewParameter(UserListStateProvider::class) state: UserListState) = ElementPreview {
UserListView(state = state) UserListView(
state = state,
onUserSelected = {},
onUserDeselected = {},
)
} }

View file

@ -167,9 +167,9 @@ fun ConfigureRoomView(
@Composable @Composable
private fun ConfigureRoomToolbar( private fun ConfigureRoomToolbar(
isNextActionEnabled: Boolean, isNextActionEnabled: Boolean,
onBackPressed: () -> Unit,
onNextPressed: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onBackPressed: () -> Unit = {},
onNextPressed: () -> Unit = {},
) { ) {
TopAppBar( TopAppBar(
modifier = modifier, modifier = modifier,
@ -194,9 +194,9 @@ private fun ConfigureRoomToolbar(
private fun RoomNameWithAvatar( private fun RoomNameWithAvatar(
avatarUri: Uri?, avatarUri: Uri?,
roomName: String, roomName: String,
onAvatarClick: () -> Unit,
onRoomNameChanged: (String) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onAvatarClick: () -> Unit = {},
onRoomNameChanged: (String) -> Unit = {},
) { ) {
Row( Row(
modifier = modifier, modifier = modifier,
@ -221,8 +221,8 @@ private fun RoomNameWithAvatar(
@Composable @Composable
private fun RoomTopic( private fun RoomTopic(
topic: String, topic: String,
onTopicChanged: (String) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onTopicChanged: (String) -> Unit = {},
) { ) {
LabelledTextField( LabelledTextField(
modifier = modifier, modifier = modifier,
@ -240,8 +240,8 @@ private fun RoomTopic(
@Composable @Composable
private fun RoomPrivacyOptions( private fun RoomPrivacyOptions(
selected: RoomPrivacy?, selected: RoomPrivacy?,
onOptionSelected: (RoomPrivacyItem) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onOptionSelected: (RoomPrivacyItem) -> Unit = {},
) { ) {
val items = roomPrivacyItems() val items = roomPrivacyItems()
Column(modifier = modifier.selectableGroup()) { Column(modifier = modifier.selectableGroup()) {

View file

@ -55,11 +55,11 @@ import io.element.android.libraries.ui.strings.CommonStrings
@Composable @Composable
fun CreateRoomRootView( fun CreateRoomRootView(
state: CreateRoomRootState, state: CreateRoomRootState,
onClosePressed: () -> Unit,
onNewRoomClicked: () -> Unit,
onOpenDM: (RoomId) -> Unit,
onInviteFriendsClicked: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onClosePressed: () -> Unit = {},
onNewRoomClicked: () -> Unit = {},
onOpenDM: (RoomId) -> Unit = {},
onInviteFriendsClicked: () -> Unit = {},
) { ) {
Scaffold( Scaffold(
modifier = modifier.fillMaxWidth(), modifier = modifier.fillMaxWidth(),
@ -81,6 +81,7 @@ fun CreateRoomRootView(
onUserSelected = { onUserSelected = {
state.eventSink(CreateRoomRootEvents.StartDM(it)) state.eventSink(CreateRoomRootEvents.StartDM(it))
}, },
onUserDeselected = { },
) )
if (!state.userListState.isSearchActive) { if (!state.userListState.isSearchActive) {
@ -111,8 +112,8 @@ fun CreateRoomRootView(
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
private fun CreateRoomRootViewTopBar( private fun CreateRoomRootViewTopBar(
onClosePressed: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onClosePressed: () -> Unit = {},
) { ) {
TopAppBar( TopAppBar(
modifier = modifier, modifier = modifier,
@ -134,9 +135,9 @@ private fun CreateRoomRootViewTopBar(
@Composable @Composable
private fun CreateRoomActionButtonsList( private fun CreateRoomActionButtonsList(
state: CreateRoomRootState, state: CreateRoomRootState,
onNewRoomClicked: () -> Unit,
onInvitePeopleClicked: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onNewRoomClicked: () -> Unit = {},
onInvitePeopleClicked: () -> Unit = {},
) { ) {
Column(modifier = modifier) { Column(modifier = modifier) {
CreateRoomActionButton( CreateRoomActionButton(
@ -156,8 +157,8 @@ private fun CreateRoomActionButtonsList(
private fun CreateRoomActionButton( private fun CreateRoomActionButton(
@DrawableRes iconRes: Int, @DrawableRes iconRes: Int,
text: String, text: String,
onClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onClick: () -> Unit = {},
) { ) {
Row( Row(
modifier = modifier modifier = modifier
@ -187,5 +188,9 @@ internal fun CreateRoomRootViewPreview(@PreviewParameter(CreateRoomRootStateProv
ElementPreview { ElementPreview {
CreateRoomRootView( CreateRoomRootView(
state = state, state = state,
onClosePressed = {},
onNewRoomClicked = {},
onOpenDM = {},
onInviteFriendsClicked = {},
) )
} }

View file

@ -53,9 +53,9 @@ import io.element.android.libraries.ui.strings.CommonStrings
@Composable @Composable
fun InviteListView( fun InviteListView(
state: InviteListState, state: InviteListState,
onBackClicked: () -> Unit,
onInviteAccepted: (RoomId) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onBackClicked: () -> Unit = {},
onInviteAccepted: (RoomId) -> Unit = {},
) { ) {
if (state.acceptedAction is Async.Success) { if (state.acceptedAction is Async.Success) {
LaunchedEffect(state.acceptedAction) { LaunchedEffect(state.acceptedAction) {
@ -113,8 +113,8 @@ fun InviteListView(
@Composable @Composable
private fun InviteListContent( private fun InviteListContent(
state: InviteListState, state: InviteListState,
onBackClicked: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onBackClicked: () -> Unit = {},
) { ) {
Scaffold( Scaffold(
modifier = modifier, modifier = modifier,
@ -173,5 +173,9 @@ private fun InviteListContent(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun InviteListViewPreview(@PreviewParameter(InviteListStateProvider::class) state: InviteListState) = ElementPreview { internal fun InviteListViewPreview(@PreviewParameter(InviteListStateProvider::class) state: InviteListState) = ElementPreview {
InviteListView(state) InviteListView(
state = state,
onBackClicked = {},
onInviteAccepted = {},
)
} }

View file

@ -45,8 +45,8 @@ import io.element.android.features.invitelist.impl.model.InviteListInviteSummary
import io.element.android.features.invitelist.impl.model.InviteSender import io.element.android.features.invitelist.impl.model.InviteSender
import io.element.android.libraries.designsystem.atomic.atoms.UnreadIndicatorAtom import io.element.android.libraries.designsystem.atomic.atoms.UnreadIndicatorAtom
import io.element.android.libraries.designsystem.components.avatar.Avatar import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Button import io.element.android.libraries.designsystem.theme.components.Button
import io.element.android.libraries.designsystem.theme.components.ButtonSize import io.element.android.libraries.designsystem.theme.components.ButtonSize
import io.element.android.libraries.designsystem.theme.components.OutlinedButton import io.element.android.libraries.designsystem.theme.components.OutlinedButton
@ -59,9 +59,9 @@ private val minHeight = 72.dp
@Composable @Composable
internal fun InviteSummaryRow( internal fun InviteSummaryRow(
invite: InviteListInviteSummary, invite: InviteListInviteSummary,
onAcceptClicked: () -> Unit,
onDeclineClicked: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onAcceptClicked: () -> Unit = {},
onDeclineClicked: () -> Unit = {},
) { ) {
Box( Box(
modifier = modifier modifier = modifier
@ -79,8 +79,8 @@ internal fun InviteSummaryRow(
@Composable @Composable
private fun DefaultInviteSummaryRow( private fun DefaultInviteSummaryRow(
invite: InviteListInviteSummary, invite: InviteListInviteSummary,
onAcceptClicked: () -> Unit = {}, onAcceptClicked: () -> Unit,
onDeclineClicked: () -> Unit = {}, onDeclineClicked: () -> Unit,
) { ) {
Row( Row(
modifier = Modifier modifier = Modifier
@ -187,5 +187,9 @@ private fun SenderRow(sender: InviteSender) {
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun InviteSummaryRowPreview(@PreviewParameter(InviteListInviteSummaryProvider::class) data: InviteListInviteSummary) = ElementPreview { internal fun InviteSummaryRowPreview(@PreviewParameter(InviteListInviteSummaryProvider::class) data: InviteListInviteSummary) = ElementPreview {
InviteSummaryRow(data) InviteSummaryRow(
invite = data,
onAcceptClicked = {},
onDeclineClicked = {},
)
} }

View file

@ -68,8 +68,8 @@ import io.element.android.libraries.ui.strings.CommonStrings
@Composable @Composable
fun SendLocationView( fun SendLocationView(
state: SendLocationState, state: SendLocationState,
navigateUp: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
navigateUp: () -> Unit = {},
) { ) {
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
state.eventSink(SendLocationEvents.RequestPermissions) state.eventSink(SendLocationEvents.RequestPermissions)

View file

@ -67,8 +67,8 @@ import kotlinx.collections.immutable.toImmutableMap
@Composable @Composable
fun ShowLocationView( fun ShowLocationView(
state: ShowLocationState, state: ShowLocationState,
onBackPressed: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onBackPressed: () -> Unit = {},
) { ) {
when (state.permissionDialog) { when (state.permissionDialog) {
ShowLocationState.Dialog.None -> Unit ShowLocationState.Dialog.None -> Unit

View file

@ -450,10 +450,10 @@ private fun MessagesViewTopBar(
roomAvatar: AvatarData?, roomAvatar: AvatarData?,
inRoomCallsEnabled: Boolean, inRoomCallsEnabled: Boolean,
isCallOngoing: Boolean, isCallOngoing: Boolean,
onRoomDetailsClicked: () -> Unit,
onJoinCallClicked: () -> Unit,
onBackPressed: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onRoomDetailsClicked: () -> Unit = {},
onJoinCallClicked: () -> Unit = {},
onBackPressed: () -> Unit = {},
) { ) {
TopAppBar( TopAppBar(
modifier = modifier, modifier = modifier,

View file

@ -58,9 +58,9 @@ private const val BUBBLE_WIDTH_RATIO = 0.85f
fun MessageEventBubble( fun MessageEventBubble(
state: BubbleState, state: BubbleState,
interactionSource: MutableInteractionSource, interactionSource: MutableInteractionSource,
onClick: () -> Unit,
onLongClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onClick: () -> Unit = {},
onLongClick: () -> Unit = {},
content: @Composable () -> Unit = {}, content: @Composable () -> Unit = {},
) { ) {
fun bubbleShape(): Shape { fun bubbleShape(): Shape {
@ -144,6 +144,8 @@ internal fun MessageEventBubblePreview(@PreviewParameter(BubbleStateProvider::cl
MessageEventBubble( MessageEventBubble(
state = state, state = state,
interactionSource = remember { MutableInteractionSource() }, interactionSource = remember { MutableInteractionSource() },
onClick = {},
onLongClick = {},
) { ) {
// Render the state as a text to better understand the previews // Render the state as a text to better understand the previews
Box( Box(

View file

@ -31,8 +31,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Surface import io.element.android.libraries.designsystem.theme.components.Surface
private val CORNER_RADIUS = 8.dp private val CORNER_RADIUS = 8.dp
@ -42,9 +42,9 @@ private val CORNER_RADIUS = 8.dp
fun MessageStateEventContainer( fun MessageStateEventContainer(
@Suppress("UNUSED_PARAMETER") isHighlighted: Boolean, @Suppress("UNUSED_PARAMETER") isHighlighted: Boolean,
interactionSource: MutableInteractionSource, interactionSource: MutableInteractionSource,
onClick: () -> Unit,
onLongClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onClick: () -> Unit = {},
onLongClick: () -> Unit = {},
content: @Composable () -> Unit = {}, content: @Composable () -> Unit = {},
) { ) {
// Ignore isHighlighted for now, we need a design decision on it. // Ignore isHighlighted for now, we need a design decision on it.
@ -73,12 +73,16 @@ internal fun MessageStateEventContainerPreview() = ElementPreview {
MessageStateEventContainer( MessageStateEventContainer(
isHighlighted = false, isHighlighted = false,
interactionSource = remember { MutableInteractionSource() }, interactionSource = remember { MutableInteractionSource() },
onClick = {},
onLongClick = {},
) { ) {
Spacer(modifier = Modifier.size(width = 120.dp, height = 32.dp)) Spacer(modifier = Modifier.size(width = 120.dp, height = 32.dp))
} }
MessageStateEventContainer( MessageStateEventContainer(
isHighlighted = true, isHighlighted = true,
interactionSource = remember { MutableInteractionSource() }, interactionSource = remember { MutableInteractionSource() },
onClick = {},
onLongClick = {},
) { ) {
Spacer(modifier = Modifier.size(width = 120.dp, height = 32.dp)) Spacer(modifier = Modifier.size(width = 120.dp, height = 32.dp))
} }

View file

@ -39,9 +39,9 @@ fun TimelineItemTextView(
content: TimelineItemTextBasedContent, content: TimelineItemTextBasedContent,
interactionSource: MutableInteractionSource, interactionSource: MutableInteractionSource,
extraPadding: ExtraPadding, extraPadding: ExtraPadding,
onTextClicked: () -> Unit,
onTextLongClicked: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onTextClicked: () -> Unit = {},
onTextLongClicked: () -> Unit = {},
) { ) {
CompositionLocalProvider(LocalContentColor provides ElementTheme.colors.textPrimary) { CompositionLocalProvider(LocalContentColor provides ElementTheme.colors.textPrimary) {
val htmlDocument = content.htmlDocument val htmlDocument = content.htmlDocument
@ -79,5 +79,7 @@ internal fun TimelineItemTextViewPreview(
content = content, content = content,
interactionSource = remember { MutableInteractionSource() }, interactionSource = remember { MutableInteractionSource() },
extraPadding = ExtraPadding(nbChars = 8), extraPadding = ExtraPadding(nbChars = 8),
onTextClicked = {},
onTextLongClicked = {},
) )
} }

View file

@ -58,8 +58,8 @@ import io.element.android.features.messages.impl.timeline.components.event.Extra
import io.element.android.features.messages.impl.timeline.components.event.getDpSize import io.element.android.features.messages.impl.timeline.components.event.getDpSize
import io.element.android.features.messages.impl.timeline.components.event.noExtraPadding import io.element.android.features.messages.impl.timeline.components.event.noExtraPadding
import io.element.android.libraries.designsystem.components.ClickableLinkText import io.element.android.libraries.designsystem.components.ClickableLinkText
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.text.toDp import io.element.android.libraries.designsystem.text.toDp
import io.element.android.libraries.designsystem.theme.components.Surface import io.element.android.libraries.designsystem.theme.components.Surface
import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.Text
@ -80,9 +80,9 @@ fun HtmlDocument(
document: Document, document: Document,
extraPadding: ExtraPadding, extraPadding: ExtraPadding,
interactionSource: MutableInteractionSource, interactionSource: MutableInteractionSource,
onTextClicked: () -> Unit,
onTextLongClicked: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onTextClicked: () -> Unit = {},
onTextLongClicked: () -> Unit = {},
) { ) {
FlowRow( FlowRow(
modifier = modifier, modifier = modifier,
@ -106,16 +106,16 @@ fun HtmlDocument(
private fun HtmlBody( private fun HtmlBody(
body: Element, body: Element,
interactionSource: MutableInteractionSource, interactionSource: MutableInteractionSource,
onTextClicked: () -> Unit,
onTextLongClicked: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onTextClicked: () -> Unit = {},
onTextLongClicked: () -> Unit = {},
) { ) {
@Composable @Composable
fun NodesFlowRode( fun NodesFlowRode(
nodes: Iterator<Node>, nodes: Iterator<Node>,
interactionSource: MutableInteractionSource, interactionSource: MutableInteractionSource,
onTextClicked: () -> Unit = {}, onTextClicked: () -> Unit,
onTextLongClicked: () -> Unit = {}, onTextLongClicked: () -> Unit,
) = FlowRow( ) = FlowRow(
horizontalArrangement = Arrangement.spacedBy(2.dp, Alignment.Start), horizontalArrangement = Arrangement.spacedBy(2.dp, Alignment.Start),
verticalArrangement = Arrangement.spacedBy(8.dp, Alignment.Top), verticalArrangement = Arrangement.spacedBy(8.dp, Alignment.Top),
@ -181,9 +181,9 @@ private fun Element.isInline(): Boolean {
private fun HtmlBlock( private fun HtmlBlock(
element: Element, element: Element,
interactionSource: MutableInteractionSource, interactionSource: MutableInteractionSource,
onTextClicked: () -> Unit,
onTextLongClicked: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onTextClicked: () -> Unit = {},
onTextLongClicked: () -> Unit = {},
) { ) {
val blockModifier = modifier val blockModifier = modifier
.padding(top = 4.dp) .padding(top = 4.dp)
@ -239,9 +239,9 @@ private fun HtmlBlock(
private fun HtmlInline( private fun HtmlInline(
element: Element, element: Element,
interactionSource: MutableInteractionSource, interactionSource: MutableInteractionSource,
onTextClicked: () -> Unit,
onTextLongClicked: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onTextClicked: () -> Unit = {},
onTextLongClicked: () -> Unit = {},
) { ) {
Box(modifier) { Box(modifier) {
val styledText = buildAnnotatedString { val styledText = buildAnnotatedString {
@ -281,9 +281,9 @@ private fun HtmlPreformatted(
private fun HtmlParagraph( private fun HtmlParagraph(
paragraph: Element, paragraph: Element,
interactionSource: MutableInteractionSource, interactionSource: MutableInteractionSource,
onTextClicked: () -> Unit,
onTextLongClicked: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onTextClicked: () -> Unit = {},
onTextLongClicked: () -> Unit = {},
) { ) {
Box(modifier) { Box(modifier) {
val styledText = buildAnnotatedString { val styledText = buildAnnotatedString {
@ -300,9 +300,9 @@ private fun HtmlParagraph(
private fun HtmlBlockquote( private fun HtmlBlockquote(
blockquote: Element, blockquote: Element,
interactionSource: MutableInteractionSource, interactionSource: MutableInteractionSource,
onTextClicked: () -> Unit,
onTextLongClicked: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onTextClicked: () -> Unit = {},
onTextLongClicked: () -> Unit = {},
) { ) {
val color = MaterialTheme.colorScheme.onBackground val color = MaterialTheme.colorScheme.onBackground
Box( Box(
@ -333,9 +333,9 @@ private fun HtmlBlockquote(
private fun HtmlHeading( private fun HtmlHeading(
heading: Element, heading: Element,
interactionSource: MutableInteractionSource, interactionSource: MutableInteractionSource,
onTextClicked: () -> Unit,
onTextLongClicked: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onTextClicked: () -> Unit = {},
onTextLongClicked: () -> Unit = {},
) { ) {
val style = when (heading.tagName().lowercase()) { val style = when (heading.tagName().lowercase()) {
"h1" -> MaterialTheme.typography.headlineLarge.copy(fontSize = 30.sp) "h1" -> MaterialTheme.typography.headlineLarge.copy(fontSize = 30.sp)
@ -366,9 +366,9 @@ private fun HtmlHeading(
private fun HtmlMxReply( private fun HtmlMxReply(
mxReply: Element, mxReply: Element,
interactionSource: MutableInteractionSource, interactionSource: MutableInteractionSource,
onTextClicked: () -> Unit,
onTextLongClicked: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onTextClicked: () -> Unit = {},
onTextLongClicked: () -> Unit = {},
) { ) {
val blockquote = mxReply.childNodes().firstOrNull() ?: return val blockquote = mxReply.childNodes().firstOrNull() ?: return
val shape = RoundedCornerShape(12.dp) val shape = RoundedCornerShape(12.dp)
@ -419,16 +419,17 @@ private fun HtmlMxReply(
private fun HtmlOrderedList( private fun HtmlOrderedList(
orderedList: Element, orderedList: Element,
interactionSource: MutableInteractionSource, interactionSource: MutableInteractionSource,
onTextClicked: () -> Unit,
onTextLongClicked: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onTextClicked: () -> Unit = {},
onTextLongClicked: () -> Unit = {},
) { ) {
val delimiter = "." val delimiter = "."
HtmlListItems( HtmlListItems(
list = orderedList, list = orderedList,
marker = { index -> "$index$delimiter" }, marker = { index -> "$index$delimiter" },
modifier = modifier, modifier = modifier,
onTextClicked = onTextClicked, onTextLongClicked = onTextLongClicked, onTextClicked = onTextClicked,
onTextLongClicked = onTextLongClicked,
interactionSource = interactionSource interactionSource = interactionSource
) )
} }
@ -437,16 +438,17 @@ private fun HtmlOrderedList(
private fun HtmlUnorderedList( private fun HtmlUnorderedList(
unorderedList: Element, unorderedList: Element,
interactionSource: MutableInteractionSource, interactionSource: MutableInteractionSource,
onTextClicked: () -> Unit,
onTextLongClicked: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onTextClicked: () -> Unit = {},
onTextLongClicked: () -> Unit = {},
) { ) {
val marker = "" val marker = ""
HtmlListItems( HtmlListItems(
list = unorderedList, list = unorderedList,
marker = { marker }, marker = { marker },
modifier = modifier, modifier = modifier,
onTextClicked = onTextClicked, onTextLongClicked = onTextLongClicked, onTextClicked = onTextClicked,
onTextLongClicked = onTextLongClicked,
interactionSource = interactionSource interactionSource = interactionSource
) )
} }
@ -456,9 +458,9 @@ private fun HtmlListItems(
list: Element, list: Element,
marker: (Int) -> String, marker: (Int) -> String,
interactionSource: MutableInteractionSource, interactionSource: MutableInteractionSource,
onTextClicked: () -> Unit,
onTextLongClicked: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onTextClicked: () -> Unit = {},
onTextLongClicked: () -> Unit = {},
) { ) {
Column(modifier = modifier) { Column(modifier = modifier) {
for ((index, node) in list.children().withIndex()) { for ((index, node) in list.children().withIndex()) {
@ -468,7 +470,12 @@ private fun HtmlListItems(
append("${marker(index + 1)} ") append("${marker(index + 1)} ")
appendInlineChildrenElements(node.childNodes(), MaterialTheme.colorScheme) appendInlineChildrenElements(node.childNodes(), MaterialTheme.colorScheme)
} }
HtmlText(text = text, interactionSource = remember { MutableInteractionSource() }) HtmlText(
text = text,
interactionSource = remember { MutableInteractionSource() },
onClick = onTextClicked,
onLongClick = onTextLongClicked,
)
} else { } else {
for (innerNode in node.childNodes()) { for (innerNode in node.childNodes()) {
when (innerNode) { when (innerNode) {
@ -478,15 +485,18 @@ private fun HtmlListItems(
append("${marker(index + 1)} ") append("${marker(index + 1)} ")
} }
HtmlText( HtmlText(
text = text, onClick = onTextClicked, text = text,
onLongClick = onTextLongClicked, interactionSource = interactionSource onClick = onTextClicked,
onLongClick = onTextLongClicked,
interactionSource = interactionSource
) )
} }
} }
is Element -> HtmlBlock( is Element -> HtmlBlock(
element = innerNode, element = innerNode,
modifier = Modifier.padding(start = 4.dp), modifier = Modifier.padding(start = 4.dp),
onTextClicked = onTextClicked, onTextLongClicked = onTextLongClicked, onTextClicked = onTextClicked,
onTextLongClicked = onTextLongClicked,
interactionSource = interactionSource interactionSource = interactionSource
) )
} }
@ -595,10 +605,10 @@ fun AnnotatedString.Builder.safeAppendInlineContent(chipId: String, ownText: Str
private fun HtmlText( private fun HtmlText(
text: AnnotatedString, text: AnnotatedString,
interactionSource: MutableInteractionSource, interactionSource: MutableInteractionSource,
onClick: () -> Unit,
onLongClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
style: TextStyle = LocalTextStyle.current, style: TextStyle = LocalTextStyle.current,
onClick: () -> Unit = {},
onLongClick: () -> Unit = {},
) { ) {
val inlineContentMap = persistentMapOf<String, InlineTextContent>() val inlineContentMap = persistentMapOf<String, InlineTextContent>()
ClickableLinkText( ClickableLinkText(
@ -618,6 +628,8 @@ internal fun HtmlDocumentPreview(@PreviewParameter(DocumentProvider::class) docu
HtmlDocument( HtmlDocument(
document = document, document = document,
extraPadding = noExtraPadding, extraPadding = noExtraPadding,
interactionSource = remember { MutableInteractionSource() } interactionSource = remember { MutableInteractionSource() },
onTextClicked = {},
onTextLongClicked = {},
) )
} }

View file

@ -38,9 +38,9 @@ import io.element.android.libraries.theme.ElementTheme
@Composable @Composable
fun DefaultNotificationSettingOption( fun DefaultNotificationSettingOption(
mode: RoomNotificationMode, mode: RoomNotificationMode,
onOptionSelected: (RoomNotificationMode) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
isSelected: Boolean = false, isSelected: Boolean = false,
onOptionSelected: (RoomNotificationMode) -> Unit = {},
) { ) {
val subtitle = when(mode) { val subtitle = when(mode) {
RoomNotificationMode.ALL_MESSAGES -> stringResource(id = R.string.screen_notification_settings_edit_mode_all_messages) RoomNotificationMode.ALL_MESSAGES -> stringResource(id = R.string.screen_notification_settings_edit_mode_all_messages)
@ -86,10 +86,12 @@ internal fun DefaultNotificationSettingOptionPreview() = ElementPreview {
DefaultNotificationSettingOption( DefaultNotificationSettingOption(
mode = RoomNotificationMode.ALL_MESSAGES, mode = RoomNotificationMode.ALL_MESSAGES,
isSelected = true, isSelected = true,
onOptionSelected = {},
) )
DefaultNotificationSettingOption( DefaultNotificationSettingOption(
mode = RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY, mode = RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY,
isSelected = false, isSelected = false,
onOptionSelected = {},
) )
} }
} }

View file

@ -70,7 +70,7 @@ fun RageshakeDetectionView(
@Composable @Composable
private fun TakeScreenshot( private fun TakeScreenshot(
onScreenshotTaken: (ImageResult) -> Unit = {} onScreenshotTaken: (ImageResult) -> Unit
) { ) {
val view = LocalView.current val view = LocalView.current
LaunchedEffect(Unit) { LaunchedEffect(Unit) {

View file

@ -34,8 +34,8 @@ import androidx.compose.ui.unit.dp
import io.element.android.features.roomdetails.impl.R import io.element.android.features.roomdetails.impl.R
import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.aliasScreenTitle import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.HorizontalDivider import io.element.android.libraries.designsystem.theme.components.HorizontalDivider
import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.theme.components.Scaffold
@ -58,9 +58,9 @@ import kotlinx.collections.immutable.ImmutableList
@Composable @Composable
fun RoomInviteMembersView( fun RoomInviteMembersView(
state: RoomInviteMembersState, state: RoomInviteMembersState,
onBackPressed: () -> Unit,
onSendPressed: (List<MatrixUser>) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onBackPressed: () -> Unit = {},
onSendPressed: (List<MatrixUser>) -> Unit = {},
) { ) {
Scaffold( Scaffold(
modifier = modifier, modifier = modifier,
@ -113,9 +113,9 @@ fun RoomInviteMembersView(
@Composable @Composable
private fun RoomInviteMembersTopBar( private fun RoomInviteMembersTopBar(
canSend: Boolean, canSend: Boolean,
onBackPressed: () -> Unit,
onSendPressed: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onBackPressed: () -> Unit = {},
onSendPressed: () -> Unit = {},
) { ) {
TopAppBar( TopAppBar(
modifier = modifier, modifier = modifier,
@ -143,11 +143,11 @@ private fun RoomInviteMembersSearchBar(
state: SearchBarResultState<ImmutableList<InvitableUser>>, state: SearchBarResultState<ImmutableList<InvitableUser>>,
selectedUsers: ImmutableList<MatrixUser>, selectedUsers: ImmutableList<MatrixUser>,
active: Boolean, active: Boolean,
onActiveChanged: (Boolean) -> Unit,
onTextChanged: (String) -> Unit,
onUserToggled: (MatrixUser) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
placeHolderTitle: String = stringResource(CommonStrings.common_search_for_someone), placeHolderTitle: String = stringResource(CommonStrings.common_search_for_someone),
onActiveChanged: (Boolean) -> Unit = {},
onTextChanged: (String) -> Unit = {},
onUserToggled: (MatrixUser) -> Unit = {},
) { ) {
SearchBar( SearchBar(
query = query, query = query,
@ -219,5 +219,9 @@ private fun RoomInviteMembersSearchBar(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun RoomInviteMembersPreview(@PreviewParameter(RoomInviteMembersStateProvider::class) state: RoomInviteMembersState) = ElementPreview { internal fun RoomInviteMembersPreview(@PreviewParameter(RoomInviteMembersStateProvider::class) state: RoomInviteMembersState) = ElementPreview {
RoomInviteMembersView(state) RoomInviteMembersView(
state = state,
onBackPressed = {},
onSendPressed = {},
)
} }

View file

@ -177,8 +177,8 @@ private fun LazyListScope.roomMemberListSection(
@Composable @Composable
private fun RoomMemberListItem( private fun RoomMemberListItem(
roomMember: RoomMember, roomMember: RoomMember,
onClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onClick: () -> Unit = {},
) { ) {
MatrixUserRow( MatrixUserRow(
modifier = modifier.clickable(onClick = onClick), modifier = modifier.clickable(onClick = onClick),
@ -195,9 +195,9 @@ private fun RoomMemberListItem(
@Composable @Composable
private fun RoomMemberListTopBar( private fun RoomMemberListTopBar(
canInvite: Boolean, canInvite: Boolean,
onBackPressed: () -> Unit,
onInvitePressed: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onBackPressed: () -> Unit = {},
onInvitePressed: () -> Unit = {},
) { ) {
TopAppBar( TopAppBar(
modifier = modifier, modifier = modifier,

View file

@ -37,10 +37,10 @@ import io.element.android.libraries.theme.ElementTheme
@Composable @Composable
fun RoomNotificationSettingsOption( fun RoomNotificationSettingsOption(
roomNotificationSettingsItem: RoomNotificationSettingsItem, roomNotificationSettingsItem: RoomNotificationSettingsItem,
onOptionSelected: (RoomNotificationSettingsItem) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
enabled: Boolean = true, enabled: Boolean = true,
isSelected: Boolean = false, isSelected: Boolean = false,
onOptionSelected: (RoomNotificationSettingsItem) -> Unit = {},
) { ) {
Row( Row(
modifier modifier
@ -83,10 +83,12 @@ internal fun RoomPrivacyOptionPreview() = ElementPreview {
Column { Column {
RoomNotificationSettingsOption( RoomNotificationSettingsOption(
roomNotificationSettingsItem = roomNotificationSettingsItems().first(), roomNotificationSettingsItem = roomNotificationSettingsItems().first(),
onOptionSelected = {},
isSelected = true, isSelected = true,
) )
RoomNotificationSettingsOption( RoomNotificationSettingsOption(
roomNotificationSettingsItem = roomNotificationSettingsItems().last(), roomNotificationSettingsItem = roomNotificationSettingsItems().last(),
onOptionSelected = {},
isSelected = false, isSelected = false,
enabled = false, enabled = false,
) )

View file

@ -26,8 +26,8 @@ import io.element.android.libraries.matrix.api.room.RoomNotificationMode
fun RoomNotificationSettingsOptions( fun RoomNotificationSettingsOptions(
selected: RoomNotificationMode?, selected: RoomNotificationMode?,
enabled: Boolean, enabled: Boolean,
onOptionSelected: (RoomNotificationSettingsItem) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onOptionSelected: (RoomNotificationSettingsItem) -> Unit = {},
) { ) {
val items = roomNotificationSettingsItems() val items = roomNotificationSettingsItems()
Column(modifier = modifier.selectableGroup()) { Column(modifier = modifier.selectableGroup()) {

View file

@ -74,9 +74,9 @@ fun RoomNotificationSettingsView(
@Composable @Composable
private fun RoomSpecificNotificationSettingsView( private fun RoomSpecificNotificationSettingsView(
state: RoomNotificationSettingsState, state: RoomNotificationSettingsState,
onShowGlobalNotifications: () -> Unit,
onBackPressed: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onShowGlobalNotifications: () -> Unit = {},
onBackPressed: () -> Unit = {},
) { ) {
Scaffold( Scaffold(
modifier = modifier, modifier = modifier,
@ -173,8 +173,8 @@ private fun RoomSpecificNotificationSettingsView(
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
private fun RoomNotificationSettingsTopBar( private fun RoomNotificationSettingsTopBar(
onBackPressed: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onBackPressed: () -> Unit = {},
) { ) {
TopAppBar( TopAppBar(
modifier = modifier, modifier = modifier,

View file

@ -101,8 +101,8 @@ fun UserDefinedRoomNotificationSettingsView(
@Composable @Composable
private fun UserDefinedRoomNotificationSettingsTopBar( private fun UserDefinedRoomNotificationSettingsTopBar(
roomName: String, roomName: String,
onBackPressed: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onBackPressed: () -> Unit = {},
) { ) {
TopAppBar( TopAppBar(
modifier = modifier, modifier = modifier,

View file

@ -32,8 +32,8 @@ import io.element.android.libraries.designsystem.theme.components.Text
fun LabelledCheckbox( fun LabelledCheckbox(
checked: Boolean, checked: Boolean,
text: String, text: String,
onCheckedChange: (Boolean) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onCheckedChange: (Boolean) -> Unit = {},
enabled: Boolean = true, enabled: Boolean = true,
) { ) {
Row( Row(
@ -60,6 +60,7 @@ internal fun LabelledCheckboxPreview() = ElementThemedPreview { ContentToPreview
private fun ContentToPreview() { private fun ContentToPreview() {
LabelledCheckbox( LabelledCheckbox(
checked = true, checked = true,
onCheckedChange = {},
text = "Some text", text = "Some text",
) )
} }

View file

@ -35,12 +35,12 @@ import io.element.android.libraries.theme.ElementTheme
fun LabelledOutlinedTextField( fun LabelledOutlinedTextField(
label: String, label: String,
value: String, value: String,
onValueChange: (String) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
placeholder: String? = null, placeholder: String? = null,
singleLine: Boolean = false, singleLine: Boolean = false,
maxLines: Int = if (singleLine) 1 else Int.MAX_VALUE, maxLines: Int = if (singleLine) 1 else Int.MAX_VALUE,
keyboardOptions: KeyboardOptions = KeyboardOptions.Default, keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
onValueChange: (String) -> Unit = {},
) { ) {
Column( Column(
modifier = modifier, modifier = modifier,
@ -72,11 +72,13 @@ internal fun LabelledOutlinedTextFieldPreview() = ElementPreview {
LabelledOutlinedTextField( LabelledOutlinedTextField(
label = "Room name", label = "Room name",
value = "", value = "",
onValueChange = {},
placeholder = "e.g. Product Sprint", placeholder = "e.g. Product Sprint",
) )
LabelledOutlinedTextField( LabelledOutlinedTextField(
label = "Room name", label = "Room name",
value = "a room name", value = "a room name",
onValueChange = {},
placeholder = "e.g. Product Sprint", placeholder = "e.g. Product Sprint",
) )
} }

View file

@ -35,12 +35,12 @@ import io.element.android.libraries.theme.ElementTheme
fun LabelledTextField( fun LabelledTextField(
label: String, label: String,
value: String, value: String,
onValueChange: (String) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
placeholder: String? = null, placeholder: String? = null,
singleLine: Boolean = false, singleLine: Boolean = false,
maxLines: Int = if (singleLine) 1 else Int.MAX_VALUE, maxLines: Int = if (singleLine) 1 else Int.MAX_VALUE,
keyboardOptions: KeyboardOptions = KeyboardOptions.Default, keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
onValueChange: (String) -> Unit = {},
) { ) {
Column( Column(
modifier = modifier, modifier = modifier,
@ -72,11 +72,13 @@ internal fun LabelledTextFieldPreview() = ElementPreview {
LabelledTextField( LabelledTextField(
label = "Room name", label = "Room name",
value = "", value = "",
onValueChange = {},
placeholder = "e.g. Product Sprint", placeholder = "e.g. Product Sprint",
) )
LabelledTextField( LabelledTextField(
label = "Room name", label = "Room name",
value = "a room name", value = "a room name",
onValueChange = {},
placeholder = "e.g. Product Sprint", placeholder = "e.g. Product Sprint",
) )
} }

View file

@ -32,12 +32,12 @@ import io.element.android.libraries.ui.strings.CommonStrings
@Composable @Composable
fun RetryDialog( fun RetryDialog(
content: String, content: String,
onRetry: () -> Unit,
onDismiss: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
title: String = RetryDialogDefaults.title, title: String = RetryDialogDefaults.title,
retryText: String = RetryDialogDefaults.retryText, retryText: String = RetryDialogDefaults.retryText,
dismissText: String = RetryDialogDefaults.dismissText, dismissText: String = RetryDialogDefaults.dismissText,
onRetry: () -> Unit = {},
onDismiss: () -> Unit = {},
) { ) {
BasicAlertDialog(modifier = modifier, onDismissRequest = onDismiss) { BasicAlertDialog(modifier = modifier, onDismissRequest = onDismiss) {
RetryDialogContent( RetryDialogContent(
@ -54,12 +54,12 @@ fun RetryDialog(
@Composable @Composable
private fun RetryDialogContent( private fun RetryDialogContent(
content: String, content: String,
onRetry: () -> Unit,
onDismiss: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
title: String = RetryDialogDefaults.title, title: String = RetryDialogDefaults.title,
retryText: String = RetryDialogDefaults.retryText, retryText: String = RetryDialogDefaults.retryText,
dismissText: String = RetryDialogDefaults.dismissText, dismissText: String = RetryDialogDefaults.dismissText,
onRetry: () -> Unit = {},
onDismiss: () -> Unit = {},
) { ) {
SimpleAlertDialogContent( SimpleAlertDialogContent(
modifier = modifier, modifier = modifier,
@ -85,6 +85,8 @@ internal fun RetryDialogPreview() {
DialogPreview { DialogPreview {
RetryDialogContent( RetryDialogContent(
content = "Content", content = "Content",
onRetry = {},
onDismiss = {},
) )
} }
} }

View file

@ -59,9 +59,9 @@ private const val DEFAULT_GRAPHICS_LAYER_ALPHA: Float = 0.99F
* @param playbackProgress The current playback progress, between 0 and 1. * @param playbackProgress The current playback progress, between 0 and 1.
* @param showCursor Whether to show the cursor or not. * @param showCursor Whether to show the cursor or not.
* @param waveform The waveform to display. Use [FakeWaveformFactory] to generate a fake waveform. * @param waveform The waveform to display. Use [FakeWaveformFactory] to generate a fake waveform.
* @param onSeek Callback when the user seeks the waveform. Called with a value between 0 and 1.
* @param modifier The modifier to be applied to the view. * @param modifier The modifier to be applied to the view.
* @param seekEnabled Whether the user can seek the waveform or not. * @param seekEnabled Whether the user can seek the waveform or not.
* @param onSeek Callback when the user seeks the waveform. Called with a value between 0 and 1.
* @param brush The brush to use to draw the waveform. * @param brush The brush to use to draw the waveform.
* @param progressBrush The brush to use to draw the progress. * @param progressBrush The brush to use to draw the progress.
* @param cursorBrush The brush to use to draw the cursor. * @param cursorBrush The brush to use to draw the cursor.
@ -74,9 +74,9 @@ fun WaveformPlaybackView(
playbackProgress: Float, playbackProgress: Float,
showCursor: Boolean, showCursor: Boolean,
waveform: ImmutableList<Float>, waveform: ImmutableList<Float>,
onSeek: (progress: Float) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
seekEnabled: Boolean = true, seekEnabled: Boolean = true,
onSeek: (progress: Float) -> Unit = {},
brush: Brush = SolidColor(ElementTheme.colors.iconQuaternary), brush: Brush = SolidColor(ElementTheme.colors.iconQuaternary),
progressBrush: Brush = SolidColor(ElementTheme.colors.iconSecondary), progressBrush: Brush = SolidColor(ElementTheme.colors.iconSecondary),
cursorBrush: Brush = SolidColor(ElementTheme.colors.iconAccentTertiary), cursorBrush: Brush = SolidColor(ElementTheme.colors.iconAccentTertiary),
@ -183,18 +183,21 @@ internal fun WaveformPlaybackViewPreview() = ElementPreview {
modifier = Modifier.height(34.dp), modifier = Modifier.height(34.dp),
showCursor = false, showCursor = false,
playbackProgress = 0.5f, playbackProgress = 0.5f,
onSeek = {},
waveform = persistentListOf(), waveform = persistentListOf(),
) )
WaveformPlaybackView( WaveformPlaybackView(
modifier = Modifier.height(34.dp), modifier = Modifier.height(34.dp),
showCursor = false, showCursor = false,
playbackProgress = 0.5f, playbackProgress = 0.5f,
onSeek = {},
waveform = persistentListOf(0f, 1f, 2f, 3f, 4f, 5f, 6f, 7f, 8f, 9f, 8f, 7f, 6f, 5f, 4f, 3f, 2f, 1f, 0f), waveform = persistentListOf(0f, 1f, 2f, 3f, 4f, 5f, 6f, 7f, 8f, 9f, 8f, 7f, 6f, 5f, 4f, 3f, 2f, 1f, 0f),
) )
WaveformPlaybackView( WaveformPlaybackView(
modifier = Modifier.height(34.dp), modifier = Modifier.height(34.dp),
showCursor = true, showCursor = true,
playbackProgress = 0.5f, playbackProgress = 0.5f,
onSeek = {},
waveform = List(1024) { it / 1024f }.toPersistentList(), waveform = List(1024) { it / 1024f }.toPersistentList(),
) )
} }

View file

@ -82,13 +82,15 @@ private fun ContentToPreview() {
PreferenceSwitch( PreferenceSwitch(
title = "Switch", title = "Switch",
iconResourceId = CommonDrawables.ic_compound_threads, iconResourceId = CommonDrawables.ic_compound_threads,
isChecked = true isChecked = true,
onCheckedChange = {},
) )
PreferenceSlide( PreferenceSlide(
title = "Slide", title = "Slide",
summary = "Summary", summary = "Summary",
value = 0.75F, value = 0.75F,
showIconAreaIfNoIcon = true, showIconAreaIfNoIcon = true,
onValueChange = {},
) )
} }
} }

View file

@ -44,13 +44,13 @@ import io.element.android.libraries.theme.ElementTheme
fun PreferenceCheckbox( fun PreferenceCheckbox(
title: String, title: String,
isChecked: Boolean, isChecked: Boolean,
onCheckedChange: (Boolean) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
supportingText: String? = null, supportingText: String? = null,
enabled: Boolean = true, enabled: Boolean = true,
icon: ImageVector? = null, icon: ImageVector? = null,
@DrawableRes iconResourceId: Int? = null, @DrawableRes iconResourceId: Int? = null,
showIconAreaIfNoIcon: Boolean = false, showIconAreaIfNoIcon: Boolean = false,
onCheckedChange: (Boolean) -> Unit = {},
) { ) {
Row( Row(
modifier = modifier modifier = modifier
@ -104,14 +104,16 @@ private fun ContentToPreview() {
title = "Checkbox", title = "Checkbox",
iconResourceId = CommonDrawables.ic_compound_threads, iconResourceId = CommonDrawables.ic_compound_threads,
enabled = true, enabled = true,
isChecked = true isChecked = true,
onCheckedChange = {},
) )
PreferenceCheckbox( PreferenceCheckbox(
title = "Checkbox with supporting text", title = "Checkbox with supporting text",
supportingText = "Supporting text", supportingText = "Supporting text",
iconResourceId = CommonDrawables.ic_compound_threads, iconResourceId = CommonDrawables.ic_compound_threads,
enabled = true, enabled = true,
isChecked = true isChecked = true,
onCheckedChange = {},
) )
} }
} }

View file

@ -46,8 +46,8 @@ import io.element.android.libraries.theme.ElementTheme
@Composable @Composable
fun PreferencePage( fun PreferencePage(
title: String, title: String,
onBackPressed: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onBackPressed: () -> Unit = {},
snackbarHost: @Composable () -> Unit = {}, snackbarHost: @Composable () -> Unit = {},
content: @Composable ColumnScope.() -> Unit, content: @Composable ColumnScope.() -> Unit,
) { ) {
@ -81,8 +81,8 @@ fun PreferencePage(
@Composable @Composable
private fun PreferenceTopAppBar( private fun PreferenceTopAppBar(
title: String, title: String,
onBackPressed: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onBackPressed: () -> Unit = {},
) { ) {
TopAppBar( TopAppBar(
modifier = modifier, modifier = modifier,
@ -105,7 +105,8 @@ private fun PreferenceTopAppBar(
@Composable @Composable
internal fun PreferenceViewPreview() = ElementPreview { internal fun PreferenceViewPreview() = ElementPreview {
PreferencePage( PreferencePage(
title = "Preference screen" title = "Preference screen",
onBackPressed = {},
) { ) {
PreferenceCategory( PreferenceCategory(
title = "Category title", title = "Category title",
@ -120,12 +121,14 @@ internal fun PreferenceViewPreview() = ElementPreview {
title = "Switch", title = "Switch",
iconResourceId = CommonDrawables.ic_compound_threads, iconResourceId = CommonDrawables.ic_compound_threads,
isChecked = true, isChecked = true,
onCheckedChange = {},
) )
PreferenceDivider() PreferenceDivider()
PreferenceCheckbox( PreferenceCheckbox(
title = "Checkbox", title = "Checkbox",
iconResourceId = CommonDrawables.ic_compound_notifications, iconResourceId = CommonDrawables.ic_compound_notifications,
isChecked = true, isChecked = true,
onCheckedChange = {},
) )
PreferenceDivider() PreferenceDivider()
PreferenceSlide( PreferenceSlide(
@ -133,6 +136,7 @@ internal fun PreferenceViewPreview() = ElementPreview {
summary = "Summary", summary = "Summary",
value = 0.75F, value = 0.75F,
showIconAreaIfNoIcon = true, showIconAreaIfNoIcon = true,
onValueChange = {},
) )
} }
} }

View file

@ -42,6 +42,7 @@ fun PreferenceSlide(
title: String, title: String,
@FloatRange(0.0, 1.0) @FloatRange(0.0, 1.0)
value: Float, value: Float,
onValueChange: (Float) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
icon: ImageVector? = null, icon: ImageVector? = null,
@DrawableRes iconResourceId: Int? = null, @DrawableRes iconResourceId: Int? = null,
@ -49,7 +50,6 @@ fun PreferenceSlide(
enabled: Boolean = true, enabled: Boolean = true,
summary: String? = null, summary: String? = null,
steps: Int = 0, steps: Int = 0,
onValueChange: (Float) -> Unit = {},
) { ) {
Row( Row(
modifier = modifier modifier = modifier
@ -98,6 +98,7 @@ private fun ContentToPreview() {
iconResourceId = CommonDrawables.ic_compound_user_profile, iconResourceId = CommonDrawables.ic_compound_user_profile,
title = "Slide", title = "Slide",
summary = "Summary", summary = "Summary",
value = 0.75F value = 0.75F,
onValueChange = {},
) )
} }

View file

@ -46,13 +46,13 @@ import io.element.android.libraries.theme.ElementTheme
fun PreferenceSwitch( fun PreferenceSwitch(
title: String, title: String,
isChecked: Boolean, isChecked: Boolean,
onCheckedChange: (Boolean) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
subtitle: String? = null, subtitle: String? = null,
enabled: Boolean = true, enabled: Boolean = true,
icon: ImageVector? = null, icon: ImageVector? = null,
@DrawableRes iconResourceId: Int? = null, @DrawableRes iconResourceId: Int? = null,
showIconAreaIfNoIcon: Boolean = false, showIconAreaIfNoIcon: Boolean = false,
onCheckedChange: (Boolean) -> Unit = {},
switchAlignment: Alignment.Vertical = Alignment.CenterVertically switchAlignment: Alignment.Vertical = Alignment.CenterVertically
) { ) {
Row( Row(
@ -111,6 +111,7 @@ private fun ContentToPreview() {
subtitle = "Subtitle Switch", subtitle = "Subtitle Switch",
iconResourceId = CommonDrawables.ic_compound_threads, iconResourceId = CommonDrawables.ic_compound_threads,
enabled = true, enabled = true,
isChecked = true isChecked = true,
onCheckedChange = {},
) )
} }

View file

@ -52,8 +52,8 @@ import kotlinx.coroutines.launch
fun AvatarActionBottomSheet( fun AvatarActionBottomSheet(
actions: ImmutableList<AvatarAction>, actions: ImmutableList<AvatarAction>,
modalBottomSheetState: ModalBottomSheetState, modalBottomSheetState: ModalBottomSheetState,
onActionSelected: (action: AvatarAction) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onActionSelected: (action: AvatarAction) -> Unit = {},
) { ) {
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
fun onItemActionClicked(itemAction: AvatarAction) { fun onItemActionClicked(itemAction: AvatarAction) {
@ -119,5 +119,6 @@ internal fun AvatarActionBottomSheetPreview() = ElementPreview {
initialValue = ModalBottomSheetValue.Expanded, initialValue = ModalBottomSheetValue.Expanded,
density = LocalDensity.current, density = LocalDensity.current,
), ),
onActionSelected = { },
) )
} }

View file

@ -21,8 +21,8 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.matrix.ui.model.getAvatarData
import io.element.android.libraries.matrix.ui.model.getBestName import io.element.android.libraries.matrix.ui.model.getBestName
@ -31,9 +31,9 @@ import io.element.android.libraries.matrix.ui.model.getBestName
fun CheckableMatrixUserRow( fun CheckableMatrixUserRow(
checked: Boolean, checked: Boolean,
matrixUser: MatrixUser, matrixUser: MatrixUser,
onCheckedChange: (Boolean) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
avatarSize: AvatarSize = AvatarSize.UserListItem, avatarSize: AvatarSize = AvatarSize.UserListItem,
onCheckedChange: (Boolean) -> Unit = {},
enabled: Boolean = true, enabled: Boolean = true,
) = CheckableUserRow( ) = CheckableUserRow(
checked = checked, checked = checked,
@ -49,9 +49,27 @@ fun CheckableMatrixUserRow(
@Composable @Composable
internal fun CheckableMatrixUserRowPreview(@PreviewParameter(MatrixUserProvider::class) matrixUser: MatrixUser) = ElementPreview { internal fun CheckableMatrixUserRowPreview(@PreviewParameter(MatrixUserProvider::class) matrixUser: MatrixUser) = ElementPreview {
Column { Column {
CheckableMatrixUserRow(checked = true, matrixUser) CheckableMatrixUserRow(
CheckableMatrixUserRow(checked = false, matrixUser) checked = true,
CheckableMatrixUserRow(checked = true, matrixUser, enabled = false) onCheckedChange = { },
CheckableMatrixUserRow(checked = false, matrixUser, enabled = false) matrixUser = matrixUser,
)
CheckableMatrixUserRow(
checked = false,
onCheckedChange = { },
matrixUser = matrixUser,
)
CheckableMatrixUserRow(
checked = true,
onCheckedChange = { },
matrixUser = matrixUser,
enabled = false,
)
CheckableMatrixUserRow(
checked = false,
onCheckedChange = { },
matrixUser = matrixUser,
enabled = false,
)
} }
} }

View file

@ -37,10 +37,10 @@ import io.element.android.libraries.matrix.ui.model.getAvatarData
@Composable @Composable
fun CheckableUnresolvedUserRow( fun CheckableUnresolvedUserRow(
checked: Boolean, checked: Boolean,
onCheckedChange: (Boolean) -> Unit,
avatarData: AvatarData, avatarData: AvatarData,
id: String, id: String,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onCheckedChange: (Boolean) -> Unit = {},
enabled: Boolean = true, enabled: Boolean = true,
) { ) {
Row( Row(
@ -71,12 +71,34 @@ fun CheckableUnresolvedUserRow(
internal fun CheckableUnresolvedUserRowPreview() = ElementThemedPreview { internal fun CheckableUnresolvedUserRowPreview() = ElementThemedPreview {
val matrixUser = aMatrixUser() val matrixUser = aMatrixUser()
Column { Column {
CheckableUnresolvedUserRow(false, matrixUser.getAvatarData(AvatarSize.UserListItem), matrixUser.userId.value) CheckableUnresolvedUserRow(
checked = false,
onCheckedChange = { },
avatarData = matrixUser.getAvatarData(AvatarSize.UserListItem),
id = matrixUser.userId.value,
)
HorizontalDivider() HorizontalDivider()
CheckableUnresolvedUserRow(true, matrixUser.getAvatarData(AvatarSize.UserListItem), matrixUser.userId.value) CheckableUnresolvedUserRow(
checked = true,
onCheckedChange = { },
avatarData = matrixUser.getAvatarData(AvatarSize.UserListItem),
id = matrixUser.userId.value,
)
HorizontalDivider() HorizontalDivider()
CheckableUnresolvedUserRow(false, matrixUser.getAvatarData(AvatarSize.UserListItem), matrixUser.userId.value, enabled = false) CheckableUnresolvedUserRow(
checked = false,
onCheckedChange = { },
avatarData = matrixUser.getAvatarData(AvatarSize.UserListItem),
id = matrixUser.userId.value,
enabled = false,
)
HorizontalDivider() HorizontalDivider()
CheckableUnresolvedUserRow(true, matrixUser.getAvatarData(AvatarSize.UserListItem), matrixUser.userId.value, enabled = false) CheckableUnresolvedUserRow(
checked = true,
onCheckedChange = { },
avatarData = matrixUser.getAvatarData(AvatarSize.UserListItem),
id = matrixUser.userId.value,
enabled = false,
)
} }
} }

View file

@ -31,11 +31,11 @@ import io.element.android.libraries.designsystem.theme.components.Checkbox
@Composable @Composable
fun CheckableUserRow( fun CheckableUserRow(
checked: Boolean, checked: Boolean,
onCheckedChange: (Boolean) -> Unit,
avatarData: AvatarData, avatarData: AvatarData,
name: String, name: String,
subtext: String?, subtext: String?,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onCheckedChange: (Boolean) -> Unit = {},
enabled: Boolean = true, enabled: Boolean = true,
) { ) {
Row( Row(

View file

@ -43,7 +43,7 @@ fun MatrixUserHeader(
matrixUser: MatrixUser?, matrixUser: MatrixUser?,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
// TODO handle click on this item, to let the user be able to update their profile. // TODO handle click on this item, to let the user be able to update their profile.
// onClick: () -> Unit = {}, // onClick: () -> Unit,
) { ) {
if (matrixUser == null) { if (matrixUser == null) {
MatrixUserHeaderPlaceholder(modifier = modifier) MatrixUserHeaderPlaceholder(modifier = modifier)
@ -60,7 +60,7 @@ fun MatrixUserHeader(
private fun MatrixUserHeaderContent( private fun MatrixUserHeaderContent(
matrixUser: MatrixUser, matrixUser: MatrixUser,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
// onClick: () -> Unit = {}, // onClick: () -> Unit,
) { ) {
Row( Row(
modifier = modifier modifier = modifier

View file

@ -50,8 +50,8 @@ import io.element.android.libraries.ui.strings.CommonStrings
@Composable @Composable
fun SelectedRoom( fun SelectedRoom(
roomSummary: RoomSummaryDetails, roomSummary: RoomSummaryDetails,
onRoomRemoved: (RoomSummaryDetails) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onRoomRemoved: (RoomSummaryDetails) -> Unit = {},
) { ) {
Box( Box(
modifier = modifier modifier = modifier
@ -104,6 +104,7 @@ internal fun SelectedRoomPreview() = ElementPreview {
lastMessageTimestamp = null, lastMessageTimestamp = null,
unreadNotificationCount = 0, unreadNotificationCount = 0,
inviter = null, inviter = null,
) ),
onRoomRemoved = {},
) )
} }

View file

@ -36,8 +36,8 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import io.element.android.libraries.designsystem.components.avatar.Avatar import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.components.Surface import io.element.android.libraries.designsystem.theme.components.Surface
import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.Text
@ -50,8 +50,8 @@ import io.element.android.libraries.ui.strings.CommonStrings
@Composable @Composable
fun SelectedUser( fun SelectedUser(
matrixUser: MatrixUser, matrixUser: MatrixUser,
onUserRemoved: (MatrixUser) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onUserRemoved: (MatrixUser) -> Unit = {},
) { ) {
Box( Box(
modifier = modifier modifier = modifier
@ -93,5 +93,8 @@ fun SelectedUser(
@PreviewsDayNight @PreviewsDayNight
@Composable @Composable
internal fun SelectedUserPreview() = ElementPreview { internal fun SelectedUserPreview() = ElementPreview {
SelectedUser(aMatrixUser()) SelectedUser(
aMatrixUser(),
onUserRemoved = {},
)
} }

View file

@ -37,8 +37,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.Layout import androidx.compose.ui.layout.Layout
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.text.toPx import io.element.android.libraries.designsystem.text.toPx
import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.api.user.MatrixUser
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableList
@ -48,10 +48,10 @@ import kotlin.math.floor
@Composable @Composable
fun SelectedUsersList( fun SelectedUsersList(
selectedUsers: ImmutableList<MatrixUser>, selectedUsers: ImmutableList<MatrixUser>,
onUserRemoved: (MatrixUser) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
autoScroll: Boolean = false, autoScroll: Boolean = false,
contentPadding: PaddingValues = PaddingValues(0.dp), contentPadding: PaddingValues = PaddingValues(0.dp),
onUserRemoved: (MatrixUser) -> Unit = {},
) { ) {
val lazyListState = rememberLazyListState() val lazyListState = rememberLazyListState()
if (autoScroll) { if (autoScroll) {
@ -135,6 +135,7 @@ internal fun SelectedUsersListPreview() = ElementPreview {
// Two users that will be visible with no scrolling // Two users that will be visible with no scrolling
SelectedUsersList( SelectedUsersList(
selectedUsers = aMatrixUserList().take(2).toImmutableList(), selectedUsers = aMatrixUserList().take(2).toImmutableList(),
onUserRemoved = {},
modifier = Modifier modifier = Modifier
.width(200.dp) .width(200.dp)
.border(1.dp, Color.Red) .border(1.dp, Color.Red)
@ -144,6 +145,7 @@ internal fun SelectedUsersListPreview() = ElementPreview {
for (i in 0..5) { for (i in 0..5) {
SelectedUsersList( SelectedUsersList(
selectedUsers = aMatrixUserList().take(6).toImmutableList(), selectedUsers = aMatrixUserList().take(6).toImmutableList(),
onUserRemoved = {},
modifier = Modifier modifier = Modifier
.width((200 + i * 20).dp) .width((200 + i * 20).dp)
.border(1.dp, Color.Red) .border(1.dp, Color.Red)

View file

@ -68,19 +68,19 @@ import io.element.android.libraries.testtags.TestTags
import io.element.android.libraries.testtags.testTag import io.element.android.libraries.testtags.testTag
import io.element.android.libraries.textcomposer.components.ComposerOptionsButton import io.element.android.libraries.textcomposer.components.ComposerOptionsButton
import io.element.android.libraries.textcomposer.components.DismissTextFormattingButton import io.element.android.libraries.textcomposer.components.DismissTextFormattingButton
import io.element.android.libraries.textcomposer.components.VoiceMessageRecorderButton
import io.element.android.libraries.textcomposer.components.SendButton import io.element.android.libraries.textcomposer.components.SendButton
import io.element.android.libraries.textcomposer.components.TextFormatting import io.element.android.libraries.textcomposer.components.TextFormatting
import io.element.android.libraries.textcomposer.components.VoiceMessageDeleteButton import io.element.android.libraries.textcomposer.components.VoiceMessageDeleteButton
import io.element.android.libraries.textcomposer.components.VoiceMessagePreview import io.element.android.libraries.textcomposer.components.VoiceMessagePreview
import io.element.android.libraries.textcomposer.components.VoiceMessageRecorderButton
import io.element.android.libraries.textcomposer.components.VoiceMessageRecording import io.element.android.libraries.textcomposer.components.VoiceMessageRecording
import io.element.android.libraries.textcomposer.components.textInputRoundedCornerShape import io.element.android.libraries.textcomposer.components.textInputRoundedCornerShape
import io.element.android.libraries.textcomposer.mentions.rememberMentionSpanProvider import io.element.android.libraries.textcomposer.mentions.rememberMentionSpanProvider
import io.element.android.libraries.textcomposer.model.Message import io.element.android.libraries.textcomposer.model.Message
import io.element.android.libraries.textcomposer.model.MessageComposerMode import io.element.android.libraries.textcomposer.model.MessageComposerMode
import io.element.android.libraries.textcomposer.model.VoiceMessageRecorderEvent
import io.element.android.libraries.textcomposer.model.Suggestion import io.element.android.libraries.textcomposer.model.Suggestion
import io.element.android.libraries.textcomposer.model.VoiceMessagePlayerEvent import io.element.android.libraries.textcomposer.model.VoiceMessagePlayerEvent
import io.element.android.libraries.textcomposer.model.VoiceMessageRecorderEvent
import io.element.android.libraries.textcomposer.model.VoiceMessageState import io.element.android.libraries.textcomposer.model.VoiceMessageState
import io.element.android.libraries.theme.ElementTheme import io.element.android.libraries.theme.ElementTheme
import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.ui.strings.CommonStrings
@ -101,20 +101,20 @@ fun TextComposer(
enableTextFormatting: Boolean, enableTextFormatting: Boolean,
enableVoiceMessages: Boolean, enableVoiceMessages: Boolean,
currentUserId: UserId, currentUserId: UserId,
onRequestFocus: () -> Unit,
onSendMessage: (Message) -> Unit,
onResetComposerMode: () -> Unit,
onAddAttachment: () -> Unit,
onDismissTextFormatting: () -> Unit,
onVoiceRecorderEvent: (VoiceMessageRecorderEvent) -> Unit,
onVoicePlayerEvent: (VoiceMessagePlayerEvent) -> Unit,
onSendVoiceMessage: () -> Unit,
onDeleteVoiceMessage: () -> Unit,
onError: (Throwable) -> Unit,
onSuggestionReceived: (Suggestion?) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
showTextFormatting: Boolean = false, showTextFormatting: Boolean = false,
subcomposing: Boolean = false, subcomposing: Boolean = false,
onRequestFocus: () -> Unit = {},
onSendMessage: (Message) -> Unit = {},
onResetComposerMode: () -> Unit = {},
onAddAttachment: () -> Unit = {},
onDismissTextFormatting: () -> Unit = {},
onVoiceRecorderEvent: (VoiceMessageRecorderEvent) -> Unit = {},
onVoicePlayerEvent: (VoiceMessagePlayerEvent) -> Unit = {},
onSendVoiceMessage: () -> Unit = {},
onDeleteVoiceMessage: () -> Unit = {},
onError: (Throwable) -> Unit = {},
onSuggestionReceived: (Suggestion?) -> Unit = {},
) { ) {
val onSendClicked = { val onSendClicked = {
val html = if (enableTextFormatting) state.messageHtml else null val html = if (enableTextFormatting) state.messageHtml else null
@ -591,48 +591,40 @@ private fun ReplyToModeView(
internal fun TextComposerSimplePreview() = ElementPreview { internal fun TextComposerSimplePreview() = ElementPreview {
PreviewColumn(items = persistentListOf( PreviewColumn(items = persistentListOf(
{ {
TextComposer( ATextComposer(
RichTextEditorState("", initialFocus = true), RichTextEditorState("", initialFocus = true),
voiceMessageState = VoiceMessageState.Idle, voiceMessageState = VoiceMessageState.Idle,
onSendMessage = {},
composerMode = MessageComposerMode.Normal, composerMode = MessageComposerMode.Normal,
onResetComposerMode = {},
enableTextFormatting = true, enableTextFormatting = true,
enableVoiceMessages = true, enableVoiceMessages = true,
currentUserId = UserId("@alice:localhost"), currentUserId = UserId("@alice:localhost"),
) )
}, { }, {
TextComposer( ATextComposer(
RichTextEditorState("A message", initialFocus = true), RichTextEditorState("A message", initialFocus = true),
voiceMessageState = VoiceMessageState.Idle, voiceMessageState = VoiceMessageState.Idle,
onSendMessage = {},
composerMode = MessageComposerMode.Normal, composerMode = MessageComposerMode.Normal,
onResetComposerMode = {},
enableTextFormatting = true, enableTextFormatting = true,
enableVoiceMessages = true, enableVoiceMessages = true,
currentUserId = UserId("@alice:localhost") currentUserId = UserId("@alice:localhost")
) )
}, { }, {
TextComposer( ATextComposer(
RichTextEditorState( RichTextEditorState(
"A message\nWith several lines\nTo preview larger textfields and long lines with overflow", "A message\nWith several lines\nTo preview larger textfields and long lines with overflow",
initialFocus = true initialFocus = true
), ),
voiceMessageState = VoiceMessageState.Idle, voiceMessageState = VoiceMessageState.Idle,
onSendMessage = {},
composerMode = MessageComposerMode.Normal, composerMode = MessageComposerMode.Normal,
onResetComposerMode = {},
enableTextFormatting = true, enableTextFormatting = true,
enableVoiceMessages = true, enableVoiceMessages = true,
currentUserId = UserId("@alice:localhost") currentUserId = UserId("@alice:localhost")
) )
}, { }, {
TextComposer( ATextComposer(
RichTextEditorState("A message without focus", initialFocus = false), RichTextEditorState("A message without focus", initialFocus = false),
voiceMessageState = VoiceMessageState.Idle, voiceMessageState = VoiceMessageState.Idle,
onSendMessage = {},
composerMode = MessageComposerMode.Normal, composerMode = MessageComposerMode.Normal,
onResetComposerMode = {},
enableTextFormatting = true, enableTextFormatting = true,
enableVoiceMessages = true, enableVoiceMessages = true,
currentUserId = UserId("@alice:localhost") currentUserId = UserId("@alice:localhost")
@ -645,7 +637,7 @@ internal fun TextComposerSimplePreview() = ElementPreview {
@Composable @Composable
internal fun TextComposerFormattingPreview() = ElementPreview { internal fun TextComposerFormattingPreview() = ElementPreview {
PreviewColumn(items = persistentListOf({ PreviewColumn(items = persistentListOf({
TextComposer( ATextComposer(
RichTextEditorState("", initialFocus = false), RichTextEditorState("", initialFocus = false),
voiceMessageState = VoiceMessageState.Idle, voiceMessageState = VoiceMessageState.Idle,
showTextFormatting = true, showTextFormatting = true,
@ -655,7 +647,7 @@ internal fun TextComposerFormattingPreview() = ElementPreview {
currentUserId = UserId("@alice:localhost") currentUserId = UserId("@alice:localhost")
) )
}, { }, {
TextComposer( ATextComposer(
RichTextEditorState("A message", initialFocus = false), RichTextEditorState("A message", initialFocus = false),
voiceMessageState = VoiceMessageState.Idle, voiceMessageState = VoiceMessageState.Idle,
showTextFormatting = true, showTextFormatting = true,
@ -665,7 +657,7 @@ internal fun TextComposerFormattingPreview() = ElementPreview {
currentUserId = UserId("@alice:localhost") currentUserId = UserId("@alice:localhost")
) )
}, { }, {
TextComposer( ATextComposer(
RichTextEditorState("A message\nWith several lines\nTo preview larger textfields and long lines with overflow", initialFocus = false), RichTextEditorState("A message\nWith several lines\nTo preview larger textfields and long lines with overflow", initialFocus = false),
voiceMessageState = VoiceMessageState.Idle, voiceMessageState = VoiceMessageState.Idle,
showTextFormatting = true, showTextFormatting = true,
@ -681,12 +673,10 @@ internal fun TextComposerFormattingPreview() = ElementPreview {
@Composable @Composable
internal fun TextComposerEditPreview() = ElementPreview { internal fun TextComposerEditPreview() = ElementPreview {
PreviewColumn(items = persistentListOf({ PreviewColumn(items = persistentListOf({
TextComposer( ATextComposer(
RichTextEditorState("A message", initialFocus = true), RichTextEditorState("A message", initialFocus = true),
voiceMessageState = VoiceMessageState.Idle, voiceMessageState = VoiceMessageState.Idle,
onSendMessage = {},
composerMode = MessageComposerMode.Edit(EventId("$1234"), "Some text", TransactionId("1234")), composerMode = MessageComposerMode.Edit(EventId("$1234"), "Some text", TransactionId("1234")),
onResetComposerMode = {},
enableTextFormatting = true, enableTextFormatting = true,
enableVoiceMessages = true, enableVoiceMessages = true,
currentUserId = UserId("@alice:localhost") currentUserId = UserId("@alice:localhost")
@ -698,10 +688,9 @@ internal fun TextComposerEditPreview() = ElementPreview {
@Composable @Composable
internal fun TextComposerReplyPreview() = ElementPreview { internal fun TextComposerReplyPreview() = ElementPreview {
PreviewColumn(items = persistentListOf({ PreviewColumn(items = persistentListOf({
TextComposer( ATextComposer(
RichTextEditorState(""), RichTextEditorState(""),
voiceMessageState = VoiceMessageState.Idle, voiceMessageState = VoiceMessageState.Idle,
onSendMessage = {},
composerMode = MessageComposerMode.Reply( composerMode = MessageComposerMode.Reply(
isThreaded = false, isThreaded = false,
senderName = "Alice", senderName = "Alice",
@ -711,17 +700,15 @@ internal fun TextComposerReplyPreview() = ElementPreview {
"With several lines\n" + "With several lines\n" +
"To preview larger textfields and long lines with overflow" "To preview larger textfields and long lines with overflow"
), ),
onResetComposerMode = {},
enableTextFormatting = true, enableTextFormatting = true,
enableVoiceMessages = true, enableVoiceMessages = true,
currentUserId = UserId("@alice:localhost") currentUserId = UserId("@alice:localhost")
) )
}, },
{ {
TextComposer( ATextComposer(
RichTextEditorState(""), RichTextEditorState(""),
voiceMessageState = VoiceMessageState.Idle, voiceMessageState = VoiceMessageState.Idle,
onSendMessage = {},
composerMode = MessageComposerMode.Reply( composerMode = MessageComposerMode.Reply(
isThreaded = true, isThreaded = true,
senderName = "Alice", senderName = "Alice",
@ -731,16 +718,14 @@ internal fun TextComposerReplyPreview() = ElementPreview {
"With several lines\n" + "With several lines\n" +
"To preview larger textfields and long lines with overflow" "To preview larger textfields and long lines with overflow"
), ),
onResetComposerMode = {},
enableTextFormatting = true, enableTextFormatting = true,
enableVoiceMessages = true, enableVoiceMessages = true,
currentUserId = UserId("@alice:localhost") currentUserId = UserId("@alice:localhost")
) )
}, { }, {
TextComposer( ATextComposer(
RichTextEditorState("A message"), RichTextEditorState("A message"),
voiceMessageState = VoiceMessageState.Idle, voiceMessageState = VoiceMessageState.Idle,
onSendMessage = {},
composerMode = MessageComposerMode.Reply( composerMode = MessageComposerMode.Reply(
isThreaded = true, isThreaded = true,
senderName = "Alice", senderName = "Alice",
@ -753,16 +738,14 @@ internal fun TextComposerReplyPreview() = ElementPreview {
), ),
defaultContent = "image.jpg" defaultContent = "image.jpg"
), ),
onResetComposerMode = {},
enableTextFormatting = true, enableTextFormatting = true,
enableVoiceMessages = true, enableVoiceMessages = true,
currentUserId = UserId("@alice:localhost") currentUserId = UserId("@alice:localhost")
) )
}, { }, {
TextComposer( ATextComposer(
RichTextEditorState("A message"), RichTextEditorState("A message"),
voiceMessageState = VoiceMessageState.Idle, voiceMessageState = VoiceMessageState.Idle,
onSendMessage = {},
composerMode = MessageComposerMode.Reply( composerMode = MessageComposerMode.Reply(
isThreaded = false, isThreaded = false,
senderName = "Alice", senderName = "Alice",
@ -775,16 +758,14 @@ internal fun TextComposerReplyPreview() = ElementPreview {
), ),
defaultContent = "video.mp4" defaultContent = "video.mp4"
), ),
onResetComposerMode = {},
enableTextFormatting = true, enableTextFormatting = true,
enableVoiceMessages = true, enableVoiceMessages = true,
currentUserId = UserId("@alice:localhost") currentUserId = UserId("@alice:localhost")
) )
}, { }, {
TextComposer( ATextComposer(
RichTextEditorState("A message"), RichTextEditorState("A message"),
voiceMessageState = VoiceMessageState.Idle, voiceMessageState = VoiceMessageState.Idle,
onSendMessage = {},
composerMode = MessageComposerMode.Reply( composerMode = MessageComposerMode.Reply(
isThreaded = false, isThreaded = false,
senderName = "Alice", senderName = "Alice",
@ -797,16 +778,14 @@ internal fun TextComposerReplyPreview() = ElementPreview {
), ),
defaultContent = "logs.txt" defaultContent = "logs.txt"
), ),
onResetComposerMode = {},
enableTextFormatting = true, enableTextFormatting = true,
enableVoiceMessages = true, enableVoiceMessages = true,
currentUserId = UserId("@alice:localhost") currentUserId = UserId("@alice:localhost")
) )
}, { }, {
TextComposer( ATextComposer(
RichTextEditorState("A message", initialFocus = true), RichTextEditorState("A message", initialFocus = true),
voiceMessageState = VoiceMessageState.Idle, voiceMessageState = VoiceMessageState.Idle,
onSendMessage = {},
composerMode = MessageComposerMode.Reply( composerMode = MessageComposerMode.Reply(
isThreaded = false, isThreaded = false,
senderName = "Alice", senderName = "Alice",
@ -819,7 +798,6 @@ internal fun TextComposerReplyPreview() = ElementPreview {
), ),
defaultContent = "Shared location" defaultContent = "Shared location"
), ),
onResetComposerMode = {},
enableTextFormatting = true, enableTextFormatting = true,
enableVoiceMessages = true, enableVoiceMessages = true,
currentUserId = UserId("@alice:localhost") currentUserId = UserId("@alice:localhost")
@ -834,12 +812,10 @@ internal fun TextComposerVoicePreview() = ElementPreview {
@Composable @Composable
fun VoicePreview( fun VoicePreview(
voiceMessageState: VoiceMessageState voiceMessageState: VoiceMessageState
) = TextComposer( ) = ATextComposer(
RichTextEditorState("", initialFocus = true), RichTextEditorState("", initialFocus = true),
voiceMessageState = voiceMessageState, voiceMessageState = voiceMessageState,
onSendMessage = {},
composerMode = MessageComposerMode.Normal, composerMode = MessageComposerMode.Normal,
onResetComposerMode = {},
enableTextFormatting = true, enableTextFormatting = true,
enableVoiceMessages = true, enableVoiceMessages = true,
currentUserId = UserId("@alice:localhost") currentUserId = UserId("@alice:localhost")
@ -899,3 +875,35 @@ private fun PreviewColumn(
} }
} }
} }
@Composable
private fun ATextComposer(
richTextEditorState: RichTextEditorState,
voiceMessageState: VoiceMessageState,
composerMode: MessageComposerMode,
enableTextFormatting: Boolean,
enableVoiceMessages: Boolean,
currentUserId: UserId,
showTextFormatting: Boolean = false,
) {
TextComposer(
state = richTextEditorState,
showTextFormatting = showTextFormatting,
voiceMessageState = voiceMessageState,
composerMode = composerMode,
enableTextFormatting = enableTextFormatting,
enableVoiceMessages = enableVoiceMessages,
currentUserId = currentUserId,
onRequestFocus = {},
onSendMessage = {},
onResetComposerMode = {},
onAddAttachment = {},
onDismissTextFormatting = {},
onVoiceRecorderEvent = {},
onVoicePlayerEvent = {},
onSendVoiceMessage = {},
onDeleteVoiceMessage = {},
onError = {},
onSuggestionReceived = {},
)
}

View file

@ -33,8 +33,8 @@ import io.element.android.libraries.ui.strings.CommonStrings
@Composable @Composable
fun VoiceMessageDeleteButton( fun VoiceMessageDeleteButton(
enabled: Boolean, enabled: Boolean,
onClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onClick: () -> Unit = {},
) { ) {
IconButton( IconButton(
modifier = modifier modifier = modifier
@ -59,7 +59,13 @@ fun VoiceMessageDeleteButton(
@Composable @Composable
internal fun VoiceMessageDeleteButtonPreview() = ElementPreview { internal fun VoiceMessageDeleteButtonPreview() = ElementPreview {
Row { Row {
VoiceMessageDeleteButton(enabled = true) VoiceMessageDeleteButton(
VoiceMessageDeleteButton(enabled = false) enabled = true,
onClick = {},
)
VoiceMessageDeleteButton(
enabled = false,
onClick = {},
)
} }
} }

View file

@ -58,11 +58,11 @@ internal fun VoiceMessagePreview(
showCursor: Boolean, showCursor: Boolean,
waveform: ImmutableList<Float>, waveform: ImmutableList<Float>,
time: Duration, time: Duration,
onPlayClick: () -> Unit,
onPauseClick: () -> Unit,
onSeek: (Float) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
playbackProgress: Float = 0f, playbackProgress: Float = 0f,
onPlayClick: () -> Unit = {},
onPauseClick: () -> Unit = {},
onSeek: (Float) -> Unit = {},
) { ) {
Row( Row(
modifier = modifier modifier = modifier
@ -163,7 +163,7 @@ internal fun VoiceMessagePreviewPreview() = ElementPreview {
Column( Column(
verticalArrangement = Arrangement.spacedBy(8.dp) verticalArrangement = Arrangement.spacedBy(8.dp)
) { ) {
VoiceMessagePreview( AVoiceMessagePreview(
isInteractive = true, isInteractive = true,
isPlaying = true, isPlaying = true,
time = 2.seconds, time = 2.seconds,
@ -171,7 +171,7 @@ internal fun VoiceMessagePreviewPreview() = ElementPreview {
showCursor = true, showCursor = true,
waveform = createFakeWaveform() waveform = createFakeWaveform()
) )
VoiceMessagePreview( AVoiceMessagePreview(
isInteractive = true, isInteractive = true,
isPlaying = false, isPlaying = false,
time = 0.seconds, time = 0.seconds,
@ -179,7 +179,7 @@ internal fun VoiceMessagePreviewPreview() = ElementPreview {
showCursor = true, showCursor = true,
waveform = createFakeWaveform() waveform = createFakeWaveform()
) )
VoiceMessagePreview( AVoiceMessagePreview(
isInteractive = false, isInteractive = false,
isPlaying = false, isPlaying = false,
time = 789.seconds, time = 789.seconds,
@ -189,3 +189,25 @@ internal fun VoiceMessagePreviewPreview() = ElementPreview {
) )
} }
} }
@Composable
private fun AVoiceMessagePreview(
isInteractive: Boolean,
isPlaying: Boolean,
time: Duration,
playbackProgress: Float,
showCursor: Boolean,
waveform: ImmutableList<Float>,
) {
VoiceMessagePreview(
isInteractive = isInteractive,
isPlaying = isPlaying,
time = time,
playbackProgress = playbackProgress,
showCursor = showCursor,
waveform = waveform,
onPlayClick = {},
onPauseClick = {},
onSeek = {},
)
}

View file

@ -40,8 +40,8 @@ import io.element.android.libraries.ui.strings.CommonStrings
@Composable @Composable
internal fun VoiceMessageRecorderButton( internal fun VoiceMessageRecorderButton(
isRecording: Boolean, isRecording: Boolean,
onEvent: (VoiceMessageRecorderEvent) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onEvent: (VoiceMessageRecorderEvent) -> Unit = {},
) { ) {
val hapticFeedback = LocalHapticFeedback.current val hapticFeedback = LocalHapticFeedback.current
@ -113,7 +113,13 @@ private fun StopButton(
@Composable @Composable
internal fun VoiceMessageRecorderButtonPreview() = ElementPreview { internal fun VoiceMessageRecorderButtonPreview() = ElementPreview {
Row { Row {
VoiceMessageRecorderButton(isRecording = false) VoiceMessageRecorderButton(
VoiceMessageRecorderButton(isRecording = true) isRecording = false,
onEvent = {},
)
VoiceMessageRecorderButton(
isRecording = true,
onEvent = {},
)
} }
} }