runtime.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { createComponent, createContext, type JSX, useContext } from "solid-js"
  2. export type TuiPaths = Readonly<{
  3. cwd: string
  4. home: string
  5. state: string
  6. worktree: string
  7. }>
  8. export type TuiTerminalEnvironment = Readonly<{
  9. platform: string
  10. multiplexer?: "tmux" | "screen"
  11. displayServer?: "wayland" | "x11"
  12. }>
  13. export type TuiStartup = Readonly<{
  14. initialRoute?: unknown
  15. skipInitialLoading: boolean
  16. }>
  17. const PathsContext = createContext<TuiPaths>()
  18. const TerminalEnvironmentContext = createContext<TuiTerminalEnvironment>()
  19. const StartupContext = createContext<TuiStartup>()
  20. function provider<T>(context: ReturnType<typeof createContext<T>>, value: T, children: () => JSX.Element) {
  21. return createComponent(context.Provider, {
  22. value: Object.freeze({ ...value }),
  23. get children() {
  24. return children()
  25. },
  26. })
  27. }
  28. export function TuiPathsProvider(props: { value: TuiPaths; children: JSX.Element }) {
  29. return provider(PathsContext, props.value, () => props.children)
  30. }
  31. export function TuiTerminalEnvironmentProvider(props: { value: TuiTerminalEnvironment; children: JSX.Element }) {
  32. return provider(TerminalEnvironmentContext, props.value, () => props.children)
  33. }
  34. export function TuiStartupProvider(props: { value: TuiStartup; children: JSX.Element }) {
  35. return provider(StartupContext, props.value, () => props.children)
  36. }
  37. function required<T>(context: ReturnType<typeof createContext<T>>, name: string) {
  38. const value = useContext(context)
  39. if (!value) throw new Error(`${name} is missing`)
  40. return value
  41. }
  42. export function useTuiPaths() {
  43. return required(PathsContext, "TuiPathsProvider")
  44. }
  45. export function useTuiTerminalEnvironment() {
  46. return required(TerminalEnvironmentContext, "TuiTerminalEnvironmentProvider")
  47. }
  48. export function useTuiStartup() {
  49. return required(StartupContext, "TuiStartupProvider")
  50. }