Commit c20f58ff authored by Max Alekseenko's avatar Max Alekseenko

add back button

parent e3e8dbbc
import { import {
Box, Modal, ModalBody, Box, Modal, Text, ModalBody,
ModalCloseButton, ModalContent, ModalHeader, ModalOverlay, ModalCloseButton, ModalContent, ModalHeader, ModalOverlay,
} from '@chakra-ui/react'; } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
...@@ -10,11 +10,13 @@ import { ContractListTypes } from 'types/client/marketplace'; ...@@ -10,11 +10,13 @@ import { ContractListTypes } from 'types/client/marketplace';
import useIsMobile from 'lib/hooks/useIsMobile'; import useIsMobile from 'lib/hooks/useIsMobile';
import { apos } from 'lib/html-entities'; import { apos } from 'lib/html-entities';
import AddressEntity from 'ui/shared/entities/address/AddressEntity'; import AddressEntity from 'ui/shared/entities/address/AddressEntity';
import IconSvg from 'ui/shared/IconSvg';
import ContractSecurityReport from './ContractSecurityReport'; import ContractSecurityReport from './ContractSecurityReport';
type Props = { type Props = {
onClose: () => void; onClose: () => void;
onBack?: () => void;
type: ContractListTypes; type: ContractListTypes;
contracts?: MarketplaceAppSecurityReport['contractsData']; contracts?: MarketplaceAppSecurityReport['contractsData'];
} }
...@@ -25,7 +27,7 @@ const titles = { ...@@ -25,7 +27,7 @@ const titles = {
[ContractListTypes.VERIFIED]: 'Verified contracts', [ContractListTypes.VERIFIED]: 'Verified contracts',
}; };
const ContractListModal = ({ onClose, type, contracts }: Props) => { const ContractListModal = ({ onClose, onBack, type, contracts }: Props) => {
const isMobile = useIsMobile(); const isMobile = useIsMobile();
const displayedContracts = React.useMemo(() => { const displayedContracts = React.useMemo(() => {
...@@ -60,7 +62,23 @@ const ContractListModal = ({ onClose, type, contracts }: Props) => { ...@@ -60,7 +62,23 @@ const ContractListModal = ({ onClose, type, contracts }: Props) => {
> >
<ModalOverlay/> <ModalOverlay/>
<ModalContent> <ModalContent>
<ModalHeader fontWeight="500" textStyle="h3" mb={ 4 }>{ titles[type] }</ModalHeader> <ModalHeader display="flex" alignItems="center" mb={ 4 }>
{ onBack && (
<IconSvg
name="arrows/east"
boxSize={ 6 }
transform="rotate(180deg)"
verticalAlign="middle"
color="gray.400"
mr={ 3 }
cursor="pointer"
onClick={ onBack }
/>
) }
<Text fontWeight="500" textStyle="h3">
{ titles[type] }
</Text>
</ModalHeader>
<ModalCloseButton/> <ModalCloseButton/>
<ModalBody <ModalBody
maxH={ isMobile ? 'auto' : '352px' } maxH={ isMobile ? 'auto' : '352px' }
......
...@@ -23,7 +23,7 @@ type Props = { ...@@ -23,7 +23,7 @@ type Props = {
isFavorite: boolean; isFavorite: boolean;
onFavoriteClick: (id: string, isFavorite: boolean, source: 'App modal') => void; onFavoriteClick: (id: string, isFavorite: boolean, source: 'App modal') => void;
data: MarketplaceAppWithSecurityReport; data: MarketplaceAppWithSecurityReport;
showContractList: (id: string, type: ContractListTypes) => void; showContractList: (id: string, type: ContractListTypes, hasPreviousStep: boolean) => void;
} }
const MarketplaceAppModal = ({ const MarketplaceAppModal = ({
...@@ -78,7 +78,7 @@ const MarketplaceAppModal = ({ ...@@ -78,7 +78,7 @@ const MarketplaceAppModal = ({
const showContractList = useCallback((type: ContractListTypes) => { const showContractList = useCallback((type: ContractListTypes) => {
onClose(); onClose();
showContractListProp(id, type); showContractListProp(id, type, true);
}, [ onClose, showContractListProp, id ]); }, [ onClose, showContractListProp, id ]);
const showAllContracts = React.useCallback(() => { const showAllContracts = React.useCallback(() => {
......
...@@ -41,6 +41,7 @@ export default function useMarketplace() { ...@@ -41,6 +41,7 @@ export default function useMarketplace() {
const [ isAppInfoModalOpen, setIsAppInfoModalOpen ] = React.useState<boolean>(false); const [ isAppInfoModalOpen, setIsAppInfoModalOpen ] = React.useState<boolean>(false);
const [ isDisclaimerModalOpen, setIsDisclaimerModalOpen ] = React.useState<boolean>(false); const [ isDisclaimerModalOpen, setIsDisclaimerModalOpen ] = React.useState<boolean>(false);
const [ contractListModalType, setContractListModalType ] = React.useState<ContractListTypes | null>(null); const [ contractListModalType, setContractListModalType ] = React.useState<ContractListTypes | null>(null);
const [ hasPreviousStep, setHasPreviousStep ] = React.useState<boolean>(false);
const handleFavoriteClick = React.useCallback((id: string, isFavorite: boolean, source: 'Discovery view' | 'Security view' | 'App modal') => { const handleFavoriteClick = React.useCallback((id: string, isFavorite: boolean, source: 'Discovery view' | 'Security view' | 'App modal') => {
mixpanel.logEvent(mixpanel.EventTypes.PAGE_WIDGET, { Type: 'Favorite app', Info: id, Source: source }); mixpanel.logEvent(mixpanel.EventTypes.PAGE_WIDGET, { Type: 'Favorite app', Info: id, Source: source });
...@@ -68,9 +69,12 @@ export default function useMarketplace() { ...@@ -68,9 +69,12 @@ export default function useMarketplace() {
setIsDisclaimerModalOpen(true); setIsDisclaimerModalOpen(true);
}, []); }, []);
const showContractList = React.useCallback((id: string, type: ContractListTypes) => { const showContractList = React.useCallback((id: string, type: ContractListTypes, hasPreviousStep?: boolean) => {
setSelectedAppId(id); setSelectedAppId(id);
setContractListModalType(type); setContractListModalType(type);
if (hasPreviousStep) {
setHasPreviousStep(true);
}
}, []); }, []);
const debouncedFilterQuery = useDebounce(filterQuery, 500); const debouncedFilterQuery = useDebounce(filterQuery, 500);
...@@ -79,6 +83,7 @@ export default function useMarketplace() { ...@@ -79,6 +83,7 @@ export default function useMarketplace() {
setIsAppInfoModalOpen(false); setIsAppInfoModalOpen(false);
setIsDisclaimerModalOpen(false); setIsDisclaimerModalOpen(false);
setContractListModalType(null); setContractListModalType(null);
setHasPreviousStep(false);
}, []); }, []);
const handleCategoryChange = React.useCallback((newCategory: string) => { const handleCategoryChange = React.useCallback((newCategory: string) => {
...@@ -156,6 +161,7 @@ export default function useMarketplace() { ...@@ -156,6 +161,7 @@ export default function useMarketplace() {
contractListModalType, contractListModalType,
selectedDisplayType, selectedDisplayType,
onDisplayTypeChange: handleDisplayTypeChange, onDisplayTypeChange: handleDisplayTypeChange,
hasPreviousStep,
}), [ }), [
selectedCategoryId, selectedCategoryId,
categories, categories,
...@@ -179,5 +185,6 @@ export default function useMarketplace() { ...@@ -179,5 +185,6 @@ export default function useMarketplace() {
contractListModalType, contractListModalType,
selectedDisplayType, selectedDisplayType,
handleDisplayTypeChange, handleDisplayTypeChange,
hasPreviousStep,
]); ]);
} }
...@@ -69,6 +69,7 @@ const Marketplace = () => { ...@@ -69,6 +69,7 @@ const Marketplace = () => {
contractListModalType, contractListModalType,
selectedDisplayType, selectedDisplayType,
onDisplayTypeChange, onDisplayTypeChange,
hasPreviousStep,
} = useMarketplace(); } = useMarketplace();
const isMobile = useIsMobile(); const isMobile = useIsMobile();
...@@ -104,6 +105,8 @@ const Marketplace = () => { ...@@ -104,6 +105,8 @@ const Marketplace = () => {
return index === -1 ? 0 : index; return index === -1 ? 0 : index;
}, [ categoryTabs, selectedCategoryId ]); }, [ categoryTabs, selectedCategoryId ]);
const selectedApp = displayedApps.find(app => app.id === selectedAppId);
const handleCategoryChange = React.useCallback((index: number) => { const handleCategoryChange = React.useCallback((index: number) => {
onCategoryChange(categoryTabs[index].id); onCategoryChange(categoryTabs[index].id);
}, [ categoryTabs, onCategoryChange ]); }, [ categoryTabs, onCategoryChange ]);
...@@ -116,14 +119,19 @@ const Marketplace = () => { ...@@ -116,14 +119,19 @@ const Marketplace = () => {
} }
}, [ showDisclaimer ]); }, [ showDisclaimer ]);
const handleGoBackInContractListModal = React.useCallback(() => {
clearSelectedAppId();
if (selectedApp) {
showAppInfo(selectedApp.id);
}
}, [ clearSelectedAppId, showAppInfo, selectedApp ]);
throwOnResourceLoadError(isError && error ? { isError, error } : { isError: false, error: null }); throwOnResourceLoadError(isError && error ? { isError, error } : { isError: false, error: null });
if (!feature.isEnabled) { if (!feature.isEnabled) {
return null; return null;
} }
const selectedApp = displayedApps.find(app => app.id === selectedAppId);
return ( return (
<> <>
<PageTitle <PageTitle
...@@ -261,6 +269,7 @@ const Marketplace = () => { ...@@ -261,6 +269,7 @@ const Marketplace = () => {
type={ contractListModalType } type={ contractListModalType }
contracts={ selectedApp?.securityReport?.contractsData } contracts={ selectedApp?.securityReport?.contractsData }
onClose={ clearSelectedAppId } onClose={ clearSelectedAppId }
onBack={ hasPreviousStep ? handleGoBackInContractListModal : undefined }
/> />
) } ) }
</> </>
......
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