Skip to content

Commit

Permalink
Adds support for outlaw, 4 slot spray system.
Browse files Browse the repository at this point in the history
  • Loading branch information
zachrip committed Jan 9, 2024
1 parent 4588e38 commit 9ee2200
Show file tree
Hide file tree
Showing 17 changed files with 384 additions and 86 deletions.
29 changes: 18 additions & 11 deletions app/routes/loadouts/$loadoutId.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,16 +45,16 @@ export const action = async ({ request, params }: LoaderArgs) => {
const { name, agents } = updateSchema.parse(formData);

loadout.name = name;
(loadout.agentIds = Object.entries(agents || {}).reduce<Array<string>>(
loadout.agentIds = Object.entries(agents || {}).reduce<Array<string>>(
(acc, next) => {
if (next[1]) {
acc.push(next[0]);
}
return acc;
},
[]
)),
await saveUserConfig(user.userId, config);
);
await saveUserConfig(user.userId, config);
return redirect(`/loadouts/${loadoutId}`);
}
default: {
Expand Down Expand Up @@ -105,22 +105,29 @@ export const loader = async ({ params }: LoaderArgs) => {
(id) => valorantData.playerTitles.find((title) => title.uuid === id)!
),
sprays: {
preRound: (loadout.sprayIds.preRound.length
? loadout.sprayIds.preRound
top: (loadout.sprayIds.top.length
? loadout.sprayIds.top
: ['0a6db78c-48b9-a32d-c47a-82be597584c1']
).map(
(sprayId) =>
valorantData.sprays.find((spray) => spray.uuid === sprayId)!
),
midRound: (loadout.sprayIds.midRound.length
? loadout.sprayIds.midRound
right: (loadout.sprayIds.right.length
? loadout.sprayIds.right
: ['0a6db78c-48b9-a32d-c47a-82be597584c1']
).map(
(sprayId) =>
valorantData.sprays.find((spray) => spray.uuid === sprayId)!
),
postRound: (loadout.sprayIds.postRound.length
? loadout.sprayIds.postRound
bottom: (loadout.sprayIds.bottom.length
? loadout.sprayIds.bottom
: ['0a6db78c-48b9-a32d-c47a-82be597584c1']
).map(
(sprayId) =>
valorantData.sprays.find((spray) => spray.uuid === sprayId)!
),
left: (loadout.sprayIds.left.length
? loadout.sprayIds.left
: ['0a6db78c-48b9-a32d-c47a-82be597584c1']
).map(
(sprayId) =>
Expand Down Expand Up @@ -406,9 +413,9 @@ export default function Index() {
gridTemplateAreas: `
"sidearm smg rifle sniper"
"sidearm smg rifle sniper"
"sidearm shotgun rifle sniper"
"sidearm shotgun rifle heavy"
"sidearm shotgun rifle heavy"
"sidearm . . melee"
"sidearm melee . heavy"
`,
}}
>
Expand Down
1 change: 0 additions & 1 deletion app/routes/loadouts/$loadoutId/playercards/add.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ export async function action({ request, params }: ActionArgs) {
};

await saveUserConfig(user.userId, {
currentLoadout: userConfig.currentLoadout,
loadouts: [
...userConfig.loadouts.filter((l) => l.id !== loadoutId),
newLoadout,
Expand Down
1 change: 0 additions & 1 deletion app/routes/loadouts/$loadoutId/playertitles/add.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ export async function action({ request, params }: ActionArgs) {
};

await saveUserConfig(user.userId, {
currentLoadout: userConfig.currentLoadout,
loadouts: [
...userConfig.loadouts.filter((l) => l.id !== loadoutId),
newLoadout,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export async function action({ request, params }: ActionArgs) {
...loadout,
sprayIds: {
...loadout.sprayIds,
preRound: Object.entries(out.sprays || {}).reduce<Array<string>>(
bottom: Object.entries(out.sprays || {}).reduce<Array<string>>(
(acc, next) => {
if (next[1]) {
acc.push(next[0]);
Expand All @@ -55,7 +55,6 @@ export async function action({ request, params }: ActionArgs) {
};

await saveUserConfig(user.userId, {
currentLoadout: userConfig.currentLoadout,
loadouts: [
...userConfig.loadouts.filter((l) => l.id !== loadoutId),
newLoadout,
Expand Down Expand Up @@ -87,7 +86,7 @@ export async function loader({ params }: LoaderArgs) {

const entitlements = await user.getEntitlements();

const selectedSprays = loadout.sprayIds.preRound;
const selectedSprays = loadout.sprayIds.bottom;
const ownedSprays = valorantData.sprays
.filter((spray) =>
entitlements.spray.some(
Expand All @@ -102,7 +101,7 @@ export async function loader({ params }: LoaderArgs) {
});
}

export default function AddPreroundSpray() {
export default function AddBottomSpray() {
const { ownedSprays, selectedSprays } = useLoaderData<typeof loader>();
const navigate = useNavigate();
const params = useParams();
Expand All @@ -117,7 +116,7 @@ export default function AddPreroundSpray() {
<DialogPrimitive.Overlay className="bg-black/60 fixed top-0 left-0 right-0 bottom-0 grid place-items-center">
<DialogPrimitive.Content className="w-full max-w-3xl h-3/5 overflow-auto p-4 bg-slate-700 rounded-md">
<DialogPrimitive.Title className="text-2xl">
Select Preround Sprays
Select Bottom Sprays
</DialogPrimitive.Title>
<Form
method="post"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export async function action({ request, params }: ActionArgs) {
...loadout,
sprayIds: {
...loadout.sprayIds,
midRound: Object.entries(out.sprays || {}).reduce<Array<string>>(
left: Object.entries(out.sprays || {}).reduce<Array<string>>(
(acc, next) => {
if (next[1]) {
acc.push(next[0]);
Expand All @@ -55,7 +55,6 @@ export async function action({ request, params }: ActionArgs) {
};

await saveUserConfig(user.userId, {
currentLoadout: userConfig.currentLoadout,
loadouts: [
...userConfig.loadouts.filter((l) => l.id !== loadoutId),
newLoadout,
Expand Down Expand Up @@ -87,7 +86,7 @@ export async function loader({ params }: LoaderArgs) {

const entitlements = await user.getEntitlements();

const selectedSprays = loadout.sprayIds.midRound;
const selectedSprays = loadout.sprayIds.left;
const ownedSprays = valorantData.sprays
.filter((spray) =>
entitlements.spray.some(
Expand All @@ -103,7 +102,7 @@ export async function loader({ params }: LoaderArgs) {
});
}

export default function AddMidroundSpray() {
export default function AddLeftSpray() {
const { ownedSprays, selectedSprays } = useLoaderData<typeof loader>();
const navigate = useNavigate();
const params = useParams();
Expand All @@ -118,7 +117,7 @@ export default function AddMidroundSpray() {
<DialogPrimitive.Overlay className="bg-black/60 fixed top-0 left-0 right-0 bottom-0 grid place-items-center">
<DialogPrimitive.Content className="w-full max-w-3xl h-3/5 overflow-auto p-4 bg-slate-700 rounded-md">
<DialogPrimitive.Title className="text-2xl">
Select Midround Sprays
Select Left Sprays
</DialogPrimitive.Title>
<Form
method="post"
Expand Down
168 changes: 168 additions & 0 deletions app/routes/loadouts/$loadoutId/sprays/right.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
import {
Form,
useLoaderData,
useNavigate,
useParams,
useSubmit,
} from '@remix-run/react';
import * as DialogPrimitive from '@radix-ui/react-dialog';
import type { Loadout } from '~/utils';
import type { ActionArgs, LoaderArgs } from '@remix-run/node';
import { json, redirect } from '@remix-run/node';
import { getUser, getUserConfig, saveUserConfig } from '~/utils.server';
import { zfd } from 'zod-form-data';
import { z } from 'zod';

const schema = zfd.formData({
sprays: z.record(z.string(), zfd.checkbox()).optional(),
});

export async function action({ request, params }: ActionArgs) {
const user = await getUser();
if (!user) {
return redirect('/login');
}

const { loadoutId } = params;

const userConfig = await getUserConfig(user.userId);
const loadout = userConfig.loadouts.find(
(loadout) => loadout.id === loadoutId
);

if (!loadout) {
return redirect('/loadouts');
}

const formData = await request.formData();

const out = schema.parse(formData);

const newLoadout: Loadout = {
...loadout,
sprayIds: {
...loadout.sprayIds,
right: Object.entries(out.sprays || {}).reduce<Array<string>>(
(acc, next) => {
if (next[1]) {
acc.push(next[0]);
}
return acc;
},
[]
),
},
};

await saveUserConfig(user.userId, {
loadouts: [
...userConfig.loadouts.filter((l) => l.id !== loadoutId),
newLoadout,
],
});

return json({
success: true,
});
}

export async function loader({ params }: LoaderArgs) {
const user = await getUser();

if (!user) {
return redirect('/login');
}

const { loadoutId } = params;

const userConfig = await getUserConfig(user.userId);
const loadout = userConfig.loadouts.find(
(loadout) => loadout.id === loadoutId
);

if (!loadout) {
return redirect('/loadouts');
}

const entitlements = await user.getEntitlements();

const selectedSprays = loadout.sprayIds.right;
const ownedSprays = valorantData.sprays
.filter((spray) =>
entitlements.spray.some(
(entitlement) => entitlement.ItemID === spray.uuid
)
)
.filter((spray) => spray.category !== 'EAresSprayCategory::Contextual')
.sort((a, b) => a.displayName.localeCompare(b.displayName));

return json({
selectedSprays,
ownedSprays,
});
}

export default function AddRightSpray() {
const { ownedSprays, selectedSprays } = useLoaderData<typeof loader>();
const navigate = useNavigate();
const params = useParams();
const submit = useSubmit();

return (
<DialogPrimitive.Root
open
onOpenChange={() => navigate(`/loadouts/${params.loadoutId}`)}
>
<DialogPrimitive.Portal>
<DialogPrimitive.Overlay className="bg-black/60 fixed top-0 left-0 right-0 bottom-0 grid place-items-center">
<DialogPrimitive.Content className="w-full max-w-3xl h-3/5 overflow-auto p-4 bg-slate-700 rounded-md">
<DialogPrimitive.Title className="text-2xl">
Select Right Sprays
</DialogPrimitive.Title>
<Form
method="post"
onChange={(e) => {
submit(e.currentTarget, {
replace: true,
});
}}
>
<div className="grid grid-cols-4 gap-2 mt-2">
{ownedSprays.map((spray) => (
<div key={spray.uuid}>
<input
id={spray.uuid}
name={`sprays[${spray.uuid}]`}
type="checkbox"
className="hidden peer"
defaultChecked={selectedSprays.includes(spray.uuid)}
/>
<label
htmlFor={spray.uuid}
className="block w-full h-full p-2 peer-checked:bg-slate-500 hover:bg-slate-500 rounded-md"
>
<div className="w-full aspect-square">
<img
className="w-full h-full object-contain"
src={
spray.animationGif ||
spray.fullTransparentIcon ||
spray.displayIcon
}
alt={spray.displayName}
/>
</div>
<h2 className="text-sm text-white font-bold text-center whitespace-nowrap overflow-hidden text-ellipsis mt-2">
{spray.displayName.slice(0, -6)}
</h2>
</label>
</div>
))}
</div>
</Form>
</DialogPrimitive.Content>
</DialogPrimitive.Overlay>
</DialogPrimitive.Portal>
</DialogPrimitive.Root>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export async function action({ request, params }: ActionArgs) {
...loadout,
sprayIds: {
...loadout.sprayIds,
postRound: Object.entries(out.sprays || {}).reduce<Array<string>>(
top: Object.entries(out.sprays || {}).reduce<Array<string>>(
(acc, next) => {
if (next[1]) {
acc.push(next[0]);
Expand All @@ -55,7 +55,6 @@ export async function action({ request, params }: ActionArgs) {
};

await saveUserConfig(user.userId, {
currentLoadout: userConfig.currentLoadout,
loadouts: [
...userConfig.loadouts.filter((l) => l.id !== loadoutId),
newLoadout,
Expand Down Expand Up @@ -87,7 +86,7 @@ export async function loader({ params }: LoaderArgs) {

const entitlements = await user.getEntitlements();

const selectedSprays = loadout.sprayIds.postRound;
const selectedSprays = loadout.sprayIds.top;
const ownedSprays = valorantData.sprays
.filter((spray) =>
entitlements.spray.some(
Expand All @@ -102,7 +101,7 @@ export async function loader({ params }: LoaderArgs) {
});
}

export default function AddPostroundSpray() {
export default function AddTopSpray() {
const { ownedSprays, selectedSprays } = useLoaderData<typeof loader>();
const navigate = useNavigate();
const params = useParams();
Expand All @@ -117,7 +116,7 @@ export default function AddPostroundSpray() {
<DialogPrimitive.Overlay className="bg-black/60 fixed top-0 left-0 right-0 bottom-0 grid place-items-center">
<DialogPrimitive.Content className="w-full max-w-3xl h-3/5 overflow-auto p-4 bg-slate-700 rounded-md">
<DialogPrimitive.Title className="text-2xl">
Select Postround Sprays
Select Top Sprays
</DialogPrimitive.Title>
<Form
method="post"
Expand Down
Loading

0 comments on commit 9ee2200

Please sign in to comment.