tsx
64 lines
1.45 KB
| 1 | import React, { Component } from 'react' |
| 2 | import { supportedLangs } from '../shared/i18n' |
| 3 | |
| 4 | const listStyle = { |
| 5 | listStyle: 'none' |
| 6 | } |
| 7 | |
| 8 | type OptionProps = { |
| 9 | value: string |
| 10 | name: string |
| 11 | } |
| 12 | |
| 13 | class LanguageOption extends Component<OptionProps> { |
| 14 | |
| 15 | render() { |
| 16 | return ( |
| 17 | <option value={this.props.value}>{this.props.name}</option> |
| 18 | ) |
| 19 | } |
| 20 | } |
| 21 | |
| 22 | type LanguageDropdownProps = { |
| 23 | onChangeLanguage: (language: string) => void |
| 24 | selectedLanguage: string |
| 25 | } |
| 26 | |
| 27 | type LanguageDropdownState = {} |
| 28 | |
| 29 | class LanguageDropdown extends Component<LanguageDropdownProps, LanguageDropdownState> { |
| 30 | |
| 31 | getLanguageList(): OptionProps[] { |
| 32 | const languageList: OptionProps[] = supportedLangs.map((lang) => { |
| 33 | return { |
| 34 | value: lang.code, |
| 35 | name: lang.name |
| 36 | } |
| 37 | }) |
| 38 | |
| 39 | return languageList |
| 40 | } |
| 41 | |
| 42 | render() { |
| 43 | |
| 44 | var languageList = []; |
| 45 | |
| 46 | for (let language of this.getLanguageList()) { |
| 47 | languageList.push(<LanguageOption name={language.name} value={language.value} key={language.value}/>); |
| 48 | } |
| 49 | |
| 50 | return ( |
| 51 | <div> |
| 52 | <select |
| 53 | style={listStyle} |
| 54 | onChange={ e => this.props.onChangeLanguage(e.currentTarget.value) } |
| 55 | value={this.props.selectedLanguage} |
| 56 | > |
| 57 | {languageList} |
| 58 | </select> |
| 59 | </div> |
| 60 | ) |
| 61 | } |
| 62 | } |
| 63 | |
| 64 | export default LanguageDropdown; |