setShowPlayDropdown(true)}
@@ -233,6 +233,16 @@ export const Header: React.FC = () => {
BROADCASTS
)}
+
+ CANDIDATES
+
setShowMoreDropdown(true)}
@@ -415,6 +425,16 @@ export const Header: React.FC = () => {
Broadcasts
+
+ Candidates
+
Leaderboard
diff --git a/src/components/Common/PlaySetupModal.tsx b/src/components/Common/PlaySetupModal.tsx
index 5c518b24..0d394594 100644
--- a/src/components/Common/PlaySetupModal.tsx
+++ b/src/components/Common/PlaySetupModal.tsx
@@ -82,11 +82,35 @@ interface Props {
sampleMoves?: boolean
simulateMaiaTime?: boolean
startFen?: string
+ returnTo?: string
+ challengeId?: string
+ forcedPlayerColor?: Color
+ modalTitle?: string
+ modalSubtitle?: string
}
export const PlaySetupModal: React.FC
= (props: Props) => {
const { setPlaySetupModalProps } = useContext(ModalContext)
- const { push } = useRouter()
+ const router = useRouter()
+ const { push } = router
+
+ const dismissModal = useCallback(() => {
+ setPlaySetupModalProps(undefined)
+
+ if (
+ props.returnTo &&
+ router.pathname === '/play' &&
+ router.asPath !== props.returnTo
+ ) {
+ push(props.returnTo)
+ }
+ }, [
+ props.returnTo,
+ push,
+ router.asPath,
+ router.pathname,
+ setPlaySetupModalProps,
+ ])
const [timeControl, setTimeControl] = useState(
props.timeControl || TimeControlOptions[0],
@@ -118,9 +142,22 @@ export const PlaySetupModal: React.FC = (props: Props) => {
const [fen, setFen] = useState(
props.startFen ? props.startFen : undefined,
)
+ const forcedPlayerColor = props.forcedPlayerColor
+ const colorSelectionLocked = forcedPlayerColor !== undefined
+ const positionLocked = forcedPlayerColor !== undefined
const [openMoreOptions, setMoreOptionsOpen] = useState(true)
const compactHandBrainLayout = props.playType === 'handAndBrain'
+ const modalTitle =
+ props.modalTitle ||
+ (props.playType == 'againstMaia'
+ ? 'Play Against Maia'
+ : 'Play Hand and Brain')
+ const modalSubtitle =
+ props.modalSubtitle ||
+ (props.playType == 'againstMaia'
+ ? 'Configure your game settings and choose your side'
+ : 'Team up with Maia in Hand and Brain chess')
const handlePresetSelect = useCallback((preset: TimeControl) => {
setTimeControl(preset)
@@ -156,7 +193,16 @@ export const PlaySetupModal: React.FC = (props: Props) => {
const start = useCallback(
(color: Color | undefined) => {
+ if (
+ forcedPlayerColor &&
+ color !== undefined &&
+ color !== forcedPlayerColor
+ ) {
+ return
+ }
+
const player = color ?? ['white', 'black'][Math.floor(Math.random() * 2)]
+ const resolvedPlayer = forcedPlayerColor ?? player
if (fen && !new Chess().validateFen(fen).valid) {
toast.error('Invalid Starting FEN provided')
@@ -169,20 +215,25 @@ export const PlaySetupModal: React.FC = (props: Props) => {
push({
pathname: '/play/maia',
query: {
- player: player,
+ player: resolvedPlayer,
//maiaPartnerVersion: maiaPartnerVersion,
maiaVersion: maiaVersion,
timeControl: timeControl,
sampleMoves: sampleMoves,
simulateMaiaTime: simulateMaiaTime,
startFen: fen,
+ returnTo: props.returnTo,
+ challengeId: props.challengeId,
+ forcedColor: forcedPlayerColor,
+ modalTitle: props.modalTitle,
+ modalSubtitle: props.modalSubtitle,
},
})
} else {
push({
pathname: '/play/hb',
query: {
- player: player,
+ player: resolvedPlayer,
maiaPartnerVersion: maiaPartnerVersion,
maiaVersion: maiaVersion,
timeControl: timeControl,
@@ -204,13 +255,18 @@ export const PlaySetupModal: React.FC = (props: Props) => {
sampleMoves,
simulateMaiaTime,
fen,
+ forcedPlayerColor,
isBrain,
+ props.challengeId,
+ props.modalSubtitle,
+ props.modalTitle,
+ props.returnTo,
],
)
return (
- setPlaySetupModalProps(undefined)}>
+
= (props: Props) => {
@@ -242,16 +298,8 @@ export const PlaySetupModal: React.FC = (props: Props) => {
compactHandBrainLayout ? 'px-4 py-3' : 'p-4'
}`}
>
-
- {props.playType == 'againstMaia'
- ? 'Play Against Maia'
- : 'Play Hand and Brain'}
-
-
- {props.playType == 'againstMaia'
- ? 'Configure your game settings and choose your side'
- : 'Team up with Maia in Hand and Brain chess'}
-
+ {modalTitle}
+ {modalSubtitle}
{/* Settings Section */}
@@ -297,7 +345,7 @@ export const PlaySetupModal: React.FC
= (props: Props) => {