Skip to content

Commit

Permalink
[ts-sdk] Assign ComponentId automatically with useId hook (#704)
Browse files Browse the repository at this point in the history
  • Loading branch information
wkozyra95 authored Aug 29, 2024
1 parent fb6b6f1 commit 394b4b2
Show file tree
Hide file tree
Showing 11 changed files with 29 additions and 67 deletions.
4 changes: 1 addition & 3 deletions ts/examples/src/dynamic-inputs.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
import LiveCompositor from '@live-compositor/node';
import { useInputStreams, Text, InputStream, Tiles, Rescaler, View } from 'live-compositor';
import { downloadAllAssets, ffplayStartPlayerAsync, sleep } from './utils';
import { useId } from 'react';
import path from 'path';

function ExampleApp() {
const inputs = useInputStreams();
const id = useId();
return (
<Tiles id={id} transition={{ durationMs: 2000 }}>
<Tiles transition={{ durationMs: 2000 }}>
{inputs
.filter(input => input.videoState === 'playing')
.map(input => (
Expand Down
23 changes: 11 additions & 12 deletions ts/live-compositor/src/component.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,27 @@
import React from 'react';
import React, { useId } from 'react';
import * as Api from './api';

type ComponentProps<P> = { children?: React.ReactNode } & P;
type ComponentProps<P> = { children?: React.ReactNode; id?: Api.ComponentId } & P;

export type SceneComponent = Api.Component | string;
export type SceneBuilder<P> = (props: P, children: SceneComponent[]) => Api.Component;

abstract class LiveCompositorComponent<P> extends React.Component<ComponentProps<P>> {
abstract builder: SceneBuilder<P>;

render(): React.ReactNode {
const { children, ...props } = this.props;
export function createCompositorComponent<P>(
sceneBuilder: SceneBuilder<P>
): (props: ComponentProps<P>) => React.ReactNode {
return (props: ComponentProps<P>): React.ReactNode => {
const { children, ...otherProps } = props;
const autoId = useId();

return React.createElement(
'compositor',
{
sceneBuilder: this.builder,
props,
sceneBuilder,
props: { ...otherProps, id: otherProps.id ?? autoId },
},
...(Array.isArray(children) ? children : [children])
);
}
};
}

export function sceneComponentIntoApi(component: SceneComponent): Api.Component {
Expand All @@ -33,5 +34,3 @@ export function sceneComponentIntoApi(component: SceneComponent): Api.Component
}
return component;
}

export default LiveCompositorComponent;
6 changes: 2 additions & 4 deletions ts/live-compositor/src/components/Image.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as Api from '../api';
import LiveCompositorComponent, { SceneBuilder, SceneComponent } from '../component';
import { createCompositorComponent, SceneComponent } from '../component';

export type ImageProps = {
children?: undefined;
Expand All @@ -14,9 +14,7 @@ export type ImageProps = {
imageId: Api.RendererId;
};

class Image extends LiveCompositorComponent<ImageProps> {
builder: SceneBuilder<ImageProps> = sceneBuilder;
}
const Image = createCompositorComponent<ImageProps>(sceneBuilder);

function sceneBuilder(props: ImageProps, _children: SceneComponent[]): Api.Component {
return {
Expand Down
6 changes: 2 additions & 4 deletions ts/live-compositor/src/components/InputStream.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as Api from '../api';
import LiveCompositorComponent, { SceneBuilder, SceneComponent } from '../component';
import { createCompositorComponent, SceneComponent } from '../component';

export type InputStreamProps = {
children?: undefined;
Expand All @@ -14,9 +14,7 @@ export type InputStreamProps = {
inputId: Api.InputId;
};

class InputStream extends LiveCompositorComponent<InputStreamProps> {
builder: SceneBuilder<InputStreamProps> = sceneBuilder;
}
const InputStream = createCompositorComponent<InputStreamProps>(sceneBuilder);

function sceneBuilder(props: InputStreamProps, _children: SceneComponent[]): Api.Component {
return {
Expand Down
10 changes: 2 additions & 8 deletions ts/live-compositor/src/components/Rescaler.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
import React from 'react';
import * as Api from '../api';
import { intoApiTransition, Transition } from './common';
import LiveCompositorComponent, {
SceneBuilder,
SceneComponent,
sceneComponentIntoApi,
} from '../component';
import { createCompositorComponent, SceneComponent, sceneComponentIntoApi } from '../component';

export type RescalerProps = {
children: React.ReactElement | string | number;
Expand Down Expand Up @@ -77,9 +73,7 @@ export type RescalerProps = {
transition?: Transition;
};

class Rescaler extends LiveCompositorComponent<RescalerProps> {
builder: SceneBuilder<RescalerProps> = sceneBuilder;
}
const Rescaler = createCompositorComponent<RescalerProps>(sceneBuilder);

function sceneBuilder(props: RescalerProps, children: SceneComponent[]): Api.Component {
if (children?.length !== 1) {
Expand Down
10 changes: 2 additions & 8 deletions ts/live-compositor/src/components/Shader.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
import * as Api from '../api';
import LiveCompositorComponent, {
SceneBuilder,
SceneComponent,
sceneComponentIntoApi,
} from '../component';
import { createCompositorComponent, SceneComponent, sceneComponentIntoApi } from '../component';

export type ShaderProps = {
/**
Expand Down Expand Up @@ -57,9 +53,7 @@ export type ShaderParamStructField =
fieldName: string;
};

class Shader extends LiveCompositorComponent<ShaderProps> {
builder: SceneBuilder<ShaderProps> = sceneBuilder;
}
const Shader = createCompositorComponent<ShaderProps>(sceneBuilder);

function sceneBuilder(props: ShaderProps, children: SceneComponent[]): Api.Component {
return {
Expand Down
6 changes: 2 additions & 4 deletions ts/live-compositor/src/components/Text.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as Api from '../api';
import LiveCompositorComponent, { SceneBuilder, SceneComponent } from '../component';
import { createCompositorComponent, SceneComponent } from '../component';

export type TextProps = {
children?: (string | number)[] | string | number;
Expand Down Expand Up @@ -68,9 +68,7 @@ export type TextProps = {
weight?: Api.TextWeight;
};

class Text extends LiveCompositorComponent<TextProps> {
builder: SceneBuilder<TextProps> = sceneBuilder;
}
const Text = createCompositorComponent<TextProps>(sceneBuilder);

function sceneBuilder(props: TextProps, children: SceneComponent[]): Api.Component {
return {
Expand Down
10 changes: 2 additions & 8 deletions ts/live-compositor/src/components/Tiles.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
import * as Api from '../api';
import { intoApiTransition, Transition } from './common';
import LiveCompositorComponent, {
SceneBuilder,
SceneComponent,
sceneComponentIntoApi,
} from '../component';
import { createCompositorComponent, SceneComponent, sceneComponentIntoApi } from '../component';

export type TilesProps = {
/**
Expand Down Expand Up @@ -58,9 +54,7 @@ export type TilesProps = {
transition?: Transition;
};

class Tiles extends LiveCompositorComponent<TilesProps> {
builder: SceneBuilder<TilesProps> = sceneBuilder;
}
const Tiles = createCompositorComponent<TilesProps>(sceneBuilder);

function sceneBuilder(props: TilesProps, children: SceneComponent[]): Api.Component {
return {
Expand Down
10 changes: 2 additions & 8 deletions ts/live-compositor/src/components/View.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
import * as Api from '../api';
import LiveCompositorComponent, {
SceneBuilder,
SceneComponent,
sceneComponentIntoApi,
} from '../component';
import { createCompositorComponent, SceneComponent, sceneComponentIntoApi } from '../component';
import { intoApiTransition, Transition } from './common';

export type ViewProps = {
Expand Down Expand Up @@ -74,9 +70,7 @@ export type ViewProps = {
backgroundColorRgba?: Api.RGBAColor;
};

class View extends LiveCompositorComponent<ViewProps> {
builder: SceneBuilder<ViewProps> = sceneBuilder;
}
const View = createCompositorComponent<ViewProps>(sceneBuilder);

function sceneBuilder(props: ViewProps, children: SceneComponent[]): Api.Component {
return {
Expand Down
10 changes: 2 additions & 8 deletions ts/live-compositor/src/components/WebView.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
import * as Api from '../api';
import LiveCompositorComponent, {
SceneBuilder,
SceneComponent,
sceneComponentIntoApi,
} from '../component';
import { createCompositorComponent, SceneComponent, sceneComponentIntoApi } from '../component';

export type WebViewProps = {
/**
Expand All @@ -18,9 +14,7 @@ export type WebViewProps = {
instanceId: Api.RendererId;
};

class WebView extends LiveCompositorComponent<WebViewProps> {
builder: SceneBuilder<WebViewProps> = sceneBuilder;
}
const WebView = createCompositorComponent<WebViewProps>(sceneBuilder);

function sceneBuilder(props: WebViewProps, children: SceneComponent[]): Api.Component {
return {
Expand Down
1 change: 1 addition & 0 deletions ts/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"version": "0.1.0",
"scripts": {
"lint": "lerna run lint",
"lint:fix": "lerna run lint -- --fix",
"build": "lerna run build",
"typecheck": "lerna run typecheck",
"clean": "lerna run clean",
Expand Down

0 comments on commit 394b4b2

Please sign in to comment.