2024-04-15 12:04:17 -04:00
|
|
|
import { useStore } from 'useStore'
|
|
|
|
import styles from './ModelingPane.module.css'
|
2024-04-15 21:40:45 -04:00
|
|
|
import { useSettingsAuthContext } from 'hooks/useSettingsAuthContext'
|
2024-04-15 12:04:17 -04:00
|
|
|
|
|
|
|
export interface ModelingPaneProps
|
|
|
|
extends React.PropsWithChildren,
|
|
|
|
React.HTMLAttributes<HTMLDivElement> {
|
|
|
|
title: string
|
|
|
|
Menu?: React.ReactNode | React.FC
|
|
|
|
detailsTestId?: string
|
|
|
|
}
|
|
|
|
|
|
|
|
export const ModelingPaneHeader = ({
|
|
|
|
title,
|
|
|
|
Menu,
|
|
|
|
}: Pick<ModelingPaneProps, 'title' | 'Menu'>) => {
|
|
|
|
return (
|
|
|
|
<div className={styles.header}>
|
|
|
|
<div className="flex gap-2 items-center flex-1">{title}</div>
|
|
|
|
{Menu instanceof Function ? <Menu /> : Menu}
|
|
|
|
</div>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
export const ModelingPane = ({
|
|
|
|
title,
|
|
|
|
children,
|
|
|
|
className,
|
|
|
|
Menu,
|
|
|
|
detailsTestId,
|
|
|
|
...props
|
|
|
|
}: ModelingPaneProps) => {
|
2024-04-15 21:40:45 -04:00
|
|
|
const { settings } = useSettingsAuthContext()
|
|
|
|
const onboardingStatus = settings.context.app.onboardingStatus
|
2024-04-15 12:04:17 -04:00
|
|
|
const { buttonDownInStream } = useStore((s) => ({
|
|
|
|
buttonDownInStream: s.buttonDownInStream,
|
|
|
|
}))
|
2024-04-15 21:40:45 -04:00
|
|
|
const pointerEventsCssClass =
|
|
|
|
buttonDownInStream || onboardingStatus.current === 'camera'
|
|
|
|
? 'pointer-events-none '
|
|
|
|
: 'pointer-events-auto '
|
2024-04-15 12:04:17 -04:00
|
|
|
return (
|
|
|
|
<section
|
|
|
|
{...props}
|
|
|
|
data-testid={detailsTestId}
|
|
|
|
className={
|
2024-04-15 21:40:45 -04:00
|
|
|
pointerEventsCssClass + styles.panel + ' group ' + (className || '')
|
2024-04-15 12:04:17 -04:00
|
|
|
}
|
|
|
|
>
|
|
|
|
<ModelingPaneHeader title={title} Menu={Menu} />
|
|
|
|
<div className="relative w-full">{children}</div>
|
|
|
|
</section>
|
|
|
|
)
|
|
|
|
}
|