diff --git a/apps/web/core/components/home/user-greetings.tsx b/apps/web/core/components/home/user-greetings.tsx index 8d5d6cc1e86..f48b82c63fd 100644 --- a/apps/web/core/components/home/user-greetings.tsx +++ b/apps/web/core/components/home/user-greetings.tsx @@ -7,9 +7,8 @@ // plane types import { useTranslation } from "@plane/i18n"; import type { IUser } from "@plane/types"; -// plane ui // hooks -import { useCurrentTime } from "@/hooks/use-current-time"; +import { useGreeting } from "@/hooks/use-greeting"; export interface IUserGreetingsView { user: IUser; @@ -17,41 +16,16 @@ export interface IUserGreetingsView { export function UserGreetingsView(props: IUserGreetingsView) { const { user } = props; - // current time hook - const { currentTime } = useCurrentTime(); - // store hooks + const { greeting, timeString, weekDay, date } = useGreeting(user); const { t } = useTranslation(); - const hour = new Intl.DateTimeFormat("en-US", { - hour12: false, - hour: "numeric", - }).format(currentTime); - - const date = new Intl.DateTimeFormat("en-US", { - month: "short", - day: "numeric", - }).format(currentTime); - - const weekDay = new Intl.DateTimeFormat("en-US", { - weekday: "long", - }).format(currentTime); - - const timeString = new Intl.DateTimeFormat("en-US", { - timeZone: user?.user_timezone, - hour12: false, // Use 24-hour format - hour: "2-digit", - minute: "2-digit", - }).format(currentTime); - - const greeting = parseInt(hour, 10) < 12 ? "morning" : parseInt(hour, 10) < 18 ? "afternoon" : "evening"; - return (

- {t("good")} {t(greeting)}, {user?.first_name} {user?.last_name} + {t(`greetings.${greeting}`, { first_name: user?.first_name ?? "", last_name: user?.last_name ?? "" })}

-
{greeting === "morning" ? "🌤️" : greeting === "afternoon" ? "🌥️" : "🌙️"}
+
{weekDay}, {date} {timeString}
diff --git a/apps/web/core/components/user/user-greetings.tsx b/apps/web/core/components/user/user-greetings.tsx index ff00a23ca93..f48b82c63fd 100644 --- a/apps/web/core/components/user/user-greetings.tsx +++ b/apps/web/core/components/user/user-greetings.tsx @@ -6,10 +6,9 @@ // plane types import { useTranslation } from "@plane/i18n"; -// hooks import type { IUser } from "@plane/types"; -import { useCurrentTime } from "@/hooks/use-current-time"; -// types +// hooks +import { useGreeting } from "@/hooks/use-greeting"; export interface IUserGreetingsView { user: IUser; @@ -17,41 +16,16 @@ export interface IUserGreetingsView { export function UserGreetingsView(props: IUserGreetingsView) { const { user } = props; - // current time hook - const { currentTime } = useCurrentTime(); - // store hooks + const { greeting, timeString, weekDay, date } = useGreeting(user); const { t } = useTranslation(); - const hour = new Intl.DateTimeFormat("en-US", { - hour12: false, - hour: "numeric", - }).format(currentTime); - - const date = new Intl.DateTimeFormat("en-US", { - month: "short", - day: "numeric", - }).format(currentTime); - - const weekDay = new Intl.DateTimeFormat("en-US", { - weekday: "long", - }).format(currentTime); - - const timeString = new Intl.DateTimeFormat("en-US", { - timeZone: user?.user_timezone, - hour12: false, // Use 24-hour format - hour: "2-digit", - minute: "2-digit", - }).format(currentTime); - - const greeting = parseInt(hour, 10) < 12 ? "morning" : parseInt(hour, 10) < 18 ? "afternoon" : "evening"; - return (

- {t("good")} {t(greeting)}, {user?.first_name} {user?.last_name} + {t(`greetings.${greeting}`, { first_name: user?.first_name ?? "", last_name: user?.last_name ?? "" })}

