Skip to content

miroapp/miro-react-hooks

miro-websdk-react-hooks NPM version

Collection of React hooks to interact with Miro Platform WebSDK.

Add a bit of ✨reactivity✨ to your Miro app.

Use it!

$ npm install @mirohq/websdk-react-hooks
// or
$ yarn add @mirohq/websdk-react-hooks

Inject Miro instance

Wrap your components with MiroProvider and inject the global instance of Miro WebSDK.

import { MiroProvider } from "@mirohq/websdk-react-hooks";

const App: React.FC = ({ children }) => <MiroProvider>{children}</MiroProvider>;

/*
 You can also optional inject the global Miro WebSDK instance
 
 const App: React.FC = ({ children }) => <MiroProvider miro={window.miro}>{children}</MiroProvider>;
*/

Make sure you have a Miro application configured to use it. The hooks in this library will only work within Miro boards and in a well-configured app.

Isomorphic or not?

The Miro WebSDK is NOT isomorphic, meaning that you cannot use it in both server and client environments. This also applies to this library, it won't work wehn you are rendereing your React components in the server.

What if I am using Nextjs?

Using app router

Just make sure that the component that uses the hooks is only rendered on the client by using the use client directive on top of your component.

'use client'
import { useCurrentUser } from "@mirohq/websdk-react-hooks";

// Your component

Using pages router

Wrap your component in a dynamic code block that will defer the component rendering to only execute in the client-side:

import dynamic from "next/dynamic";
import React from "react";
import { useCurrentUser } from "@mirohq/websdk-react-hooks";

const NoSsr: React.FC<React.PropsWithChildren> = (props) => (
  <React.Fragment>{props.children}</React.Fragment>
);

const NoSSRWrapper = dynamic(() => Promise.resolve(NoSsr), {
  ssr: false,
});

// And in your Nextjs page

const Component: React.FC = () => {
    const { status, result, error } = useCurrentUser();

    if (status === "success") {
        return <p>The current user is "{result?.name}"</p>;
    }
}

export default function OnlyInTheClient() {
  return (
    <NoSSRWrapper>
      <Group />
    </NoSSRWrapper>
  );
}

Built with

This library is heavily inspired on https://github.com/react-hookz/web. Pure 💖 awesomeness 💖.

Contributing

Please refer to the CONTRIBUTING.md guide to get started.

Hooks