diff --git a/src/config/namespaces.ts b/src/config/namespaces.ts index e8e956d..5a10bf8 100644 --- a/src/config/namespaces.ts +++ b/src/config/namespaces.ts @@ -24,4 +24,7 @@ export const SERVER_PAGE = { VILLAGE_PAGE: { INDEX_PAGE: 'server-page/village-page/index-page', }, + RANKING_PAGE: { + COMMON: 'server-page/ranking-page/common', + }, }; diff --git a/src/config/routes.ts b/src/config/routes.ts index 2dda7b2..d287580 100644 --- a/src/config/routes.ts +++ b/src/config/routes.ts @@ -20,6 +20,7 @@ export const SERVER_PAGE = { INDEX_PAGE: '/server/:key/village/:id', }, RANKING_PAGE: { + BASE: '/server/:key/ranking', PLAYER_PAGE: { INDEX_PAGE: '/server/:key/ranking/player', OD_PAGE: '/server/:key/ranking/player/od', diff --git a/src/features/ServerPage/ServerPage.tsx b/src/features/ServerPage/ServerPage.tsx index 40afe31..309b46e 100644 --- a/src/features/ServerPage/ServerPage.tsx +++ b/src/features/ServerPage/ServerPage.tsx @@ -7,6 +7,7 @@ import IndexPage from './features/IndexPage/IndexPage'; import PlayerPage from './features/PlayerPage/PlayerPage'; import TribePage from './features/TribePage/TribePage'; import VillagePage from './features/VillagePage/VillagePage'; +import RankingPage from './features/RankingPage/RankingPage'; import NotFoundPage from '../NotFoundPage/NotFoundPage'; const EnhancedRoute = ({ children, ...rest }: RouteProps) => { @@ -32,6 +33,9 @@ function ServerPage() { + + + diff --git a/src/features/ServerPage/common/PageLayout/components/Sidebar/Sidebar.tsx b/src/features/ServerPage/common/PageLayout/components/Sidebar/Sidebar.tsx index 11cbc89..54a58cb 100644 --- a/src/features/ServerPage/common/PageLayout/components/Sidebar/Sidebar.tsx +++ b/src/features/ServerPage/common/PageLayout/components/Sidebar/Sidebar.tsx @@ -43,46 +43,54 @@ const Sidebar = ({ t, className, open, variant, onClose, onOpen }: Props) => { to: ROUTES.SERVER_PAGE.INDEX_PAGE, params: { key }, Icon: , + exact: true, }, { name: t('pageLayout.sidebar.routes.rankings.name'), Icon: , + to: ROUTES.SERVER_PAGE.RANKING_PAGE.BASE, nested: [ { name: t('pageLayout.sidebar.routes.rankings.player.index'), to: ROUTES.SERVER_PAGE.RANKING_PAGE.PLAYER_PAGE.INDEX_PAGE, params: { key }, Icon: , + exact: true, }, { name: t('pageLayout.sidebar.routes.rankings.player.od'), to: ROUTES.SERVER_PAGE.RANKING_PAGE.PLAYER_PAGE.OD_PAGE, params: { key }, Icon: , + exact: true, }, { name: t('pageLayout.sidebar.routes.rankings.player.archive'), to: ROUTES.SERVER_PAGE.RANKING_PAGE.PLAYER_PAGE.ARCHIVE_PAGE, params: { key }, Icon: , + exact: true, }, { name: t('pageLayout.sidebar.routes.rankings.tribe.index'), to: ROUTES.SERVER_PAGE.RANKING_PAGE.TRIBE_PAGE.INDEX_PAGE, params: { key }, Icon: , + exact: true, }, { name: t('pageLayout.sidebar.routes.rankings.tribe.od'), to: ROUTES.SERVER_PAGE.RANKING_PAGE.TRIBE_PAGE.OD_PAGE, params: { key }, Icon: , + exact: true, }, { name: t('pageLayout.sidebar.routes.rankings.tribe.archive'), to: ROUTES.SERVER_PAGE.RANKING_PAGE.TRIBE_PAGE.ARCHIVE_PAGE, params: { key }, Icon: , + exact: true, }, ], }, @@ -91,12 +99,14 @@ const Sidebar = ({ t, className, open, variant, onClose, onOpen }: Props) => { to: ROUTES.SERVER_PAGE.ENNOBLEMENTS_PAGE, params: { key }, Icon: , + exact: true, }, { name: t('pageLayout.sidebar.routes.map'), to: ROUTES.SERVER_PAGE.MAP_PAGE, params: { key }, Icon: , + exact: true, }, ]; diff --git a/src/features/ServerPage/common/PageLayout/components/Sidebar/components/Nav/ListItem.tsx b/src/features/ServerPage/common/PageLayout/components/Sidebar/components/Nav/ListItem.tsx index 233b5cc..80f4459 100644 --- a/src/features/ServerPage/common/PageLayout/components/Sidebar/components/Nav/ListItem.tsx +++ b/src/features/ServerPage/common/PageLayout/components/Sidebar/components/Nav/ListItem.tsx @@ -1,5 +1,5 @@ import React, { Fragment, useState } from 'react'; -import { useLocation, generatePath } from 'react-router-dom'; +import { useLocation, generatePath, matchPath } from 'react-router-dom'; import { Route } from './types'; import { makeStyles } from '@material-ui/core/styles'; @@ -25,12 +25,8 @@ function ListItem({ route, nestedLevel }: Props) { const classes = useStyles(); const { pathname } = useLocation(); const hasNested = Array.isArray(route.nested) && route.nested.length > 0; - const generatedPath = - route.to && route.params - ? generatePath(route.to, route.params) - : route.to - ? route.to - : ''; + const isActive = + route.to && matchPath(pathname, { path: route.to, exact: route.exact }); const getItem = () => { return ( @@ -43,12 +39,17 @@ function ListItem({ route, nestedLevel }: Props) { > {route.Icon} - + {hasNested && ( {open ? : } )} @@ -59,14 +60,7 @@ function ListItem({ route, nestedLevel }: Props) { return ( {!hasNested && route.to ? ( - + {getItem()} ) : ( diff --git a/src/features/ServerPage/common/PageLayout/components/Sidebar/components/Nav/types.ts b/src/features/ServerPage/common/PageLayout/components/Sidebar/components/Nav/types.ts index 95e6a2a..ad8c708 100644 --- a/src/features/ServerPage/common/PageLayout/components/Sidebar/components/Nav/types.ts +++ b/src/features/ServerPage/common/PageLayout/components/Sidebar/components/Nav/types.ts @@ -3,6 +3,7 @@ import { Props } from '@common/Link/Link'; export interface Route { name: string; to?: string; + exact?: boolean; params?: Props['params']; Icon: React.ReactElement; nested?: Route[]; diff --git a/src/features/ServerPage/features/RankingPage/RankingPage.tsx b/src/features/ServerPage/features/RankingPage/RankingPage.tsx new file mode 100644 index 0000000..cd46417 --- /dev/null +++ b/src/features/ServerPage/features/RankingPage/RankingPage.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import { SERVER_PAGE } from '@config/routes'; + +import { Switch, Route } from 'react-router-dom'; +import PlayerPage from './features/PlayerPage/PlayerPage'; +import NotFoundPage from '../../../NotFoundPage/NotFoundPage'; + +function RankingPage() { + return ( + + + + + + + + + ); +} + +export default RankingPage; diff --git a/src/features/ServerPage/features/RankingPage/common/PageLayout/PageLayout.tsx b/src/features/ServerPage/features/RankingPage/common/PageLayout/PageLayout.tsx new file mode 100644 index 0000000..3e8b21c --- /dev/null +++ b/src/features/ServerPage/features/RankingPage/common/PageLayout/PageLayout.tsx @@ -0,0 +1,78 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import useServer from '@features/ServerPage/libs/ServerContext/useServer'; +import useTabs from './useTabs'; +import * as NAMESPACES from '@config/namespaces'; + +import { makeStyles } from '@material-ui/core/styles'; + +import { Tabs, Tab } from '@material-ui/core'; +import Link from '@common/Link/Link'; +import ServerPageLayout from '@features/ServerPage/common/PageLayout/PageLayout'; + +import background from './backgrounds/bg-1-dark.png'; + +export interface Props { + children: React.ReactNode; +} + +function PageLayout({ children }: Props) { + const classes = useStyles(); + const server = useServer(); + const { t } = useTranslation(NAMESPACES.SERVER_PAGE.RANKING_PAGE.COMMON); + const { currentTab, tabs } = useTabs(t); + return ( + +
+ + {tabs.map(({ to, label }) => { + return ( + + {label} + + } + /> + ); + })} + +
+
{children}
+
+ ); +} + +const useStyles = makeStyles(theme => ({ + header: { + width: '100%', + minHeight: theme.spacing(30), + backgroundPosition: 'center', + backgroundSize: 'cover', + backgroundRepeat: 'no-repeat', + display: 'flex', + justifyContent: 'flex-end', + flexDirection: 'column', + backgroundImage: `url(${background})`, + boxShadow: theme.shadows[4], + }, + content: { + height: '100%', + padding: theme.spacing(3, 0), + '&.no-padding': { + padding: '0 0', + }, + }, +})); + +export default PageLayout; diff --git a/src/features/ServerPage/features/RankingPage/common/PageLayout/backgrounds/bg-1-dark.png b/src/features/ServerPage/features/RankingPage/common/PageLayout/backgrounds/bg-1-dark.png new file mode 100644 index 0000000..0a0c649 Binary files /dev/null and b/src/features/ServerPage/features/RankingPage/common/PageLayout/backgrounds/bg-1-dark.png differ diff --git a/src/features/ServerPage/features/RankingPage/common/PageLayout/useTabs.ts b/src/features/ServerPage/features/RankingPage/common/PageLayout/useTabs.ts new file mode 100644 index 0000000..32ad33a --- /dev/null +++ b/src/features/ServerPage/features/RankingPage/common/PageLayout/useTabs.ts @@ -0,0 +1,58 @@ +import { useMemo } from 'react'; +import { matchPath, useLocation } from 'react-router-dom'; +import * as ROUTES from '@config/routes'; + +import { TFunction } from 'i18next'; + +const useTabs = (t: TFunction) => { + const loc = useLocation(); + const tabs = useMemo(() => { + return [ + { + to: ROUTES.SERVER_PAGE.RANKING_PAGE.PLAYER_PAGE.INDEX_PAGE, + label: t('pageLayout.tabs.playerPage.indexPage'), + }, + { + to: ROUTES.SERVER_PAGE.RANKING_PAGE.PLAYER_PAGE.OD_PAGE, + label: t('pageLayout.tabs.playerPage.odPage'), + }, + { + to: ROUTES.SERVER_PAGE.RANKING_PAGE.PLAYER_PAGE.DAILY_PAGE, + label: t('pageLayout.tabs.playerPage.dailyPage'), + }, + { + to: ROUTES.SERVER_PAGE.RANKING_PAGE.PLAYER_PAGE.ARCHIVE_PAGE, + label: t('pageLayout.tabs.playerPage.archivePage'), + }, + { + to: ROUTES.SERVER_PAGE.RANKING_PAGE.TRIBE_PAGE.INDEX_PAGE, + label: t('pageLayout.tabs.tribePage.indexPage'), + }, + { + to: ROUTES.SERVER_PAGE.RANKING_PAGE.TRIBE_PAGE.OD_PAGE, + label: t('pageLayout.tabs.tribePage.odPage'), + }, + { + to: ROUTES.SERVER_PAGE.RANKING_PAGE.TRIBE_PAGE.DAILY_PAGE, + label: t('pageLayout.tabs.tribePage.dailyPage'), + }, + { + to: ROUTES.SERVER_PAGE.RANKING_PAGE.TRIBE_PAGE.ARCHIVE_PAGE, + label: t('pageLayout.tabs.tribePage.archivePage'), + }, + ]; + }, [t]); + const currentTab = useMemo( + () => + tabs.findIndex(({ to }) => { + return matchPath(loc.pathname, { exact: true, path: to }); + }), + [loc.pathname, tabs] + ); + return { + tabs, + currentTab, + }; +}; + +export default useTabs; diff --git a/src/features/ServerPage/features/RankingPage/features/PlayerPage/PlayerPage.tsx b/src/features/ServerPage/features/RankingPage/features/PlayerPage/PlayerPage.tsx new file mode 100644 index 0000000..82ae77b --- /dev/null +++ b/src/features/ServerPage/features/RankingPage/features/PlayerPage/PlayerPage.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import { SERVER_PAGE } from '@config/routes'; + +import { Switch, Route } from 'react-router-dom'; +import IndexPage from './features/IndexPage/IndexPage'; +import NotFoundPage from '../../../NotFoundPage/NotFoundPage'; + +function PlayerPage() { + return ( + + + + + + + + + ); +} + +export default PlayerPage; diff --git a/src/features/ServerPage/features/RankingPage/features/PlayerPage/features/IndexPage/IndexPage.tsx b/src/features/ServerPage/features/RankingPage/features/PlayerPage/features/IndexPage/IndexPage.tsx new file mode 100644 index 0000000..db76dbb --- /dev/null +++ b/src/features/ServerPage/features/RankingPage/features/PlayerPage/features/IndexPage/IndexPage.tsx @@ -0,0 +1,9 @@ +import React from 'react'; + +import PageLayout from '@features/ServerPage/features/RankingPage/common/PageLayout/PageLayout'; + +function IndexPage() { + return elo; +} + +export default IndexPage; diff --git a/src/libs/i18n/en/server-page/index.ts b/src/libs/i18n/en/server-page/index.ts index 997d46f..48c3193 100644 --- a/src/libs/i18n/en/server-page/index.ts +++ b/src/libs/i18n/en/server-page/index.ts @@ -4,6 +4,7 @@ import indexPage from './index-page'; import playerPage from './player-page'; import tribePage from './tribe-page'; import villagePage from './village-page'; +import rankingPage from './ranking-page'; const translations = { [NAMESPACES.SERVER_PAGE.COMMON]: common, @@ -11,6 +12,7 @@ const translations = { [NAMESPACES.SERVER_PAGE.VILLAGE_PAGE.INDEX_PAGE]: villagePage, ...playerPage, ...tribePage, + ...rankingPage, }; export default translations; diff --git a/src/libs/i18n/en/server-page/ranking-page/common.ts b/src/libs/i18n/en/server-page/ranking-page/common.ts new file mode 100644 index 0000000..8745dcb --- /dev/null +++ b/src/libs/i18n/en/server-page/ranking-page/common.ts @@ -0,0 +1,20 @@ +const translations = { + pageLayout: { + tabs: { + playerPage: { + indexPage: 'Players', + odPage: 'Players OD', + dailyPage: 'Players daily', + archivePage: 'Past players', + }, + tribePage: { + indexPage: 'Tribes', + odPage: 'Tribes OD', + dailyPage: 'Tribes daily', + archivePage: 'Past tribes', + }, + }, + }, +}; + +export default translations; diff --git a/src/libs/i18n/en/server-page/ranking-page/index.ts b/src/libs/i18n/en/server-page/ranking-page/index.ts new file mode 100644 index 0000000..2ae881d --- /dev/null +++ b/src/libs/i18n/en/server-page/ranking-page/index.ts @@ -0,0 +1,8 @@ +import * as NAMESPACES from '@config/namespaces'; +import common from './common'; + +const translations = { + [NAMESPACES.SERVER_PAGE.RANKING_PAGE.COMMON]: common, +}; + +export default translations; diff --git a/src/libs/i18n/pl/index.ts b/src/libs/i18n/pl/index.ts index ca745ee..5ea5911 100644 --- a/src/libs/i18n/pl/index.ts +++ b/src/libs/i18n/pl/index.ts @@ -4,11 +4,13 @@ import indexPage from './index-page'; import notFoundPage from './not-found-page'; import serverPage from './server-page'; import table from './table'; +import lineChart from './line-chart'; const translations = { [NAMESPACES.COMMON]: common, [NAMESPACES.INDEX_PAGE]: indexPage, [NAMESPACES.NOT_FOUND_PAGE]: notFoundPage, + [NAMESPACES.LINE_CHART]: lineChart, [NAMESPACES.TABLE]: table, ...serverPage, }; diff --git a/src/libs/i18n/pl/server-page/index.ts b/src/libs/i18n/pl/server-page/index.ts index 997d46f..48c3193 100644 --- a/src/libs/i18n/pl/server-page/index.ts +++ b/src/libs/i18n/pl/server-page/index.ts @@ -4,6 +4,7 @@ import indexPage from './index-page'; import playerPage from './player-page'; import tribePage from './tribe-page'; import villagePage from './village-page'; +import rankingPage from './ranking-page'; const translations = { [NAMESPACES.SERVER_PAGE.COMMON]: common, @@ -11,6 +12,7 @@ const translations = { [NAMESPACES.SERVER_PAGE.VILLAGE_PAGE.INDEX_PAGE]: villagePage, ...playerPage, ...tribePage, + ...rankingPage, }; export default translations; diff --git a/src/libs/i18n/pl/server-page/ranking-page/common.ts b/src/libs/i18n/pl/server-page/ranking-page/common.ts new file mode 100644 index 0000000..93b4a39 --- /dev/null +++ b/src/libs/i18n/pl/server-page/ranking-page/common.ts @@ -0,0 +1,20 @@ +const translations = { + pageLayout: { + tabs: { + playerPage: { + indexPage: 'Gracze', + odPage: 'Gracze OD', + dailyPage: 'Gracze dzienne', + archivePage: 'Byli gracze', + }, + tribePage: { + indexPage: 'Plemiona', + odPage: 'Plemiona OD', + dailyPage: 'Plemiona dzienne', + archivePage: 'Byłe plemiona', + }, + }, + }, +}; + +export default translations; diff --git a/src/libs/i18n/pl/server-page/ranking-page/index.ts b/src/libs/i18n/pl/server-page/ranking-page/index.ts new file mode 100644 index 0000000..2ae881d --- /dev/null +++ b/src/libs/i18n/pl/server-page/ranking-page/index.ts @@ -0,0 +1,8 @@ +import * as NAMESPACES from '@config/namespaces'; +import common from './common'; + +const translations = { + [NAMESPACES.SERVER_PAGE.RANKING_PAGE.COMMON]: common, +}; + +export default translations;