Path: blob/master/src/packages/next/components/store/menu.tsx
1450 views
/*1* This file is part of CoCalc: Copyright © 2022 Sagemath, Inc.2* License: MS-RSL – see LICENSE.md for details3*/45import React, { useContext } from "react";6import { Button, Menu, MenuProps, Flex, Spin } from "antd";7import { useRouter } from "next/router";8import { currency, round2down } from "@cocalc/util/misc";9import { COLORS } from "@cocalc/util/theme";10import { Icon } from "@cocalc/frontend/components/icon";11import { StoreBalanceContext } from "../../lib/balance";1213type MenuItem = Required<MenuProps>["items"][number];1415const styles: { [k: string]: React.CSSProperties } = {16menuBookend: {17height: "100%",18whiteSpace: "nowrap",19flexGrow: 1,20textAlign: "end",21},22menu: {23width: "100%",24height: "100%",25border: 0,26},27menuRoot: {28marginBottom: "24px",29alignItems: "center",30border: 0,31borderBottom: "1px solid rgba(5, 5, 5, 0.06)",32boxShadow: "none",33},34menuContainer: {35alignItems: "center",36whiteSpace: "nowrap",37maxWidth: "100%",38flexGrow: 1,39},40};4142export interface ConfigMenuProps {43main?: string;44}4546export default function ConfigMenu({ main }: ConfigMenuProps) {47const router = useRouter();48const { balance, refreshBalance, loading } = useContext(StoreBalanceContext);4950const handleMenuItemSelect: MenuProps["onSelect"] = ({ keyPath }) => {51router.push(`/store/${keyPath[0]}`, undefined, {52scroll: false,53});54refreshBalance();55setTimeout(() => {56refreshBalance();57}, 7500);58};5960const items: MenuItem[] = [61{62label: "Licenses",63key: "site-license",64icon: <Icon name="key" />,65},66{67label: "Vouchers",68key: "vouchers",69icon: <Icon name="gift" />,70},71{72label: "Cart",73key: "cart",74icon: <Icon name="shopping-cart" />,75},76{77label: "Checkout",78key: "checkout",79icon: <Icon name="list" />,80},81{82label: "Processing",83key: "processing",84icon: <Icon name="run" />,85},86{87label: "Congrats",88key: "congrats",89icon: <Icon name="check-circle" />,90},91];9293return (94<Flex95gap="middle"96justify="space-between"97style={styles.menuRoot}98wrap="wrap"99>100<Flex style={styles.menuContainer} align="center">101<strong>102<a103onClick={() => {104router.push("/store", undefined, {105scroll: false,106});107}}108style={{ color: COLORS.GRAY_D, marginRight: "12px" }}109>110Store111</a>112</strong>113<Menu114mode="horizontal"115selectedKeys={main ? [main] : undefined}116style={styles.menu}117onSelect={handleMenuItemSelect}118items={items}119/>120</Flex>121<Button122type="text"123style={styles.menuBookend}124onClick={() => {125refreshBalance();126}}127>128{balance !== undefined129? `Balance: ${currency(round2down(balance))}`130: null}131{loading && (132<Spin delay={2000} size="small" style={{ marginLeft: "15px" }} />133)}134</Button>135</Flex>136);137}138139140