diff --git a/src/packages/frontend/app/nav-tab.tsx b/src/packages/frontend/app/nav-tab.tsx index 0c0a449048..25777cf557 100644 --- a/src/packages/frontend/app/nav-tab.tsx +++ b/src/packages/frontend/app/nav-tab.tsx @@ -51,7 +51,7 @@ export const NavTab: React.FC = React.memo((props: Props) => { if (!hide_label && label != null) { return ( diff --git a/src/packages/frontend/app/page.tsx b/src/packages/frontend/app/page.tsx index 73c78fd632..d511de2b6c 100644 --- a/src/packages/frontend/app/page.tsx +++ b/src/packages/frontend/app/page.tsx @@ -27,6 +27,7 @@ import { SiteName } from "@cocalc/frontend/customize"; import { FileUsePage } from "@cocalc/frontend/file-use/page"; import { labels } from "@cocalc/frontend/i18n"; import { ProjectsNav } from "@cocalc/frontend/projects/projects-nav"; +import BalanceButton from "@cocalc/frontend/purchases/balance-button"; import PayAsYouGoModal from "@cocalc/frontend/purchases/pay-as-you-go/modal"; import openSupportTab from "@cocalc/frontend/support/open"; import { COLORS } from "@cocalc/util/theme"; @@ -44,7 +45,6 @@ import { NavTab } from "./nav-tab"; import { Notification } from "./notifications"; import PopconfirmModal from "./popconfirm-modal"; import SettingsModal from "./settings-modal"; -import BalanceButton from "@cocalc/frontend/purchases/balance-button"; import { HIDE_LABEL_THRESHOLD, NAV_CLASS } from "./top-nav-consts"; import { useShowVerifyEmail, VerifyEmail } from "./verify-email-banner"; import { CookieWarning, LocalStorageWarning, VersionWarning } from "./warnings"; @@ -181,6 +181,11 @@ export const Page: React.FC = () => { ); } + function render_balance() { + if (!is_commercial) return; + return ; + } + function render_admin_tab(): JSX.Element | undefined { if (is_logged_in && groups?.includes("admin")) { return ( @@ -294,8 +299,8 @@ export const Page: React.FC = () => { {render_admin_tab()} {render_sign_in_tab()} {render_support()} - {is_logged_in && render_account_tab()} - + {is_logged_in ? render_account_tab() : undefined} + {render_balance()} {render_notification()} {render_bell()} {!is_anonymous && ( diff --git a/src/packages/frontend/app/top-nav-consts.ts b/src/packages/frontend/app/top-nav-consts.ts index f9856971e0..2cb87c1850 100644 --- a/src/packages/frontend/app/top-nav-consts.ts +++ b/src/packages/frontend/app/top-nav-consts.ts @@ -14,7 +14,7 @@ export const HIDE_LABEL_THRESHOLD = 6; // the width of the top bar export const NAV_HEIGHT_PX = 36; -// … and on narrower screens, a bit tigher +// … and on narrower screens, a bit tighter export const NAV_HEIGHT_NARROW_PX = 28; export const NAV_CLASS = "hidden-xs"; diff --git a/src/packages/frontend/i18n/common.ts b/src/packages/frontend/i18n/common.ts index 5a7559e555..5a7386941b 100644 --- a/src/packages/frontend/i18n/common.ts +++ b/src/packages/frontend/i18n/common.ts @@ -847,6 +847,11 @@ export const labels = defineMessages({ defaultMessage: "{n} of {m}", description: "item n in a list of m items.", }, + balance: { + id: "labels.balance", + defaultMessage: "Balance", + description: "Short label for a monetary balance on an account", + }, }); export const menu = defineMessages({ diff --git a/src/packages/frontend/i18n/trans/ar_EG.json b/src/packages/frontend/i18n/trans/ar_EG.json index ed4a4d8271..4bd66ab6d7 100644 --- a/src/packages/frontend/i18n/trans/ar_EG.json +++ b/src/packages/frontend/i18n/trans/ar_EG.json @@ -878,6 +878,7 @@ "labels.always_running": "دائمًا يعمل", "labels.assistant": "مساعد", "labels.back": "رجوع", + "labels.balance": "الرصيد", "labels.button.cancel": "إلغاء", "labels.buttons": "الأزرار", "labels.change": "تغيير", diff --git a/src/packages/frontend/i18n/trans/de_DE.json b/src/packages/frontend/i18n/trans/de_DE.json index 52388b5b40..573cc4767f 100644 --- a/src/packages/frontend/i18n/trans/de_DE.json +++ b/src/packages/frontend/i18n/trans/de_DE.json @@ -878,6 +878,7 @@ "labels.always_running": "Immer aktiv", "labels.assistant": "Assistent", "labels.back": "Zurück", + "labels.balance": "Guthaben", "labels.button.cancel": "Abbrechen", "labels.buttons": "Schaltflächen", "labels.change": "Ändern", diff --git a/src/packages/frontend/i18n/trans/es_ES.json b/src/packages/frontend/i18n/trans/es_ES.json index 12891ca215..d510593eea 100644 --- a/src/packages/frontend/i18n/trans/es_ES.json +++ b/src/packages/frontend/i18n/trans/es_ES.json @@ -878,6 +878,7 @@ "labels.always_running": "Siempre en ejecución", "labels.assistant": "Asistente", "labels.back": "Atrás", + "labels.balance": "Saldo", "labels.button.cancel": "Cancelar", "labels.buttons": "Botones", "labels.change": "Cambiar", diff --git a/src/packages/frontend/i18n/trans/fr_FR.json b/src/packages/frontend/i18n/trans/fr_FR.json index 7786536256..cba7197dba 100644 --- a/src/packages/frontend/i18n/trans/fr_FR.json +++ b/src/packages/frontend/i18n/trans/fr_FR.json @@ -878,6 +878,7 @@ "labels.always_running": "Toujours en cours d'exécution", "labels.assistant": "Assistant", "labels.back": "Retour", + "labels.balance": "Solde", "labels.button.cancel": "Annuler", "labels.buttons": "Boutons", "labels.change": "Changer", diff --git a/src/packages/frontend/i18n/trans/he_IL.json b/src/packages/frontend/i18n/trans/he_IL.json index a99911146d..ce6646bc8d 100644 --- a/src/packages/frontend/i18n/trans/he_IL.json +++ b/src/packages/frontend/i18n/trans/he_IL.json @@ -878,6 +878,7 @@ "labels.always_running": "תמיד פועל", "labels.assistant": "עוזר", "labels.back": "חזרה", + "labels.balance": "יתרה", "labels.button.cancel": "ביטול", "labels.buttons": "כפתורים", "labels.change": "שנה", diff --git a/src/packages/frontend/i18n/trans/hi_IN.json b/src/packages/frontend/i18n/trans/hi_IN.json index 2ef7b048ca..7e597c1477 100644 --- a/src/packages/frontend/i18n/trans/hi_IN.json +++ b/src/packages/frontend/i18n/trans/hi_IN.json @@ -878,6 +878,7 @@ "labels.always_running": "हमेशा चल रहा है", "labels.assistant": "सहायक", "labels.back": "वापस", + "labels.balance": "शेष", "labels.button.cancel": "रद्द करें", "labels.buttons": "बटन", "labels.change": "बदलें", diff --git a/src/packages/frontend/i18n/trans/hu_HU.json b/src/packages/frontend/i18n/trans/hu_HU.json index 2c7820aa86..8b5d61110c 100644 --- a/src/packages/frontend/i18n/trans/hu_HU.json +++ b/src/packages/frontend/i18n/trans/hu_HU.json @@ -878,6 +878,7 @@ "labels.always_running": "Mindig fut", "labels.assistant": "Asszisztens", "labels.back": "Vissza", + "labels.balance": "Egyenleg", "labels.button.cancel": "Mégse", "labels.buttons": "Gombok", "labels.change": "Módosítás", diff --git a/src/packages/frontend/i18n/trans/it_IT.json b/src/packages/frontend/i18n/trans/it_IT.json index 79eca0d7da..15807b33e2 100644 --- a/src/packages/frontend/i18n/trans/it_IT.json +++ b/src/packages/frontend/i18n/trans/it_IT.json @@ -878,6 +878,7 @@ "labels.always_running": "Sempre in esecuzione", "labels.assistant": "Assistente", "labels.back": "Indietro", + "labels.balance": "Saldo", "labels.button.cancel": "Annulla", "labels.buttons": "Bottoni", "labels.change": "Cambia", diff --git a/src/packages/frontend/i18n/trans/ja_JP.json b/src/packages/frontend/i18n/trans/ja_JP.json index fb4d5b5767..ea75d80f76 100644 --- a/src/packages/frontend/i18n/trans/ja_JP.json +++ b/src/packages/frontend/i18n/trans/ja_JP.json @@ -878,6 +878,7 @@ "labels.always_running": "常に実行中", "labels.assistant": "アシスタント", "labels.back": "戻る", + "labels.balance": "残高", "labels.button.cancel": "キャンセル", "labels.buttons": "ボタン", "labels.change": "変更", diff --git a/src/packages/frontend/i18n/trans/ko_KR.json b/src/packages/frontend/i18n/trans/ko_KR.json index 047a30b934..29f274c6c4 100644 --- a/src/packages/frontend/i18n/trans/ko_KR.json +++ b/src/packages/frontend/i18n/trans/ko_KR.json @@ -878,6 +878,7 @@ "labels.always_running": "항상 실행 중", "labels.assistant": "어시스턴트", "labels.back": "뒤로", + "labels.balance": "잔액", "labels.button.cancel": "취소", "labels.buttons": "버튼들", "labels.change": "변경", diff --git a/src/packages/frontend/i18n/trans/nl_NL.json b/src/packages/frontend/i18n/trans/nl_NL.json index 1bd1cb0392..bc56d78439 100644 --- a/src/packages/frontend/i18n/trans/nl_NL.json +++ b/src/packages/frontend/i18n/trans/nl_NL.json @@ -878,6 +878,7 @@ "labels.always_running": "Altijd Actief", "labels.assistant": "Assistent", "labels.back": "Terug", + "labels.balance": "Balans", "labels.button.cancel": "Annuleren", "labels.buttons": "Knoppen", "labels.change": "Wijzigen", diff --git a/src/packages/frontend/i18n/trans/pl_PL.json b/src/packages/frontend/i18n/trans/pl_PL.json index 63d9129746..b6d4fe492e 100644 --- a/src/packages/frontend/i18n/trans/pl_PL.json +++ b/src/packages/frontend/i18n/trans/pl_PL.json @@ -878,6 +878,7 @@ "labels.always_running": "Zawsze Uruchomione", "labels.assistant": "Asystent", "labels.back": "Wstecz", + "labels.balance": "Saldo", "labels.button.cancel": "Anuluj", "labels.buttons": "Przyciski", "labels.change": "Zmień", diff --git a/src/packages/frontend/i18n/trans/pt_PT.json b/src/packages/frontend/i18n/trans/pt_PT.json index 9b4ccbb566..f8616fd899 100644 --- a/src/packages/frontend/i18n/trans/pt_PT.json +++ b/src/packages/frontend/i18n/trans/pt_PT.json @@ -878,6 +878,7 @@ "labels.always_running": "Sempre em Execução", "labels.assistant": "Assistente", "labels.back": "Voltar", + "labels.balance": "Saldo", "labels.button.cancel": "Cancelar", "labels.buttons": "Botões", "labels.change": "Alterar", diff --git a/src/packages/frontend/i18n/trans/ru_RU.json b/src/packages/frontend/i18n/trans/ru_RU.json index f8776445ab..34e8cb49e0 100644 --- a/src/packages/frontend/i18n/trans/ru_RU.json +++ b/src/packages/frontend/i18n/trans/ru_RU.json @@ -878,6 +878,7 @@ "labels.always_running": "Всегда работает", "labels.assistant": "Помощник", "labels.back": "Назад", + "labels.balance": "Баланс", "labels.button.cancel": "Отмена", "labels.buttons": "Кнопки", "labels.change": "Изменить", diff --git a/src/packages/frontend/i18n/trans/tr_TR.json b/src/packages/frontend/i18n/trans/tr_TR.json index 1b211bcecc..75507f7482 100644 --- a/src/packages/frontend/i18n/trans/tr_TR.json +++ b/src/packages/frontend/i18n/trans/tr_TR.json @@ -878,6 +878,7 @@ "labels.always_running": "Her Zaman Çalışıyor", "labels.assistant": "Yardımcı", "labels.back": "Geri", + "labels.balance": "Bakiye", "labels.button.cancel": "İptal", "labels.buttons": "Düğmeler", "labels.change": "Değiştir", diff --git a/src/packages/frontend/i18n/trans/zh_CN.json b/src/packages/frontend/i18n/trans/zh_CN.json index e5a9577577..c4871bbc06 100644 --- a/src/packages/frontend/i18n/trans/zh_CN.json +++ b/src/packages/frontend/i18n/trans/zh_CN.json @@ -878,6 +878,7 @@ "labels.always_running": "始终运行", "labels.assistant": "助手", "labels.back": "返回", + "labels.balance": "余额", "labels.button.cancel": "取消", "labels.buttons": "按钮", "labels.change": "更改", diff --git a/src/packages/frontend/purchases/balance-button.tsx b/src/packages/frontend/purchases/balance-button.tsx index 1bddbc3891..944977ec5a 100644 --- a/src/packages/frontend/purchases/balance-button.tsx +++ b/src/packages/frontend/purchases/balance-button.tsx @@ -1,20 +1,28 @@ import { Badge, Button, Spin } from "antd"; import { useEffect, useState } from "react"; -import { getBalance as getBalanceUsingApi } from "./api"; -import { currency, round2down } from "@cocalc/util/misc"; -import { useTypedRedux } from "@cocalc/frontend/app-framework"; +import { useIntl } from "react-intl"; + +import { CSS, useTypedRedux } from "@cocalc/frontend/app-framework"; +import { NavTab } from "@cocalc/frontend/app/nav-tab"; +import { NAV_CLASS } from "@cocalc/frontend/app/top-nav-consts"; +import { labels } from "@cocalc/frontend/i18n"; import BalanceModal from "@cocalc/frontend/purchases/balance-modal"; import { webapp_client } from "@cocalc/frontend/webapp-client"; +import { currency, round2down } from "@cocalc/util/misc"; +import { getBalance as getBalanceUsingApi } from "./api"; export default function BalanceButton({ style, onRefresh, minimal = false, + topBar = false, }: { style?; onRefresh?: () => void; minimal?: boolean; + topBar?: boolean; }) { + const intl = useIntl(); const [open, setOpen] = useState(false); const [loading, setLoading] = useState(true); const dbBalance = useTypedRedux("account", "balance"); @@ -50,39 +58,78 @@ export default function BalanceButton({ handleRefresh(); }, []); - return ( - <> - - {open && ( - setOpen(false)} + ); + } + + function renderDisplay() { + if (topBar) { + return ( + - )} + ); + } else { + return renderButton(); + } + } + + function renderModal() { + if (!open) return; + + return ( + setOpen(false)} /> + ); + } + + return ( + <> + {renderDisplay()} + {renderModal()} ); }