1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00
lens/src/renderer/components/+welcome/welcome.tsx
2022-09-15 17:20:58 -04:00

141 lines
4.6 KiB
TypeScript

/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import "./welcome.scss";
import React from "react";
import { observer } from "mobx-react";
import type { IComputedValue } from "mobx";
import type { CarouselProps } from "react-material-ui-carousel";
import LegacyCarousel from "react-material-ui-carousel";
import { Icon } from "../icon";
import { slackUrl } from "../../../common/vars";
import { withInjectables } from "@ogre-tools/injectable-react";
import welcomeMenuItemsInjectable from "./welcome-menu-items/welcome-menu-items.injectable";
import type { WelcomeMenuRegistration } from "./welcome-menu-items/welcome-menu-registration";
import welcomeBannerItemsInjectable from "./welcome-banner-items/welcome-banner-items.injectable";
import type { WelcomeBannerRegistration } from "./welcome-banner-items/welcome-banner-registration";
import productNameInjectable from "../../../common/vars/product-name.injectable";
export const defaultWidth = 320;
// This is to fix some react 18 type errors
const Carousel = LegacyCarousel as React.ComponentType<CarouselProps>;
interface Dependencies {
welcomeMenuItems: IComputedValue<WelcomeMenuRegistration[]>;
welcomeBannerItems: IComputedValue<WelcomeBannerRegistration[]>;
productName: string;
}
const NonInjectedWelcome = observer(({
welcomeMenuItems,
welcomeBannerItems,
productName,
}: Dependencies) => {
const welcomeBanners = welcomeBannerItems.get();
// if there is banner with specified width, use it to calculate the width of the container
const maxWidth = Math.max(
...welcomeBanners.map(banner => banner.width ?? 0),
defaultWidth,
);
return (
<div className="flex justify-center Welcome align-center" data-testid="welcome-page">
<div
style={{ width: `${maxWidth}px` }}
data-testid="welcome-banner-container"
>
{welcomeBanners.length > 0 ? (
<Carousel
stopAutoPlayOnHover={true}
indicators={welcomeBanners.length > 1}
autoPlay={true}
navButtonsAlwaysInvisible={true}
indicatorIconButtonProps={{
style: {
color: "var(--iconActiveBackground)",
},
}}
activeIndicatorIconButtonProps={{
style: {
color: "var(--iconActiveColor)",
},
}}
interval={8000}
>
{welcomeBanners.map((item, index) => (
<item.Banner key={index} />
))}
</Carousel>
) : (
<Icon svg="logo-lens" className="logo" />
)}
<div className="flex justify-center">
<div
style={{ width: `${defaultWidth}px` }}
data-testid="welcome-text-container"
>
<h2>
{`Welcome to ${productName}!`}
</h2>
<p>
To get you started we have auto-detected your clusters in your
{" "}
kubeconfig file and added them to the catalog, your centralized
{" "}
view for managing all your cloud-native resources.
<br />
<br />
{"If you have any questions or feedback, please join our "}
<a
href={slackUrl}
target="_blank"
rel="noreferrer"
className="link"
>
Lens Community slack channel
</a>
.
</p>
<ul
className="block"
style={{ width: `${defaultWidth}px` }}
data-testid="welcome-menu-container"
>
{welcomeMenuItems.get().map((item, index) => (
<li
key={index}
className="flex grid-12"
onClick={() => item.click()}
>
<Icon material={item.icon} className="box col-1" />
<a className="box col-10">
{typeof item.title === "string"
? item.title
: item.title()}
</a>
<Icon material="navigate_next" className="box col-1" />
</li>
))}
</ul>
</div>
</div>
</div>
</div>
);
});
export const Welcome = withInjectables<Dependencies>(NonInjectedWelcome, {
getProps: (di) => ({
welcomeMenuItems: di.inject(welcomeMenuItemsInjectable),
welcomeBannerItems: di.inject(welcomeBannerItemsInjectable),
productName: di.inject(productNameInjectable),
}),
});