Commit aa466df4 authored by isstuev's avatar isstuev

Add Ad banner to 404 page

parent 89be9fd8
...@@ -5,10 +5,13 @@ import * as pwConfig from 'playwright/utils/config'; ...@@ -5,10 +5,13 @@ import * as pwConfig from 'playwright/utils/config';
import AppError from './AppError'; import AppError from './AppError';
test('status code 404', async({ render }) => { test('status code 404', async({ render, page }) => {
const error = { message: 'Not found', cause: { status: 404 } } as Error; const error = { message: 'Not found', cause: { status: 404 } } as Error;
const component = await render(<AppError error={ error }/>); const component = await render(<AppError error={ error }/>);
await expect(component).toHaveScreenshot(); await expect(component).toHaveScreenshot({
mask: [ page.locator(pwConfig.adsBannerSelector) ],
maskColor: pwConfig.maskColor,
});
}); });
test('status code 422', async({ render }) => { test('status code 422', async({ render }) => {
...@@ -44,7 +47,6 @@ test('too many requests +@mobile', async({ render, page }) => { ...@@ -44,7 +47,6 @@ test('too many requests +@mobile', async({ render, page }) => {
cause: { status: 429 }, cause: { status: 429 },
} as Error; } as Error;
const component = await render(<AppError error={ error }/>); const component = await render(<AppError error={ error }/>);
await page.waitForResponse('https://www.google.com/recaptcha/api2/**');
await expect(component).toHaveScreenshot({ await expect(component).toHaveScreenshot({
mask: [ page.locator('.recaptcha') ], mask: [ page.locator('.recaptcha') ],
maskColor: pwConfig.maskColor, maskColor: pwConfig.maskColor,
......
...@@ -3,10 +3,12 @@ import React from 'react'; ...@@ -3,10 +3,12 @@ import React from 'react';
import { route } from 'nextjs-routes'; import { route } from 'nextjs-routes';
import config from 'configs/app';
import getErrorCause from 'lib/errors/getErrorCause'; import getErrorCause from 'lib/errors/getErrorCause';
import getErrorCauseStatusCode from 'lib/errors/getErrorCauseStatusCode'; import getErrorCauseStatusCode from 'lib/errors/getErrorCauseStatusCode';
import getErrorObjStatusCode from 'lib/errors/getErrorObjStatusCode'; import getErrorObjStatusCode from 'lib/errors/getErrorObjStatusCode';
import getResourceErrorPayload from 'lib/errors/getResourceErrorPayload'; import getResourceErrorPayload from 'lib/errors/getResourceErrorPayload';
import AdBannerContent from 'ui/shared/ad/AdBannerContent';
import AppErrorIcon from './AppErrorIcon'; import AppErrorIcon from './AppErrorIcon';
import AppErrorTitle from './AppErrorTitle'; import AppErrorTitle from './AppErrorTitle';
...@@ -14,6 +16,8 @@ import AppErrorBlockConsensus from './custom/AppErrorBlockConsensus'; ...@@ -14,6 +16,8 @@ import AppErrorBlockConsensus from './custom/AppErrorBlockConsensus';
import AppErrorTooManyRequests from './custom/AppErrorTooManyRequests'; import AppErrorTooManyRequests from './custom/AppErrorTooManyRequests';
import AppErrorTxNotFound from './custom/AppErrorTxNotFound'; import AppErrorTxNotFound from './custom/AppErrorTxNotFound';
const adBannerConfig = config.features.adsBanner;
interface Props { interface Props {
className?: string; className?: string;
error: Error | undefined; error: Error | undefined;
...@@ -73,6 +77,8 @@ const AppError = ({ error, className }: Props) => { ...@@ -73,6 +77,8 @@ const AppError = ({ error, className }: Props) => {
default: { default: {
const { title, text } = ERROR_TEXTS[String(statusCode)] ?? ERROR_TEXTS[500]; const { title, text } = ERROR_TEXTS[String(statusCode)] ?? ERROR_TEXTS[500];
const adBannerProvider = adBannerConfig.isEnabled ? adBannerConfig.provider : null;
return ( return (
<> <>
<AppErrorIcon statusCode={ statusCode }/> <AppErrorIcon statusCode={ statusCode }/>
...@@ -87,6 +93,7 @@ const AppError = ({ error, className }: Props) => { ...@@ -87,6 +93,7 @@ const AppError = ({ error, className }: Props) => {
> >
Back to home Back to home
</Button> </Button>
{ statusCode === 404 && adBannerProvider && <AdBannerContent mt={ 12 } provider={ adBannerProvider }/> }
</> </>
); );
} }
......
import { chakra, Skeleton } from '@chakra-ui/react'; import { chakra } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import config from 'configs/app'; 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 AdbutlerBanner from './AdbutlerBanner'; import AdBannerContent from './AdBannerContent';
import CoinzillaBanner from './CoinzillaBanner';
import GetitBanner from './GetitBanner';
import HypeBanner from './HypeBanner';
import SliseBanner from './SliseBanner';
const feature = config.features.adsBanner; const feature = config.features.adsBanner;
...@@ -22,31 +18,12 @@ const AdBanner = ({ className, isLoading }: { className?: string; isLoading?: bo ...@@ -22,31 +18,12 @@ const AdBanner = ({ className, isLoading }: { className?: string; isLoading?: bo
return null; return null;
} }
const content = (() => {
switch (provider) {
case 'adbutler':
return <AdbutlerBanner/>;
case 'coinzilla':
return <CoinzillaBanner/>;
case 'getit':
return <GetitBanner/>;
case 'hype':
return <HypeBanner/>;
case 'slise':
return <SliseBanner/>;
}
})();
return ( return (
<Skeleton <AdBannerContent
className={ className } className={ className }
isLoaded={ !isLoading } isLoading={ isLoading }
borderRadius="none" provider={ provider }
maxW={ ('adButler' in feature && feature.adButler) ? feature.adButler.config.desktop.width : '728px' } />
w="100%"
>
{ content }
</Skeleton>
); );
}; };
......
import { chakra, Skeleton } from '@chakra-ui/react';
import React from 'react';
import type { AdBannerProviders } from 'types/client/adProviders';
import config from 'configs/app';
import AdbutlerBanner from './AdbutlerBanner';
import CoinzillaBanner from './CoinzillaBanner';
import GetitBanner from './GetitBanner';
import HypeBanner from './HypeBanner';
import SliseBanner from './SliseBanner';
const feature = config.features.adsBanner;
const AdBannerContent = ({ className, isLoading, provider }: { className?: string; isLoading?: boolean; provider: AdBannerProviders }) => {
const content = (() => {
switch (provider) {
case 'adbutler':
return <AdbutlerBanner/>;
case 'coinzilla':
return <CoinzillaBanner/>;
case 'getit':
return <GetitBanner/>;
case 'hype':
return <HypeBanner/>;
case 'slise':
return <SliseBanner/>;
}
})();
return (
<Skeleton
className={ className }
isLoaded={ !isLoading }
borderRadius="none"
maxW={ ('adButler' in feature && feature.adButler) ? feature.adButler.config.desktop.width : '728px' }
w="100%"
>
{ content }
</Skeleton>
);
};
export default chakra(AdBannerContent);
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