typebot.io/packages/embeds/react
Baptiste Arnaud e7be877bc1
🐛 Fix Android camera for image extension uploads (#2558)
## What changed

- Detect image extensions in file upload allowlists using the shared
`extensionFromMimeType` table.
- Add the corresponding image MIME hints while preserving the original
extensions and the existing `capture=camera` Android workaround.
- Normalize casing and leading dots, deduplicate equivalent entries, and
prefer valid dotted extensions regardless of input order.
- Add focused unit coverage for image-only, mixed, non-image, duplicate,
and casing scenarios.
- Bump the JavaScript and React embed packages to `0.10.6` and ignore
local Revue comments.

## Why

The Android camera workaround was only enabled when the configured
allowlist already contained an `image/*` MIME type. Bots configured with
image extensions such as `.jpg`, `.jpeg`, and `.png` therefore never
received the workaround.

## Impact

Android users can access the existing camera option when a file upload
block is configured with image extensions. Browser hints are enriched
only on the client; server-side validation remains based on the block's
original options.

The `capture=camera` token remains a non-standard Android-specific
workaround and may continue to vary across browsers.

## Validation

- `bunx nx test @typebot.io/js` — 7 tests passed
- `bunx nx typecheck @typebot.io/js`
- `bunx nx format-and-lint`
- `git diff --check`

The repository-wide pre-commit affected test suite could not complete
locally because unrelated packages required missing environment
variables and existing SSRF tests failed. The targeted package tests,
typecheck, and repository formatting checks passed.
2026-07-13 11:35:47 +02:00
..
src ♻️ Migrate to NX (#2418) 2026-03-18 15:29:32 +00:00
.npmignore ♻️ Migrate to NX (#2418) 2026-03-18 15:29:32 +00:00
package.json 🐛 Fix Android camera for image extension uploads (#2558) 2026-07-13 11:35:47 +02:00
README.md 📝 Update installation commands to remove unnecessary peer dep install 2024-10-19 09:07:37 +02:00
tsconfig.json ♻️ Migrate to NX (#2418) 2026-03-18 15:29:32 +00:00
tsconfig.lib.json 🔧 Remove "baseUrl": "." from tsconfigs 2026-03-25 16:40:12 +01:00

Install

npm install @typebot.io/react

Standard

import { Standard } from "@typebot.io/react";

const App = () => {
  return (
    <Standard
      typebot="lead-generation-copy-3luzm6b"
      style={{ width: "100%", height: "600px" }}
    />
  );
};

This code is creating a container with a 100% width (will match parent width) and 600px height.

Popup

import { Popup } from "@typebot.io/react";

const App = () => {
  return <Popup typebot="lead-generation-copy-3luzm6b" autoShowDelay={3000} />;
};

This code will automatically trigger the popup window after 3 seconds.

Open or Close a popup

You can use these commands:

import { open } from "@typebot.io/react";

open();
import { close } from "@typebot.io/react";

close();
import { toggle } from "@typebot.io/react";

toggle();

Bubble

import { Bubble } from "@typebot.io/react";

const App = () => {
  return (
    <Bubble
      typebot="lead-generation-copy-3luzm6b"
      previewMessage={{
        message: "I have a question for you!",
        autoShowDelay: 5000,
        avatarUrl: "https://avatars.githubusercontent.com/u/16015833?v=4",
      }}
      theme={{
        button: { backgroundColor: "#0042DA", iconColor: "#FFFFFF" },
        previewMessage: { backgroundColor: "#ffffff", textColor: "black" },
      }}
    />
  );
};

This code will show the bubble and let a preview message appear after 5 seconds.

Open or close the preview message

You can use these commands:

import { showPreviewMessage } from "@typebot.io/react";

Typebot.showPreviewMessage();
import { hidePreviewMessage } from "@typebot.io/react";

Typebot.hidePreviewMessage();

Open or close the chat window

You can use these commands:

import { open } from "@typebot.io/react";

open();
import { close } from "@typebot.io/react";

close();
import { toggle } from "@typebot.io/react";

toggle();

Additional configuration

You can prefill the bot variable values in your embed code by adding the prefilledVariables option. Here is an example:

import { Standard } from "@typebot.io/react";

const App = () => {
  return (
    <Standard
      typebot="lead-generation-copy-3luzm6b"
      style={{ width: "100%", height: "600px" }}
      prefilledVariables={{
        "Current URL": "https://my-site/account",
        "User name": "John Doe",
      }}
    />
  );
};

It will prefill the Current URL variable with "https://my-site/account" and the User name variable with "John Doe". More info about variables: here.

Note that if your site URL contains query params (i.e. https://typebot.io?User%20name=John%20Doe), the variables will automatically be injected to the typebot. So you don't need to manually transfer query params to the bot embed configuration.