diff --git a/src/components/ModeSelector.tsx b/src/components/ModeSelector.tsx index d564adb1..5e6057c0 100644 --- a/src/components/ModeSelector.tsx +++ b/src/components/ModeSelector.tsx @@ -32,16 +32,18 @@ type ModeData = Pick; interface ModeSelectorProps { isAccepted: boolean; - selectedMode: ModeData; - onSelectMode: (mode: ModeData) => void; + modeOrder?: string[]; modeResults: { mode: ModeData; result?: ComparisonResult }[]; + onSelectMode: (mode: ModeData) => void; + selectedMode: ModeData; } export const ModeSelector = ({ isAccepted, - selectedMode, + modeOrder, modeResults, onSelectMode, + selectedMode, }: ModeSelectorProps) => { const aggregate = aggregateResult(modeResults.map(({ result }) => result)); if (!aggregate) return null; @@ -53,13 +55,20 @@ export const ModeSelector = ({ const links = modeResults.length > 1 && - modeResults.map(({ mode, result }) => ({ - id: mode.name, - title: mode.name, - right: !isAccepted && result !== ComparisonResult.Equal && , - onClick: () => onSelectMode(mode), - active: selectedMode.name === mode.name, - })); + modeResults + .map(({ mode, result }) => ({ + id: mode.name, + title: mode.name, + right: !isAccepted && result !== ComparisonResult.Equal && , + onClick: () => onSelectMode(mode), + active: selectedMode.name === mode.name, + })) + .sort((a, b) => { + if (!modeOrder) return 0; + const ia = modeOrder.indexOf(a.title); + const ib = modeOrder.indexOf(b.title); + return ia !== -1 && ib !== -1 ? ia - ib : 0; + }); return ( 0 && ( ; const useGlobalValue = (key: string) => { try { - return useGlobals()[0][key]; + // eslint-disable-next-line react-hooks/rules-of-hooks + return [useGlobals()[0][key], useGlobalTypes()[key]]; } catch (e) { - return null; + return [null, null]; } }; @@ -19,7 +20,7 @@ const useGlobalValue = (key: string) => { * for the same story. */ export function useTests(tests: StoryTestFieldsFragment[]) { - const theme = useGlobalValue("theme"); + const [theme, themeType] = useGlobalValue("theme"); const [selectedBrowserId, onSelectBrowserId] = useState(() => { const test = tests.find(({ status }) => status !== TestStatus.Passed) || tests[0]; return test?.comparisons[0]?.browser.id; @@ -40,6 +41,7 @@ export function useTests(tests: StoryTestFieldsFragment[]) { selectedTest?.comparisons[0]; return { + modeOrder: themeType?.toolbar?.items?.map((item: { title: string }) => item.title), selectedTest, selectedComparison, onSelectBrowser,