@kosdev-code/kos-dispense-sdk 2.1.38 → 3.0.0

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.
Files changed (301) hide show
  1. package/dispense-registration-manager-BH0mkCQx.cjs +2672 -0
  2. package/dispense-registration-manager-BH0mkCQx.cjs.map +1 -0
  3. package/dispense-registration-manager-BSKa5Oi9.js +2674 -0
  4. package/dispense-registration-manager-BSKa5Oi9.js.map +1 -0
  5. package/extension-utils-FKfiDSbi.cjs +489 -0
  6. package/extension-utils-FKfiDSbi.cjs.map +1 -0
  7. package/{extension-utils-DrsPfQWC.js → extension-utils-jntF0-vN.js} +185 -159
  8. package/extension-utils-jntF0-vN.js.map +1 -0
  9. package/extensions/control-pour-extension.d.ts +8 -9
  10. package/extensions/control-pour-extension.d.ts.map +1 -1
  11. package/extensions/index.d.ts.map +1 -1
  12. package/index.cjs +139 -1
  13. package/index.cjs.map +1 -1
  14. package/index.d.ts.map +1 -1
  15. package/index.js +124 -124
  16. package/index.js.map +1 -1
  17. package/models/constants/constants.d.ts.map +1 -1
  18. package/models/constants/index.d.ts.map +1 -1
  19. package/models/index.d.ts.map +1 -1
  20. package/models/models/assembly/assembly-model.d.ts +4 -5
  21. package/models/models/assembly/assembly-model.d.ts.map +1 -1
  22. package/models/models/assembly/assembly-registration.d.ts +1 -2
  23. package/models/models/assembly/assembly-registration.d.ts.map +1 -1
  24. package/models/models/assembly/board-utils.d.ts +1 -2
  25. package/models/models/assembly/board-utils.d.ts.map +1 -1
  26. package/models/models/assembly/holder-utils.d.ts +1 -2
  27. package/models/models/assembly/holder-utils.d.ts.map +1 -1
  28. package/models/models/assembly/index.d.ts.map +1 -1
  29. package/models/models/assembly/nozzle-utils.d.ts +1 -2
  30. package/models/models/assembly/nozzle-utils.d.ts.map +1 -1
  31. package/models/models/assembly/pump-utils.d.ts +2 -3
  32. package/models/models/assembly/pump-utils.d.ts.map +1 -1
  33. package/models/models/assembly/services/assembly-services.d.ts +0 -1
  34. package/models/models/assembly/services/assembly-services.d.ts.map +1 -1
  35. package/models/models/assembly/services/index.d.ts.map +1 -1
  36. package/models/models/assembly/types/index.d.ts +2 -3
  37. package/models/models/availability/availability-model.d.ts +1 -2
  38. package/models/models/availability/availability-model.d.ts.map +1 -1
  39. package/models/models/availability/index.d.ts.map +1 -1
  40. package/models/models/availability/types/index.d.ts +0 -1
  41. package/models/models/board/board-container-model.d.ts +2 -3
  42. package/models/models/board/board-container-model.d.ts.map +1 -1
  43. package/models/models/board/board-container-registration.d.ts +2 -3
  44. package/models/models/board/board-container-registration.d.ts.map +1 -1
  45. package/models/models/board/board-model.d.ts +1 -2
  46. package/models/models/board/board-model.d.ts.map +1 -1
  47. package/models/models/board/board-registration.d.ts +1 -2
  48. package/models/models/board/board-registration.d.ts.map +1 -1
  49. package/models/models/board/index.d.ts.map +1 -1
  50. package/models/models/board/types/index.d.ts +0 -2
  51. package/models/models/board/types/services.d.ts.map +1 -1
  52. package/models/models/board/utils/board-trouble-data-mapper.d.ts +1 -2
  53. package/models/models/board/utils/board-trouble-data-mapper.d.ts.map +1 -1
  54. package/models/models/board/utils/board-trouble-resolver.d.ts +0 -1
  55. package/models/models/board/utils/board-trouble-resolver.d.ts.map +1 -1
  56. package/models/models/device-assembly/device-assembly-model.d.ts +2 -3
  57. package/models/models/device-assembly/device-assembly-model.d.ts.map +1 -1
  58. package/models/models/device-assembly/device-assembly-registration.d.ts +2 -3
  59. package/models/models/device-assembly/device-assembly-registration.d.ts.map +1 -1
  60. package/models/models/device-assembly/index.d.ts.map +1 -1
  61. package/models/models/generic-pour/generic-pour-model.d.ts +3 -4
  62. package/models/models/generic-pour/generic-pour-model.d.ts.map +1 -1
  63. package/models/models/generic-pour/generic-pour-registration.d.ts +2 -3
  64. package/models/models/generic-pour/generic-pour-registration.d.ts.map +1 -1
  65. package/models/models/generic-pour/index.d.ts.map +1 -1
  66. package/models/models/generic-pour/services/generic-pour-services.d.ts.map +1 -1
  67. package/models/models/generic-pour/services/index.d.ts.map +1 -1
  68. package/models/models/holder/holder-model.d.ts +1 -2
  69. package/models/models/holder/holder-model.d.ts.map +1 -1
  70. package/models/models/holder/index.d.ts.map +1 -1
  71. package/models/models/holder/services/assignment-services.d.ts.map +1 -1
  72. package/models/models/holder/services/holder-services.d.ts.map +1 -1
  73. package/models/models/holder/services/index.d.ts.map +1 -1
  74. package/models/models/holder/types/index.d.ts +7 -7
  75. package/models/models/holder/utils/holder-utils.d.ts +0 -1
  76. package/models/models/holder/utils/holder-utils.d.ts.map +1 -1
  77. package/models/models/holder-container/holder-container-model.d.ts +1 -2
  78. package/models/models/holder-container/holder-container-model.d.ts.map +1 -1
  79. package/models/models/holder-container/index.d.ts.map +1 -1
  80. package/models/models/holder-container/types/index.d.ts +1 -3
  81. package/models/models/index.d.ts.map +1 -1
  82. package/models/models/ingredient/index.d.ts.map +1 -1
  83. package/models/models/ingredient/ingredient-model.d.ts +1 -2
  84. package/models/models/ingredient/ingredient-model.d.ts.map +1 -1
  85. package/models/models/ingredient/services/index.d.ts.map +1 -1
  86. package/models/models/ingredient/services/ingredient-services.d.ts.map +1 -1
  87. package/models/models/ingredient/types/index.d.ts +0 -2
  88. package/models/models/ingredient-container/index.d.ts.map +1 -1
  89. package/models/models/ingredient-container/ingredient-container-model.d.ts +1 -2
  90. package/models/models/ingredient-container/ingredient-container-model.d.ts.map +1 -1
  91. package/models/models/ingredient-container/types/index.d.ts +1 -3
  92. package/models/models/nozzle/index.d.ts.map +1 -1
  93. package/models/models/nozzle/nozzle-model.d.ts +7 -7
  94. package/models/models/nozzle/nozzle-model.d.ts.map +1 -1
  95. package/models/models/nozzle/services/index.d.ts.map +1 -1
  96. package/models/models/nozzle/services/nozzle-services.d.ts.map +1 -1
  97. package/models/models/nozzle/types/index.d.ts +1 -3
  98. package/models/models/pump/index.d.ts.map +1 -1
  99. package/models/models/pump/pump-model.d.ts +1 -2
  100. package/models/models/pump/pump-model.d.ts.map +1 -1
  101. package/models/models/pump/services/index.d.ts.map +1 -1
  102. package/models/models/pump/services/pump-services.d.ts +3 -5
  103. package/models/models/pump/services/pump-services.d.ts.map +1 -1
  104. package/models/models/pump/types/index.d.ts +1 -3
  105. package/models/models/pump/utils/pump-trouble-resolver.d.ts +0 -1
  106. package/models/models/pump/utils/pump-trouble-resolver.d.ts.map +1 -1
  107. package/models/models/pump-container/index.d.ts.map +1 -1
  108. package/models/models/pump-container/pump-container-model.d.ts +1 -2
  109. package/models/models/pump-container/pump-container-model.d.ts.map +1 -1
  110. package/models/models/pump-container/types/index.d.ts +1 -3
  111. package/models/models/types/assembly.d.ts +1 -0
  112. package/models/models/types/assembly.d.ts.map +1 -1
  113. package/models/models/types/index.d.ts.map +1 -1
  114. package/models/models/types/intent.d.ts +0 -1
  115. package/models/models/types/intent.d.ts.map +1 -1
  116. package/models/models/types/pouring.d.ts.map +1 -1
  117. package/models/utils/dispense-registration-manager.d.ts +5 -6
  118. package/models/utils/dispense-registration-manager.d.ts.map +1 -1
  119. package/models/utils/extension-utils.d.ts +6 -7
  120. package/models/utils/extension-utils.d.ts.map +1 -1
  121. package/models/utils/openapi-index.d.ts.map +1 -1
  122. package/models/utils/registration.d.ts +0 -1
  123. package/models/utils/registration.d.ts.map +1 -1
  124. package/models/utils/service.d.ts +34 -35
  125. package/models/utils/service.d.ts.map +1 -1
  126. package/models/utils/services/dispense/1.6.5/service.d.ts +34 -35
  127. package/models/utils/services/dispense/1.6.5/service.d.ts.map +1 -1
  128. package/models/utils/services/dispense/1.8.1/service.d.ts +34 -35
  129. package/models/utils/services/dispense/1.8.1/service.d.ts.map +1 -1
  130. package/models/utils/services/dispense/daily/service.d.ts +34 -35
  131. package/models/utils/services/dispense/daily/service.d.ts.map +1 -1
  132. package/models/utils/services-index.d.ts.map +1 -1
  133. package/models.cjs +45 -1
  134. package/models.cjs.map +1 -1
  135. package/models.d.ts +1 -0
  136. package/models.js +40 -42
  137. package/models.js.map +1 -1
  138. package/package.json +22 -11
  139. package/pump-provider-D4iVLU-o.cjs +1803 -0
  140. package/pump-provider-D4iVLU-o.cjs.map +1 -0
  141. package/pump-provider-ntLT8vr7.js +1804 -0
  142. package/pump-provider-ntLT8vr7.js.map +1 -0
  143. package/ui/contexts/assembly/assembly-provider.d.ts +1 -2
  144. package/ui/contexts/assembly/assembly-provider.d.ts.map +1 -1
  145. package/ui/contexts/assembly/index.d.ts.map +1 -1
  146. package/ui/contexts/availability/availability-provider.d.ts +1 -2
  147. package/ui/contexts/availability/availability-provider.d.ts.map +1 -1
  148. package/ui/contexts/availability/index.d.ts.map +1 -1
  149. package/ui/contexts/board/board-provider.d.ts +1 -2
  150. package/ui/contexts/board/board-provider.d.ts.map +1 -1
  151. package/ui/contexts/board/index.d.ts.map +1 -1
  152. package/ui/contexts/board-container/board-container-provider.d.ts +1 -2
  153. package/ui/contexts/board-container/board-container-provider.d.ts.map +1 -1
  154. package/ui/contexts/board-container/index.d.ts.map +1 -1
  155. package/ui/contexts/cui-kit/cui-kit.d.ts +1 -2
  156. package/ui/contexts/cui-kit/cui-kit.d.ts.map +1 -1
  157. package/ui/contexts/cui-kit/index.d.ts.map +1 -1
  158. package/ui/contexts/device-assembly/device-assembly-provider.d.ts +1 -2
  159. package/ui/contexts/device-assembly/device-assembly-provider.d.ts.map +1 -1
  160. package/ui/contexts/device-assembly/index.d.ts.map +1 -1
  161. package/ui/contexts/holder/holder-provider.d.ts +1 -2
  162. package/ui/contexts/holder/holder-provider.d.ts.map +1 -1
  163. package/ui/contexts/holder/index.d.ts.map +1 -1
  164. package/ui/contexts/holder-container/holder-container-provider.d.ts +1 -2
  165. package/ui/contexts/holder-container/holder-container-provider.d.ts.map +1 -1
  166. package/ui/contexts/holder-container/index.d.ts.map +1 -1
  167. package/ui/contexts/index.d.ts.map +1 -1
  168. package/ui/contexts/ingredient/index.d.ts.map +1 -1
  169. package/ui/contexts/ingredient/ingredient-provider.d.ts +1 -2
  170. package/ui/contexts/ingredient/ingredient-provider.d.ts.map +1 -1
  171. package/ui/contexts/ingredient-container/index.d.ts.map +1 -1
  172. package/ui/contexts/ingredient-container/ingredient-container-provider.d.ts +1 -2
  173. package/ui/contexts/ingredient-container/ingredient-container-provider.d.ts.map +1 -1
  174. package/ui/contexts/nozzle/index.d.ts.map +1 -1
  175. package/ui/contexts/nozzle/nozzle-provider.d.ts +1 -2
  176. package/ui/contexts/nozzle/nozzle-provider.d.ts.map +1 -1
  177. package/ui/contexts/pump/index.d.ts.map +1 -1
  178. package/ui/contexts/pump/pump-provider.d.ts +1 -2
  179. package/ui/contexts/pump/pump-provider.d.ts.map +1 -1
  180. package/ui/hooks/assembly/index.d.ts.map +1 -1
  181. package/ui/hooks/assembly/use-assembly.d.ts +1 -2
  182. package/ui/hooks/assembly/use-assembly.d.ts.map +1 -1
  183. package/ui/hooks/assembly/with-assembly.d.ts +0 -1
  184. package/ui/hooks/assembly/with-assembly.d.ts.map +1 -1
  185. package/ui/hooks/availability/index.d.ts.map +1 -1
  186. package/ui/hooks/availability/use-availability.d.ts +1 -2
  187. package/ui/hooks/availability/use-availability.d.ts.map +1 -1
  188. package/ui/hooks/availability/with-availability.d.ts +0 -1
  189. package/ui/hooks/availability/with-availability.d.ts.map +1 -1
  190. package/ui/hooks/board/index.d.ts.map +1 -1
  191. package/ui/hooks/board/use-board.d.ts +1 -2
  192. package/ui/hooks/board/use-board.d.ts.map +1 -1
  193. package/ui/hooks/board/with-board.d.ts +0 -1
  194. package/ui/hooks/board/with-board.d.ts.map +1 -1
  195. package/ui/hooks/board-container/index.d.ts.map +1 -1
  196. package/ui/hooks/board-container/use-board-container.d.ts +1 -2
  197. package/ui/hooks/board-container/use-board-container.d.ts.map +1 -1
  198. package/ui/hooks/board-container/with-board-container.d.ts +0 -1
  199. package/ui/hooks/board-container/with-board-container.d.ts.map +1 -1
  200. package/ui/hooks/cui-kit/dispense-topics.d.ts +0 -1
  201. package/ui/hooks/cui-kit/dispense-topics.d.ts.map +1 -1
  202. package/ui/hooks/cui-kit/index.d.ts.map +1 -1
  203. package/ui/hooks/cui-kit/use-ambient-attract-timers.d.ts +0 -1
  204. package/ui/hooks/cui-kit/use-ambient-attract-timers.d.ts.map +1 -1
  205. package/ui/hooks/cui-kit/use-beverages.d.ts +1 -2
  206. package/ui/hooks/cui-kit/use-beverages.d.ts.map +1 -1
  207. package/ui/hooks/cui-kit/use-brands.d.ts +1 -2
  208. package/ui/hooks/cui-kit/use-brands.d.ts.map +1 -1
  209. package/ui/hooks/cui-kit/use-cui-kit.d.ts +3 -4
  210. package/ui/hooks/cui-kit/use-cui-kit.d.ts.map +1 -1
  211. package/ui/hooks/cui-kit/use-default-cui-kit-lifecycle.d.ts +0 -1
  212. package/ui/hooks/cui-kit/use-default-cui-kit-lifecycle.d.ts.map +1 -1
  213. package/ui/hooks/cui-kit/use-dispense-lifecycle.d.ts +0 -1
  214. package/ui/hooks/cui-kit/use-dispense-lifecycle.d.ts.map +1 -1
  215. package/ui/hooks/cui-kit/use-dispense-timers.d.ts +0 -1
  216. package/ui/hooks/cui-kit/use-dispense-timers.d.ts.map +1 -1
  217. package/ui/hooks/cui-kit/use-flavors.d.ts +1 -2
  218. package/ui/hooks/cui-kit/use-flavors.d.ts.map +1 -1
  219. package/ui/hooks/device-assembly/index.d.ts.map +1 -1
  220. package/ui/hooks/device-assembly/use-device-assembly.d.ts +1 -2
  221. package/ui/hooks/device-assembly/use-device-assembly.d.ts.map +1 -1
  222. package/ui/hooks/device-assembly/with-device-assembly.d.ts +0 -1
  223. package/ui/hooks/device-assembly/with-device-assembly.d.ts.map +1 -1
  224. package/ui/hooks/generic-pour/index.d.ts.map +1 -1
  225. package/ui/hooks/generic-pour/use-generic-pour.d.ts +2 -3
  226. package/ui/hooks/generic-pour/use-generic-pour.d.ts.map +1 -1
  227. package/ui/hooks/generic-pour/with-generic-pour.d.ts +0 -1
  228. package/ui/hooks/generic-pour/with-generic-pour.d.ts.map +1 -1
  229. package/ui/hooks/holder/index.d.ts.map +1 -1
  230. package/ui/hooks/holder/use-holder.d.ts +1 -2
  231. package/ui/hooks/holder/use-holder.d.ts.map +1 -1
  232. package/ui/hooks/holder/with-holder.d.ts +0 -1
  233. package/ui/hooks/holder/with-holder.d.ts.map +1 -1
  234. package/ui/hooks/holder-container/index.d.ts.map +1 -1
  235. package/ui/hooks/holder-container/use-holder-container.d.ts +1 -2
  236. package/ui/hooks/holder-container/use-holder-container.d.ts.map +1 -1
  237. package/ui/hooks/holder-container/with-holder-container.d.ts +0 -1
  238. package/ui/hooks/holder-container/with-holder-container.d.ts.map +1 -1
  239. package/ui/hooks/index.d.ts.map +1 -1
  240. package/ui/hooks/ingredient/index.d.ts.map +1 -1
  241. package/ui/hooks/ingredient/use-ingredient-pour.d.ts +2 -3
  242. package/ui/hooks/ingredient/use-ingredient-pour.d.ts.map +1 -1
  243. package/ui/hooks/ingredient/use-ingredient.d.ts +1 -2
  244. package/ui/hooks/ingredient/use-ingredient.d.ts.map +1 -1
  245. package/ui/hooks/ingredient/with-ingredient.d.ts +0 -1
  246. package/ui/hooks/ingredient/with-ingredient.d.ts.map +1 -1
  247. package/ui/hooks/ingredient-container/index.d.ts.map +1 -1
  248. package/ui/hooks/ingredient-container/use-ingredient-container.d.ts +1 -2
  249. package/ui/hooks/ingredient-container/use-ingredient-container.d.ts.map +1 -1
  250. package/ui/hooks/ingredient-container/with-ingredient-container.d.ts +0 -1
  251. package/ui/hooks/ingredient-container/with-ingredient-container.d.ts.map +1 -1
  252. package/ui/hooks/nozzle/index.d.ts.map +1 -1
  253. package/ui/hooks/nozzle/use-dispense-kit.d.ts +0 -1
  254. package/ui/hooks/nozzle/use-dispense-kit.d.ts.map +1 -1
  255. package/ui/hooks/nozzle/use-nozzle.d.ts +1 -2
  256. package/ui/hooks/nozzle/use-nozzle.d.ts.map +1 -1
  257. package/ui/hooks/nozzle/with-nozzle.d.ts +0 -1
  258. package/ui/hooks/nozzle/with-nozzle.d.ts.map +1 -1
  259. package/ui/hooks/nozzle-pour/index.d.ts.map +1 -1
  260. package/ui/hooks/nozzle-pour/use-nozzle-pour.d.ts +3 -4
  261. package/ui/hooks/nozzle-pour/use-nozzle-pour.d.ts.map +1 -1
  262. package/ui/hooks/pour/index.d.ts.map +1 -1
  263. package/ui/hooks/pour/use-pour.d.ts +4 -5
  264. package/ui/hooks/pour/use-pour.d.ts.map +1 -1
  265. package/ui/hooks/pump/index.d.ts.map +1 -1
  266. package/ui/hooks/pump/use-pump.d.ts +1 -2
  267. package/ui/hooks/pump/use-pump.d.ts.map +1 -1
  268. package/ui/hooks/pump/with-pump.d.ts +0 -1
  269. package/ui/hooks/pump/with-pump.d.ts.map +1 -1
  270. package/ui/hooks/utils/pour-strategy/hold-to-pour-intent-strategy.d.ts +1 -2
  271. package/ui/hooks/utils/pour-strategy/hold-to-pour-intent-strategy.d.ts.map +1 -1
  272. package/ui/hooks/utils/pour-strategy/hold-to-pour-strategy.d.ts +0 -1
  273. package/ui/hooks/utils/pour-strategy/hold-to-pour-strategy.d.ts.map +1 -1
  274. package/ui/hooks/utils/pour-strategy/index.d.ts.map +1 -1
  275. package/ui/hooks/utils/pour-strategy/pour-strategy.d.ts +1 -2
  276. package/ui/hooks/utils/pour-strategy/pour-strategy.d.ts.map +1 -1
  277. package/ui/hooks/utils/pour-strategy/tap-or-hold-to-pour-intent-strategy.d.ts +1 -2
  278. package/ui/hooks/utils/pour-strategy/tap-or-hold-to-pour-intent-strategy.d.ts.map +1 -1
  279. package/ui/hooks/utils/pour-strategy/tap-to-pour-intent-strategy.d.ts +1 -2
  280. package/ui/hooks/utils/pour-strategy/tap-to-pour-intent-strategy.d.ts.map +1 -1
  281. package/ui/hooks/utils/pour-strategy/tap-to-pour-strategy.d.ts +0 -1
  282. package/ui/hooks/utils/pour-strategy/tap-to-pour-strategy.d.ts.map +1 -1
  283. package/ui/index.d.ts.map +1 -1
  284. package/ui/utils/pour-context.d.ts.map +1 -1
  285. package/ui.cjs +69 -1
  286. package/ui.cjs.map +1 -1
  287. package/ui.d.ts +1 -0
  288. package/ui.js +66 -70
  289. package/ui.js.map +1 -1
  290. package/dispense-registration-manager-Cj0565Ze.cjs +0 -2
  291. package/dispense-registration-manager-Cj0565Ze.cjs.map +0 -1
  292. package/dispense-registration-manager-CzAqcL8D.js +0 -2044
  293. package/dispense-registration-manager-CzAqcL8D.js.map +0 -1
  294. package/extension-utils-BDyaRwRN.cjs +0 -2
  295. package/extension-utils-BDyaRwRN.cjs.map +0 -1
  296. package/extension-utils-DrsPfQWC.js.map +0 -1
  297. package/kos-models.json +0 -180
  298. package/pump-provider-Bytd6qXc.js +0 -1308
  299. package/pump-provider-Bytd6qXc.js.map +0 -1
  300. package/pump-provider-CTELJBW5.cjs +0 -2
  301. package/pump-provider-CTELJBW5.cjs.map +0 -1
