LinkEvents -> LinkEvent
This commit is contained in:
parent
92a77fab18
commit
c96f6036a3
9 changed files with 29 additions and 29 deletions
|
|
@ -57,7 +57,7 @@ import io.element.android.features.messages.impl.actionlist.ActionListView
|
||||||
import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction
|
import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction
|
||||||
import io.element.android.features.messages.impl.crypto.historyvisible.HistoryVisibleStateView
|
import io.element.android.features.messages.impl.crypto.historyvisible.HistoryVisibleStateView
|
||||||
import io.element.android.features.messages.impl.crypto.identity.IdentityChangeStateView
|
import io.element.android.features.messages.impl.crypto.identity.IdentityChangeStateView
|
||||||
import io.element.android.features.messages.impl.link.LinkEvents
|
import io.element.android.features.messages.impl.link.LinkEvent
|
||||||
import io.element.android.features.messages.impl.link.LinkView
|
import io.element.android.features.messages.impl.link.LinkView
|
||||||
import io.element.android.features.messages.impl.messagecomposer.AttachmentsBottomSheet
|
import io.element.android.features.messages.impl.messagecomposer.AttachmentsBottomSheet
|
||||||
import io.element.android.features.messages.impl.messagecomposer.DisabledComposerView
|
import io.element.android.features.messages.impl.messagecomposer.DisabledComposerView
|
||||||
|
|
@ -252,7 +252,7 @@ fun MessagesView(
|
||||||
onLinkClick(link.url, true)
|
onLinkClick(link.url, true)
|
||||||
// Do not check those links, they are internal link only
|
// Do not check those links, they are internal link only
|
||||||
} else {
|
} else {
|
||||||
state.linkState.eventSink(LinkEvents.OnLinkClick(link))
|
state.linkState.eventSink(LinkEvent.OnLinkClick(link))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onReactionClick = ::onEmojiReactionClick,
|
onReactionClick = ::onEmojiReactionClick,
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,8 @@ package io.element.android.features.messages.impl.link
|
||||||
|
|
||||||
import io.element.android.wysiwyg.link.Link
|
import io.element.android.wysiwyg.link.Link
|
||||||
|
|
||||||
sealed interface LinkEvents {
|
sealed interface LinkEvent {
|
||||||
data class OnLinkClick(val link: Link) : LinkEvents
|
data class OnLinkClick(val link: Link) : LinkEvent
|
||||||
data object Confirm : LinkEvents
|
data object Confirm : LinkEvent
|
||||||
data object Cancel : LinkEvents
|
data object Cancel : LinkEvent
|
||||||
}
|
}
|
||||||
|
|
@ -25,9 +25,9 @@ class LinkPresenter(
|
||||||
override fun present(): LinkState {
|
override fun present(): LinkState {
|
||||||
val linkClick: MutableState<AsyncAction<Link>> = remember { mutableStateOf(AsyncAction.Uninitialized) }
|
val linkClick: MutableState<AsyncAction<Link>> = remember { mutableStateOf(AsyncAction.Uninitialized) }
|
||||||
|
|
||||||
fun handleEvent(event: LinkEvents) {
|
fun handleEvent(event: LinkEvent) {
|
||||||
when (event) {
|
when (event) {
|
||||||
is LinkEvents.OnLinkClick -> {
|
is LinkEvent.OnLinkClick -> {
|
||||||
linkClick.value = AsyncAction.Loading
|
linkClick.value = AsyncAction.Loading
|
||||||
val result = linkChecker.isSafe(event.link)
|
val result = linkChecker.isSafe(event.link)
|
||||||
if (result) {
|
if (result) {
|
||||||
|
|
@ -37,12 +37,12 @@ class LinkPresenter(
|
||||||
linkClick.value = ConfirmingLinkClick(event.link)
|
linkClick.value = ConfirmingLinkClick(event.link)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LinkEvents.Confirm -> {
|
LinkEvent.Confirm -> {
|
||||||
linkClick.value = (linkClick.value as? ConfirmingLinkClick)
|
linkClick.value = (linkClick.value as? ConfirmingLinkClick)
|
||||||
?.let { AsyncAction.Success(it.link) }
|
?.let { AsyncAction.Success(it.link) }
|
||||||
?: AsyncAction.Uninitialized
|
?: AsyncAction.Uninitialized
|
||||||
}
|
}
|
||||||
LinkEvents.Cancel -> {
|
LinkEvent.Cancel -> {
|
||||||
linkClick.value = AsyncAction.Uninitialized
|
linkClick.value = AsyncAction.Uninitialized
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,5 +13,5 @@ import io.element.android.wysiwyg.link.Link
|
||||||
|
|
||||||
data class LinkState(
|
data class LinkState(
|
||||||
val linkClick: AsyncAction<Link>,
|
val linkClick: AsyncAction<Link>,
|
||||||
val eventSink: (LinkEvents) -> Unit,
|
val eventSink: (LinkEvent) -> Unit,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ open class LinkStateProvider : PreviewParameterProvider<LinkState> {
|
||||||
|
|
||||||
fun aLinkState(
|
fun aLinkState(
|
||||||
linkClick: AsyncAction<Link> = AsyncAction.Uninitialized,
|
linkClick: AsyncAction<Link> = AsyncAction.Uninitialized,
|
||||||
eventSink: (LinkEvents) -> Unit = {},
|
eventSink: (LinkEvent) -> Unit = {},
|
||||||
) = LinkState(
|
) = LinkState(
|
||||||
linkClick = linkClick,
|
linkClick = linkClick,
|
||||||
eventSink = eventSink,
|
eventSink = eventSink,
|
||||||
|
|
|
||||||
|
|
@ -46,10 +46,10 @@ fun LinkView(
|
||||||
),
|
),
|
||||||
submitText = stringResource(CommonStrings.action_continue),
|
submitText = stringResource(CommonStrings.action_continue),
|
||||||
onSubmitClick = {
|
onSubmitClick = {
|
||||||
state.eventSink(LinkEvents.Confirm)
|
state.eventSink(LinkEvent.Confirm)
|
||||||
},
|
},
|
||||||
onDismiss = {
|
onDismiss = {
|
||||||
state.eventSink(LinkEvents.Cancel)
|
state.eventSink(LinkEvent.Cancel)
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -58,7 +58,7 @@ fun LinkView(
|
||||||
val latestOnLinkValid by rememberUpdatedState(onLinkValid)
|
val latestOnLinkValid by rememberUpdatedState(onLinkValid)
|
||||||
LaunchedEffect(state.linkClick.data) {
|
LaunchedEffect(state.linkClick.data) {
|
||||||
latestOnLinkValid(state.linkClick.data)
|
latestOnLinkValid(state.linkClick.data)
|
||||||
state.eventSink(LinkEvents.Cancel)
|
state.eventSink(LinkEvent.Cancel)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ import io.element.android.compound.tokens.generated.CompoundIcons
|
||||||
import io.element.android.features.messages.impl.actionlist.ActionListEvent
|
import io.element.android.features.messages.impl.actionlist.ActionListEvent
|
||||||
import io.element.android.features.messages.impl.actionlist.ActionListView
|
import io.element.android.features.messages.impl.actionlist.ActionListView
|
||||||
import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction
|
import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction
|
||||||
import io.element.android.features.messages.impl.link.LinkEvents
|
import io.element.android.features.messages.impl.link.LinkEvent
|
||||||
import io.element.android.features.messages.impl.link.LinkView
|
import io.element.android.features.messages.impl.link.LinkView
|
||||||
import io.element.android.features.messages.impl.timeline.components.TimelineItemRow
|
import io.element.android.features.messages.impl.timeline.components.TimelineItemRow
|
||||||
import io.element.android.features.messages.impl.timeline.components.event.TimelineItemEventContentView
|
import io.element.android.features.messages.impl.timeline.components.event.TimelineItemEventContentView
|
||||||
|
|
@ -222,7 +222,7 @@ private fun PinnedMessagesListLoaded(
|
||||||
focusedEventId = null,
|
focusedEventId = null,
|
||||||
onUserDataClick = onUserDataClick,
|
onUserDataClick = onUserDataClick,
|
||||||
onLinkClick = { link ->
|
onLinkClick = { link ->
|
||||||
state.linkState.eventSink(LinkEvents.OnLinkClick(link))
|
state.linkState.eventSink(LinkEvent.OnLinkClick(link))
|
||||||
},
|
},
|
||||||
onLinkLongClick = onLinkLongClick,
|
onLinkLongClick = onLinkLongClick,
|
||||||
onContentClick = onEventClick,
|
onContentClick = onEventClick,
|
||||||
|
|
@ -243,7 +243,7 @@ private fun PinnedMessagesListLoaded(
|
||||||
onContentClick = { onEventClick(event) },
|
onContentClick = { onEventClick(event) },
|
||||||
onLongClick = { onMessageLongClick(event) },
|
onLongClick = { onMessageLongClick(event) },
|
||||||
onLinkClick = { link ->
|
onLinkClick = { link ->
|
||||||
state.linkState.eventSink(LinkEvents.OnLinkClick(link))
|
state.linkState.eventSink(LinkEvent.OnLinkClick(link))
|
||||||
},
|
},
|
||||||
onLinkLongClick = onLinkLongClick,
|
onLinkLongClick = onLinkLongClick,
|
||||||
modifier = contentModifier,
|
modifier = contentModifier,
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ class LinkPresenterTest {
|
||||||
presenter.test {
|
presenter.test {
|
||||||
val initialState = awaitItem()
|
val initialState = awaitItem()
|
||||||
assertThat(initialState.linkClick).isEqualTo(AsyncAction.Uninitialized)
|
assertThat(initialState.linkClick).isEqualTo(AsyncAction.Uninitialized)
|
||||||
initialState.eventSink(LinkEvents.OnLinkClick(aLink))
|
initialState.eventSink(LinkEvent.OnLinkClick(aLink))
|
||||||
assertThat(awaitItem().linkClick).isEqualTo(AsyncAction.Loading)
|
assertThat(awaitItem().linkClick).isEqualTo(AsyncAction.Loading)
|
||||||
val state = awaitItem()
|
val state = awaitItem()
|
||||||
assertThat(state.linkClick).isEqualTo(AsyncAction.Success(aLink))
|
assertThat(state.linkClick).isEqualTo(AsyncAction.Success(aLink))
|
||||||
|
|
@ -61,11 +61,11 @@ class LinkPresenterTest {
|
||||||
presenter.test {
|
presenter.test {
|
||||||
val initialState = awaitItem()
|
val initialState = awaitItem()
|
||||||
assertThat(initialState.linkClick).isEqualTo(AsyncAction.Uninitialized)
|
assertThat(initialState.linkClick).isEqualTo(AsyncAction.Uninitialized)
|
||||||
initialState.eventSink(LinkEvents.OnLinkClick(aLink))
|
initialState.eventSink(LinkEvent.OnLinkClick(aLink))
|
||||||
assertThat(awaitItem().linkClick).isEqualTo(AsyncAction.Loading)
|
assertThat(awaitItem().linkClick).isEqualTo(AsyncAction.Loading)
|
||||||
val state = awaitItem()
|
val state = awaitItem()
|
||||||
assertThat(state.linkClick).isEqualTo(ConfirmingLinkClick(aLink))
|
assertThat(state.linkClick).isEqualTo(ConfirmingLinkClick(aLink))
|
||||||
state.eventSink(LinkEvents.Cancel)
|
state.eventSink(LinkEvent.Cancel)
|
||||||
val finalState = awaitItem()
|
val finalState = awaitItem()
|
||||||
assertThat(finalState.linkClick).isEqualTo(AsyncAction.Uninitialized)
|
assertThat(finalState.linkClick).isEqualTo(AsyncAction.Uninitialized)
|
||||||
}
|
}
|
||||||
|
|
@ -79,11 +79,11 @@ class LinkPresenterTest {
|
||||||
presenter.test {
|
presenter.test {
|
||||||
val initialState = awaitItem()
|
val initialState = awaitItem()
|
||||||
assertThat(initialState.linkClick).isEqualTo(AsyncAction.Uninitialized)
|
assertThat(initialState.linkClick).isEqualTo(AsyncAction.Uninitialized)
|
||||||
initialState.eventSink(LinkEvents.OnLinkClick(aLink))
|
initialState.eventSink(LinkEvent.OnLinkClick(aLink))
|
||||||
assertThat(awaitItem().linkClick).isEqualTo(AsyncAction.Loading)
|
assertThat(awaitItem().linkClick).isEqualTo(AsyncAction.Loading)
|
||||||
val state = awaitItem()
|
val state = awaitItem()
|
||||||
assertThat(state.linkClick).isEqualTo(ConfirmingLinkClick(aLink))
|
assertThat(state.linkClick).isEqualTo(ConfirmingLinkClick(aLink))
|
||||||
state.eventSink(LinkEvents.Confirm)
|
state.eventSink(LinkEvent.Confirm)
|
||||||
val finalState = awaitItem()
|
val finalState = awaitItem()
|
||||||
assertThat(finalState.linkClick).isEqualTo(AsyncAction.Success(aLink))
|
assertThat(finalState.linkClick).isEqualTo(AsyncAction.Success(aLink))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ class LinkViewTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `clicking on cancel emits the expected event`() {
|
fun `clicking on cancel emits the expected event`() {
|
||||||
val eventsRecorder = EventsRecorder<LinkEvents>()
|
val eventsRecorder = EventsRecorder<LinkEvent>()
|
||||||
rule.setLinkView(
|
rule.setLinkView(
|
||||||
aLinkState(
|
aLinkState(
|
||||||
linkClick = ConfirmingLinkClick(aLink),
|
linkClick = ConfirmingLinkClick(aLink),
|
||||||
|
|
@ -40,13 +40,13 @@ class LinkViewTest {
|
||||||
)
|
)
|
||||||
rule.clickOn(CommonStrings.action_cancel)
|
rule.clickOn(CommonStrings.action_cancel)
|
||||||
eventsRecorder.assertSingle(
|
eventsRecorder.assertSingle(
|
||||||
LinkEvents.Cancel
|
LinkEvent.Cancel
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `clicking on continue emits the expected event`() {
|
fun `clicking on continue emits the expected event`() {
|
||||||
val eventsRecorder = EventsRecorder<LinkEvents>()
|
val eventsRecorder = EventsRecorder<LinkEvent>()
|
||||||
rule.setLinkView(
|
rule.setLinkView(
|
||||||
aLinkState(
|
aLinkState(
|
||||||
linkClick = ConfirmingLinkClick(aLink),
|
linkClick = ConfirmingLinkClick(aLink),
|
||||||
|
|
@ -55,13 +55,13 @@ class LinkViewTest {
|
||||||
)
|
)
|
||||||
rule.clickOn(CommonStrings.action_continue)
|
rule.clickOn(CommonStrings.action_continue)
|
||||||
eventsRecorder.assertSingle(
|
eventsRecorder.assertSingle(
|
||||||
LinkEvents.Confirm
|
LinkEvent.Confirm
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `success state invokes the callback and emits the expected event`() {
|
fun `success state invokes the callback and emits the expected event`() {
|
||||||
val eventsRecorder = EventsRecorder<LinkEvents>()
|
val eventsRecorder = EventsRecorder<LinkEvent>()
|
||||||
ensureCalledOnceWithParam(aLink) { callback ->
|
ensureCalledOnceWithParam(aLink) { callback ->
|
||||||
rule.setLinkView(
|
rule.setLinkView(
|
||||||
aLinkState(
|
aLinkState(
|
||||||
|
|
@ -72,7 +72,7 @@ class LinkViewTest {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
eventsRecorder.assertSingle(
|
eventsRecorder.assertSingle(
|
||||||
LinkEvents.Cancel
|
LinkEvent.Cancel
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue