import { Form, useLoaderData, useMatches, useSearchParams, } from "@remix-run/react"; import * as React from "react"; import { useTranslation } from "react-i18next"; import { AbilitiesSelector } from "~/components/AbilitiesSelector"; import { Alert } from "~/components/Alert"; import { SendouButton } from "~/components/elements/Button"; import { FormMessage } from "~/components/FormMessage"; import { GearSelect } from "~/components/GearSelect"; import { Image } from "~/components/Image"; import { CrossIcon } from "~/components/icons/Cross"; import { PlusIcon } from "~/components/icons/Plus"; import { Label } from "~/components/Label"; import { Main } from "~/components/Main"; import { RequiredHiddenInput } from "~/components/RequiredHiddenInput"; import { SubmitButton } from "~/components/SubmitButton"; import { WeaponSelect } from "~/components/WeaponSelect"; import type { GearType } from "~/db/tables"; import { validatedBuildFromSearchParams, validatedWeaponIdFromSearchParams, } from "~/features/build-analyzer"; import { BUILD } from "~/features/builds/builds-constants"; import { modesShort, rankedModesShort } from "~/modules/in-game-lists/modes"; import type { BuildAbilitiesTupleWithUnknown, MainWeaponId, } from "~/modules/in-game-lists/types"; import invariant from "~/utils/invariant"; import type { SendouRouteHandle } from "~/utils/remix.server"; import { modeImageUrl } from "~/utils/urls"; import { action } from "../actions/u.$identifier.builds.new.server"; import { loader } from "../loaders/u.$identifier.builds.new.server"; import type { UserPageLoaderData } from "../loaders/u.$identifier.server"; export { loader, action }; export const handle: SendouRouteHandle = { i18n: ["weapons", "builds", "gear"], }; export default function NewBuildPage() { const { buildToEdit } = useLoaderData(); const [, parentRoute] = useMatches(); invariant(parentRoute); const layoutData = parentRoute.data as UserPageLoaderData; const { t } = useTranslation(["builds", "common"]); const [searchParams] = useSearchParams(); const [abilities, setAbilities] = React.useState( buildToEdit?.abilities ?? validatedBuildFromSearchParams(searchParams), ); if (layoutData.user.buildsCount >= BUILD.MAX_COUNT) { return (
{t("builds:reachBuildMaxCount")}
); } return (
{buildToEdit && ( )} {t("builds:forms.noGear.info")}
{/* spacer */} {t("common:actions.submit")}
); } function TitleInput() { const { t } = useTranslation("builds"); const { buildToEdit } = useLoaderData(); return (
); } function DescriptionTextarea() { const { t } = useTranslation(); const { buildToEdit } = useLoaderData(); const [value, setValue] = React.useState(buildToEdit?.description ?? ""); return (