import React, { useContext, useState } from "react"; import styled from "styled-components"; import { buttonColor, defaultBorderRadius, lightGray } from "."; import { useSelector } from "react-redux"; import { RootStore } from "../redux/store"; import { BookOpenIcon } from "@heroicons/react/24/outline"; import HeaderButtonWithText from "./HeaderButtonWithText"; import { MODEL_PROVIDER_TAG_COLORS, PackageDimension } from "../util/modelData"; import InfoHover from "./InfoHover"; const Div = styled.div<{ color: string; disabled: boolean; hovered: boolean }>` border: 1px solid ${lightGray}; border-radius: ${defaultBorderRadius}; position: relative; width: 100%; transition: all 0.5s; ${(props) => props.disabled ? ` opacity: 0.5; ` : props.hovered ? ` border: 1px solid ${props.color}; background-color: ${props.color}22; cursor: pointer;` : ""} `; const DimensionsDiv = styled.div` display: flex; justify-content: flex-end; margin-left: auto; padding: 4px; /* width: fit-content; */ border-top: 1px solid ${lightGray}; `; const DimensionOptionDiv = styled.div<{ selected: boolean }>` display: flex; flex-direction: column; align-items: center; margin-right: 8px; background-color: ${lightGray}; padding: 4px; border-radius: ${defaultBorderRadius}; outline: 0.5px solid ${lightGray}; ${(props) => props.selected && ` background-color: ${buttonColor}; color: white; `} &:hover { cursor: pointer; outline: 1px solid ${buttonColor}; } `; interface ModelCardProps { title: string; description: string; tags?: string[]; refUrl?: string; icon?: string; onClick: ( e: React.MouseEvent, dimensionChoices?: string[] ) => void; disabled?: boolean; dimensions?: PackageDimension[]; } function ModelCard(props: ModelCardProps) { const vscMediaUrl = useSelector( (state: RootStore) => state.config.vscMediaUrl ); const [dimensionChoices, setDimensionChoices] = useState( props.dimensions?.map((d) => Object.keys(d.options)[0]) || [] ); const [hovered, setHovered] = useState(false); return (
setHovered(true)} onMouseLeave={() => setHovered(false)} className="px-2 py-1" onClick={ props.disabled ? undefined : (e) => { if ((e.target as any).closest("a")) { return; } props.onClick(e, dimensionChoices); } } >
{vscMediaUrl && props.icon && ( )}

{props.title}

{props.tags?.map((tag) => { return ( {tag} ); })}

{props.description}

{props.refUrl && ( )}
{props.dimensions?.length && ( {props.dimensions?.map((dimension, i) => { return (

{dimension.name}

{Object.keys(dimension.options).map((key) => { return ( { e.stopPropagation(); const newChoices = [...dimensionChoices]; newChoices[i] = key; setDimensionChoices(newChoices); }} selected={dimensionChoices[i] === key} > {key} ); })}
); })}
)}
); } export default ModelCard;