starling-devex 0.1.2

Starling: a local dev orchestrator with a central daemon, shared named-URL proxy, and a k9s-style TUI (a Rust port of Tilt + portless)
import React from "react"
import styled from "styled-components"
import { ReactComponent as StarSvg } from "./assets/svg/star.svg"
import { InstrumentedButton } from "./instrumentedComponents"
import { useStarredResources } from "./StarredResourcesContext"
import {
  AnimDuration,
  Color,
  mixinResetButtonStyle,
  SizeUnit,
} from "./style-helpers"

export const StarResourceButtonRoot = styled(InstrumentedButton)`
  ${mixinResetButtonStyle};
  padding: 0;
  background-color: transparent;
  align-items: center;
  flex-shrink: 0;
`
let StarIcon = styled(StarSvg)`
  width: ${SizeUnit(1.0 / 3)};
  height: ${SizeUnit(1.0 / 3)};
`
let ActiveStarIcon = styled(StarIcon)`
  transition: transform ${AnimDuration.short} ease;
  fill: ${Color.gray50};

  ${StarResourceButtonRoot}:hover & {
    fill: ${Color.blue};
  }
`

let InactiveStarIcon = styled(StarIcon)`
  transition: fill ${AnimDuration.default} linear,
    opacity ${AnimDuration.short} linear;
  opacity: 0;

  .u-showStarOnHover:hover &,
  ${StarResourceButtonRoot}:focus &,
  ${StarResourceButtonRoot}.u-persistShow & {
    fill: ${Color.gray50};
    opacity: 1;
  }

  ${StarResourceButtonRoot}:hover & {
    fill: ${Color.blue};
    opacity: 1;
  }
`

type StarResourceButtonProps = {
  resourceName: string
  persistShow?: boolean
}

export default function StarResourceButton(
  props: StarResourceButtonProps
): JSX.Element {
  let ctx = useStarredResources()
  let { resourceName, persistShow } = props
  let isStarred =
    ctx.starredResources && ctx.starredResources.includes(resourceName)

  let icon: JSX.Element
  let title: string

  if (isStarred) {
    icon = <ActiveStarIcon />
    title = `Unstar ${resourceName}`
  } else {
    icon = <InactiveStarIcon />
    title = `Star ${resourceName}`
  }

  function onClick(e: any) {
    e.preventDefault()
    e.stopPropagation()
    if (isStarred) {
      ctx.unstarResource(resourceName)
    } else {
      ctx.starResource(resourceName)
    }
  }

  let className = ""
  if (persistShow) {
    className = "u-persistShow"
  }
  return (
    <StarResourceButtonRoot
      title={title}
      aria-label={title}
      onClick={onClick}
      className={className}
    >
      {icon}
    </StarResourceButtonRoot>
  )
}