Path: blob/master/src/packages/next/components/store/menu.tsx
5900 views
/*1* This file is part of CoCalc: Copyright © 2022 Sagemath, Inc.2* License: MS-RSL – see LICENSE.md for details3*/45import type { MenuProps } from "antd";6import { Button, Flex, Menu, Spin } from "antd";7import { useRouter } from "next/router";8import React, { useContext } from "react";910import { Icon } from "@cocalc/frontend/components/icon";11import { currency, round2down } from "@cocalc/util/misc";12import { COLORS } from "@cocalc/util/theme";13import { StoreBalanceContext } from "lib/balance";1415type MenuItem = Required<MenuProps>["items"][number];1617const styles: { [k: string]: React.CSSProperties } = {18menuBookend: {19height: "100%",20whiteSpace: "nowrap",21flex: "0 1 auto",22textAlign: "end",23},24menu: {25width: "100%",26height: "100%",27flex: "1 1 auto",28border: 0,29},30menuRoot: {31marginBottom: "24px",32alignItems: "center",33border: 0,34borderBottom: "1px solid rgba(5, 5, 5, 0.06)",35boxShadow: "none",36},37menuContainer: {38alignItems: "center",39whiteSpace: "nowrap",40maxWidth: "100%",41flexGrow: 1,42},43} as const;4445export interface ConfigMenuProps {46main?: string;47}4849export default function ConfigMenu({ main }: ConfigMenuProps) {50const router = useRouter();51const { balance, refreshBalance, loading } = useContext(StoreBalanceContext);5253const handleMenuItemSelect: MenuProps["onSelect"] = ({ keyPath }) => {54router.push(`/store/${keyPath[0]}`, undefined, {55scroll: false,56});57refreshBalance();58setTimeout(() => {59refreshBalance();60}, 7500);61};6263const items: MenuItem[] = [64{65label: "Licenses",66key: "site-license",67icon: <Icon name="key" />,68},69{ label: "Course", key: "course", icon: <Icon name="graduation-cap" /> },70{71label: "Vouchers",72key: "vouchers",73icon: <Icon name="gift" />,74},75{76label: "Cart",77key: "cart",78icon: <Icon name="shopping-cart" />,79},80{81label: "Checkout",82key: "checkout",83icon: <Icon name="list" />,84},85{86label: "Processing",87key: "processing",88icon: <Icon name="run" />,89},90{91label: "Congrats",92key: "congrats",93icon: <Icon name="check-circle" />,94},95];9697return (98<Flex99gap="middle"100justify="space-between"101style={styles.menuRoot}102wrap="wrap"103>104<Flex style={styles.menuContainer} align="center">105<strong>106<a107onClick={() => {108router.push("/store", undefined, {109scroll: false,110});111}}112style={{ color: COLORS.GRAY_D, marginRight: "12px" }}113>114Store115</a>116</strong>117<Menu118mode="horizontal"119selectedKeys={main ? [main] : undefined}120style={styles.menu}121onSelect={handleMenuItemSelect}122items={items}123/>124</Flex>125<Button126type="text"127style={styles.menuBookend}128onClick={() => {129refreshBalance();130}}131>132{balance !== undefined133? `Balance: ${currency(round2down(balance))}`134: null}135{loading && (136<Spin delay={2000} size="small" style={{ marginLeft: "15px" }} />137)}138</Button>139</Flex>140);141}142143144