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.

controls-panel.tsx 1.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /* eslint-disable @typescript-eslint/ban-ts-comment */
  2. import styled from 'styles'
  3. import React, { useEffect, useRef } from 'react'
  4. import state, { useSelector } from 'state'
  5. import { X, Code, PlayCircle } from 'react-feather'
  6. import { IconButton } from 'components/shared'
  7. import * as Panel from '../panel'
  8. import Control from './control'
  9. import { deepCompareArrays } from 'utils/utils'
  10. export default function ControlPanel() {
  11. const rContainer = useRef<HTMLDivElement>(null)
  12. const codeControls = useSelector(
  13. (state) => Object.keys(state.data.codeControls),
  14. deepCompareArrays
  15. )
  16. const isOpen = useSelector((s) => Object.keys(s.data.codeControls).length > 0)
  17. return (
  18. <Panel.Root data-bp-desktop ref={rContainer} isOpen={isOpen}>
  19. {isOpen ? (
  20. <Panel.Layout>
  21. <Panel.Header>
  22. <IconButton
  23. size="small"
  24. onClick={() => state.send('CLOSED_CODE_PANEL')}
  25. >
  26. <X />
  27. </IconButton>
  28. <h3>Controls</h3>
  29. </Panel.Header>
  30. <ControlsList>
  31. {codeControls.map((id) => (
  32. <Control key={id} id={id} />
  33. ))}
  34. </ControlsList>
  35. </Panel.Layout>
  36. ) : (
  37. <IconButton
  38. size="small"
  39. onClick={() => state.send('OPENED_CODE_PANEL')}
  40. >
  41. <Code />
  42. </IconButton>
  43. )}
  44. </Panel.Root>
  45. )
  46. }
  47. const ControlsList = styled(Panel.Content, {
  48. padding: 12,
  49. display: 'grid',
  50. gridTemplateColumns: '1fr 4fr',
  51. gridAutoRows: '24px',
  52. alignItems: 'center',
  53. gridColumnGap: '8px',
  54. gridRowGap: '8px',
  55. '& input': {
  56. font: '$ui',
  57. fontSize: '$1',
  58. border: '1px solid $inputBorder',
  59. backgroundColor: '$input',
  60. color: '$text',
  61. height: '100%',
  62. padding: '0px 6px',
  63. },
  64. })