import { Form, useActionData, useLoaderData, useNavigation } from '@remix-run/react'; import type { ActionArgs, LoaderArgs } from '@remix-run/server-runtime'; import { json, redirect } from '@remix-run/server-runtime'; import { useState } from 'react'; import { z } from 'zod'; import { sessionStorage } from '../auth.server'; import { BackButton } from '../components/BackButton'; import { Button } from '../components/Button'; import { MultiSelectCard } from '../components/MultiselectCard'; import { MultiSelectGroup } from '../components/MultiSelectGroup'; import { TextInput } from '../components/TextInput'; import { Book } from '../icons/Book'; import { Swap } from '../icons/Swap'; import type { CreateAppFlowType, ErrorWithGeneral } from '../types'; import { makeMultipageHandler } from '../utils/utils.server'; import { validateFormData } from '../utils/utils'; import { ArrowNarrowRight } from '../icons/ArrowNarrowRight'; const zodAppDetailsSchema = z.object({ name: z.string().min(1, 'App name is required'), products: z .enum(['swap-api', 'orderbook-api', 'token-registry', 'transaction-history', 'tx-relay']) .or( z .array(z.enum(['swap-api', 'orderbook-api', 'token-registry', 'transaction-history', 'tx-relay'])) .min(1, 'Please select at least one product'), ), }); type ActionInput = z.TypeOf; type Errors = ErrorWithGeneral>; export async function action({ request }: ActionArgs) { const formData = await request.formData(); const { body, errors } = validateFormData({ formData: formData, schema: zodAppDetailsSchema, }); if (errors) { return json({ errors: errors as Errors, values: body }); } const session = await sessionStorage.getSession(request.headers.get('Cookie')); const sessionHandler = makeMultipageHandler({ session, namespace: 'create-app' }); sessionHandler.setPage(0, { appName: body.name, products: Array.isArray(body.products) ? body.products : [body.products], }); const header = await sessionStorage.commitSession(session); throw redirect('/apps/create-app/explorer-tag', { headers: { 'Set-Cookie': header } }); } export async function loader({ request }: LoaderArgs) { const session = await sessionStorage.getSession(request.headers.get('Cookie')); const sessionHandler = makeMultipageHandler({ session, namespace: 'create-app' }); const currentData = sessionHandler.getPage(0); const lastPage = sessionHandler.getPage(2); if (lastPage) { throw redirect('/apps/create-app/api-key'); } return json({ data: currentData || null }); } export default function AppDetails() { const { data } = useLoaderData(); const actionData = useActionData(); const navigation = useNavigation(); const [appName, setAppName] = useState(actionData?.values.name || data?.appName || ''); const [selectedProducts, setSelectedProducts] = useState( new Set(actionData?.values.products || data?.products || ['swap-api', 'orderbook-api']), ); return (

App Details


setAppName(e.target.value)} error={actionData?.errors?.name} initialValue={appName} /> { const { value, checked } = e.target as HTMLInputElement; if (checked) { selectedProducts.add(value); } else { selectedProducts.delete(value); } setSelectedProducts(new Set(selectedProducts)); }} > } id="swap-api" selected={selectedProducts.has('swap-api')} key="swap-api" className="h-full" name="products" value="swap-api" /> } id="orderbook-api" selected={selectedProducts.has('orderbook-api')} key="orderbook-api" className="h-full" name="products" value="orderbook-api" />
); }