-
{greeting === "morning" ? "🌤️" : greeting === "afternoon" ? "🌥️" : "🌙️"}
+
{weekDay}, {date} {timeString}
diff --git a/apps/web/core/hooks/use-greeting.ts b/apps/web/core/hooks/use-greeting.ts new file mode 100644 index 00000000000..51dcb9f54a0 --- /dev/null +++ b/apps/web/core/hooks/use-greeting.ts @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2023-present Plane Software, Inc. and contributors + * SPDX-License-Identifier: AGPL-3.0-only + * See the LICENSE file for details. + */ + +import { useMemo } from "react"; +import type { IUser } from "@plane/types"; +import { useCurrentTime } from "@/hooks/use-current-time"; + +export type TGreeting = "morning" | "afternoon" | "evening"; + +export const useGreeting = (_user: IUser) => { + const { currentTime } = useCurrentTime(); + + const hourFormatter = useMemo( + () => new Intl.DateTimeFormat("en-US", { hourCycle: "h23", hour: "numeric" }), + [] + ); + + const dateFormatter = useMemo( + () => new Intl.DateTimeFormat("en-US", { month: "short", day: "numeric" }), + [] + ); + + const weekDayFormatter = useMemo( + () => new Intl.DateTimeFormat("en-US", { weekday: "long" }), + [] + ); + + const timeStringFormatter = useMemo( + () => new Intl.DateTimeFormat("en-US", { hourCycle: "h23", hour: "2-digit", minute: "2-digit" }), + [] + ); + + const hour = hourFormatter.format(currentTime); + const date = dateFormatter.format(currentTime); + const weekDay = weekDayFormatter.format(currentTime); + const timeString = timeStringFormatter.format(currentTime); + + const hourNum = parseInt(hour, 10); + // 5–11: morning, 12–16: afternoon, 17–4: evening + const greeting: TGreeting = + hourNum >= 5 && hourNum < 12 ? "morning" : hourNum >= 12 && hourNum < 17 ? "afternoon" : "evening"; + + return { greeting, timeString, weekDay, date }; +}; diff --git a/packages/i18n/src/locales/cs/translations.ts b/packages/i18n/src/locales/cs/translations.ts index d2a818f3b89..fc9f9a281e1 100644 --- a/packages/i18n/src/locales/cs/translations.ts +++ b/packages/i18n/src/locales/cs/translations.ts @@ -489,6 +489,11 @@ export default { morning: "ráno", afternoon: "odpoledne", evening: "večer", + greetings: { + morning: "Dobré ráno, {first_name} {last_name}", + afternoon: "Dobré odpoledne, {first_name} {last_name}", + evening: "Dobrý večer, {first_name} {last_name}", + }, show_all: "Zobrazit vše", show_less: "Zobrazit méně", no_data_yet: "Zatím žádná data", diff --git a/packages/i18n/src/locales/de/translations.ts b/packages/i18n/src/locales/de/translations.ts index db4925f1f92..c39be25c285 100644 --- a/packages/i18n/src/locales/de/translations.ts +++ b/packages/i18n/src/locales/de/translations.ts @@ -502,6 +502,11 @@ export default { morning: "Morgen", afternoon: "Nachmittag", evening: "Abend", + greetings: { + morning: "Guten Morgen, {first_name} {last_name}", + afternoon: "Guten Nachmittag, {first_name} {last_name}", + evening: "Guten Abend, {first_name} {last_name}", + }, show_all: "Alle anzeigen", show_less: "Weniger anzeigen", no_data_yet: "Noch keine Daten", diff --git a/packages/i18n/src/locales/en/translations.ts b/packages/i18n/src/locales/en/translations.ts index 2885fd3f0a1..a9f69e16371 100644 --- a/packages/i18n/src/locales/en/translations.ts +++ b/packages/i18n/src/locales/en/translations.ts @@ -322,6 +322,11 @@ export default { morning: "morning", afternoon: "afternoon", evening: "evening", + greetings: { + morning: "Good morning, {first_name} {last_name}", + afternoon: "Good afternoon, {first_name} {last_name}", + evening: "Good evening, {first_name} {last_name}", + }, show_all: "Show all", show_less: "Show less", no_data_yet: "No Data yet", diff --git a/packages/i18n/src/locales/es/translations.ts b/packages/i18n/src/locales/es/translations.ts index 5ed015d06ca..6d847ef1f76 100644 --- a/packages/i18n/src/locales/es/translations.ts +++ b/packages/i18n/src/locales/es/translations.ts @@ -502,6 +502,11 @@ export default { morning: "días", afternoon: "tardes", evening: "noches", + greetings: { + morning: "Buenos días, {first_name} {last_name}", + afternoon: "Buenas tardes, {first_name} {last_name}", + evening: "Buenas noches, {first_name} {last_name}", + }, show_all: "Mostrar todo", show_less: "Mostrar menos", no_data_yet: "Aún no hay datos", diff --git a/packages/i18n/src/locales/fr/translations.ts b/packages/i18n/src/locales/fr/translations.ts index f7ace4c6914..5790f92b050 100644 --- a/packages/i18n/src/locales/fr/translations.ts +++ b/packages/i18n/src/locales/fr/translations.ts @@ -498,6 +498,11 @@ export default { morning: "matin", afternoon: "après-midi", evening: "soir", + greetings: { + morning: "Bonjour, {first_name} {last_name}", + afternoon: "Bon après-midi, {first_name} {last_name}", + evening: "Bonsoir, {first_name} {last_name}", + }, show_all: "Tout afficher", show_less: "Afficher moins", no_data_yet: "Pas encore de données", diff --git a/packages/i18n/src/locales/id/translations.ts b/packages/i18n/src/locales/id/translations.ts index f933b215e04..b8297af5aab 100644 --- a/packages/i18n/src/locales/id/translations.ts +++ b/packages/i18n/src/locales/id/translations.ts @@ -494,6 +494,11 @@ export default { morning: "pagi", afternoon: "siang", evening: "malam", + greetings: { + morning: "Selamat pagi, {first_name} {last_name}", + afternoon: "Selamat siang, {first_name} {last_name}", + evening: "Selamat malam, {first_name} {last_name}", + }, show_all: "Tampilkan semua", show_less: "Tampilkan lebih sedikit", no_data_yet: "Belum ada data", diff --git a/packages/i18n/src/locales/it/translations.ts b/packages/i18n/src/locales/it/translations.ts index a0cb1b5c54f..c50a71f3d99 100644 --- a/packages/i18n/src/locales/it/translations.ts +++ b/packages/i18n/src/locales/it/translations.ts @@ -495,6 +495,11 @@ export default { morning: "Mattina", afternoon: "Pomeriggio", evening: "Sera", + greetings: { + morning: "Buongiorno, {first_name} {last_name}", + afternoon: "Buon pomeriggio, {first_name} {last_name}", + evening: "Buonasera, {first_name} {last_name}", + }, show_all: "Mostra tutto", show_less: "Mostra meno", no_data_yet: "Nessun dato disponibile", diff --git a/packages/i18n/src/locales/ja/translations.ts b/packages/i18n/src/locales/ja/translations.ts index 6d79979904e..1a95f971c2f 100644 --- a/packages/i18n/src/locales/ja/translations.ts +++ b/packages/i18n/src/locales/ja/translations.ts @@ -488,6 +488,11 @@ export default { morning: "ございます", afternoon: "こんにちは", evening: "こんばんは", + greetings: { + morning: "おはようございます、{first_name} {last_name}", + afternoon: "こんにちは、{first_name} {last_name}", + evening: "こんばんは、{first_name} {last_name}", + }, show_all: "すべて表示", show_less: "表示を減らす", no_data_yet: "まだデータがありません", diff --git a/packages/i18n/src/locales/ko/translations.ts b/packages/i18n/src/locales/ko/translations.ts index cf7e68d36a2..943e92cf233 100644 --- a/packages/i18n/src/locales/ko/translations.ts +++ b/packages/i18n/src/locales/ko/translations.ts @@ -482,6 +482,11 @@ export default { morning: "아침", afternoon: "오후", evening: "저녁", + greetings: { + morning: "좋은 아침, {first_name} {last_name}", + afternoon: "좋은 오후, {first_name} {last_name}", + evening: "좋은 저녁, {first_name} {last_name}", + }, show_all: "모두 보기", show_less: "간략히 보기", no_data_yet: "아직 데이터 없음", diff --git a/packages/i18n/src/locales/pl/translations.ts b/packages/i18n/src/locales/pl/translations.ts index 225859e9635..e4485a1b646 100644 --- a/packages/i18n/src/locales/pl/translations.ts +++ b/packages/i18n/src/locales/pl/translations.ts @@ -488,6 +488,11 @@ export default { morning: "rano", afternoon: "po południu", evening: "wieczorem", + greetings: { + morning: "Dzień dobry, {first_name} {last_name}", + afternoon: "Dzień dobry, {first_name} {last_name}", + evening: "Dobry wieczór, {first_name} {last_name}", + }, show_all: "Pokaż wszystko", show_less: "Pokaż mniej", no_data_yet: "Brak danych", diff --git a/packages/i18n/src/locales/pt-BR/translations.ts b/packages/i18n/src/locales/pt-BR/translations.ts index 5282692a17b..8230a00647a 100644 --- a/packages/i18n/src/locales/pt-BR/translations.ts +++ b/packages/i18n/src/locales/pt-BR/translations.ts @@ -498,6 +498,11 @@ export default { morning: "manhã", afternoon: "tarde", evening: "noite", + greetings: { + morning: "Bom dia, {first_name} {last_name}", + afternoon: "Boa tarde, {first_name} {last_name}", + evening: "Boa noite, {first_name} {last_name}", + }, show_all: "Mostrar tudo", show_less: "Mostrar menos", no_data_yet: "Nenhum dado ainda", diff --git a/packages/i18n/src/locales/ro/translations.ts b/packages/i18n/src/locales/ro/translations.ts index 09a3312b6c8..a2e6028fb79 100644 --- a/packages/i18n/src/locales/ro/translations.ts +++ b/packages/i18n/src/locales/ro/translations.ts @@ -495,6 +495,11 @@ export default { morning: "dimineața", afternoon: "după-amiaza", evening: "seara", + greetings: { + morning: "Bună dimineața, {first_name} {last_name}", + afternoon: "Bună ziua, {first_name} {last_name}", + evening: "Bună seara, {first_name} {last_name}", + }, show_all: "Arată tot", show_less: "Arată mai puțin", no_data_yet: "Nicio dată încă", diff --git a/packages/i18n/src/locales/ru/translations.ts b/packages/i18n/src/locales/ru/translations.ts index 52024d06cd1..8836278187a 100644 --- a/packages/i18n/src/locales/ru/translations.ts +++ b/packages/i18n/src/locales/ru/translations.ts @@ -497,6 +497,11 @@ export default { morning: "утра", afternoon: "дня", evening: "вечера", + greetings: { + morning: "Доброе утро, {first_name} {last_name}", + afternoon: "Добрый день, {first_name} {last_name}", + evening: "Добрый вечер, {first_name} {last_name}", + }, show_all: "Показать все", show_less: "Свернуть", no_data_yet: "Нет данных", diff --git a/packages/i18n/src/locales/sk/translations.ts b/packages/i18n/src/locales/sk/translations.ts index 9a0c42e8e9e..7ed41885533 100644 --- a/packages/i18n/src/locales/sk/translations.ts +++ b/packages/i18n/src/locales/sk/translations.ts @@ -489,6 +489,11 @@ export default { morning: "ráno", afternoon: "popoludnie", evening: "večer", + greetings: { + morning: "Dobré ráno, {first_name} {last_name}", + afternoon: "Dobré popoludnie, {first_name} {last_name}", + evening: "Dobrý večer, {first_name} {last_name}", + }, show_all: "Zobraziť všetko", show_less: "Zobraziť menej", no_data_yet: "Zatiaľ žiadne dáta", diff --git a/packages/i18n/src/locales/tr-TR/translations.ts b/packages/i18n/src/locales/tr-TR/translations.ts index 4e60e0cfbec..a6145a3398e 100644 --- a/packages/i18n/src/locales/tr-TR/translations.ts +++ b/packages/i18n/src/locales/tr-TR/translations.ts @@ -490,6 +490,11 @@ export default { morning: "sabah", afternoon: "öğleden sonra", evening: "akşam", + greetings: { + morning: "Günaydın, {first_name} {last_name}", + afternoon: "İyi günler, {first_name} {last_name}", + evening: "İyi akşamlar, {first_name} {last_name}", + }, show_all: "Tümünü göster", show_less: "Daha az göster", no_data_yet: "Henüz veri yok", diff --git a/packages/i18n/src/locales/ua/translations.ts b/packages/i18n/src/locales/ua/translations.ts index 0c949cf0567..15edbd6bc5a 100644 --- a/packages/i18n/src/locales/ua/translations.ts +++ b/packages/i18n/src/locales/ua/translations.ts @@ -497,6 +497,11 @@ export default { morning: "ранку", afternoon: "дня", evening: "вечора", + greetings: { + morning: "Добрий ранок, {first_name} {last_name}", + afternoon: "Добрий день, {first_name} {last_name}", + evening: "Добрий вечір, {first_name} {last_name}", + }, show_all: "Показати все", show_less: "Показати менше", no_data_yet: "Поки що немає даних", diff --git a/packages/i18n/src/locales/vi-VN/translations.ts b/packages/i18n/src/locales/vi-VN/translations.ts index 0cc12c75ea0..1c7d1ffa282 100644 --- a/packages/i18n/src/locales/vi-VN/translations.ts +++ b/packages/i18n/src/locales/vi-VN/translations.ts @@ -495,6 +495,11 @@ export default { morning: "Buổi sáng", afternoon: "Buổi chiều", evening: "Buổi tối", + greetings: { + morning: "Chào buổi sáng, {first_name} {last_name}", + afternoon: "Chào buổi chiều, {first_name} {last_name}", + evening: "Chào buổi tối, {first_name} {last_name}", + }, show_all: "Hiển thị tất cả", show_less: "Hiển thị ít hơn", no_data_yet: "Chưa có dữ liệu", diff --git a/packages/i18n/src/locales/zh-CN/translations.ts b/packages/i18n/src/locales/zh-CN/translations.ts index 585ae13aa68..f60e3d741cf 100644 --- a/packages/i18n/src/locales/zh-CN/translations.ts +++ b/packages/i18n/src/locales/zh-CN/translations.ts @@ -477,6 +477,11 @@ export default { morning: "早上", afternoon: "下午", evening: "晚上", + greetings: { + morning: "早上好,{first_name} {last_name}", + afternoon: "下午好,{first_name} {last_name}", + evening: "晚上好,{first_name} {last_name}", + }, show_all: "显示全部", show_less: "显示更少", no_data_yet: "暂无数据", diff --git a/packages/i18n/src/locales/zh-TW/translations.ts b/packages/i18n/src/locales/zh-TW/translations.ts index 1fcf528fb1d..699f5c4751b 100644 --- a/packages/i18n/src/locales/zh-TW/translations.ts +++ b/packages/i18n/src/locales/zh-TW/translations.ts @@ -476,6 +476,11 @@ export default { morning: "早上", afternoon: "下午", evening: "晚上", + greetings: { + morning: "早安,{first_name} {last_name}", + afternoon: "午安,{first_name} {last_name}", + evening: "晚上好,{first_name} {last_name}", + }, show_all: "顯示全部", show_less: "顯示較少", no_data_yet: "尚無資料",