2.0.0 • Published 10 months ago

use-h5p v2.0.0

Weekly downloads
-
License
ISC
Repository
github
Last release
10 months ago

use-h5p

React Hooks to be used with H5P.

Install

npm i use-h5p

API

ContentIdContext / useContentId

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="" />;
};

H5PContext / useH5PInstance

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>
  );
};

L10nContext / useTranslation

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>
    </>
  );
};
1.3.1

11 months ago

2.0.0

10 months ago

1.3.0

1 year ago

1.2.0

2 years ago

1.2.1

2 years ago

1.1.3

2 years ago

1.1.2

2 years ago

1.1.1

2 years ago

1.1.0

2 years ago

1.0.0

2 years ago