@reflct/react
Overview
A React library for integrating Reflct 3D scenes into your React apps.
Visit Reflct.app for more information.
Installation
To install the package, run:
npm install @reflct/reactor, if you’re using Yarn:
yarn add @reflct/reactGetting Started
Here’s a basic example of how to use the Viewer component:
import React from "react";
import { Viewer } from "@reflct/react";
const Page = () => {
return <Viewer id={"your-scene-id"} apikey={"your-apikey"} />;
};
export default Page;Advanced Usage
The Viewer component includes props for listening to events and customizing the UI:
<Viewer
id={"your-scene-id"}
apikey={"your-apikey"}
isPreview={true}
sharedMemoryForWorkers={false}
className={"your-class-name"}
// Event handlers
onLoadStart={() => {}}
onLoadProgressUpdate={(progress) => {}}
onLoadComplete={(viewGroups, global) => {}}
onStateChangeStart={(targetView, targetViewGroup, global) => {}}
onStateChangeComplete={(currentView, currentViewGroup, global) => {}}
onError={(error) => {}}
/>Props
| Prop | Type | Description |
|---|---|---|
id | string | The unique ID of your scene |
apikey | string | Your API key |
isPreview | boolean | Use a preview version of the scene |
sharedMemoryForWorkers | boolean | Use shared memory for workers |
className | string | Custom CSS class for the viewer |
Events
| Event | Type | Description |
|---|---|---|
onLoadStart | () => void | Triggered when the scene starts loading |
onLoadProgressUpdate | (progress: number) => void | Updates as the scene loads |
onLoadComplete | (viewGroups, global) => void | Triggered when the scene is fully loaded |
onStateChangeStart | (targetView, targetViewGroup, global) => void | Triggered at the start of a state change |
onStateChangeComplete | (currentView, currentViewGroup, global) => void | Triggered when a state change is complete |
onError | (error: string) => void | Triggered when an error occurs |
Example: Using Events and Metadata
You can use metadata from events to update your application logic, such as state or UI:
import React from "react";
import { Viewer } from "@reflct/react";
import useProductStore from "../stores/product-store";
const Page = () => {
const extractMetadata = (viewGroups, global, key) => {
return (
viewGroups[0].views[0].metadata?.[key] ||
viewGroups[0].metadata?.[key] ||
global.metadata?.[key]
);
};
return (
<Viewer
id={sceneId}
apikey={apikey}
onLoadComplete={(viewGroups, global) => {
useProductStore.setState((state) => {
state.loading = false;
state.title = extractMetadata(viewGroups, global, "productTitle");
state.subtitle = extractMetadata(viewGroups, global, "productCategory");
const price = extractMetadata(viewGroups, global, "price");
state.price = !isNaN(Number(price)) ? Number(price) : null;
});
}}
/>
);
};Customizing the UI
You can pass children to customize the viewer’s UI:
<Viewer id={"your-scene-id"} apikey={"your-apikey"}>
{({
currentView,
currentViewGroup,
global,
index,
automode,
setAutomode,
isLoading,
nextView,
prevView,
}) => (
<div>Custom Controls</div>
)}
</Viewer>Additional Props for Customization
| Prop | Type | Description |
|---|---|---|
currentView | object | Metadata for the current view |
currentViewGroup | object | Metadata for the current view group |
global | object | Global scene metadata |
index | number | Current view index |
automode | boolean | Is auto mode enabled? |
setAutomode | function | Function to toggle auto mode |
isLoading | boolean | Is the scene loading? |
nextView | function | Function to navigate to the next view |
prevView | function | Function to navigate to the previous view |
CORS Issues and SharedArrayBuffer
This package uses SharedArrayBuffer by default for improved performance. However, this may cause CORS issues in browser environments.
Security Requirements
To avoid CORS issues, ensure your document operates in a secure context. Add the following headers to your server configuration:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corpFor more details, refer to the MDN documentation.
Disabling SharedArrayBuffer
If you cannot configure your server, disable SharedArrayBuffer by setting the sharedMemoryForWorkers prop to false:
<Viewer
id={"your-scene-id"}
apikey={"your-apikey"}
sharedMemoryForWorkers={false}
/>