Skip to content

Commit adf68dc

Browse files
authored
Merge pull request #33186 from suneox/fix/30468-auto-select-timezone
#30468 parse supported timezone
2 parents 71f671a + e3b7c1f commit adf68dc

File tree

4 files changed

+161
-4
lines changed

4 files changed

+161
-4
lines changed

src/TIMEZONES.ts

+136-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
/* eslint-disable @typescript-eslint/naming-convention */
12
// All timezones were taken from: https://raw.githubusercontent.com/leon-do/Timezones/main/timezone.json
2-
export default [
3+
const TIMEZONES = [
34
'Africa/Abidjan',
45
'Africa/Accra',
56
'Africa/Addis_Ababa',
@@ -419,3 +420,137 @@ export default [
419420
'Pacific/Wake',
420421
'Pacific/Wallis',
421422
] as const;
423+
424+
/**
425+
* The timezones supported in browser and on native devices differ, so we must map each timezone to its supported equivalent.
426+
* Data sourced from https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
427+
*/
428+
const timezoneBackwardMap: Record<string, (typeof TIMEZONES)[number]> = {
429+
'Africa/Asmera': 'Africa/Nairobi',
430+
'Africa/Timbuktu': 'Africa/Abidjan',
431+
'America/Argentina/ComodRivadavia': 'America/Argentina/Catamarca',
432+
'America/Atka': 'America/Adak',
433+
'America/Buenos_Aires': 'America/Argentina/Buenos_Aires',
434+
'America/Catamarca': 'America/Argentina/Catamarca',
435+
'America/Coral_Harbour': 'America/Panama',
436+
'America/Cordoba': 'America/Argentina/Cordoba',
437+
'America/Ensenada': 'America/Tijuana',
438+
'America/Fort_Wayne': 'America/Indiana/Indianapolis',
439+
'America/Godthab': 'America/Nuuk',
440+
'America/Indianapolis': 'America/Indiana/Indianapolis',
441+
'America/Jujuy': 'America/Argentina/Jujuy',
442+
'America/Knox_IN': 'America/Indiana/Knox',
443+
'America/Louisville': 'America/Kentucky/Louisville',
444+
'America/Mendoza': 'America/Argentina/Mendoza',
445+
'America/Montreal': 'America/Toronto',
446+
'America/Nipigon': 'America/Toronto',
447+
'America/Pangnirtung': 'America/Iqaluit',
448+
'America/Porto_Acre': 'America/Rio_Branco',
449+
'America/Rainy_River': 'America/Winnipeg',
450+
'America/Rosario': 'America/Argentina/Cordoba',
451+
'America/Santa_Isabel': 'America/Tijuana',
452+
'America/Shiprock': 'America/Denver',
453+
'America/Thunder_Bay': 'America/Toronto',
454+
'America/Virgin': 'America/Puerto_Rico',
455+
'America/Yellowknife': 'America/Edmonton',
456+
'Antarctica/South_Pole': 'Pacific/Auckland',
457+
'Asia/Ashkhabad': 'Asia/Ashgabat',
458+
'Asia/Calcutta': 'Asia/Kolkata',
459+
'Asia/Chongqing': 'Asia/Shanghai',
460+
'Asia/Chungking': 'Asia/Shanghai',
461+
'Asia/Dacca': 'Asia/Dhaka',
462+
'Asia/Harbin': 'Asia/Shanghai',
463+
'Asia/Istanbul': 'Europe/Istanbul',
464+
'Asia/Kashgar': 'Asia/Urumqi',
465+
'Asia/Katmandu': 'Asia/Kathmandu',
466+
'Asia/Macao': 'Asia/Macau',
467+
'Asia/Rangoon': 'Asia/Yangon',
468+
'Asia/Saigon': 'Asia/Ho_Chi_Minh',
469+
'Asia/Tel_Aviv': 'Asia/Jerusalem',
470+
'Asia/Thimbu': 'Asia/Thimphu',
471+
'Asia/Ujung_Pandang': 'Asia/Makassar',
472+
'Asia/Ulan_Bator': 'Asia/Ulaanbaatar',
473+
'Atlantic/Faeroe': 'Atlantic/Faroe',
474+
'Atlantic/Jan_Mayen': 'Europe/Berlin',
475+
'Australia/ACT': 'Australia/Sydney',
476+
'Australia/Canberra': 'Australia/Sydney',
477+
'Australia/Currie': 'Australia/Hobart',
478+
'Australia/LHI': 'Australia/Lord_Howe',
479+
'Australia/NSW': 'Australia/Sydney',
480+
'Australia/North': 'Australia/Darwin',
481+
'Australia/Queensland': 'Australia/Brisbane',
482+
'Australia/South': 'Australia/Adelaide',
483+
'Australia/Tasmania': 'Australia/Hobart',
484+
'Australia/Victoria': 'Australia/Melbourne',
485+
'Australia/West': 'Australia/Perth',
486+
'Australia/Yancowinna': 'Australia/Broken_Hill',
487+
'Brazil/Acre': 'America/Rio_Branco',
488+
'Brazil/DeNoronha': 'America/Noronha',
489+
'Brazil/East': 'America/Sao_Paulo',
490+
'Brazil/West': 'America/Manaus',
491+
'Canada/Atlantic': 'America/Halifax',
492+
'Canada/Central': 'America/Winnipeg',
493+
'Canada/Eastern': 'America/Toronto',
494+
'Canada/Mountain': 'America/Edmonton',
495+
'Canada/Newfoundland': 'America/St_Johns',
496+
'Canada/Pacific': 'America/Vancouver',
497+
'Canada/Saskatchewan': 'America/Regina',
498+
'Canada/Yukon': 'America/Whitehorse',
499+
'Chile/Continental': 'America/Santiago',
500+
'Chile/EasterIsland': 'Pacific/Easter',
501+
Cuba: 'America/Havana',
502+
Egypt: 'Africa/Cairo',
503+
Eire: 'Europe/Dublin',
504+
'Europe/Belfast': 'Europe/London',
505+
'Europe/Kiev': 'Europe/Kyiv',
506+
'Europe/Nicosia': 'Asia/Nicosia',
507+
'Europe/Tiraspol': 'Europe/Chisinau',
508+
'Europe/Uzhgorod': 'Europe/Kyiv',
509+
'Europe/Zaporozhye': 'Europe/Kyiv',
510+
GB: 'Europe/London',
511+
'GB-Eire': 'Europe/London',
512+
Hongkong: 'Asia/Hong_Kong',
513+
Iceland: 'Africa/Abidjan',
514+
Iran: 'Asia/Tehran',
515+
Israel: 'Asia/Jerusalem',
516+
Jamaica: 'America/Jamaica',
517+
Japan: 'Asia/Tokyo',
518+
Kwajalein: 'Pacific/Kwajalein',
519+
Libya: 'Africa/Tripoli',
520+
'Mexico/BajaNorte': 'America/Tijuana',
521+
'Mexico/BajaSur': 'America/Mazatlan',
522+
'Mexico/General': 'America/Mexico_City',
523+
NZ: 'Pacific/Auckland',
524+
'NZ-CHAT': 'Pacific/Chatham',
525+
Navajo: 'America/Denver',
526+
PRC: 'Asia/Shanghai',
527+
'Pacific/Enderbury': 'Pacific/Kanton',
528+
'Pacific/Johnston': 'Pacific/Honolulu',
529+
'Pacific/Ponape': 'Pacific/Guadalcanal',
530+
'Pacific/Samoa': 'Pacific/Pago_Pago',
531+
'Pacific/Truk': 'Pacific/Port_Moresby',
532+
'Pacific/Yap': 'Pacific/Port_Moresby',
533+
Poland: 'Europe/Warsaw',
534+
Portugal: 'Europe/Lisbon',
535+
ROC: 'Asia/Taipei',
536+
ROK: 'Asia/Seoul',
537+
Singapore: 'Asia/Singapore',
538+
Turkey: 'Europe/Istanbul',
539+
'US/Alaska': 'America/Anchorage',
540+
'US/Aleutian': 'America/Adak',
541+
'US/Arizona': 'America/Phoenix',
542+
'US/Central': 'America/Chicago',
543+
'US/East-Indiana': 'America/Indiana/Indianapolis',
544+
'US/Eastern': 'America/New_York',
545+
'US/Hawaii': 'Pacific/Honolulu',
546+
'US/Indiana-Starke': 'America/Indiana/Knox',
547+
'US/Michigan': 'America/Detroit',
548+
'US/Mountain': 'America/Denver',
549+
'US/Pacific': 'America/Los_Angeles',
550+
'US/Samoa': 'Pacific/Pago_Pago',
551+
'W-SU': 'Europe/Moscow',
552+
};
553+
554+
export {timezoneBackwardMap};
555+
556+
export default TIMEZONES;

src/libs/DateUtils.ts

+18
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import Onyx from 'react-native-onyx';
3030
import type {ValueOf} from 'type-fest';
3131
import CONST from '@src/CONST';
3232
import ONYXKEYS from '@src/ONYXKEYS';
33+
import {timezoneBackwardMap} from '@src/TIMEZONES';
3334
import type {SelectedTimezone, Timezone} from '@src/types/onyx/PersonalDetails';
3435
import * as CurrentDate from './actions/CurrentDate';
3536
import * as Localize from './Localize';
@@ -697,6 +698,22 @@ function formatWithUTCTimeZone(datetime: string, dateFormat: string = CONST.DATE
697698
return '';
698699
}
699700

701+
/**
702+
*
703+
* @param timezone
704+
* function format unsupported timezone to supported timezone
705+
* @returns Timezone
706+
*/
707+
function formatToSupportedTimezone(timezoneInput: Timezone): Timezone {
708+
if (!timezoneInput?.selected) {
709+
return timezoneInput;
710+
}
711+
return {
712+
selected: timezoneBackwardMap[timezoneInput.selected] ?? timezoneInput.selected,
713+
automatic: timezoneInput.automatic,
714+
};
715+
}
716+
700717
const DateUtils = {
701718
formatToDayOfWeek,
702719
formatToLongDateWithWeekday,
@@ -739,6 +756,7 @@ const DateUtils = {
739756
getWeekStartsOn,
740757
getWeekEndsOn,
741758
isTimeAtLeastOneMinuteInFuture,
759+
formatToSupportedTimezone,
742760
};
743761

744762
export default DateUtils;

src/libs/actions/App.ts

+3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import Onyx from 'react-native-onyx';
77
import type {ValueOf} from 'type-fest';
88
import * as API from '@libs/API';
99
import * as Browser from '@libs/Browser';
10+
import DateUtils from '@libs/DateUtils';
1011
import Log from '@libs/Log';
1112
import getCurrentUrl from '@libs/Navigation/currentUrl';
1213
import Navigation from '@libs/Navigation/Navigation';
@@ -448,6 +449,8 @@ function openProfile(personalDetails: OnyxTypes.PersonalDetails) {
448449
};
449450
}
450451

452+
newTimezoneData = DateUtils.formatToSupportedTimezone(newTimezoneData);
453+
451454
type OpenProfileParams = {
452455
timezone: string;
453456
};

src/libs/actions/PersonalDetails.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type {OnyxEntry, OnyxUpdate} from 'react-native-onyx';
33
import Onyx from 'react-native-onyx';
44
import * as API from '@libs/API';
55
import type {CustomRNImageManipulatorResult} from '@libs/cropOrRotateImage/types';
6+
import DateUtils from '@libs/DateUtils';
67
import * as LocalePhoneNumber from '@libs/LocalePhoneNumber';
78
import Navigation from '@libs/Navigation/Navigation';
89
import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils';
@@ -270,9 +271,9 @@ function updateAutomaticTimezone(timezone: Timezone) {
270271
type UpdateAutomaticTimezoneParams = {
271272
timezone: string;
272273
};
273-
274+
const formatedTimezone = DateUtils.formatToSupportedTimezone(timezone);
274275
const parameters: UpdateAutomaticTimezoneParams = {
275-
timezone: JSON.stringify(timezone),
276+
timezone: JSON.stringify(formatedTimezone),
276277
};
277278

278279
API.write('UpdateAutomaticTimezone', parameters, {
@@ -282,7 +283,7 @@ function updateAutomaticTimezone(timezone: Timezone) {
282283
key: ONYXKEYS.PERSONAL_DETAILS_LIST,
283284
value: {
284285
[currentUserAccountID]: {
285-
timezone,
286+
timezone: formatedTimezone,
286287
},
287288
},
288289
},

0 commit comments

Comments
 (0)