Skip to content

Working with Forms ​

This guide covers how to work with forms using Flowfull Clients.

BridgeForm Component ​

The BridgeForm component provides automatic form handling with validation and submission:

typescript
import { BridgeForm } from '@pubflow/react'; // or @pubflow/react-native

function CreateUserForm() {
  return (
    <BridgeForm
      endpoint="/api/users"
      method="POST"
      onSuccess={(data) => {
        console.log('User created:', data);
        // Navigate to user detail page
      }}
      onError={(error) => {
        console.error('Error:', error);
      }}
    >
      <input name="name" placeholder="Name" required />
      <input name="email" type="email" placeholder="Email" required />
      <input name="password" type="password" placeholder="Password" required />
      <button type="submit">Create User</button>
    </BridgeForm>
  );
}

Manual Form Handling ​

For more control, use useBridgeMutation directly:

typescript
import { useState } from 'react';
import { useBridgeApi, useBridgeMutation } from '@pubflow/react';

function CreateUserForm() {
  const userService = useBridgeApi({ endpoint: 'users' });
  const { mutate: createUser, isLoading, error } = useBridgeMutation(
    userService,
    'create'
  );
  
  const [formData, setFormData] = useState({
    name: '',
    email: '',
    password: ''
  });
  
  async function handleSubmit(e: React.FormEvent) {
    e.preventDefault();
    
    const result = await createUser(
      { data: formData },
      {
        onSuccess: (data) => {
          console.log('User created:', data);
          // Reset form
          setFormData({ name: '', email: '', password: '' });
        }
      }
    );
  }
  
  return (
    <form onSubmit={handleSubmit}>
      <input
        value={formData.name}
        onChange={(e) => setFormData({ ...formData, name: e.target.value })}
        placeholder="Name"
        required
      />
      <input
        value={formData.email}
        onChange={(e) => setFormData({ ...formData, email: e.target.value })}
        type="email"
        placeholder="Email"
        required
      />
      <input
        value={formData.password}
        onChange={(e) => setFormData({ ...formData, password: e.target.value })}
        type="password"
        placeholder="Password"
        required
      />
      <button type="submit" disabled={isLoading}>
        {isLoading ? 'Creating...' : 'Create User'}
      </button>
      {error && <div>Error: {error.message}</div>}
    </form>
  );
}

Update Forms ​

typescript
import { useEffect, useState } from 'react';
import { useBridgeApi, useBridgeQuery, useBridgeMutation } from '@pubflow/react';

function EditUserForm({ userId }: { userId: string }) {
  const userService = useBridgeApi({ endpoint: 'users' });
  
  // Fetch user data
  const { data: user, isLoading: isLoadingUser } = useBridgeQuery(
    userService,
    'get',
    { id: userId }
  );
  
  // Update mutation
  const { mutate: updateUser, isLoading: isUpdating } = useBridgeMutation(
    userService,
    'update'
  );
  
  const [formData, setFormData] = useState({
    name: '',
    email: ''
  });
  
  // Update form when user data is loaded
  useEffect(() => {
    if (user) {
      setFormData({
        name: user.name,
        email: user.email
      });
    }
  }, [user]);
  
  async function handleSubmit(e: React.FormEvent) {
    e.preventDefault();
    
    await updateUser(
      { id: userId, data: formData },
      {
        onSuccess: () => {
          console.log('User updated');
        }
      }
    );
  }
  
  if (isLoadingUser) return <div>Loading...</div>;
  
  return (
    <form onSubmit={handleSubmit}>
      <input
        value={formData.name}
        onChange={(e) => setFormData({ ...formData, name: e.target.value })}
        placeholder="Name"
      />
      <input
        value={formData.email}
        onChange={(e) => setFormData({ ...formData, email: e.target.value })}
        type="email"
        placeholder="Email"
      />
      <button type="submit" disabled={isUpdating}>
        {isUpdating ? 'Updating...' : 'Update User'}
      </button>
    </form>
  );
}

Next Steps ​