Storybook: load story when language is set (#30799)
* fix: load story when language is set * refactor: cleaner first render * fix: use a storybook loader instead of a decorator so set up the language
This commit is contained in:
@@ -1,12 +1,11 @@
|
|||||||
import type { ArgTypes, Preview, Decorator } from "@storybook/react-vite";
|
import type { ArgTypes, Preview, Decorator, ReactRenderer, StrictArgs } from "@storybook/react-vite";
|
||||||
import { addons } from "storybook/preview-api";
|
|
||||||
|
|
||||||
import "../res/css/shared.pcss";
|
import "../res/css/shared.pcss";
|
||||||
import "./preview.css";
|
import "./preview.css";
|
||||||
import React, { useLayoutEffect } from "react";
|
import React, { useLayoutEffect } from "react";
|
||||||
import { FORCE_RE_RENDER } from "storybook/internal/core-events";
|
|
||||||
import { setLanguage } from "../src/shared-components/utils/i18n";
|
import { setLanguage } from "../src/shared-components/utils/i18n";
|
||||||
import { TooltipProvider } from "@vector-im/compound-web";
|
import { TooltipProvider } from "@vector-im/compound-web";
|
||||||
|
import { StoryContext } from "storybook/internal/csf";
|
||||||
|
|
||||||
export const globalTypes = {
|
export const globalTypes = {
|
||||||
theme: {
|
theme: {
|
||||||
@@ -59,29 +58,9 @@ const withThemeProvider: Decorator = (Story, context) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const LanguageSwitcher: React.FC<{
|
async function languageLoader(context: StoryContext<ReactRenderer, StrictArgs>): Promise<void> {
|
||||||
language: string;
|
await setLanguage(context.globals.language);
|
||||||
}> = ({ language }) => {
|
}
|
||||||
useLayoutEffect(() => {
|
|
||||||
const changeLanguage = async (language: string) => {
|
|
||||||
await setLanguage(language);
|
|
||||||
// Force the component to re-render to apply the new language
|
|
||||||
addons.getChannel().emit(FORCE_RE_RENDER);
|
|
||||||
};
|
|
||||||
changeLanguage(language);
|
|
||||||
}, [language]);
|
|
||||||
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const withLanguageProvider: Decorator = (Story, context) => {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<LanguageSwitcher language={context.globals.language} />
|
|
||||||
<Story />
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const withTooltipProvider: Decorator = (Story) => {
|
const withTooltipProvider: Decorator = (Story) => {
|
||||||
return (
|
return (
|
||||||
@@ -93,7 +72,7 @@ const withTooltipProvider: Decorator = (Story) => {
|
|||||||
|
|
||||||
const preview: Preview = {
|
const preview: Preview = {
|
||||||
tags: ["autodocs"],
|
tags: ["autodocs"],
|
||||||
decorators: [withThemeProvider, withLanguageProvider, withTooltipProvider],
|
decorators: [withThemeProvider, withTooltipProvider],
|
||||||
parameters: {
|
parameters: {
|
||||||
options: {
|
options: {
|
||||||
storySort: {
|
storySort: {
|
||||||
@@ -108,6 +87,7 @@ const preview: Preview = {
|
|||||||
test: "error",
|
test: "error",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
loaders: [languageLoader],
|
||||||
};
|
};
|
||||||
|
|
||||||
export default preview;
|
export default preview;
|
||||||
|
|||||||
Reference in New Issue
Block a user