ClientSphereDocs

Floating launcher

The floating launcher in a React Native app, Intercom style, driven by the settings under Customer Support → Floating Launcher.

The floating launcher is a pill in the corner of the screen. Tap it and a sheet slides up with the menu your workspace configured: find answers in the knowledge base, send a message that becomes a ticket, suggest an improvement, and any links you added. No live chat; for that, use the chat screen.

It is the same feature as the web launcher. The label, colour, position, menu items, and which of the knowledge base and tickets are on all come from Customer Support → Floating Launcher, and the ticket lands on the same support inbox.

Install

The launcher ships in the same package as the chat SDK:

npm install @clientsphere/support-native

socket.io-client is only needed for the chat side; the launcher makes plain HTTP calls.

Minimal app

import AsyncStorage from '@react-native-async-storage/async-storage';
import { LauncherProvider, SupportLauncher } from '@clientsphere/support-native';
 
export function App({ user }) {
  return (
    <LauncherProvider
      baseUrl="https://your-workspace.clientsphere.io"
      companyId="your-workspace-id"
      storage={AsyncStorage}
      identity={user ? { email: user.email, name: user.name } : null}
    >
      <YourNavigator />
      <SupportLauncher />
    </LauncherProvider>
  );
}

Put SupportLauncher last inside a full-screen parent so the pill floats over everything. Find the workspace id under Customer Support → Floating Launcher; a Support Hub widget id works too, as widgetId.

With an email in identity, the workspace creates or links a contact the first time the launcher loads, and again at most once every six hours. That is what the web launcher does on page load. Pass storage so the throttle survives restarts.

What the sheet shows

Home opens with a brand-coloured header and a greeting, then:

CardAppears whenDoes
Send us a messageTickets are on and a support inbox existsOpens the ticket form. The subtitle is the inbox's reply-time promise, from its SLA
Search for helpThe knowledge base is onOpens live search over public articles
Popular articlesThe knowledge base is on and has public articlesThe three most-read, then "Find answers" for the full browser
MoreAny other menu itemsSuggest an improvement, and links, which open in the system browser

Menu items follow the web launcher's rules exactly: a link with no URL is hidden, knowledge base and ticket rows disappear when the feature is off, and a ticket row is added if tickets are on but the workspace never listed one.

The header colour is the launcher colour. The sheet follows the launcher's theme setting, or the phone's appearance when the setting is "auto".

Props

PropDefaultMeaning
showPilltrueRender the floating pill. Set false to open the sheet from your own control with useLauncher().setOpen(true)
positionconfigured positionbottom-right or bottom-left
pillInset20Distance from the screen edges
avatarsnoneTeam avatars on the message card: [{ initials, color? }]. The public config carries no team, so the app supplies them
greeting"Hi there 👋"Line above "How can we help?"
logoTextfirst letter of the labelThe tile in the header
onOpenLinkLinking.openURLWhere link items and "Open in the help centre" go
renderArticleplain textRender an article body yourself, for example with an HTML renderer

Articles

Articles come back as the HTML written in the workspace editor. By default the launcher flattens it to readable text, with headings, paragraphs and bullet lists preserved, so nothing untrusted is rendered as markup. To show full formatting, pass renderArticle and hand the HTML to a sanitising renderer such as react-native-render-html.

Reading an article in the app counts as a read on the help centre, the same as the web launcher.

Using the hooks and client directly

const { config, items, replyTime, client, open, setOpen } = useLauncher();
 
const home = await client.kbHome();               // categories and popular articles
const cat = await client.kbCategory(id);
const article = await client.kbArticle(id);
const hits = await client.kbSearch('refunds');
await client.submitTicket({ subject, message, email, name });
await client.submitFeatureRequest({ productCategory, urgency, title, description });

items is the menu after visibility rules. replyTime is the sentence the message card shows. Every failure is a SupportApiError; see Lifecycle and limits.

Limits

ActionLimit
Messages (tickets)10 per hour, per workspace, per IP address
Identify60 per minute per IP; the SDK sends one per six hours per email
SearchQueries under two characters return nothing without a request

Launcher or chat?

Floating launcherChat
ComponentSupportLauncher in LauncherProviderSupportChatScreen in SupportProvider
Keyed byWorkspace id, or a widget idWidget id
Live conversationNoYes, with agents and the AI assistant
Knowledge baseBrowse, search and readSearch
TicketsYes, "Send us a message"Email tickets from the hub
Configured underCustomer Support → Floating LauncherCustomer Support → Support Hub

Both can live in one app. They do not share state; identify the user in both if you use both.

On this page