You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

117 lines
2.8 KiB

import type React from "react";
import { useState } from "react";
import {
Heading,
majorScale,
Pane,
Paragraph,
SideSheet,
Tab,
Tablist,
} from "evergreen-ui";
import type { IconType } from "react-icons";
import { FiBluetooth, FiTerminal, FiWifi } from "react-icons/fi";
import { BLE } from "../connect/BLE.js";
import { HTTP } from "../connect/HTTP.js";
import { Serial } from "../connect/Serial.js";
export interface NewDeviceProps {
open: boolean;
onClose: () => void;
}
export interface CloseProps {
close: () => void;
}
export type connType = "http" | "ble" | "serial";
export interface Tab {
name: connType;
icon: IconType;
displayName: string;
element: ({ close }: CloseProps) => JSX.Element;
disabled?: boolean;
}
export const NewDevice = ({ open, onClose }: NewDeviceProps) => {
const [selectedConnType, setSelectedConnType] = useState<connType>("ble");
const tabs: Tab[] = [
{
name: "ble",
icon: FiBluetooth,
displayName: "BLE",
element: BLE,
disabled: !navigator.bluetooth,
},
{
name: "http",
icon: FiWifi,
displayName: "HTTP",
element: HTTP,
},
{
name: "serial",
icon: FiTerminal,
displayName: "Serial",
element: Serial,
disabled: !navigator.serial,
},
];
return (
<SideSheet
isShown={open}
onCloseComplete={onClose}
containerProps={{
display: "flex",
flex: "1",
flexDirection: "column",
}}
>
<Pane zIndex={1} flexShrink={0} elevation={1} backgroundColor="white">
<Pane padding={16} borderBottom="muted">
<Heading size={600}>Connect new device</Heading>
<Paragraph size={400} color="muted">
Optional description or sub title
</Paragraph>
</Pane>
<Pane display="flex" padding={8}>
<Tablist>
{tabs.map((TabData, index) => (
<Tab
key={index}
gap={5}
isSelected={selectedConnType === TabData.name}
onSelect={() => setSelectedConnType(TabData.name)}
disabled={TabData.disabled}
>
<>
<TabData.icon />
{TabData.displayName}
</>
</Tab>
))}
</Tablist>
</Pane>
</Pane>
<Pane display="flex" overflowY="scroll" background="tint1" padding={16}>
{tabs.map((TabData, index) => (
<Pane
key={index}
borderRadius={majorScale(1)}
backgroundColor="white"
elevation={1}
flexGrow={1}
display={selectedConnType === TabData.name ? "block" : "none"}
>
{!TabData.disabled && <TabData.element close={onClose} />}
</Pane>
))}
</Pane>
</SideSheet>
);
};