React Hooks to be used with H5P.
npm i use-h5p
A few functions on the global H5P object (such as H5P.getPath
) takes a content id as input.
In those cases, it's nice to have the content id readily available.
Add the content id to the ContentIdContext
and use useContentId
in child components to get the current content id.
index.ts
:
import type { IH5PContentType } from "h5p-types";
import { H5PContentType, registerContentType } from "h5p-utils";
import { createRoot } from "react-dom/client";
import { ContentIdContext } from "use-h5p";
import { MyComponent } from "./my-component";
class MyContentType extends H5PContentType implements IH5PContentType {
attach($container: JQuery<HTMLElement>) {
const containerElement = $container.get(0)!;
const { contentId } = this;
const root = createRoot(containerElement);
root.render(
<ContentIdContext.Provider value={contentId}>
<MyComponent />
</ContentIdContext.Provider>,
);
}
}
registerContentType("MyContentType", MyContentType);
my-component.ts
:
import { H5P } from "h5p-utils";
import * as React from "react";
import { useContentId } from "use-h5p";
export const MyComponent: React.FC = () => {
const contentId = useContentId();
const absoluteImageUrl = H5P.getPath("relative/image/path", contentId);
return <img src={absoluteImageUrl} alt="" />;
};
By adding the H5P instance to context, we're able to access it when we want to use functions such as H5P.fullscreen
which takes the instance as a parameter.
index.ts
:
import type { IH5PContentType } from "h5p-types";
import { H5PContentType, registerContentType } from "h5p-utils";
import { createRoot } from "react-dom/client";
import { H5PContext } from "use-h5p";
import { MyComponent } from "./my-component";
class MyContentType extends H5PContentType implements IH5PContentType {
attach($container: JQuery<HTMLElement>) {
const containerElement = $container.get(0)!;
const root = createRoot(containerElement);
root.render(
<H5PContext.Provider value={this}>
<MyComponent />
</H5PContext.Provider>,
);
}
}
registerContentType("MyContentType", MyContentType);
my-component.ts
:
import { H5P } from "h5p-utils";
import * as React from "react";
import { useH5PInstance } from "use-h5p";
export const MyComponent: React.FC = () => {
const elementRef = React.useRef<HTMLDivElement>(null);
const contentType = useH5PInstance();
const triggerFullscreen = () => {
const $fullscreenElement = H5P.jQuery(elementRef.current!);
H5P.fullscreen($fullscreenElement, contentType);
};
return (
<div ref={elementRef}>
<button type="button" onClick={triggerFullscreen}>
Fullscreen
</button>
</div>
);
};
The useTranslation
hook exposes a t
function that lets you get translations from semantics.
index.ts
:
import type { IH5PContentType } from "h5p-types";
import { H5PContentType, registerContentType } from "h5p-utils";
import { createRoot } from "react-dom/client";
import { L10nContext } from "use-h5p";
import { MyComponent } from "./my-component";
type Params = {
l10n: Record<"title" | "description", string>;
};
class MyContentType
extends H5PContentType<Params>
implements IH5PContentType<Params>
{
attach($container: JQuery<HTMLElement>) {
const containerElement = $container.get(0)!;
const root = createRoot(containerElement);
root.render(
<L10nContext.Provider value={this.params.l10n}>
<MyComponent />
</L10nContext.Provider>,
);
}
}
registerContentType("MyContentType", MyContentType);
my-component.ts
:
import { H5P } from "h5p-utils";
import * as React from "react";
import { useTranslation } from "use-h5p";
export const MyComponent: React.FC = () => {
const { t } = useTranslation();
return (
<>
<h1>{t("title")}</h1>
<p>{t("description")}</p>
</>
);
};