React Client API
The Krmx React client implementation provides an external store that wraps the Krmx Client, so that it can be easily used in React and is written in TypeScript.
Take a look at the TypeScript SDK reference and source code (opens in a new tab) to learn more about the React Client API.
If you need help setting up a project with Krmx, then please following the instructions at Getting Started.
Creating a new Krmx React Client
The React client API provides a createClient
method that creates an external store that wraps the Krmx Client. This store can be used in React components to access the Krmx Client.
// in your utils/krmx.ts
import { createClient } from '@krmx/client-react';
// Create the client
export const { client, useClient } = createClient(/* props */);
This returns an object with two fields: client
and useClient
. The client
field is the Krmx Client instance, and the useClient
field is a hook that can be used in React components to access the Krmx Client data.
Properties
To create the client you can supply properties. The properties are the same as the properties of the Krmx Client and can be found in the Krmx Client Props interface.
Using useClient hook
The useClient
hook makes the information from the Krmx protocol, such as unlinked and linked users, available to your React components.
"use client";
import { useClient } from '@/utils/krmx.ts';
export default function MyApp() {
const { status, username, users } = useClient();
return (<>
<h1>My App</h1>
<p>The current status of the client: {status}</p>
<p>The username (if linked to a user): {username}</p>
<p>Users: {users.map(u => u.username).join()}</p>
</>);
}
Fields
The hook returns an object with three fields, that expose part of this information. The status
, username
, and users
fields are described below.
Status
The status
field is of type Client Status, indicates the current status of the Krmx client.
Username
The username
field of type string or undefined. It is undefined when the connection is not linked to a user, and otherwise is the username to which the client is linked on the server.
import { useClient } from '@/utils/krmx.ts';
function MyComponent() {
const { username } = useClient();
if (username) {
return <p>Welcome, {username} 👋</p>;
} else {
return <p>You're not linked!</p>;
}
}
Users
The users
field is an object, that indicates the users that are known to the servers and provides information about which are currently linked to a connection.
The object has the following Type Definition { [username: string]: { isLinked: boolean} };
. Example of its structure
{
"simon": { "isLinked": true },
"lisa": { "isLinked": true },
"rik": { "isLinked": false },
}
Example usage of the users field.
import { useClient } from '@/utils/krmx.ts';
function UsersComponent() {
const { users } = useClient();
return <ul>
{Object.entries(users)
.map(([username, { isLinked }]) => (
<li key={username}>
{username}
{!isLinked && ' (disconnected)'}
</li>)
)}
</ul>;
}
Using the client
The client
field is the Krmx Client instance, and can be used to interact with the Krmx server.
Example: Connect
Connect to a Krmx server by invoking the connect
method on the client.
import { client } from '@/utils/krmx.ts';
export function MyComponent() {
return <button onClick={() => { client.connect('ws://localhost:8082'); }}>
Connect to Krmx server
</button>;
}
For the serverUrl
argument you have to provide the ws://
or wss://
url of the websocket endpoint where your Krmx server is running.
For example: ws://my-subdomain.example.org:3002/my-game
or ws://localhost:1234
.
Krmx Client
Since, the client is simply a wrapper around a Krmx Client, all its other methods can be found in the Krmx API. They can all be invoked similarly to the connect example above.
Creating a store
If you want to use the messages from the Krmx Client in your React components, you can create a store that listens to the messages from the Krmx Client.
To do this you can use the createStore
method that creates a store that listens to the messages from the Krmx Client.
The example below creates a store that listens to messages from the Krmx Client and stores the last 10 messages in the store.
// add to your utils/krmx.ts
import { createClient, createStore } from '@krmx/client-react';
/* ... your existing code to create the client ... */
export const { client, useClient } = createClient(/* props */);
// Example Message Store
let id = 0;
export const useMessages = createStore(
/* the client to create the store for */
client,
/* the initial state of the store */
[] as { id: string, message: string }[],
/* a reducer returning the new state after each incoming messages */
(state, message) => {
id += 1;
return [...state, { id: crypto.randomUUID(), message: message.type }].slice(-10);
},
/* a mapper that can map the state to a different format, which is what will be available when using the hook */
s => s
);
Then you can use the useMessages
hook in your components to access the messages from the Krmx Client.
import { useMessages } from '@/utils/krmx.ts';
export function MyComponent() {
const messages = useMessages();
return <ul>
{messages.map(m => <li key={m.id}>{m.message}</li>)}
</ul>;
}
TypeScript SDK Reference
Take a look at the TypeScript SDK reference and source code (opens in a new tab) to learn more about the Client API.