import { createForm, FieldValues, getValues, setValue, SubmitHandler, } from "@modular-forms/solid"; import { TextInput } from "@/src/Form/fields/TextInput"; import { Button } from "./components/Button/Button"; import { callApi } from "./api"; import { API } from "@/api/API"; import { createSignal, Match, Switch, For, Show } from "solid-js"; import { Typography } from "./components/Typography"; import { useQuery } from "@tanstack/solid-query"; import { makePersisted } from "@solid-primitives/storage"; import jsonSchema from "@/api/API.json"; interface APITesterForm extends FieldValues { endpoint: string; payload: string; } const ACTUAL_API_ENDPOINT_NAMES: (keyof API)[] = jsonSchema.required.map( (key) => key as keyof API, ); export const ApiTester = () => { const [persistedTestData, setPersistedTestData] = makePersisted( createSignal(), { name: "_test_data", storage: localStorage, }, ); const [formStore, { Form, Field }] = createForm({ initialValues: persistedTestData() || { endpoint: "", payload: "" }, }); const [endpointSearchTerm, setEndpointSearchTerm] = createSignal( getValues(formStore).endpoint || "", ); const [showSuggestions, setShowSuggestions] = createSignal(false); const filteredEndpoints = () => { const term = endpointSearchTerm().toLowerCase(); if (!term) return ACTUAL_API_ENDPOINT_NAMES; return ACTUAL_API_ENDPOINT_NAMES.filter((ep) => ep.toLowerCase().includes(term), ); }; const query = useQuery(() => { const currentEndpoint = getValues(formStore).endpoint; const currentPayload = getValues(formStore).payload; const values = getValues(formStore); return { queryKey: ["api-tester", currentEndpoint, currentPayload], queryFn: async () => { return await callApi( values.endpoint as keyof API, JSON.parse(values.payload || "{}"), ); }, staleTime: Infinity, enabled: false, }; }); const handleSubmit: SubmitHandler = (values) => { console.log(values); setPersistedTestData(values); setEndpointSearchTerm(values.endpoint); query.refetch(); const v = getValues(formStore); console.log(v); }; return (

API Tester

{(field, fieldProps) => (
{ if (fieldProps.onInput) { (fieldProps.onInput as (ev: Event) => void)(e); } setEndpointSearchTerm( (e.currentTarget as HTMLInputElement).value, ); setShowSuggestions(true); }, onBlur: (e: FocusEvent) => { if (fieldProps.onBlur) { (fieldProps.onBlur as (ev: FocusEvent) => void)(e); } setTimeout(() => setShowSuggestions(false), 150); }, onFocus: (e: FocusEvent) => { setEndpointSearchTerm(field.value || ""); setShowSuggestions(true); }, onKeyDown: (e: KeyboardEvent) => { if (e.key === "Escape") { setShowSuggestions(false); } }, }} /> 0} >
    {(ep) => (
  • { e.preventDefault(); setValue(formStore, "endpoint", ep); setEndpointSearchTerm(ep); setShowSuggestions(false); }} > {ep}
  • )}
)}
{(field, fieldProps) => (