import { Schema as S } from "@effect/schema"; import { Login } from "common/api"; import { useId, useMemo, useRef } from "preact/hooks"; import { useStore } from "../store"; import * as style from "./Login.css"; import { Effect, Fiber, Option as O, pipe } from "effect"; export default () => { const loginUsername = useStore(state => state.loginUsername); const loginPassword = useStore(state => state.loginPassword); const setLoginUsername = useStore(state => state.setLoginUsername); const setLoginPassword = useStore(state => state.setLoginPassword); const setUser = useStore(state => state.setUser); const usernameId = useId(); const passwordId = useId(); const requestFiber = useRef | null>(null); const requestEffect = useMemo(() => Effect.gen(function* () { const requestData = Login.props.request.schema.make({ username: loginUsername, password: loginPassword }); const requestJson = yield* pipe( requestData, S.encode(Login.props.request.schema), Effect.map(JSON.stringify), Effect.orDie, ); const res = yield* Effect.promise((signal) => fetch("http://localhost:3000/login", { method: "POST", body: requestJson, headers: { "Content-Type": "application/json" }, signal, })); if (!res.ok) { yield* Effect.die(new Error("Response was not ok")); } const responseData = yield* pipe( Effect.promise(() => res.json()), Effect.flatMap(S.decodeUnknown(Login.props.response[200].schema)), Effect.orDie, ); setLoginUsername(""); setLoginPassword(""); setUser(O.some(responseData)); const a = document.createElement("a"); a.href = "/"; a.click(); }), [loginUsername, loginPassword]); const onSubmit = (e: SubmitEvent) => { e.preventDefault(); if (requestFiber.current !== null) { Effect.runFork(Fiber.interrupt(requestFiber.current), { immediate: true }); } requestFiber.current = Effect.runFork(requestEffect); }; return (
Repozytorium muzyczne
setLoginUsername(e.currentTarget.value)} /> setLoginPassword(e.currentTarget.value)} />
); };