1- import React , { useContext , useState } from "react" ;
2- import ReactModal from 'react-modal' ;
3- import "react-toggle/style.css"
4- import { VscClose } from "react-icons/vsc"
5- import Select from 'react-select'
1+ import React , { useContext , useState } from 'react'
2+ import ReactModal from 'react-modal'
3+ import 'react-toggle/style.css'
4+ import { VscClose } from 'react-icons/vsc'
5+ import Select , { ActionMeta , MultiValue , SingleValue } from 'react-select'
6+ import { SearchEngineType } from 'src/types'
67import Toggle from 'react-toggle'
7- import '../App.css' ;
8- import './settings.css' ;
9- import PreferencesContext from '../preferences/PreferencesContext' ;
10- import ConfigurationContext from '../configuration/ConfigurationContext' ;
11- import { SUPPORTED_CARDS , SUPPORTED_SEARCH_ENGINES , APP } from '../Constants'
8+ import './settings.css'
9+ import PreferencesContext from 'src/preferences/PreferencesContext'
10+ import ConfigurationContext from 'src/configuration/ConfigurationContext'
11+ import { SUPPORTED_CARDS , SUPPORTED_SEARCH_ENGINES , APP } from 'src/Constants'
1212import {
1313 trackLanguageAdd ,
1414 trackLanguageRemove ,
@@ -19,7 +19,17 @@ import {
1919 trackTabTarget ,
2020} from 'src/lib/analytics'
2121
22- function SettingsModal ( { showSettings, setShowSettings } ) {
22+ type SettingsModalProps = {
23+ showSettings : boolean
24+ setShowSettings : ( show : boolean ) => void
25+ }
26+
27+ type OptionType = {
28+ value : string
29+ label : string
30+ }
31+
32+ export const SettingsModal = ( { showSettings, setShowSettings } : SettingsModalProps ) => {
2333 const { supportedTags } = useContext ( ConfigurationContext )
2434 const preferences = useContext ( PreferencesContext )
2535 const { dispatcher, cards, userSelectedTags, openLinksNewTab, listingMode, theme, searchEngine } =
@@ -30,32 +40,41 @@ function SettingsModal({ showSettings, setShowSettings }) {
3040 setShowSettings ( false )
3141 }
3242
33- const onTagsSelectChange = ( tags , metas ) => {
43+ const onTagsSelectChange = ( tags : MultiValue < OptionType > , metas : ActionMeta < OptionType > ) => {
3444 switch ( metas . action ) {
3545 case 'select-option' :
36- trackLanguageAdd ( metas . option . label )
46+ if ( metas . option ?. label ) {
47+ trackLanguageAdd ( metas . option . label )
48+ }
3749 break
3850 case 'remove-value' :
39- trackLanguageRemove ( metas . removedValue . label )
51+ if ( metas . removedValue ?. label ) {
52+ trackLanguageRemove ( metas . removedValue . label )
53+ }
54+
4055 break
4156 }
4257
4358 dispatcher ( { type : 'setUserSelectedTags' , value : tags } )
4459 }
4560
46- const onlistingModeChange = ( e ) => {
61+ const onlistingModeChange = ( e : React . ChangeEvent < HTMLInputElement > ) => {
4762 const value = e . target . checked ? 'compact' : 'normal'
4863 trackListingModeSelect ( value )
4964 dispatcher ( { type : 'changelistingMode' , value } )
5065 }
5166
52- const onCardSelectChange = ( cards , metas ) => {
67+ const onCardSelectChange = ( cards : MultiValue < OptionType > , metas : ActionMeta < OptionType > ) => {
5368 switch ( metas . action ) {
5469 case 'select-option' :
55- trackSourceAdd ( metas . option . label )
70+ if ( metas . option ?. label ) {
71+ trackSourceAdd ( metas . option . label )
72+ }
5673 break
5774 case 'remove-value' :
58- trackSourceRemove ( metas . removedValue . label )
75+ if ( metas . removedValue ?. label ) {
76+ trackSourceRemove ( metas . removedValue . label )
77+ }
5978 break
6079 }
6180
@@ -66,18 +85,22 @@ function SettingsModal({ showSettings, setShowSettings }) {
6685 dispatcher ( { type : 'setCards' , value : newCards } )
6786 }
6887
69- const onSearchEngineSelectChange = ( value ) => {
88+ const onSearchEngineSelectChange = ( value : SingleValue < SearchEngineType > ) => {
89+ if ( ! value ) {
90+ return
91+ }
92+
7093 trackSearchEngineSelect ( value . label )
7194 dispatcher ( { type : 'setSearchEngine' , value } )
7295 }
7396
74- const onOpenLinksNewTabChange = ( e ) => {
97+ const onOpenLinksNewTabChange = ( e : React . ChangeEvent < HTMLInputElement > ) => {
7598 const checked = e . target . checked
7699 trackTabTarget ( checked )
77100 dispatcher ( { type : 'setOpenLinksNewTab' , value : checked } )
78101 }
79102
80- const onDarkModeChange = ( e ) => {
103+ const onDarkModeChange = ( ) => {
81104 dispatcher ( { type : 'toggleTheme' } )
82105 }
83106
@@ -127,7 +150,7 @@ function SettingsModal({ showSettings, setShowSettings }) {
127150 < Select
128151 options = { SUPPORTED_CARDS }
129152 value = { selectedCards . map ( ( c ) => ( {
130- label : SUPPORTED_CARDS . find ( ( c2 ) => c . name == c2 . value ) . label ,
153+ label : SUPPORTED_CARDS . find ( ( c2 ) => c . name === c2 . value ) ? .label || '' ,
131154 value : c . name ,
132155 } ) ) }
133156 onChange = { onCardSelectChange }
@@ -138,7 +161,7 @@ function SettingsModal({ showSettings, setShowSettings }) {
138161 />
139162 < p className = "settingHint" >
140163 Missing a cool data source? create an issue{ ' ' }
141- < a href = "#" onClick = { ( e ) => window . open ( APP . supportLink , '_blank' ) } >
164+ < a href = "#" onClick = { ( _e ) => window . open ( APP . supportLink , '_blank' ) } >
142165 here
143166 </ a >
144167 </ p >
@@ -163,7 +186,7 @@ function SettingsModal({ showSettings, setShowSettings }) {
163186 < p className = "settingTitle" > Compact mode</ p >
164187 < div className = "settingContent" >
165188 < Toggle
166- checked = { listingMode == 'compact' }
189+ checked = { listingMode === 'compact' }
167190 icons = { false }
168191 onChange = { onlistingModeChange }
169192 />
@@ -175,7 +198,7 @@ function SettingsModal({ showSettings, setShowSettings }) {
175198 < div className = "settingContent" >
176199 < Select
177200 options = { SUPPORTED_SEARCH_ENGINES }
178- value = { SUPPORTED_SEARCH_ENGINES . find ( ( e ) => e . label == searchEngine ) }
201+ value = { SUPPORTED_SEARCH_ENGINES . find ( ( e ) => e . label === searchEngine ) }
179202 isMulti = { false }
180203 isClearable = { false }
181204 isSearchable = { false }
@@ -193,6 +216,5 @@ function SettingsModal({ showSettings, setShowSettings }) {
193216 </ div >
194217 </ ReactModal >
195218 )
219+ return < div > </ div >
196220}
197-
198- export default SettingsModal
0 commit comments