Skip to content

Commit

Permalink
Merge pull request #13466 from woocommerce/issue/13454-pos-public-fac…
Browse files Browse the repository at this point in the history
…ing-documentation

[Woo POS] Add public-facing documentation link to POS popup menu
  • Loading branch information
AnirudhBhat authored Feb 11, 2025
2 parents db73dcc + 88ee6c8 commit b483dbb
Show file tree
Hide file tree
Showing 6 changed files with 72 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -135,4 +135,8 @@ object AppUrls {

const val BLAZE_CAMPAIGN_CREATION_SURVEY_URL_I1 =
"https://wordpressdotcom.survey.fm/blaze-on-woo-mobile-survey-sept-2024-i1"

// POS
const val WOO_POS_DOCUMENTATION_URL =
"https://woocommerce.com/document/woo-mobile-app-point-of-sale-mode/"
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.IntrinsicSize
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
Expand All @@ -25,6 +26,7 @@ import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.material.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.State
import androidx.compose.runtime.collectAsState
Expand All @@ -35,6 +37,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.semantics.contentDescription
Expand All @@ -54,12 +57,20 @@ import com.woocommerce.android.ui.woopos.common.composeui.component.WooPosBackgr
import com.woocommerce.android.ui.woopos.common.composeui.toAdaptivePadding
import com.woocommerce.android.ui.woopos.home.toolbar.WooPosToolbarState.Menu
import com.woocommerce.android.ui.woopos.home.toolbar.WooPosToolbarState.WooPosCardReaderStatus
import com.woocommerce.android.util.ChromeCustomTabUtils
import kotlinx.coroutines.flow.collectLatest

private val TOOLBAR_ELEVATION = 6.dp

@Composable
fun WooPosFloatingToolbar(modifier: Modifier = Modifier) {
val viewModel: WooPosToolbarViewModel = hiltViewModel()
val context = LocalContext.current
LaunchedEffect(Unit) {
viewModel.openUrlEvent.collectLatest { url ->
ChromeCustomTabUtils.launchUrl(context, url)
}
}
WooPosFloatingToolbar(
modifier = modifier,
state = viewModel.state.collectAsState(),
Expand Down Expand Up @@ -239,7 +250,7 @@ private fun PopUpMenu(
onClick: (Menu.MenuItem) -> Unit
) {
WooPosCard(
modifier = modifier.width(214.dp),
modifier = modifier.width(IntrinsicSize.Max),
elevation = TOOLBAR_ELEVATION,
) {
Column {
Expand Down Expand Up @@ -479,14 +490,18 @@ fun PreviewWooPosFloatingToolbarStatusConnectedWithMenu() {
cardReaderStatus = WooPosCardReaderStatus.Connected,
menu = Menu.Visible(
listOf(
Menu.MenuItem(
title = R.string.woopos_documentation_title,
icon = R.drawable.woo_pos_info_ic
),
Menu.MenuItem(
title = R.string.woopos_exit_confirmation_title,
icon = R.drawable.ic_woo_pos_exit,
),
Menu.MenuItem(
title = R.string.woopos_get_support_title,
icon = R.drawable.woopos_ic_get_support,
)
),
)
),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.woocommerce.android.ui.woopos.home.toolbar

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.woocommerce.android.AppUrls.WOO_POS_DOCUMENTATION_URL
import com.woocommerce.android.R
import com.woocommerce.android.cardreader.connection.CardReaderStatus
import com.woocommerce.android.cardreader.connection.CardReaderStatus.Connected
Expand All @@ -18,8 +19,11 @@ import com.woocommerce.android.ui.woopos.support.WooPosGetSupportFacade
import com.woocommerce.android.ui.woopos.util.WooPosNetworkStatus
import com.woocommerce.android.viewmodel.ResourceProvider
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.launch
import javax.inject.Inject

Expand All @@ -39,6 +43,9 @@ class WooPosToolbarViewModel @Inject constructor(
)
val state: StateFlow<WooPosToolbarState> = _state

private val _openUrlEvent = MutableSharedFlow<String>()
val openUrlEvent: SharedFlow<String> = _openUrlEvent.asSharedFlow()

init {
viewModelScope.launch {
cardReaderFacade.readerStatus.collect {
Expand Down Expand Up @@ -82,6 +89,11 @@ class WooPosToolbarViewModel @Inject constructor(
viewModelScope.launch {
childrenToParentEventSender.sendToParent(ChildToParentEvent.ExitPosClicked)
}
R.string.woopos_documentation_title -> {
viewModelScope.launch {
_openUrlEvent.emit(WOO_POS_DOCUMENTATION_URL)
}
}
}
}

Expand Down Expand Up @@ -121,6 +133,10 @@ class WooPosToolbarViewModel @Inject constructor(

private companion object {
val toolbarMenuItems = listOf(
WooPosToolbarState.Menu.MenuItem(
title = R.string.woopos_documentation_title,
icon = R.drawable.woo_pos_info_ic,
),
WooPosToolbarState.Menu.MenuItem(
title = R.string.woopos_get_support_title,
icon = R.drawable.woopos_ic_get_support,
Expand Down
5 changes: 5 additions & 0 deletions WooCommerce/src/main/res/drawable/woo_pos_info_ic.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">

<path android:fillColor="@android:color/white" android:pathData="M11,7h2v2h-2V7zM11,11h2v6h-2V11zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8s8,3.59 8,8S16.41,20 12,20z"/>

</vector>
1 change: 1 addition & 0 deletions WooCommerce/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4295,6 +4295,7 @@

<string name="woopos_exit_confirmation_title">Exit POS</string>
<string name="woopos_get_support_title">Get Support</string>
<string name="woopos_documentation_title">View Documentation</string>
<string name="woopos_exit_dialog_confirmation_close_content_description">Close</string>
<string name="woopos_exit_dialog_confirmation_title">Exit Point of Sale mode?</string>
<string name="woopos_exit_dialog_confirmation_message">Any orders in progress will be lost.</string>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.woocommerce.android.ui.woopos.home.toolbar

import app.cash.turbine.test
import com.woocommerce.android.AppUrls.WOO_POS_DOCUMENTATION_URL
import com.woocommerce.android.R
import com.woocommerce.android.cardreader.connection.CardReaderStatus
import com.woocommerce.android.ui.woopos.cardreader.WooPosCardReaderFacade
Expand All @@ -13,6 +15,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.runTest
import org.assertj.core.api.Assertions.assertThat
import org.junit.Assert.assertEquals
import org.junit.Rule
import org.junit.Test
import org.mockito.kotlin.mock
Expand Down Expand Up @@ -79,6 +82,10 @@ class WooPosToolbarViewModelTest {
.isEqualTo(
WooPosToolbarState.Menu.Visible(
listOf(
WooPosToolbarState.Menu.MenuItem(
title = R.string.woopos_documentation_title,
icon = R.drawable.woo_pos_info_ic,
),
WooPosToolbarState.Menu.MenuItem(
title = R.string.woopos_get_support_title,
icon = R.drawable.woopos_ic_get_support,
Expand Down Expand Up @@ -206,6 +213,7 @@ class WooPosToolbarViewModelTest {
// GIVEN
whenever(networkStatus.isConnected()).thenReturn(false)
whenever(cardReaderFacade.readerStatus).thenReturn(MutableStateFlow(CardReaderStatus.NotConnected()))
whenever(resourceProvider.getString(R.string.woopos_no_internet_message)).thenReturn("No internet")

// WHEN
val viewModel = createViewModel()
Expand All @@ -215,6 +223,27 @@ class WooPosToolbarViewModelTest {
verify(cardReaderFacade, never()).connectToReader()
}

@Test
fun `when Documentation MenuItemClicked, then openUrlEvent should be emitted with proper url`() = runTest {
// GIVEN
val viewModel = createViewModel()
val menuItem = WooPosToolbarState.Menu.MenuItem(
title = R.string.woopos_documentation_title,
icon = R.drawable.ic_help_24dp
)

viewModel.openUrlEvent.test {
// WHEN
viewModel.onUiEvent(WooPosToolbarUIEvent.MenuItemClicked(menuItem))

// THEN
assertEquals(WOO_POS_DOCUMENTATION_URL, awaitItem())
assertEquals(WooPosToolbarState.Menu.Hidden, viewModel.state.value.menu)

cancelAndConsumeRemainingEvents()
}
}

private fun createViewModel() = WooPosToolbarViewModel(
cardReaderFacade,
childrenToParentEventSender,
Expand Down

0 comments on commit b483dbb

Please sign in to comment.