Imperative Surface Imperative Surface

Form Dialog

Surface.Body can render a <form> when onSubmit is supplied.

type FormResult = {
  name: string;
  email: string;
};

function UserForm({ pop }: SurfaceContext<FormResult>) {
  function handleSubmit(event: React.FormEvent<HTMLFormElement>) {
    event.preventDefault();

    const form = new FormData(event.currentTarget);

    pop({
      name: String(form.get('name') ?? ''),
      email: String(form.get('email') ?? ''),
    });
  }

  return (
    <Surface.Body onSubmit={handleSubmit}>
      <Surface.Header
        title="Create user"
        onPop={() => pop()}
      />

      <Surface.Content>
        <label>
          Name
          <input name="name" required />
        </label>

        <label>
          Email
          <input name="email" type="email" required />
        </label>
      </Surface.Content>

      <Surface.Footer>
        <button type="submit">
          Create
        </button>
      </Surface.Footer>
    </Surface.Body>
  );
}

const result = await Surface.Dialog.present<FormResult>({
  body: UserForm,
});

The caller receives the submitted object after the form is closed.

On this page