npm install -S iti-react
// React
export const PizzaData = () => {
const kitchenSet = useContainerSet(["oven", "kitchen"])
if (!kitchenSet) return <>Kitchen is loading </>
let inOven = kitchenSet.oven.pizzasInOven()
return <>Pizzaz In Oven: {inOven}</>
}
Generates a set of app specific container hooks
// my-app-hooks.ts
import React, { useContext } from "react"
import { getContainerSetHooks } from "iti-react"
import { getProviders, PizzaAppContainer } from "./_root.store"
export const MyRootCont = React.createContext(<PizzaAppContainer>{})
let mega = getContainerSetHooks(getProviders, MyRootCont)
export const useContainerSet = mega.useContainerSet
// PizzaData.tsx
import { useContainerSet } from "./my-app-hooks"
export const PizzaData = () => {
const containerSet = useContainerSet((containers) => [containers.kitchen])
console.log(containerSet)
return 123
}
export const PizzaData = () => {
const [kitchenContainer, err] = useContainer().kitchen
if (!kitchenContainer || err) {
return <>Kitchen is loading</>
}
return <>{kitchenContainer.oven.pizzasInOven}</>
}
Get multiple containers and autosubscribes to change.
export const PizzaData = () => {
const containerSet = useContainerSet((containers) => [
containers.kitchen,
containers.auth,
])
if (!containerSet) {
return <>Kitchen is loading</>
}
return <>{containerSet.kitchen.oven.pizzasInOven}</>
}
You can create a simpler API for a portion of your applicatoin to avoid dealing with async in every component. There are some helpfull Context helpers at your service. Also you can use classic props drilling to avoid dealing with async flow in every component
import React, { useContext } from "react"
import { useContainerSet } from "../containers/_container.hooks"
import { generateEnsureContainerSet } from "iti-react"
const x = generateEnsureContainerSet(() =>
useContainerSet(["kitchen", "pizzaContainer", "auth"]),
)
export const EnsureNewKitchenContainer = x.EnsureWrapper
export const useNewKitchenContext = x.contextHook
export const PizzaApp = () => {
return (
<div>
Pizza App:
<EnsureNewKitchenContainer
fallback={<>Pizza App is still loading please wait</>}
>
<NewPizzaPlaceControls />
</EnsureNewKitchenContainer>
</div>
)
}
export const PizzaData = () => {
const { kitchen, pizzaContainer } = useNewKitchenContext()
return (
<div>
<div>Name: {kitchen.kitchen.kitchenName}</div>
<div>Tables: {pizzaContainer.diningTables.tables}</div>
</div>
)
}