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:
Florian Duros
2025-09-17 14:14:35 +02:00
committed by GitHub
parent b4ba350770
commit 38a0d28453

View File

@@ -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;