diff --git a/src/Faction/ui/CreateGangPopup.tsx b/src/Faction/ui/CreateGangPopup.tsx new file mode 100644 index 000000000..5423d6348 --- /dev/null +++ b/src/Faction/ui/CreateGangPopup.tsx @@ -0,0 +1,58 @@ +/** + * React Component for the popup used to create a new gang. + */ + import React from "react"; + import { removePopup } from "../../ui/React/createPopup"; + import { IPlayer } from "../../PersonObjects/IPlayer"; + import { StdButton } from "../../ui/React/StdButton"; + import { IEngine } from "../../IEngine"; + + interface ICreateGangPopupProps { + popupId: string; + facName: string; + p: IPlayer; + engine: IEngine; + } + + export function CreateGangPopup(props: ICreateGangPopupProps): React.ReactElement { + + const combatGangText = "This is a COMBAT gang. Members in this gang will have different tasks than HACKING gangs. " + + "Compared to hacking gangs, progression with combat gangs can be more difficult as territory management " + + "is more important. However, well-managed combat gangs can progress faster than hacking ones."; + + const hackingGangText = "This is a HACKING gang. Members in this gang will have different tasks than COMBAT gangs. " + + "Compared to combat gangs, progression with hacking gangs is more straightforward as territory warfare " + + "is not as important."; + + function isHacking(): boolean { + return ["NiteSec", "The Black Hand"].includes(props.facName); + } + + function createGang(): void { + props.p.startGang(props.facName, isHacking()); + removePopup(props.popupId); + props.engine.loadGangContent(); + } + + function onKeyUp(event: React.KeyboardEvent): void { + if (event.keyCode === 13) createGang(); + } + + return ( + <> + Would you like to create a new Gang with {props.facName}? +
+
+ Note that this will prevent you from creating a Gang with any other Faction until this BitNode is destroyed. It also resets your reputation with this faction. +
+
+ { (isHacking()) ? hackingGangText : combatGangText } +
+
+ Other than hacking vs combat, there are NO differences between the Factions you can create a Gang with, and each of these Factions have all Augmentations available. +
+ +
+ + ); + } \ No newline at end of file diff --git a/src/Faction/ui/Root.tsx b/src/Faction/ui/Root.tsx index 8b78c5394..0c08c89e4 100644 --- a/src/Faction/ui/Root.tsx +++ b/src/Faction/ui/Root.tsx @@ -19,7 +19,8 @@ import { IPlayer } from "../../PersonObjects/IPlayer"; import { createSleevePurchasesFromCovenantPopup } from "../../PersonObjects/Sleeve/SleeveCovenantPurchases"; import { SourceFileFlags } from "../../SourceFile/SourceFileFlags"; -import { yesNoBoxClose, yesNoBoxCreate, yesNoBoxGetNoButton, yesNoBoxGetYesButton } from "../../../utils/YesNoBox"; +import { createPopup } from "../../ui/React/createPopup"; +import { CreateGangPopup } from "./CreateGangPopup"; type IProps = { engine: IEngine; @@ -97,59 +98,13 @@ export class FactionRoot extends React.Component { return this.props.engine.loadGangContent(); } - // Otherwise, we have to create the gang - const facName = this.props.faction.name; - let isHacking = false; - if (facName === "NiteSec" || facName === "The Black Hand") { - isHacking = true; - } - - // A Yes/No popup box will allow the player to confirm gang creation - const yesBtn = yesNoBoxGetYesButton(); - const noBtn = yesNoBoxGetNoButton(); - if (yesBtn == null || noBtn == null) { - return; - } - - yesBtn.innerHTML = "Create Gang"; - yesBtn.addEventListener("click", () => { - this.props.p.startGang(facName, isHacking); - const worldMenuHeader = document.getElementById("world-menu-header"); - if (worldMenuHeader instanceof HTMLElement) { - worldMenuHeader.click(); - worldMenuHeader.click(); - } - - this.props.engine.loadGangContent(); - yesNoBoxClose(); + const popupId = "create-gang-popup"; + createPopup(popupId, CreateGangPopup, { + popupId: popupId, + facName: this.props.faction.name, + p: this.props.p, + engine: this.props.engine }); - - noBtn.innerHTML = "Cancel"; - noBtn.addEventListener("click", () => { - yesNoBoxClose(); - }); - - // Pop-up text - let gangTypeText = ""; - if (isHacking) { - gangTypeText = - "This is a HACKING gang. Members in this gang will have different tasks than COMBAT gangs. " + - "Compared to combat gangs, progression with hacking gangs is more straightforward as territory warfare " + - "is not as important.

"; - } else { - gangTypeText = - "This is a COMBAT gang. Members in this gang will have different tasks than HACKING gangs. " + - "Compared to hacking gangs, progression with combat gangs can be more difficult as territory management " + - "is more important. However, well-managed combat gangs can progress faster than hacking ones.

"; - } - yesNoBoxCreate( - `Would you like to create a new Gang with ${facName}?

` + - "Note that this will prevent you from creating a Gang with any other Faction until " + - "this BitNode is destroyed. It also resets your reputation with this faction.

" + - gangTypeText + - "Other than hacking vs combat, there are NO differences between the Factions you can " + - "create a Gang with, and each of these Factions have all Augmentations available.", - ); } rerender(): void { diff --git a/src/ui/React/StdButton.tsx b/src/ui/React/StdButton.tsx index dbfd74926..1c07e6e95 100644 --- a/src/ui/React/StdButton.tsx +++ b/src/ui/React/StdButton.tsx @@ -6,9 +6,11 @@ import * as React from "react"; interface IStdButtonProps { addClasses?: string; + autoFocus?: boolean; disabled?: boolean; id?: string; onClick?: (e: React.MouseEvent) => any; + onKeyUp?: (e: React.KeyboardEvent) => any; style?: any; text: string | JSX.Element; tooltip?: string | JSX.Element; @@ -43,7 +45,7 @@ export function StdButton(props: IStdButtonProps): React.ReactElement { } return ( -