.ts
TypeScript
(application/typescript)
// 3rd-party
import React, { useMemo, VFC } from "react";
import styled, { css } from "styled-components";
// app
import type { CommonProps, WithThemeSchemeProp } from "../types";
import { Const } from "../const";
import { NamedColors } from "../utils/style";
// import { ReactMonolithLogo } from "./icons";

interface PageHeaderProps extends CommonProps {}

// const LOGO_HEIGHT = 36;
const SIDE_MENU_WIDTH = 320;

export const PageHeader: VFC<PageHeaderProps & WithThemeSchemeProp> = ({
  commonProps,
  themeScheme,
}) => {
  const invertThemeScheme = themeScheme === "light" ? "dark" : "light";

  const pageHeader = useMemo(() => {
    if (commonProps.authenticated) {
      return (
        <>
          <StyledPageHeaderNav>
            <a aria-label={"Explore Projects"} href={"/explore/projects"}>
              Explore Projects
            </a>
          </StyledPageHeaderNav>
          <StyledActionsArea>
            <a
              href={`/theme/${invertThemeScheme}`}
              style={{ color: NamedColors.TEXT_MUTED[themeScheme] }}
              title={`Click to enable ${
                themeScheme === "light" ? "dark" : "light"
              } mode`}
            >
              {`${themeScheme === "light" ? "Dark" : "Light"} mode`}
            </a>
            <a aria-label={"Log off your account"} href={"/auth/logout"}>
              Logout
            </a>
          </StyledActionsArea>
        </>
      );
    }

    return (
      <>
        <StyledPageHeaderNav>
          <a aria-label={"Explore Projects"} href={"/explore/projects"}>
            Explore Projects
          </a>
        </StyledPageHeaderNav>
        <StyledActionsArea>
          <a
            href={`/theme/${invertThemeScheme}`}
            style={{ color: NamedColors.TEXT_MUTED[themeScheme] }}
            title={`Click to enable ${
              themeScheme === "light" ? "dark" : "light"
            } mode`}
          >
            {`${themeScheme === "light" ? "Dark" : "Light"} mode`}
          </a>
          <a aria-label={"Register a new account"} href={"/auth/register"}>
            Register
          </a>
          <a aria-label={"Login to your account"} href={"/auth/login"}>
            Login
          </a>
        </StyledActionsArea>
      </>
    );
  }, [commonProps.authenticated]);

  return (
    <StyledPageHeader themeScheme={themeScheme}>
      <StyledLogoArea themeScheme={themeScheme}>
        <a href={"/"}>
          {/*<ReactMonolithLogo size={LOGO_HEIGHT} />*/}
          <h1 style={{ margin: 0, marginLeft: 20 }}>{Const.APP_NAME}</h1>
        </a>
      </StyledLogoArea>
      {pageHeader}
    </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 {
    ${({ themeScheme }) => css`
      color: ${NamedColors.TEXT_MUTED[themeScheme]};
    `};
    transition: color 140ms ease-in-out 0s;
    text-decoration: none;

    &:hover {
      ${({ themeScheme }) => css`
        color: ${NamedColors.TEXT_DEFAULT[themeScheme]};
      `};
      text-decoration: underline;
    }
  }
`;

const StyledLogoArea = styled.div<WithThemeSchemeProp>`
  max-width: ${SIDE_MENU_WIDTH}px;
  width: 100%;

  & > 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;

  a {
    font-size: 20px;
    line-height: 24px;
  }
`;

const StyledActionsArea = styled.div`
  display: flex;
  flex-flow: row nowrap;
  justify-content: flex-end;
  align-items: center;

  padding-right: 12px;
`;