From 60ace107797e949afdb3fb320b49c6e2d2edc4b8 Mon Sep 17 00:00:00 2001 From: Nigel Wright Date: Thu, 28 Jan 2021 20:19:30 +1300 Subject: [PATCH 1/2] Fix: added a check for invalid timezone --- .../src/layout/HomepageTimer/HomepageTimer.tsx | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/core/src/layout/HomepageTimer/HomepageTimer.tsx b/packages/core/src/layout/HomepageTimer/HomepageTimer.tsx index 59b7f3fb3d..219665599c 100644 --- a/packages/core/src/layout/HomepageTimer/HomepageTimer.tsx +++ b/packages/core/src/layout/HomepageTimer/HomepageTimer.tsx @@ -39,18 +39,28 @@ function getTimes(configApi: ConfigApi) { for (const clock of clockConfigs) { if (clock.has('label') && clock.has('timezone')) { + let label = clock.getString('label'); + const options = { timeZone: clock.getString('timezone'), ...timeFormat, }; - const time = d.toLocaleTimeString(lang, options); - const label = clock.getString('label'); + try { + new Date().toLocaleString(lang, options); + } catch (e) { + // eslint-disable-next-line no-console + console.warn( + `The timezone ${options.timeZone} is invalid. Defaulting to America/Los Angeles`, + ); + options.timeZone = 'America/Los_Angeles'; + label = 'Los Angeles'; + } + const time = d.toLocaleTimeString(lang, options); clocks.push({ time, label }); } } - return clocks; } From 4c98fbd8c1ec74db1d5849a84c327d0550d5d637 Mon Sep 17 00:00:00 2001 From: Nigel Wright Date: Sat, 30 Jan 2021 16:12:35 +1300 Subject: [PATCH 2/2] Fix: defaulted timezone to GMT and added test --- .../HomepageTimer/HomepageTimer.test.tsx | 53 +++++++++++++++++++ .../layout/HomepageTimer/HomepageTimer.tsx | 6 +-- 2 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 packages/core/src/layout/HomepageTimer/HomepageTimer.test.tsx diff --git a/packages/core/src/layout/HomepageTimer/HomepageTimer.test.tsx b/packages/core/src/layout/HomepageTimer/HomepageTimer.test.tsx new file mode 100644 index 0000000000..40b0c266e0 --- /dev/null +++ b/packages/core/src/layout/HomepageTimer/HomepageTimer.test.tsx @@ -0,0 +1,53 @@ +/* + * Copyright 2021 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { renderWithEffects } from '@backstage/test-utils'; +import { HomepageTimer } from './HomepageTimer'; +import React from 'react'; +import { lightTheme } from '@backstage/theme'; +import { ThemeProvider } from '@material-ui/core'; + +import { + ApiProvider, + ApiRegistry, + ConfigReader, + ConfigApi, + configApiRef, +} from '@backstage/core-api'; + +it('changes default timezone to GMT', async () => { + const configApi: ConfigApi = new ConfigReader({ + homepage: { + clocks: [ + { + label: 'New York', + timezone: 'America/New_Pork', + }, + ], + }, + context: 'test', + }); + + const rendered = await renderWithEffects( + + + + + , + ); + + expect(rendered.getByText('GMT')).toBeInTheDocument(); +}); diff --git a/packages/core/src/layout/HomepageTimer/HomepageTimer.tsx b/packages/core/src/layout/HomepageTimer/HomepageTimer.tsx index 219665599c..2adbf8fbd5 100644 --- a/packages/core/src/layout/HomepageTimer/HomepageTimer.tsx +++ b/packages/core/src/layout/HomepageTimer/HomepageTimer.tsx @@ -51,10 +51,10 @@ function getTimes(configApi: ConfigApi) { } catch (e) { // eslint-disable-next-line no-console console.warn( - `The timezone ${options.timeZone} is invalid. Defaulting to America/Los Angeles`, + `The timezone ${options.timeZone} is invalid. Defaulting to GMT`, ); - options.timeZone = 'America/Los_Angeles'; - label = 'Los Angeles'; + options.timeZone = 'GMT'; + label = 'GMT'; } const time = d.toLocaleTimeString(lang, options);