Tickets Hooks

React Query hooks for ticket management.

useEditUserTicket

Edit a user’s ticket:

import { useEditUserTicket } from '@meaple/react-query'
 
function EditTicketForm({ ticketId }) {
  const editTicket = useEditUserTicket()
 
  const handleUpdate = async (data) => {
    await editTicket.mutateAsync({
      ticketId,
      name: data.name,
      email: data.email
    })
  }
 
  return (
    <form onSubmit={handleSubmit(handleUpdate)}>
      <input name="name" placeholder="Name" />
      <input name="email" type="email" placeholder="Email" />
 
      <button type="submit" disabled={editTicket.isPending}>
        {editTicket.isPending ? 'Saving...' : 'Update Ticket'}
      </button>
 
      {editTicket.isSuccess && (
        <div>Ticket updated successfully!</div>
      )}
    </form>
  )
}

useTransferTicket

Transfer a ticket to another user:

import { useTransferTicket } from '@meaple/react-query'
 
function TransferTicketButton({ ticketId }) {
  const transferTicket = useTransferTicket()
 
  const handleTransfer = async (recipientEmail) => {
    try {
      await transferTicket.mutateAsync({
        ticketId,
        recipientEmail
      })
 
      alert('Ticket transferred successfully!')
    } catch (error) {
      alert(`Transfer failed: ${error.message}`)
    }
  }
 
  return (
    <button
      onClick={() => {
        const email = prompt('Enter recipient email:')
        if (email) handleTransfer(email)
      }}
      disabled={transferTicket.isPending}
    >
      Transfer Ticket
    </button>
  )
}

Ticket Data Types

interface EditTicketData {
  ticketId: string;
  name?: string;
  email?: string;
  phone?: string;
  metadata?: Record<string, any>;
}
 
interface TransferTicketData {
  ticketId: string;
  recipientEmail: string;
  message?: string;
}

With Loading States

function TicketActions({ ticketId }) {
  const editTicket = useEditUserTicket()
  const transferTicket = useTransferTicket()
 
  const isLoading = editTicket.isPending || transferTicket.isPending
 
  return (
    <div>
      <button
        onClick={() => editTicket.mutate({ ticketId, name: 'New Name' })}
        disabled={isLoading}
      >
        Edit
      </button>
 
      <button
        onClick={() => transferTicket.mutate({
          ticketId,
          recipientEmail: 'user@example.com'
        })}
        disabled={isLoading}
      >
        Transfer
      </button>
 
      {isLoading && <span>Processing...</span>}
    </div>
  )
}

Invalidate Cache After Mutation

const editTicket = useEditUserTicket({
  onSuccess: () => {
    queryClient.invalidateQueries({ queryKey: ['userTickets'] });
    queryClient.invalidateQueries({ queryKey: ['eventTickets'] });
  },
});
 
const transferTicket = useTransferTicket({
  onSuccess: () => {
    queryClient.invalidateQueries({ queryKey: ['userTickets'] });
  },
});