Commit 35f732fb authored by Max Alekseenko's avatar Max Alekseenko

wrap new components in A/B testing

parent 01b0db6d
...@@ -7,6 +7,7 @@ import { STORAGE_KEY, STORAGE_LIMIT } from './consts'; ...@@ -7,6 +7,7 @@ import { STORAGE_KEY, STORAGE_LIMIT } from './consts';
export interface GrowthBookFeatures { export interface GrowthBookFeatures {
test_value: string; test_value: string;
security_score_exp: boolean;
} }
export const growthBook = (() => { export const growthBook = (() => {
......
...@@ -7,6 +7,7 @@ import React, { useCallback } from 'react'; ...@@ -7,6 +7,7 @@ import React, { useCallback } from 'react';
import type { MarketplaceAppWithSecurityReport } from 'types/client/marketplace'; import type { MarketplaceAppWithSecurityReport } from 'types/client/marketplace';
import { ContractListTypes } from 'types/client/marketplace'; import { ContractListTypes } from 'types/client/marketplace';
import useFeatureValue from 'lib/growthbook/useFeatureValue';
import useIsMobile from 'lib/hooks/useIsMobile'; import useIsMobile from 'lib/hooks/useIsMobile';
import { nbsp } from 'lib/html-entities'; import { nbsp } from 'lib/html-entities';
import type { IconName } from 'ui/shared/IconSvg'; import type { IconName } from 'ui/shared/IconSvg';
...@@ -31,6 +32,8 @@ const MarketplaceAppModal = ({ ...@@ -31,6 +32,8 @@ const MarketplaceAppModal = ({
data, data,
showContractList: showContractListDefault, showContractList: showContractListDefault,
}: Props) => { }: Props) => {
const { value: isExperiment } = useFeatureValue('security_score_exp', false);
const { const {
id, id,
title, title,
...@@ -169,7 +172,7 @@ const MarketplaceAppModal = ({ ...@@ -169,7 +172,7 @@ const MarketplaceAppModal = ({
/> />
</Flex> </Flex>
{ securityReport && ( { (isExperiment && securityReport) && (
<Flex alignItems="center" gap={ 3 }> <Flex alignItems="center" gap={ 3 }>
<AppSecurityReport securityReport={ securityReport } showContractList={ showAnalyzedContracts }/> <AppSecurityReport securityReport={ securityReport } showContractList={ showAnalyzedContracts }/>
<ContractListButton <ContractListButton
......
...@@ -7,6 +7,7 @@ import { ContractListTypes } from 'types/client/marketplace'; ...@@ -7,6 +7,7 @@ import { ContractListTypes } from 'types/client/marketplace';
import { route } from 'nextjs-routes'; import { route } from 'nextjs-routes';
import { useAppContext } from 'lib/contexts/app'; import { useAppContext } from 'lib/contexts/app';
import useFeatureValue from 'lib/growthbook/useFeatureValue';
import useIsMobile from 'lib/hooks/useIsMobile'; import useIsMobile from 'lib/hooks/useIsMobile';
import IconSvg from 'ui/shared/IconSvg'; import IconSvg from 'ui/shared/IconSvg';
import LinkExternal from 'ui/shared/LinkExternal'; import LinkExternal from 'ui/shared/LinkExternal';
...@@ -28,6 +29,7 @@ const MarketplaceAppTopBar = ({ data, isLoading, isWalletConnected, securityRepo ...@@ -28,6 +29,7 @@ const MarketplaceAppTopBar = ({ data, isLoading, isWalletConnected, securityRepo
const [ showContractList, setShowContractList ] = useBoolean(false); const [ showContractList, setShowContractList ] = useBoolean(false);
const appProps = useAppContext(); const appProps = useAppContext();
const isMobile = useIsMobile(); const isMobile = useIsMobile();
const { value: isExperiment } = useFeatureValue('security_score_exp', false);
const goBackUrl = React.useMemo(() => { const goBackUrl = React.useMemo(() => {
if (appProps.referrer && appProps.referrer.includes('/apps') && !appProps.referrer.includes('/apps/')) { if (appProps.referrer && appProps.referrer.includes('/apps') && !appProps.referrer.includes('/apps/')) {
...@@ -56,7 +58,7 @@ const MarketplaceAppTopBar = ({ data, isLoading, isWalletConnected, securityRepo ...@@ -56,7 +58,7 @@ const MarketplaceAppTopBar = ({ data, isLoading, isWalletConnected, securityRepo
<Skeleton order={{ base: 2, md: 3 }} isLoaded={ !isLoading }> <Skeleton order={{ base: 2, md: 3 }} isLoaded={ !isLoading }>
<MarketplaceAppInfo data={ data }/> <MarketplaceAppInfo data={ data }/>
</Skeleton> </Skeleton>
{ (securityReport || isLoading) && ( { (isExperiment && (securityReport || isLoading)) && (
<Box order={{ base: 3, md: 4 }}> <Box order={{ base: 3, md: 4 }}>
<AppSecurityReport <AppSecurityReport
securityReport={ securityReport } securityReport={ securityReport }
......
...@@ -9,6 +9,7 @@ import config from 'configs/app'; ...@@ -9,6 +9,7 @@ import config from 'configs/app';
import { useAppContext } from 'lib/contexts/app'; import { useAppContext } from 'lib/contexts/app';
import * as cookies from 'lib/cookies'; import * as cookies from 'lib/cookies';
import throwOnResourceLoadError from 'lib/errors/throwOnResourceLoadError'; import throwOnResourceLoadError from 'lib/errors/throwOnResourceLoadError';
import useFeatureValue from 'lib/growthbook/useFeatureValue';
import useIsMobile from 'lib/hooks/useIsMobile'; import useIsMobile from 'lib/hooks/useIsMobile';
import ContractListModal from 'ui/marketplace/ContractListModal'; import ContractListModal from 'ui/marketplace/ContractListModal';
import MarketplaceAppModal from 'ui/marketplace/MarketplaceAppModal'; import MarketplaceAppModal from 'ui/marketplace/MarketplaceAppModal';
...@@ -73,6 +74,7 @@ const Marketplace = () => { ...@@ -73,6 +74,7 @@ const Marketplace = () => {
} = useMarketplace(); } = useMarketplace();
const isMobile = useIsMobile(); const isMobile = useIsMobile();
const { value: isExperiment } = useFeatureValue('security_score_exp', false);
const categoryTabs = React.useMemo(() => { const categoryTabs = React.useMemo(() => {
const tabs: Array<TabItem> = categories.map(category => ({ const tabs: Array<TabItem> = categories.map(category => ({
...@@ -181,52 +183,54 @@ const Marketplace = () => { ...@@ -181,52 +183,54 @@ const Marketplace = () => {
</Box> </Box>
<Flex direction={{ base: 'column', lg: 'row' }} mb={{ base: 4, lg: 6 }} gap={{ base: 4, lg: 3 }}> <Flex direction={{ base: 'column', lg: 'row' }} mb={{ base: 4, lg: 6 }} gap={{ base: 4, lg: 3 }}>
<RadioButtonGroup<MarketplaceDisplayType> { isExperiment && (
onChange={ handleNFTsDisplayTypeChange } <RadioButtonGroup<MarketplaceDisplayType>
defaultValue={ displayType } onChange={ handleNFTsDisplayTypeChange }
name="type" defaultValue={ displayType }
options={ [ name="type"
{ options={ [
title: 'Discovery', {
value: 'default', title: 'Discovery',
icon: 'apps_xs', value: 'default',
onlyIcon: false, icon: 'apps_xs',
}, onlyIcon: false,
{ },
title: 'Apps scores', {
value: 'scores', title: 'Apps scores',
icon: 'apps_list', value: 'scores',
onlyIcon: false, icon: 'apps_list',
contentAfter: ( onlyIcon: false,
<Flex contentAfter: (
alignItems="center" <Flex
h={ 3 } alignItems="center"
bg="red.400" h={ 3 }
borderRadius="2px" bg="red.400"
fontSize="10px" borderRadius="2px"
fontWeight="500" fontSize="10px"
color="white" fontWeight="500"
px="2px" color="white"
ml={ 1 } px="2px"
> ml={ 1 }
{ isMobile ? <IconSvg name="beta" boxSize={ 2 }/> : 'beta' } >
</Flex> { isMobile ? <IconSvg name="beta" boxSize={ 2 }/> : 'beta' }
), </Flex>
}, ),
] } },
autoWidth ] }
/> autoWidth
/>
) }
<FilterInput <FilterInput
initialValue={ filterQuery } initialValue={ filterQuery }
onChange={ onSearchInputChange } onChange={ onSearchInputChange }
placeholder="Find app" placeholder="Find app"
isLoading={ isPlaceholderData } isLoading={ isPlaceholderData }
size="xs" size={ isExperiment ? 'xs' : 'sm' }
flex="1" flex="1"
/> />
</Flex> </Flex>
{ (displayType === 'scores') ? ( { (displayType === 'scores' && isExperiment) ? (
<MarketplaceListWithScores <MarketplaceListWithScores
apps={ displayedApps } apps={ displayedApps }
showAppInfo={ showAppInfo } showAppInfo={ showAppInfo }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment