|
1 | 1 | import React, { useEffect } from "react"; |
2 | | -import { useLanguage } from "./LanguageContext"; |
| 2 | +import { useLanguage, type DocsLanguage } from "./LanguageStore"; |
3 | 3 | import clsx from "clsx"; |
4 | 4 |
|
5 | | -const languages = [ |
6 | | - { label: "C#", value: "csharp", brand: "#9179E4" }, |
7 | | - { label: "Java", value: "java", brand: "#f89820" }, |
8 | | - { label: "Python", value: "python", brand: "#fbcb24" }, |
9 | | - { label: "PHP", value: "php", brand: "#8993be" }, |
10 | | - { label: "Node.JS", value: "nodejs", brand: "#3c873a" }, |
| 5 | +interface LanguageOption { |
| 6 | + label: string; |
| 7 | + value: DocsLanguage; |
| 8 | + brand: string; |
| 9 | +} |
| 10 | + |
| 11 | +const languageOptions: LanguageOption[] = [ |
| 12 | + { label: "C#", value: "csharp", brand: "#9179E4" }, |
| 13 | + { label: "Java", value: "java", brand: "#f89820" }, |
| 14 | + { label: "Python", value: "python", brand: "#fbcb24" }, |
| 15 | + { label: "PHP", value: "php", brand: "#8993be" }, |
| 16 | + { label: "Node.JS", value: "nodejs", brand: "#3c873a" }, |
11 | 17 | ]; |
12 | 18 |
|
13 | 19 | type LanguageSwitcherProps = { |
14 | | - supportedLanguages: string[]; |
| 20 | + supportedLanguages: DocsLanguage[]; |
| 21 | + flush?: boolean; |
15 | 22 | }; |
16 | 23 |
|
17 | 24 | export default function LanguageSwitcher({ |
18 | | - supportedLanguages, |
| 25 | + supportedLanguages, |
| 26 | + flush = false, |
19 | 27 | }: LanguageSwitcherProps) { |
20 | | - const { language, setLanguage } = useLanguage(); |
21 | | - |
22 | | - useEffect(() => { |
23 | | - if (!supportedLanguages.includes(language)) { |
24 | | - setLanguage(supportedLanguages[0]); |
25 | | - } |
26 | | - }, [supportedLanguages, language, setLanguage]); |
27 | | - |
28 | | - return ( |
29 | | - <div className="flex flex-wrap gap-2 mb-8"> |
30 | | - {languages |
31 | | - .filter((lang) => supportedLanguages.includes(lang.value)) |
32 | | - .map((lang) => { |
33 | | - const isActive = language === lang.value; |
34 | | - |
35 | | - return ( |
36 | | - <button |
37 | | - key={lang.value} |
38 | | - type="button" |
39 | | - onClick={() => setLanguage(lang.value)} |
40 | | - className={clsx( |
41 | | - "px-3 py-1.5 rounded-md border text-sm transition-colors cursor-pointer", |
42 | | - "border-gray-300 text-gray-500 hover:bg-black/5 hover:border-gray-500 hover:text-gray-600", |
43 | | - "dark:text-gray-300 dark:border-gray-600 dark:hover:text-gray-200 dark:hover:border-gray-400 dark:hover:bg-white/5", |
44 | | - )} |
45 | | - style={ |
46 | | - isActive |
47 | | - ? { |
48 | | - backgroundColor: `${lang.brand}20`, |
49 | | - color: lang.brand, |
50 | | - borderColor: lang.brand, |
51 | | - } |
52 | | - : {} |
53 | | - } |
54 | | - > |
55 | | - {lang.label} |
56 | | - </button> |
57 | | - ); |
58 | | - })} |
59 | | - </div> |
60 | | - ); |
| 28 | + const { language, setLanguage } = useLanguage(); |
| 29 | + |
| 30 | + const isCurrentLanguageSupported = supportedLanguages.includes(language); |
| 31 | + const firstSupportedLanguage = supportedLanguages[0]; |
| 32 | + |
| 33 | + useEffect(() => { |
| 34 | + if (!isCurrentLanguageSupported) { |
| 35 | + setLanguage(firstSupportedLanguage); |
| 36 | + } |
| 37 | + }, [isCurrentLanguageSupported, firstSupportedLanguage, setLanguage]); |
| 38 | + |
| 39 | + return ( |
| 40 | + <div className={clsx("flex flex-wrap gap-2", { 'mb-8': !flush })}> |
| 41 | + {languageOptions |
| 42 | + .filter((lang) => supportedLanguages.includes(lang.value)) |
| 43 | + .map((lang) => { |
| 44 | + const isActive = language === lang.value; |
| 45 | + |
| 46 | + return ( |
| 47 | + <button |
| 48 | + key={lang.value} |
| 49 | + type="button" |
| 50 | + onClick={() => setLanguage(lang.value)} |
| 51 | + className={clsx( |
| 52 | + "px-3 py-1.5 rounded-md border text-sm transition-colors cursor-pointer", |
| 53 | + "border-gray-300 text-gray-500 hover:bg-black/5 hover:border-gray-500 hover:text-gray-600", |
| 54 | + "dark:text-gray-300 dark:border-gray-600 dark:hover:text-gray-200 dark:hover:border-gray-400 dark:hover:bg-white/5", |
| 55 | + )} |
| 56 | + style={ |
| 57 | + isActive |
| 58 | + ? { |
| 59 | + backgroundColor: `${lang.brand}20`, |
| 60 | + color: lang.brand, |
| 61 | + borderColor: lang.brand, |
| 62 | + } |
| 63 | + : {} |
| 64 | + } |
| 65 | + > |
| 66 | + {lang.label} |
| 67 | + </button> |
| 68 | + ); |
| 69 | + })} |
| 70 | + </div> |
| 71 | + ); |
61 | 72 | } |
0 commit comments