@kosdev-code/kos-dispense-sdk 2.0.8 → 2.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{dispense-registration-manager-CM5dCYOj.js → dispense-registration-manager-BtVe7yFS.js} +170 -161
- package/dispense-registration-manager-BtVe7yFS.js.map +1 -0
- package/dispense-registration-manager-CcV-anPv.cjs +2 -0
- package/dispense-registration-manager-CcV-anPv.cjs.map +1 -0
- package/{extension-utils-DWDUf_CG.cjs → extension-utils-BMU452cN.cjs} +2 -2
- package/{extension-utils-DWDUf_CG.cjs.map → extension-utils-BMU452cN.cjs.map} +1 -1
- package/{extension-utils-BPMrkQU8.js → extension-utils-CMoNCoHG.js} +2 -2
- package/{extension-utils-BPMrkQU8.js.map → extension-utils-CMoNCoHG.js.map} +1 -1
- package/index.cjs +1 -1
- package/index.js +3 -3
- package/models/models/assembly/assembly-model.d.ts.map +1 -1
- package/models/models/holder/holder-model.d.ts.map +1 -1
- package/models/models/holder/types/index.d.ts +7 -0
- package/models/models/nozzle/nozzle-model.d.ts.map +1 -1
- package/models/utils/service.d.ts +4 -0
- package/models/utils/service.d.ts.map +1 -1
- package/models.cjs +1 -1
- package/models.js +2 -2
- package/package.json +3 -3
- package/{pump-provider-DhGo9tIz.js → pump-provider-3XH9JScg.js} +2 -2
- package/pump-provider-3XH9JScg.js.map +1 -0
- package/{pump-provider-CJUtMsmT.cjs → pump-provider-CyLiBpMN.cjs} +2 -2
- package/pump-provider-CyLiBpMN.cjs.map +1 -0
- package/ui/hooks/nozzle-pour/use-nozzle-pour.d.ts +2 -0
- package/ui/hooks/nozzle-pour/use-nozzle-pour.d.ts.map +1 -1
- package/ui.cjs +1 -1
- package/ui.js +2 -2
- package/dispense-registration-manager-BSepm8-N.cjs +0 -2
- package/dispense-registration-manager-BSepm8-N.cjs.map +0 -1
- package/dispense-registration-manager-CM5dCYOj.js.map +0 -1
- package/pump-provider-CJUtMsmT.cjs.map +0 -1
- package/pump-provider-DhGo9tIz.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var E = Object.defineProperty;
|
|
2
2
|
var H = (t, e, s) => e in t ? E(t, e, { enumerable: !0, configurable: !0, writable: !0, value: s }) : t[e] = s;
|
|
3
3
|
var p = (t, e, s) => (H(t, typeof e != "symbol" ? e + "" : e, s), s);
|
|
4
|
-
import { l as O, m as j, n as A, o as T, p as z, q as L, s as F, t as w, u as B, v as G, w as R, x as $, y as C, z as K, C as k, F as q, G as N, E as r } from "./dispense-registration-manager-
|
|
4
|
+
import { l as O, m as j, n as A, o as T, p as z, q as L, s as F, t as w, u as B, v as G, w as R, x as $, y as C, z as K, C as k, F as q, G as N, E as r } from "./dispense-registration-manager-BtVe7yFS.js";
|
|
5
5
|
import { kosAutoEffect as J, CoreExtensionManager as y, ExtensionManager as a } from "@kosdev-code/kos-ui-sdk";
|
|
6
6
|
import { useState as n, useEffect as Q } from "react";
|
|
7
7
|
const h = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
@@ -367,4 +367,4 @@ export {
|
|
|
367
367
|
se as g,
|
|
368
368
|
te as i
|
|
369
369
|
};
|
|
370
|
-
//# sourceMappingURL=extension-utils-
|
|
370
|
+
//# sourceMappingURL=extension-utils-CMoNCoHG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-utils-BPMrkQU8.js","sources":["../../../../packages/sdk/kos-dispense-sdk/src/models/models/holder/utils/holder-utils.ts","../../../../packages/sdk/kos-dispense-sdk/src/models/utils/extension-utils.ts"],"sourcesContent":["import { kosAutoEffect } from \"@kosdev-code/kos-ui-sdk\";\nimport { useEffect, useState } from \"react\";\nimport type { HolderModel } from \"../types\";\n\nexport const getFuelGaugeValue = (holder: HolderModel) => {\n const [maxVolume, setMaxVolume] = useState<number>(\n holder?.slice?.maxVolMl ?? 0\n );\n const [remainingVolume, setRemainingVolume] = useState<number>(\n holder?.slice?.currentVolMl ?? 0\n );\n\n const [hasMaxVolume, setHasMaxVolume] = useState<boolean>(\n holder?.slice?.maxVolMl !== undefined\n );\n\n const [hasRemainingVolume, setHasRemainingVolume] = useState<boolean>(\n holder?.slice?.currentVolMl !== undefined\n );\n\n const [fillPercent, setFillPercent] = useState<number>(\n remainingVolume <= 0\n ? 0\n : Math.floor(((remainingVolume || 1) / (maxVolume || 1)) * 100)\n );\n\n const [hasFuelGuage, setHasFuelGuage] = useState<boolean>(\n hasMaxVolume && hasRemainingVolume\n );\n\n useEffect(() => {\n const disposer = kosAutoEffect(() => {\n setMaxVolume(holder?.slice?.maxVolMl ?? 0);\n setRemainingVolume(holder?.slice?.currentVolMl ?? 0);\n setHasMaxVolume(holder?.slice?.maxVolMl !== undefined);\n setHasRemainingVolume(holder?.slice?.currentVolMl !== undefined);\n setFillPercent(\n remainingVolume <= 0\n ? 0\n : Math.floor(((remainingVolume || 1) / (maxVolume || 1)) * 100)\n );\n setHasFuelGuage(hasMaxVolume && hasRemainingVolume);\n });\n\n return () => {\n disposer();\n };\n }, [holder]);\n\n return { maxVolume, remainingVolume, fillPercent, hasFuelGuage };\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n CoreExtensionManager,\n DataLoader,\n DataMapper,\n ExtensionManager,\n IndexExtension,\n PropertyMapper,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport { ExtensionType } from \"../constants\";\nimport { AssemblyTypes } from \"../models\";\nimport type { HolderResponse } from \"../models/holder/services\";\nimport type { HolderModel } from \"../models/holder/types\";\nimport type { IngredientResponse } from \"../models/ingredient/services\";\nimport type { BeverageResponse } from \"../models/nozzle/services\";\nimport type { SelectedPourable } from \"../models/nozzle/types\";\n\nexport type IngredientDataMapper<\n AdditionalData extends object = Record<string, any>\n> = DataMapper<IngredientResponse, AdditionalData, any>;\n\n/**\n * Mapping function that maps an ingredient response into the type property of\n * the {@link IngredientModel}.\n */\nexport type IngredientTypeMapper<\n T extends IngredientResponse = IngredientResponse\n> = PropertyMapper<T, string>;\n\n/**\n * Mapping function that maps additional data from holder service response\n * into the {@link HolderModel} data.\n */\nexport type HolderTypeMapper<T extends HolderResponse = HolderResponse> =\n PropertyMapper<T, string>;\n\n/**\n * Mapping function that maps additional data from holder service response\n * into the {@link HolderModel} data.\n */\nexport type HolderDataMapper<\n AdditionalData extends object = Record<string, any>,\n HolderData extends HolderResponse = HolderResponse\n> = DataMapper<HolderData, AdditionalData, any>;\n\nexport type GroupBeverageResponse = BeverageResponse & { groupId: string };\nexport type AvailabilityDataMapper<\n AdditionalData extends object = Record<string, any>,\n AvailabilityData extends GroupBeverageResponse = GroupBeverageResponse\n> = DataMapper<AvailabilityData, AdditionalData, any>;\n\nexport type SelectedPourableMapper = DataMapper<SelectedPourable, any>;\n\nexport type BoardDataMapper<\n AdditionalData extends object = Record<string, any>,\n BoardData extends AssemblyTypes.AssemblyBoard<any> = AssemblyTypes.AssemblyBoard<any>\n> = DataMapper<BoardData, AdditionalData, any>;\n\nexport type AssemblyMapper<\n AdditionalData extends object = Record<string, any>,\n AssemblyResponseData extends AssemblyTypes.AssemblyResponse<any> = AssemblyTypes.AssemblyResponse<any>\n> = DataMapper<AssemblyResponseData, AdditionalData, any>;\n/**\n * The DispenseExtensionManager is responsible for managing the extension points that are specific to the Dispense application.\n */\nexport class DispenseExtensionManager {\n core: CoreExtensionManager = new CoreExtensionManager();\n /**\n * Maps data into the {@link IngredientModel}\n *\n * It is common for the ingredient data provided by the ingredient service to be augmented with additional properties that are\n * not provided by the base KOS Ingredient model. The {@link IngredientMapper} extension point allows for the data to be mapped\n * into the {@link IngredientModel} and the {@link IngredientModel.data} property to be augmented with additional properties.\n *\n * @example\n * The following example shows how to map the data from the service response into the {@link IngredientModel}.\n * The context is provided by the {@link IngredientLoader} extension point with its data being used to optionally augment the\n * ingredient data.\n *\n * The result of the mapping will be available in the `data` property of the {@link IngredientModel}.\n *\n * In this case the `IngedientReponseData` interface represents the data being returned by the ingredient service and the\n * `IngredientData` interface represents the data that will be available in the {@link IngredientModel.data} property. The `ingredientDataMapper`\n * is responsible for mapping from one format to the other.\n *\n * ```typescript\n *\n * interface IngredientResponseData extends NozzleServices.IngredientResponse {\n * chilled: boolean;\n * carbonated: boolean;\n * highYield: boolean;\n * }\n *\n * interface IngredientData {\n * chilled: boolean;\n * carbonated: boolean;\n * highYield: boolean;\n * }\n *\n * export const ingredientDataMapper = async (\n * data: IngredientResponseData,\n * context: IngredientContext\n * ): Promise<IngredientData> => {\n * return {\n * chilled: data.chilled,\n * carbonated: data.carbonated,\n * highYield: data.highYield,\n * }\n * }\n * ```\n * */\n registerIngredientDataMapper(ingredientDataMapper: IngredientDataMapper) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.IngredientMapper,\n ingredientDataMapper\n );\n\n return this;\n }\n\n /**\n * Loads data that will be provided as context into the {@link IngredientMapper}\n *\n * @example\n * The following example shows how to load the brandset data, normalize it into a map and then provide it back to the framework\n * where it can be used by the other extension points.\n *\n * In the ingredient container model, the data is provided to the {@link IngredientMapper} extension point in order to augment ingredient data\n * and also loaded into the ingredient container model context in order to make the data available throughout the code.\n *\n * ```typescript\n * export const ingredientContextLoader = async (): Promise<BeverageContext> => {\n * const response = await kosFetch('kos:/system/some/ingredient/endpoint.json');\n *\n * if (response.status !== 200) {\n * KosLog.error('Failed to load ingredient data');\n * return {};\n * }\n * const json = await response.json();\n * return json;\n * };\n * ```\n * */\n registerIngredientLoader(ingredientLoader: DataLoader) {\n ExtensionManager.loader.registerLoader(\n ExtensionType.IngredientLoader,\n ingredientLoader\n );\n return this;\n }\n\n registerIngredientIndex(ingredientIndex: IndexExtension) {\n ExtensionManager.indexExtension.registerIndexExtension(\n ExtensionType.IngredientIndex,\n ingredientIndex\n );\n return this;\n }\n\n /**\n * Registers a data mapper for the {@link IngredientModel}\n * */\n registerIngredientTypeMapper(ingredientTypeMapper: IngredientTypeMapper) {\n ExtensionManager.propertyMapper.registerPropertyMapper(\n ExtensionType.IngredientTypeMapper,\n ingredientTypeMapper\n );\n return this;\n }\n\n /**\n * Registers a data mapper for the {@link HolderModel} model.\n * @param holderDataMapper - Mapping function that maps additional data from holder service response\n * @returns\n */\n registerHolderDataMapper(holderDataMapper: HolderDataMapper) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.HolderMapper,\n holderDataMapper\n );\n return this;\n }\n\n registerHolderTypeMapper(holderTypeMapper: HolderTypeMapper) {\n ExtensionManager.propertyMapper.registerPropertyMapper(\n ExtensionType.HolderTypeMapper,\n holderTypeMapper\n );\n return this;\n }\n\n /**\n * Maps the ingredientId property of the holder into the {@link HolderModel}.\n * If not provided, the ingredientId will assume that the value is mapped from the\n * ingredientId property of the service response.\n * */\n registerHolderIngredientMapper(holderTypeMapper: HolderTypeMapper) {\n ExtensionManager.propertyMapper.registerPropertyMapper(\n ExtensionType.HolderTypeMapper,\n holderTypeMapper\n );\n return this;\n }\n\n registerHolderIndex<T extends HolderModel = HolderModel>(\n holderIndex: IndexExtension<T>\n ) {\n ExtensionManager.indexExtension.registerIndexExtension(\n ExtensionType.HolderIndex,\n holderIndex\n );\n return this;\n }\n\n /**\n * Maps data into the {@link AvailabilityModel}\n *\n * @example\n * The following example shows how to map the data from the service response into the {@link AvailabilityModel}.\n * The context is provided by the {@link AvailabilityLoader} extension point with its data being used to augment the\n * availability data.\n *\n * The result of the mapping will be available in the `data` property of the {@link AvailabilityModel}.\n *\n * ```typescript\n * export const beverageDataMapper = async (\n * data: NozzleServices.BeverageResponse,\n * context: BeverageContext\n * ): Promise<BeverageData> => {\n * const id = data.altId;\n * const iconUrl = encodeURI(\n * `http://localhost:8081/system/brandset/${context?.[id]?.icon}`\n * );\n * const cuiColorCode = context?.[id]?.cuiColorCode\n * ? context?.[id]?.cuiColorCode\n * : '';\n * return { iconUrl, cuiColorCode };\n * };\n * ```\n * */\n registerAvailabilityDataMapper(availabilityMapper: AvailabilityDataMapper) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.AvailabilityMapper,\n availabilityMapper\n );\n return this;\n }\n\n /**\n * Loads data that will be provided as context into the {@link AvailabilityMapper}\n *\n * @example\n * A common use case is to load brandset data that is UI specific and not provided directly by the Java service.\n *\n * The following example shows how to load the brandset data, normalize it into a map and then provide it back to the framework\n * where it can be used by the other extension points.\n *\n * In the nozzle model, the data is provided to the {@link AvailabilityMapper} extension point in order to augment availability data\n * and also loaded into the nozzle model context in order to make the data available throughout the code.\n *\n * ```typescript\n * export const beverageContextLoader = async (): Promise<BeverageContext> => {\n * const response = await kosFetch('kos:/system/brandset/brandset.json');\n *\n * if (response.status !== 200) {\n * KosLog.error('Failed to load beverage data');\n * return {};\n * }\n * const json: BrandsetResponse | null = await response.json();\n * const initialBeverages: Record<string, BrandsetIngredient> = {};\n * const beverages = json?.ingredients?.reduce((acc, beverage) => {\n * acc[beverage.ingredientId] = beverage;\n * return acc;\n * }, initialBeverages);\n * return beverages;\n * };\n * ```\n * */\n registerAvailabilityLoader(availabilityLoader: DataLoader) {\n ExtensionManager.loader.registerLoader(\n ExtensionType.AvailabilityLoader,\n availabilityLoader\n );\n return this;\n }\n\n /**\n * Maps the abstract {@link SelectedPourable} data into a format that is specific to the nozzle.\n * */\n registerSelectedPourableDataMapper(\n selectedPourableMapper: SelectedPourableMapper\n ) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.SelectedPourableMapper,\n selectedPourableMapper\n );\n return this;\n }\n\n /**\n * Maps data into the {@link AssemblyModel} data.\n * Used in cases where the base assembly has been extended with additional properties in the backend. This extension\n * point allows for the data to be mapped into the {@link AssemblyModel} and augmented with additional properties.\n *\n * @example\n *\n * In this example of an implementation of a {@link AssemblyMapper}, the {@link AssemblyResponse} data is mapped into\n * a {@link FreestyleAssembly} object.\n *\n * The {@link FreestyleAssemblyResponse} interface represents the additional data being returned by the assembly service and is\n * merged into the {@link AssemblyResponse} interface.\n *\n * The {@link FreestyleAssembly} interface represents the additional data, beyond the base data set, that will be merged into the {@link AssemblyModel}.\n *\n * The mapper is responsible for mapping from the {@link FreestyleAssemblyResponse} format to the {@link FreestyleAssembly} format.\n * ```typescript\n * import { AssemblyTypes } from \"@kosdev-code/kos-dispense-sdk\";\n * import { DataMapper } from \"@kosdev-code/kos-ui-sdk\";\n *\n * // define the additional data being returned by the assembly service\n * export interface FreestyleAssemblyResponse {\n * iceAgitator?: {\n * name: \"iceAgitator\";\n * path: string;\n * };\n * }\n *\n * // define the additional data structure that will be merged into the assembly model\n * export interface FreestyleAssembly {\n * iceAgitator: {\n * path: string;\n * };\n * carbAgitator: {\n * path: string;\n * };\n * }\n *\n *\n * // define the mapper that will map the data from the service response into the additional data structure\n * // that will be merged into the assembly model.\n * // In this case the mapper is responsible for mapping from the {@link FreestyleAssemblyResponse} format to the {@link FreestyleAssembly} format.\n * export const assemblyDataMapper: DataMapper<\n * AssemblyTypes.AssemblyResponse<FreestyleAssemblyResponse>,\n * FreestyleAssembly\n * > = async (data) => {\n * const response = data.assemblies.reduce((acc, assembly) => {\n * const agitatorKeys = [\"iceAgitator\", \"carbAgitator\"];\n * agitatorKeys.forEach((key) => {\n * const agitator = assembly[key];\n * if (agitator) {\n * acc[key] = agitator;\n * }\n * });\n *\n * return acc;\n * }, {} as FreestyleAssembly);\n * return response;\n * };\n *```\n */\n registerAssemblyDataMapper(assemblyDataMapper: AssemblyMapper) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.AssemblyMapper,\n assemblyDataMapper\n );\n return this;\n }\n\n registerBoardIndex(boardIndex: IndexExtension) {\n ExtensionManager.indexExtension.registerIndexExtension(\n ExtensionType.BoardIndex,\n boardIndex\n );\n return this;\n }\n\n registerBoardDataMapper(boardDataMapper: BoardDataMapper<any, any>) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.BoardMapper,\n boardDataMapper\n );\n return this;\n }\n}\n\n/**\n * The KosExtensionManager provides access to the extension points that are provided in the SDK for Dispense applications.\n *\n * The extension points are divided into two categories:\n *\n * @param core - The core extension {@link CoreExtensionManager} points are used to extend the base models that are provided by the SDK.\n * @param dispense - The dispense extension {@link DispenseExtensionManager} points are used to extend the models that are specific to the Dispense SDK.\n */\nexport class KosExtensionManager {\n dispense: DispenseExtensionManager;\n core: CoreExtensionManager;\n constructor() {\n this.dispense = new DispenseExtensionManager();\n this.core = new CoreExtensionManager();\n }\n}\n"],"names":["getFuelGaugeValue","holder","maxVolume","setMaxVolume","useState","_a","remainingVolume","setRemainingVolume","_b","hasMaxVolume","setHasMaxVolume","_c","hasRemainingVolume","setHasRemainingVolume","_d","fillPercent","setFillPercent","hasFuelGuage","setHasFuelGuage","useEffect","disposer","kosAutoEffect","DispenseExtensionManager","__publicField","CoreExtensionManager","ingredientDataMapper","ExtensionManager","ExtensionType","ingredientLoader","ingredientIndex","ingredientTypeMapper","holderDataMapper","holderTypeMapper","holderIndex","availabilityMapper","availabilityLoader","selectedPourableMapper","assemblyDataMapper","boardIndex","boardDataMapper","KosExtensionManager"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extension-utils-CMoNCoHG.js","sources":["../../../../packages/sdk/kos-dispense-sdk/src/models/models/holder/utils/holder-utils.ts","../../../../packages/sdk/kos-dispense-sdk/src/models/utils/extension-utils.ts"],"sourcesContent":["import { kosAutoEffect } from \"@kosdev-code/kos-ui-sdk\";\nimport { useEffect, useState } from \"react\";\nimport type { HolderModel } from \"../types\";\n\nexport const getFuelGaugeValue = (holder: HolderModel) => {\n const [maxVolume, setMaxVolume] = useState<number>(\n holder?.slice?.maxVolMl ?? 0\n );\n const [remainingVolume, setRemainingVolume] = useState<number>(\n holder?.slice?.currentVolMl ?? 0\n );\n\n const [hasMaxVolume, setHasMaxVolume] = useState<boolean>(\n holder?.slice?.maxVolMl !== undefined\n );\n\n const [hasRemainingVolume, setHasRemainingVolume] = useState<boolean>(\n holder?.slice?.currentVolMl !== undefined\n );\n\n const [fillPercent, setFillPercent] = useState<number>(\n remainingVolume <= 0\n ? 0\n : Math.floor(((remainingVolume || 1) / (maxVolume || 1)) * 100)\n );\n\n const [hasFuelGuage, setHasFuelGuage] = useState<boolean>(\n hasMaxVolume && hasRemainingVolume\n );\n\n useEffect(() => {\n const disposer = kosAutoEffect(() => {\n setMaxVolume(holder?.slice?.maxVolMl ?? 0);\n setRemainingVolume(holder?.slice?.currentVolMl ?? 0);\n setHasMaxVolume(holder?.slice?.maxVolMl !== undefined);\n setHasRemainingVolume(holder?.slice?.currentVolMl !== undefined);\n setFillPercent(\n remainingVolume <= 0\n ? 0\n : Math.floor(((remainingVolume || 1) / (maxVolume || 1)) * 100)\n );\n setHasFuelGuage(hasMaxVolume && hasRemainingVolume);\n });\n\n return () => {\n disposer();\n };\n }, [holder]);\n\n return { maxVolume, remainingVolume, fillPercent, hasFuelGuage };\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n CoreExtensionManager,\n DataLoader,\n DataMapper,\n ExtensionManager,\n IndexExtension,\n PropertyMapper,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport { ExtensionType } from \"../constants\";\nimport { AssemblyTypes } from \"../models\";\nimport type { HolderResponse } from \"../models/holder/services\";\nimport type { HolderModel } from \"../models/holder/types\";\nimport type { IngredientResponse } from \"../models/ingredient/services\";\nimport type { BeverageResponse } from \"../models/nozzle/services\";\nimport type { SelectedPourable } from \"../models/nozzle/types\";\n\nexport type IngredientDataMapper<\n AdditionalData extends object = Record<string, any>\n> = DataMapper<IngredientResponse, AdditionalData, any>;\n\n/**\n * Mapping function that maps an ingredient response into the type property of\n * the {@link IngredientModel}.\n */\nexport type IngredientTypeMapper<\n T extends IngredientResponse = IngredientResponse\n> = PropertyMapper<T, string>;\n\n/**\n * Mapping function that maps additional data from holder service response\n * into the {@link HolderModel} data.\n */\nexport type HolderTypeMapper<T extends HolderResponse = HolderResponse> =\n PropertyMapper<T, string>;\n\n/**\n * Mapping function that maps additional data from holder service response\n * into the {@link HolderModel} data.\n */\nexport type HolderDataMapper<\n AdditionalData extends object = Record<string, any>,\n HolderData extends HolderResponse = HolderResponse\n> = DataMapper<HolderData, AdditionalData, any>;\n\nexport type GroupBeverageResponse = BeverageResponse & { groupId: string };\nexport type AvailabilityDataMapper<\n AdditionalData extends object = Record<string, any>,\n AvailabilityData extends GroupBeverageResponse = GroupBeverageResponse\n> = DataMapper<AvailabilityData, AdditionalData, any>;\n\nexport type SelectedPourableMapper = DataMapper<SelectedPourable, any>;\n\nexport type BoardDataMapper<\n AdditionalData extends object = Record<string, any>,\n BoardData extends AssemblyTypes.AssemblyBoard<any> = AssemblyTypes.AssemblyBoard<any>\n> = DataMapper<BoardData, AdditionalData, any>;\n\nexport type AssemblyMapper<\n AdditionalData extends object = Record<string, any>,\n AssemblyResponseData extends AssemblyTypes.AssemblyResponse<any> = AssemblyTypes.AssemblyResponse<any>\n> = DataMapper<AssemblyResponseData, AdditionalData, any>;\n/**\n * The DispenseExtensionManager is responsible for managing the extension points that are specific to the Dispense application.\n */\nexport class DispenseExtensionManager {\n core: CoreExtensionManager = new CoreExtensionManager();\n /**\n * Maps data into the {@link IngredientModel}\n *\n * It is common for the ingredient data provided by the ingredient service to be augmented with additional properties that are\n * not provided by the base KOS Ingredient model. The {@link IngredientMapper} extension point allows for the data to be mapped\n * into the {@link IngredientModel} and the {@link IngredientModel.data} property to be augmented with additional properties.\n *\n * @example\n * The following example shows how to map the data from the service response into the {@link IngredientModel}.\n * The context is provided by the {@link IngredientLoader} extension point with its data being used to optionally augment the\n * ingredient data.\n *\n * The result of the mapping will be available in the `data` property of the {@link IngredientModel}.\n *\n * In this case the `IngedientReponseData` interface represents the data being returned by the ingredient service and the\n * `IngredientData` interface represents the data that will be available in the {@link IngredientModel.data} property. The `ingredientDataMapper`\n * is responsible for mapping from one format to the other.\n *\n * ```typescript\n *\n * interface IngredientResponseData extends NozzleServices.IngredientResponse {\n * chilled: boolean;\n * carbonated: boolean;\n * highYield: boolean;\n * }\n *\n * interface IngredientData {\n * chilled: boolean;\n * carbonated: boolean;\n * highYield: boolean;\n * }\n *\n * export const ingredientDataMapper = async (\n * data: IngredientResponseData,\n * context: IngredientContext\n * ): Promise<IngredientData> => {\n * return {\n * chilled: data.chilled,\n * carbonated: data.carbonated,\n * highYield: data.highYield,\n * }\n * }\n * ```\n * */\n registerIngredientDataMapper(ingredientDataMapper: IngredientDataMapper) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.IngredientMapper,\n ingredientDataMapper\n );\n\n return this;\n }\n\n /**\n * Loads data that will be provided as context into the {@link IngredientMapper}\n *\n * @example\n * The following example shows how to load the brandset data, normalize it into a map and then provide it back to the framework\n * where it can be used by the other extension points.\n *\n * In the ingredient container model, the data is provided to the {@link IngredientMapper} extension point in order to augment ingredient data\n * and also loaded into the ingredient container model context in order to make the data available throughout the code.\n *\n * ```typescript\n * export const ingredientContextLoader = async (): Promise<BeverageContext> => {\n * const response = await kosFetch('kos:/system/some/ingredient/endpoint.json');\n *\n * if (response.status !== 200) {\n * KosLog.error('Failed to load ingredient data');\n * return {};\n * }\n * const json = await response.json();\n * return json;\n * };\n * ```\n * */\n registerIngredientLoader(ingredientLoader: DataLoader) {\n ExtensionManager.loader.registerLoader(\n ExtensionType.IngredientLoader,\n ingredientLoader\n );\n return this;\n }\n\n registerIngredientIndex(ingredientIndex: IndexExtension) {\n ExtensionManager.indexExtension.registerIndexExtension(\n ExtensionType.IngredientIndex,\n ingredientIndex\n );\n return this;\n }\n\n /**\n * Registers a data mapper for the {@link IngredientModel}\n * */\n registerIngredientTypeMapper(ingredientTypeMapper: IngredientTypeMapper) {\n ExtensionManager.propertyMapper.registerPropertyMapper(\n ExtensionType.IngredientTypeMapper,\n ingredientTypeMapper\n );\n return this;\n }\n\n /**\n * Registers a data mapper for the {@link HolderModel} model.\n * @param holderDataMapper - Mapping function that maps additional data from holder service response\n * @returns\n */\n registerHolderDataMapper(holderDataMapper: HolderDataMapper) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.HolderMapper,\n holderDataMapper\n );\n return this;\n }\n\n registerHolderTypeMapper(holderTypeMapper: HolderTypeMapper) {\n ExtensionManager.propertyMapper.registerPropertyMapper(\n ExtensionType.HolderTypeMapper,\n holderTypeMapper\n );\n return this;\n }\n\n /**\n * Maps the ingredientId property of the holder into the {@link HolderModel}.\n * If not provided, the ingredientId will assume that the value is mapped from the\n * ingredientId property of the service response.\n * */\n registerHolderIngredientMapper(holderTypeMapper: HolderTypeMapper) {\n ExtensionManager.propertyMapper.registerPropertyMapper(\n ExtensionType.HolderTypeMapper,\n holderTypeMapper\n );\n return this;\n }\n\n registerHolderIndex<T extends HolderModel = HolderModel>(\n holderIndex: IndexExtension<T>\n ) {\n ExtensionManager.indexExtension.registerIndexExtension(\n ExtensionType.HolderIndex,\n holderIndex\n );\n return this;\n }\n\n /**\n * Maps data into the {@link AvailabilityModel}\n *\n * @example\n * The following example shows how to map the data from the service response into the {@link AvailabilityModel}.\n * The context is provided by the {@link AvailabilityLoader} extension point with its data being used to augment the\n * availability data.\n *\n * The result of the mapping will be available in the `data` property of the {@link AvailabilityModel}.\n *\n * ```typescript\n * export const beverageDataMapper = async (\n * data: NozzleServices.BeverageResponse,\n * context: BeverageContext\n * ): Promise<BeverageData> => {\n * const id = data.altId;\n * const iconUrl = encodeURI(\n * `http://localhost:8081/system/brandset/${context?.[id]?.icon}`\n * );\n * const cuiColorCode = context?.[id]?.cuiColorCode\n * ? context?.[id]?.cuiColorCode\n * : '';\n * return { iconUrl, cuiColorCode };\n * };\n * ```\n * */\n registerAvailabilityDataMapper(availabilityMapper: AvailabilityDataMapper) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.AvailabilityMapper,\n availabilityMapper\n );\n return this;\n }\n\n /**\n * Loads data that will be provided as context into the {@link AvailabilityMapper}\n *\n * @example\n * A common use case is to load brandset data that is UI specific and not provided directly by the Java service.\n *\n * The following example shows how to load the brandset data, normalize it into a map and then provide it back to the framework\n * where it can be used by the other extension points.\n *\n * In the nozzle model, the data is provided to the {@link AvailabilityMapper} extension point in order to augment availability data\n * and also loaded into the nozzle model context in order to make the data available throughout the code.\n *\n * ```typescript\n * export const beverageContextLoader = async (): Promise<BeverageContext> => {\n * const response = await kosFetch('kos:/system/brandset/brandset.json');\n *\n * if (response.status !== 200) {\n * KosLog.error('Failed to load beverage data');\n * return {};\n * }\n * const json: BrandsetResponse | null = await response.json();\n * const initialBeverages: Record<string, BrandsetIngredient> = {};\n * const beverages = json?.ingredients?.reduce((acc, beverage) => {\n * acc[beverage.ingredientId] = beverage;\n * return acc;\n * }, initialBeverages);\n * return beverages;\n * };\n * ```\n * */\n registerAvailabilityLoader(availabilityLoader: DataLoader) {\n ExtensionManager.loader.registerLoader(\n ExtensionType.AvailabilityLoader,\n availabilityLoader\n );\n return this;\n }\n\n /**\n * Maps the abstract {@link SelectedPourable} data into a format that is specific to the nozzle.\n * */\n registerSelectedPourableDataMapper(\n selectedPourableMapper: SelectedPourableMapper\n ) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.SelectedPourableMapper,\n selectedPourableMapper\n );\n return this;\n }\n\n /**\n * Maps data into the {@link AssemblyModel} data.\n * Used in cases where the base assembly has been extended with additional properties in the backend. This extension\n * point allows for the data to be mapped into the {@link AssemblyModel} and augmented with additional properties.\n *\n * @example\n *\n * In this example of an implementation of a {@link AssemblyMapper}, the {@link AssemblyResponse} data is mapped into\n * a {@link FreestyleAssembly} object.\n *\n * The {@link FreestyleAssemblyResponse} interface represents the additional data being returned by the assembly service and is\n * merged into the {@link AssemblyResponse} interface.\n *\n * The {@link FreestyleAssembly} interface represents the additional data, beyond the base data set, that will be merged into the {@link AssemblyModel}.\n *\n * The mapper is responsible for mapping from the {@link FreestyleAssemblyResponse} format to the {@link FreestyleAssembly} format.\n * ```typescript\n * import { AssemblyTypes } from \"@kosdev-code/kos-dispense-sdk\";\n * import { DataMapper } from \"@kosdev-code/kos-ui-sdk\";\n *\n * // define the additional data being returned by the assembly service\n * export interface FreestyleAssemblyResponse {\n * iceAgitator?: {\n * name: \"iceAgitator\";\n * path: string;\n * };\n * }\n *\n * // define the additional data structure that will be merged into the assembly model\n * export interface FreestyleAssembly {\n * iceAgitator: {\n * path: string;\n * };\n * carbAgitator: {\n * path: string;\n * };\n * }\n *\n *\n * // define the mapper that will map the data from the service response into the additional data structure\n * // that will be merged into the assembly model.\n * // In this case the mapper is responsible for mapping from the {@link FreestyleAssemblyResponse} format to the {@link FreestyleAssembly} format.\n * export const assemblyDataMapper: DataMapper<\n * AssemblyTypes.AssemblyResponse<FreestyleAssemblyResponse>,\n * FreestyleAssembly\n * > = async (data) => {\n * const response = data.assemblies.reduce((acc, assembly) => {\n * const agitatorKeys = [\"iceAgitator\", \"carbAgitator\"];\n * agitatorKeys.forEach((key) => {\n * const agitator = assembly[key];\n * if (agitator) {\n * acc[key] = agitator;\n * }\n * });\n *\n * return acc;\n * }, {} as FreestyleAssembly);\n * return response;\n * };\n *```\n */\n registerAssemblyDataMapper(assemblyDataMapper: AssemblyMapper) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.AssemblyMapper,\n assemblyDataMapper\n );\n return this;\n }\n\n registerBoardIndex(boardIndex: IndexExtension) {\n ExtensionManager.indexExtension.registerIndexExtension(\n ExtensionType.BoardIndex,\n boardIndex\n );\n return this;\n }\n\n registerBoardDataMapper(boardDataMapper: BoardDataMapper<any, any>) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.BoardMapper,\n boardDataMapper\n );\n return this;\n }\n}\n\n/**\n * The KosExtensionManager provides access to the extension points that are provided in the SDK for Dispense applications.\n *\n * The extension points are divided into two categories:\n *\n * @param core - The core extension {@link CoreExtensionManager} points are used to extend the base models that are provided by the SDK.\n * @param dispense - The dispense extension {@link DispenseExtensionManager} points are used to extend the models that are specific to the Dispense SDK.\n */\nexport class KosExtensionManager {\n dispense: DispenseExtensionManager;\n core: CoreExtensionManager;\n constructor() {\n this.dispense = new DispenseExtensionManager();\n this.core = new CoreExtensionManager();\n }\n}\n"],"names":["getFuelGaugeValue","holder","maxVolume","setMaxVolume","useState","_a","remainingVolume","setRemainingVolume","_b","hasMaxVolume","setHasMaxVolume","_c","hasRemainingVolume","setHasRemainingVolume","_d","fillPercent","setFillPercent","hasFuelGuage","setHasFuelGuage","useEffect","disposer","kosAutoEffect","DispenseExtensionManager","__publicField","CoreExtensionManager","ingredientDataMapper","ExtensionManager","ExtensionType","ingredientLoader","ingredientIndex","ingredientTypeMapper","holderDataMapper","holderTypeMapper","holderIndex","availabilityMapper","availabilityLoader","selectedPourableMapper","assemblyDataMapper","boardIndex","boardDataMapper","KosExtensionManager"],"mappings":"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"}
|
package/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./dispense-registration-manager-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./dispense-registration-manager-CcV-anPv.cjs"),i=require("./extension-utils-BMU452cN.cjs"),e=require("./pump-provider-CyLiBpMN.cjs");require("@kosdev-code/kos-ui-sdk");require("react");require("@emotion/react/jsx-runtime");exports.Assembly=r.Assembly;exports.Availability=r.Availability;exports.Board=r.Board;exports.BoardContainer=r.BoardContainer;Object.defineProperty(exports,"BoardContainerModel",{enumerable:!0,get:()=>r.BoardContainerModel});exports.DeviceAssembly=r.DeviceAssembly;exports.DispenseModelType=r.DispenseModelType;exports.DispenserModels=r.kosModels;exports.ExtensionType=r.ExtensionType;exports.Holder=r.Holder;exports.HolderContainer=r.HolderContainer;exports.Ingredient=r.Ingredient;exports.IngredientContainer=r.IngredientContainer;exports.KosModelRegistry=r.KosModelRegistry;exports.Nozzle=r.Nozzle;exports.PourState=r.PourState;exports.Pump=r.Pump;exports.PumpContainer=r.PumpContainer;exports.PumpIndex=r.PumpIndex;exports.TOPIC_BOARD_LINKED=r.TOPIC_BOARD_LINKED;exports.TOPIC_BOARD_UNLINKED=r.TOPIC_BOARD_UNLINKED;exports.kosModels=r.kosModels;exports.registerDispenseModels=r.registerDispenseModels;exports.AssemblyServices=i.index;exports.AssemblyTypes=i.assembly;exports.DispenseExtensionManager=i.DispenseExtensionManager;exports.HolderServices=i.index$1;exports.IngredientServices=i.index$2;exports.KosExtensionManager=i.KosExtensionManager;exports.NozzleServices=i.index$3;exports.PumpServices=i.index$4;exports.getFuelGaugeValue=i.getFuelGaugeValue;exports.AssemblyProvider=e.AssemblyProvider;exports.AvailabilityProvider=e.AvailabilityProvider;exports.BoardContainerProvider=e.BoardContainerProvider;exports.BoardProvider=e.BoardProvider;exports.CuiKit=e.CuiKit;exports.CuiKitWrapper=e.CuiKitWrapper;exports.DISPENSE_GROUP_BEVERAGE=e.DISPENSE_GROUP_BEVERAGE;exports.DISPENSE_GROUP_BRAND=e.DISPENSE_GROUP_BRAND;exports.DISPENSE_GROUP_FLAVOR=e.DISPENSE_GROUP_FLAVOR;exports.DeviceAssemblyProvider=e.DeviceAssemblyProvider;exports.HoldToPourIntentStrategy=e.HoldToPourIntentStrategy;exports.HoldToPourStrategy=e.HoldToPourStrategy;exports.HolderContainerProvider=e.HolderContainerProvider;exports.HolderProvider=e.HolderProvider;exports.IngredientContainerProvider=e.IngredientContainerProvider;exports.IngredientProvider=e.IngredientProvider;exports.NozzleProvider=e.NozzleProvider;exports.PumpProvider=e.PumpProvider;exports.TapOrHoldIntentStrategy=e.TapOrHoldIntentStrategy;exports.TapToPourIntentStrategy=e.TapToPourIntentStrategy;exports.TapToPourStrategy=e.TapToPourStrategy;exports.initializeCuiKit=e.initializeCuiKit;exports.useAssembly=e.useAssembly;exports.useAssemblyContext=e.useAssemblyContext;exports.useAvailability=e.useAvailability;exports.useAvailabilityContext=e.useAvailabilityContext;exports.useBeverages=e.useBeverages;exports.useBoard=e.useBoard;exports.useBoardContainer=e.useBoardContainer;exports.useBoardContainerContext=e.useBoardContainerContext;exports.useBoardContext=e.useBoardContext;exports.useBrands=e.useBrands;exports.useCuiKit=e.useCuiKit;exports.useCuiKitTimers=e.useCuiKitTimers;exports.useDefaultCuiKitLifecycle=e.useDefaultCuiKitLifecycle;exports.useDeviceAssembly=e.useDeviceAssembly;exports.useDeviceAssemblyContext=e.useDeviceAssemblyContext;exports.useDispenseLifecycle=e.useDispenseLifecycle;exports.useFlavors=e.useFlavors;exports.useHolder=e.useHolder;exports.useHolderContainer=e.useHolderContainer;exports.useHolderContainerContext=e.useHolderContainerContext;exports.useHolderContext=e.useHolderContext;exports.useIngredient=e.useIngredient;exports.useIngredientContainer=e.useIngredientContainer;exports.useIngredientContainerContext=e.useIngredientContainerContext;exports.useIngredientContext=e.useIngredientContext;exports.useIngredientPour=e.useIngredientPour;exports.useNozzle=e.useNozzle;exports.useNozzleContext=e.useNozzleContext;exports.useNozzlePour=e.useNozzlePour;exports.usePumpContext=e.usePumpContext;exports.withAssembly=e.withAssembly;exports.withBeverage=e.withBeverage;exports.withBoard=e.withBoard;exports.withBoardContainer=e.withBoardContainer;exports.withDeviceAssembly=e.withDeviceAssembly;exports.withHolder=e.withHolder;exports.withHolderContainer=e.withHolderContainer;exports.withIngredient=e.withIngredient;exports.withIngredientContainer=e.withIngredientContainer;exports.withNozzle=e.withNozzle;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { A as o, a as t, d as n, c as d, B as l, e as u, D as C, k as P, E as v, H as g, f as y, I as m, g as p, K as I, N as A, j as D, P as B, h as b, i as x, T as S, b as c, k as z, r as E } from "./dispense-registration-manager-
|
|
2
|
-
import { i as N, e as T, D as K, a as h, b as w, K as _, c as O, d as R, g as M } from "./extension-utils-
|
|
3
|
-
import { A as G, a as L, d as U, B as k, f as F, C as V, G as j, F as W, J as q, D as J, a3 as Q, a4 as X, j as Y, H as Z, m as $, I as ee, N as se, P as ae, a5 as re, a6 as ie, a7 as oe, i as te, q as ne, u as de, r as le, b as ue, z as Ce, t as Pe, x as ve, e as ge, c as ye, E as me, K as pe, O as Ie, L as Ae, R as De, g as Be, M as be, Q as xe, T as Se, V as ce, k as ze, h as Ee, X as He, _ as Ne, n as Te, l as Ke, Y as he, a0 as we, o as _e, a2 as Oe, p as Re, w as Me, s as fe, v as Ge, y as Le, S as Ue, U as ke, W as Fe, Z as Ve, $ as je, a1 as We } from "./pump-provider-
|
|
1
|
+
import { A as o, a as t, d as n, c as d, B as l, e as u, D as C, k as P, E as v, H as g, f as y, I as m, g as p, K as I, N as A, j as D, P as B, h as b, i as x, T as S, b as c, k as z, r as E } from "./dispense-registration-manager-BtVe7yFS.js";
|
|
2
|
+
import { i as N, e as T, D as K, a as h, b as w, K as _, c as O, d as R, g as M } from "./extension-utils-CMoNCoHG.js";
|
|
3
|
+
import { A as G, a as L, d as U, B as k, f as F, C as V, G as j, F as W, J as q, D as J, a3 as Q, a4 as X, j as Y, H as Z, m as $, I as ee, N as se, P as ae, a5 as re, a6 as ie, a7 as oe, i as te, q as ne, u as de, r as le, b as ue, z as Ce, t as Pe, x as ve, e as ge, c as ye, E as me, K as pe, O as Ie, L as Ae, R as De, g as Be, M as be, Q as xe, T as Se, V as ce, k as ze, h as Ee, X as He, _ as Ne, n as Te, l as Ke, Y as he, a0 as we, o as _e, a2 as Oe, p as Re, w as Me, s as fe, v as Ge, y as Le, S as Ue, U as ke, W as Fe, Z as Ve, $ as je, a1 as We } from "./pump-provider-3XH9JScg.js";
|
|
4
4
|
import "@kosdev-code/kos-ui-sdk";
|
|
5
5
|
import "react";
|
|
6
6
|
import "@emotion/react/jsx-runtime";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assembly-model.d.ts","sourceRoot":"","sources":["../../../../../../../packages/sdk/kos-dispense-sdk/src/models/models/assembly/assembly-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAEnB,MAAM,yBAAyB,CAAC;AAYjC,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG9D,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAK7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAMzC,eAAO,MAAM,UAAU,mBAAmB,CAAC;AAC3C,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AACrD,qBACa,iBAAiB,CAC5B,WAAW,SAAS,MAAM,GAAG,GAAG,EAChC,SAAS,SAAS,MAAM,GAAG,GAAG,CAC9B,YAAW,aAAa,CAAC,WAAW,CAAC,EAAE,eAAe;IAEtD,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,YAAY,CAAqB;
|
|
1
|
+
{"version":3,"file":"assembly-model.d.ts","sourceRoot":"","sources":["../../../../../../../packages/sdk/kos-dispense-sdk/src/models/models/assembly/assembly-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAEnB,MAAM,yBAAyB,CAAC;AAYjC,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG9D,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAK7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAMzC,eAAO,MAAM,UAAU,mBAAmB,CAAC;AAC3C,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AACrD,qBACa,iBAAiB,CAC5B,WAAW,SAAS,MAAM,GAAG,GAAG,EAChC,SAAS,SAAS,MAAM,GAAG,GAAG,CAC9B,YAAW,aAAa,CAAC,WAAW,CAAC,EAAE,eAAe;IAEtD,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,YAAY,CAAqB;IAIzC,OAAO,CAAC,gBAAgB,CAAyB;IAEvC,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,aAAa,CAAqB;IACpD,MAAM,EAAE,gBAAgB,CAAC;gBAEvB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,kBAAkB;IAS7B,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAI5C,IAAI,UAAU,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,CAEzC;IAED,IAAI,YAAY,IAAI,MAAM,EAAE,CAE3B;IAED,IAAI,WAAW,IAAI,MAAM,EAAE,CAE1B;IACD,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,EAAE;IAI1D,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,EAAE;IAIhE;;;;;OAKG;IACH,IAAI,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAEpD;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,EAAE,CAExB;IAED,IAAI,MAAM,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAE9B;IAIK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,KAAK;IAIL,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAyE/C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"holder-model.d.ts","sourceRoot":"","sources":["../../../../../../../packages/sdk/kos-dispense-sdk/src/models/models/holder/holder-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,wBAAwB,EAGzB,MAAM,yBAAyB,CAAC;AAkCjC,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAM1D,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;
|
|
1
|
+
{"version":3,"file":"holder-model.d.ts","sourceRoot":"","sources":["../../../../../../../packages/sdk/kos-dispense-sdk/src/models/models/holder/holder-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,wBAAwB,EAGzB,MAAM,yBAAyB,CAAC;AAkCjC,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAM1D,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AA4ZD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA+EK;AACL,eAAO,MAAM,MAAM,EAAE,QAAQ,CAC3B,wBAAwB,CAAC,WAAW,EAAE,aAAa,CAAC,CAWrD,CAAC"}
|
|
@@ -160,4 +160,11 @@ export interface HolderModel<AdditionalData extends object = any>
|
|
|
160
160
|
* Indicate that the lines associated with holder have been replaced.
|
|
161
161
|
*/
|
|
162
162
|
replaceLine(): Promise<void>;
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Indicates that one or more of the pumps associated with the holder have constraints that
|
|
166
|
+
* must be satisfied before pouring can occur. For example, an ingredient may require agitation
|
|
167
|
+
* before pouring can occur. This is used to defer the pour until the constraints are satisfied.
|
|
168
|
+
*/
|
|
169
|
+
shouldDefer: boolean;
|
|
163
170
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nozzle-model.d.ts","sourceRoot":"","sources":["../../../../../../../packages/sdk/kos-dispense-sdk/src/models/models/nozzle/nozzle-model.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"nozzle-model.d.ts","sourceRoot":"","sources":["../../../../../../../packages/sdk/kos-dispense-sdk/src/models/models/nozzle/nozzle-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ export declare const api: {
|
|
|
9
9
|
tracker?: string | undefined;
|
|
10
10
|
destinationAddress?: string | undefined;
|
|
11
11
|
bridge?: boolean | undefined;
|
|
12
|
+
headers?: Record<string, string> | undefined;
|
|
12
13
|
timeout?: number | undefined;
|
|
13
14
|
fos?: boolean | undefined;
|
|
14
15
|
studio?: boolean | undefined;
|
|
@@ -25,6 +26,7 @@ export declare const api: {
|
|
|
25
26
|
tracker?: string | undefined;
|
|
26
27
|
destinationAddress?: string | undefined;
|
|
27
28
|
bridge?: boolean | undefined;
|
|
29
|
+
headers?: Record<string, string> | undefined;
|
|
28
30
|
timeout?: number | undefined;
|
|
29
31
|
fos?: boolean | undefined;
|
|
30
32
|
studio?: boolean | undefined;
|
|
@@ -41,6 +43,7 @@ export declare const api: {
|
|
|
41
43
|
tracker?: string | undefined;
|
|
42
44
|
destinationAddress?: string | undefined;
|
|
43
45
|
bridge?: boolean | undefined;
|
|
46
|
+
headers?: Record<string, string> | undefined;
|
|
44
47
|
timeout?: number | undefined;
|
|
45
48
|
fos?: boolean | undefined;
|
|
46
49
|
studio?: boolean | undefined;
|
|
@@ -53,6 +56,7 @@ export declare const api: {
|
|
|
53
56
|
tracker?: string | undefined;
|
|
54
57
|
destinationAddress?: string | undefined;
|
|
55
58
|
bridge?: boolean | undefined;
|
|
59
|
+
headers?: Record<string, string> | undefined;
|
|
56
60
|
timeout?: number | undefined;
|
|
57
61
|
fos?: boolean | undefined;
|
|
58
62
|
studio?: boolean | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../../../packages/sdk/kos-dispense-sdk/src/models/utils/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,eAAO,MAAM,GAAG
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../../../packages/sdk/kos-dispense-sdk/src/models/utils/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAwB,CAAC;AAEzC,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;AAE/E,MAAM,MAAM,UAAU,GAAG,YAAY,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC"}
|
package/models.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./dispense-registration-manager-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./dispense-registration-manager-CcV-anPv.cjs"),n=require("./extension-utils-BMU452cN.cjs");require("@kosdev-code/kos-ui-sdk");require("react");exports.Assembly=e.Assembly;exports.Availability=e.Availability;exports.Board=e.Board;exports.BoardContainer=e.BoardContainer;Object.defineProperty(exports,"BoardContainerModel",{enumerable:!0,get:()=>e.BoardContainerModel});exports.DeviceAssembly=e.DeviceAssembly;exports.DispenseModelType=e.DispenseModelType;exports.ExtensionType=e.ExtensionType;exports.Holder=e.Holder;exports.HolderContainer=e.HolderContainer;exports.Ingredient=e.Ingredient;exports.IngredientContainer=e.IngredientContainer;exports.KosModelRegistry=e.KosModelRegistry;exports.Nozzle=e.Nozzle;exports.PourState=e.PourState;exports.Pump=e.Pump;exports.PumpContainer=e.PumpContainer;exports.PumpIndex=e.PumpIndex;exports.TOPIC_BOARD_LINKED=e.TOPIC_BOARD_LINKED;exports.TOPIC_BOARD_UNLINKED=e.TOPIC_BOARD_UNLINKED;exports.kosModels=e.kosModels;exports.registerDispenseModels=e.registerDispenseModels;exports.AssemblyServices=n.index;exports.AssemblyTypes=n.assembly;exports.DispenseExtensionManager=n.DispenseExtensionManager;exports.HolderServices=n.index$1;exports.IngredientServices=n.index$2;exports.KosExtensionManager=n.KosExtensionManager;exports.NozzleServices=n.index$3;exports.PumpServices=n.index$4;exports.getFuelGaugeValue=n.getFuelGaugeValue;
|
|
2
2
|
//# sourceMappingURL=models.cjs.map
|
package/models.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { A as o, a as i, d as n, c as t, B as l, e as d, D as p, E as m, H as g, f as D, I as y, g as I, K as c, N as u, j as A, P, h as b, i as v, T as C, b as M, k as x, r as B } from "./dispense-registration-manager-
|
|
2
|
-
import { i as K, e as N, D as S, a as T, b as z, K as H, c as O, d as _, g as f } from "./extension-utils-
|
|
1
|
+
import { A as o, a as i, d as n, c as t, B as l, e as d, D as p, E as m, H as g, f as D, I as y, g as I, K as c, N as u, j as A, P, h as b, i as v, T as C, b as M, k as x, r as B } from "./dispense-registration-manager-BtVe7yFS.js";
|
|
2
|
+
import { i as K, e as N, D as S, a as T, b as z, K as H, c as O, d as _, g as f } from "./extension-utils-CMoNCoHG.js";
|
|
3
3
|
import "@kosdev-code/kos-ui-sdk";
|
|
4
4
|
import "react";
|
|
5
5
|
export {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kosdev-code/kos-dispense-sdk",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.9",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"types": "./index.d.ts",
|
|
6
6
|
"main": "./index.js",
|
|
@@ -23,14 +23,14 @@
|
|
|
23
23
|
"./package.json": "./package.json"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@kosdev-code/kos-ui-sdk": "~2.0.
|
|
26
|
+
"@kosdev-code/kos-ui-sdk": "~2.0.9"
|
|
27
27
|
},
|
|
28
28
|
"publishConfig": {
|
|
29
29
|
"registry": "https://registry.npmjs.org/"
|
|
30
30
|
},
|
|
31
31
|
"kos": {
|
|
32
32
|
"build": {
|
|
33
|
-
"gitHash": "
|
|
33
|
+
"gitHash": "cbb87acaa58797d3617dd4e1a85f6c601c3e72cd"
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
}
|
|
@@ -4,7 +4,7 @@ var Y = (e, t, s) => (Ve(e, typeof t != "symbol" ? t + "" : t, s), s);
|
|
|
4
4
|
import { jsx as d } from "@emotion/react/jsx-runtime";
|
|
5
5
|
import { useKosModel as x, getKosCompanionModel as se, kosAutoEffect as je, KosLog as T, usePressGesture as me, EventBus as C, TimerManager as he } from "@kosdev-code/kos-ui-sdk";
|
|
6
6
|
import Fe, { createContext as k, useMemo as g, useContext as $, useState as I, useCallback as a, useEffect as G } from "react";
|
|
7
|
-
import { A as oe, a as ne, d as We, c as ae, N as qe, e as ie, H as Je, f as ce, I as ue, g as de, P as le } from "./dispense-registration-manager-
|
|
7
|
+
import { A as oe, a as ne, d as We, c as ae, N as qe, e as ie, H as Je, f as ce, I as ue, g as de, P as le } from "./dispense-registration-manager-BtVe7yFS.js";
|
|
8
8
|
const be = () => {
|
|
9
9
|
const e = oe.type;
|
|
10
10
|
return x({
|
|
@@ -1013,4 +1013,4 @@ export {
|
|
|
1013
1013
|
wt as y,
|
|
1014
1014
|
Xe as z
|
|
1015
1015
|
};
|
|
1016
|
-
//# sourceMappingURL=pump-provider-
|
|
1016
|
+
//# sourceMappingURL=pump-provider-3XH9JScg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pump-provider-3XH9JScg.js","sources":["../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/assembly/use-assembly.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/assembly/with-assembly.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/availability/use-availability.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/availability/with-availability.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/board/use-board.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/board/with-board.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/board-container/use-board-container.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/board-container/with-board-container.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/nozzle/use-nozzle.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/contexts/nozzle/nozzle-provider.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/cui-kit/use-beverages.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/cui-kit/use-brands.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/utils/pour-strategy/hold-to-pour-strategy.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/nozzle-pour/use-nozzle-pour.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/cui-kit/use-flavors.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/cui-kit/use-cui-kit.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/cui-kit/use-ambient-attract-timers.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/cui-kit/use-dispense-lifecycle.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/cui-kit/use-dispense-timers.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/cui-kit/use-default-cui-kit-lifecycle.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/device-assembly/use-device-assembly.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/device-assembly/with-device-assembly.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/holder/use-holder.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/holder/with-holder.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/holder-container/use-holder-container.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/holder-container/with-holder-container.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/ingredient/use-ingredient.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/utils/pour-strategy/hold-to-pour-intent-strategy.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/ingredient/use-ingredient-pour.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/ingredient/with-ingredient.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/ingredient-container/use-ingredient-container.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/ingredient-container/with-ingredient-container.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/nozzle/with-nozzle.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/utils/pour-strategy/tap-or-hold-to-pour-intent-strategy.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/utils/pour-strategy/tap-to-pour-intent-strategy.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/utils/pour-strategy/tap-to-pour-strategy.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/contexts/assembly/assembly-provider.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/contexts/availability/availability-provider.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/contexts/board/board-provider.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/contexts/board-container/board-container-provider.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/contexts/device-assembly/device-assembly-provider.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/contexts/cui-kit/cui-kit.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/contexts/holder/holder-provider.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/contexts/holder-container/holder-container-provider.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/contexts/ingredient/ingredient-provider.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/contexts/ingredient-container/ingredient-container-provider.tsx","../../../../packages/sdk/kos-dispense-sdk/src/ui/hooks/pump/use-pump.ts","../../../../packages/sdk/kos-dispense-sdk/src/ui/contexts/pump/pump-provider.tsx"],"sourcesContent":["import { useKosModel } from \"@kosdev-code/kos-ui-sdk\";\nimport { Assembly, type AssemblyModel } from \"../../../models\";\n\nexport const useAssembly = () => {\n const modelId = Assembly.type;\n const result = useKosModel<AssemblyModel>({\n modelId,\n modelType: Assembly.type,\n options: {},\n });\n\n return result;\n};\n","import type { AssemblyModel } from \"../../../models\";\nimport { useAssembly } from \"./use-assembly\";\n\ninterface AssemblyProps {\n assembly: AssemblyModel;\n}\n// react HOC to provide a Assembly to a component\nexport function withAssembly<T extends AssemblyProps = AssemblyProps>(\n WrappedComponent: React.ComponentType<T>\n) {\n return (props: Omit<T, keyof AssemblyProps>) => {\n const { model, status, KosModelLoader } = useAssembly();\n\n return (\n <KosModelLoader {...status}>\n <WrappedComponent {...(props as T)} assembly={model} />\n </KosModelLoader>\n );\n };\n}\n","import { useKosModel } from \"@kosdev-code/kos-ui-sdk\";\nimport { Availability, type AvailabilityModel } from \"../../../models\";\n\nexport const useAvailability = () => {\n const modelId = Availability.type;\n const result = useKosModel<AvailabilityModel>({\n modelId,\n modelType: Availability.type,\n options: {},\n });\n\n return result;\n};\n","import type { AvailabilityModel } from \"../../../models\";\nimport { useAvailability } from \"./use-availability\";\n\ninterface AvailabilityProps {\n beverage: AvailabilityModel;\n}\n// react HOC to provide a Beverage to a component\nexport function withBeverage<T extends AvailabilityProps = AvailabilityProps>(\n WrappedComponent: React.ComponentType<T>\n) {\n return (props: Omit<T, keyof AvailabilityProps>) => {\n const { model, status, KosModelLoader } = useAvailability();\n\n return (\n <KosModelLoader {...status}>\n <WrappedComponent {...(props as T)} beverage={model} />\n </KosModelLoader>\n );\n };\n}\n","import { useKosModel } from \"@kosdev-code/kos-ui-sdk\";\nimport { Board, type BoardModel } from \"../../../models\";\n\nexport const useBoard = (id: string) => {\n const modelId = id;\n const result = useKosModel<BoardModel>({\n modelId,\n modelType: Board.type,\n options: {},\n });\n\n return result;\n};\n","import type { BoardModel } from \"../../../models\";\nimport { useBoard } from \"./use-board\";\n\ninterface BoardProps {\n board: BoardModel;\n}\n// react HOC to provide a Board to a component\nexport function withBoard<T extends BoardProps = BoardProps>(\n WrappedComponent: React.ComponentType<T>\n) {\n return (id: string) => (props: Omit<T, keyof BoardProps>) => {\n const { model, status, KosModelLoader } = useBoard(id);\n\n return (\n <KosModelLoader {...status}>\n <WrappedComponent {...(props as T)} board={model} />\n </KosModelLoader>\n );\n };\n}\n","import { useKosModel } from \"@kosdev-code/kos-ui-sdk\";\nimport { BoardContainer, type BoardContainerModel } from \"../../../models\";\n\nexport const useBoardContainer = () => {\n const modelId = BoardContainer.type;\n const result = useKosModel<BoardContainerModel>({\n modelId,\n modelType: BoardContainer.type,\n options: {},\n });\n\n return result;\n};\n","import type { BoardContainerModel } from \"../../../models\";\nimport { useBoardContainer } from \"./use-board-container\";\n\ninterface BoardContainerProps {\n boardContainer: BoardContainerModel;\n}\n// react HOC to provide a BoardContainer to a component\nexport function withBoardContainer<\n T extends BoardContainerProps = BoardContainerProps\n>(WrappedComponent: React.ComponentType<T>) {\n return (props: Omit<T, keyof BoardContainerProps>) => {\n const { model, status, KosModelLoader } = useBoardContainer();\n\n return (\n <KosModelLoader {...status}>\n <WrappedComponent {...(props as T)} boardContainer={model} />\n </KosModelLoader>\n );\n };\n}\n","import { useKosModel } from \"@kosdev-code/kos-ui-sdk\";\nimport { Nozzle, type NozzleModel } from \"../../../models\";\n\nexport const useNozzle = (path: string) => {\n const modelId = path;\n const result = useKosModel<NozzleModel>({\n modelId,\n modelType: Nozzle.type,\n options: {\n path,\n },\n });\n\n return result;\n};\n","import { PropsWithChildren, createContext, useContext, useMemo } from \"react\";\nimport { NozzleModel } from \"../../../models\";\nimport { useNozzle } from \"../../hooks/nozzle/use-nozzle\";\n\ninterface NozzleType {\n model?: NozzleModel;\n}\nconst Nozzle = createContext<NozzleType | undefined>(undefined);\n\ninterface NozzleProviderProps {\n path: string;\n}\n\nexport const NozzleProvider: React.FunctionComponent<\n PropsWithChildren<NozzleProviderProps>\n> = ({ children, path }) => {\n const { model, ready } = useNozzle(path);\n const value: NozzleType = useMemo(() => {\n if (ready && model) {\n return { model };\n }\n return {};\n }, [ready, model]);\n return <Nozzle.Provider value={value}>{children}</Nozzle.Provider>;\n};\nexport const useNozzleContext = () => {\n const context = useContext(Nozzle);\n if (!context) {\n throw new Error(\"useNozzleContext must be used within a NozzleProvider\");\n }\n return context;\n};\n","import {\n getKosCompanionModel,\n kosAutoEffect,\n type IKosDataModel,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { AvailabilityModel } from \"../../../models\";\nimport { useNozzleContext } from \"../../contexts/nozzle/nozzle-provider\";\n\ninterface Props {\n onBeverageSelected?: (brand: AvailabilityModel) => void;\n onClearBeverage?: () => void;\n companionType?: string;\n}\nexport const useBeverages = <\n B extends Record<string, any> = any,\n C extends IKosDataModel = IKosDataModel\n>({\n onBeverageSelected,\n onClearBeverage,\n companionType,\n}: Props) => {\n const { model: nozzle } = useNozzleContext();\n const [beverages, setBeverages] = useState<AvailabilityModel<B>[]>([]);\n const [selectedBeverage, setSelectedBeverage] =\n useState<AvailabilityModel<B> | null>(null);\n\n const companions = useMemo(() => {\n if (!companionType) return [];\n return beverages.map((brand) =>\n getKosCompanionModel<C>(brand, companionType)\n );\n }, [beverages, companionType]);\n const selectBeverage = useCallback(\n async (beverage: AvailabilityModel) => {\n setSelectedBeverage(beverage);\n await nozzle?.setSelectedPourable({ beverage });\n onBeverageSelected?.(beverage);\n },\n [nozzle, onBeverageSelected]\n );\n\n const clearBeverage = useCallback(async () => {\n setSelectedBeverage(null);\n await nozzle?.setSelectedPourable({ beverage: undefined });\n onClearBeverage?.();\n }, [nozzle, onClearBeverage]);\n useEffect(() => {\n const disposer = kosAutoEffect(() => {\n if (!nozzle) return;\n const selectedBrand = nozzle.selectedBrand;\n if (!selectedBrand) {\n const allBeverages = nozzle\n .getGroupAvailabilityItems<B>(\"beverages\")\n .filter((beverage) => beverage.visible);\n setBeverages(allBeverages ?? []);\n return;\n }\n const beverages = nozzle\n .getAvailabilityByParent<B>(selectedBrand.id)\n .filter((b) => b.visible);\n setBeverages(beverages ?? []);\n });\n return () => {\n disposer();\n };\n }, [nozzle]);\n return {\n beverages,\n beverageCompanions: companions,\n selectBeverage,\n selectedBeverage,\n clearBeverage,\n };\n};\n","import {\n getKosCompanionModel,\n type IKosDataModel,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport type { AvailabilityModel } from \"../../../models\";\nimport { useNozzleContext } from \"../../contexts/nozzle/nozzle-provider\";\n\ninterface Props {\n onBrandSelected?: (brand: AvailabilityModel) => void;\n onBrandCleared?: () => void;\n companionType?: string;\n}\nexport const useBrands = <\n B extends Record<string, any> = any,\n C extends IKosDataModel = IKosDataModel\n>({\n onBrandSelected,\n onBrandCleared,\n companionType,\n}: Props) => {\n const { model: nozzle } = useNozzleContext();\n const [selectedBrand, setSelectedBrand] =\n useState<AvailabilityModel<B> | null>(null);\n const brands = useMemo(\n () =>\n nozzle?.getGroupAvailabilityItems(\"brands\").filter((b) => b.visible) ??\n [],\n [nozzle]\n );\n\n const companions = useMemo(() => {\n if (!companionType) return [];\n return brands.map((brand) => getKosCompanionModel<C>(brand, companionType));\n }, [brands, companionType]);\n\n const selectBrand = useCallback(\n async (brand: AvailabilityModel<B>) => {\n setSelectedBrand(brand);\n nozzle?.setSelectedBrand(brand);\n onBrandSelected?.(brand);\n },\n [nozzle, onBrandSelected]\n );\n\n const clearBrand = useCallback(() => {\n setSelectedBrand(null);\n nozzle?.setSelectedBrand(undefined);\n onBrandCleared?.();\n }, [nozzle, onBrandCleared]);\n\n return {\n brands,\n brandCompanions: companions,\n selectedBrand,\n selectBrand,\n clearBrand,\n };\n};\n","import { KosLog } from \"@kosdev-code/kos-ui-sdk\";\nimport type { NozzleModel } from \"../../../../models\";\nimport type { PourStrategy } from \"./pour-strategy\";\n\nconst logger = KosLog.createLogger({\n name: \"HoldToPourStrategy\",\n group: \"kos-hooks\",\n});\nexport const HoldToPourStrategy: PourStrategy = {\n name: \"HoldToPourStrategy\",\n initiate(nozzle?: NozzleModel): void {\n if (!nozzle?.canPour) {\n logger.debug(`Nozzle ${nozzle?.id} cannot pour. Returning early.`);\n return;\n }\n nozzle?.pour();\n },\n\n initiateEnded(nozzle?: NozzleModel): void {\n nozzle?.cancelPour();\n },\n};\n","import { useCallback } from \"react\";\n\nimport { KosLog, usePressGesture } from \"@kosdev-code/kos-ui-sdk\";\nimport type { ReactDOMAttributes } from \"@use-gesture/react/dist/declarations/src/types\";\nimport type { PourState } from \"../../../models/models/types/pouring\";\nimport { useNozzleContext } from \"../../contexts/nozzle\";\nimport { HoldToPourStrategy } from \"../utils/pour-strategy/hold-to-pour-strategy\";\nimport type { PourStrategy } from \"../utils/pour-strategy/pour-strategy\";\n\ninterface NozzlePourProps {\n onPour?: () => void;\n onPourCancel?: () => void;\n strategy?: PourStrategy;\n}\n\nexport interface NozzlePourResponse {\n handlers: (...args: any[]) => ReactDOMAttributes;\n cancel: () => void;\n\n status?: {\n canPour: boolean;\n isPouring: boolean;\n currentState: PourState;\n };\n}\n\nconst logger = KosLog.createLogger({\n name: \"useNozzlePour\",\n group: \"kos-hooks\",\n});\n/**\n * Hook that encapsulates the logic for handling nozzle pouring.\n *\n * The hook will return a number of gesture handlers that can be spread onto a DOM element.\n * The hook will automatically detects if touch or mouse events are used.\n *\n *\n * @param onPour - callback initiated after pouring starts\n * @param onPourCancel - callback initiated after pouring is cancelled\n * @returns handlers - gesture handlers for nozzle pouring\n *\n *\n * @example\n * const { handlers } = useNozzlePour({\n * onPour: () => {\n * console.log(\"Pouring started\");\n * },\n * onPourCancel: () => {\n * console.log(\"Pouring cancelled\");\n * },\n * });\n *\n * <div {...handlers()} />\n *\n *\n * @see {@link NozzleModel.pour}\n * @see {@link NozzleModel.cancelPour}\n * @see {@link usePressGesture}\n **/\nexport const useNozzlePour = ({\n onPour,\n onPourCancel,\n strategy = HoldToPourStrategy,\n}: NozzlePourProps): NozzlePourResponse => {\n const { model: nozzle } = useNozzleContext();\n\n const handlePour = useCallback(() => {\n logger.debug(\n `[${strategy?.name}] - Pour initiated for nozzle ${nozzle?.id}.`\n );\n strategy?.initiate(nozzle);\n onPour?.();\n }, [onPour, nozzle, strategy]);\n\n const handleCancelPour = useCallback(() => {\n logger.debug(\n `[${strategy?.name}] - Pour initiate ended called for nozzle ${nozzle?.id}.`\n );\n strategy?.initiateEnded?.(nozzle);\n onPourCancel?.();\n }, [onPourCancel, nozzle, strategy]);\n\n const forceCancelPour = useCallback(() => {\n logger.debug(`Force cancelling pour for nozzle ${nozzle?.id}.`);\n nozzle?.cancelPour();\n onPourCancel?.();\n }, [onPourCancel, nozzle]);\n\n const handlers = usePressGesture({\n onPressed: handlePour,\n onRelease: handleCancelPour,\n });\n\n return {\n handlers: handlers.dom,\n cancel: forceCancelPour,\n status: nozzle,\n };\n};\n","import {\n getKosCompanionModel,\n type IKosDataModel,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport type { AvailabilityModel } from \"../../../models\";\nimport { useNozzleContext } from \"../../contexts/nozzle/nozzle-provider\";\ninterface Props {\n onFlavorSelected?: (\n flavor: AvailabilityModel,\n flavors: AvailabilityModel[]\n ) => void;\n onFlavorCleared?: () => void;\n companionType?: string;\n}\nexport const useFlavors = <\n F extends Record<string, any> = any,\n C extends IKosDataModel = IKosDataModel\n>({\n onFlavorSelected,\n onFlavorCleared,\n companionType,\n}: Props) => {\n const { model: nozzle } = useNozzleContext();\n const flavors = useMemo(\n () =>\n nozzle\n ?.getGroupAvailabilityItems<F>(\"flavors\")\n .filter((f) => f.visible) ?? [],\n [nozzle]\n );\n\n const companions = useMemo(() => {\n if (!companionType) return [];\n return flavors.map((flavor) =>\n getKosCompanionModel<C>(flavor, companionType)\n );\n }, [flavors, companionType]);\n const [selectedFlavors, setSelectedFlavors] = useState<\n AvailabilityModel[] | null\n >([]);\n\n const selectFlavor = useCallback(\n async (flavor: AvailabilityModel) => {\n setSelectedFlavors((previous) =>\n previous?.includes(flavor)\n ? [...previous.filter((p) => p !== flavor)]\n : [...(previous ?? []), flavor]\n );\n\n if (nozzle?.selectedPourable) {\n const { beverage } = nozzle.selectedPourable;\n await nozzle.setSelectedPourable({\n beverage,\n additional: selectedFlavors ?? [],\n });\n }\n onFlavorSelected?.(flavor, selectedFlavors ?? []);\n },\n [nozzle, onFlavorSelected, selectedFlavors]\n );\n\n const clear = useCallback(async () => {\n setSelectedFlavors([]);\n if (nozzle?.selectedPourable) {\n const { beverage } = nozzle.selectedPourable;\n nozzle.setSelectedPourable({ beverage });\n onFlavorCleared?.();\n }\n }, [nozzle, onFlavorCleared]);\n return {\n flavors,\n flavorCompanions: companions,\n selectFlavor,\n selectedFlavors,\n clearFlavors: clear,\n };\n};\n","import type { IKosDataModel } from \"@kosdev-code/kos-ui-sdk\";\nimport { EventBus } from \"@kosdev-code/kos-ui-sdk\";\nimport { useCallback, useState } from \"react\";\nimport type { AvailabilityModel } from \"../../../models\";\nimport { useNozzleContext } from \"../../contexts/nozzle/nozzle-provider\";\nimport { useNozzlePour } from \"../nozzle-pour/use-nozzle-pour\";\nimport { useBeverages } from \"./use-beverages\";\nimport { useBrands } from \"./use-brands\";\nimport { useFlavors } from \"./use-flavors\";\nexport const DISPENSE_GROUP_BRAND = \"brands\";\nexport const DISPENSE_GROUP_BEVERAGE = \"beverages\";\nexport const DISPENSE_GROUP_FLAVOR = \"flavors\";\n\ntype InitialGroup =\n | typeof DISPENSE_GROUP_BRAND\n | typeof DISPENSE_GROUP_BEVERAGE;\nexport interface UseCuiKitProps {\n /**\n * The initial group to display when the cui kit is first rendered.\n * The default is to start at the list of brands however for simpler cases\n * it may be desirable to start at the list of beverages.\n */\n initialGroup?: InitialGroup;\n\n /**\n * Options to configure the behavior of the cui kit.\n */\n options?: {\n /**\n * The companion types to associate with the brand, beverage, and flavor models. This\n * is useful when companion models have been created to represent the brand, beverage, and flavor\n * models rather than merely augmenting the AvailabilityModel data.\n */\n companionTypes?: {\n /**\n * The model type of the brand companion.\n */\n brand?: string;\n /**\n * The model type of the beverage companion.\n */\n beverage?: string;\n /**\n * The model type of the flavor companion.\n */\n flavor?: string;\n };\n };\n}\n\ninterface DispenseGroupType<\n AdditionalData extends Record<string, any> = any,\n Companion extends IKosDataModel = IKosDataModel\n> {\n /**\n * The list of AvailabilityModels to display in the group.\n */\n models: AvailabilityModel<AdditionalData>[];\n\n /**\n * The list of companion models that are associated with the models in the group.\n *\n * If no companion model types are provided in the options, this list will be empty.\n */\n companions?: Companion[];\n\n /**\n * Clear the current selection in the group. This will reset the group to its initial state.\n */\n clear: VoidFunction;\n\n /**\n * The event handlers for the group. These handlers will be called when a model in the group is selected.\n */\n handlers: {\n /**\n * The handler to call when a model in the group is selected.\n */\n onSelected: (model: AvailabilityModel<AdditionalData>) => void;\n };\n}\nexport interface CuiKitType<\n BrandData extends Record<string, any> = any,\n BeverageData extends Record<string, any> = any,\n FlavorData extends Record<string, any> = any,\n BrandCompanion extends IKosDataModel = IKosDataModel,\n BeverageCompanion extends IKosDataModel = IKosDataModel,\n FlavorCompanion extends IKosDataModel = IKosDataModel\n> {\n /**\n * The navigation state of the cui kit.\n */\n nav: {\n /**\n * The current group that is being displayed.\n */\n currentGroup: string;\n\n /**\n * The handler to navigate back to the previous group.\n */\n back: VoidFunction;\n\n /**\n * The handler to navigate to the initial group as defined in the options.\n */\n home: VoidFunction;\n };\n\n /**\n * Provides functions and status related to the pour operation.\n */\n pour: ReturnType<typeof useNozzlePour>;\n\n /**\n * The current selections of the cui kit.\n */\n selections: {\n /**\n * The selected brand model.\n */\n [DISPENSE_GROUP_BRAND]: AvailabilityModel<BrandData> | null;\n\n /**\n * The selected beverage model.\n */\n [DISPENSE_GROUP_BEVERAGE]: AvailabilityModel<BeverageData> | null;\n\n /**\n * The selected flavor models.\n */\n [DISPENSE_GROUP_FLAVOR]: AvailabilityModel<FlavorData>[] | null;\n };\n\n /**\n * The brands modules provides the state and handlers required to manage the set of brands for the dispenser:\n *\n * @property {AvailabilityModel<BrandData>[]} models - The list of brands for the dispenser.\n *\n * The models will be instances of AvailabilityModel<BrandData> with any data mappings already\n * applied to the data property on the model.\n *\n * Since these are KOS models, any changes to the model state will be automatically reflected in any components consuming them.\n *\n * @property {BrandCompanion[]} companions - In more advanced cases, the KOS framework allows you to define additional models\n * that will get created alongside the brand AvailabilityModels instances.\n * Using these companions as a form of extension, this field will return the corresponding set of companion models that\n * represent your custom brands.\n \n * @property {Object} handlers - Contains handler methods.\n * @property {Function} handlers.onSelected - When a user selects a brand, this handler can be called with the selected AvailabilityModel\n * to ensure that the CUI Kit state is kept up to date.\n *\n * @property {Function} clear - Calling this function will clear the selected brand and beverage in the CUI Kit. This updates the state both locally\n * and in the backend by clearing the selection in the Dispense SDK NozzleModel.\n */\n [DISPENSE_GROUP_BRAND]: DispenseGroupType<BrandData, BrandCompanion>;\n /**\n * The beverages modules provides the state and handlers required to manage the set of beverages for the current brand selection:\n *\n * @property {AvailabilityModel<BeverageData>[]} models - The list of beverages for the current brand selection. As the user selects brands\n * in the UI then this list of beverages will be updated to reflect new selection. If there are no brands\n * defined in the brandset then this will always return the full list of beverages.\n *\n * The models will be instances of AvailabilityModel<T> with any data mappings (shown in the next section) already\n * applied to the data property on the model.\n *\n * Since these are KOS models, any changes to the model state will be automatically reflected in any components consuming them.\n *\n * @property {BeverageCompanion[]} companions - In more advanced cases, the KOS framework allows you to define additional models\n * that will get created alongside the “beverage” AvailabilityModels instances.\n *\n * This is useful in cases where new functionality beyond what is exposed in the AvailabilityModel is required. For\n * example, if in your application, you need Beverages to be able to fetch nutritional information on selection then\n * you could create a companion model that will get created for each AvailabilityModel and expose the methods and\n * data to retrieve this information.\n *\n * Using these companions as a form of extension, this field will return the corresponding set of companion models that\n * represent your custom beverages.\n \n * @property {Object} handlers - Contains handler methods.\n * @property {Function} handlers.onSelected - When a user selects a beverage, this handler can be called with the selected AvailabilityModel\n * to ensure that the CUI Kit state is kept up to date.\n *\n * @property {Function} clear - Calling this function will clear the selected beverage in the CUI Kit. This updates the state both locally\n * and in the backend by clearing the selection in the Dispense SDK NozzleModel.\n */\n [DISPENSE_GROUP_BEVERAGE]: DispenseGroupType<BeverageData, BeverageCompanion>;\n\n /**\n * The group of flavors to display. This list will be filtered\n * based on previous selections and the relationships of the models in the graph.\n * For example, if a beverage has been selected, this will return the list of flavors that\n * are associated with the selected beverage. Otherwise, it will return the list of all flavors.\n */\n [DISPENSE_GROUP_FLAVOR]: DispenseGroupType<FlavorData, FlavorCompanion>;\n}\n\nexport const useCuiKit = <\n BrandData extends Record<string, any> = any,\n BeverageData extends Record<string, any> = any,\n FlavorData extends Record<string, any> = any,\n BrandCompanion extends IKosDataModel = IKosDataModel,\n BeverageCompanion extends IKosDataModel = IKosDataModel,\n FlavorCompanion extends IKosDataModel = IKosDataModel\n>({\n initialGroup = DISPENSE_GROUP_BRAND,\n options = {},\n}: UseCuiKitProps): CuiKitType<\n BrandData,\n BeverageData,\n FlavorData,\n BrandCompanion,\n BeverageCompanion,\n FlavorCompanion\n> => {\n const [currentGroup, setCurrentGroup] = useState<string>(initialGroup);\n const { model: nozzle } = useNozzleContext();\n\n const onBrandSelected = useCallback(\n (model: AvailabilityModel) => {\n setCurrentGroup(DISPENSE_GROUP_FLAVOR);\n const topic = `/kos/dispense/${nozzle?.path}/brand/selected/`;\n EventBus.publish(topic, model);\n },\n [nozzle?.path]\n );\n\n const onBrandCleared = useCallback(() => {\n const topic = `/kos/dispense/${nozzle?.path}/brand/cleared/`;\n EventBus.publish(topic, {});\n }, [nozzle?.path]);\n\n const onBeverageSelected = useCallback(\n (model: AvailabilityModel) => {\n setCurrentGroup(DISPENSE_GROUP_FLAVOR);\n const topic = `/kos/dispense/${nozzle?.path}/beverage/selected/`;\n EventBus.publish(topic, model);\n },\n [nozzle?.path]\n );\n\n const onBeverageCleared = useCallback(() => {\n const topic = `/kos/dispense/${nozzle?.path}/beverage/cleared/`;\n EventBus.publish(topic, {});\n }, [nozzle?.path]);\n\n const onFlavorSelected = useCallback(\n (model: AvailabilityModel) => {\n const topic = `/kos/dispense/${nozzle?.path}/flavor/selected/`;\n EventBus.publish(topic, model);\n },\n [nozzle?.path]\n );\n\n const onFlavorCleared = useCallback(() => {\n const topic = `/kos/dispense/${nozzle?.path}/flavor/cleared/`;\n EventBus.publish(topic, {});\n }, [nozzle?.path]);\n\n const onPour = useCallback(() => {\n const topic = `/kos/dispense/${nozzle?.path}/pour/`;\n EventBus.publish(topic, {});\n }, [nozzle?.path]);\n\n const onPourCancel = useCallback(() => {\n const topic = `/kos/dispense/${nozzle?.path}/pour/cancel/`;\n EventBus.publish(topic, {});\n }, [nozzle?.path]);\n const { brands, selectBrand, selectedBrand, clearBrand, brandCompanions } =\n useBrands<BrandData, BrandCompanion>({\n companionType: options.companionTypes?.brand,\n onBrandSelected: onBrandSelected,\n onBrandCleared: onBrandCleared,\n });\n const {\n beverages,\n selectBeverage,\n selectedBeverage,\n clearBeverage,\n beverageCompanions,\n } = useBeverages<BeverageData, BeverageCompanion>({\n companionType: options.companionTypes?.beverage,\n onBeverageSelected: onBeverageSelected,\n onClearBeverage: onBeverageCleared,\n });\n\n const {\n clearFlavors,\n flavors,\n selectFlavor,\n selectedFlavors,\n flavorCompanions,\n } = useFlavors<FlavorData, FlavorCompanion>({\n companionType: options.companionTypes?.flavor,\n onFlavorSelected: onFlavorSelected,\n onFlavorCleared: onFlavorCleared,\n });\n const pour = useNozzlePour({\n onPour: onPour,\n onPourCancel: onPourCancel,\n });\n\n const back = useCallback(() => {\n switch (currentGroup) {\n case DISPENSE_GROUP_BRAND:\n clearBeverage();\n clearBrand();\n break;\n case DISPENSE_GROUP_BEVERAGE:\n case DISPENSE_GROUP_FLAVOR:\n setCurrentGroup(initialGroup);\n clearBeverage();\n clearBrand();\n break;\n }\n }, [clearBeverage, clearBrand, currentGroup, initialGroup]);\n\n const home = useCallback(() => {\n setCurrentGroup(initialGroup);\n if (initialGroup === DISPENSE_GROUP_BRAND) {\n clearBeverage();\n clearBrand();\n }\n\n if (initialGroup === DISPENSE_GROUP_BEVERAGE) {\n clearBeverage();\n }\n }, [clearBeverage, clearBrand, initialGroup]);\n\n return {\n nav: {\n currentGroup,\n back,\n home,\n },\n\n pour,\n\n selections: {\n [DISPENSE_GROUP_BRAND]: selectedBrand,\n [DISPENSE_GROUP_BEVERAGE]: selectedBeverage,\n [DISPENSE_GROUP_FLAVOR]: selectedFlavors,\n },\n [DISPENSE_GROUP_BRAND]: {\n models: brands,\n companions: brandCompanions,\n clear: clearBrand,\n handlers: {\n onSelected: selectBrand,\n },\n },\n [DISPENSE_GROUP_BEVERAGE]: {\n models: beverages,\n companions: beverageCompanions,\n clear: clearBeverage,\n handlers: {\n onSelected: selectBeverage,\n },\n },\n [DISPENSE_GROUP_FLAVOR]: {\n models: flavors,\n companions: flavorCompanions,\n clear: clearFlavors,\n handlers: {\n onSelected: selectFlavor,\n },\n },\n };\n};\n","import { KosLog, TimerManager, type KosTimer } from \"@kosdev-code/kos-ui-sdk\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useNozzleContext } from \"../../contexts/nozzle/nozzle-provider\";\n\ninterface TimerProps {\n defaultAmbientTime?: number;\n defaultAttractTime?: number;\n onAttractTimer?: VoidFunction;\n onAmbientTimer?: VoidFunction;\n onResetAttractTimer?: VoidFunction;\n onResumeAttractTimer?: VoidFunction;\n}\n\nexport const useAmbientAttractTimers = (props: TimerProps) => {\n const { model: nozzle } = useNozzleContext();\n\n const [attractTimer, setAttractTimer] = useState<KosTimer | null>(null);\n const {\n onAmbientTimer,\n onAttractTimer,\n onResetAttractTimer,\n onResumeAttractTimer,\n defaultAttractTime,\n defaultAmbientTime,\n } = props;\n\n const handleAmbientTimer = useCallback(() => {\n if (onAmbientTimer) {\n KosLog.info(\"Ambient timer expired. Calling callback\");\n onAmbientTimer?.();\n }\n }, [onAmbientTimer]);\n\n const handleAttractTimer = useCallback(() => {\n if (onAttractTimer) {\n KosLog.info(\"Attract timer expired. Calling callback\");\n onAttractTimer?.();\n }\n }, [onAttractTimer]);\n\n const handleResetAttractTimer = useCallback(() => {\n if (attractTimer) {\n attractTimer.restart();\n onResetAttractTimer?.();\n }\n }, [attractTimer, onResetAttractTimer]);\n\n const handlePauseAttractTimer = useCallback(() => {\n if (attractTimer) {\n attractTimer.reset();\n onResetAttractTimer?.();\n }\n }, [attractTimer, onResetAttractTimer]);\n\n const handleResume = useCallback(() => {\n if (attractTimer) {\n attractTimer.pause();\n onResumeAttractTimer?.();\n }\n }, [attractTimer, onResumeAttractTimer]);\n\n useEffect(() => {\n if (nozzle && defaultAttractTime) {\n KosLog.info(\"Nozzle is available. Creating timers\");\n const timer = TimerManager.createTimer(\n \"attract-timer-\" + nozzle.path,\n defaultAttractTime\n );\n\n if (defaultAttractTime) {\n timer?.addTimeoutAction({\n name: \"attract-timer\",\n remainingTime: 0,\n action: handleAttractTimer,\n });\n }\n\n if (defaultAmbientTime) {\n timer?.addTimeoutAction({\n name: \"ambient-timer\",\n remainingTime: defaultAmbientTime,\n action: handleAmbientTimer,\n });\n }\n if (defaultAttractTime) {\n timer?.start();\n }\n setAttractTimer(timer ?? null);\n return () => {\n timer?.reset();\n setAttractTimer(null);\n };\n }\n return () => {\n KosLog.info(\"Nozzle is not available. No timers to clear\");\n };\n }, [\n defaultAmbientTime,\n defaultAttractTime,\n handleAmbientTimer,\n handleAttractTimer,\n nozzle,\n ]);\n return {\n attractTimer,\n restart: handleResetAttractTimer,\n pause: handlePauseAttractTimer,\n resume: handleResume,\n };\n};\n","import { EventBus } from \"@kosdev-code/kos-ui-sdk\";\nimport { useEffect } from \"react\";\nimport type { AvailabilityModel } from \"../../../models\";\nimport { useNozzleContext } from \"../../contexts/nozzle/nozzle-provider\";\n\ninterface Props<\n BrandData extends Record<string, any> = any,\n BeverageData extends Record<string, any> = any,\n FlavorData extends Record<string, any> = any\n> {\n onBrandSelected?: (brand: AvailabilityModel<BrandData>) => void;\n onBrandCleared?: () => void;\n onBeverageSelected?: (brand: AvailabilityModel<BeverageData>) => void;\n onBeverageCleared?: () => void;\n onFlavorSelected?: (brand: AvailabilityModel<FlavorData>) => void;\n onFlavorCleared?: () => void;\n onPour?: () => void;\n onPourCancel?: () => void;\n onAmbientTimer?: () => void;\n onAttractTimer?: () => void;\n onResumeAttractTimer?: () => void;\n onInit?: () => void;\n}\n\nconst subscribe = (topic: string, callback?: (args: any) => void) => {\n if (callback) {\n const result = EventBus.subscribe(topic, callback);\n return result.unsubscribe;\n }\n return undefined;\n};\nexport const useDispenseLifecycle = ({\n onInit,\n onBrandSelected,\n onBrandCleared,\n onBeverageCleared,\n onBeverageSelected,\n onFlavorCleared,\n onFlavorSelected,\n onPour,\n onPourCancel,\n onAmbientTimer,\n onAttractTimer,\n onResumeAttractTimer,\n}: Props) => {\n const { model: nozzle } = useNozzleContext();\n\n useEffect(() => {\n const topics = [\n {\n topic: `/kos/dispense/${nozzle?.path}/brand/selected/`,\n callback: onBrandSelected,\n },\n {\n topic: `/kos/dispense/${nozzle?.path}/brand/cleared/`,\n callback: onBrandCleared,\n },\n {\n topic: `/kos/dispense/${nozzle?.path}/beverage/selected/`,\n callback: onBeverageSelected,\n },\n {\n topic: `/kos/dispense/${nozzle?.path}/beverage/cleared/`,\n callback: onBeverageCleared,\n },\n {\n topic: `/kos/dispense/${nozzle?.path}/flavor/selected/`,\n callback: onFlavorSelected,\n },\n {\n topic: `/kos/dispense/${nozzle?.path}/flavor/cleared/`,\n callback: onFlavorCleared,\n },\n { topic: `/kos/dispense/${nozzle?.path}/pour/`, callback: onPour },\n {\n topic: `/kos/dispense/${nozzle?.path}/pour/cancel/`,\n callback: onPourCancel,\n },\n {\n topic: `/kos/dispense/${nozzle?.path}/ambient/start/`,\n callback: onAmbientTimer,\n },\n {\n topic: `/kos/dispense/${nozzle?.path}/attract/start/`,\n callback: onAttractTimer,\n },\n {\n topic: `/kos/dispense/${nozzle?.path}/attract/resume/`,\n callback: onResumeAttractTimer,\n },\n {\n topic: `/kos/dispense/${nozzle?.path}/init/`,\n callback: onInit,\n },\n ];\n\n const disposers = topics.map(({ topic, callback }) =>\n subscribe(topic, callback)\n );\n\n return () => {\n disposers.forEach((disposer) => disposer?.());\n };\n }, [\n nozzle?.path,\n onAmbientTimer,\n onAttractTimer,\n onBeverageCleared,\n onBeverageSelected,\n onBrandCleared,\n onBrandSelected,\n onFlavorCleared,\n onFlavorSelected,\n onPour,\n onPourCancel,\n onResumeAttractTimer,\n onInit,\n ]);\n};\n","import { KosLog, TimerManager, type KosTimer } from \"@kosdev-code/kos-ui-sdk\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useNozzleContext } from \"../../contexts/nozzle/nozzle-provider\";\n\ninterface TimerProps {\n defaultIdleTime?: number;\n defaultAreYouThereTime?: number;\n onIdleTimer?: VoidFunction;\n onAreYouThereTimer?: VoidFunction;\n onResetIdleTimer?: VoidFunction;\n prefix?: string;\n}\nexport const useCuiKitTimers = (props: TimerProps) => {\n const { model: nozzle } = useNozzleContext();\n const [idleTimer, setIdleTimer] = useState<KosTimer | null>(null);\n const {\n onAreYouThereTimer,\n onIdleTimer,\n onResetIdleTimer,\n defaultAreYouThereTime = 10,\n defaultIdleTime = 20,\n } = props;\n const handleAreYouThereTimer = useCallback(() => {\n if (onAreYouThereTimer) {\n KosLog.info(\"Are you there timer expired. Calling callback\");\n onAreYouThereTimer?.();\n }\n }, [onAreYouThereTimer]);\n\n const handleIdleTimer = useCallback(() => {\n if (onIdleTimer) {\n KosLog.info(\"Idle timer expired. Calling callback\");\n onIdleTimer?.();\n }\n }, [onIdleTimer]);\n\n const handleRestartIdleTimer = useCallback(() => {\n if (idleTimer) {\n idleTimer.restart();\n onResetIdleTimer?.();\n }\n }, [idleTimer, onResetIdleTimer]);\n\n const handlePauseIdleTimer = useCallback(() => {\n if (idleTimer) {\n idleTimer.reset();\n onResetIdleTimer?.();\n }\n }, [idleTimer, onResetIdleTimer]);\n useEffect(() => {\n if (nozzle) {\n KosLog.info(\"Nozzle is available. Creating timers\");\n const timer = TimerManager.createTimer(\n `${props.prefix ?? \"\"}idle-timer-${nozzle.path}`,\n defaultIdleTime\n );\n timer?.addTimeoutAction({\n name: \"idle-timer\",\n remainingTime: 0,\n action: handleIdleTimer,\n });\n\n timer?.addTimeoutAction({\n name: \"are-you-there-timer\",\n remainingTime: defaultAreYouThereTime,\n action: handleAreYouThereTimer,\n });\n setIdleTimer(timer ?? null);\n return () => {\n timer?.reset();\n setIdleTimer(null);\n };\n }\n return () => {\n KosLog.info(\"Nozzle is not available. No timers to clear\");\n };\n }, [\n defaultAreYouThereTime,\n defaultIdleTime,\n handleAreYouThereTimer,\n handleIdleTimer,\n nozzle,\n props.prefix,\n ]);\n return {\n idleTimer,\n restart: handleRestartIdleTimer,\n pause: handlePauseIdleTimer,\n };\n};\n","import { EventBus } from \"@kosdev-code/kos-ui-sdk\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useNozzleContext } from \"../../contexts/nozzle/nozzle-provider\";\nimport { useAmbientAttractTimers } from \"./use-ambient-attract-timers\";\nimport type { CuiKitType } from \"./use-cui-kit\";\nimport { useDispenseLifecycle } from \"./use-dispense-lifecycle\";\nimport { useCuiKitTimers } from \"./use-dispense-timers\";\n\ninterface TimerProps {\n /**\n * The idle timeout in seconds. This is the time in seconds that the screen will wait before\n * the current session is considered idle at which point the current selections will be cleared\n * and the screen will return to the home screen.\n */\n idleTimeout?: number;\n\n /**\n * This is the amount of time left in the idle timeout at which point the are you there screen will be shown.\n *\n * For example, if the idle timer was set to 60 seconds and the areYouThereTimeoutOffset was set to 10 seconds,\n * the are you there screen would be shown after 50 seconds of inactivity to provide an opportunity for the user\n * to indicate that they are still present.\n */\n areYouThereTimeoutOffset?: number;\n}\ninterface Props {\n /**\n * The CuiKit instance\n */\n kit?: CuiKitType | null;\n\n /**\n * The timer configuration for the inactivity timer\n */\n inactivity?: TimerProps;\n\n /**\n * An alternate timer configuration that is applied when a pour has been initiated\n * in the current session. This is useful when the idle timeout should be different\n * when a pour has been initiated.\n */\n pour?: TimerProps;\n /**\n * Screen configuration to control the visibility and timing of the attract and ambient screens.\n */\n screens?: {\n /**\n * The amount of time in seconds before the attract screen is shown.\n */\n attractTimeout?: number;\n\n /**\n * The amount of time in seconds measured as an offset from the attract timeout\n * that the ambient screen will be shown. For example, if the attract screen is to be\n * show after 300 seconds and the ambient timeout is set to 120 seconds, the ambient screen will appear\n * after 180 seconds and display for 120 seconds before the attract screen is shown.\n */\n ambientTimeoutOffset?: number;\n };\n}\n\ninterface LifecycleData {\n /**\n * Flag to indicate if the are you there timoute screen should be shown\n * @type {boolean}\n */\n showAreYouThere: boolean;\n\n /**\n * Callback that when invoked will reset the are you there timer and hide the screen\n * @returns\n */\n clearAreYouThere: () => void;\n\n /**\n * The countdown value for the are you there screen. This value is used to display the countdown.\n * If a pour has been initiated at any point in the current session, the countdown value will be based\n * on the pour idleTimeout and pour areYouThereTimeoutOffset value. Otherwise it will be based on the\n * inactivity idleTimeout and areYouThereTimeoutOffset values.\n * @type {number}\n *\n */\n areYouThereCountdown: number;\n\n /**\n * Flag to indicate if the ambient screen should be shown\n */\n showAmbientScreen: boolean;\n\n /**\n * Flag to indicate if the attract screen should be shown\n */\n showAttractScreen: boolean;\n\n /**\n * Callback to pause and reset the screen timer. This will typically be called when a user\n * interacts with the screen when the ambient or attract screen is show. This will set\n * the `showAmbientScreen` and `showAttractScreen` flags to false and reset the timer.\n */\n pauseScreenTimer: () => void;\n}\nexport const useDefaultCuiKitLifecycle = ({\n kit,\n inactivity,\n pour,\n screens,\n}: Props): LifecycleData => {\n const [showAreYouThere, setShowAreYouThere] = useState(false);\n const [showAmbientScreen, setShowAmbientScreen] = useState(false);\n const [showAttractScreen, setShowAttractScreen] = useState(false);\n\n const { model: nozzle } = useNozzleContext();\n const [hasPoured, setHasPoured] = useState(false);\n const idleTimeout = inactivity?.idleTimeout ?? 15;\n const areYouThereTimeout = inactivity?.areYouThereTimeoutOffset ?? 10;\n const idlePourTimeout = pour?.idleTimeout ?? inactivity?.idleTimeout ?? 10;\n const areYouTherePourTimeout =\n pour?.areYouThereTimeoutOffset ?? inactivity?.areYouThereTimeoutOffset ?? 5;\n const ambientTimeout = screens?.ambientTimeoutOffset;\n const attractTimeout = screens?.attractTimeout;\n\n const handleAreYouThere = useCallback(() => {\n setShowAreYouThere(true);\n }, []);\n\n const handleIdleTimeout = useCallback(() => {\n setShowAreYouThere(false);\n kit?.nav.home();\n }, [kit?.nav?.home]);\n\n const handleAmbientTimer = useCallback(() => {\n if (ambientTimeout) {\n setShowAmbientScreen(true);\n setShowAttractScreen(false);\n }\n }, [ambientTimeout]);\n\n const handleAttractTimer = useCallback(() => {\n if (attractTimeout) {\n setShowAttractScreen(true);\n setShowAmbientScreen(false);\n }\n }, [attractTimeout]);\n\n const handleAttractResume = useCallback(() => {\n if (attractTimeout) {\n setShowAttractScreen(false);\n setShowAmbientScreen(false);\n kit?.nav.home();\n }\n }, [kit?.nav, attractTimeout]);\n\n const {\n pause: ambientPause,\n restart: ambientRestart,\n resume,\n attractTimer,\n } = useAmbientAttractTimers({\n defaultAmbientTime: ambientTimeout,\n defaultAttractTime: attractTimeout,\n onAmbientTimer: handleAmbientTimer,\n onAttractTimer: handleAttractTimer,\n onResumeAttractTimer: handleAttractResume,\n });\n const { pause, restart } = useCuiKitTimers({\n defaultAreYouThereTime: areYouThereTimeout,\n defaultIdleTime: idleTimeout,\n onAreYouThereTimer: handleAreYouThere,\n onIdleTimer: handleIdleTimeout,\n });\n\n const { pause: pausePourTimer, restart: restartPourTimer } = useCuiKitTimers({\n defaultAreYouThereTime: areYouTherePourTimeout,\n defaultIdleTime: idlePourTimeout,\n onAreYouThereTimer: handleAreYouThere,\n onIdleTimer: handleIdleTimeout,\n prefix: \"pour-\",\n });\n\n const handlePour = useCallback(() => {\n setHasPoured(false);\n pausePourTimer();\n pause();\n }, [pause, pausePourTimer]);\n\n const handlePourCancel = useCallback(() => {\n setHasPoured(true);\n console.log(\"restarting pour timer\");\n restartPourTimer();\n pause();\n }, [pause, restartPourTimer]);\n const clearAreYouThere = useCallback(() => {\n setShowAreYouThere(false);\n if (hasPoured) {\n restartPourTimer();\n pause();\n } else {\n restart();\n pausePourTimer();\n }\n }, [hasPoured, pause, pausePourTimer, restart, restartPourTimer]);\n\n const handleBrandSelected = useCallback(() => {\n ambientPause();\n setShowAttractScreen(false);\n setShowAmbientScreen(false);\n restart();\n }, [ambientPause, restart]);\n\n const handleBrandCleared = useCallback(() => {\n setShowAttractScreen(false);\n setShowAmbientScreen(false);\n setHasPoured(false);\n pausePourTimer();\n ambientRestart();\n }, [ambientRestart, pausePourTimer]);\n\n const handleBeverageSelected = useCallback(() => {\n setShowAttractScreen(false);\n setShowAmbientScreen(false);\n setHasPoured(false);\n ambientPause();\n restart();\n }, [ambientPause, restart]);\n\n const handleBeverageCleared = useCallback(() => {\n setShowAttractScreen(false);\n setShowAmbientScreen(false);\n setHasPoured(false);\n ambientRestart();\n pause();\n pausePourTimer();\n }, [ambientRestart, pause, pausePourTimer]);\n\n const handleInit = useCallback(() => {\n setShowAttractScreen(false);\n setShowAmbientScreen(false);\n ambientRestart();\n pause();\n }, [ambientRestart, pause]);\n\n useDispenseLifecycle({\n onBrandSelected: handleBrandSelected,\n onBrandCleared: handleBrandCleared,\n onBeverageSelected: handleBeverageSelected,\n onBeverageCleared: handleBeverageCleared,\n onPour: handlePour,\n onPourCancel: handlePourCancel,\n onInit: handleInit,\n });\n\n const areYouThereCountdown = hasPoured\n ? areYouTherePourTimeout\n : areYouThereTimeout;\n\n useEffect(() => {\n if (nozzle && attractTimer) {\n const topic = `/kos/dispense/${nozzle?.path}/init/`;\n EventBus.publish(topic, {});\n }\n }, [nozzle, attractTimer]);\n\n return {\n showAreYouThere,\n clearAreYouThere,\n areYouThereCountdown,\n showAmbientScreen,\n showAttractScreen,\n pauseScreenTimer: resume,\n };\n};\n","import { useKosModel } from \"@kosdev-code/kos-ui-sdk\";\nimport { DeviceAssembly, type DeviceAssemblyModel } from \"../../../models\";\n\nexport const useDeviceAssembly = () => {\n const modelId = DeviceAssembly.type;\n const result = useKosModel<DeviceAssemblyModel>({\n modelId,\n modelType: DeviceAssembly.type,\n options: {},\n });\n\n return result;\n};\n","import type { DeviceAssemblyModel } from \"../../../models\";\nimport { useDeviceAssembly } from \"./use-device-assembly\";\n\ninterface DeviceAssemblyProps {\n deviceAssembly: DeviceAssemblyModel;\n}\n\ntype HoCDeviceAssemblyProps = DeviceAssemblyProps;\n// react HOC to provide a DeviceAssembly to a component\nexport function withDeviceAssembly<\n T extends HoCDeviceAssemblyProps = HoCDeviceAssemblyProps\n>(WrappedComponent: React.ComponentType<T>) {\n return (props: Omit<T, keyof DeviceAssemblyProps>) => {\n const { model, status, KosModelLoader } = useDeviceAssembly();\n\n return (\n <KosModelLoader {...status}>\n <WrappedComponent {...(props as T)} deviceAssembly={model} />\n </KosModelLoader>\n );\n };\n}\n","import { useKosModel } from \"@kosdev-code/kos-ui-sdk\";\nimport { Holder, type HolderModel } from \"../../../models\";\n\nexport const useHolder = (id: string) => {\n const modelId = id;\n const result = useKosModel<HolderModel>({\n modelId,\n modelType: Holder.type,\n options: {},\n });\n\n return result;\n};\n","import type { HolderModel } from \"../../../models\";\nimport { useHolder } from \"./use-holder\";\n\ninterface HolderProps {\n holder: HolderModel;\n}\n// react HOC to provide a Holder to a component\nexport function withHolder<T extends HolderProps = HolderProps>(\n id: string,\n WrappedComponent: React.ComponentType<T>\n) {\n return (props: Omit<T, keyof HolderProps>) => {\n const { model, status, KosModelLoader } = useHolder(id);\n\n return (\n <KosModelLoader {...status}>\n <WrappedComponent {...(props as T)} holder={model} />\n </KosModelLoader>\n );\n };\n}\n","import { useKosModel } from \"@kosdev-code/kos-ui-sdk\";\nimport { HolderContainer, type HolderContainerModel } from \"../../../models\";\n\nexport const useHolderContainer = () => {\n const modelId = HolderContainer.type;\n const result = useKosModel<HolderContainerModel>({\n modelId,\n modelType: HolderContainer.type,\n options: {},\n });\n\n return result;\n};\n","import type { HolderContainerModel } from \"../../../models\";\nimport { useHolderContainer } from \"./use-holder-container\";\n\ninterface HolderContainerProps {\n holderContainer: HolderContainerModel;\n}\n// react HOC to provide a HolderContainer to a component\nexport function withHolderContainer<\n T extends HolderContainerProps = HolderContainerProps\n>(WrappedComponent: React.ComponentType<T>) {\n return (props: Omit<T, keyof HolderContainerProps>) => {\n const { model, status, KosModelLoader } = useHolderContainer();\n\n return (\n <KosModelLoader {...status}>\n <WrappedComponent {...(props as T)} holderContainer={model} />\n </KosModelLoader>\n );\n };\n}\n","import { useKosModel } from \"@kosdev-code/kos-ui-sdk\";\nimport { Ingredient, type IngredientModel } from \"../../../models\";\n\nexport const useIngredient = () => {\n const modelId = Ingredient.type;\n const result = useKosModel<IngredientModel>({\n modelId,\n modelType: Ingredient.type,\n options: {},\n });\n\n return result;\n};\n","import { KosLog } from \"@kosdev-code/kos-ui-sdk\";\nimport type { IntentAware } from \"../../../../models\";\nimport type { PourStrategy } from \"./pour-strategy\";\n\nconst logger = KosLog.createLogger({\n name: \"HoldToPourIntentStrategy\",\n group: \"kos-hooks\",\n});\nexport const HoldToPourIntentStrategy: PourStrategy<IntentAware> = {\n name: \"HoldToPourIntentStrategy\",\n initiate(model?: IntentAware, intent?: string): void {\n if (!model?.canPour) {\n logger.debug(`${model?.id} cannot pour. Returning early.`);\n return;\n }\n if (intent) {\n logger.debug(`performing intent: ${intent}`);\n model?.performIntent(intent);\n } else {\n logger.debug(\"no intent provided. Returning early.\");\n }\n },\n\n initiateEnded(nozzle?: IntentAware): void {\n nozzle?.cancelPour();\n },\n};\n","import { useCallback } from \"react\";\n\nimport { KosLog, usePressGesture } from \"@kosdev-code/kos-ui-sdk\";\nimport type { ReactDOMAttributes } from \"@use-gesture/react/dist/declarations/src/types\";\nimport type { IntentAware } from \"../../../models\";\nimport { HoldToPourIntentStrategy } from \"../utils/pour-strategy/hold-to-pour-intent-strategy\";\nimport type { PourStrategy } from \"../utils/pour-strategy/pour-strategy\";\n\ninterface IngredientPourProps {\n onPour?: () => void;\n onPourCancel?: () => void;\n intentContainer: IntentAware;\n strategy?: PourStrategy<IntentAware>;\n}\n\nexport interface IngredientPourResponse {\n handlers: (...args: any[]) => ReactDOMAttributes;\n cancel: () => void;\n\n status?: {\n canPour: boolean;\n isPouring: boolean;\n };\n}\n\nconst logger = KosLog.createLogger({\n name: \"useNozzlePour\",\n group: \"kos-hooks\",\n});\n/**\n * Hook that encapsulates the logic for handling ingredient pouring.\n *\n * The hook will return a number of gesture handlers that can be spread onto a DOM element.\n * The hook will automatically detects if touch or mouse events are used.\n *\n *\n * @param onPour - callback initiated after pouring starts\n * @param onPourCancel - callback initiated after pouring is cancelled\n * @returns handlers - gesture handlers for nozzle pouring\n *\n *\n * @example\n * const { handlers } = useIngredientPour({\n * onPour: () => {\n * console.log(\"Pouring started\");\n * },\n * onPourCancel: () => {\n * console.log(\"Pouring cancelled\");\n * },\n * });\n *\n * <div {...handlers()} />\n *\n *\n * @see {@link IntentAware.performIntent}\n * @see {@link usePressGesture}\n **/\nexport const useIngredientPour = ({\n onPour,\n onPourCancel,\n intentContainer,\n strategy = HoldToPourIntentStrategy,\n}: IngredientPourProps): IngredientPourResponse => {\n const handlePour = useCallback(() => {\n logger.debug(\n `[${strategy?.name}] - Pour initiated for model ${intentContainer?.id}.`\n );\n strategy?.initiate(intentContainer);\n onPour?.();\n }, [onPour, intentContainer, strategy]);\n\n const handleCancelPour = useCallback(() => {\n logger.debug(\n `[${strategy?.name}] - Pour initiate ended called for nozzle ${intentContainer?.id}.`\n );\n strategy?.initiateEnded?.(intentContainer);\n onPourCancel?.();\n }, [onPourCancel, intentContainer, strategy]);\n\n const forceCancelPour = useCallback(() => {\n logger.debug(`Force cancelling pour for nozzle ${intentContainer?.id}.`);\n intentContainer?.cancelPour();\n onPourCancel?.();\n }, [onPourCancel, intentContainer]);\n\n const handlers = usePressGesture({\n onPressed: handlePour,\n onRelease: handleCancelPour,\n });\n\n return {\n handlers: handlers.dom,\n cancel: forceCancelPour,\n status: intentContainer,\n };\n};\n","import type { IngredientModel } from \"../../../models\";\nimport { useIngredient } from \"./use-ingredient\";\n\ninterface IngredientProps {\n ingredient: IngredientModel;\n}\n// react HOC to provide a Ingredient to a component\nexport function withIngredient<T extends IngredientProps = IngredientProps>(\n WrappedComponent: React.ComponentType<T>\n) {\n return (props: Omit<T, keyof IngredientProps>) => {\n const { model, status, KosModelLoader } = useIngredient();\n\n return (\n <KosModelLoader {...status}>\n <WrappedComponent {...(props as T)} ingredient={model} />\n </KosModelLoader>\n );\n };\n}\n","import { useKosModel } from \"@kosdev-code/kos-ui-sdk\";\nimport {\n IngredientContainer,\n type IngredientContainerModel,\n} from \"../../../models\";\n\nexport const useIngredientContainer = () => {\n const modelId = IngredientContainer.type;\n const result = useKosModel<IngredientContainerModel>({\n modelId,\n modelType: IngredientContainer.type,\n options: {},\n });\n\n return result;\n};\n","import type { IngredientContainerModel } from \"../../../models\";\nimport { useIngredientContainer } from \"./use-ingredient-container\";\n\ninterface IngredientContainerProps {\n ingredientContainer: IngredientContainerModel;\n}\n// react HOC to provide a IngredientContainer to a component\nexport function withIngredientContainer<\n T extends IngredientContainerProps = IngredientContainerProps\n>(WrappedComponent: React.ComponentType<T>) {\n return (props: Omit<T, keyof IngredientContainerProps>) => {\n const { model, status, KosModelLoader } = useIngredientContainer();\n\n return (\n <KosModelLoader {...status}>\n <WrappedComponent {...(props as T)} ingredientContainer={model} />\n </KosModelLoader>\n );\n };\n}\n","import type { NozzleModel } from \"../../../models\";\nimport { useNozzle } from \"./use-nozzle\";\n\ninterface NozzleProps {\n nozzle: NozzleModel;\n}\n// react HOC to provide a Nozzle to a component\nexport function withNozzle<T extends NozzleProps = NozzleProps>(\n path: string,\n WrappedComponent: React.ComponentType<T>\n) {\n return (props: Omit<T, keyof NozzleProps>) => {\n const { model, status, KosModelLoader } = useNozzle(path);\n\n return (\n <KosModelLoader {...status}>\n <WrappedComponent {...(props as T)} nozzle={model} />\n </KosModelLoader>\n );\n };\n}\n","import { KosLog } from \"@kosdev-code/kos-ui-sdk\";\nimport type { IntentAware } from \"../../../../models\";\nimport type { PourStrategy } from \"./pour-strategy\";\n\nconst logger = KosLog.createLogger({\n name: \"TapOrHoldIntentStrategy\",\n group: \"kos-hooks\",\n});\n\nexport class TapOrHoldIntentStrategy implements PourStrategy<IntentAware> {\n intent: string;\n name = \"TapOrHoldIntentStrategy\";\n isHold = false;\n private disposer?: NodeJS.Timeout | null = null;\n constructor(intent: string) {\n this.intent = intent;\n }\n\n initiate(model?: IntentAware, intent?: string): void {\n this.disposer = setTimeout(() => {\n this.isHold = true;\n }, 250);\n\n if (model?.isPouring && !this.isHold) {\n logger.debug(`additional tap detected. cancelling pour`);\n model.cancelPour();\n return;\n }\n if (!model?.canPour) {\n logger.debug(`${model?.id} cannot pour. Returning early.`);\n return;\n }\n if (intent) {\n logger.debug(`performing intent: ${intent}`);\n model?.performIntent(intent);\n } else {\n logger.debug(\"no intent provided. Returning early.\");\n }\n }\n initiateEnded(nozzle?: IntentAware): void {\n if (this.disposer) clearTimeout(this.disposer);\n this.disposer = null;\n if (!this.isHold) {\n logger.debug(\"Tap detected. don't cancel and return.\");\n return;\n }\n nozzle?.cancelPour();\n }\n}\n","import { KosLog } from \"@kosdev-code/kos-ui-sdk\";\nimport type { IntentAware } from \"../../../../models\";\nimport type { PourStrategy } from \"./pour-strategy\";\n\nconst logger = KosLog.createLogger({\n name: \"TapToPourIntentStrategy\",\n group: \"kos-hooks\",\n});\nexport const TapToPourIntentStrategy: PourStrategy<IntentAware> = {\n name: \"TapToPourIntentStrategy\",\n initiate(model?: IntentAware, intent?: string): void {\n if (model?.isPouring) {\n logger.debug(`Nozzle ${model?.id} is already pouring. cancelling pour`);\n model.cancelPour();\n return;\n }\n if (!model?.canPour) {\n logger.debug(`Nozzle ${model?.id} cannot pour. Returning early.`);\n return;\n }\n if (intent) {\n logger.debug(`performing intent: ${intent}`);\n model?.performIntent(intent);\n } else {\n logger.debug(\"no intent provided. Returning early.\");\n }\n },\n\n initiateEnded(_nozzle?: IntentAware): void {\n return;\n },\n};\n","import { KosLog } from \"@kosdev-code/kos-ui-sdk\";\nimport type { NozzleModel } from \"../../../../models\";\nimport type { PourStrategy } from \"./pour-strategy\";\n\nconst logger = KosLog.createLogger({\n name: \"HoldToPourStrategy\",\n group: \"kos-hooks\",\n});\nexport const TapToPourStrategy: PourStrategy = {\n name: \"TapToPourStrategy\",\n initiate(nozzle?: NozzleModel): void {\n if (nozzle?.isPouring) {\n logger.debug(`Nozzle ${nozzle?.id} is already pouring. cancelling pour`);\n nozzle.cancelPour();\n return;\n }\n if (!nozzle?.canPour) {\n logger.debug(`Nozzle ${nozzle?.id} cannot pour. Returning early.`);\n return;\n }\n nozzle?.pour();\n },\n\n initiateEnded(_nozzle?: NozzleModel): void {\n return;\n },\n};\n","import { PropsWithChildren, createContext, useContext, useMemo } from \"react\";\nimport type { AssemblyModel } from \"../../../models/models/assembly\";\nimport { useAssembly } from \"../../hooks\";\n\ninterface AssemblyType<\n AssemblyExt extends object = any,\n HolderExt extends object = any\n> {\n model?: AssemblyModel<AssemblyExt, HolderExt>;\n}\nconst Assembly = createContext<AssemblyType | undefined>(undefined);\n\ninterface AssemblyProviderProps {}\n\nexport const AssemblyProvider: React.FunctionComponent<\n PropsWithChildren<AssemblyProviderProps>\n> = ({ children }) => {\n const { model, ready } = useAssembly();\n const value: AssemblyType = useMemo(() => {\n if (ready && model) {\n return { model };\n }\n return {};\n }, [ready, model]);\n return <Assembly.Provider value={value}>{children}</Assembly.Provider>;\n};\nexport const useAssemblyContext = <\n AssemblyExt extends object = any,\n HolderExt extends object = any\n>() => {\n const context: AssemblyType<AssemblyExt, HolderExt> = useContext(\n Assembly\n ) as AssemblyType<AssemblyExt, HolderExt>;\n if (!context) {\n throw new Error(\n \"useAssemblyContext must be used within a AssemblyProvider\"\n );\n }\n return context;\n};\n","import { PropsWithChildren, createContext, useContext, useMemo } from \"react\";\nimport type { AvailabilityModel } from \"../../../models\";\nimport { useAvailability } from \"../../hooks/availability/use-availability\";\n\ninterface AvailabilityType {\n model?: AvailabilityModel;\n}\nconst Availability = createContext<AvailabilityType | undefined>(undefined);\n\ninterface AvailabilityProviderProps {\n id?: string;\n}\n\nexport const AvailabilityProvider: React.FunctionComponent<\n PropsWithChildren<AvailabilityProviderProps>\n> = ({ children }) => {\n const { model, ready } = useAvailability();\n const value: AvailabilityType = useMemo(() => {\n if (ready && model) {\n return { model };\n }\n return {};\n }, [ready, model]);\n return (\n <Availability.Provider value={value}>{children}</Availability.Provider>\n );\n};\nexport const useAvailabilityContext = () => {\n const context = useContext(Availability);\n if (!context) {\n throw new Error(\n \"useAvailabilityContext must be used within a AvailabilityProvider\"\n );\n }\n return context;\n};\n","import { PropsWithChildren, createContext, useContext, useMemo } from \"react\";\nimport type { BoardModel } from \"../../../models\";\nimport { useBoard } from \"../../hooks/board/use-board\";\n\ninterface BoardType {\n model?: BoardModel;\n}\nconst Board = createContext<BoardType | undefined>(undefined);\n\ninterface BoardProviderProps {\n id: string;\n}\n\nexport const BoardProvider: React.FunctionComponent<\n PropsWithChildren<BoardProviderProps>\n> = ({ children, id }) => {\n const { model, ready } = useBoard(id);\n const value: BoardType = useMemo(() => {\n if (ready && model) {\n return { model };\n }\n return {};\n }, [ready, model]);\n return <Board.Provider value={value}>{children}</Board.Provider>;\n};\nexport const useBoardContext = () => {\n const context = useContext(Board);\n if (!context) {\n throw new Error(\"useBoardContext must be used within a BoardProvider\");\n }\n return context;\n};\n","import { PropsWithChildren, createContext, useContext, useMemo } from \"react\";\nimport type { BoardContainerModel } from \"../../../models\";\nimport { useBoardContainer } from \"../../hooks/board-container/use-board-container\";\n\ninterface BoardContainerType {\n model?: BoardContainerModel;\n}\nconst BoardContainer = createContext<BoardContainerType | undefined>(undefined);\n\ninterface BoardContainerProviderProps {}\n\nexport const BoardContainerProvider: React.FunctionComponent<\n PropsWithChildren<BoardContainerProviderProps>\n> = ({ children }) => {\n const { model, ready } = useBoardContainer();\n const value: BoardContainerType = useMemo(() => {\n if (ready && model) {\n return { model };\n }\n return {};\n }, [ready, model]);\n return (\n <BoardContainer.Provider value={value}>{children}</BoardContainer.Provider>\n );\n};\nexport const useBoardContainerContext = () => {\n const context = useContext(BoardContainer);\n if (!context) {\n throw new Error(\n \"useBoardContainerContext must be used within a BoardContainerProvider\"\n );\n }\n return context;\n};\n","import { PropsWithChildren, createContext, useContext, useMemo } from \"react\";\nimport { DeviceAssemblyModel } from \"../../../models\";\nimport { useDeviceAssembly } from \"../../hooks/device-assembly/use-device-assembly\";\n\ninterface DeviceAssemblyType {\n model?: DeviceAssemblyModel;\n nozzlePaths?: string[];\n}\nconst DeviceAssemblyContext = createContext<DeviceAssemblyType | undefined>(\n undefined\n);\n\ntype DeviceAssemblyProviderProps = object;\n\nexport const DeviceAssemblyProvider: React.FunctionComponent<\n PropsWithChildren<DeviceAssemblyProviderProps>\n> = ({ children }) => {\n const { model, ready } = useDeviceAssembly();\n const value: DeviceAssemblyType = useMemo(() => {\n if (ready && model) {\n const nozzlePaths = model.nozzlePaths;\n return { model, nozzlePaths };\n }\n return {};\n }, [ready, model]);\n\n const content = ready && model ? children : null;\n return (\n <DeviceAssemblyContext.Provider value={value}>\n {content}\n </DeviceAssemblyContext.Provider>\n );\n};\nexport const useDeviceAssemblyContext = () => {\n const context = useContext(DeviceAssemblyContext);\n if (!context) {\n throw new Error(\n \"useDeviceAssemblyContext must be used within a DeviceAssemblyProvider\"\n );\n }\n return context;\n};\n","import React, { useContext, type ReactNode } from \"react\";\nimport {\n useCuiKit,\n type CuiKitType,\n type UseCuiKitProps,\n} from \"../../hooks/cui-kit/use-cui-kit\";\nimport {\n DeviceAssemblyProvider,\n useDeviceAssemblyContext,\n} from \"../device-assembly/device-assembly-provider\";\nimport { NozzleProvider } from \"../nozzle/nozzle-provider\";\n\nfunction createDispenseKitContext<\n BrandData extends Record<string, any> = any,\n BeverageData extends Record<string, any> = any,\n FlavorData extends Record<string, any> = any\n>() {\n const CuiKitContext = React.createContext<CuiKitType<\n BrandData,\n BeverageData,\n FlavorData\n > | null>(null);\n\n const useCuiKitContext = () => {\n const ctx = useContext(CuiKitContext);\n if (ctx === undefined) {\n throw new Error(\"useDispenseKitContext must be used within a Provider\");\n }\n return ctx;\n };\n\n return [useCuiKitContext, CuiKitContext.Provider] as const;\n}\n\nexport function CuiKitWrapper<\n BrandData extends Record<string, any> = any,\n BeverageData extends Record<string, any> = any,\n FlavorData extends Record<string, any> = any\n>({ children, provider: CuiKitProvider, props }: DispenseViewProps) {\n const result = useCuiKit<BrandData, BeverageData, FlavorData>(props);\n\n return <CuiKitProvider value={result}>{children({})}</CuiKitProvider>;\n}\n\ninterface ChildProps {}\n\ninterface DispenseViewProps<\n BrandData extends Record<string, any> = any,\n BeverageData extends Record<string, any> = any,\n FlavorData extends Record<string, any> = any\n> {\n children: (props: ChildProps) => ReactNode;\n provider: React.Provider<CuiKitType<\n BrandData,\n BeverageData,\n FlavorData\n > | null>;\n props: UseCuiKitProps;\n}\nfunction DispenseView<\n BrandData extends Record<string, any> = any,\n BeverageData extends Record<string, any> = any,\n FlavorData extends Record<string, any> = any\n>({\n children,\n provider,\n props,\n}: DispenseViewProps<BrandData, BeverageData, FlavorData>) {\n const { nozzlePaths } = useDeviceAssemblyContext();\n const nozzles =\n nozzlePaths?.map((path) => (\n <NozzleProvider key={path} path={path}>\n <CuiKitWrapper<BrandData, BeverageData, FlavorData>\n provider={provider}\n props={props}\n >\n {children}\n </CuiKitWrapper>\n </NozzleProvider>\n )) || [];\n return nozzles;\n}\n\nexport interface CuiKitProps {\n children: () => ReactNode;\n}\n\ninterface CuiKitProviderProps<\n BrandData extends Record<string, any> = any,\n BeverageData extends Record<string, any> = any,\n FlavorData extends Record<string, any> = any\n> {\n provider: React.Provider<CuiKitType<\n BrandData,\n BeverageData,\n FlavorData\n > | null>;\n props: UseCuiKitProps;\n}\nexport function CuiKit<\n BrandData extends Record<string, any> = any,\n BeverageData extends Record<string, any> = any,\n FlavorData extends Record<string, any> = any\n>({\n provider,\n props,\n}: CuiKitProviderProps<BrandData, BeverageData, FlavorData>) {\n return ({ children }: CuiKitProps) =>\n provider ? (\n <DeviceAssemblyProvider>\n <DispenseView<BrandData, BeverageData, FlavorData>\n provider={provider}\n props={props}\n >\n {children}\n </DispenseView>\n </DeviceAssemblyProvider>\n ) : null;\n}\n\nexport function initializeCuiKit<\n BrandData extends Record<string, any> = any,\n BeverageData extends Record<string, any> = any,\n FlavorData extends Record<string, any> = any\n>(props: UseCuiKitProps) {\n const [useCuiKitContext, DispenseKitProvider] = createDispenseKitContext<\n BrandData,\n BeverageData,\n FlavorData\n >();\n return [\n useCuiKitContext,\n CuiKit({ provider: DispenseKitProvider, props }),\n ] as const;\n}\n","import { PropsWithChildren, createContext, useContext, useMemo } from \"react\";\nimport type { HolderModel } from \"../../../models\";\nimport { useHolder } from \"../../hooks/holder/use-holder\";\n\ninterface HolderType {\n model?: HolderModel;\n}\nconst Holder = createContext<HolderType | undefined>(undefined);\n\ninterface HolderProviderProps {\n id?: string;\n}\n\nexport const HolderProvider: React.FunctionComponent<\n PropsWithChildren<HolderProviderProps>\n> = ({ children, id }) => {\n const { model, ready } = useHolder(id || \"\");\n const value: HolderType = useMemo(() => {\n if (ready && model) {\n return { model };\n }\n return {};\n }, [ready, model]);\n return <Holder.Provider value={value}>{children}</Holder.Provider>;\n};\nexport const useHolderContext = () => {\n const context = useContext(Holder);\n if (!context) {\n throw new Error(\"useHolderContext must be used within a HolderProvider\");\n }\n return context;\n};\n","import { PropsWithChildren, createContext, useContext, useMemo } from \"react\";\nimport { type HolderContainerModel } from \"../../../models\";\nimport { useHolderContainer } from \"../../hooks/holder-container/use-holder-container\";\n\ninterface HolderContainerType {\n model?: HolderContainerModel;\n}\nconst HolderContainer = createContext<HolderContainerType | undefined>(\n undefined\n);\n\ninterface HolderContainerProviderProps {\n id?: string;\n}\n\nexport const HolderContainerProvider: React.FunctionComponent<\n PropsWithChildren<HolderContainerProviderProps>\n> = ({ children }) => {\n const { model, ready } = useHolderContainer();\n const value: HolderContainerType = useMemo(() => {\n if (ready && model) {\n return { model };\n }\n return {};\n }, [ready, model]);\n return (\n <HolderContainer.Provider value={value}>\n {children}\n </HolderContainer.Provider>\n );\n};\nexport const useHolderContainerContext = () => {\n const context = useContext(HolderContainer);\n if (!context) {\n throw new Error(\n \"useHolderContainerContext must be used within a HolderContainerProvider\"\n );\n }\n return context;\n};\n","import { PropsWithChildren, createContext, useContext, useMemo } from \"react\";\nimport type { IngredientModel } from \"../../../models\";\nimport { useIngredient } from \"../../hooks/ingredient/use-ingredient\";\n\ninterface IngredientType {\n model?: IngredientModel;\n}\nconst Ingredient = createContext<IngredientType | undefined>(undefined);\n\ninterface IngredientProviderProps {\n id?: string;\n}\n\nexport const IngredientProvider: React.FunctionComponent<\n PropsWithChildren<IngredientProviderProps>\n> = ({ children }) => {\n const { model, ready } = useIngredient();\n const value: IngredientType = useMemo(() => {\n if (ready && model) {\n return { model };\n }\n return {};\n }, [ready, model]);\n return <Ingredient.Provider value={value}>{children}</Ingredient.Provider>;\n};\nexport const useIngredientContext = () => {\n const context = useContext(Ingredient);\n if (!context) {\n throw new Error(\n \"useIngredientContext must be used within a IngredientProvider\"\n );\n }\n return context;\n};\n","import { PropsWithChildren, createContext, useContext, useMemo } from \"react\";\nimport type { IngredientContainerModel } from \"../../../models\";\nimport { useIngredientContainer } from \"../../hooks/ingredient-container/use-ingredient-container\";\n\ninterface IngredientContainerType {\n model?: IngredientContainerModel;\n}\nconst IngredientContainer = createContext<IngredientContainerType | undefined>(\n undefined\n);\n\ninterface IngredientContainerProviderProps {\n id?: string;\n}\n\nexport const IngredientContainerProvider: React.FunctionComponent<\n PropsWithChildren<IngredientContainerProviderProps>\n> = ({ children }) => {\n const { model, ready } = useIngredientContainer();\n const value: IngredientContainerType = useMemo(() => {\n if (ready && model) {\n return { model };\n }\n return {};\n }, [ready, model]);\n return (\n <IngredientContainer.Provider value={value}>\n {children}\n </IngredientContainer.Provider>\n );\n};\nexport const useIngredientContainerContext = () => {\n const context = useContext(IngredientContainer);\n if (!context) {\n throw new Error(\n \"useIngredientContainerContext must be used within a IngredientContainerProvider\"\n );\n }\n return context;\n};\n","import { useKosModel } from \"@kosdev-code/kos-ui-sdk\";\nimport { Pump, type PumpModel } from \"../../../models\";\n\nexport const usePump = () => {\n const modelId = Pump.type;\n const result = useKosModel<PumpModel>({\n modelId,\n modelType: Pump.type,\n options: {},\n });\n\n return result;\n};\n","import { PropsWithChildren, createContext, useContext, useMemo } from \"react\";\nimport type { PumpModel } from \"../../../models\";\nimport { usePump } from \"../../hooks/pump/use-pump\";\n\ninterface PumpType {\n model?: PumpModel;\n}\nconst Pump = createContext<PumpType | undefined>(undefined);\n\ninterface PumpProviderProps {\n id?: string;\n}\n\nexport const PumpProvider: React.FunctionComponent<\n PropsWithChildren<PumpProviderProps>\n> = ({ children }) => {\n const { model, ready } = usePump();\n const value: PumpType = useMemo(() => {\n if (ready && model) {\n return { model };\n }\n return {};\n }, [ready, model]);\n return <Pump.Provider value={value}>{children}</Pump.Provider>;\n};\nexport const usePumpContext = () => {\n const context = useContext(Pump);\n if (!context) {\n throw new Error(\"usePumpContext must be used within a PumpProvider\");\n }\n return context;\n};\n"],"names":["useAssembly","modelId","Assembly","useKosModel","withAssembly","WrappedComponent","props","model","status","KosModelLoader","jsx","useAvailability","Availability","withBeverage","useBoard","id","Board","withBoard","useBoardContainer","BoardContainer","withBoardContainer","useNozzle","path","Nozzle","createContext","NozzleProvider","children","ready","value","useMemo","useNozzleContext","context","useContext","useBeverages","onBeverageSelected","onClearBeverage","companionType","nozzle","beverages","setBeverages","useState","selectedBeverage","setSelectedBeverage","companions","brand","getKosCompanionModel","selectBeverage","useCallback","beverage","clearBeverage","useEffect","disposer","kosAutoEffect","selectedBrand","allBeverages","b","useBrands","onBrandSelected","onBrandCleared","setSelectedBrand","brands","selectBrand","clearBrand","logger","KosLog","HoldToPourStrategy","useNozzlePour","onPour","onPourCancel","strategy","handlePour","handleCancelPour","_a","forceCancelPour","usePressGesture","useFlavors","onFlavorSelected","onFlavorCleared","flavors","f","flavor","selectedFlavors","setSelectedFlavors","selectFlavor","previous","p","clear","DISPENSE_GROUP_BRAND","DISPENSE_GROUP_BEVERAGE","DISPENSE_GROUP_FLAVOR","useCuiKit","initialGroup","options","currentGroup","setCurrentGroup","topic","EventBus","onBeverageCleared","brandCompanions","beverageCompanions","_b","clearFlavors","flavorCompanions","_c","pour","back","home","useAmbientAttractTimers","attractTimer","setAttractTimer","onAmbientTimer","onAttractTimer","onResetAttractTimer","onResumeAttractTimer","defaultAttractTime","defaultAmbientTime","handleAmbientTimer","handleAttractTimer","handleResetAttractTimer","handlePauseAttractTimer","handleResume","timer","TimerManager","subscribe","callback","useDispenseLifecycle","onInit","disposers","useCuiKitTimers","idleTimer","setIdleTimer","onAreYouThereTimer","onIdleTimer","onResetIdleTimer","defaultAreYouThereTime","defaultIdleTime","handleAreYouThereTimer","handleIdleTimer","handleRestartIdleTimer","handlePauseIdleTimer","useDefaultCuiKitLifecycle","kit","inactivity","screens","showAreYouThere","setShowAreYouThere","showAmbientScreen","setShowAmbientScreen","showAttractScreen","setShowAttractScreen","hasPoured","setHasPoured","idleTimeout","areYouThereTimeout","idlePourTimeout","areYouTherePourTimeout","ambientTimeout","attractTimeout","handleAreYouThere","handleIdleTimeout","handleAttractResume","ambientPause","ambientRestart","resume","pause","restart","pausePourTimer","restartPourTimer","handlePourCancel","clearAreYouThere","handleBrandSelected","handleBrandCleared","handleBeverageSelected","handleBeverageCleared","handleInit","areYouThereCountdown","useDeviceAssembly","DeviceAssembly","withDeviceAssembly","useHolder","Holder","withHolder","useHolderContainer","HolderContainer","withHolderContainer","useIngredient","Ingredient","HoldToPourIntentStrategy","intent","useIngredientPour","intentContainer","withIngredient","useIngredientContainer","IngredientContainer","withIngredientContainer","withNozzle","TapOrHoldIntentStrategy","__publicField","TapToPourIntentStrategy","_nozzle","TapToPourStrategy","AssemblyProvider","useAssemblyContext","AvailabilityProvider","useAvailabilityContext","BoardProvider","useBoardContext","BoardContainerProvider","useBoardContainerContext","DeviceAssemblyContext","DeviceAssemblyProvider","nozzlePaths","content","useDeviceAssemblyContext","createDispenseKitContext","CuiKitContext","React","ctx","CuiKitWrapper","CuiKitProvider","result","DispenseView","provider","CuiKit","initializeCuiKit","useCuiKitContext","DispenseKitProvider","HolderProvider","useHolderContext","HolderContainerProvider","useHolderContainerContext","IngredientProvider","useIngredientContext","IngredientContainerProvider","useIngredientContainerContext","usePump","Pump","PumpProvider","usePumpContext"],"mappings":"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"}
|