import { getSession } from "~/sessions"; import { getMe } from "~/utils"; import { Link, useLoaderData, useTransition } from "@remix-run/react"; import { prisma } from "~/db.server"; import { Form } from "@remix-run/react"; import { json } from "@remix-run/node"; import { County } from "~/components/County"; import { AuthenticityTokenInput, useAuthenticityToken, verifyAuthenticityToken, } from "remix-utils"; import { useState } from "react"; const countys = [ "Ahvenanmaa", "Etelä-Karjala", "Etelä-Pohjanmaa", "Kainuu", "Kanta-Häme", "Keski-Pohjanmaa", "Keski-Suomi", "Kymenlaakso", "Lappi", "Pirkanmaa", "Pohjanmaa", "Pohjois-Karjala", "Pohjois-Pohjanmaa", "Pohjois-Savo", "Päijat-Häme", "Satakunta", "Uusimaa", "Varsinais-Suomi", ]; export async function action({ request }) { const session = await getSession(request.headers.get("Cookie")); try { await verifyAuthenticityToken(request, session); } catch { throw new Error("something went wrong"); } const formData = await request.formData(); const county = formData.get("county"); if (!county || typeof county !== "string" || !countys.includes(county)) throw new Error("bad county"); if (!session.has("userId")) throw new Error("OAuth token not found in cookie"); const me = await getMe(session.get("userId")); const selfData = await prisma.player.findUnique({ where: { playerId: parseInt(me.id), }, }); if (selfData) { throw new Error("Already submitted"); } const countySubmit = prisma.county.upsert({ where: { name: county, }, update: { players: { create: { playerId: parseInt(me.id), playerName: me.username, score: String(me.statistics.ranked_score), rank: me.statistics.global_rank ? parseInt(me.statistics.global_rank) : null, SSranks: parseInt(me.statistics.grade_counts.ss) + parseInt(me.statistics.grade_counts.ssh), Sranks: parseInt(me.statistics.grade_counts.s) + parseInt(me.statistics.grade_counts.sh), Aranks: parseInt(me.statistics.grade_counts.a), }, }, }, create: { name: county, players: { create: { playerId: parseInt(me.id), playerName: me.username, score: String(me.statistics.ranked_score), rank: me.statistics.global_rank ? parseInt(me.statistics.global_rank) : null, SSranks: parseInt(me.statistics.grade_counts.ss) + parseInt(me.statistics.grade_counts.ssh), Sranks: parseInt(me.statistics.grade_counts.s) + parseInt(me.statistics.grade_counts.sh), Aranks: parseInt(me.statistics.grade_counts.a), }, }, }, }); return countySubmit; } export async function loader({ request }) { const url = new URL(request.url); const toSort = url.searchParams.get("toSort"); const type = url.searchParams.get("type"); const countyData = await prisma.county.findMany({ include: { players: { orderBy: { [toSort ? toSort : "rank"]: type ? type : "asc", }, }, }, }); const session = await getSession(request.headers.get("Cookie")); if (!session.has("userId")) return json({ countyData, linkParams: { id: process.env.OSU_CLIENT_ID, uri: process.env.OSU_REDIRECT_URI, }, }); const me = await getMe(session.get("userId")); const selfData = await prisma.player.findUnique({ where: { playerId: parseInt(me.id), }, }); return json({ me, countyData, selfData }); } export default function Index() { const [form, setForm] = useState(); const data = useLoaderData(); const transition = useTransition(); return (

Maakunta ranking

made by Juunas
{data.me ? (
me

{data.me.username}

{data.selfData ? (
setForm("us")} method="post" className="text-sky-400 hover:text-sky-600 hover:underline" action="/update" > ) : ( "" )}
setForm("lo")} method="post" className="text-sky-400 hover:text-sky-600 hover:underline" action="/logout" >
) : ( Authenticate with osu! account )}
{data?.me?.username ? ( data.selfData ? (

Kiitos, että osallistuit maakunta rankingiin!

) : (
) ) : ( "" )} {data.countyData.length > 0 ? ( <>
    {data.countyData.map((county) => ( ))}
) : (

No data yet

)}
); }