2023-07-25 10:40:26 -04:00
|
|
|
import { useHotkeys } from 'react-hotkeys-hook'
|
|
|
|
|
import { Outlet, useNavigate } from 'react-router-dom'
|
|
|
|
|
import Introduction from './Introduction'
|
|
|
|
|
import Camera from './Camera'
|
|
|
|
|
import Sketching from './Sketching'
|
2023-08-29 10:48:55 -04:00
|
|
|
import { useCallback } from 'react'
|
2023-08-15 21:56:24 -04:00
|
|
|
import makeUrlPathRelative from '../../lib/makeUrlPathRelative'
|
2023-08-29 10:48:55 -04:00
|
|
|
import { useGlobalStateContext } from 'hooks/useGlobalStateContext'
|
2023-09-15 22:37:40 -04:00
|
|
|
import Streaming from './Streaming'
|
|
|
|
|
import CodeEditor from './CodeEditor'
|
|
|
|
|
import ParametricModeling from './ParametricModeling'
|
|
|
|
|
import InteractiveNumbers from './InteractiveNumbers'
|
|
|
|
|
import CmdK from './CmdK'
|
|
|
|
|
import UserMenu from './UserMenu'
|
|
|
|
|
import ProjectMenu from './ProjectMenu'
|
|
|
|
|
import Export from './Export'
|
|
|
|
|
import FutureWork from './FutureWork'
|
2023-08-10 13:30:32 -04:00
|
|
|
|
|
|
|
|
export const onboardingPaths = {
|
2023-08-15 21:56:24 -04:00
|
|
|
INDEX: '/',
|
|
|
|
|
CAMERA: '/camera',
|
2023-09-15 22:37:40 -04:00
|
|
|
STREAMING: '/streaming',
|
|
|
|
|
EDITOR: '/editor',
|
|
|
|
|
PARAMETRIC_MODELING: '/parametric-modeling',
|
|
|
|
|
INTERACTIVE_NUMBERS: '/interactive-numbers',
|
|
|
|
|
COMMAND_K: '/command-k',
|
|
|
|
|
USER_MENU: '/user-menu',
|
|
|
|
|
PROJECT_MENU: '/project-menu',
|
|
|
|
|
EXPORT: '/export',
|
|
|
|
|
MOVE: '/move',
|
2023-08-15 21:56:24 -04:00
|
|
|
SKETCHING: '/sketching',
|
2023-09-15 22:37:40 -04:00
|
|
|
FUTURE_WORK: '/future-work',
|
2023-08-10 13:30:32 -04:00
|
|
|
}
|
2023-07-25 10:40:26 -04:00
|
|
|
|
|
|
|
|
export const onboardingRoutes = [
|
|
|
|
|
{
|
2023-08-10 13:30:32 -04:00
|
|
|
index: true,
|
2023-07-25 10:40:26 -04:00
|
|
|
element: <Introduction />,
|
|
|
|
|
},
|
|
|
|
|
{
|
2023-08-15 21:56:24 -04:00
|
|
|
path: makeUrlPathRelative(onboardingPaths.CAMERA),
|
2023-07-25 10:40:26 -04:00
|
|
|
element: <Camera />,
|
|
|
|
|
},
|
2023-09-15 22:37:40 -04:00
|
|
|
{
|
|
|
|
|
path: makeUrlPathRelative(onboardingPaths.STREAMING),
|
|
|
|
|
element: <Streaming />,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
path: makeUrlPathRelative(onboardingPaths.EDITOR),
|
|
|
|
|
element: <CodeEditor />,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
path: makeUrlPathRelative(onboardingPaths.PARAMETRIC_MODELING),
|
|
|
|
|
element: <ParametricModeling />,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
path: makeUrlPathRelative(onboardingPaths.INTERACTIVE_NUMBERS),
|
|
|
|
|
element: <InteractiveNumbers />,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
path: makeUrlPathRelative(onboardingPaths.COMMAND_K),
|
|
|
|
|
element: <CmdK />,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
path: makeUrlPathRelative(onboardingPaths.USER_MENU),
|
|
|
|
|
element: <UserMenu />,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
path: makeUrlPathRelative(onboardingPaths.PROJECT_MENU),
|
|
|
|
|
element: <ProjectMenu />,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
path: makeUrlPathRelative(onboardingPaths.EXPORT),
|
|
|
|
|
element: <Export />,
|
|
|
|
|
},
|
|
|
|
|
// Export / conversion API
|
2023-07-25 10:40:26 -04:00
|
|
|
{
|
2023-08-15 21:56:24 -04:00
|
|
|
path: makeUrlPathRelative(onboardingPaths.SKETCHING),
|
2023-07-25 10:40:26 -04:00
|
|
|
element: <Sketching />,
|
|
|
|
|
},
|
2023-09-15 22:37:40 -04:00
|
|
|
{
|
|
|
|
|
path: makeUrlPathRelative(onboardingPaths.FUTURE_WORK),
|
|
|
|
|
element: <FutureWork />,
|
|
|
|
|
},
|
2023-07-25 10:40:26 -04:00
|
|
|
]
|
|
|
|
|
|
|
|
|
|
export function useNextClick(newStatus: string) {
|
2023-08-29 10:48:55 -04:00
|
|
|
const {
|
|
|
|
|
settings: { send },
|
|
|
|
|
} = useGlobalStateContext()
|
2023-07-25 10:40:26 -04:00
|
|
|
const navigate = useNavigate()
|
|
|
|
|
|
|
|
|
|
return useCallback(() => {
|
2023-08-28 20:31:49 -04:00
|
|
|
send({
|
|
|
|
|
type: 'Set Onboarding Status',
|
|
|
|
|
data: { onboardingStatus: newStatus },
|
|
|
|
|
})
|
2023-09-15 22:37:40 -04:00
|
|
|
navigate((newStatus !== onboardingPaths.CAMERA ? '..' : '.') + newStatus)
|
2023-08-28 20:31:49 -04:00
|
|
|
}, [newStatus, send, navigate])
|
2023-07-25 10:40:26 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useDismiss() {
|
2023-08-29 10:48:55 -04:00
|
|
|
const {
|
|
|
|
|
settings: { send },
|
|
|
|
|
} = useGlobalStateContext()
|
2023-07-25 10:40:26 -04:00
|
|
|
const navigate = useNavigate()
|
|
|
|
|
|
2023-08-18 10:27:01 -04:00
|
|
|
return useCallback(
|
|
|
|
|
(path: string) => {
|
2023-08-28 20:31:49 -04:00
|
|
|
send({
|
|
|
|
|
type: 'Set Onboarding Status',
|
|
|
|
|
data: { onboardingStatus: 'dismissed' },
|
|
|
|
|
})
|
2023-08-18 10:27:01 -04:00
|
|
|
navigate(path)
|
|
|
|
|
},
|
2023-08-28 20:31:49 -04:00
|
|
|
[send, navigate]
|
2023-08-18 10:27:01 -04:00
|
|
|
)
|
2023-07-25 10:40:26 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const Onboarding = () => {
|
2023-07-25 11:16:52 -04:00
|
|
|
const dismiss = useDismiss()
|
2023-08-18 10:27:01 -04:00
|
|
|
useHotkeys('esc', () => dismiss('../'))
|
2023-07-25 10:40:26 -04:00
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
<Outlet />
|
|
|
|
|
</>
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default Onboarding
|