From 69d5dcfbfe5f81db9046d8668375bee7ac5407a2 Mon Sep 17 00:00:00 2001 From: Cuong Vu Date: Thu, 23 Jul 2020 17:53:17 +0700 Subject: [PATCH] feat: #2123 ispreview feature done --- packages/marketplace/config.example.json | 4 +- .../src/components/pages/apps/apps.tsx | 9 ++-- packages/marketplace/src/core/index.tsx | 2 + .../src/reducers/client/app-summary.ts | 1 + .../marketplace/src/sagas/__tests__/client.ts | 41 +++++++++++++++++++ packages/marketplace/src/sagas/client.ts | 32 +++++---------- .../src/tests/badges/badge-branches.svg | 2 +- .../src/tests/badges/badge-functions.svg | 2 +- .../src/tests/badges/badge-lines.svg | 2 +- .../src/tests/badges/badge-statements.svg | 2 +- packages/marketplace/src/types/global.d.ts | 2 + .../src/utils/__tests__/route-dispatcher.ts | 2 +- .../marketplace/src/utils/route-dispatcher.ts | 4 +- 13 files changed, 73 insertions(+), 32 deletions(-) diff --git a/packages/marketplace/config.example.json b/packages/marketplace/config.example.json index d974f23650..c1f401ec4a 100644 --- a/packages/marketplace/config.example.json +++ b/packages/marketplace/config.example.json @@ -12,5 +12,7 @@ "cognitoUserPoolId": "", "chatbotAppId": "", "marketplaceUrl": "", - "cypressBaseUrl": "http://localhost:8080" + "cypressBaseUrl": "http://localhost:8080", + "previewExternalAppIds": [], + "previewFeaturedExternalAppIds": [] } diff --git a/packages/marketplace/src/components/pages/apps/apps.tsx b/packages/marketplace/src/components/pages/apps/apps.tsx index 361c998320..45a7db928b 100644 --- a/packages/marketplace/src/components/pages/apps/apps.tsx +++ b/packages/marketplace/src/components/pages/apps/apps.tsx @@ -18,6 +18,7 @@ import Routes from '@/constants/routes' import InfiniteScroll from 'react-infinite-scroller' import { clientFetchAppSummary } from '@/actions/client' import styles from '@/styles/pages/apps.scss?mod' +import qs from 'query-string' export const handleAfterClose = ({ setVisible }) => () => setVisible(false) export const handleOnChange = history => (page: number) => { @@ -36,8 +37,8 @@ export const handleOnCardClick = (history: History) => (app: AppSummaryModel) => history.push(`${Routes.APPS}/${app.id}`) } -export const handleLoadMore = (dispatch: Dispatch) => (page: number) => { - dispatch(clientFetchAppSummary({ page })) +export const handleLoadMore = ({ dispatch, preview }: { dispatch: Dispatch; preview: boolean }) => (page: number) => { + dispatch(clientFetchAppSummary({ page, preview })) } export const Apps: React.FunctionComponent = () => { @@ -51,6 +52,8 @@ export const Apps: React.FunctionComponent = () => { const apps = appSummaryState?.data?.apps?.data || [] const featuredApps = appSummaryState?.data?.featuredApps || [] const { totalCount = 0, pageNumber = 1 } = appSummaryState?.data?.apps || {} + const { preview: previewString } = qs.parse(location.search) + const preview = !!previewString const totalPage = totalCount / pageNumber /** @@ -73,7 +76,7 @@ export const Apps: React.FunctionComponent = () => { } initialLoad={false} diff --git a/packages/marketplace/src/core/index.tsx b/packages/marketplace/src/core/index.tsx index b55a367db4..9cd8a004bc 100644 --- a/packages/marketplace/src/core/index.tsx +++ b/packages/marketplace/src/core/index.tsx @@ -34,6 +34,8 @@ window.reapit = { apiDocDesktop: '', developerPortalUrl: '', adminPortalUrl: '', + previewExternalAppIds: [], + previewFeaturedExternalAppIds: [], }, } diff --git a/packages/marketplace/src/reducers/client/app-summary.ts b/packages/marketplace/src/reducers/client/app-summary.ts index a7bf8c5a4f..67e635a752 100644 --- a/packages/marketplace/src/reducers/client/app-summary.ts +++ b/packages/marketplace/src/reducers/client/app-summary.ts @@ -18,6 +18,7 @@ export interface ClientAppSummaryParams { search?: string searchBy?: string category?: string + preview?: boolean } export interface ClientAppSummaryState { diff --git a/packages/marketplace/src/sagas/__tests__/client.ts b/packages/marketplace/src/sagas/__tests__/client.ts index e6e1d29b2f..7a4b3172d2 100644 --- a/packages/marketplace/src/sagas/__tests__/client.ts +++ b/packages/marketplace/src/sagas/__tests__/client.ts @@ -65,6 +65,47 @@ describe('clientDataFetch', () => { expect(clone.next().value).toEqual(put(categoriesReceiveData(response[2] as PagedResultCategoryModel_))) expect(clone.next().done).toBe(true) }) + + it('should work when ?preview=true ', () => { + ;(global as any).window.reapit.config = { + previewExternalAppIds: ['id1'], + previewFeaturedExternalAppIds: ['id2'], + } + const gen = cloneableGenerator(clientDataFetch as any)({ + data: { + ...params.data, + preview: true, + }, + }) + const clone = gen.clone() + expect(clone.next().value).toEqual(select(selectClientId)) + expect(clone.next(clientId).value).toEqual(select(selectCategories)) + expect(clone.next(appCategorieStub.data).value).toEqual(select(selectFeaturedApps)) + expect(clone.next(featuredAppsDataStub.data).value).toEqual(select(selectDeveloperEditionId)) + + const response = [appsDataStub.data, featuredAppsDataStub.data, appCategorieStub] + expect(clone.next(developerId).value).toEqual( + all([ + call(fetchAppsList, { + pageNumber: params.data.page, + pageSize: BROWSE_APPS_PER_PAGE, + externalAppId: ['id1'], + }), + featuredAppsDataStub.data, + appCategorieStub.data, + ]), + ) + expect(clone.next(response).value).toEqual( + put( + clientFetchAppSummarySuccess({ + apps: response[0] as PagedResultAppSummaryModel_, + featuredApps: response[1].data as AppSummaryModel[], + }), + ), + ) + expect(clone.next().value).toEqual(put(categoriesReceiveData(response[2] as PagedResultCategoryModel_))) + expect(clone.next().done).toBe(true) + }) }) describe('client fetch data error', () => { diff --git a/packages/marketplace/src/sagas/client.ts b/packages/marketplace/src/sagas/client.ts index dd96811d95..f062961884 100644 --- a/packages/marketplace/src/sagas/client.ts +++ b/packages/marketplace/src/sagas/client.ts @@ -4,7 +4,7 @@ import { put, fork, takeLatest, all, call, select } from '@redux-saga/core/effec import ActionTypes from '../constants/action-types' import { errorThrownServer } from '../actions/error' import errorMessages from '../constants/error-messages' -import { APPS_PER_PAGE, FEATURED_APPS } from '@/constants/paginator' +import { BROWSE_APPS_PER_PAGE, FEATURED_APPS } from '@/constants/paginator' import { Action } from '@/types/core' import { selectClientId, selectFeaturedApps, selectDeveloperEditionId } from '@/selector/client' import { selectCategories } from '@/selector/app-categories' @@ -31,30 +31,18 @@ export const clientDataFetch = function*({ data }) { // we will have to manually check it here // TODO: have the endpoint return a category id for Direct API apps as well const isFilteringForDirectApiApps = category === 'DIRECT_API_APPS_FILTER' - const shouldNotFetchFeatureApp = !!search || !!category + const shouldNotFetchFeaturedApps = !!search || !!category const shouldNotFetchCategories = currentCategories.length > DEFAULT_CATEGORY_LENGTH - const appsExternalAppId = isPreview - ? [ - 'u78db4v074cd35hfn0o22rjks', - '12cpo3fvuf5i64hmh6jtiiikck', - '61m5rglg0c7uhcvonits9te748', - '3utn4gi7hkhej04nohq4seaker', - '1pv68mhk7iggbmefhv7hd9619h', - '3qtpkra3ucouh6dnu7e8rjvjmp', - '5nclclrns6mfkqu4a3sgihfhp2', - '22a8l6mesohb8k6mqe3io483v8', - 'cro58cpfh7hes4mi03mn1stk', - 'c8gukq556ibvr0ol15a6i3o9d', - '2vats8l69ncaovvg0o8b6nrihd', - ] - : undefined + // PREVIEW APPS FEATURE when ?preview=true + const appsExternalAppIds = isPreview ? window.reapit.config.previewExternalAppIds : undefined + const featuredAppsExternalAppIds = isPreview ? window.reapit.config.previewFeaturedExternalAppIds : undefined const appsFetchParams = isPreview ? { pageNumber: page, - pageSize: APPS_PER_PAGE, - externalAppId: appsExternalAppId, + pageSize: BROWSE_APPS_PER_PAGE, + externalAppId: appsExternalAppIds, } : { clientId, @@ -62,7 +50,7 @@ export const clientDataFetch = function*({ data }) { category: isFilteringForDirectApiApps ? undefined : category, [searchBy]: search, pageNumber: page, - pageSize: APPS_PER_PAGE, + pageSize: BROWSE_APPS_PER_PAGE, isFeatured: isFilteringForDirectApiApps ? undefined : false, isDirectApi: isFilteringForDirectApiApps ? true : undefined, } @@ -72,7 +60,7 @@ export const clientDataFetch = function*({ data }) { pageNumber: DEFAULT_FEATURED_APP_PAGE_NUMBER, pageSize: FEATURED_APPS, isFeatured: true, - externalAppId: [], + externalAppId: featuredAppsExternalAppIds, } : { clientId, @@ -85,7 +73,7 @@ export const clientDataFetch = function*({ data }) { const [apps, featuredApps, categories] = yield all([ call(fetchAppsList, appsFetchParams), - shouldNotFetchFeatureApp ? currentFeaturedApps : call(fetchAppsList, featuredAppsFetchParams), + shouldNotFetchFeaturedApps ? currentFeaturedApps : call(fetchAppsList, featuredAppsFetchParams), shouldNotFetchCategories ? currentCategories : call(fetchCategoriesList, {}), ]) diff --git a/packages/marketplace/src/tests/badges/badge-branches.svg b/packages/marketplace/src/tests/badges/badge-branches.svg index 1894f0c560..a833d93c8e 100644 --- a/packages/marketplace/src/tests/badges/badge-branches.svg +++ b/packages/marketplace/src/tests/badges/badge-branches.svg @@ -1 +1 @@ -Coverage:branches: 73.05%Coverage:branches73.05% \ No newline at end of file +Coverage:branches: 73.3%Coverage:branches73.3% \ No newline at end of file diff --git a/packages/marketplace/src/tests/badges/badge-functions.svg b/packages/marketplace/src/tests/badges/badge-functions.svg index 867f3261b8..de3194ab98 100644 --- a/packages/marketplace/src/tests/badges/badge-functions.svg +++ b/packages/marketplace/src/tests/badges/badge-functions.svg @@ -1 +1 @@ -Coverage:functions: 82.2%Coverage:functions82.2% \ No newline at end of file +Coverage:functions: 81.93%Coverage:functions81.93% \ No newline at end of file diff --git a/packages/marketplace/src/tests/badges/badge-lines.svg b/packages/marketplace/src/tests/badges/badge-lines.svg index 2b18ac2588..4c968df7eb 100644 --- a/packages/marketplace/src/tests/badges/badge-lines.svg +++ b/packages/marketplace/src/tests/badges/badge-lines.svg @@ -1 +1 @@ -Coverage:lines: 90.35%Coverage:lines90.35% \ No newline at end of file +Coverage:lines: 90.44%Coverage:lines90.44% \ No newline at end of file diff --git a/packages/marketplace/src/tests/badges/badge-statements.svg b/packages/marketplace/src/tests/badges/badge-statements.svg index 9c816b1e4f..27a90885fd 100644 --- a/packages/marketplace/src/tests/badges/badge-statements.svg +++ b/packages/marketplace/src/tests/badges/badge-statements.svg @@ -1 +1 @@ -Coverage:statements: 89.34%Coverage:statements89.34% \ No newline at end of file +Coverage:statements: 89.45%Coverage:statements89.45% \ No newline at end of file diff --git a/packages/marketplace/src/types/global.d.ts b/packages/marketplace/src/types/global.d.ts index 1adf1a4035..70e995373c 100644 --- a/packages/marketplace/src/types/global.d.ts +++ b/packages/marketplace/src/types/global.d.ts @@ -19,6 +19,8 @@ export type Config = { apiDocDesktop: string developerPortalUrl: string adminPortalUrl: string + previewExternalAppIds: string[] + previewFeaturedExternalAppIds: string[] } declare global { diff --git a/packages/marketplace/src/utils/__tests__/route-dispatcher.ts b/packages/marketplace/src/utils/__tests__/route-dispatcher.ts index d6b1a22719..7bbf4a74b3 100644 --- a/packages/marketplace/src/utils/__tests__/route-dispatcher.ts +++ b/packages/marketplace/src/utils/__tests__/route-dispatcher.ts @@ -14,7 +14,7 @@ jest.mock('../../sagas/client') describe('routeDispatcher', () => { it('should dispatch to clientFetchAppSummaryclientFetchAppSummary for the client route', async () => { await routeDispatcher(Routes.APPS as RouteValue) - expect(store.dispatch).toHaveBeenCalledWith(clientFetchAppSummary({ page: 1 })) + expect(store.dispatch).toHaveBeenCalledWith(clientFetchAppSummary({ page: 1, preview: false })) }) it('should dispatch to installedAppsRequestData for the installed-apps route', async () => { diff --git a/packages/marketplace/src/utils/route-dispatcher.ts b/packages/marketplace/src/utils/route-dispatcher.ts index 15d2f60d9c..2817ea8e07 100644 --- a/packages/marketplace/src/utils/route-dispatcher.ts +++ b/packages/marketplace/src/utils/route-dispatcher.ts @@ -10,10 +10,12 @@ const routeDispatcher = async (route: RouteValue, params?: StringMap, search?: s const id = params && params.appid ? params.appid : '' const queryParams = new URLSearchParams(search) const page = queryParams.get('page') ? Number(queryParams.get('page')) : 1 + // preview apps feature + const preview = queryParams.get('preview') ? true : false switch (route) { case Routes.APPS: - store.dispatch(clientFetchAppSummary({ page: 1 })) + store.dispatch(clientFetchAppSummary({ page: 1, preview })) break case Routes.APP_DETAIL: { if (id) {