Skip to content
Open
28 changes: 22 additions & 6 deletions apps/web/core/components/home/user-greetings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
*/

// plane types
import { useMemo } from "react";
import { useTranslation } from "@plane/i18n";
import type { IUser } from "@plane/types";
// plane ui
Expand All @@ -22,36 +23,51 @@ export function UserGreetingsView(props: IUserGreetingsView) {
// store hooks
const { t } = useTranslation();

const userTimezone = useMemo(() => {
if (!user?.user_timezone) return undefined;
try {
new Intl.DateTimeFormat(undefined, { timeZone: user.user_timezone });
return user.user_timezone;
} catch (e) {
console.warn(`[UserGreetingsView] Invalid user_timezone "${user.user_timezone}", falling back to browser timezone.`, e);
return undefined;
}
}, [user?.user_timezone]);

const hour = new Intl.DateTimeFormat("en-US", {
hour12: false,
timeZone: userTimezone,
hourCycle: "h23",
hour: "numeric",
}).format(currentTime);

const date = new Intl.DateTimeFormat("en-US", {
timeZone: userTimezone,
month: "short",
day: "numeric",
}).format(currentTime);

const weekDay = new Intl.DateTimeFormat("en-US", {
timeZone: userTimezone,
weekday: "long",
}).format(currentTime);

const timeString = new Intl.DateTimeFormat("en-US", {
timeZone: user?.user_timezone,
hour12: false, // Use 24-hour format
timeZone: userTimezone,
hourCycle: "h23",
hour: "2-digit",
minute: "2-digit",
}).format(currentTime);

const greeting = parseInt(hour, 10) < 12 ? "morning" : parseInt(hour, 10) < 18 ? "afternoon" : "evening";
const hourNum = parseInt(hour, 10);
const greeting = hourNum < 5 ? "night" : hourNum < 12 ? "morning" : hourNum < 18 ? "afternoon" : "evening";

return (
<div className="my-6 flex flex-col items-center">
<h2 className="text-center text-20 font-semibold">
{t("good")} {t(greeting)}, {user?.first_name} {user?.last_name}
{t(`greetings.${greeting}`, { first_name: user?.first_name ?? "", last_name: user?.last_name ?? "" })}
</h2>
<h5 className="flex items-center gap-2 font-medium text-placeholder">
<div>{greeting === "morning" ? "🌤️" : greeting === "afternoon" ? "🌥️" : "🌙"}</div>
<div>{greeting === "morning" ? "🌤️" : greeting === "afternoon" ? "🌥️" : "🌙"}</div>
<div>
{weekDay}, {date} {timeString}
</div>
Expand Down
28 changes: 22 additions & 6 deletions apps/web/core/components/user/user-greetings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
*/

// plane types
import { useMemo } from "react";
import { useTranslation } from "@plane/i18n";
// hooks
import type { IUser } from "@plane/types";
Expand All @@ -22,36 +23,51 @@ export function UserGreetingsView(props: IUserGreetingsView) {
// store hooks
const { t } = useTranslation();

const userTimezone = useMemo(() => {
if (!user?.user_timezone) return undefined;
try {
new Intl.DateTimeFormat(undefined, { timeZone: user.user_timezone });
return user.user_timezone;
} catch (e) {
console.warn(`[UserGreetingsView] Invalid user_timezone "${user.user_timezone}", falling back to browser timezone.`, e);
return undefined;
}
}, [user?.user_timezone]);

const hour = new Intl.DateTimeFormat("en-US", {
hour12: false,
timeZone: userTimezone,
hourCycle: "h23",
hour: "numeric",
}).format(currentTime);

const date = new Intl.DateTimeFormat("en-US", {
timeZone: userTimezone,
month: "short",
day: "numeric",
}).format(currentTime);

const weekDay = new Intl.DateTimeFormat("en-US", {
timeZone: userTimezone,
weekday: "long",
}).format(currentTime);

const timeString = new Intl.DateTimeFormat("en-US", {
timeZone: user?.user_timezone,
hour12: false, // Use 24-hour format
timeZone: userTimezone,
hourCycle: "h23",
hour: "2-digit",
minute: "2-digit",
}).format(currentTime);

const greeting = parseInt(hour, 10) < 12 ? "morning" : parseInt(hour, 10) < 18 ? "afternoon" : "evening";
const hourNum = parseInt(hour, 10);
const greeting = hourNum < 5 ? "night" : hourNum < 12 ? "morning" : hourNum < 18 ? "afternoon" : "evening";

return (
<div className="my-6 flex flex-col items-center">
<h2 className="text-center text-20 font-semibold">
{t("good")} {t(greeting)}, {user?.first_name} {user?.last_name}
{t(`greetings.${greeting}`, { first_name: user?.first_name ?? "", last_name: user?.last_name ?? "" })}
</h2>
<h5 className="flex items-center gap-2 font-medium text-placeholder">
<div>{greeting === "morning" ? "🌤️" : greeting === "afternoon" ? "🌥️" : "🌙"}</div>
<div>{greeting === "morning" ? "🌤️" : greeting === "afternoon" ? "🌥️" : "🌙"}</div>
<div>
{weekDay}, {date} {timeString}
</div>
Expand Down
7 changes: 7 additions & 0 deletions packages/i18n/src/locales/cs/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -489,6 +489,13 @@ export default {
morning: "ráno",
afternoon: "odpoledne",
evening: "večer",
night: "noc",
greetings: {
morning: "Dobré ráno, {first_name} {last_name}",
afternoon: "Dobré odpoledne, {first_name} {last_name}",
evening: "Dobrý večer, {first_name} {last_name}",
night: "Dobrou noc, {first_name} {last_name}",
},
show_all: "Zobrazit vše",
show_less: "Zobrazit méně",
no_data_yet: "Zatím žádná data",
Expand Down
7 changes: 7 additions & 0 deletions packages/i18n/src/locales/de/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,13 @@ export default {
morning: "Morgen",
afternoon: "Nachmittag",
evening: "Abend",
night: "Nacht",
greetings: {
morning: "Guten Morgen, {first_name} {last_name}",
afternoon: "Guten Nachmittag, {first_name} {last_name}",
evening: "Guten Abend, {first_name} {last_name}",
night: "Gute Nacht, {first_name} {last_name}",
},
show_all: "Alle anzeigen",
show_less: "Weniger anzeigen",
no_data_yet: "Noch keine Daten",
Expand Down
7 changes: 7 additions & 0 deletions packages/i18n/src/locales/en/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,13 @@ export default {
morning: "morning",
afternoon: "afternoon",
evening: "evening",
night: "night",
greetings: {
morning: "Good morning, {first_name} {last_name}",
afternoon: "Good afternoon, {first_name} {last_name}",
evening: "Good evening, {first_name} {last_name}",
night: "Good night, {first_name} {last_name}",
},
show_all: "Show all",
show_less: "Show less",
no_data_yet: "No Data yet",
Expand Down
7 changes: 7 additions & 0 deletions packages/i18n/src/locales/es/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,13 @@ export default {
morning: "días",
afternoon: "tardes",
evening: "noches",
night: "noche",
greetings: {
morning: "Buenos días, {first_name} {last_name}",
afternoon: "Buenas tardes, {first_name} {last_name}",
evening: "Buenas noches, {first_name} {last_name}",
night: "Buenas noches, {first_name} {last_name}",
},
show_all: "Mostrar todo",
show_less: "Mostrar menos",
no_data_yet: "Aún no hay datos",
Expand Down
7 changes: 7 additions & 0 deletions packages/i18n/src/locales/fr/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -498,6 +498,13 @@ export default {
morning: "matin",
afternoon: "après-midi",
evening: "soir",
night: "nuit",
greetings: {
morning: "Bonjour, {first_name} {last_name}",
afternoon: "Bon après-midi, {first_name} {last_name}",
evening: "Bonsoir, {first_name} {last_name}",
night: "Bonne nuit, {first_name} {last_name}",
},
show_all: "Tout afficher",
show_less: "Afficher moins",
no_data_yet: "Pas encore de données",
Expand Down
7 changes: 7 additions & 0 deletions packages/i18n/src/locales/id/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -494,6 +494,13 @@ export default {
morning: "pagi",
afternoon: "siang",
evening: "malam",
night: "dini hari",
greetings: {
morning: "Selamat pagi, {first_name} {last_name}",
afternoon: "Selamat siang, {first_name} {last_name}",
evening: "Selamat malam, {first_name} {last_name}",
night: "Selamat malam, {first_name} {last_name}",
},
show_all: "Tampilkan semua",
show_less: "Tampilkan lebih sedikit",
no_data_yet: "Belum ada data",
Expand Down
7 changes: 7 additions & 0 deletions packages/i18n/src/locales/it/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -495,6 +495,13 @@ export default {
morning: "Mattina",
afternoon: "Pomeriggio",
evening: "Sera",
night: "notte",
greetings: {
morning: "Buongiorno, {first_name} {last_name}",
afternoon: "Buon pomeriggio, {first_name} {last_name}",
evening: "Buonasera, {first_name} {last_name}",
night: "Buonanotte, {first_name} {last_name}",
},
show_all: "Mostra tutto",
show_less: "Mostra meno",
no_data_yet: "Nessun dato disponibile",
Expand Down
7 changes: 7 additions & 0 deletions packages/i18n/src/locales/ja/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -488,6 +488,13 @@ export default {
morning: "ございます",
afternoon: "こんにちは",
evening: "こんばんは",
night: "夜",
greetings: {
morning: "おはようございます、{first_name} {last_name}",
afternoon: "こんにちは、{first_name} {last_name}",
evening: "こんばんは、{first_name} {last_name}",
night: "おやすみなさい、{first_name} {last_name}",
},
show_all: "すべて表示",
show_less: "表示を減らす",
no_data_yet: "まだデータがありません",
Expand Down
7 changes: 7 additions & 0 deletions packages/i18n/src/locales/ko/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -482,6 +482,13 @@ export default {
morning: "아침",
afternoon: "오후",
evening: "저녁",
night: "밤",
greetings: {
morning: "좋은 아침, {first_name} {last_name}",
afternoon: "좋은 오후, {first_name} {last_name}",
evening: "좋은 저녁, {first_name} {last_name}",
night: "좋은 밤, {first_name} {last_name}",
},
show_all: "모두 보기",
show_less: "간략히 보기",
no_data_yet: "아직 데이터 없음",
Expand Down
7 changes: 7 additions & 0 deletions packages/i18n/src/locales/pl/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -488,6 +488,13 @@ export default {
morning: "rano",
afternoon: "po południu",
evening: "wieczorem",
night: "noc",
greetings: {
morning: "Dzień dobry, {first_name} {last_name}",
afternoon: "Dzień dobry, {first_name} {last_name}",
evening: "Dobry wieczór, {first_name} {last_name}",
night: "Dobranoc, {first_name} {last_name}",
},
show_all: "Pokaż wszystko",
show_less: "Pokaż mniej",
no_data_yet: "Brak danych",
Expand Down
7 changes: 7 additions & 0 deletions packages/i18n/src/locales/pt-BR/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -498,6 +498,13 @@ export default {
morning: "manhã",
afternoon: "tarde",
evening: "noite",
night: "noite",
greetings: {
morning: "Bom dia, {first_name} {last_name}",
afternoon: "Boa tarde, {first_name} {last_name}",
evening: "Boa noite, {first_name} {last_name}",
night: "Boa noite, {first_name} {last_name}",
},
show_all: "Mostrar tudo",
show_less: "Mostrar menos",
no_data_yet: "Nenhum dado ainda",
Expand Down
7 changes: 7 additions & 0 deletions packages/i18n/src/locales/ro/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -495,6 +495,13 @@ export default {
morning: "dimineața",
afternoon: "după-amiaza",
evening: "seara",
night: "noapte",
greetings: {
morning: "Bună dimineața, {first_name} {last_name}",
afternoon: "Bună ziua, {first_name} {last_name}",
evening: "Bună seara, {first_name} {last_name}",
night: "Noapte bună, {first_name} {last_name}",
},
show_all: "Arată tot",
show_less: "Arată mai puțin",
no_data_yet: "Nicio dată încă",
Expand Down
7 changes: 7 additions & 0 deletions packages/i18n/src/locales/ru/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -497,6 +497,13 @@ export default {
morning: "утра",
afternoon: "дня",
evening: "вечера",
night: "ночи",
greetings: {
morning: "Доброе утро, {first_name} {last_name}",
afternoon: "Добрый день, {first_name} {last_name}",
evening: "Добрый вечер, {first_name} {last_name}",
night: "Доброй ночи, {first_name} {last_name}",
},
show_all: "Показать все",
show_less: "Свернуть",
no_data_yet: "Нет данных",
Expand Down
7 changes: 7 additions & 0 deletions packages/i18n/src/locales/sk/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -489,6 +489,13 @@ export default {
morning: "ráno",
afternoon: "popoludnie",
evening: "večer",
night: "noc",
greetings: {
morning: "Dobré ráno, {first_name} {last_name}",
afternoon: "Dobré popoludnie, {first_name} {last_name}",
evening: "Dobrý večer, {first_name} {last_name}",
night: "Dobrú noc, {first_name} {last_name}",
},
show_all: "Zobraziť všetko",
show_less: "Zobraziť menej",
no_data_yet: "Zatiaľ žiadne dáta",
Expand Down
7 changes: 7 additions & 0 deletions packages/i18n/src/locales/tr-TR/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -490,6 +490,13 @@ export default {
morning: "sabah",
afternoon: "öğleden sonra",
evening: "akşam",
night: "gece",
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}",
night: "İyi geceler, {first_name} {last_name}",
},
show_all: "Tümünü göster",
show_less: "Daha az göster",
no_data_yet: "Henüz veri yok",
Expand Down
7 changes: 7 additions & 0 deletions packages/i18n/src/locales/ua/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -497,6 +497,13 @@ export default {
morning: "ранку",
afternoon: "дня",
evening: "вечора",
night: "ночі",
greetings: {
morning: "Добрий ранок, {first_name} {last_name}",
afternoon: "Добрий день, {first_name} {last_name}",
evening: "Добрий вечір, {first_name} {last_name}",
night: "Доброї ночі, {first_name} {last_name}",
},
show_all: "Показати все",
show_less: "Показати менше",
no_data_yet: "Поки що немає даних",
Expand Down
7 changes: 7 additions & 0 deletions packages/i18n/src/locales/vi-VN/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -495,6 +495,13 @@ export default {
morning: "Buổi sáng",
afternoon: "Buổi chiều",
evening: "Buổi tối",
night: "Buổi đêm",
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}",
night: "Chúc ngủ ngon, {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",
Expand Down
7 changes: 7 additions & 0 deletions packages/i18n/src/locales/zh-CN/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -477,6 +477,13 @@ export default {
morning: "早上",
afternoon: "下午",
evening: "晚上",
night: "晚安",
greetings: {
morning: "早上好,{first_name} {last_name}",
afternoon: "下午好,{first_name} {last_name}",
evening: "晚上好,{first_name} {last_name}",
night: "晚安,{first_name} {last_name}",
},
show_all: "显示全部",
show_less: "显示更少",
no_data_yet: "暂无数据",
Expand Down
7 changes: 7 additions & 0 deletions packages/i18n/src/locales/zh-TW/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,13 @@ export default {
morning: "早上",
afternoon: "下午",
evening: "晚上",
night: "晚安",
greetings: {
morning: "早安,{first_name} {last_name}",
afternoon: "午安,{first_name} {last_name}",
evening: "晚上好,{first_name} {last_name}",
night: "晚安,{first_name} {last_name}",
},
show_all: "顯示全部",
show_less: "顯示較少",
no_data_yet: "尚無資料",
Expand Down