import * as DropdownMenu from '@radix-ui/react-dropdown-menu'; import { animated, useTransition } from '@react-spring/web'; import clsx from 'clsx'; import { DotsThree, Eye, Key as KeyIcon } from 'phosphor-react'; import { PropsWithChildren, useState } from 'react'; import { useLibraryMutation } from '@sd/client'; import { Button, Tooltip } from '@sd/ui'; // TODO: Replace this with Prisma type when integrating with backend export interface Key { id: string; name: string; queue: Set; mounted?: boolean; locked?: boolean; stats?: { objectCount?: number; containerCount?: number; }; default?: boolean; memoryOnly?: boolean; automount?: boolean; // Nodes this key is mounted on nodes?: string[]; // will be node object } interface Props extends DropdownMenu.MenuContentProps { trigger: React.ReactNode; transformOrigin?: string; disabled?: boolean; } export const KeyDropdown = ({ trigger, children, transformOrigin, className }: PropsWithChildren) => { const [open, setOpen] = useState(false); const transitions = useTransition(open, { from: { opacity: 0, transform: `scale(0.9)`, transformOrigin: transformOrigin || 'top' }, enter: { opacity: 1, transform: 'scale(1)' }, leave: { opacity: -0.5, transform: 'scale(0.95)' }, config: { mass: 0.4, tension: 200, friction: 10 } }); return ( {trigger} {transitions( (styles, show) => show && ( {children} ) )} ); }; export const Key = ({ data }: { data: Key }) => { const mountKey = useLibraryMutation('keys.mount'); const unmountKey = useLibraryMutation('keys.unmount'); const deleteKey = useLibraryMutation('keys.deleteFromLibrary'); const setDefaultKey = useLibraryMutation('keys.setDefault'); const changeAutomountStatus = useLibraryMutation('keys.updateAutomountStatus'); const syncToLibrary = useLibraryMutation('keys.syncKeyToLibrary'); if (data.mounted && data.queue.has(data.id)) { data.queue.delete(data.id); } return (
{data.name}
{data.mounted && (
{data.nodes?.length || 0 > 0 ? `${data.nodes?.length || 0} nodes` : 'This node'}
)} {data.default && (
Default
)}
{/*
#{data.id}
*/} {data.stats ? (
{data.stats.objectCount && (
{data.stats.objectCount} Objects
)} {data.stats.containerCount && (
{data.stats.containerCount} Containers
)}
) : ( !data.mounted && (
{data.queue.has(data.id) ? 'Key mounting...' : 'Key not mounted'}
) )}
{data.mounted && ( )} } > { unmountKey.mutate(data.id); }} hidden={!data.mounted} value="Unmount" /> { syncToLibrary.mutate(data.id); }} hidden={!data.memoryOnly} value="Sync to library" /> { data.queue.add(data.id); mountKey.mutate(data.id); }} hidden={data.mounted || data.queue.has(data.id)} value="Mount" /> { deleteKey.mutate(data.id); }} value="Delete from Library" /> { setDefaultKey.mutate(data.id); }} hidden={data.default} value="Set as Default" /> { changeAutomountStatus.mutate({ uuid: data.id, status: false }); }} hidden={!data.automount || data.memoryOnly} value="Disable Automount" /> { changeAutomountStatus.mutate({ uuid: data.id, status: true }); }} hidden={data.automount || data.memoryOnly} value="Enable Automount" />
); }; export const KeyDropdownItem = (props: { value: string; hidden?: boolean | undefined; onClick: () => void; }) => { return ( ); }; export const DummyKey = (props: { text: string }) => { return (
{props.text}
); };