Skip to content

Instantly share code, notes, and snippets.

@sibelius
Created July 15, 2025 17:15
Show Gist options
  • Save sibelius/d839ce274f9c8d2b24b95fd7f089245a to your computer and use it in GitHub Desktop.
Save sibelius/d839ce274f9c8d2b24b95fd7f089245a to your computer and use it in GitHub Desktop.
RelayStorybook
import type { ReactNode } from 'react';
import React, { useEffect, useState } from 'react';
import { RelayEnvironmentProvider } from 'react-relay';
import type { IEnvironment } from 'relay-runtime';
import { createMockEnvironment, MockPayloadGenerator } from 'relay-test-utils';
type RelayStorybookProps = {
children: ReactNode;
mockResolvers: Record<string, unknown>;
suspense: boolean;
};
export const RelayStorybook = ({
children,
mockResolvers,
suspense = false,
}: RelayStorybookProps): ReactNode => {
const [environment] = useState<IEnvironment>(() => createMockEnvironment());
useEffect(() => {
try {
environment.mock.resolveMostRecentOperation((operation) =>
MockPayloadGenerator.generate(operation, mockResolvers),
);
if (suspense) {
environment.mock.resolveMostRecentOperation((operation) =>
MockPayloadGenerator.generate(operation, mockResolvers),
);
}
} catch (err) {
// handle no operation
// eslint-disable-next-line
console.log({
err,
});
}
}, []);
return (
<RelayEnvironmentProvider environment={environment}>
{children}
</RelayEnvironmentProvider>
);
};
import type { ReactNode } from 'react';
import React, { useEffect, useState } from 'react';
import { RelayEnvironmentProvider } from 'react-relay';
import type { IEnvironment } from 'relay-runtime';
import { createMockEnvironment, MockPayloadGenerator } from 'relay-test-utils';
type RelayStorybookProps = {
children: ReactNode;
mockResolvers: Record<string, unknown>;
suspense: boolean;
};
export const RelayStorybook = ({
children,
mockResolvers,
suspense = false,
}: RelayStorybookProps): ReactNode => {
const [environment] = useState<IEnvironment>(() => createMockEnvironment());
useEffect(() => {
try {
environment.mock.resolveMostRecentOperation((operation) =>
MockPayloadGenerator.generate(operation, mockResolvers),
);
if (suspense) {
environment.mock.resolveMostRecentOperation((operation) =>
MockPayloadGenerator.generate(operation, mockResolvers),
);
}
} catch (err) {
// handle no operation
// eslint-disable-next-line
console.log({
err,
});
}
}, []);
return (
<RelayEnvironmentProvider environment={environment}>
{children}
</RelayEnvironmentProvider>
);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment