We can't find the internet
Attempting to reconnect
Something went wrong!
Hang in there while we get back on track
Add remote camera functionality to your React application in just a few minutes. This guide will walk you through installation, setup, and implementation.
npm install @poscam/use-camera
            API tokens are currently available during the alpha phase for approved developers.
Import the useCamera hook and CameraState enum, then initialize with your session ID and auth token.
The camera goes through several states during its lifecycle:
Initializing camera session and establishing connection.
Camera session created, waiting for device to connect via QR code.
Camera is connected and ready to take pictures.
Session ended or camera disconnected.
React hook for managing remote camera sessions with real-time WebSocket communication.
const camera: UseCameraReturn = useCamera(options: UseCameraOptions)
            // Options interface
interface UseCameraOptions {
  sessionId: string;
  authToken: string;
  host?: string;
  useHttps?: boolean;
}
// Return type interface
interface UseCameraReturn {
  cameraState: CameraState;
  qrCodeURL: string;
  image: CameraImage | undefined;
  error: string | null;
  initialize: () => Promise<void>;
  disconnect: () => void;
  retry: () => Promise<void>;
  takePicture: () => void;
}
// Supporting types
enum CameraState {
  LOADING = "loading",
  WAITING = "waiting",
  CONNECTED = "connected",
  CLOSED = "closed",
  ERROR = "error",
}
interface CameraImage {
  id: string;
  url: string;
}
            | Property | Type | Required | Description | 
|---|---|---|---|
| sessionId | string | Required | Unique identifier for the camera session | 
| authToken | string | Required | API authentication token from PosCam | 
| host | string | Optional | 
                      Server hostname. Defaults to
                      "poscam.shop"
                     | 
                  
| useHttps | boolean | Optional | 
                      Use HTTPS/WSS protocols. Defaults to
                      true
                     | 
                  
| Property | Type | Description | 
|---|---|---|
| cameraState | CameraState | Current camera connection state | 
| qrCodeURL | string | URL of the QR code for camera connection | 
| image | CameraImage | undefined | Latest captured image with id and url | 
| error | string | null | Error message if something went wrong | 
| initialize | () => Promise<void> | Initialize camera session and WebSocket connection | 
| takePicture | () => void | Trigger photo capture on connected camera | 
| disconnect | () => void | Disconnect WebSocket and cleanup resources | 
| retry | () => Promise<void> | Retry connection after error or disconnect | 
import { useEffect, useState } from "react";
import {
  reactExtension,
  useApi,
  Navigator,
  Screen,
  Text,
  Image,
  Button,
  Banner,
  Section,
  Box,
  ScrollView,
} from "@shopify/ui-extensions-react/point-of-sale";
import { useCamera, CameraState } from "@poscam/use-camera";
const POSCAM_AUTH_TOKEN = "your-api-token-here";
export const CameraCapture = () => {
  const api = useApi();
  const [capturedImages, setCapturedImages] = useState([]);
  // Create session ID based on shop context
  const { shopId, locationId, userId } = api.session.currentSession;
  const sessionId = `${shopId}-${locationId}-${userId}`;
  const {
    cameraState,
    qrCodeURL,
    image,
    error,
    initialize,
    disconnect,
    takePicture,
    retry,
  } = useCamera({
    sessionId,
    authToken: POSCAM_AUTH_TOKEN,
  });
  // Initialize camera when modal opens
  useEffect(() => {
    initialize();
    return () => {
      disconnect();
    };
  }, []);
  // Handle new images
  useEffect(() => {
    if (image) {
      setCapturedImages((prev) => [...prev, image]);
    }
  }, [image]);
  const handleDone = () => {
    disconnect();
    api.navigation.dismiss();
  };
  const isLoading = cameraState === CameraState.LOADING;
  return (
    <Navigator>
      <Screen
        name="CameraCapture"
        title="Camera Capture"
        isLoading={isLoading}
        onNavigateBack={handleDone}
      >
        <ScrollView>
          <Section>
            <Button
              title="Take Picture"
              onPress={takePicture}
              disabled={cameraState !== CameraState.CONNECTED}
            />
            {cameraState === CameraState.CLOSED && (
              <Button title="Reconnect" onPress={retry} />
            )}
            <Button title="Done" onPress={handleDone} />
          </Section>
          {error && (
            <Banner status="critical" title="Camera Error">
              <Text>{error}</Text>
            </Banner>
          )}
          {cameraState === CameraState.WAITING && qrCodeURL && (
            <Section>
              <Text>Scan this QR code to connect your camera:</Text>
              <Box>
                <Image source={qrCodeURL} />
              </Box>
            </Section>
          )}
          {cameraState === CameraState.CONNECTED && (
            <Section>
              <Text>Camera connected! Ready to take pictures.</Text>
            </Section>
          )}
          {capturedImages.length > 0 && (
            <Section>
              <Text>Captured {capturedImages.length} image(s)</Text>
              {capturedImages.map((img, index) => (
                <Box key={img.id}>
                  <Image source={img.url} />
                </Box>
              ))}
            </Section>
          )}
        </ScrollView>
      </Screen>
    </Navigator>
  );
};
        You now have everything you need to integrate remote camera functionality into your React application.
npm install @poscam/use-camera
        During the alpha phase, API tokens are available for approved developers. Request early access to get started.