@@ -0,0 +1,1803 @@
1
+ "use strict";
2
+ const jsxRuntime = require("@emotion/react/jsx-runtime");
3
+ const kosUiSdk = require("@kosdev-code/kos-ui-sdk");
4
+ const dispenseRegistrationManager = require("./dispense-registration-manager-BH0mkCQx.cjs");
5
+ const React = require("react");
6
+ const useAssembly = () => {
7
+ const modelId = dispenseRegistrationManager.Assembly.type;
8
+ const result = kosUiSdk.useKosModel({
9
+ modelId,
10
+ modelType: dispenseRegistrationManager.Assembly.type,
11
+ options: {}
12
+ });
13
+ return result;
14
+ };
15
+ function withAssembly(WrappedComponent) {
16
+ return (props) => {
17
+ const { model, status, KosModelLoader } = useAssembly();
18
+ return /* @__PURE__ */ jsxRuntime.jsx(KosModelLoader, { ...status, children: /* @__PURE__ */ jsxRuntime.jsx(WrappedComponent, { ...props, assembly: model }) });
19
+ };
20
+ }
21
+ const useAvailability = () => {
22
+ const modelId = dispenseRegistrationManager.Availability.type;
23
+ const result = kosUiSdk.useKosModel({
24
+ modelId,
25
+ modelType: dispenseRegistrationManager.Availability.type,
26
+ options: {}
27
+ });
28
+ return result;
29
+ };
30
+ function withBeverage(WrappedComponent) {
31
+ return (props) => {
32
+ const { model, status, KosModelLoader } = useAvailability();
33
+ return /* @__PURE__ */ jsxRuntime.jsx(KosModelLoader, { ...status, children: /* @__PURE__ */ jsxRuntime.jsx(WrappedComponent, { ...props, beverage: model }) });
34
+ };
35
+ }
36
+ const useBoard = (id) => {
37
+ const modelId = id;
38
+ const result = kosUiSdk.useKosModel({
39
+ modelId,
40
+ modelType: dispenseRegistrationManager.Board.type,
41
+ options: {}
42
+ });
43
+ return result;
44
+ };
45
+ function withBoard(WrappedComponent) {
46
+ return (id) => (props) => {
47
+ const { model, status, KosModelLoader } = useBoard(id);
48
+ return /* @__PURE__ */ jsxRuntime.jsx(KosModelLoader, { ...status, children: /* @__PURE__ */ jsxRuntime.jsx(WrappedComponent, { ...props, board: model }) });
49
+ };
50
+ }
51
+ const useBoardContainer = () => {
52
+ const modelId = dispenseRegistrationManager.BoardContainer.type;
53
+ const result = kosUiSdk.useKosModel({
54
+ modelId,
55
+ modelType: dispenseRegistrationManager.BoardContainer.type,
56
+ options: {}
57
+ });
58
+ return result;
59
+ };
60
+ function withBoardContainer(WrappedComponent) {
61
+ return (props) => {
62
+ const { model, status, KosModelLoader } = useBoardContainer();
63
+ return /* @__PURE__ */ jsxRuntime.jsx(KosModelLoader, { ...status, children: /* @__PURE__ */ jsxRuntime.jsx(WrappedComponent, { ...props, boardContainer: model }) });
64
+ };
65
+ }
66
+ const useNozzle = (path) => {
67
+ const modelId = path;
68
+ const result = kosUiSdk.useKosModel({
69
+ modelId,
70
+ modelType: dispenseRegistrationManager.Nozzle.type,
71
+ options: {
72
+ path
73
+ }
74
+ });
75
+ return result;
76
+ };
77
+ const Nozzle = React.createContext(void 0);
78
+ const NozzleProvider = ({ children, path }) => {
79
+ const { model, ready } = useNozzle(path);
80
+ const value = React.useMemo(() => {
81
+ if (ready && model) {
82
+ return { model };
83
+ }
84
+ return {};
85
+ }, [ready, model]);
86
+ return /* @__PURE__ */ jsxRuntime.jsx(Nozzle.Provider, { value, children });
87
+ };
88
+ const useNozzleContext = () => {
89
+ const context = React.useContext(Nozzle);
90
+ if (!context) {
91
+ throw new Error("useNozzleContext must be used within a NozzleProvider");
92
+ }
93
+ return context;
94
+ };
95
+ const useBeverages = ({
96
+ onBeverageSelected,
97
+ onBeverageListUpdated,
98
+ onClearBeverage,
99
+ companionType
100
+ }) => {
101
+ const { model: nozzle } = useNozzleContext();
102
+ const [beverages, setBeverages] = React.useState([]);
103
+ const [selectedBeverage, setSelectedBeverage] = React.useState(null);
104
+ const companions = React.useMemo(() => {
105
+ if (!companionType) return [];
106
+ return beverages.map(
107
+ (brand) => kosUiSdk.getKosCompanionModel(brand, companionType)
108
+ );
109
+ }, [beverages, companionType]);
110
+ const selectBeverage = React.useCallback(
111
+ async (beverage, context, forceUpdate) => {
112
+ setSelectedBeverage(beverage);
113
+ await nozzle?.setSelectedPourable({ beverage, context }, forceUpdate);
114
+ onBeverageSelected?.(beverage);
115
+ },
116
+ [nozzle, onBeverageSelected]
117
+ );
118
+ const clearBeverage = React.useCallback(async () => {
119
+ setSelectedBeverage(null);
120
+ await nozzle?.setSelectedPourable({ beverage: void 0 });
121
+ onClearBeverage?.();
122
+ }, [nozzle, onClearBeverage]);
123
+ React.useEffect(() => {
124
+ const disposer = kosUiSdk.kosAutoEffect(() => {
125
+ if (!nozzle) return;
126
+ const selectedBrand = nozzle.selectedBrand;
127
+ if (!selectedBrand) {
128
+ const allBeverages = nozzle.getGroupAvailabilityItems("beverages").filter((beverage) => beverage.visible);
129
+ setBeverages(allBeverages ?? []);
130
+ onBeverageListUpdated?.(allBeverages);
131
+ return;
132
+ }
133
+ const beverages2 = nozzle.getAvailabilityByParent(selectedBrand.id).filter((b) => b.visible);
134
+ setBeverages(beverages2 ?? []);
135
+ onBeverageListUpdated?.(beverages2);
136
+ });
137
+ return () => {
138
+ disposer();
139
+ };
140
+ }, [nozzle]);
141
+ return {
142
+ beverages,
143
+ beverageCompanions: companions,
144
+ selectBeverage,
145
+ selectedBeverage,
146
+ clearBeverage
147
+ };
148
+ };
149
+ const useBrands = ({
150
+ onBrandSelected,
151
+ onBrandCleared,
152
+ companionType
153
+ }) => {
154
+ const { model: nozzle } = useNozzleContext();
155
+ const [selectedBrand, setSelectedBrand] = React.useState(null);
156
+ const [brands, setBrands] = React.useState([]);
157
+ const companions = React.useMemo(() => {
158
+ if (!companionType) return [];
159
+ return brands.map((brand) => kosUiSdk.getKosCompanionModel(brand, companionType));
160
+ }, [brands, companionType]);
161
+ const selectBrand = React.useCallback(
162
+ async (brand, context, forceUpdate) => {
163
+ setSelectedBrand(brand);
164
+ if (forceUpdate) {
165
+ kosUiSdk.KosLog.warn(
166
+ `forceUpdate is not currently supported when setting brand`
167
+ );
168
+ }
169
+ nozzle?.setSelectedBrand(brand, context);
170
+ onBrandSelected?.(brand);
171
+ },
172
+ [nozzle, onBrandSelected]
173
+ );
174
+ const clearBrand = React.useCallback(() => {
175
+ setSelectedBrand(null);
176
+ nozzle?.setSelectedBrand(void 0);
177
+ onBrandCleared?.();
178
+ }, [nozzle, onBrandCleared]);
179
+ React.useEffect(() => {
180
+ const disposer = kosUiSdk.kosAutoEffect(() => {
181
+ if (!nozzle) return;
182
+ setBrands(nozzle.visibleBrands);
183
+ });
184
+ return () => {
185
+ disposer();
186
+ };
187
+ }, [nozzle]);
188
+ return {
189
+ brands,
190
+ brandCompanions: companions,
191
+ selectedBrand,
192
+ selectBrand,
193
+ clearBrand
194
+ };
195
+ };
196
+ class PourContext {
197
+ _data = /* @__PURE__ */ new Map();
198
+ get(key) {
199
+ return this._data.get(key);
200
+ }
201
+ set(key, value) {
202
+ this._data.set(key, value);
203
+ }
204
+ remove(key) {
205
+ this._data.delete(key);
206
+ }
207
+ has(key) {
208
+ return this._data.has(key);
209
+ }
210
+ }
211
+ const logger$7 = kosUiSdk.KosLog.createLogger({
212
+ name: "HoldToPourStrategy",
213
+ group: "kos-hooks"
214
+ });
215
+ const HoldToPourStrategy = {
216
+ name: "HoldToPourStrategy",
217
+ async initiate(nozzle) {
218
+ if (!nozzle?.canPour) {
219
+ logger$7.debug(`Nozzle ${nozzle?.id} cannot pour. Returning early.`);
220
+ return;
221
+ }
222
+ await nozzle?.pour();
223
+ },
224
+ async initiateEnded(nozzle) {
225
+ await nozzle?.cancelPour();
226
+ }
227
+ };
228
+ const logger$6 = kosUiSdk.KosLog.createLogger({
229
+ name: "useNozzlePour",
230
+ group: "kos-hooks"
231
+ });
232
+ const useNozzlePour = ({
233
+ onPour,
234
+ onPourCancel,
235
+ onBeforePour,
236
+ onBeforePourRejected,
237
+ pourContext,
238
+ strategy = HoldToPourStrategy
239
+ }) => {
240
+ const { model: nozzle } = useNozzleContext();
241
+ const [context, _setContext] = React.useState(
242
+ pourContext || new PourContext()
243
+ );
244
+ const handlePour = React.useCallback(async () => {
245
+ const canPour = onBeforePour ? await onBeforePour?.(context) : true;
246
+ if (canPour) {
247
+ logger$6.debug(
248
+ `[${strategy?.name}] - Pour initiated for nozzle ${nozzle?.id}.`
249
+ );
250
+ strategy?.initiate(nozzle);
251
+ onPour?.();
252
+ } else {
253
+ logger$6.debug(
254
+ `[${strategy?.name}] - Did not pass onBeforePour gate for nozzle ${nozzle?.id}. Cancelling pour.`
255
+ );
256
+ onBeforePourRejected?.();
257
+ }
258
+ }, [
259
+ onPour,
260
+ nozzle,
261
+ strategy,
262
+ onBeforePour,
263
+ onPourCancel,
264
+ context,
265
+ onBeforePourRejected
266
+ ]);
267
+ const handleCancelPour = React.useCallback(() => {
268
+ logger$6.debug(
269
+ `[${strategy?.name}] - Pour initiate ended called for nozzle ${nozzle?.id}.`
270
+ );
271
+ strategy?.initiateEnded?.(nozzle);
272
+ onPourCancel?.();
273
+ }, [onPourCancel, nozzle, strategy]);
274
+ const forceCancelPour = React.useCallback(() => {
275
+ logger$6.debug(`Force cancelling pour for nozzle ${nozzle?.id}.`);
276
+ nozzle?.cancelPour();
277
+ onPourCancel?.();
278
+ }, [onPourCancel, nozzle]);
279
+ const handleUpdateContext = React.useCallback(
280
+ (key, value) => {
281
+ context.set(key, value);
282
+ },
283
+ [context]
284
+ );
285
+ const handleRemoveFromContext = React.useCallback(
286
+ (key) => {
287
+ context.remove(key);
288
+ },
289
+ [context]
290
+ );
291
+ const handlers = kosUiSdk.usePressGesture({
292
+ onPressed: handlePour,
293
+ onRelease: handleCancelPour
294
+ });
295
+ return {
296
+ handlers: handlers.dom,
297
+ cancel: forceCancelPour,
298
+ updatePourContext: handleUpdateContext,
299
+ removeFromPourContext: handleRemoveFromContext,
300
+ status: nozzle
301
+ };
302
+ };
303
+ const useFlavors = ({
304
+ onFlavorSelected,
305
+ onFlavorCleared,
306
+ companionType
307
+ }) => {
308
+ const { model: nozzle } = useNozzleContext();
309
+ const flavors = React.useMemo(
310
+ () => nozzle?.getGroupAvailabilityItems("flavors").filter((f) => f.visible) ?? [],
311
+ [nozzle]
312
+ );
313
+ const companions = React.useMemo(() => {
314
+ if (!companionType) return [];
315
+ return flavors.map(
316
+ (flavor) => kosUiSdk.getKosCompanionModel(flavor, companionType)
317
+ );
318
+ }, [flavors, companionType]);
319
+ const [selectedFlavors, setSelectedFlavors] = React.useState([]);
320
+ const selectFlavor = React.useCallback(
321
+ async (flavor, context, forceUpdate) => {
322
+ setSelectedFlavors(
323
+ (previous) => previous?.includes(flavor) ? [...previous.filter((p) => p !== flavor)] : [...previous ?? [], flavor]
324
+ );
325
+ if (nozzle?.selectedPourable) {
326
+ const { beverage } = nozzle.selectedPourable;
327
+ await nozzle.setSelectedPourable(
328
+ {
329
+ beverage,
330
+ additional: selectedFlavors ?? [],
331
+ context
332
+ },
333
+ forceUpdate
334
+ );
335
+ }
336
+ onFlavorSelected?.(flavor, selectedFlavors ?? []);
337
+ },
338
+ [nozzle, onFlavorSelected, selectedFlavors]
339
+ );
340
+ const clear = React.useCallback(async () => {
341
+ setSelectedFlavors([]);
342
+ if (nozzle?.selectedPourable) {
343
+ const { beverage } = nozzle.selectedPourable;
344
+ nozzle.setSelectedPourable({ beverage });
345
+ onFlavorCleared?.();
346
+ }
347
+ }, [nozzle, onFlavorCleared]);
348
+ return {
349
+ flavors,
350
+ flavorCompanions: companions,
351
+ selectFlavor,
352
+ selectedFlavors,
353
+ clearFlavors: clear
354
+ };
355
+ };
356
+ const DISPENSE_GROUP_BRAND = "brands";
357
+ const DISPENSE_GROUP_BEVERAGE = "beverages";
358
+ const DISPENSE_GROUP_FLAVOR = "flavors";
359
+ const log$2 = kosUiSdk.KosLog.createLogger({ name: "use-cui-kit" });
360
+ const useCuiKit = ({
361
+ initialGroup = DISPENSE_GROUP_BRAND,
362
+ options = {}
363
+ }) => {
364
+ const [currentGroup, setCurrentGroup] = React.useState(initialGroup);
365
+ const { model: nozzle } = useNozzleContext();
366
+ const timersRef = React.useRef([]);
367
+ const updatePourContext = React.useRef();
368
+ const removeFromPourContext = React.useRef();
369
+ const onBrandSelected = React.useCallback(
370
+ (model) => {
371
+ setCurrentGroup(DISPENSE_GROUP_BEVERAGE);
372
+ const topic = `/kos/dispense/${nozzle?.path}/brand/selected/`;
373
+ kosUiSdk.EventBus.publish(topic, model);
374
+ },
375
+ [nozzle?.path]
376
+ );
377
+ const onBrandCleared = React.useCallback(() => {
378
+ const topic = `/kos/dispense/${nozzle?.path}/brand/cleared/`;
379
+ kosUiSdk.EventBus.publish(topic, {});
380
+ }, [nozzle?.path]);
381
+ const onBeverageListUpdated = React.useCallback(
382
+ (beverages2) => {
383
+ const topic = `/kos/dispense/${nozzle?.path}/beverage/list/updated/`;
384
+ kosUiSdk.EventBus.publish(topic, beverages2);
385
+ },
386
+ [nozzle?.path]
387
+ );
388
+ const onBeverageSelected = React.useCallback(
389
+ (model) => {
390
+ setCurrentGroup(DISPENSE_GROUP_FLAVOR);
391
+ updatePourContext.current?.("selectedBeverage", model);
392
+ const topic = `/kos/dispense/${nozzle?.path}/beverage/selected/`;
393
+ kosUiSdk.EventBus.publish(topic, model);
394
+ },
395
+ [nozzle?.path]
396
+ );
397
+ const onBeverageCleared = React.useCallback(() => {
398
+ const topic = `/kos/dispense/${nozzle?.path}/beverage/cleared/`;
399
+ removeFromPourContext.current?.("selectedBeverage");
400
+ kosUiSdk.EventBus.publish(topic, {});
401
+ }, [nozzle?.path]);
402
+ const onFlavorSelected = React.useCallback(
403
+ (model) => {
404
+ const topic = `/kos/dispense/${nozzle?.path}/flavor/selected/`;
405
+ kosUiSdk.EventBus.publish(topic, model);
406
+ },
407
+ [nozzle?.path]
408
+ );
409
+ const onFlavorCleared = React.useCallback(() => {
410
+ const topic = `/kos/dispense/${nozzle?.path}/flavor/cleared/`;
411
+ kosUiSdk.EventBus.publish(topic, {});
412
+ }, [nozzle?.path]);
413
+ const onPour = React.useCallback(() => {
414
+ const topic = `/kos/dispense/${nozzle?.path}/pour/`;
415
+ kosUiSdk.EventBus.publish(topic, {});
416
+ }, [nozzle?.path]);
417
+ const handleBeforePour = React.useCallback(
418
+ async (context) => {
419
+ const topic = `/kos/dispense/${nozzle?.path}/pre/pour/`;
420
+ kosUiSdk.EventBus.publish(topic, {});
421
+ return await onBeforePour?.(context) || true;
422
+ },
423
+ [nozzle?.path]
424
+ );
425
+ const handleBeforePourRejected = React.useCallback(async () => {
426
+ const topic = `/kos/dispense/${nozzle?.path}/pre/pour/rejected/`;
427
+ kosUiSdk.EventBus.publish(topic, {});
428
+ }, [nozzle?.path]);
429
+ const onPourCancel = React.useCallback(() => {
430
+ const topic = `/kos/dispense/${nozzle?.path}/pour/cancel/`;
431
+ kosUiSdk.EventBus.publish(topic, {});
432
+ }, [nozzle?.path]);
433
+ const { brands, selectBrand, selectedBrand, clearBrand, brandCompanions } = useBrands({
434
+ companionType: options.companionTypes?.brand,
435
+ onBrandSelected,
436
+ onBrandCleared
437
+ });
438
+ const {
439
+ beverages,
440
+ selectBeverage,
441
+ selectedBeverage,
442
+ clearBeverage,
443
+ beverageCompanions
444
+ } = useBeverages({
445
+ companionType: options.companionTypes?.beverage,
446
+ onBeverageSelected,
447
+ onClearBeverage: onBeverageCleared,
448
+ onBeverageListUpdated
449
+ });
450
+ const {
451
+ clearFlavors,
452
+ flavors,
453
+ selectFlavor,
454
+ selectedFlavors,
455
+ flavorCompanions
456
+ } = useFlavors({
457
+ companionType: options.companionTypes?.flavor,
458
+ onFlavorSelected,
459
+ onFlavorCleared
460
+ });
461
+ const [onBeforePour, setOnBeforePour] = React.useState();
462
+ const updateOnBeforePour = React.useCallback((callback) => {
463
+ setOnBeforePour(() => callback);
464
+ }, []);
465
+ const pour = useNozzlePour({
466
+ onPour,
467
+ onPourCancel,
468
+ onBeforePour: handleBeforePour,
469
+ onBeforePourRejected: handleBeforePourRejected
470
+ });
471
+ updatePourContext.current = pour.updatePourContext;
472
+ removeFromPourContext.current = pour.removeFromPourContext;
473
+ const back = React.useCallback(() => {
474
+ log$2.debug(`Navigating back from group: ${currentGroup}`);
475
+ switch (currentGroup) {
476
+ case DISPENSE_GROUP_BRAND:
477
+ clearBeverage();
478
+ clearBrand();
479
+ break;
480
+ case DISPENSE_GROUP_BEVERAGE:
481
+ case DISPENSE_GROUP_FLAVOR:
482
+ setCurrentGroup(initialGroup);
483
+ clearBeverage();
484
+ clearBrand();
485
+ break;
486
+ }
487
+ }, [clearBeverage, clearBrand, currentGroup, initialGroup]);
488
+ const home = React.useCallback(() => {
489
+ const topic = `/kos/dispense/${nozzle?.path}/home/`;
490
+ kosUiSdk.EventBus.publish(topic, {});
491
+ setCurrentGroup(initialGroup);
492
+ if (initialGroup === DISPENSE_GROUP_BRAND) {
493
+ clearBeverage();
494
+ clearBrand();
495
+ }
496
+ if (initialGroup === DISPENSE_GROUP_BEVERAGE) {
497
+ clearBeverage();
498
+ }
499
+ }, [clearBeverage, clearBrand, initialGroup]);
500
+ const pauseTimers = React.useCallback(() => {
501
+ if (timersRef.current.length === 0) {
502
+ log$2.debug("No timers to pause.");
503
+ return;
504
+ }
505
+ log$2.debug(`Pausing ${timersRef.current.length} timers.`);
506
+ timersRef.current.forEach((timer) => {
507
+ log$2.debug(`Pausing timer with id ${timer.id}.`);
508
+ timer.pause();
509
+ });
510
+ }, []);
511
+ const restartTimers = React.useCallback(() => {
512
+ if (timersRef.current.length === 0) {
513
+ log$2.debug("No timers to restart.");
514
+ return;
515
+ }
516
+ log$2.debug(`Restarting ${timersRef.current.length} timers.`);
517
+ timersRef.current.forEach((timer) => {
518
+ log$2.debug(`Restarting timer with id ${timer.id}.`);
519
+ timer.restart();
520
+ });
521
+ }, []);
522
+ const addTimer = React.useCallback((timer) => {
523
+ if (!timer) {
524
+ return;
525
+ }
526
+ if (timersRef.current.some((t) => t.id === timer.id)) {
527
+ log$2.debug(`Timer with id ${timer.id} already exists.`);
528
+ return;
529
+ }
530
+ timersRef.current.push(timer);
531
+ }, []);
532
+ return {
533
+ timers: {
534
+ add: addTimer,
535
+ pause: pauseTimers,
536
+ restart: restartTimers
537
+ },
538
+ nav: {
539
+ currentGroup,
540
+ back,
541
+ home
542
+ },
543
+ pour,
544
+ updateOnBeforePour,
545
+ selections: {
546
+ [DISPENSE_GROUP_BRAND]: selectedBrand,
547
+ [DISPENSE_GROUP_BEVERAGE]: selectedBeverage,
548
+ [DISPENSE_GROUP_FLAVOR]: selectedFlavors
549
+ },
550
+ [DISPENSE_GROUP_BRAND]: {
551
+ models: brands,
552
+ companions: brandCompanions,
553
+ clear: clearBrand,
554
+ handlers: {
555
+ onSelected: selectBrand
556
+ }
557
+ },
558
+ [DISPENSE_GROUP_BEVERAGE]: {
559
+ models: beverages,
560
+ companions: beverageCompanions,
561
+ clear: clearBeverage,
562
+ handlers: {
563
+ onSelected: selectBeverage
564
+ }
565
+ },
566
+ [DISPENSE_GROUP_FLAVOR]: {
567
+ models: flavors,
568
+ companions: flavorCompanions,
569
+ clear: clearFlavors,
570
+ handlers: {
571
+ onSelected: selectFlavor
572
+ }
573
+ }
574
+ };
575
+ };
576
+ const useAmbientAttractTimers = (props) => {
577
+ const { model: nozzle } = useNozzleContext();
578
+ const [attractTimer, setAttractTimer] = React.useState(null);
579
+ const {
580
+ onAmbientTimer,
581
+ onAttractTimer,
582
+ onResetAttractTimer,
583
+ onResumeAttractTimer,
584
+ defaultAttractTime,
585
+ defaultAmbientTime
586
+ } = props;
587
+ const handleAmbientTimer = React.useCallback(() => {
588
+ if (onAmbientTimer) {
589
+ kosUiSdk.KosLog.info("Ambient timer expired. Calling callback");
590
+ onAmbientTimer?.();
591
+ }
592
+ }, [onAmbientTimer]);
593
+ const handleAttractTimer = React.useCallback(() => {
594
+ if (onAttractTimer) {
595
+ kosUiSdk.KosLog.info("Attract timer expired. Calling callback");
596
+ onAttractTimer?.();
597
+ }
598
+ }, [onAttractTimer]);
599
+ const handleResetAttractTimer = React.useCallback(() => {
600
+ if (attractTimer) {
601
+ attractTimer.restart();
602
+ onResetAttractTimer?.();
603
+ }
604
+ }, [attractTimer, onResetAttractTimer]);
605
+ const handlePauseAttractTimer = React.useCallback(() => {
606
+ if (attractTimer) {
607
+ attractTimer.reset();
608
+ onResetAttractTimer?.();
609
+ }
610
+ }, [attractTimer, onResetAttractTimer]);
611
+ const handleResume = React.useCallback(() => {
612
+ if (attractTimer) {
613
+ attractTimer.pause();
614
+ onResumeAttractTimer?.();
615
+ }
616
+ }, [attractTimer, onResumeAttractTimer]);
617
+ React.useEffect(() => {
618
+ if (nozzle && defaultAttractTime) {
619
+ kosUiSdk.KosLog.info("Nozzle is available. Creating timers");
620
+ const timer = kosUiSdk.TimerManager.createTimer(
621
+ "attract-timer-" + nozzle.path,
622
+ defaultAttractTime
623
+ );
624
+ if (defaultAttractTime) {
625
+ timer?.addTimeoutAction({
626
+ name: "attract-timer",
627
+ remainingTime: 0,
628
+ action: handleAttractTimer
629
+ });
630
+ }
631
+ if (defaultAmbientTime) {
632
+ timer?.addTimeoutAction({
633
+ name: "ambient-timer",
634
+ remainingTime: defaultAmbientTime,
635
+ action: handleAmbientTimer
636
+ });
637
+ }
638
+ if (defaultAttractTime) {
639
+ timer?.start();
640
+ }
641
+ setAttractTimer(timer ?? null);
642
+ return () => {
643
+ timer?.reset();
644
+ setAttractTimer(null);
645
+ };
646
+ }
647
+ return () => {
648
+ kosUiSdk.KosLog.info("Nozzle is not available. No timers to clear");
649
+ };
650
+ }, [
651
+ defaultAmbientTime,
652
+ defaultAttractTime,
653
+ handleAmbientTimer,
654
+ handleAttractTimer,
655
+ nozzle
656
+ ]);
657
+ return {
658
+ attractTimer,
659
+ restart: handleResetAttractTimer,
660
+ pause: handlePauseAttractTimer,
661
+ resume: handleResume
662
+ };
663
+ };
664
+ const DISPENSE_EVENT_CONFIGS = [
665
+ { path: "brand/selected", callbackKey: "onBrandSelected" },
666
+ { path: "brand/cleared", callbackKey: "onBrandCleared" },
667
+ { path: "beverage/list/updated", callbackKey: "onBeverageListUpdated" },
668
+ { path: "beverage/selected", callbackKey: "onBeverageSelected" },
669
+ { path: "beverage/cleared", callbackKey: "onBeverageCleared" },
670
+ { path: "flavor/selected", callbackKey: "onFlavorSelected" },
671
+ { path: "flavor/cleared", callbackKey: "onFlavorCleared" },
672
+ { path: "pour", callbackKey: "onPour" },
673
+ { path: "pour/cancel", callbackKey: "onPourCancel" },
674
+ { path: "pre/pour/rejected", callbackKey: "onBeforePourRejected" },
675
+ { path: "ambient/start", callbackKey: "onAmbientTimer" },
676
+ { path: "attract/start", callbackKey: "onAttractTimer" },
677
+ { path: "attract/resume", callbackKey: "onResumeAttractTimer" },
678
+ { path: "idle/timeout", callbackKey: "onIdleTimeout" },
679
+ { path: "are-you-there/timeout", callbackKey: "onAreYouThereTimeout" },
680
+ { path: "init", callbackKey: "onInit" },
681
+ { path: "home", callbackKey: "onReturnToHome" }
682
+ ];
683
+ function buildDispenseTopics(nozzlePath, callbacks) {
684
+ if (!nozzlePath) {
685
+ return [];
686
+ }
687
+ return DISPENSE_EVENT_CONFIGS.filter(
688
+ (config) => callbacks[config.callbackKey] !== void 0
689
+ ).map((config) => {
690
+ return {
691
+ topic: `/kos/dispense/${nozzlePath}/${config.path}/`,
692
+ callback: callbacks[config.callbackKey]
693
+ };
694
+ });
695
+ }
696
+ const subscribe = (topic, callback) => {
697
+ if (callback) {
698
+ const callbackWrapper = (args) => {
699
+ if (args && args.body) {
700
+ callback(args.body);
701
+ }
702
+ };
703
+ const result = kosUiSdk.EventBus.subscribe(topic, callbackWrapper);
704
+ return result.unsubscribe;
705
+ }
706
+ return void 0;
707
+ };
708
+ const useDispenseLifecycle = ({
709
+ onInit,
710
+ onBrandSelected,
711
+ onBrandCleared,
712
+ onBeverageCleared,
713
+ onBeverageSelected,
714
+ onBeverageListUpdated,
715
+ onFlavorCleared,
716
+ onFlavorSelected,
717
+ onReturnToHome,
718
+ onPour,
719
+ onPourCancel,
720
+ onBeforePourRejected,
721
+ onAmbientTimer,
722
+ onAttractTimer,
723
+ onResumeAttractTimer,
724
+ onIdleTimeout,
725
+ onAreYouThereTimeout
726
+ }) => {
727
+ const { model: nozzle } = useNozzleContext();
728
+ React.useEffect(() => {
729
+ const topics = buildDispenseTopics(nozzle?.path, {
730
+ onBrandSelected,
731
+ onBrandCleared,
732
+ onBeverageListUpdated,
733
+ onBeverageSelected,
734
+ onBeverageCleared,
735
+ onFlavorSelected,
736
+ onFlavorCleared,
737
+ onPour,
738
+ onPourCancel,
739
+ onBeforePourRejected,
740
+ onAmbientTimer,
741
+ onAttractTimer,
742
+ onResumeAttractTimer,
743
+ onIdleTimeout,
744
+ onAreYouThereTimeout,
745
+ onInit,
746
+ onReturnToHome
747
+ });
748
+ const disposers = topics.map(
749
+ ({ topic, callback }) => subscribe(topic, callback)
750
+ );
751
+ return () => {
752
+ disposers.forEach((disposer) => disposer?.());
753
+ };
754
+ }, [
755
+ nozzle?.path,
756
+ onAmbientTimer,
757
+ onAttractTimer,
758
+ onBeverageCleared,
759
+ onBeverageSelected,
760
+ onBeverageListUpdated,
761
+ onBrandCleared,
762
+ onBrandSelected,
763
+ onFlavorCleared,
764
+ onFlavorSelected,
765
+ onPour,
766
+ onPourCancel,
767
+ onBeforePourRejected,
768
+ onResumeAttractTimer,
769
+ onIdleTimeout,
770
+ onAreYouThereTimeout,
771
+ onInit,
772
+ onReturnToHome
773
+ ]);
774
+ };
775
+ const log$1 = kosUiSdk.KosLog.createLogger({ name: "useCuiKitTimers" });
776
+ const useCuiKitTimers = (props) => {
777
+ const { model: nozzle } = useNozzleContext();
778
+ const [idleTimer, setIdleTimer] = React.useState(null);
779
+ const {
780
+ onAreYouThereTimer,
781
+ onIdleTimer,
782
+ onResetIdleTimer,
783
+ defaultAreYouThereTime = 10,
784
+ defaultIdleTime = 20
785
+ } = props;
786
+ const hasAreYouThereFiredRef = React.useRef(false);
787
+ const handleAreYouThereTimer = React.useCallback(() => {
788
+ if (!hasAreYouThereFiredRef.current && onAreYouThereTimer) {
789
+ kosUiSdk.KosLog.info("Are you there timer expired. Calling callback");
790
+ hasAreYouThereFiredRef.current = true;
791
+ onAreYouThereTimer?.();
792
+ }
793
+ }, [onAreYouThereTimer]);
794
+ const handleIdleTimer = React.useCallback(() => {
795
+ log$1.debug(
796
+ "handleIdleTimer called in useCuiKitTimers, onIdleTimer exists:",
797
+ !!onIdleTimer
798
+ );
799
+ if (onIdleTimer) {
800
+ log$1.debug("Idle timer expired. Calling callback");
801
+ onIdleTimer?.();
802
+ } else {
803
+ log$1.debug("No onIdleTimer callback provided!");
804
+ }
805
+ }, [onIdleTimer]);
806
+ const handleRestartIdleTimer = React.useCallback(() => {
807
+ log$1.debug(`TIMER RESTART called for ${props.prefix ?? ""}timer`);
808
+ if (idleTimer) {
809
+ idleTimer.restart();
810
+ hasAreYouThereFiredRef.current = false;
811
+ onResetIdleTimer?.();
812
+ }
813
+ }, [idleTimer, onResetIdleTimer, props.prefix]);
814
+ const handlePauseIdleTimer = React.useCallback(() => {
815
+ log$1.debug(`TIMER PAUSE/RESET called for ${props.prefix ?? ""}timer`);
816
+ if (idleTimer) {
817
+ idleTimer.reset();
818
+ hasAreYouThereFiredRef.current = false;
819
+ onResetIdleTimer?.();
820
+ }
821
+ }, [idleTimer, onResetIdleTimer, props.prefix]);
822
+ React.useEffect(() => {
823
+ log$1.debug(
824
+ `useCuiKitTimers effect triggered - nozzle: ${!!nozzle}, path: ${nozzle?.path}, callbacks: handleIdle=${!!handleIdleTimer}, handleAreYouThere=${!!handleAreYouThereTimer}`
825
+ );
826
+ if (nozzle) {
827
+ log$1.info("Nozzle is available. Creating timers");
828
+ const timer = kosUiSdk.TimerManager.createTimer(
829
+ `${props.prefix ?? ""}idle-timer-${nozzle.path}`,
830
+ defaultIdleTime
831
+ );
832
+ log$1.debug(
833
+ `Adding idle timer action for ${props.prefix ?? ""}idle-timer-${nozzle.path} with callback:`,
834
+ !!handleIdleTimer
835
+ );
836
+ timer?.addTimeoutAction({
837
+ name: "idle-timer",
838
+ remainingTime: 0,
839
+ action: handleIdleTimer
840
+ });
841
+ timer?.addTimeoutAction({
842
+ name: "are-you-there-timer",
843
+ remainingTime: defaultAreYouThereTime,
844
+ action: handleAreYouThereTimer
845
+ });
846
+ setIdleTimer(timer ?? null);
847
+ return () => {
848
+ timer?.reset();
849
+ setIdleTimer(null);
850
+ };
851
+ }
852
+ return () => {
853
+ log$1.info("Nozzle is not available. No timers to clear");
854
+ };
855
+ }, [
856
+ defaultAreYouThereTime,
857
+ defaultIdleTime,
858
+ handleAreYouThereTimer,
859
+ handleIdleTimer,
860
+ nozzle,
861
+ props.prefix
862
+ ]);
863
+ return {
864
+ idleTimer,
865
+ restart: handleRestartIdleTimer,
866
+ pause: handlePauseIdleTimer
867
+ };
868
+ };
869
+ const log = kosUiSdk.KosLog.createLogger({ name: "useDefaultCuiKitLifecycle" });
870
+ const useDefaultCuiKitLifecycle = ({
871
+ kit,
872
+ inactivity,
873
+ pour,
874
+ screens,
875
+ onBeforeAreYouThereTimer,
876
+ areYouThereRejectionPolicy = "pause"
877
+ }) => {
878
+ const [showAmbientScreen, setShowAmbientScreen] = React.useState(false);
879
+ const [showAttractScreen, setShowAttractScreen] = React.useState(false);
880
+ const { model: nozzle } = useNozzleContext();
881
+ const [hasPoured, setHasPoured] = React.useState(false);
882
+ const idleTimeout = inactivity?.idleTimeout ?? 15;
883
+ const areYouThereTimeout = inactivity?.areYouThereTimeoutOffset ?? 10;
884
+ const idlePourTimeout = pour?.idleTimeout ?? inactivity?.idleTimeout ?? 10;
885
+ const areYouTherePourTimeout = pour?.areYouThereTimeoutOffset ?? inactivity?.areYouThereTimeoutOffset ?? 5;
886
+ const ambientTimeout = screens?.ambientTimeoutOffset;
887
+ const attractTimeout = screens?.attractTimeout;
888
+ const handleIdleTimeout = React.useCallback(() => {
889
+ log.info("handleIdleTimeout called - navigating home and publishing event");
890
+ setShowAreYouThere(false);
891
+ kit?.nav.home();
892
+ if (nozzle) {
893
+ const topic = `/kos/dispense/${nozzle.path}/idle/timeout/`;
894
+ kosUiSdk.EventBus.publish(topic, {});
895
+ }
896
+ }, [kit?.nav?.home, nozzle]);
897
+ const handleResetIdleTimer = React.useCallback(() => {
898
+ log.info("handleResetIdleTimer called - resetting idle timer");
899
+ setShowAreYouThere(false);
900
+ }, []);
901
+ const handleAmbientTimer = React.useCallback(() => {
902
+ if (ambientTimeout) {
903
+ setShowAmbientScreen(true);
904
+ setShowAttractScreen(false);
905
+ if (nozzle) {
906
+ const topic = `/kos/dispense/${nozzle.path}/ambient/start/`;
907
+ kosUiSdk.EventBus.publish(topic, {});
908
+ }
909
+ }
910
+ }, [ambientTimeout, nozzle]);
911
+ const handleAttractTimer = React.useCallback(() => {
912
+ if (attractTimeout) {
913
+ setShowAttractScreen(true);
914
+ setShowAmbientScreen(false);
915
+ if (nozzle) {
916
+ const topic = `/kos/dispense/${nozzle.path}/attract/start/`;
917
+ kosUiSdk.EventBus.publish(topic, {});
918
+ }
919
+ }
920
+ }, [attractTimeout, nozzle]);
921
+ const handleAttractResume = React.useCallback(() => {
922
+ if (attractTimeout) {
923
+ setShowAttractScreen(false);
924
+ setShowAmbientScreen(false);
925
+ kit?.nav.home();
926
+ if (nozzle) {
927
+ const topic = `/kos/dispense/${nozzle.path}/attract/resume/`;
928
+ kosUiSdk.EventBus.publish(topic, {});
929
+ }
930
+ }
931
+ }, [kit?.nav, attractTimeout, nozzle]);
932
+ const {
933
+ pause: ambientPause,
934
+ restart: ambientRestart,
935
+ attractTimer
936
+ } = useAmbientAttractTimers({
937
+ defaultAmbientTime: ambientTimeout,
938
+ defaultAttractTime: attractTimeout,
939
+ onAmbientTimer: handleAmbientTimer,
940
+ onAttractTimer: handleAttractTimer,
941
+ onResumeAttractTimer: handleAttractResume
942
+ });
943
+ kit?.timers?.add(attractTimer);
944
+ const [showAreYouThere, setShowAreYouThere] = React.useState(false);
945
+ log.info(
946
+ "Creating idle timer with timeout:",
947
+ idleTimeout,
948
+ "seconds and callback:",
949
+ !!handleIdleTimeout
950
+ );
951
+ const { pause, restart, idleTimer } = useCuiKitTimers({
952
+ defaultAreYouThereTime: areYouThereTimeout,
953
+ defaultIdleTime: idleTimeout,
954
+ onIdleTimer: handleIdleTimeout,
955
+ onResetIdleTimer: handleResetIdleTimer
956
+ });
957
+ log.info(
958
+ `Creating pour timer with timeout: ${idlePourTimeout} seconds and callback: ${!!handleIdleTimeout}`
959
+ );
960
+ const {
961
+ pause: pausePourTimer,
962
+ restart: restartPourTimer,
963
+ idleTimer: pourIdleTimer
964
+ } = useCuiKitTimers({
965
+ defaultAreYouThereTime: areYouTherePourTimeout,
966
+ defaultIdleTime: idlePourTimeout,
967
+ onIdleTimer: handleIdleTimeout,
968
+ prefix: "pour-"
969
+ });
970
+ const handleAreYouThereTimer = React.useCallback(async () => {
971
+ let shouldShowAreYouThere = true;
972
+ if (onBeforeAreYouThereTimer) {
973
+ try {
974
+ shouldShowAreYouThere = await onBeforeAreYouThereTimer();
975
+ } catch (error) {
976
+ log.error(`onBeforeAreYouThereTimer callback failed: ${error}`);
977
+ shouldShowAreYouThere = false;
978
+ }
979
+ }
980
+ if (shouldShowAreYouThere) {
981
+ if (nozzle) {
982
+ const topic = `/kos/dispense/${nozzle.path}/are-you-there/timeout/`;
983
+ kosUiSdk.EventBus.publish(topic, {});
984
+ }
985
+ setShowAreYouThere(true);
986
+ if (hasPoured) {
987
+ pausePourTimer();
988
+ } else {
989
+ pause();
990
+ }
991
+ } else {
992
+ switch (areYouThereRejectionPolicy) {
993
+ case "pause":
994
+ if (hasPoured) {
995
+ pausePourTimer();
996
+ } else {
997
+ pause();
998
+ }
999
+ break;
1000
+ case "restart":
1001
+ if (hasPoured) {
1002
+ restartPourTimer();
1003
+ } else {
1004
+ restart();
1005
+ }
1006
+ break;
1007
+ }
1008
+ }
1009
+ }, [onBeforeAreYouThereTimer, nozzle, areYouThereRejectionPolicy, hasPoured]);
1010
+ const clearAreYouThere = React.useCallback(() => {
1011
+ setShowAreYouThere(false);
1012
+ ambientPause();
1013
+ if (hasPoured) {
1014
+ restartPourTimer();
1015
+ pause();
1016
+ } else {
1017
+ restart();
1018
+ pausePourTimer();
1019
+ }
1020
+ }, [hasPoured, pause, pausePourTimer, restart, restartPourTimer]);
1021
+ React.useEffect(() => {
1022
+ if (idleTimer) {
1023
+ idleTimer.addTimeoutAction({
1024
+ name: "are-you-there-timer",
1025
+ remainingTime: areYouThereTimeout,
1026
+ action: handleAreYouThereTimer
1027
+ });
1028
+ }
1029
+ }, [idleTimer, areYouThereTimeout, handleAreYouThereTimer]);
1030
+ React.useEffect(() => {
1031
+ if (pourIdleTimer) {
1032
+ pourIdleTimer.addTimeoutAction({
1033
+ name: "pour-are-you-there-timer",
1034
+ remainingTime: areYouTherePourTimeout,
1035
+ action: handleAreYouThereTimer
1036
+ });
1037
+ }
1038
+ }, [pourIdleTimer, areYouTherePourTimeout, handleAreYouThereTimer]);
1039
+ kit?.timers?.add(idleTimer);
1040
+ kit?.timers?.add(pourIdleTimer);
1041
+ const handlePour = React.useCallback(() => {
1042
+ setHasPoured(false);
1043
+ pausePourTimer();
1044
+ pause();
1045
+ ambientPause();
1046
+ }, [pause, pausePourTimer]);
1047
+ const handlePourCancel = React.useCallback(() => {
1048
+ setHasPoured(true);
1049
+ log.info("restarting pour timer");
1050
+ restartPourTimer();
1051
+ ambientPause();
1052
+ pause();
1053
+ }, [pause, restartPourTimer]);
1054
+ const handleBeforePourRejected = React.useCallback(() => {
1055
+ setHasPoured(false);
1056
+ log.info("restarting pour timer on before pour rejected");
1057
+ pausePourTimer();
1058
+ restart();
1059
+ }, []);
1060
+ const handleBrandSelected = React.useCallback(() => {
1061
+ ambientPause();
1062
+ setShowAttractScreen(false);
1063
+ setShowAmbientScreen(false);
1064
+ restart();
1065
+ }, [ambientPause, restart]);
1066
+ const handleBrandCleared = React.useCallback(() => {
1067
+ setShowAttractScreen(false);
1068
+ setShowAmbientScreen(false);
1069
+ setHasPoured(false);
1070
+ pausePourTimer();
1071
+ ambientRestart();
1072
+ }, [ambientRestart, pausePourTimer]);
1073
+ const handleBeverageSelected = React.useCallback(() => {
1074
+ setShowAttractScreen(false);
1075
+ setShowAmbientScreen(false);
1076
+ setHasPoured(false);
1077
+ ambientPause();
1078
+ restart();
1079
+ }, [ambientPause, restart]);
1080
+ const handleBeverageCleared = React.useCallback(() => {
1081
+ setShowAttractScreen(false);
1082
+ setShowAmbientScreen(false);
1083
+ setHasPoured(false);
1084
+ ambientRestart();
1085
+ pause();
1086
+ pausePourTimer();
1087
+ }, [ambientRestart, pause, pausePourTimer]);
1088
+ const handleInit = React.useCallback(() => {
1089
+ setShowAttractScreen(false);
1090
+ setShowAmbientScreen(false);
1091
+ ambientRestart();
1092
+ pause();
1093
+ }, [ambientRestart, pause]);
1094
+ useDispenseLifecycle({
1095
+ onBrandSelected: handleBrandSelected,
1096
+ onBrandCleared: handleBrandCleared,
1097
+ onBeverageSelected: handleBeverageSelected,
1098
+ onBeverageCleared: handleBeverageCleared,
1099
+ onPour: handlePour,
1100
+ onPourCancel: handlePourCancel,
1101
+ onBeforePourRejected: handleBeforePourRejected,
1102
+ onInit: handleInit
1103
+ // Note: Timer-related handlers (onIdleTimeout, onAmbientTimer, onAttractTimer,
1104
+ // onResumeAttractTimer, onAreYouThereTimeout) are NOT included here since this
1105
+ // component's own timer hooks call those handlers directly. Including them would
1106
+ // create circular event loops.
1107
+ });
1108
+ const areYouThereCountdown = hasPoured ? areYouTherePourTimeout : areYouThereTimeout;
1109
+ React.useEffect(() => {
1110
+ if (nozzle && attractTimer) {
1111
+ const topic = `/kos/dispense/${nozzle?.path}/init/`;
1112
+ kosUiSdk.EventBus.publish(topic, {});
1113
+ }
1114
+ }, [nozzle, attractTimer]);
1115
+ return {
1116
+ showAreYouThere,
1117
+ clearAreYouThere,
1118
+ pauseIdleTimer: pause,
1119
+ restartIdleTimer: restart,
1120
+ areYouThereCountdown,
1121
+ showAmbientScreen,
1122
+ showAttractScreen,
1123
+ pauseScreenTimer: ambientPause,
1124
+ restartScreenTimer: ambientRestart
1125
+ };
1126
+ };
1127
+ const useDeviceAssembly = () => {
1128
+ const modelId = dispenseRegistrationManager.DeviceAssembly.type;
1129
+ const result = kosUiSdk.useKosModel({
1130
+ modelId,
1131
+ modelType: dispenseRegistrationManager.DeviceAssembly.type,
1132
+ options: {}
1133
+ });
1134
+ return result;
1135
+ };
1136
+ function withDeviceAssembly(WrappedComponent) {
1137
+ return (props) => {
1138
+ const { model, status, KosModelLoader } = useDeviceAssembly();
1139
+ return /* @__PURE__ */ jsxRuntime.jsx(KosModelLoader, { ...status, children: /* @__PURE__ */ jsxRuntime.jsx(WrappedComponent, { ...props, deviceAssembly: model }) });
1140
+ };
1141
+ }
1142
+ const useHolder = (id) => {
1143
+ const modelId = id;
1144
+ const result = kosUiSdk.useKosModel({
1145
+ modelId,
1146
+ modelType: dispenseRegistrationManager.Holder.type,
1147
+ options: {}
1148
+ });
1149
+ return result;
1150
+ };
1151
+ function withHolder(id, WrappedComponent) {
1152
+ return (props) => {
1153
+ const { model, status, KosModelLoader } = useHolder(id);
1154
+ return /* @__PURE__ */ jsxRuntime.jsx(KosModelLoader, { ...status, children: /* @__PURE__ */ jsxRuntime.jsx(WrappedComponent, { ...props, holder: model }) });
1155
+ };
1156
+ }
1157
+ const useHolderContainer = () => {
1158
+ const modelId = dispenseRegistrationManager.HolderContainer.type;
1159
+ const result = kosUiSdk.useKosModel({
1160
+ modelId,
1161
+ modelType: dispenseRegistrationManager.HolderContainer.type,
1162
+ options: {}
1163
+ });
1164
+ return result;
1165
+ };
1166
+ function withHolderContainer(WrappedComponent) {
1167
+ return (props) => {
1168
+ const { model, status, KosModelLoader } = useHolderContainer();
1169
+ return /* @__PURE__ */ jsxRuntime.jsx(KosModelLoader, { ...status, children: /* @__PURE__ */ jsxRuntime.jsx(WrappedComponent, { ...props, holderContainer: model }) });
1170
+ };
1171
+ }
1172
+ const useIngredient = () => {
1173
+ const modelId = dispenseRegistrationManager.Ingredient.type;
1174
+ const result = kosUiSdk.useKosModel({
1175
+ modelId,
1176
+ modelType: dispenseRegistrationManager.Ingredient.type,
1177
+ options: {}
1178
+ });
1179
+ return result;
1180
+ };
1181
+ const logger$5 = kosUiSdk.KosLog.createLogger({
1182
+ name: "HoldToPourIntentStrategy",
1183
+ group: "kos-hooks"
1184
+ });
1185
+ const HoldToPourIntentStrategy = {
1186
+ name: "HoldToPourIntentStrategy",
1187
+ async initiate(model, intent) {
1188
+ if (!model?.canPour) {
1189
+ logger$5.debug(`${model?.id} cannot pour. Returning early.`);
1190
+ return;
1191
+ }
1192
+ if (intent) {
1193
+ logger$5.debug(`performing intent: ${intent}`);
1194
+ await model?.performIntent(intent);
1195
+ } else {
1196
+ logger$5.debug("no intent provided. Returning early.");
1197
+ }
1198
+ },
1199
+ async initiateEnded(nozzle) {
1200
+ await nozzle?.cancelPour();
1201
+ }
1202
+ };
1203
+ const logger$4 = kosUiSdk.KosLog.createLogger({
1204
+ name: "useNozzlePour",
1205
+ group: "kos-hooks"
1206
+ });
1207
+ const useIngredientPour = ({
1208
+ onPour,
1209
+ onPourCancel,
1210
+ intentContainer,
1211
+ strategy = HoldToPourIntentStrategy
1212
+ }) => {
1213
+ const handlePour = React.useCallback(() => {
1214
+ logger$4.debug(
1215
+ `[${strategy?.name}] - Pour initiated for model ${intentContainer?.id}.`
1216
+ );
1217
+ strategy?.initiate(intentContainer);
1218
+ onPour?.();
1219
+ }, [onPour, intentContainer, strategy]);
1220
+ const handleCancelPour = React.useCallback(() => {
1221
+ logger$4.debug(
1222
+ `[${strategy?.name}] - Pour initiate ended called for nozzle ${intentContainer?.id}.`
1223
+ );
1224
+ strategy?.initiateEnded?.(intentContainer);
1225
+ onPourCancel?.();
1226
+ }, [onPourCancel, intentContainer, strategy]);
1227
+ const forceCancelPour = React.useCallback(() => {
1228
+ logger$4.debug(`Force cancelling pour for nozzle ${intentContainer?.id}.`);
1229
+ intentContainer?.cancelPour();
1230
+ onPourCancel?.();
1231
+ }, [onPourCancel, intentContainer]);
1232
+ const handlers = kosUiSdk.usePressGesture({
1233
+ onPressed: handlePour,
1234
+ onRelease: handleCancelPour
1235
+ });
1236
+ return {
1237
+ handlers: handlers.dom,
1238
+ cancel: forceCancelPour,
1239
+ status: intentContainer
1240
+ };
1241
+ };
1242
+ function withIngredient(WrappedComponent) {
1243
+ return (props) => {
1244
+ const { model, status, KosModelLoader } = useIngredient();
1245
+ return /* @__PURE__ */ jsxRuntime.jsx(KosModelLoader, { ...status, children: /* @__PURE__ */ jsxRuntime.jsx(WrappedComponent, { ...props, ingredient: model }) });
1246
+ };
1247
+ }
1248
+ const useIngredientContainer = () => {
1249
+ const modelId = dispenseRegistrationManager.IngredientContainer.type;
1250
+ const result = kosUiSdk.useKosModel({
1251
+ modelId,
1252
+ modelType: dispenseRegistrationManager.IngredientContainer.type,
1253
+ options: {}
1254
+ });
1255
+ return result;
1256
+ };
1257
+ function withIngredientContainer(WrappedComponent) {
1258
+ return (props) => {
1259
+ const { model, status, KosModelLoader } = useIngredientContainer();
1260
+ return /* @__PURE__ */ jsxRuntime.jsx(KosModelLoader, { ...status, children: /* @__PURE__ */ jsxRuntime.jsx(WrappedComponent, { ...props, ingredientContainer: model }) });
1261
+ };
1262
+ }
1263
+ function withNozzle(path, WrappedComponent) {
1264
+ return (props) => {
1265
+ const { model, status, KosModelLoader } = useNozzle(path);
1266
+ return /* @__PURE__ */ jsxRuntime.jsx(KosModelLoader, { ...status, children: /* @__PURE__ */ jsxRuntime.jsx(WrappedComponent, { ...props, nozzle: model }) });
1267
+ };
1268
+ }
1269
+ const logger$3 = kosUiSdk.KosLog.createLogger({
1270
+ name: "usePour",
1271
+ group: "kos-hooks"
1272
+ });
1273
+ const usePourTarget = ({
1274
+ onBeforePour,
1275
+ onPour,
1276
+ onPourCancel,
1277
+ onPourAbort,
1278
+ pourTarget,
1279
+ pourContext,
1280
+ strategy = HoldToPourStrategy
1281
+ }) => {
1282
+ const [context, _setContext] = React.useState(
1283
+ pourContext || new PourContext()
1284
+ );
1285
+ const handlePour = React.useCallback(async () => {
1286
+ logger$3.debug(
1287
+ `[${strategy?.name}] - calling before pour for pour target ${pourTarget?.id}.`
1288
+ );
1289
+ const canPour = onBeforePour ? await onBeforePour?.(context) : true;
1290
+ if (canPour) {
1291
+ logger$3.debug(
1292
+ `[${strategy?.name}] - Pour initiated for pour target ${pourTarget?.id}.`
1293
+ );
1294
+ await strategy?.initiate(pourTarget);
1295
+ onPour?.();
1296
+ if (!pourTarget?.isPouring) {
1297
+ onPourAbort?.();
1298
+ }
1299
+ } else {
1300
+ logger$3.debug(
1301
+ `[${strategy?.name}] - Pour cancelled for pour target ${pourTarget?.id}.`
1302
+ );
1303
+ onPourCancel?.();
1304
+ }
1305
+ }, [onPour, onBeforePour, onPourAbort, pourTarget, strategy, context]);
1306
+ const handleCancelPour = React.useCallback(async () => {
1307
+ logger$3.debug(
1308
+ `[${strategy?.name}] - Pour initiate ended called for pour target ${pourTarget?.id}.`
1309
+ );
1310
+ const ignore = await strategy?.initiateEnded?.(pourTarget);
1311
+ if (!ignore) {
1312
+ onPourCancel?.();
1313
+ }
1314
+ }, [onPourCancel, pourTarget, strategy]);
1315
+ const forceCancelPour = React.useCallback(async () => {
1316
+ logger$3.debug(`Force cancelling pour for pour target ${pourTarget?.id}.`);
1317
+ await pourTarget?.cancelPour();
1318
+ onPourCancel?.();
1319
+ }, [onPourCancel, pourTarget]);
1320
+ const handleUpdateContext = React.useCallback(
1321
+ (key, value) => {
1322
+ context.set(key, value);
1323
+ },
1324
+ [context]
1325
+ );
1326
+ const handleRemoveFromContext = React.useCallback(
1327
+ (key) => {
1328
+ context.remove(key);
1329
+ },
1330
+ [context]
1331
+ );
1332
+ const handlers = kosUiSdk.usePressGesture({
1333
+ onPressed: handlePour,
1334
+ onRelease: handleCancelPour
1335
+ });
1336
+ return {
1337
+ handlers: handlers.dom,
1338
+ cancel: forceCancelPour,
1339
+ updatePourContext: handleUpdateContext,
1340
+ removeFromPourContext: handleRemoveFromContext,
1341
+ status: pourTarget
1342
+ };
1343
+ };
1344
+ const logger$2 = kosUiSdk.KosLog.createLogger({
1345
+ name: "TapOrHoldIntentStrategy",
1346
+ group: "kos-hooks"
1347
+ });
1348
+ class TapOrHoldIntentStrategy {
1349
+ intent;
1350
+ name = "TapOrHoldIntentStrategy";
1351
+ isHold = false;
1352
+ disposer = null;
1353
+ constructor(intent) {
1354
+ this.intent = intent;
1355
+ }
1356
+ async initiate(model, intent) {
1357
+ this.disposer = setTimeout(() => {
1358
+ this.isHold = true;
1359
+ }, 250);
1360
+ if (model?.isPouring && !this.isHold) {
1361
+ logger$2.debug(`additional tap detected. cancelling pour`);
1362
+ await model.cancelPour();
1363
+ return;
1364
+ }
1365
+ if (!model?.canPour) {
1366
+ logger$2.debug(`${model?.id} cannot pour. Returning early.`);
1367
+ return;
1368
+ }
1369
+ if (intent) {
1370
+ logger$2.debug(`performing intent: ${intent}`);
1371
+ await model?.performIntent(intent);
1372
+ } else {
1373
+ logger$2.debug("no intent provided. Returning early.");
1374
+ }
1375
+ }
1376
+ async initiateEnded(nozzle) {
1377
+ if (this.disposer) clearTimeout(this.disposer);
1378
+ this.disposer = null;
1379
+ if (!this.isHold) {
1380
+ logger$2.debug("Tap detected. don't cancel and return.");
1381
+ return true;
1382
+ }
1383
+ await nozzle?.cancelPour();
1384
+ return false;
1385
+ }
1386
+ }
1387
+ const logger$1 = kosUiSdk.KosLog.createLogger({
1388
+ name: "TapToPourIntentStrategy",
1389
+ group: "kos-hooks"
1390
+ });
1391
+ const TapToPourIntentStrategy = {
1392
+ name: "TapToPourIntentStrategy",
1393
+ async initiate(model, intent) {
1394
+ if (model?.isPouring) {
1395
+ logger$1.debug(`Nozzle ${model?.id} is already pouring. cancelling pour`);
1396
+ await model.cancelPour();
1397
+ return;
1398
+ }
1399
+ if (!model?.canPour) {
1400
+ logger$1.debug(`Nozzle ${model?.id} cannot pour. Returning early.`);
1401
+ return;
1402
+ }
1403
+ if (intent) {
1404
+ logger$1.debug(`performing intent: ${intent}`);
1405
+ await model?.performIntent(intent);
1406
+ } else {
1407
+ logger$1.debug("no intent provided. Returning early.");
1408
+ }
1409
+ },
1410
+ async initiateEnded(_nozzle) {
1411
+ return true;
1412
+ }
1413
+ };
1414
+ const logger = kosUiSdk.KosLog.createLogger({
1415
+ name: "HoldToPourStrategy",
1416
+ group: "kos-hooks"
1417
+ });
1418
+ const TapToPourStrategy = {
1419
+ name: "TapToPourStrategy",
1420
+ async initiate(nozzle) {
1421
+ if (nozzle?.isPouring) {
1422
+ logger.debug(`Nozzle ${nozzle?.id} is already pouring. cancelling pour`);
1423
+ await nozzle.cancelPour();
1424
+ return;
1425
+ }
1426
+ if (!nozzle?.canPour) {
1427
+ logger.debug(`Nozzle ${nozzle?.id} cannot pour. Returning early.`);
1428
+ return;
1429
+ }
1430
+ await nozzle?.pour();
1431
+ },
1432
+ async initiateEnded(_nozzle) {
1433
+ return true;
1434
+ }
1435
+ };
1436
+ const useGenericPour = (id, servicePathFactory, itemId, data) => {
1437
+ const modelId = id;
1438
+ const result = kosUiSdk.useKosModel({
1439
+ modelId,
1440
+ modelType: dispenseRegistrationManager.GenericPour.type,
1441
+ forceUpdate: true,
1442
+ options: {
1443
+ servicePathFactory,
1444
+ selectedId: itemId,
1445
+ initialData: data
1446
+ }
1447
+ });
1448
+ return result;
1449
+ };
1450
+ function withGenericPour(WrappedComponent) {
1451
+ return (props) => {
1452
+ const { model, status, KosModelLoader } = useGenericPour(
1453
+ props.id,
1454
+ props.servicePathFactory,
1455
+ props.itemId
1456
+ );
1457
+ return /* @__PURE__ */ jsxRuntime.jsx(KosModelLoader, { ...status, children: /* @__PURE__ */ jsxRuntime.jsx(WrappedComponent, { ...props, genericPour: model }) });
1458
+ };
1459
+ }
1460
+ const Assembly = React.createContext(void 0);
1461
+ const AssemblyProvider = ({ children }) => {
1462
+ const { model, ready } = useAssembly();
1463
+ const value = React.useMemo(() => {
1464
+ if (ready && model) {
1465
+ return { model };
1466
+ }
1467
+ return {};
1468
+ }, [ready, model]);
1469
+ return /* @__PURE__ */ jsxRuntime.jsx(Assembly.Provider, { value, children });
1470
+ };
1471
+ const useAssemblyContext = () => {
1472
+ const context = React.useContext(
1473
+ Assembly
1474
+ );
1475
+ if (!context) {
1476
+ throw new Error(
1477
+ "useAssemblyContext must be used within a AssemblyProvider"
1478
+ );
1479
+ }
1480
+ return context;
1481
+ };
1482
+ const Availability = React.createContext(void 0);
1483
+ const AvailabilityProvider = ({ children }) => {
1484
+ const { model, ready } = useAvailability();
1485
+ const value = React.useMemo(() => {
1486
+ if (ready && model) {
1487
+ return { model };
1488
+ }
1489
+ return {};
1490
+ }, [ready, model]);
1491
+ return /* @__PURE__ */ jsxRuntime.jsx(Availability.Provider, { value, children });
1492
+ };
1493
+ const useAvailabilityContext = () => {
1494
+ const context = React.useContext(Availability);
1495
+ if (!context) {
1496
+ throw new Error(
1497
+ "useAvailabilityContext must be used within a AvailabilityProvider"
1498
+ );
1499
+ }
1500
+ return context;
1501
+ };
1502
+ const Board = React.createContext(void 0);
1503
+ const BoardProvider = ({ children, id }) => {
1504
+ const { model, ready } = useBoard(id);
1505
+ const value = React.useMemo(() => {
1506
+ if (ready && model) {
1507
+ return { model };
1508
+ }
1509
+ return {};
1510
+ }, [ready, model]);
1511
+ return /* @__PURE__ */ jsxRuntime.jsx(Board.Provider, { value, children });
1512
+ };
1513
+ const useBoardContext = () => {
1514
+ const context = React.useContext(Board);
1515
+ if (!context) {
1516
+ throw new Error("useBoardContext must be used within a BoardProvider");
1517
+ }
1518
+ return context;
1519
+ };
1520
+ const BoardContainer = React.createContext(void 0);
1521
+ const BoardContainerProvider = ({ children }) => {
1522
+ const { model, ready } = useBoardContainer();
1523
+ const value = React.useMemo(() => {
1524
+ if (ready && model) {
1525
+ return { model };
1526
+ }
1527
+ return {};
1528
+ }, [ready, model]);
1529
+ return /* @__PURE__ */ jsxRuntime.jsx(BoardContainer.Provider, { value, children });
1530
+ };
1531
+ const useBoardContainerContext = () => {
1532
+ const context = React.useContext(BoardContainer);
1533
+ if (!context) {
1534
+ throw new Error(
1535
+ "useBoardContainerContext must be used within a BoardContainerProvider"
1536
+ );
1537
+ }
1538
+ return context;
1539
+ };
1540
+ const DeviceAssemblyContext = React.createContext(
1541
+ void 0
1542
+ );
1543
+ const DeviceAssemblyProvider = ({ children }) => {
1544
+ const { model, ready } = useDeviceAssembly();
1545
+ const value = React.useMemo(() => {
1546
+ if (ready && model) {
1547
+ const nozzlePaths = model.nozzlePaths;
1548
+ return { model, nozzlePaths };
1549
+ }
1550
+ return {};
1551
+ }, [ready, model]);
1552
+ const content = ready && model ? children : null;
1553
+ return /* @__PURE__ */ jsxRuntime.jsx(DeviceAssemblyContext.Provider, { value, children: content });
1554
+ };
1555
+ const useDeviceAssemblyContext = () => {
1556
+ const context = React.useContext(DeviceAssemblyContext);
1557
+ if (!context) {
1558
+ throw new Error(
1559
+ "useDeviceAssemblyContext must be used within a DeviceAssemblyProvider"
1560
+ );
1561
+ }
1562
+ return context;
1563
+ };
1564
+ function createDispenseKitContext() {
1565
+ const CuiKitContext = React.createContext(null);
1566
+ const useCuiKitContext = () => {
1567
+ const ctx = React.useContext(CuiKitContext);
1568
+ if (ctx === void 0) {
1569
+ throw new Error("useDispenseKitContext must be used within a Provider");
1570
+ }
1571
+ return ctx;
1572
+ };
1573
+ return [useCuiKitContext, CuiKitContext.Provider];
1574
+ }
1575
+ function CuiKitWrapper({
1576
+ children,
1577
+ provider: CuiKitProvider,
1578
+ props,
1579
+ nozzleProps
1580
+ }) {
1581
+ const result = useCuiKit(props);
1582
+ return /* @__PURE__ */ jsxRuntime.jsx(CuiKitProvider, { value: result, children: children(nozzleProps || {}) });
1583
+ }
1584
+ function DispenseView({
1585
+ children,
1586
+ provider,
1587
+ props
1588
+ }) {
1589
+ const { nozzlePaths } = useDeviceAssemblyContext();
1590
+ const totalNozzles = nozzlePaths?.length || 0;
1591
+ const nozzles = nozzlePaths?.map((path, index) => /* @__PURE__ */ jsxRuntime.jsx(NozzleProvider, { path, children: /* @__PURE__ */ jsxRuntime.jsx(
1592
+ CuiKitWrapper,
1593
+ {
1594
+ provider,
1595
+ props,
1596
+ nozzleProps: {
1597
+ nozzleIndex: index,
1598
+ nozzlePath: path,
1599
+ totalNozzles,
1600
+ isFirstNozzle: index === 0,
1601
+ isLastNozzle: index === totalNozzles - 1
1602
+ },
1603
+ children
1604
+ }
1605
+ ) }, path)) || [];
1606
+ return nozzles;
1607
+ }
1608
+ function CuiKit({
1609
+ provider,
1610
+ props
1611
+ }) {
1612
+ return ({ children }) => provider ? /* @__PURE__ */ jsxRuntime.jsx(DeviceAssemblyProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(
1613
+ DispenseView,
1614
+ {
1615
+ provider,
1616
+ props,
1617
+ children
1618
+ }
1619
+ ) }) : null;
1620
+ }
1621
+ function initializeCuiKit(props) {
1622
+ const [useCuiKitContext, DispenseKitProvider] = createDispenseKitContext();
1623
+ return [
1624
+ useCuiKitContext,
1625
+ CuiKit({ provider: DispenseKitProvider, props })
1626
+ ];
1627
+ }
1628
+ const Holder = React.createContext(void 0);
1629
+ const HolderProvider = ({ children, id }) => {
1630
+ const { model, ready } = useHolder(id || "");
1631
+ const value = React.useMemo(() => {
1632
+ if (ready && model) {
1633
+ return { model };
1634
+ }
1635
+ return {};
1636
+ }, [ready, model]);
1637
+ return /* @__PURE__ */ jsxRuntime.jsx(Holder.Provider, { value, children });
1638
+ };
1639
+ const useHolderContext = () => {
1640
+ const context = React.useContext(Holder);
1641
+ if (!context) {
1642
+ throw new Error("useHolderContext must be used within a HolderProvider");
1643
+ }
1644
+ return context;
1645
+ };
1646
+ const HolderContainer = React.createContext(
1647
+ void 0
1648
+ );
1649
+ const HolderContainerProvider = ({ children }) => {
1650
+ const { model, ready } = useHolderContainer();
1651
+ const value = React.useMemo(() => {
1652
+ if (ready && model) {
1653
+ return { model };
1654
+ }
1655
+ return {};
1656
+ }, [ready, model]);
1657
+ return /* @__PURE__ */ jsxRuntime.jsx(HolderContainer.Provider, { value, children });
1658
+ };
1659
+ const useHolderContainerContext = () => {
1660
+ const context = React.useContext(HolderContainer);
1661
+ if (!context) {
1662
+ throw new Error(
1663
+ "useHolderContainerContext must be used within a HolderContainerProvider"
1664
+ );
1665
+ }
1666
+ return context;
1667
+ };
1668
+ const Ingredient = React.createContext(void 0);
1669
+ const IngredientProvider = ({ children }) => {
1670
+ const { model, ready } = useIngredient();
1671
+ const value = React.useMemo(() => {
1672
+ if (ready && model) {
1673
+ return { model };
1674
+ }
1675
+ return {};
1676
+ }, [ready, model]);
1677
+ return /* @__PURE__ */ jsxRuntime.jsx(Ingredient.Provider, { value, children });
1678
+ };
1679
+ const useIngredientContext = () => {
1680
+ const context = React.useContext(Ingredient);
1681
+ if (!context) {
1682
+ throw new Error(
1683
+ "useIngredientContext must be used within a IngredientProvider"
1684
+ );
1685
+ }
1686
+ return context;
1687
+ };
1688
+ const IngredientContainer = React.createContext(
1689
+ void 0
1690
+ );
1691
+ const IngredientContainerProvider = ({ children }) => {
1692
+ const { model, ready } = useIngredientContainer();
1693
+ const value = React.useMemo(() => {
1694
+ if (ready && model) {
1695
+ return { model };
1696
+ }
1697
+ return {};
1698
+ }, [ready, model]);
1699
+ return /* @__PURE__ */ jsxRuntime.jsx(IngredientContainer.Provider, { value, children });
1700
+ };
1701
+ const useIngredientContainerContext = () => {
1702
+ const context = React.useContext(IngredientContainer);
1703
+ if (!context) {
1704
+ throw new Error(
1705
+ "useIngredientContainerContext must be used within a IngredientContainerProvider"
1706
+ );
1707
+ }
1708
+ return context;
1709
+ };
1710
+ const usePump = () => {
1711
+ const modelId = dispenseRegistrationManager.Pump.type;
1712
+ const result = kosUiSdk.useKosModel({
1713
+ modelId,
1714
+ modelType: dispenseRegistrationManager.Pump.type,
1715
+ options: {}
1716
+ });
1717
+ return result;
1718
+ };
1719
+ const Pump = React.createContext(void 0);
1720
+ const PumpProvider = ({ children }) => {
1721
+ const { model, ready } = usePump();
1722
+ const value = React.useMemo(() => {
1723
+ if (ready && model) {
1724
+ return { model };
1725
+ }
1726
+ return {};
1727
+ }, [ready, model]);
1728
+ return /* @__PURE__ */ jsxRuntime.jsx(Pump.Provider, { value, children });
1729
+ };
1730
+ const usePumpContext = () => {
1731
+ const context = React.useContext(Pump);
1732
+ if (!context) {
1733
+ throw new Error("usePumpContext must be used within a PumpProvider");
1734
+ }
1735
+ return context;
1736
+ };
1737
+ exports.AssemblyProvider = AssemblyProvider;
1738
+ exports.AvailabilityProvider = AvailabilityProvider;
1739
+ exports.BoardContainerProvider = BoardContainerProvider;
1740
+ exports.BoardProvider = BoardProvider;
1741
+ exports.CuiKit = CuiKit;
1742
+ exports.CuiKitWrapper = CuiKitWrapper;
1743
+ exports.DISPENSE_GROUP_BEVERAGE = DISPENSE_GROUP_BEVERAGE;
1744
+ exports.DISPENSE_GROUP_BRAND = DISPENSE_GROUP_BRAND;
1745
+ exports.DISPENSE_GROUP_FLAVOR = DISPENSE_GROUP_FLAVOR;
1746
+ exports.DeviceAssemblyProvider = DeviceAssemblyProvider;
1747
+ exports.HoldToPourIntentStrategy = HoldToPourIntentStrategy;
1748
+ exports.HoldToPourStrategy = HoldToPourStrategy;
1749
+ exports.HolderContainerProvider = HolderContainerProvider;
1750
+ exports.HolderProvider = HolderProvider;
1751
+ exports.IngredientContainerProvider = IngredientContainerProvider;
1752
+ exports.IngredientProvider = IngredientProvider;
1753
+ exports.NozzleProvider = NozzleProvider;
1754
+ exports.PourContext = PourContext;
1755
+ exports.PumpProvider = PumpProvider;
1756
+ exports.TapOrHoldIntentStrategy = TapOrHoldIntentStrategy;
1757
+ exports.TapToPourIntentStrategy = TapToPourIntentStrategy;
1758
+ exports.TapToPourStrategy = TapToPourStrategy;
1759
+ exports.initializeCuiKit = initializeCuiKit;
1760
+ exports.useAssembly = useAssembly;
1761
+ exports.useAssemblyContext = useAssemblyContext;
1762
+ exports.useAvailability = useAvailability;
1763
+ exports.useAvailabilityContext = useAvailabilityContext;
1764
+ exports.useBeverages = useBeverages;
1765
+ exports.useBoard = useBoard;
1766
+ exports.useBoardContainer = useBoardContainer;
1767
+ exports.useBoardContainerContext = useBoardContainerContext;
1768
+ exports.useBoardContext = useBoardContext;
1769
+ exports.useBrands = useBrands;
1770
+ exports.useCuiKit = useCuiKit;
1771
+ exports.useCuiKitTimers = useCuiKitTimers;
1772
+ exports.useDefaultCuiKitLifecycle = useDefaultCuiKitLifecycle;
1773
+ exports.useDeviceAssembly = useDeviceAssembly;
1774
+ exports.useDeviceAssemblyContext = useDeviceAssemblyContext;
1775
+ exports.useDispenseLifecycle = useDispenseLifecycle;
1776
+ exports.useFlavors = useFlavors;
1777
+ exports.useGenericPour = useGenericPour;
1778
+ exports.useHolder = useHolder;
1779
+ exports.useHolderContainer = useHolderContainer;
1780
+ exports.useHolderContainerContext = useHolderContainerContext;
1781
+ exports.useHolderContext = useHolderContext;
1782
+ exports.useIngredient = useIngredient;
1783
+ exports.useIngredientContainer = useIngredientContainer;
1784
+ exports.useIngredientContainerContext = useIngredientContainerContext;
1785
+ exports.useIngredientContext = useIngredientContext;
1786
+ exports.useIngredientPour = useIngredientPour;
1787
+ exports.useNozzle = useNozzle;
1788
+ exports.useNozzleContext = useNozzleContext;
1789
+ exports.useNozzlePour = useNozzlePour;
1790
+ exports.usePourTarget = usePourTarget;
1791
+ exports.usePumpContext = usePumpContext;
1792
+ exports.withAssembly = withAssembly;
1793
+ exports.withBeverage = withBeverage;
1794
+ exports.withBoard = withBoard;
1795
+ exports.withBoardContainer = withBoardContainer;
1796
+ exports.withDeviceAssembly = withDeviceAssembly;
1797
+ exports.withGenericPour = withGenericPour;
1798
+ exports.withHolder = withHolder;
1799
+ exports.withHolderContainer = withHolderContainer;
1800
+ exports.withIngredient = withIngredient;
1801
+ exports.withIngredientContainer = withIngredientContainer;
1802
+ exports.withNozzle = withNozzle;
1803
+ //# sourceMappingURL=pump-provider-D4iVLU-o.cjs.map