Extract Provider (and rename them) to their own file and move fixture(s) there.
This commit is contained in:
parent
4ca5cdd512
commit
ec687edc2d
46 changed files with 593 additions and 302 deletions
|
|
@ -18,9 +18,7 @@ package io.element.android.x.root
|
||||||
|
|
||||||
import androidx.compose.runtime.Stable
|
import androidx.compose.runtime.Stable
|
||||||
import io.element.android.features.rageshake.crash.ui.CrashDetectionState
|
import io.element.android.features.rageshake.crash.ui.CrashDetectionState
|
||||||
import io.element.android.features.rageshake.crash.ui.aCrashDetectionState
|
|
||||||
import io.element.android.features.rageshake.detection.RageshakeDetectionState
|
import io.element.android.features.rageshake.detection.RageshakeDetectionState
|
||||||
import io.element.android.features.rageshake.detection.aRageshakeDetectionState
|
|
||||||
|
|
||||||
@Stable
|
@Stable
|
||||||
data class RootState(
|
data class RootState(
|
||||||
|
|
@ -29,10 +27,3 @@ data class RootState(
|
||||||
val crashDetectionState: CrashDetectionState,
|
val crashDetectionState: CrashDetectionState,
|
||||||
val eventSink: (RootEvents) -> Unit
|
val eventSink: (RootEvents) -> Unit
|
||||||
)
|
)
|
||||||
|
|
||||||
fun aRootState() = RootState(
|
|
||||||
isShowkaseButtonVisible = false,
|
|
||||||
rageshakeDetectionState = aRageshakeDetectionState(),
|
|
||||||
crashDetectionState = aCrashDetectionState(),
|
|
||||||
eventSink = {}
|
|
||||||
)
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.x.root
|
||||||
|
|
||||||
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
|
import io.element.android.features.rageshake.crash.ui.aCrashDetectionState
|
||||||
|
import io.element.android.features.rageshake.detection.aRageshakeDetectionState
|
||||||
|
|
||||||
|
open class RootStateProvider : PreviewParameterProvider<RootState> {
|
||||||
|
override val values: Sequence<RootState>
|
||||||
|
get() = sequenceOf(
|
||||||
|
aRootState().copy(
|
||||||
|
isShowkaseButtonVisible = true,
|
||||||
|
rageshakeDetectionState = aRageshakeDetectionState().copy(showDialog = false),
|
||||||
|
crashDetectionState = aCrashDetectionState().copy(crashDetected = true),
|
||||||
|
),
|
||||||
|
aRootState().copy(
|
||||||
|
isShowkaseButtonVisible = true,
|
||||||
|
rageshakeDetectionState = aRageshakeDetectionState().copy(showDialog = true),
|
||||||
|
crashDetectionState = aCrashDetectionState().copy(crashDetected = false),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun aRootState() = RootState(
|
||||||
|
isShowkaseButtonVisible = false,
|
||||||
|
rageshakeDetectionState = aRageshakeDetectionState(),
|
||||||
|
crashDetectionState = aCrashDetectionState(),
|
||||||
|
eventSink = {}
|
||||||
|
)
|
||||||
|
|
@ -26,13 +26,10 @@ import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
|
||||||
import io.element.android.features.rageshake.crash.ui.CrashDetectionEvents
|
import io.element.android.features.rageshake.crash.ui.CrashDetectionEvents
|
||||||
import io.element.android.features.rageshake.crash.ui.CrashDetectionView
|
import io.element.android.features.rageshake.crash.ui.CrashDetectionView
|
||||||
import io.element.android.features.rageshake.crash.ui.aCrashDetectionState
|
|
||||||
import io.element.android.features.rageshake.detection.RageshakeDetectionEvents
|
import io.element.android.features.rageshake.detection.RageshakeDetectionEvents
|
||||||
import io.element.android.features.rageshake.detection.RageshakeDetectionView
|
import io.element.android.features.rageshake.detection.RageshakeDetectionView
|
||||||
import io.element.android.features.rageshake.detection.aRageshakeDetectionState
|
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
|
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
|
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
|
||||||
import io.element.android.libraries.designsystem.theme.components.Text
|
import io.element.android.libraries.designsystem.theme.components.Text
|
||||||
|
|
@ -77,29 +74,13 @@ fun RootView(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open class RootStatePreviewParameterProvider : PreviewParameterProvider<RootState> {
|
@Preview
|
||||||
override val values: Sequence<RootState>
|
@Composable
|
||||||
get() = sequenceOf(
|
fun RootLightPreview(@PreviewParameter(RootStateProvider::class) rootState: RootState) = ElementPreviewLight { ContentToPreview(rootState) }
|
||||||
aRootState().copy(
|
|
||||||
isShowkaseButtonVisible = true,
|
|
||||||
rageshakeDetectionState = aRageshakeDetectionState().copy(showDialog = false),
|
|
||||||
crashDetectionState = aCrashDetectionState().copy(crashDetected = true),
|
|
||||||
),
|
|
||||||
aRootState().copy(
|
|
||||||
isShowkaseButtonVisible = true,
|
|
||||||
rageshakeDetectionState = aRageshakeDetectionState().copy(showDialog = true),
|
|
||||||
crashDetectionState = aCrashDetectionState().copy(crashDetected = false),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun RootLightPreview(@PreviewParameter(RootStatePreviewParameterProvider::class) rootState: RootState) = ElementPreviewLight { ContentToPreview(rootState) }
|
fun RootDarkPreview(@PreviewParameter(RootStateProvider::class) rootState: RootState) = ElementPreviewDark { ContentToPreview(rootState) }
|
||||||
|
|
||||||
@Preview
|
|
||||||
@Composable
|
|
||||||
fun RootDarkPreview(@PreviewParameter(RootStatePreviewParameterProvider::class) rootState: RootState) = ElementPreviewDark { ContentToPreview(rootState) }
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun ContentToPreview(rootState: RootState) {
|
private fun ContentToPreview(rootState: RootState) {
|
||||||
|
|
|
||||||
|
|
@ -25,9 +25,3 @@ data class ChangeServerState(
|
||||||
) {
|
) {
|
||||||
val submitEnabled = homeserver.isNotEmpty() && changeServerAction !is Async.Loading
|
val submitEnabled = homeserver.isNotEmpty() && changeServerAction !is Async.Loading
|
||||||
}
|
}
|
||||||
|
|
||||||
fun aChangeServerState() = ChangeServerState(
|
|
||||||
homeserver = "",
|
|
||||||
changeServerAction = Async.Uninitialized,
|
|
||||||
eventSink = {}
|
|
||||||
)
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.features.login.changeserver
|
||||||
|
|
||||||
|
import io.element.android.libraries.architecture.Async
|
||||||
|
|
||||||
|
fun aChangeServerState() = ChangeServerState(
|
||||||
|
homeserver = "",
|
||||||
|
changeServerAction = Async.Uninitialized,
|
||||||
|
eventSink = {}
|
||||||
|
)
|
||||||
|
|
@ -47,10 +47,3 @@ data class LoginFormState(
|
||||||
val Default = LoginFormState("", "")
|
val Default = LoginFormState("", "")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun aLoginRootState() = LoginRootState(
|
|
||||||
homeserver = "",
|
|
||||||
loggedInState = LoggedInState.NotLoggedIn,
|
|
||||||
formState = LoginFormState.Default,
|
|
||||||
eventSink = {}
|
|
||||||
)
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.features.login.root
|
||||||
|
|
||||||
|
fun aLoginRootState() = LoginRootState(
|
||||||
|
homeserver = "",
|
||||||
|
loggedInState = LoggedInState.NotLoggedIn,
|
||||||
|
formState = LoginFormState.Default,
|
||||||
|
eventSink = {}
|
||||||
|
)
|
||||||
|
|
@ -22,8 +22,3 @@ data class LogoutPreferenceState(
|
||||||
val logoutAction: Async<Unit>,
|
val logoutAction: Async<Unit>,
|
||||||
val eventSink: (LogoutPreferenceEvents) -> Unit,
|
val eventSink: (LogoutPreferenceEvents) -> Unit,
|
||||||
)
|
)
|
||||||
|
|
||||||
fun aLogoutPreferenceState() = LogoutPreferenceState(
|
|
||||||
logoutAction = Async.Uninitialized,
|
|
||||||
eventSink = {}
|
|
||||||
)
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.features.logout
|
||||||
|
|
||||||
|
import io.element.android.libraries.architecture.Async
|
||||||
|
|
||||||
|
fun aLogoutPreferenceState() = LogoutPreferenceState(
|
||||||
|
logoutAction = Async.Uninitialized,
|
||||||
|
eventSink = {}
|
||||||
|
)
|
||||||
|
|
@ -49,8 +49,8 @@ import io.element.android.features.messages.textcomposer.MessageComposerView
|
||||||
import io.element.android.features.messages.textcomposer.aMessageComposerState
|
import io.element.android.features.messages.textcomposer.aMessageComposerState
|
||||||
import io.element.android.features.messages.timeline.TimelineView
|
import io.element.android.features.messages.timeline.TimelineView
|
||||||
import io.element.android.features.messages.timeline.aTimelineState
|
import io.element.android.features.messages.timeline.aTimelineState
|
||||||
import io.element.android.features.messages.timeline.createTimelineItemContent
|
import io.element.android.features.messages.timeline.aTimelineItemContent
|
||||||
import io.element.android.features.messages.timeline.createTimelineItems
|
import io.element.android.features.messages.timeline.aTimelineItemList
|
||||||
import io.element.android.features.messages.timeline.model.TimelineItem
|
import io.element.android.features.messages.timeline.model.TimelineItem
|
||||||
import io.element.android.libraries.core.data.StableCharSequence
|
import io.element.android.libraries.core.data.StableCharSequence
|
||||||
import io.element.android.libraries.designsystem.components.avatar.Avatar
|
import io.element.android.libraries.designsystem.components.avatar.Avatar
|
||||||
|
|
@ -217,7 +217,7 @@ private fun ContentToPreview() {
|
||||||
mode = MessageComposerMode.Normal("Hello"),
|
mode = MessageComposerMode.Normal("Hello"),
|
||||||
),
|
),
|
||||||
timelineState = aTimelineState().copy(
|
timelineState = aTimelineState().copy(
|
||||||
timelineItems = createTimelineItems(createTimelineItemContent()),
|
timelineItems = aTimelineItemList(aTimelineItemContent()),
|
||||||
hasMoreToLoad = false,
|
hasMoreToLoad = false,
|
||||||
),
|
),
|
||||||
actionListState = anActionListState(),
|
actionListState = anActionListState(),
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,6 @@ data class ActionListState(
|
||||||
val target: Target,
|
val target: Target,
|
||||||
val eventSink: (ActionListEvents) -> Unit,
|
val eventSink: (ActionListEvents) -> Unit,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
sealed interface Target {
|
sealed interface Target {
|
||||||
object None : Target
|
object None : Target
|
||||||
data class Loading(val messageEvent: TimelineItem.MessageEvent) : Target
|
data class Loading(val messageEvent: TimelineItem.MessageEvent) : Target
|
||||||
|
|
@ -36,8 +35,3 @@ data class ActionListState(
|
||||||
) : Target
|
) : Target
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun anActionListState() = ActionListState(
|
|
||||||
target = ActionListState.Target.None,
|
|
||||||
eventSink = {}
|
|
||||||
)
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.features.messages.actionlist
|
||||||
|
|
||||||
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
|
import io.element.android.features.messages.actionlist.model.TimelineItemAction
|
||||||
|
import io.element.android.features.messages.timeline.aMessageEvent
|
||||||
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
|
|
||||||
|
open class ActionListStateProvider : PreviewParameterProvider<ActionListState> {
|
||||||
|
override val values: Sequence<ActionListState>
|
||||||
|
get() = sequenceOf(
|
||||||
|
anActionListState(),
|
||||||
|
anActionListState().copy(target = ActionListState.Target.Loading(aMessageEvent())),
|
||||||
|
anActionListState().copy(
|
||||||
|
target = ActionListState.Target.Success(
|
||||||
|
messageEvent = aMessageEvent(),
|
||||||
|
actions = persistentListOf(
|
||||||
|
TimelineItemAction.Reply,
|
||||||
|
TimelineItemAction.Forward,
|
||||||
|
TimelineItemAction.Copy,
|
||||||
|
TimelineItemAction.Edit,
|
||||||
|
TimelineItemAction.Redact,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun anActionListState() = ActionListState(
|
||||||
|
target = ActionListState.Target.None,
|
||||||
|
eventSink = {}
|
||||||
|
)
|
||||||
|
|
@ -39,16 +39,13 @@ import androidx.compose.runtime.snapshotFlow
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import io.element.android.features.messages.actionlist.model.TimelineItemAction
|
import io.element.android.features.messages.actionlist.model.TimelineItemAction
|
||||||
import io.element.android.features.messages.timeline.createMessageEvent
|
|
||||||
import io.element.android.features.messages.timeline.model.TimelineItem
|
import io.element.android.features.messages.timeline.model.TimelineItem
|
||||||
import io.element.android.libraries.designsystem.components.VectorIcon
|
import io.element.android.libraries.designsystem.components.VectorIcon
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
|
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
|
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
|
||||||
import io.element.android.libraries.designsystem.theme.components.ModalBottomSheetLayout
|
import io.element.android.libraries.designsystem.theme.components.ModalBottomSheetLayout
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
|
||||||
import kotlinx.coroutines.flow.filter
|
import kotlinx.coroutines.flow.filter
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
|
|
@ -136,34 +133,14 @@ private fun SheetContent(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open class ActionListStatePreviewParameterProvider : PreviewParameterProvider<ActionListState> {
|
|
||||||
override val values: Sequence<ActionListState>
|
|
||||||
get() = sequenceOf(
|
|
||||||
anActionListState(),
|
|
||||||
anActionListState().copy(target = ActionListState.Target.Loading(createMessageEvent())),
|
|
||||||
anActionListState().copy(
|
|
||||||
target = ActionListState.Target.Success(
|
|
||||||
messageEvent = createMessageEvent(),
|
|
||||||
actions = persistentListOf(
|
|
||||||
TimelineItemAction.Reply,
|
|
||||||
TimelineItemAction.Forward,
|
|
||||||
TimelineItemAction.Copy,
|
|
||||||
TimelineItemAction.Edit,
|
|
||||||
TimelineItemAction.Redact,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun SheetContentLightPreview(@PreviewParameter(ActionListStatePreviewParameterProvider::class) state: ActionListState) =
|
fun SheetContentLightPreview(@PreviewParameter(ActionListStateProvider::class) state: ActionListState) =
|
||||||
ElementPreviewLight { ContentToPreview(state) }
|
ElementPreviewLight { ContentToPreview(state) }
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun SheetContentDarkPreview(@PreviewParameter(ActionListStatePreviewParameterProvider::class) state: ActionListState) =
|
fun SheetContentDarkPreview(@PreviewParameter(ActionListStateProvider::class) state: ActionListState) =
|
||||||
ElementPreviewDark { ContentToPreview(state) }
|
ElementPreviewDark { ContentToPreview(state) }
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,6 @@ import androidx.compose.runtime.Immutable
|
||||||
import io.element.android.features.messages.timeline.model.TimelineItem
|
import io.element.android.features.messages.timeline.model.TimelineItem
|
||||||
import io.element.android.libraries.matrix.core.EventId
|
import io.element.android.libraries.matrix.core.EventId
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
data class TimelineState(
|
data class TimelineState(
|
||||||
|
|
@ -29,10 +28,3 @@ data class TimelineState(
|
||||||
val highlightedEventId: EventId?,
|
val highlightedEventId: EventId?,
|
||||||
val eventSink: (TimelineEvents) -> Unit
|
val eventSink: (TimelineEvents) -> Unit
|
||||||
)
|
)
|
||||||
|
|
||||||
fun aTimelineState() = TimelineState(
|
|
||||||
timelineItems = persistentListOf(),
|
|
||||||
hasMoreToLoad = false,
|
|
||||||
highlightedEventId = null,
|
|
||||||
eventSink = {}
|
|
||||||
)
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.features.messages.timeline
|
||||||
|
|
||||||
|
import io.element.android.features.messages.timeline.model.AggregatedReaction
|
||||||
|
import io.element.android.features.messages.timeline.model.MessagesItemGroupPosition
|
||||||
|
import io.element.android.features.messages.timeline.model.TimelineItem
|
||||||
|
import io.element.android.features.messages.timeline.model.TimelineItemReactions
|
||||||
|
import io.element.android.features.messages.timeline.model.content.TimelineItemContent
|
||||||
|
import io.element.android.features.messages.timeline.model.content.TimelineItemTextContent
|
||||||
|
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
||||||
|
import io.element.android.libraries.matrix.core.EventId
|
||||||
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
|
|
||||||
|
fun aTimelineState() = TimelineState(
|
||||||
|
timelineItems = persistentListOf(),
|
||||||
|
hasMoreToLoad = false,
|
||||||
|
highlightedEventId = null,
|
||||||
|
eventSink = {}
|
||||||
|
)
|
||||||
|
|
||||||
|
internal fun aTimelineItemList(content: TimelineItemContent): ImmutableList<TimelineItem> {
|
||||||
|
return persistentListOf(
|
||||||
|
// 3 items (First Middle Last) with isMine = false
|
||||||
|
aMessageEvent(
|
||||||
|
isMine = false,
|
||||||
|
content = content,
|
||||||
|
groupPosition = MessagesItemGroupPosition.Last
|
||||||
|
),
|
||||||
|
aMessageEvent(
|
||||||
|
isMine = false,
|
||||||
|
content = content,
|
||||||
|
groupPosition = MessagesItemGroupPosition.Middle
|
||||||
|
),
|
||||||
|
aMessageEvent(
|
||||||
|
isMine = false,
|
||||||
|
content = content,
|
||||||
|
groupPosition = MessagesItemGroupPosition.First
|
||||||
|
),
|
||||||
|
// 3 items (First Middle Last) with isMine = true
|
||||||
|
aMessageEvent(
|
||||||
|
isMine = true,
|
||||||
|
content = content,
|
||||||
|
groupPosition = MessagesItemGroupPosition.Last
|
||||||
|
),
|
||||||
|
aMessageEvent(
|
||||||
|
isMine = true,
|
||||||
|
content = content,
|
||||||
|
groupPosition = MessagesItemGroupPosition.Middle
|
||||||
|
),
|
||||||
|
aMessageEvent(
|
||||||
|
isMine = true,
|
||||||
|
content = content,
|
||||||
|
groupPosition = MessagesItemGroupPosition.First
|
||||||
|
),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun aMessageEvent(
|
||||||
|
isMine: Boolean = false,
|
||||||
|
content: TimelineItemContent = aTimelineItemContent(),
|
||||||
|
groupPosition: MessagesItemGroupPosition = MessagesItemGroupPosition.First
|
||||||
|
): TimelineItem.MessageEvent {
|
||||||
|
return TimelineItem.MessageEvent(
|
||||||
|
id = EventId(Math.random().toString()),
|
||||||
|
senderId = "@senderId",
|
||||||
|
senderAvatar = AvatarData("@senderId", "sender"),
|
||||||
|
content = content,
|
||||||
|
reactionsState = TimelineItemReactions(
|
||||||
|
persistentListOf(
|
||||||
|
AggregatedReaction("👍", "1")
|
||||||
|
)
|
||||||
|
),
|
||||||
|
isMine = isMine,
|
||||||
|
senderDisplayName = "sender",
|
||||||
|
groupPosition = groupPosition,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun aTimelineItemContent(): TimelineItemContent {
|
||||||
|
return TimelineItemTextContent(
|
||||||
|
body = "Text",
|
||||||
|
htmlDocument = null
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
@ -61,17 +61,13 @@ import io.element.android.features.messages.timeline.components.TimelineItemReac
|
||||||
import io.element.android.features.messages.timeline.components.TimelineItemRedactedView
|
import io.element.android.features.messages.timeline.components.TimelineItemRedactedView
|
||||||
import io.element.android.features.messages.timeline.components.TimelineItemTextView
|
import io.element.android.features.messages.timeline.components.TimelineItemTextView
|
||||||
import io.element.android.features.messages.timeline.components.TimelineItemUnknownView
|
import io.element.android.features.messages.timeline.components.TimelineItemUnknownView
|
||||||
import io.element.android.features.messages.timeline.model.AggregatedReaction
|
|
||||||
import io.element.android.features.messages.timeline.model.MessagesItemGroupPosition
|
|
||||||
import io.element.android.features.messages.timeline.model.TimelineItem
|
import io.element.android.features.messages.timeline.model.TimelineItem
|
||||||
import io.element.android.features.messages.timeline.model.TimelineItemReactions
|
import io.element.android.features.messages.timeline.model.content.TimelineItemContentProvider
|
||||||
import io.element.android.features.messages.timeline.model.content.MessagesTimelineItemContentProvider
|
|
||||||
import io.element.android.features.messages.timeline.model.content.TimelineItemContent
|
import io.element.android.features.messages.timeline.model.content.TimelineItemContent
|
||||||
import io.element.android.features.messages.timeline.model.content.TimelineItemEncryptedContent
|
import io.element.android.features.messages.timeline.model.content.TimelineItemEncryptedContent
|
||||||
import io.element.android.features.messages.timeline.model.content.TimelineItemImageContent
|
import io.element.android.features.messages.timeline.model.content.TimelineItemImageContent
|
||||||
import io.element.android.features.messages.timeline.model.content.TimelineItemRedactedContent
|
import io.element.android.features.messages.timeline.model.content.TimelineItemRedactedContent
|
||||||
import io.element.android.features.messages.timeline.model.content.TimelineItemTextBasedContent
|
import io.element.android.features.messages.timeline.model.content.TimelineItemTextBasedContent
|
||||||
import io.element.android.features.messages.timeline.model.content.TimelineItemTextContent
|
|
||||||
import io.element.android.features.messages.timeline.model.content.TimelineItemUnknownContent
|
import io.element.android.features.messages.timeline.model.content.TimelineItemUnknownContent
|
||||||
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.AvatarData
|
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
||||||
|
|
@ -81,9 +77,7 @@ import io.element.android.libraries.designsystem.theme.components.CircularProgre
|
||||||
import io.element.android.libraries.designsystem.theme.components.FloatingActionButton
|
import io.element.android.libraries.designsystem.theme.components.FloatingActionButton
|
||||||
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.Text
|
import io.element.android.libraries.designsystem.theme.components.Text
|
||||||
import io.element.android.libraries.matrix.core.EventId
|
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
|
||||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
|
|
@ -354,18 +348,18 @@ internal fun TimelineLoadingMoreIndicator() {
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun LoginRootScreenLightPreview(
|
fun LoginRootScreenLightPreview(
|
||||||
@PreviewParameter(MessagesTimelineItemContentProvider::class) content: TimelineItemContent
|
@PreviewParameter(TimelineItemContentProvider::class) content: TimelineItemContent
|
||||||
) = ElementPreviewLight { ContentToPreview(content) }
|
) = ElementPreviewLight { ContentToPreview(content) }
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun LoginRootScreenDarkPreview(
|
fun LoginRootScreenDarkPreview(
|
||||||
@PreviewParameter(MessagesTimelineItemContentProvider::class) content: TimelineItemContent
|
@PreviewParameter(TimelineItemContentProvider::class) content: TimelineItemContent
|
||||||
) = ElementPreviewDark { ContentToPreview(content) }
|
) = ElementPreviewDark { ContentToPreview(content) }
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun ContentToPreview(content: TimelineItemContent) {
|
private fun ContentToPreview(content: TimelineItemContent) {
|
||||||
val timelineItems = createTimelineItems(content)
|
val timelineItems = aTimelineItemList(content)
|
||||||
TimelineView(
|
TimelineView(
|
||||||
state = aTimelineState().copy(
|
state = aTimelineState().copy(
|
||||||
timelineItems = timelineItems,
|
timelineItems = timelineItems,
|
||||||
|
|
@ -373,68 +367,3 @@ private fun ContentToPreview(content: TimelineItemContent) {
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun createTimelineItems(content: TimelineItemContent): ImmutableList<TimelineItem> {
|
|
||||||
return persistentListOf(
|
|
||||||
// 3 items (First Middle Last) with isMine = false
|
|
||||||
createMessageEvent(
|
|
||||||
isMine = false,
|
|
||||||
content = content,
|
|
||||||
groupPosition = MessagesItemGroupPosition.Last
|
|
||||||
),
|
|
||||||
createMessageEvent(
|
|
||||||
isMine = false,
|
|
||||||
content = content,
|
|
||||||
groupPosition = MessagesItemGroupPosition.Middle
|
|
||||||
),
|
|
||||||
createMessageEvent(
|
|
||||||
isMine = false,
|
|
||||||
content = content,
|
|
||||||
groupPosition = MessagesItemGroupPosition.First
|
|
||||||
),
|
|
||||||
// 3 items (First Middle Last) with isMine = true
|
|
||||||
createMessageEvent(
|
|
||||||
isMine = true,
|
|
||||||
content = content,
|
|
||||||
groupPosition = MessagesItemGroupPosition.Last
|
|
||||||
),
|
|
||||||
createMessageEvent(
|
|
||||||
isMine = true,
|
|
||||||
content = content,
|
|
||||||
groupPosition = MessagesItemGroupPosition.Middle
|
|
||||||
),
|
|
||||||
createMessageEvent(
|
|
||||||
isMine = true,
|
|
||||||
content = content,
|
|
||||||
groupPosition = MessagesItemGroupPosition.First
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
internal fun createMessageEvent(
|
|
||||||
isMine: Boolean = false,
|
|
||||||
content: TimelineItemContent = createTimelineItemContent(),
|
|
||||||
groupPosition: MessagesItemGroupPosition = MessagesItemGroupPosition.First
|
|
||||||
): TimelineItem.MessageEvent {
|
|
||||||
return TimelineItem.MessageEvent(
|
|
||||||
id = EventId(Math.random().toString()),
|
|
||||||
senderId = "@senderId",
|
|
||||||
senderAvatar = AvatarData("@senderId", "sender"),
|
|
||||||
content = content,
|
|
||||||
reactionsState = TimelineItemReactions(
|
|
||||||
persistentListOf(
|
|
||||||
AggregatedReaction("👍", "1")
|
|
||||||
)
|
|
||||||
),
|
|
||||||
isMine = isMine,
|
|
||||||
senderDisplayName = "sender",
|
|
||||||
groupPosition = groupPosition,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
internal fun createTimelineItemContent(): TimelineItemContent {
|
|
||||||
return TimelineItemTextContent(
|
|
||||||
body = "Text",
|
|
||||||
htmlDocument = null
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,6 @@
|
||||||
package io.element.android.features.messages.timeline.model
|
package io.element.android.features.messages.timeline.model
|
||||||
|
|
||||||
import androidx.compose.runtime.Immutable
|
import androidx.compose.runtime.Immutable
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
sealed interface MessagesItemGroupPosition {
|
sealed interface MessagesItemGroupPosition {
|
||||||
|
|
@ -32,11 +31,3 @@ sealed interface MessagesItemGroupPosition {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class TimelineItemGroupPositionProvider : PreviewParameterProvider<MessagesItemGroupPosition> {
|
|
||||||
override val values = sequenceOf(
|
|
||||||
MessagesItemGroupPosition.First,
|
|
||||||
MessagesItemGroupPosition.Middle,
|
|
||||||
MessagesItemGroupPosition.Last,
|
|
||||||
MessagesItemGroupPosition.None,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.features.messages.timeline.model
|
||||||
|
|
||||||
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
|
|
||||||
|
internal class TimelineItemGroupPositionProvider : PreviewParameterProvider<MessagesItemGroupPosition> {
|
||||||
|
override val values = sequenceOf(
|
||||||
|
MessagesItemGroupPosition.First,
|
||||||
|
MessagesItemGroupPosition.Middle,
|
||||||
|
MessagesItemGroupPosition.Last,
|
||||||
|
MessagesItemGroupPosition.None,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
@ -16,30 +16,4 @@
|
||||||
|
|
||||||
package io.element.android.features.messages.timeline.model.content
|
package io.element.android.features.messages.timeline.model.content
|
||||||
|
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
|
||||||
import org.matrix.rustcomponents.sdk.EncryptedMessage
|
|
||||||
|
|
||||||
sealed interface TimelineItemContent
|
sealed interface TimelineItemContent
|
||||||
|
|
||||||
class MessagesTimelineItemContentProvider : PreviewParameterProvider<TimelineItemContent> {
|
|
||||||
override val values = sequenceOf(
|
|
||||||
TimelineItemEmoteContent(
|
|
||||||
body = "Emote",
|
|
||||||
htmlDocument = null
|
|
||||||
),
|
|
||||||
TimelineItemEncryptedContent(
|
|
||||||
encryptedMessage = EncryptedMessage.Unknown
|
|
||||||
),
|
|
||||||
// TODO MessagesTimelineItemImageContent(),
|
|
||||||
TimelineItemNoticeContent(
|
|
||||||
body = "Notice",
|
|
||||||
htmlDocument = null
|
|
||||||
),
|
|
||||||
TimelineItemRedactedContent,
|
|
||||||
TimelineItemTextContent(
|
|
||||||
body = "Text",
|
|
||||||
htmlDocument = null
|
|
||||||
),
|
|
||||||
TimelineItemUnknownContent,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.features.messages.timeline.model.content
|
||||||
|
|
||||||
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
|
import org.matrix.rustcomponents.sdk.EncryptedMessage
|
||||||
|
|
||||||
|
class TimelineItemContentProvider : PreviewParameterProvider<TimelineItemContent> {
|
||||||
|
override val values = sequenceOf(
|
||||||
|
TimelineItemEmoteContent(
|
||||||
|
body = "Emote",
|
||||||
|
htmlDocument = null
|
||||||
|
),
|
||||||
|
TimelineItemEncryptedContent(
|
||||||
|
encryptedMessage = EncryptedMessage.Unknown
|
||||||
|
),
|
||||||
|
// TODO MessagesTimelineItemImageContent(),
|
||||||
|
TimelineItemNoticeContent(
|
||||||
|
body = "Notice",
|
||||||
|
htmlDocument = null
|
||||||
|
),
|
||||||
|
TimelineItemRedactedContent,
|
||||||
|
TimelineItemTextContent(
|
||||||
|
body = "Text",
|
||||||
|
htmlDocument = null
|
||||||
|
),
|
||||||
|
TimelineItemUnknownContent,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
@ -17,9 +17,7 @@
|
||||||
package io.element.android.features.preferences.root
|
package io.element.android.features.preferences.root
|
||||||
|
|
||||||
import io.element.android.features.logout.LogoutPreferenceState
|
import io.element.android.features.logout.LogoutPreferenceState
|
||||||
import io.element.android.features.logout.aLogoutPreferenceState
|
|
||||||
import io.element.android.features.rageshake.preferences.RageshakePreferencesState
|
import io.element.android.features.rageshake.preferences.RageshakePreferencesState
|
||||||
import io.element.android.features.rageshake.preferences.aRageshakePreferencesState
|
|
||||||
import io.element.android.libraries.architecture.Async
|
import io.element.android.libraries.architecture.Async
|
||||||
import io.element.android.libraries.matrix.ui.model.MatrixUser
|
import io.element.android.libraries.matrix.ui.model.MatrixUser
|
||||||
|
|
||||||
|
|
@ -28,9 +26,3 @@ data class PreferencesRootState(
|
||||||
val rageshakeState: RageshakePreferencesState,
|
val rageshakeState: RageshakePreferencesState,
|
||||||
val myUser: Async<MatrixUser>,
|
val myUser: Async<MatrixUser>,
|
||||||
)
|
)
|
||||||
|
|
||||||
fun aPreferencesRootState() = PreferencesRootState(
|
|
||||||
logoutState = aLogoutPreferenceState(),
|
|
||||||
rageshakeState = aRageshakePreferencesState(),
|
|
||||||
myUser = Async.Uninitialized
|
|
||||||
)
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.features.preferences.root
|
||||||
|
|
||||||
|
import io.element.android.features.logout.aLogoutPreferenceState
|
||||||
|
import io.element.android.features.rageshake.preferences.aRageshakePreferencesState
|
||||||
|
import io.element.android.libraries.architecture.Async
|
||||||
|
|
||||||
|
fun aPreferencesRootState() = PreferencesRootState(
|
||||||
|
logoutState = aLogoutPreferenceState(),
|
||||||
|
rageshakeState = aRageshakePreferencesState(),
|
||||||
|
myUser = Async.Uninitialized
|
||||||
|
)
|
||||||
|
|
@ -28,7 +28,7 @@ import io.element.android.libraries.architecture.Async
|
||||||
import io.element.android.libraries.designsystem.components.preferences.PreferenceView
|
import io.element.android.libraries.designsystem.components.preferences.PreferenceView
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
|
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
|
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
|
||||||
import io.element.android.libraries.matrix.ui.components.MatrixUserPreviewParameterProvider
|
import io.element.android.libraries.matrix.ui.components.MatrixUserProvider
|
||||||
import io.element.android.libraries.matrix.ui.model.MatrixUser
|
import io.element.android.libraries.matrix.ui.model.MatrixUser
|
||||||
import io.element.android.libraries.ui.strings.R as StringR
|
import io.element.android.libraries.ui.strings.R as StringR
|
||||||
|
|
||||||
|
|
@ -59,12 +59,12 @@ fun PreferencesRootView(
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun PreferencesRootViewLightPreview(@PreviewParameter(MatrixUserPreviewParameterProvider::class) matrixUser: MatrixUser) =
|
fun PreferencesRootViewLightPreview(@PreviewParameter(MatrixUserProvider::class) matrixUser: MatrixUser) =
|
||||||
ElementPreviewLight { ContentToPreview(matrixUser) }
|
ElementPreviewLight { ContentToPreview(matrixUser) }
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun PreferencesRootViewDarkPreview(@PreviewParameter(MatrixUserPreviewParameterProvider::class) matrixUser: MatrixUser) =
|
fun PreferencesRootViewDarkPreview(@PreviewParameter(MatrixUserProvider::class) matrixUser: MatrixUser) =
|
||||||
ElementPreviewDark { ContentToPreview(matrixUser) }
|
ElementPreviewDark { ContentToPreview(matrixUser) }
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
|
||||||
|
|
@ -50,12 +50,3 @@ data class BugReportFormState(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun aBugReportState() = BugReportState(
|
|
||||||
formState = BugReportFormState.Default,
|
|
||||||
hasCrashLogs = false,
|
|
||||||
screenshotUri = null,
|
|
||||||
sendingProgress = 0F,
|
|
||||||
sending = Async.Uninitialized,
|
|
||||||
eventSink = {}
|
|
||||||
)
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.features.rageshake.bugreport
|
||||||
|
|
||||||
|
import io.element.android.libraries.architecture.Async
|
||||||
|
|
||||||
|
fun aBugReportState() = BugReportState(
|
||||||
|
formState = BugReportFormState.Default,
|
||||||
|
hasCrashLogs = false,
|
||||||
|
screenshotUri = null,
|
||||||
|
sendingProgress = 0F,
|
||||||
|
sending = Async.Uninitialized,
|
||||||
|
eventSink = {}
|
||||||
|
)
|
||||||
|
|
@ -20,8 +20,3 @@ data class CrashDetectionState(
|
||||||
val crashDetected: Boolean,
|
val crashDetected: Boolean,
|
||||||
val eventSink: (CrashDetectionEvents) -> Unit
|
val eventSink: (CrashDetectionEvents) -> Unit
|
||||||
)
|
)
|
||||||
|
|
||||||
fun aCrashDetectionState() = CrashDetectionState(
|
|
||||||
crashDetected = false,
|
|
||||||
eventSink = {}
|
|
||||||
)
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.features.rageshake.crash.ui
|
||||||
|
|
||||||
|
fun aCrashDetectionState() = CrashDetectionState(
|
||||||
|
crashDetected = false,
|
||||||
|
eventSink = {}
|
||||||
|
)
|
||||||
|
|
@ -18,7 +18,6 @@ package io.element.android.features.rageshake.detection
|
||||||
|
|
||||||
import androidx.compose.runtime.Stable
|
import androidx.compose.runtime.Stable
|
||||||
import io.element.android.features.rageshake.preferences.RageshakePreferencesState
|
import io.element.android.features.rageshake.preferences.RageshakePreferencesState
|
||||||
import io.element.android.features.rageshake.preferences.aRageshakePreferencesState
|
|
||||||
|
|
||||||
@Stable
|
@Stable
|
||||||
data class RageshakeDetectionState(
|
data class RageshakeDetectionState(
|
||||||
|
|
@ -28,11 +27,3 @@ data class RageshakeDetectionState(
|
||||||
val preferenceState: RageshakePreferencesState,
|
val preferenceState: RageshakePreferencesState,
|
||||||
val eventSink: (RageshakeDetectionEvents) -> Unit
|
val eventSink: (RageshakeDetectionEvents) -> Unit
|
||||||
)
|
)
|
||||||
|
|
||||||
fun aRageshakeDetectionState() = RageshakeDetectionState(
|
|
||||||
takeScreenshot = false,
|
|
||||||
showDialog = false,
|
|
||||||
isStarted = false,
|
|
||||||
preferenceState = aRageshakePreferencesState(),
|
|
||||||
eventSink = {}
|
|
||||||
)
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.features.rageshake.detection
|
||||||
|
|
||||||
|
import io.element.android.features.rageshake.preferences.aRageshakePreferencesState
|
||||||
|
|
||||||
|
fun aRageshakeDetectionState() = RageshakeDetectionState(
|
||||||
|
takeScreenshot = false,
|
||||||
|
showDialog = false,
|
||||||
|
isStarted = false,
|
||||||
|
preferenceState = aRageshakePreferencesState(),
|
||||||
|
eventSink = {}
|
||||||
|
)
|
||||||
|
|
@ -22,10 +22,3 @@ data class RageshakePreferencesState(
|
||||||
val sensitivity: Float,
|
val sensitivity: Float,
|
||||||
val eventSink: (RageshakePreferencesEvents) -> Unit,
|
val eventSink: (RageshakePreferencesEvents) -> Unit,
|
||||||
)
|
)
|
||||||
|
|
||||||
fun aRageshakePreferencesState() = RageshakePreferencesState(
|
|
||||||
isEnabled = false,
|
|
||||||
isSupported = true,
|
|
||||||
sensitivity = 0.3f,
|
|
||||||
eventSink = {}
|
|
||||||
)
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.features.rageshake.preferences
|
||||||
|
|
||||||
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
|
|
||||||
|
open class RageshakePreferencesStateProvider : PreviewParameterProvider<RageshakePreferencesState> {
|
||||||
|
override val values: Sequence<RageshakePreferencesState>
|
||||||
|
get() = sequenceOf(
|
||||||
|
aRageshakePreferencesState().copy(isEnabled = true, isSupported = true, sensitivity = 0.5f),
|
||||||
|
aRageshakePreferencesState().copy(isEnabled = true, isSupported = false, sensitivity = 0.5f),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun aRageshakePreferencesState() = RageshakePreferencesState(
|
||||||
|
isEnabled = false,
|
||||||
|
isSupported = true,
|
||||||
|
sensitivity = 0.3f,
|
||||||
|
eventSink = {}
|
||||||
|
)
|
||||||
|
|
@ -24,7 +24,6 @@ import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
|
||||||
import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory
|
import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory
|
||||||
import io.element.android.libraries.designsystem.components.preferences.PreferenceSlide
|
import io.element.android.libraries.designsystem.components.preferences.PreferenceSlide
|
||||||
import io.element.android.libraries.designsystem.components.preferences.PreferenceSwitch
|
import io.element.android.libraries.designsystem.components.preferences.PreferenceSwitch
|
||||||
|
|
@ -77,22 +76,14 @@ fun RageshakePreferencesView(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open class RageshakePreferencesStatePreviewParameterProvider : PreviewParameterProvider<RageshakePreferencesState> {
|
|
||||||
override val values: Sequence<RageshakePreferencesState>
|
|
||||||
get() = sequenceOf(
|
|
||||||
aRageshakePreferencesState().copy(isEnabled = true, isSupported = true, sensitivity = 0.5f),
|
|
||||||
aRageshakePreferencesState().copy(isEnabled = true, isSupported = false, sensitivity = 0.5f),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun RageshakePreferencesViewLightPreview(@PreviewParameter(RageshakePreferencesStatePreviewParameterProvider::class) state: RageshakePreferencesState) =
|
fun RageshakePreferencesViewLightPreview(@PreviewParameter(RageshakePreferencesStateProvider::class) state: RageshakePreferencesState) =
|
||||||
ElementPreviewLight { ContentToPreview(state) }
|
ElementPreviewLight { ContentToPreview(state) }
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun RageshakePreferencesViewDarkPreview(@PreviewParameter(RageshakePreferencesStatePreviewParameterProvider::class) state: RageshakePreferencesState) =
|
fun RageshakePreferencesViewDarkPreview(@PreviewParameter(RageshakePreferencesStateProvider::class) state: RageshakePreferencesState) =
|
||||||
ElementPreviewDark { ContentToPreview(state) }
|
ElementPreviewDark { ContentToPreview(state) }
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@ package io.element.android.features.roomlist.model
|
||||||
import androidx.compose.runtime.Immutable
|
import androidx.compose.runtime.Immutable
|
||||||
import io.element.android.libraries.matrix.ui.model.MatrixUser
|
import io.element.android.libraries.matrix.ui.model.MatrixUser
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
data class RoomListState(
|
data class RoomListState(
|
||||||
|
|
@ -28,10 +27,3 @@ data class RoomListState(
|
||||||
val filter: String,
|
val filter: String,
|
||||||
val eventSink: (RoomListEvents) -> Unit
|
val eventSink: (RoomListEvents) -> Unit
|
||||||
)
|
)
|
||||||
|
|
||||||
fun aRoomListState() = RoomListState(
|
|
||||||
matrixUser = null,
|
|
||||||
roomList = persistentListOf(),
|
|
||||||
filter = "",
|
|
||||||
eventSink = {}
|
|
||||||
)
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.features.roomlist.model
|
||||||
|
|
||||||
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
|
|
||||||
|
fun aRoomListState() = RoomListState(
|
||||||
|
matrixUser = null,
|
||||||
|
roomList = persistentListOf(),
|
||||||
|
filter = "",
|
||||||
|
eventSink = {}
|
||||||
|
)
|
||||||
|
|
@ -21,7 +21,3 @@ package io.element.android.features.template
|
||||||
data class TemplateState(
|
data class TemplateState(
|
||||||
val eventSink: (TemplateEvents) -> Unit
|
val eventSink: (TemplateEvents) -> Unit
|
||||||
)
|
)
|
||||||
|
|
||||||
fun aTemplateState() = TemplateState(
|
|
||||||
eventSink = {}
|
|
||||||
)
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.features.template
|
||||||
|
|
||||||
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
|
|
||||||
|
open class TemplateStateProvider : PreviewParameterProvider<TemplateState> {
|
||||||
|
override val values: Sequence<TemplateState>
|
||||||
|
get() = sequenceOf(
|
||||||
|
aTemplateState(),
|
||||||
|
// Add other state here
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun aTemplateState() = TemplateState(
|
||||||
|
eventSink = {}
|
||||||
|
)
|
||||||
|
|
@ -23,7 +23,6 @@ import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
|
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
|
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
|
||||||
import io.element.android.libraries.designsystem.theme.components.Text
|
import io.element.android.libraries.designsystem.theme.components.Text
|
||||||
|
|
@ -41,22 +40,14 @@ fun TemplateView(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open class TemplateStatePreviewParameter : PreviewParameterProvider<TemplateState> {
|
|
||||||
override val values: Sequence<TemplateState>
|
|
||||||
get() = sequenceOf(
|
|
||||||
aTemplateState(),
|
|
||||||
// Add other state here
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun TemplateViewLightPreview(@PreviewParameter(TemplateStatePreviewParameter::class) state: TemplateState) =
|
fun TemplateViewLightPreview(@PreviewParameter(TemplateStateProvider::class) state: TemplateState) =
|
||||||
ElementPreviewLight { ContentToPreview(state) }
|
ElementPreviewLight { ContentToPreview(state) }
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun TemplateViewDarkPreview(@PreviewParameter(TemplateStatePreviewParameter::class) state: TemplateState) =
|
fun TemplateViewDarkPreview(@PreviewParameter(TemplateStateProvider::class) state: TemplateState) =
|
||||||
ElementPreviewDark { ContentToPreview(state) }
|
ElementPreviewDark { ContentToPreview(state) }
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
|
||||||
|
|
@ -100,12 +100,12 @@ private fun InitialsAvatar(
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun AvatarLightPreview(@PreviewParameter(AvatarDataPreviewParameterProvider::class) avatarData: AvatarData) =
|
fun AvatarLightPreview(@PreviewParameter(AvatarDataProvider::class) avatarData: AvatarData) =
|
||||||
ElementPreviewLight { ContentToPreview(avatarData) }
|
ElementPreviewLight { ContentToPreview(avatarData) }
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun AvatarDarkPreview(@PreviewParameter(AvatarDataPreviewParameterProvider::class) avatarData: AvatarData) =
|
fun AvatarDarkPreview(@PreviewParameter(AvatarDataProvider::class) avatarData: AvatarData) =
|
||||||
ElementPreviewDark { ContentToPreview(avatarData) }
|
ElementPreviewDark { ContentToPreview(avatarData) }
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,6 @@
|
||||||
package io.element.android.libraries.designsystem.components.avatar
|
package io.element.android.libraries.designsystem.components.avatar
|
||||||
|
|
||||||
import androidx.compose.runtime.Immutable
|
import androidx.compose.runtime.Immutable
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
data class AvatarData(
|
data class AvatarData(
|
||||||
|
|
@ -31,17 +30,3 @@ data class AvatarData(
|
||||||
return firstChar.uppercase()
|
return firstChar.uppercase()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open class AvatarDataPreviewParameterProvider : PreviewParameterProvider<AvatarData> {
|
|
||||||
override val values: Sequence<AvatarData>
|
|
||||||
get() = sequenceOf(
|
|
||||||
anAvatarData(),
|
|
||||||
anAvatarData().copy(name = null),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun anAvatarData() = AvatarData(
|
|
||||||
// Let's the id not start with a 'a'.
|
|
||||||
id = "@id_of_alice:server.org",
|
|
||||||
name = "Alice",
|
|
||||||
)
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.libraries.designsystem.components.avatar
|
||||||
|
|
||||||
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
|
|
||||||
|
open class AvatarDataProvider : PreviewParameterProvider<AvatarData> {
|
||||||
|
override val values: Sequence<AvatarData>
|
||||||
|
get() = sequenceOf(
|
||||||
|
anAvatarData(),
|
||||||
|
anAvatarData().copy(name = null),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun anAvatarData() = AvatarData(
|
||||||
|
// Let's the id not start with a 'a'.
|
||||||
|
id = "@id_of_alice:server.org",
|
||||||
|
name = "Alice",
|
||||||
|
)
|
||||||
|
|
@ -18,7 +18,7 @@ package io.element.android.libraries.designsystem.utils
|
||||||
|
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
|
|
||||||
open class BooleanPreviewParameterProvider : PreviewParameterProvider<Boolean> {
|
open class BooleanProvider : PreviewParameterProvider<Boolean> {
|
||||||
override val values: Sequence<Boolean>
|
override val values: Sequence<Boolean>
|
||||||
get() = sequenceOf(false, true)
|
get() = sequenceOf(false, true)
|
||||||
}
|
}
|
||||||
|
|
@ -18,7 +18,7 @@ package io.element.android.libraries.designsystem.utils
|
||||||
|
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
|
|
||||||
open class PairCombinedPreviewParameterProvider<T1, T2>(
|
open class PairCombinedProvider<T1, T2>(
|
||||||
private val provider: Pair<PreviewParameterProvider<T1>, PreviewParameterProvider<T2>>
|
private val provider: Pair<PreviewParameterProvider<T1>, PreviewParameterProvider<T2>>
|
||||||
) : PreviewParameterProvider<Pair<T1, T2>> {
|
) : PreviewParameterProvider<Pair<T1, T2>> {
|
||||||
override val values: Sequence<Pair<T1, T2>>
|
override val values: Sequence<Pair<T1, T2>>
|
||||||
|
|
@ -18,7 +18,7 @@ package io.element.android.libraries.designsystem.utils
|
||||||
|
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
|
|
||||||
open class StringPreviewParameterProvider(val strings: List<String>) : PreviewParameterProvider<String> {
|
open class StringProvider(val strings: List<String>) : PreviewParameterProvider<String> {
|
||||||
override val values: Sequence<String>
|
override val values: Sequence<String>
|
||||||
get() = strings.asSequence()
|
get() = strings.asSequence()
|
||||||
}
|
}
|
||||||
|
|
@ -84,12 +84,12 @@ fun MatrixUserHeader(
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun MatrixUserHeaderLightPreview(@PreviewParameter(MatrixUserPreviewParameterProvider::class) matrixUser: MatrixUser) =
|
fun MatrixUserHeaderLightPreview(@PreviewParameter(MatrixUserProvider::class) matrixUser: MatrixUser) =
|
||||||
ElementPreviewLight { ContentToPreview(matrixUser) }
|
ElementPreviewLight { ContentToPreview(matrixUser) }
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun MatrixUserHeaderDarkPreview(@PreviewParameter(MatrixUserPreviewParameterProvider::class) matrixUser: MatrixUser) =
|
fun MatrixUserHeaderDarkPreview(@PreviewParameter(MatrixUserProvider::class) matrixUser: MatrixUser) =
|
||||||
ElementPreviewDark { ContentToPreview(matrixUser) }
|
ElementPreviewDark { ContentToPreview(matrixUser) }
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ import io.element.android.libraries.designsystem.components.avatar.anAvatarData
|
||||||
import io.element.android.libraries.matrix.core.UserId
|
import io.element.android.libraries.matrix.core.UserId
|
||||||
import io.element.android.libraries.matrix.ui.model.MatrixUser
|
import io.element.android.libraries.matrix.ui.model.MatrixUser
|
||||||
|
|
||||||
open class MatrixUserPreviewParameterProvider : PreviewParameterProvider<MatrixUser> {
|
open class MatrixUserProvider : PreviewParameterProvider<MatrixUser> {
|
||||||
override val values: Sequence<MatrixUser>
|
override val values: Sequence<MatrixUser>
|
||||||
get() = sequenceOf(
|
get() = sequenceOf(
|
||||||
aMatrixUser(),
|
aMatrixUser(),
|
||||||
|
|
@ -89,12 +89,12 @@ fun MatrixUserRow(
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun MatrixUserRowLightPreview(@PreviewParameter(MatrixUserPreviewParameterProvider::class) matrixUser: MatrixUser) =
|
fun MatrixUserRowLightPreview(@PreviewParameter(MatrixUserProvider::class) matrixUser: MatrixUser) =
|
||||||
ElementPreviewLight { ContentToPreview(matrixUser) }
|
ElementPreviewLight { ContentToPreview(matrixUser) }
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun MatrixUserRowDarkPreview(@PreviewParameter(MatrixUserPreviewParameterProvider::class) matrixUser: MatrixUser) =
|
fun MatrixUserRowDarkPreview(@PreviewParameter(MatrixUserProvider::class) matrixUser: MatrixUser) =
|
||||||
ElementPreviewDark { ContentToPreview(matrixUser) }
|
ElementPreviewDark { ContentToPreview(matrixUser) }
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue