Skip to content
Open
34 changes: 4 additions & 30 deletions apps/web/core/components/home/user-greetings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,51 +7,25 @@
// 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;
}

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 (
<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 aria-hidden="true">{greeting === "morning" ? "🌤️" : greeting === "afternoon" ? "🌥️" : "🌙"}</div>
<div>
{weekDay}, {date} {timeString}
</div>
Expand Down
36 changes: 5 additions & 31 deletions apps/web/core/components/user/user-greetings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,52 +6,26 @@

// 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;
}

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 (
<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 aria-hidden="true">{greeting === "morning" ? "🌤️" : greeting === "afternoon" ? "🌥️" : "🌙"}</div>
<div>
{weekDay}, {date} {timeString}
</div>
Expand Down
47 changes: 47 additions & 0 deletions apps/web/core/hooks/use-greeting.ts
Original file line number Diff line number Diff line change
@@ -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 };
};
5 changes: 5 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,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",
Expand Down
5 changes: 5 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,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",
Expand Down
5 changes: 5 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,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",
Expand Down
5 changes: 5 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,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",
Expand Down
5 changes: 5 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,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",
Expand Down
5 changes: 5 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,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",
Expand Down
5 changes: 5 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,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",
Expand Down
5 changes: 5 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,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: "まだデータがありません",
Expand Down
5 changes: 5 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,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: "아직 데이터 없음",
Expand Down
5 changes: 5 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,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",
Expand Down
5 changes: 5 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,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",
Expand Down
5 changes: 5 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,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ă",
Expand Down
5 changes: 5 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,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: "Нет данных",
Expand Down
5 changes: 5 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,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",
Expand Down
5 changes: 5 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,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",
Expand Down
5 changes: 5 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,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: "Поки що немає даних",
Expand Down
5 changes: 5 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,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",
Expand Down
5 changes: 5 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,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: "暂无数据",
Expand Down
5 changes: 5 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,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: "尚無資料",
Expand Down