@@ -15,12 +15,14 @@ See the License for the specific language governing permissions and
15
15
limitations under the License.
16
16
*/
17
17
18
- import React , { useCallback , useEffect , useState } from "react" ;
18
+ import React , { ReactElement , useCallback , useEffect , useState } from "react" ;
19
19
20
+ import { NonEmptyArray } from "../../../../../@types/common" ;
20
21
import { _t , getCurrentLanguage } from "../../../../../languageHandler" ;
21
22
import { UseCase } from "../../../../../settings/enums/UseCase" ;
22
23
import SettingsStore from "../../../../../settings/SettingsStore" ;
23
24
import Field from "../../../elements/Field" ;
25
+ import Dropdown from "../../../elements/Dropdown" ;
24
26
import { SettingLevel } from "../../../../../settings/SettingLevel" ;
25
27
import SettingsFlag from "../../../elements/SettingsFlag" ;
26
28
import AccessibleButton from "../../../elements/AccessibleButton" ;
@@ -38,12 +40,16 @@ import PlatformPeg from "../../../../../PlatformPeg";
38
40
import { IS_MAC } from "../../../../../Keyboard" ;
39
41
import SpellCheckSettings from "../../SpellCheckSettings" ;
40
42
import LabelledToggleSwitch from "../../../elements/LabelledToggleSwitch" ;
43
+ import * as TimezoneHandler from "../../../../../TimezoneHandler" ;
44
+
41
45
42
46
interface IProps {
43
47
closeSettingsFn ( success : boolean ) : void ;
44
48
}
45
49
46
50
interface IState {
51
+ timezone : string | undefined ;
52
+ timezoneSearch : string | undefined ;
47
53
autocompleteDelay : string ;
48
54
readMarkerInViewThresholdMs : string ;
49
55
readMarkerOutOfViewThresholdMs : string ;
@@ -173,10 +179,16 @@ export default class PreferencesUserSettingsTab extends React.Component<IProps,
173
179
// Autocomplete delay (niche text box)
174
180
] ;
175
181
182
+ private allTimezones : string [ ] ;
183
+
176
184
public constructor ( props : IProps ) {
177
185
super ( props ) ;
178
186
187
+ this . allTimezones = TimezoneHandler . getAllTimezones ( ) ;
188
+
179
189
this . state = {
190
+ timezone : TimezoneHandler . getUserTimezone ( ) ,
191
+ timezoneSearch : undefined ,
180
192
autocompleteDelay : SettingsStore . getValueAt ( SettingLevel . DEVICE , "autocompleteDelay" ) . toString ( 10 ) ,
181
193
readMarkerInViewThresholdMs : SettingsStore . getValueAt (
182
194
SettingLevel . DEVICE ,
@@ -189,6 +201,15 @@ export default class PreferencesUserSettingsTab extends React.Component<IProps,
189
201
} ;
190
202
}
191
203
204
+ private onTimezoneChange = ( tz : string ) : void => {
205
+ this . setState ( { timezone : tz } ) ;
206
+ TimezoneHandler . setUserTimezone ( tz ) ;
207
+ } ;
208
+
209
+ private onTimezoneSearchChange = ( search : string ) : void => {
210
+ this . setState ( { timezoneSearch : search . toLowerCase ( ) } ) ;
211
+ } ;
212
+
192
213
private onAutocompleteDelayChange = ( e : React . ChangeEvent < HTMLInputElement > ) : void => {
193
214
this . setState ( { autocompleteDelay : e . target . value } ) ;
194
215
SettingsStore . setValue ( "autocompleteDelay" , null , SettingLevel . DEVICE , e . target . value ) ;
@@ -221,6 +242,17 @@ export default class PreferencesUserSettingsTab extends React.Component<IProps,
221
242
// Only show the user onboarding setting if the user should see the user onboarding page
222
243
. filter ( ( it ) => it !== "FTUE.userOnboardingButton" || showUserOnboardingPage ( useCase ) ) ;
223
244
245
+ const timezones = (
246
+ ! this . state . timezoneSearch ? this . allTimezones : this . allTimezones . filter ( ( tz ) => {
247
+ return tz . toLowerCase ( ) . includes ( this . state . timezoneSearch ! )
248
+ } )
249
+ ) . map ( ( tz ) => {
250
+ return < div key = { tz } > { tz } </ div > ;
251
+ } ) ;
252
+ timezones . unshift (
253
+ < div key = "" > { _t ( "settings|preferences|defaultTimezone" ) } </ div >
254
+ ) ;
255
+
224
256
return (
225
257
< SettingsTab data-testid = "mx_PreferencesUserSettingsTab" >
226
258
< SettingsSection >
@@ -259,6 +291,23 @@ export default class PreferencesUserSettingsTab extends React.Component<IProps,
259
291
260
292
< SettingsSubsection heading = { _t ( "settings|preferences|time_heading" ) } >
261
293
{ this . renderGroup ( PreferencesUserSettingsTab . TIME_SETTINGS ) }
294
+
295
+ < div className = "mx_SettingsFlag" >
296
+ < label className = "mx_SettingsFlag_label" htmlFor = "mx_dropdownUserTimezone" >
297
+ < span className = "mx_SettingsFlag_labelText" > { _t ( "settings|preferences|userTimezone" ) } </ span >
298
+ </ label >
299
+ < Dropdown
300
+ id = "mx_dropdownUserTimezone"
301
+ searchEnabled = { true }
302
+ value = { this . state . timezone }
303
+ label = { _t ( "settings|preferences|userTimezone" ) }
304
+ placeholder = { _t ( "settings|preferences|defaultTimezone" ) }
305
+ onOptionChange = { this . onTimezoneChange }
306
+ onSearchChange = { this . onTimezoneSearchChange }
307
+ >
308
+ { timezones as NonEmptyArray < ReactElement & { key : string } > }
309
+ </ Dropdown >
310
+ </ div >
262
311
</ SettingsSubsection >
263
312
264
313
< SettingsSubsection
0 commit comments