Helper
Chat Widget

Custom Support Portal

Use the Helper API to build a custom support portal

The Helper API allows you to integrate customer support directly into your application.

Get started with this AI prompt:

Add a comprehensive customer support portal to this app using the `@helperai/react` hooks. The portal should allow customers to view their support tickets, create new ones, and engage in real-time conversations with AI agents.

IMPORTANT:
- These instructions are for React and Next.js, so adapt them as required for the current framework.
- If you run into an instruction you cannot follow in this app, ask for clarification.
- Reuse existing UI components from this app as much as possible, falling back to simple HTML if necessary.
- Before starting work, read the documentation at the following URL to use as a reference: https://helper.ai/docs/api/05-client-sdk

## 1. Installation

Install the following with npm/pnpm/yarn/etc: `@helperai/client @helperai/react @ai-sdk/react`

## 2. Session management

Create a *server-side* `createHelperSession` helper function that calls `generateHelperAuth` from `@helperai/react` like this:

```tsx
return generateHelperAuth({
  email: "CURRENT_CUSTOMER_EMAIL",
  hmacSecret: "YOUR_HMAC_SECRET", // Store this separately, for example in an environment variable or secret. It MUST NOT be exposed to the client side or committed to version control.
})
```

## 3. Support portal layout

Create a page that wraps the entire support portal in `HelperClientProvider`:

```tsx
"use server";
import { HelperClientProvider } from "@helperai/react";
import { generateSession } from "./generateSession";

export default async function SupportPage() {
  const session = generateSession(); // Create an API endpoint if not using server components
  
  return (
    <HelperClientProvider host="https://your-helper-instance.com" session={session}>
      <SupportPortal />
    </HelperClientProvider>
  );
}
```

## 4. Support portal component

Create the `SupportPortal` component. It should include state management for `selectedConversationSlug`, and do the following:
- When the selected slug is null, it should render a list component which:
  - Uses the `const { data: conversationsData, isLoading, error } = useConversations()` hook to fetch conversations
  - Displays the conversations in a table/grid format with columns: Subject, Message count, Last updated
  - Sets the `selectedConversationSlug` state variable when a conversation is clicked
- When the selected slug is not null, it should instead render a conversation detail component which:
  - Fetches the conversation details using the `const { data: conversation, isLoading, error } = useConversation(conversationSlug)` hook
  - Calls the `useRealtimeEvents(conversation.slug)` hook to automatically update the conversation data
  - Displays the conversation subject as the page heading
  - Displays the conversation messages using `conversation.messages.map(({ content, role, staffName, createdAt }) => ...)`
  - Uses the `MessageContent` component to display the `content` of each message
  - Displays an input field and submit button which adds a new message to the conversation using the `useCreateMessage()` hook, called like: `createMessage({ conversationSlug: conversation.slug, content: input.trim() })`

## 5. New ticket button

- Above the conversation list, add a new ticket button which:
  - Opens a modal containing a form with subject and message input fields
  - Uses the `useCreateConversation()` hook to create a new conversation with the `subject` input value, then calls `useCreateMessage()` to create the first message in the conversation
  - Reloads the conversation list

## 6. Final steps

- Tell me the route of the page you created (e.g., /support)
- Tell me how to add the Helper HMAC secret configuration (note: the secret itself is available at https://your-helper-instance.com/settings/in-app-chat under "Authenticate your users")