diff --git a/pageComponents/NewPostPage/GameTypeSelect.tsx b/pageComponents/NewPostPage/GameTypeSelect.tsx new file mode 100644 index 0000000..5ec75a8 --- /dev/null +++ b/pageComponents/NewPostPage/GameTypeSelect.tsx @@ -0,0 +1,23 @@ +import * as React from "react"; +import Select, { Option } from "../../components/Select"; +import { GameType } from "../../models/GameSituation"; + +interface Props extends React.Attributes { + defaultValue?: string; + onChange?: (e: React.ChangeEvent, value: string) => void; + className?: string; + style?: React.CSSProperties; +} + +export default function GameTypeSelect({ + defaultValue, + onChange, + ...props +}: Props) { + return ( + + ); +} diff --git a/pageComponents/NewPostPage/HeroPositionSelect.tsx b/pageComponents/NewPostPage/HeroPositionSelect.tsx new file mode 100644 index 0000000..b909bfc --- /dev/null +++ b/pageComponents/NewPostPage/HeroPositionSelect.tsx @@ -0,0 +1,32 @@ +import * as React from "react"; +import Select, { Option } from "../../components/Select"; +import { POSITION_CORRESPONDENCE_EACH_PLAYER_LENGTH } from "../../utilities/getPositionByPlayerAndIndex"; + +interface Props extends React.Attributes { + playerLength: number; + onChange?: (e: React.ChangeEvent, value: string) => void; + className?: string; + style?: React.CSSProperties; +} + +export default function HeroPositionSelect({ + playerLength, + onChange, + ...props +}: Props) { + const [positions, setPositions] = React.useState( + POSITION_CORRESPONDENCE_EACH_PLAYER_LENGTH.get(2) + ); + + React.useEffect(() => { + setPositions(POSITION_CORRESPONDENCE_EACH_PLAYER_LENGTH.get(playerLength)); + }, [playerLength]); + + return ( + + ); +} diff --git a/pageComponents/NewPostPage/NewPostPage.tsx b/pageComponents/NewPostPage/NewPostPage.tsx new file mode 100644 index 0000000..8b6db74 --- /dev/null +++ b/pageComponents/NewPostPage/NewPostPage.tsx @@ -0,0 +1,55 @@ +import * as React from "react"; +import styled from "styled-components"; +import FootBar from "../../components/FootBar"; +import HeadBar from "../../components/HeadBar"; +import { MOBILE_MEDIA } from "../../constants/mediaquery"; +import useAuthentication from "../../hooks/useAuthentication"; +import useRepository from "../../hooks/useRepository"; + +export default function NewPostPage() { + const { user, isFirstChecking, signIn, signOut } = useAuthentication(); + const { logEvent } = useRepository(); + + return ( + + signIn(objectId)} + onSignOutButtonClick={() => signOut()} + /> + + + Create a New Post + + + logEvent("contact", { objectId })} + /> + + ); +} + +const Root = styled.div``; + +const Content = styled.section` + box-sizing: border-box; + max-width: 1280px; + min-width: 375px; + margin: 0 auto; + padding: 0 128px 128px; + + ${MOBILE_MEDIA} { + margin: 0; + padding: 0 16px 64px; + } +`; + +const Headline = styled.h2` + margin-bottom: 32px; + font-size: 32px; + + ${MOBILE_MEDIA} { + font-size: 24px; + } +`; diff --git a/pageComponents/NewPostPage/PlayerActionSelectors.tsx b/pageComponents/NewPostPage/PlayerActionSelectors.tsx new file mode 100644 index 0000000..cdca4d5 --- /dev/null +++ b/pageComponents/NewPostPage/PlayerActionSelectors.tsx @@ -0,0 +1,85 @@ +import * as React from "react"; +import styled from "styled-components"; +import StreetActionSelector from "../../components/StreetActionSelector"; +import { MOBILE_MEDIA } from "../../constants/mediaquery"; +import { + GameStreetAction, + GameStreetActionType, +} from "../../models/GameSituation"; + +interface Props extends React.Attributes { + playerActions: { + position: string; + gameStreetAction: GameStreetAction; + tableMaxBetSize: number; + previousBetSize: number; + }[]; + onChange?: ( + index: number, + type: GameStreetActionType, + betSize: number + ) => void; +} + +export default function PlayerActionSelectors({ + playerActions, + onChange = () => undefined, +}: Props) { + return ( + + {playerActions.map( + ({ position, tableMaxBetSize, previousBetSize }, index) => ( + + {`${position}:`} + + onChange(index, type, betSize)} + /> + + ) + )} + + ); +} + +const Root = styled.div` + display: inline-flex; + flex-direction: column; +`; + +const PlayerAction = styled.div` + display: flex; + flex-direction: row; + margin-bottom: 8px; + + &:last-child { + margin-bottom: 0; + } + + & > span { + box-sizing: border-box; + display: flex; + width: 72px; + align-items: center; + justify-content: flex-end; + margin-right: 16px; + } + + ${MOBILE_MEDIA} { + flex-direction: column; + width: inherit; + + & > span { + box-sizing: content-box; + display: block; + margin: 0 0 4px 0; + width: inherit; + } + } +`; + +const SmallTitle = styled.span` + font-family: inherit; +`; diff --git a/pageComponents/NewPostPage/PlayerLengthSelect.tsx b/pageComponents/NewPostPage/PlayerLengthSelect.tsx new file mode 100644 index 0000000..88e0341 --- /dev/null +++ b/pageComponents/NewPostPage/PlayerLengthSelect.tsx @@ -0,0 +1,29 @@ +import * as React from "react"; +import Select, { Option } from "../../components/Select"; + +interface Props extends React.Attributes { + defaultValue?: string; + onChange?: (e: React.ChangeEvent, value: string) => void; + className?: string; + style?: React.CSSProperties; +} + +export default function PlayerLengthSelect({ + defaultValue, + onChange, + ...props +}: Props) { + return ( + + ); +} diff --git a/pageComponents/NewPostPage/index.ts b/pageComponents/NewPostPage/index.ts new file mode 100644 index 0000000..587aa31 --- /dev/null +++ b/pageComponents/NewPostPage/index.ts @@ -0,0 +1 @@ +export { default } from "./NewPostPage"; diff --git a/pages/posts/new.tsx b/pages/posts/new.tsx new file mode 100644 index 0000000..61347b6 --- /dev/null +++ b/pages/posts/new.tsx @@ -0,0 +1,15 @@ +import Head from "next/head"; +import * as React from "react"; +import NewPostPage from "../../pageComponents/NewPostPage"; + +export default function Page() { + return ( + <> + + New Post | Chipstackoverflow + + + + + ); +} diff --git a/utilities/getPositionByPlayerAndIndex.ts b/utilities/getPositionByPlayerAndIndex.ts index 787c51a..09557ae 100644 --- a/utilities/getPositionByPlayerAndIndex.ts +++ b/utilities/getPositionByPlayerAndIndex.ts @@ -27,7 +27,7 @@ enum PlayerPosition { btn = "BTN", } -const POSITION_CORRESPONDENCE_EACH_PLAYER_LENGTH = new Map([ +export const POSITION_CORRESPONDENCE_EACH_PLAYER_LENGTH = new Map([ [2, [PlayerPosition.sb, PlayerPosition.bb]], [3, [PlayerPosition.sb, PlayerPosition.bb, PlayerPosition.utg]], [