import React, { useMemo, VFC } from "react";
import styled, { css } from "styled-components";
import type { CommonProps, WithThemeSchemeProp } from "../types";
import { AppRoute } from "../routes.defs";
import { Const } from "../const";
import { NamedColors } from "../utils/style";
import { buildRouteLink } from "../utils/shared";
interface PageHeaderProps extends CommonProps {}
export const PageHeader: VFC<PageHeaderProps & WithThemeSchemeProp> = ({
commonProps,
themeScheme,
}) => {
const invertThemeScheme = themeScheme === "light" ? "dark" : "light";
const pageHeaderActions = useMemo(() => {
if (commonProps.authenticated) {
return (
<>
<a
aria-label={"View your profile and repositories"}
href={buildRouteLink(
AppRoute.USER_DETAILS,
{
username: commonProps.currentUserUsername || "ghost",
},
{ encodeURIComponent: false }
)}
>
{commonProps.currentUserUsername || "ghost"}
</a>
<a
aria-label={"Log off your account"}
href={buildRouteLink(AppRoute.AUTH_LOGOUT_ACTION, null)}
>
Logout
</a>
</>
);
}
return (
<>
<a
aria-label={"Register a new account"}
href={buildRouteLink(AppRoute.AUTH_REGISTER, null)}
>
Register
</a>
<a
aria-label={"Login to your account"}
href={buildRouteLink(AppRoute.AUTH_LOGIN, null)}
>
Login
</a>
</>
);
}, [commonProps.authenticated]);
return (
<StyledPageHeader themeScheme={themeScheme}>
<StyledLogoArea themeScheme={themeScheme}>
<a href={"/"}>
<h1 style={{ margin: 0, marginLeft: 20 }}>{Const.APP_NAME}</h1>
</a>
</StyledLogoArea>
<StyledPageHeaderNav>
<a
aria-label={"Explore Repositories"}
href={buildRouteLink(AppRoute.REPOSITORY_EXPLORE, null)}
>
Explore Repositories
</a>
</StyledPageHeaderNav>
<StyledActionsArea>
{commonProps.authenticated && (
<a
aria-label={"Create a new Repository"}
href={buildRouteLink(AppRoute.REPOSITORY_CREATE, null)}
>
New Repository
</a>
)}
<a
aria-label={`Switch to ${
themeScheme === "light" ? "dark" : "light"
} theme`}
data-smooth-scroll={"disabled"}
href={buildRouteLink(AppRoute.THEME_SET_SCHEME_ACTION, {
themeScheme: invertThemeScheme,
})}
style={{ color: NamedColors.TEXT_MUTED[themeScheme] }}
title={`Click to enable ${
themeScheme === "light" ? "dark" : "light"
} mode`}
>
{`${themeScheme === "light" ? "Dark" : "Light"} mode`}
</a>
{pageHeaderActions}
</StyledActionsArea>
</StyledPageHeader>
);
};
const StyledPageHeader = styled.header<WithThemeSchemeProp>`
display: flex;
flex-flow: row nowrap;
justify-content: flex-start;
align-items: center;
height: 100%;
width: 100%;
gap: 16px;
& a {
transition: color 140ms ease-in-out 0s;
text-decoration: none;
${({ themeScheme }) => css`
color: ${NamedColors.TEXT_MUTED[themeScheme]};
`};
&:hover {
${({ themeScheme }) => css`
color: ${NamedColors.TEXT_DEFAULT[themeScheme]};
`};
text-decoration: underline;
}
}
`;
const StyledLogoArea = styled.div<WithThemeSchemeProp>`
& > a {
display: flex;
flex-flow: row nowrap;
justify-content: flex-start;
align-items: center;
${({ themeScheme }) => css`
color: ${NamedColors.TEXT_DEFAULT[themeScheme]};
`};
}
`;
const StyledPageHeaderNav = styled.nav`
display: flex;
flex-flow: row nowrap;
justify-content: flex-start;
align-items: center;
flex: 1;
height: 100%;
width: 100%;
gap: 24px;
margin-left: 4px;
`;
const StyledActionsArea = styled.div`
display: flex;
flex-flow: row nowrap;
justify-content: flex-end;
align-items: center;
padding-right: 12px;
& > a {
margin-left: 12px;
}
`;