Merge pull request #18613 from grvpandey11/master

Add Optional Language Variable to WelcomeTitle Component [New PR]
This commit is contained in:
Camila Belo
2023-07-23 17:45:05 +02:00
committed by GitHub
8 changed files with 63 additions and 4 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-home': patch
---
Now, user can provide a language (optional) as input to receive a greeting in that specific language. Example: `<WelcomeTitle language={['English', 'Spanish']} />`
+8 -1
View File
@@ -184,5 +184,12 @@ export type ToolkitContentProps = {
};
// @public
export const WelcomeTitle: () => JSX.Element;
export const WelcomeTitle: ({
language,
}: WelcomeTitleLanguageProps) => JSX.Element;
// @public (undocumented)
export type WelcomeTitleLanguageProps = {
language?: string[];
};
```
@@ -29,3 +29,13 @@ export default {
export const Default = () => {
return <Header title={<WelcomeTitle />} pageTitleOverride="Home" />;
};
export const withLanguage = () => {
const languages = ['English', 'Spanish'];
return (
<Header
title={<WelcomeTitle language={languages} />}
pageTitleOverride="Home"
/>
);
};
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { renderInTestApp } from '@backstage/test-utils';
import React from 'react';
import { WelcomeTitle } from './WelcomeTitle';
@@ -30,3 +31,15 @@ describe('<WelcomeTitle>', () => {
expect(getByText(/Get some rest, Guest/)).toBeInTheDocument();
});
});
test('should greet user with a single language', async () => {
jest
.spyOn(global.Date, 'now')
.mockImplementation(() => new Date('1970-01-01T10:00:00').valueOf());
const { getByText } = await renderInTestApp(
<WelcomeTitle language={['English']} />,
);
expect(getByText(/Good morning, Guest/)).toBeInTheDocument();
});
@@ -23,10 +23,15 @@ import React, { useEffect, useMemo } from 'react';
import useAsync from 'react-use/lib/useAsync';
import { getTimeBasedGreeting } from './timeUtil';
export const WelcomeTitle = () => {
/** @public */
export type WelcomeTitleLanguageProps = {
language?: string[];
};
export const WelcomeTitle = ({ language }: WelcomeTitleLanguageProps) => {
const identityApi = useApi(identityApiRef);
const alertApi = useApi(alertApiRef);
const greeting = useMemo(() => getTimeBasedGreeting(), []);
const greeting = useMemo(() => getTimeBasedGreeting(language), [language]);
const { value: profile, error } = useAsync(() =>
identityApi.getProfileInfo(),
@@ -14,3 +14,4 @@
* limitations under the License.
*/
export { WelcomeTitle } from './WelcomeTitle';
export type { WelcomeTitleLanguageProps } from './WelcomeTitle';
@@ -22,7 +22,10 @@ import goodEvening from './locales/goodEvening.locales.json';
// every time the user navigates.
const greetingRandomSeed = Math.floor(Math.random() * 1000000);
export function getTimeBasedGreeting(): { language: string; greeting: string } {
export function getTimeBasedGreeting(language?: string[]): {
language: string;
greeting: string;
} {
const random = (array: string[]) => array[greetingRandomSeed % array.length];
const currentHour = new Date(Date.now()).getHours();
@@ -32,12 +35,26 @@ export function getTimeBasedGreeting(): { language: string; greeting: string } {
greeting: 'Get some rest',
};
}
const timeOfDay = (hour: number): { [language: string]: string } => {
if (hour < 12) return goodMorning;
if (hour < 17) return goodAfternoon;
return goodEvening;
};
const greetings = timeOfDay(currentHour);
if (Array.isArray(language) && language.length > 0) {
const validLanguages = language.filter(lang => lang && greetings[lang]);
if (validLanguages.length > 0) {
const greetingsKey = random(validLanguages);
return {
language: greetingsKey,
greeting: greetings[greetingsKey],
};
}
}
const greetingsKey = random(Object.keys(greetings));
return {
language: greetingsKey,
@@ -16,3 +16,4 @@
export type { ToolkitContentProps, Tool } from './Toolkit';
export type { ClockConfig } from './HeaderWorldClock';
export type { WelcomeTitleLanguageProps } from './WelcomeTitle';