TypeScript 61.9%
HTML 37.2%
SQL 0.7%
1'use client';23import { useActionState } from 'react';4import { createTargetAction } from '@/lib/account/actions';5import { idle } from '@/lib/auth/state';6import { Field, FormMessage, Select, SubmitButton, TextInput } from '@/components/account/form';7import { AssetPicker } from '@/components/account/asset-picker';89export function TargetForm() {10 const [state, action] = useActionState(createTargetAction, idle);11 return (12 <form action={action} className="space-y-3" noValidate key={state.ok ? 'reset' : 'form'}>13 <FormMessage state={state} />14 <AssetPicker name="assetId" withVariant={false} error={state.fieldErrors?.assetId} />15 <div className="grid grid-cols-2 gap-3">16 <Field label="Direction" name="direction">17 <Select name="direction" defaultValue="below">18 <option value="below">Buy — RIV falls below</option>19 <option value="above">Sell — RIV rises above</option>20 </Select>21 </Field>22 <Field label="Target (USD)" name="targetUsd" error={state.fieldErrors?.targetUsd}>23 <TextInput name="targetUsd" type="number" min={0} step="0.01" required placeholder="2500" />24 </Field>25 </div>26 <Field label="Note (optional)" name="note">27 <TextInput name="note" maxLength={300} placeholder="Why this level?" />28 </Field>29 <SubmitButton pendingText="Saving…">Set target</SubmitButton>30 </form>31 );32}33