@aglyn/plugins-commerce 1.0.0-beta.277 → 1.0.0-beta.282

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 (212) hide show
  1. package/package.json +17 -14
  2. package/src/lib/components/commerce-console-page.js +33 -1
  3. package/src/lib/components/commerce-console-page.js.map +1 -1
  4. package/src/lib/components/console/payments-settings-card.component.js +1 -1
  5. package/src/lib/components/console/payments-settings-card.component.js.map +1 -1
  6. package/src/lib/components/console/pos/pos-hardware-api.d.ts +122 -0
  7. package/src/lib/components/console/pos/pos-hardware-api.js +90 -0
  8. package/src/lib/components/console/pos/pos-hardware-api.js.map +1 -0
  9. package/src/lib/components/console/pos/pos-reader-splash-api.d.ts +58 -0
  10. package/src/lib/components/console/pos/pos-reader-splash-api.js +101 -0
  11. package/src/lib/components/console/pos/pos-reader-splash-api.js.map +1 -0
  12. package/src/lib/components/console/pos-devices-card.component.js +5 -0
  13. package/src/lib/components/console/pos-devices-card.component.js.map +1 -1
  14. package/src/lib/components/console/pos-hardware-card.component.d.ts +26 -0
  15. package/src/lib/components/console/pos-hardware-card.component.js +456 -0
  16. package/src/lib/components/console/pos-hardware-card.component.js.map +1 -0
  17. package/src/lib/components/console/pos-hardware-orders-staff-page.component.d.ts +14 -0
  18. package/src/lib/components/console/pos-hardware-orders-staff-page.component.js +519 -0
  19. package/src/lib/components/console/pos-hardware-orders-staff-page.component.js.map +1 -0
  20. package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.d.ts +27 -0
  21. package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.js +444 -0
  22. package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.js.map +1 -0
  23. package/src/lib/components/console/pos-ops/pos-check-in-zone.component.d.ts +9 -0
  24. package/src/lib/components/console/pos-ops/pos-check-in-zone.component.js +37 -0
  25. package/src/lib/components/console/pos-ops/pos-check-in-zone.component.js.map +1 -0
  26. package/src/lib/components/console/pos-ops/pos-check-ins-card.component.d.ts +24 -0
  27. package/src/lib/components/console/pos-ops/pos-check-ins-card.component.js +346 -0
  28. package/src/lib/components/console/pos-ops/pos-check-ins-card.component.js.map +1 -0
  29. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.d.ts +5 -1
  30. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js +83 -4
  31. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js.map +1 -1
  32. package/src/lib/components/console/pos-ops/pos-day-totals-card.component.d.ts +35 -0
  33. package/src/lib/components/console/pos-ops/pos-day-totals-card.component.js +546 -0
  34. package/src/lib/components/console/pos-ops/pos-day-totals-card.component.js.map +1 -0
  35. package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +2 -1
  36. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +20 -1
  37. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -1
  38. package/src/lib/components/console/pos-ops/pos-ops-api.d.ts +1 -1
  39. package/src/lib/components/console/pos-ops/pos-ops-api.js.map +1 -1
  40. package/src/lib/components/console/pos-page.component.js +6 -3
  41. package/src/lib/components/console/pos-page.component.js.map +1 -1
  42. package/src/lib/components/console/pos-reader-splash-setting.component.d.ts +22 -0
  43. package/src/lib/components/console/pos-reader-splash-setting.component.js +275 -0
  44. package/src/lib/components/console/pos-reader-splash-setting.component.js.map +1 -0
  45. package/src/lib/components/console/pos-reader-splash-staff-page.component.d.ts +14 -0
  46. package/src/lib/components/console/pos-reader-splash-staff-page.component.js +301 -0
  47. package/src/lib/components/console/pos-reader-splash-staff-page.component.js.map +1 -0
  48. package/src/lib/components/console/pos-zones.d.ts +37 -3
  49. package/src/lib/components/console/pos-zones.js +11 -1
  50. package/src/lib/components/console/pos-zones.js.map +1 -1
  51. package/src/lib/components/console/product-check-in-fields.component.d.ts +20 -0
  52. package/src/lib/components/console/product-check-in-fields.component.js +172 -0
  53. package/src/lib/components/console/product-check-in-fields.component.js.map +1 -0
  54. package/src/lib/components/console/product-editor-dialog.component.js +48 -9
  55. package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
  56. package/src/lib/components/console/product-register-fields.component.d.ts +12 -0
  57. package/src/lib/components/console/product-register-fields.component.js +39 -1
  58. package/src/lib/components/console/product-register-fields.component.js.map +1 -1
  59. package/src/lib/components/console/products-hub-card.component.js +21 -6
  60. package/src/lib/components/console/products-hub-card.component.js.map +1 -1
  61. package/src/lib/components/console/reservations-card.component.js +239 -70
  62. package/src/lib/components/console/reservations-card.component.js.map +1 -1
  63. package/src/lib/components/reservation-widget.js +16 -0
  64. package/src/lib/components/reservation-widget.js.map +1 -1
  65. package/src/lib/constants/operator-alerts.d.ts +6 -0
  66. package/src/lib/constants/operator-alerts.js +20 -1
  67. package/src/lib/constants/operator-alerts.js.map +1 -1
  68. package/src/lib/declarations.console-server.js +7 -0
  69. package/src/lib/declarations.console-server.js.map +1 -1
  70. package/src/lib/declarations.d.ts +26 -0
  71. package/src/lib/declarations.js +34 -0
  72. package/src/lib/declarations.js.map +1 -0
  73. package/src/lib/model/commerce-check-in-product.d.ts +37 -0
  74. package/src/lib/model/commerce-check-in-product.js +49 -0
  75. package/src/lib/model/commerce-check-in-product.js.map +1 -0
  76. package/src/lib/model/commerce-check-in.d.ts +187 -0
  77. package/src/lib/model/commerce-check-in.js +468 -0
  78. package/src/lib/model/commerce-check-in.js.map +1 -0
  79. package/src/lib/model/commerce-pos-day-report.d.ts +209 -0
  80. package/src/lib/model/commerce-pos-day-report.js +572 -0
  81. package/src/lib/model/commerce-pos-day-report.js.map +1 -0
  82. package/src/lib/model/commerce-pos-offline.d.ts +65 -3
  83. package/src/lib/model/commerce-pos-offline.js +104 -7
  84. package/src/lib/model/commerce-pos-offline.js.map +1 -1
  85. package/src/lib/model/commerce-pos-ops.d.ts +3 -0
  86. package/src/lib/model/commerce-pos-ops.js +1 -0
  87. package/src/lib/model/commerce-pos-ops.js.map +1 -1
  88. package/src/lib/model/commerce-pos.d.ts +43 -3
  89. package/src/lib/model/commerce-pos.js +73 -5
  90. package/src/lib/model/commerce-pos.js.map +1 -1
  91. package/src/lib/model/commerce-reservations.d.ts +73 -7
  92. package/src/lib/model/commerce-reservations.js +90 -10
  93. package/src/lib/model/commerce-reservations.js.map +1 -1
  94. package/src/lib/model/commerce.d.ts +40 -0
  95. package/src/lib/model/commerce.js +22 -4
  96. package/src/lib/model/commerce.js.map +1 -1
  97. package/src/lib/model/index.d.ts +1 -0
  98. package/src/lib/model/index.js +1 -0
  99. package/src/lib/model/index.js.map +1 -1
  100. package/src/lib/model/plugin-permissions.d.ts +1 -1
  101. package/src/lib/model/plugin-permissions.js +2 -1
  102. package/src/lib/model/plugin-permissions.js.map +1 -1
  103. package/src/lib/model/pos-hardware.d.ts +288 -0
  104. package/src/lib/model/pos-hardware.js +499 -0
  105. package/src/lib/model/pos-hardware.js.map +1 -0
  106. package/src/lib/model/pos-offline-card-limits.d.ts +20 -0
  107. package/src/lib/model/pos-offline-card-limits.js +28 -0
  108. package/src/lib/model/pos-offline-card-limits.js.map +1 -0
  109. package/src/lib/model/pos-reader-splash.d.ts +114 -0
  110. package/src/lib/model/pos-reader-splash.js +141 -0
  111. package/src/lib/model/pos-reader-splash.js.map +1 -0
  112. package/src/lib/model/product-write.d.ts +6 -0
  113. package/src/lib/plugin-config.d.ts +10 -0
  114. package/src/lib/plugin-config.js +40 -0
  115. package/src/lib/plugin-config.js.map +1 -1
  116. package/src/lib/plugin.js +28 -0
  117. package/src/lib/plugin.js.map +1 -1
  118. package/src/lib/server/cart-checkout.js +3 -1
  119. package/src/lib/server/cart-checkout.js.map +1 -1
  120. package/src/lib/server/cart.js +12 -1
  121. package/src/lib/server/cart.js.map +1 -1
  122. package/src/lib/server/catalog.js +49 -12
  123. package/src/lib/server/catalog.js.map +1 -1
  124. package/src/lib/server/checkout-extras.js +1 -1
  125. package/src/lib/server/checkout-extras.js.map +1 -1
  126. package/src/lib/server/checkout.js +7 -0
  127. package/src/lib/server/checkout.js.map +1 -1
  128. package/src/lib/server/person-eraser.d.ts +8 -1
  129. package/src/lib/server/person-eraser.js +23 -1
  130. package/src/lib/server/person-eraser.js.map +1 -1
  131. package/src/lib/server/pos-check-in.d.ts +49 -0
  132. package/src/lib/server/pos-check-in.js +652 -0
  133. package/src/lib/server/pos-check-in.js.map +1 -0
  134. package/src/lib/server/pos-day-report.d.ts +46 -0
  135. package/src/lib/server/pos-day-report.js +299 -0
  136. package/src/lib/server/pos-day-report.js.map +1 -0
  137. package/src/lib/server/pos-hardware-admin.d.ts +50 -0
  138. package/src/lib/server/pos-hardware-admin.js +366 -0
  139. package/src/lib/server/pos-hardware-admin.js.map +1 -0
  140. package/src/lib/server/pos-hardware-notify.d.ts +27 -0
  141. package/src/lib/server/pos-hardware-notify.js +142 -0
  142. package/src/lib/server/pos-hardware-notify.js.map +1 -0
  143. package/src/lib/server/pos-hardware-user-eraser.d.ts +26 -0
  144. package/src/lib/server/pos-hardware-user-eraser.js +67 -0
  145. package/src/lib/server/pos-hardware-user-eraser.js.map +1 -0
  146. package/src/lib/server/pos-hardware-webhook.d.ts +31 -0
  147. package/src/lib/server/pos-hardware-webhook.js +176 -0
  148. package/src/lib/server/pos-hardware-webhook.js.map +1 -0
  149. package/src/lib/server/pos-hardware.d.ts +58 -0
  150. package/src/lib/server/pos-hardware.js +234 -0
  151. package/src/lib/server/pos-hardware.js.map +1 -0
  152. package/src/lib/server/pos-offline-card-reconcile.d.ts +38 -0
  153. package/src/lib/server/pos-offline-card-reconcile.js +58 -0
  154. package/src/lib/server/pos-offline-card-reconcile.js.map +1 -0
  155. package/src/lib/server/pos-offline-sync.d.ts +32 -0
  156. package/src/lib/server/pos-offline-sync.js +191 -15
  157. package/src/lib/server/pos-offline-sync.js.map +1 -1
  158. package/src/lib/server/pos-ops-routes.d.ts +4 -2
  159. package/src/lib/server/pos-ops-routes.js +14 -2
  160. package/src/lib/server/pos-ops-routes.js.map +1 -1
  161. package/src/lib/server/pos-order.js +39 -51
  162. package/src/lib/server/pos-order.js.map +1 -1
  163. package/src/lib/server/pos-payment.js +8 -4
  164. package/src/lib/server/pos-payment.js.map +1 -1
  165. package/src/lib/server/pos-reader-splash-admin.d.ts +36 -0
  166. package/src/lib/server/pos-reader-splash-admin.js +295 -0
  167. package/src/lib/server/pos-reader-splash-admin.js.map +1 -0
  168. package/src/lib/server/pos-reader-splash-render.d.ts +40 -0
  169. package/src/lib/server/pos-reader-splash-render.js +138 -0
  170. package/src/lib/server/pos-reader-splash-render.js.map +1 -0
  171. package/src/lib/server/pos-reader-splash-server.d.ts +32 -0
  172. package/src/lib/server/pos-reader-splash-server.js +32 -0
  173. package/src/lib/server/pos-reader-splash-server.js.map +1 -0
  174. package/src/lib/server/pos-reader-splash.d.ts +105 -0
  175. package/src/lib/server/pos-reader-splash.js +548 -0
  176. package/src/lib/server/pos-reader-splash.js.map +1 -0
  177. package/src/lib/server/pos-sale.d.ts +2 -1
  178. package/src/lib/server/pos-sale.js +3 -1
  179. package/src/lib/server/pos-sale.js.map +1 -1
  180. package/src/lib/server/pos-terminal.d.ts +67 -4
  181. package/src/lib/server/pos-terminal.js +239 -32
  182. package/src/lib/server/pos-terminal.js.map +1 -1
  183. package/src/lib/server/process-restock.js +4 -0
  184. package/src/lib/server/process-restock.js.map +1 -1
  185. package/src/lib/server/product-card.js +2 -2
  186. package/src/lib/server/product-card.js.map +1 -1
  187. package/src/lib/server/product-catalog.d.ts +2 -0
  188. package/src/lib/server/product-catalog.js +11 -4
  189. package/src/lib/server/product-catalog.js.map +1 -1
  190. package/src/lib/server/product.js +3 -1
  191. package/src/lib/server/product.js.map +1 -1
  192. package/src/lib/server/related.js +8 -1
  193. package/src/lib/server/related.js.map +1 -1
  194. package/src/lib/server/reservation-availability-query.d.ts +35 -0
  195. package/src/lib/server/reservation-availability-query.js +34 -0
  196. package/src/lib/server/reservation-availability-query.js.map +1 -0
  197. package/src/lib/server/reservation-availability.d.ts +21 -0
  198. package/src/lib/server/reservation-availability.js +64 -10
  199. package/src/lib/server/reservation-availability.js.map +1 -1
  200. package/src/lib/server/reservation-walk-in.d.ts +28 -0
  201. package/src/lib/server/reservation-walk-in.js +166 -0
  202. package/src/lib/server/reservation-walk-in.js.map +1 -0
  203. package/src/lib/server/reserve.js +13 -10
  204. package/src/lib/server/reserve.js.map +1 -1
  205. package/src/lib/server/reviews.js +3 -1
  206. package/src/lib/server/reviews.js.map +1 -1
  207. package/src/lib/server/site-page-resolver.js +5 -2
  208. package/src/lib/server/site-page-resolver.js.map +1 -1
  209. package/src/lib/server.js +26 -0
  210. package/src/lib/server.js.map +1 -1
  211. package/src/lib/testing/fake-firestore.js +72 -0
  212. package/src/lib/testing/fake-firestore.js.map +1 -1
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import { authorizedFetch } from '@aglyn/shared-util-http/authorized-token';
18
+ import type { PosReaderSplashChoice, PosReaderSplashFamilyId, PosReaderSplashStatus } from '../../../model/pos-reader-splash';
19
+ type User = Parameters<typeof authorizedFetch>[0];
20
+ export declare class PosReaderSplashRequestError extends Error {
21
+ readonly status: number;
22
+ constructor(message: string, status: number);
23
+ }
24
+ export declare function readerSplashStatus(user: User, hostId: string): Promise<PosReaderSplashStatus>;
25
+ export declare function saveReaderSplash(user: User, hostId: string, choice: PosReaderSplashChoice, image?: {
26
+ mediaScope: string;
27
+ mediaId: string;
28
+ }): Promise<PosReaderSplashStatus>;
29
+ export interface StaffReaderSplashFamily {
30
+ id: PosReaderSplashFamilyId;
31
+ label: string;
32
+ width: number;
33
+ height: number;
34
+ image: {
35
+ contentType: string;
36
+ bytes: number;
37
+ sha256: string;
38
+ uploadedAtMs: number;
39
+ } | null;
40
+ }
41
+ export interface StaffReaderSplash {
42
+ ready: boolean;
43
+ families: StaffReaderSplashFamily[];
44
+ updatedAtMs: number | null;
45
+ canWrite: boolean;
46
+ }
47
+ export declare function staffReaderSplash(user: User): Promise<StaffReaderSplash>;
48
+ export declare function staffUploadReaderSplash(user: User, family: PosReaderSplashFamilyId, dataBase64: string): Promise<StaffReaderSplash>;
49
+ export declare function staffRemoveReaderSplash(user: User, family: PosReaderSplashFamilyId): Promise<StaffReaderSplash>;
50
+ export declare function staffApplyReaderSplash(user: User): Promise<{
51
+ applied: number;
52
+ unchanged: number;
53
+ failed: number;
54
+ more: boolean;
55
+ }>;
56
+ /** A family's current default image, as an object URL the page revokes. */
57
+ export declare function staffReaderSplashPreview(user: User, family: PosReaderSplashFamilyId): Promise<string | null>;
58
+ export {};
@@ -0,0 +1,101 @@
1
+ import { _ as _extends } from "@swc/helpers/_/_extends";
2
+ /**
3
+ * @license
4
+ * Copyright 2026 Aglyn LLC
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */ import { authorizedFetch } from "@aglyn/shared-util-http/authorized-token";
18
+ export class PosReaderSplashRequestError extends Error {
19
+ constructor(message, status){
20
+ super(message), this.status = status;
21
+ }
22
+ }
23
+ async function send(user, url, init) {
24
+ var _init_body;
25
+ const response = await authorizedFetch(user, url, _extends({
26
+ method: init.method,
27
+ headers: init.method === 'POST' ? {
28
+ 'Content-Type': 'application/json'
29
+ } : {}
30
+ }, init.method === 'POST' ? {
31
+ body: JSON.stringify((_init_body = init.body) != null ? _init_body : {})
32
+ } : {}));
33
+ const payload = await response.json().catch(()=>({}));
34
+ if (!response.ok) {
35
+ var _ref;
36
+ throw new PosReaderSplashRequestError(String((_ref = payload == null ? void 0 : payload.error) != null ? _ref : 'Something went wrong'), response.status);
37
+ }
38
+ return payload;
39
+ }
40
+ const STORE_URL = '/api/commerce/pos-reader-splash';
41
+ const STAFF_URL = '/api/commerce/admin/reader-splash';
42
+ export function readerSplashStatus(user, hostId) {
43
+ return send(user, STORE_URL, {
44
+ method: 'POST',
45
+ body: {
46
+ action: 'status',
47
+ hostId
48
+ }
49
+ });
50
+ }
51
+ export function saveReaderSplash(user, hostId, choice, image) {
52
+ return send(user, STORE_URL, {
53
+ method: 'POST',
54
+ body: _extends({
55
+ action: 'save',
56
+ hostId,
57
+ choice
58
+ }, image != null ? image : {})
59
+ });
60
+ }
61
+ export function staffReaderSplash(user) {
62
+ return send(user, STAFF_URL, {
63
+ method: 'GET'
64
+ });
65
+ }
66
+ export function staffUploadReaderSplash(user, family, dataBase64) {
67
+ return send(user, STAFF_URL, {
68
+ method: 'POST',
69
+ body: {
70
+ action: 'upload',
71
+ family,
72
+ dataBase64
73
+ }
74
+ });
75
+ }
76
+ export function staffRemoveReaderSplash(user, family) {
77
+ return send(user, STAFF_URL, {
78
+ method: 'POST',
79
+ body: {
80
+ action: 'remove',
81
+ family
82
+ }
83
+ });
84
+ }
85
+ export function staffApplyReaderSplash(user) {
86
+ return send(user, STAFF_URL, {
87
+ method: 'POST',
88
+ body: {
89
+ action: 'apply'
90
+ }
91
+ });
92
+ }
93
+ /** A family's current default image, as an object URL the page revokes. */ export async function staffReaderSplashPreview(user, family) {
94
+ const response = await authorizedFetch(user, `${STAFF_URL}?preview=${encodeURIComponent(family)}`, {
95
+ method: 'GET'
96
+ });
97
+ if (!response.ok) return null;
98
+ return URL.createObjectURL(await response.blob());
99
+ }
100
+
101
+ //# sourceMappingURL=pos-reader-splash-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos/pos-reader-splash-api.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { authorizedFetch } from '@aglyn/shared-util-http/authorized-token'\nimport type {\n PosReaderSplashChoice,\n PosReaderSplashFamilyId,\n PosReaderSplashStatus,\n} from '../../../model/pos-reader-splash'\n\n/*\n * The card reader start-up screen's client half (AGL-4048): the POS devices\n * card's setting and the staff page's default, so neither builds a request\n * by hand.\n */\n\ntype User = Parameters<typeof authorizedFetch>[0]\n\nexport class PosReaderSplashRequestError extends Error {\n constructor(\n message: string,\n readonly status: number,\n ) {\n super(message)\n }\n}\n\nasync function send<T>(user: User, url: string, init: { method: 'GET' | 'POST'; body?: unknown }): Promise<T> {\n const response = await authorizedFetch(user, url, {\n method: init.method,\n headers: init.method === 'POST' ? { 'Content-Type': 'application/json' } : {},\n ...(init.method === 'POST' ? { body: JSON.stringify(init.body ?? {}) } : {}),\n })\n const payload = await response.json().catch(() => ({}))\n if (!response.ok) {\n throw new PosReaderSplashRequestError(String(payload?.error ?? 'Something went wrong'), response.status)\n }\n return payload as T\n}\n\nconst STORE_URL = '/api/commerce/pos-reader-splash'\nconst STAFF_URL = '/api/commerce/admin/reader-splash'\n\nexport function readerSplashStatus(user: User, hostId: string): Promise<PosReaderSplashStatus> {\n return send(user, STORE_URL, { method: 'POST', body: { action: 'status', hostId } })\n}\n\nexport function saveReaderSplash(\n user: User,\n hostId: string,\n choice: PosReaderSplashChoice,\n image?: { mediaScope: string; mediaId: string },\n): Promise<PosReaderSplashStatus> {\n return send(user, STORE_URL, { method: 'POST', body: { action: 'save', hostId, choice, ...(image ?? {}) } })\n}\n\nexport interface StaffReaderSplashFamily {\n id: PosReaderSplashFamilyId\n label: string\n width: number\n height: number\n image: { contentType: string; bytes: number; sha256: string; uploadedAtMs: number } | null\n}\n\nexport interface StaffReaderSplash {\n ready: boolean\n families: StaffReaderSplashFamily[]\n updatedAtMs: number | null\n canWrite: boolean\n}\n\nexport function staffReaderSplash(user: User): Promise<StaffReaderSplash> {\n return send(user, STAFF_URL, { method: 'GET' })\n}\n\nexport function staffUploadReaderSplash(\n user: User,\n family: PosReaderSplashFamilyId,\n dataBase64: string,\n): Promise<StaffReaderSplash> {\n return send(user, STAFF_URL, { method: 'POST', body: { action: 'upload', family, dataBase64 } })\n}\n\nexport function staffRemoveReaderSplash(user: User, family: PosReaderSplashFamilyId): Promise<StaffReaderSplash> {\n return send(user, STAFF_URL, { method: 'POST', body: { action: 'remove', family } })\n}\n\nexport function staffApplyReaderSplash(\n user: User,\n): Promise<{ applied: number; unchanged: number; failed: number; more: boolean }> {\n return send(user, STAFF_URL, { method: 'POST', body: { action: 'apply' } })\n}\n\n/** A family's current default image, as an object URL the page revokes. */\nexport async function staffReaderSplashPreview(user: User, family: PosReaderSplashFamilyId): Promise<string | null> {\n const response = await authorizedFetch(user, `${STAFF_URL}?preview=${encodeURIComponent(family)}`, { method: 'GET' })\n if (!response.ok) return null\n return URL.createObjectURL(await response.blob())\n}\n"],"names":["authorizedFetch","PosReaderSplashRequestError","Error","message","status","send","user","url","init","response","method","headers","body","JSON","stringify","payload","json","catch","ok","String","error","STORE_URL","STAFF_URL","readerSplashStatus","hostId","action","saveReaderSplash","choice","image","staffReaderSplash","staffUploadReaderSplash","family","dataBase64","staffRemoveReaderSplash","staffApplyReaderSplash","staffReaderSplashPreview","encodeURIComponent","URL","createObjectURL","blob"],"mappings":";AAAA;;;;;;;;;;;;;;;CAeC,GACD,SAASA,eAAe,QAAQ,2CAA0C;AAe1E,OAAO,MAAMC,oCAAoCC;IAC/C,YACEC,OAAe,EACf,AAASC,MAAc,CACvB;QACA,KAAK,CAACD,eAFGC,SAAAA;IAGX;AACF;AAEA,eAAeC,KAAQC,IAAU,EAAEC,GAAW,EAAEC,IAAgD;QAIxCA;IAHtD,MAAMC,WAAW,MAAMT,gBAAgBM,MAAMC,KAAK;QAChDG,QAAQF,KAAKE,MAAM;QACnBC,SAASH,KAAKE,MAAM,KAAK,SAAS;YAAE,gBAAgB;QAAmB,IAAI,CAAC;OACxEF,KAAKE,MAAM,KAAK,SAAS;QAAEE,MAAMC,KAAKC,SAAS,EAACN,aAAAA,KAAKI,IAAI,YAATJ,aAAa,CAAC;IAAG,IAAI,CAAC;IAE5E,MAAMO,UAAU,MAAMN,SAASO,IAAI,GAAGC,KAAK,CAAC,IAAO,CAAA,CAAC,CAAA;IACpD,IAAI,CAACR,SAASS,EAAE,EAAE;;QAChB,MAAM,IAAIjB,4BAA4BkB,eAAOJ,2BAAAA,QAASK,KAAK,mBAAI,yBAAyBX,SAASL,MAAM;IACzG;IACA,OAAOW;AACT;AAEA,MAAMM,YAAY;AAClB,MAAMC,YAAY;AAElB,OAAO,SAASC,mBAAmBjB,IAAU,EAAEkB,MAAc;IAC3D,OAAOnB,KAAKC,MAAMe,WAAW;QAAEX,QAAQ;QAAQE,MAAM;YAAEa,QAAQ;YAAUD;QAAO;IAAE;AACpF;AAEA,OAAO,SAASE,iBACdpB,IAAU,EACVkB,MAAc,EACdG,MAA6B,EAC7BC,KAA+C;IAE/C,OAAOvB,KAAKC,MAAMe,WAAW;QAAEX,QAAQ;QAAQE,MAAM;YAAEa,QAAQ;YAAQD;YAAQG;WAAYC,gBAAAA,QAAS,CAAC;IAAK;AAC5G;AAiBA,OAAO,SAASC,kBAAkBvB,IAAU;IAC1C,OAAOD,KAAKC,MAAMgB,WAAW;QAAEZ,QAAQ;IAAM;AAC/C;AAEA,OAAO,SAASoB,wBACdxB,IAAU,EACVyB,MAA+B,EAC/BC,UAAkB;IAElB,OAAO3B,KAAKC,MAAMgB,WAAW;QAAEZ,QAAQ;QAAQE,MAAM;YAAEa,QAAQ;YAAUM;YAAQC;QAAW;IAAE;AAChG;AAEA,OAAO,SAASC,wBAAwB3B,IAAU,EAAEyB,MAA+B;IACjF,OAAO1B,KAAKC,MAAMgB,WAAW;QAAEZ,QAAQ;QAAQE,MAAM;YAAEa,QAAQ;YAAUM;QAAO;IAAE;AACpF;AAEA,OAAO,SAASG,uBACd5B,IAAU;IAEV,OAAOD,KAAKC,MAAMgB,WAAW;QAAEZ,QAAQ;QAAQE,MAAM;YAAEa,QAAQ;QAAQ;IAAE;AAC3E;AAEA,yEAAyE,GACzE,OAAO,eAAeU,yBAAyB7B,IAAU,EAAEyB,MAA+B;IACxF,MAAMtB,WAAW,MAAMT,gBAAgBM,MAAM,GAAGgB,UAAU,SAAS,EAAEc,mBAAmBL,SAAS,EAAE;QAAErB,QAAQ;IAAM;IACnH,IAAI,CAACD,SAASS,EAAE,EAAE,OAAO;IACzB,OAAOmB,IAAIC,eAAe,CAAC,MAAM7B,SAAS8B,IAAI;AAChD"}
@@ -27,6 +27,7 @@ import { useCallback, useEffect, useState } from "react";
27
27
  import { posDisplayCall, posReadersCall, PosRequestError } from "./pos/pos-api.js";
28
28
  import { POS_DEVICES_ANCHOR } from "./pos/pos-kiosk-readiness.component.js";
29
29
  import { POS_REGISTERS_ANCHOR, usePosPairing } from "./pos/pos-pairing.component.js";
30
+ import { PosReaderSplashSetting } from "./pos-reader-splash-setting.component.js";
30
31
  const EMPTY_ADDRESS = {
31
32
  line1: '',
32
33
  line2: '',
@@ -333,6 +334,10 @@ const EMPTY_ADDRESS = {
333
334
  })
334
335
  ]
335
336
  }) : null,
337
+ showReaders ? /*#__PURE__*/ _jsx(PosReaderSplashSetting, {
338
+ hostId: hostId,
339
+ canManagePos: canManagePos
340
+ }) : null,
336
341
  /*#__PURE__*/ _jsxs(Stack, {
337
342
  spacing: 1,
338
343
  children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-devices-card.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport { pluginDocsHelp } from '@aglyn/aglyn'\nimport { CardDisplay, useConfirmationContext } from '@aglyn/shared-ui-jsx'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport { useFirestore, useFirestoreCollection, useOrgPlan, useUser } from '@aglyn/tenant-feature-instance'\nimport {\n Box,\n Button,\n Chip,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n MenuItem,\n Stack,\n TextField,\n Typography,\n} from '@mui/material'\nimport { collection, limit, query } from 'firebase/firestore'\nimport { useCallback, useEffect, useState } from 'react'\nimport { posDisplayCall, posReadersCall, PosRequestError } from './pos/pos-api'\nimport { POS_DEVICES_ANCHOR } from './pos/pos-kiosk-readiness.component'\nimport { POS_REGISTERS_ANCHOR, usePosPairing } from './pos/pos-pairing.component'\n\ninterface ReaderRow {\n id: string\n label: string\n registerId: string | null\n deviceType: string | null\n serialNumber: string | null\n status: string\n livemode: boolean\n}\n\ninterface ReadersAnswer {\n available: boolean\n testMode: boolean\n locationReady: boolean\n readers: ReaderRow[]\n}\n\ninterface DisplayRow {\n id: string\n label: string\n createdAtMs: number\n lastSeenAtMs: number\n}\n\nexport interface PosDevicesCardProps {\n hostId: string\n /**\n * Whether the viewer may work this site's register: `managePos`, as the\n * shell resolved it, on a site role that may run it (admin or editor).\n * Pairing a tablet is refused by the server otherwise, so the card says why\n * rather than offering a button that fails. Absent reads as not allowed.\n */\n canManagePos?: boolean\n}\n\nconst EMPTY_ADDRESS = { line1: '', line2: '', city: '', state: '', postalCode: '', country: 'US' }\n\n/**\n * The register's hardware (AGL-3607, AGL-3608): Stripe Terminal card readers\n * — registered with the code a reader shows, bound to a register, renamed,\n * removed — and the customer displays paired to each register, which can be\n * signed out. Readers appear only where card readers are offered at all.\n *\n * Each register pairs a new customer display or self-service kiosk here,\n * through the same flow as the register's own Pair display (AGL-3712); a site\n * with no register is sent to the card that makes one.\n */\nexport function PosDevicesCard({ hostId, canManagePos = false }: PosDevicesCardProps) {\n const firestore = useFirestore()\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n const { confirm } = useConfirmationContext()\n const { data: registerDocs } = useFirestoreCollection<any>(\n () => query(collection(firestore, 'hosts', hostId, 'registers'), limit(25)),\n [firestore, hostId],\n { idField: '$id' },\n )\n // Not \"no registers\" until the listen has answered.\n const noRegisters = registerDocs !== undefined && registerDocs.length === 0\n const registers = [...(registerDocs ?? [])].sort((a: any, b: any) =>\n String(a.name ?? '').localeCompare(String(b.name ?? '')),\n )\n const [answer, setAnswer] = useState<ReadersAnswer | null>(null)\n const [displays, setDisplays] = useState<Record<string, DisplayRow[]>>({})\n const [adding, setAdding] = useState(false)\n const [code, setCode] = useState('')\n const [label, setLabel] = useState('')\n const [registerId, setRegisterId] = useState('')\n const [address, setAddress] = useState(EMPTY_ADDRESS)\n const [busy, setBusy] = useState(false)\n const [renaming, setRenaming] = useState<{ id: string; label: string } | null>(null)\n const { org, ready: planReady } = useOrgPlan(hostId)\n const posEntitled = planReady && Aglyn.checkEntitlement(org as any, 'pos')\n\n const notify = useCallback(\n (error: unknown, fallback: string) =>\n enqueueSnackbar(error instanceof PosRequestError ? error.message : fallback, {\n variant: 'warning',\n persist: false,\n }),\n [enqueueSnackbar],\n )\n\n const onPairingError = useCallback(\n (message: string) => enqueueSnackbar(message, { variant: 'warning', persist: false }),\n [enqueueSnackbar],\n )\n const pairingFlow = usePosPairing({ user, hostId, onError: onPairingError })\n /** Why pairing is not offered to this viewer, or null when it is. */\n const pairBlocked = !planReady\n ? 'Checking your plan…'\n : !posEntitled\n ? 'Point of Sale is not on your plan. Upgrade in Billing to pair displays and kiosks.'\n : !canManagePos\n ? 'Only an admin or editor with the \"Use the point of sale\" permission can pair displays and kiosks.'\n : null\n\n const load = useCallback(\n async (refresh = false) => {\n if (!user) return\n try {\n setAnswer(await posReadersCall<ReadersAnswer>(user, { action: 'list', hostId, refresh }))\n } catch {\n setAnswer(null)\n }\n },\n [user, hostId],\n )\n const uid = user?.uid ?? ''\n useEffect(() => {\n void load(true)\n // Keyed on the person, not the session object (see the register page).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [uid, hostId])\n\n const registerIds = registers.map((register: any) => register.$id).join(',')\n useEffect(() => {\n if (!user || !registerIds) return\n let active = true\n void Promise.all(\n registerIds.split(',').map(async (id) => {\n const result = await posDisplayCall<{ displays: DisplayRow[] }>(user, {\n action: 'displays',\n hostId,\n registerId: id,\n }).catch(() => ({ displays: [] as DisplayRow[] }))\n return [id, result.displays] as const\n }),\n ).then((entries) => {\n if (active) setDisplays(Object.fromEntries(entries))\n })\n return () => {\n active = false\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [uid, hostId, registerIds])\n\n const registerName = (id: string | null) =>\n registers.find((register: any) => register.$id === id)?.name ?? null\n\n const addReader = async () => {\n if (!user) return\n setBusy(true)\n try {\n await posReadersCall(user, {\n action: 'register',\n hostId,\n registrationCode: code.trim(),\n label: label.trim(),\n ...(registerId ? { registerId } : {}),\n ...(answer?.locationReady ? {} : { address }),\n })\n setAdding(false)\n setCode('')\n setLabel('')\n setRegisterId('')\n await load()\n } catch (error) {\n notify(error, 'The reader could not be added')\n } finally {\n setBusy(false)\n }\n }\n\n const readers = answer?.readers ?? []\n const showReaders = Boolean(answer?.available)\n\n /*\n * Arrived by a kiosk's \"Open POS devices\" (AGL-3982): this card renders\n * after the page has already tried to scroll to the anchor, so it brings\n * itself into view.\n */\n useEffect(() => {\n if (typeof window === 'undefined' || window.location.hash !== `#${POS_DEVICES_ANCHOR}`) return\n document.getElementById(POS_DEVICES_ANCHOR)?.scrollIntoView?.({ block: 'start' })\n }, [])\n\n return (\n <CardDisplay\n id={POS_DEVICES_ANCHOR}\n header={'POS devices'}\n help={pluginDocsHelp('pos', { anchor: '#card-readers' })}\n HeaderProps={\n showReaders || noRegisters\n ? {\n action: (\n <Stack direction=\"row\" spacing={1}>\n {noRegisters ? (\n <Button size=\"small\" href={`#${POS_REGISTERS_ANCHOR}`}>\n {'Add a register'}\n </Button>\n ) : null}\n {showReaders ? (\n <Button size=\"small\" onClick={() => setAdding(true)}>\n {'Add card reader'}\n </Button>\n ) : null}\n </Stack>\n ),\n }\n : undefined\n }\n contentGutterX\n contentGutterY\n >\n <Stack spacing={2}>\n {showReaders ? (\n <Stack spacing={1}>\n <Typography variant=\"subtitle2\">{'Card readers'}</Typography>\n {readers.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {answer?.testMode\n ? 'No card readers yet. In test mode, add one with the code \"simulated-wpe\" to try a simulated reader.'\n : 'No card readers yet. Add a Stripe Reader S700 or BBPOS WisePOS E with the code it shows on screen.'}\n </Typography>\n ) : (\n readers.map((reader) => (\n <Stack\n key={reader.id}\n direction=\"row\"\n spacing={1}\n sx={{ alignItems: 'center', flexWrap: 'wrap', rowGap: 1 }}\n >\n <Typography variant=\"body2\" sx={{ flex: 1, minWidth: 160 }}>\n {reader.label}\n <Typography component=\"span\" variant=\"caption\" color=\"text.secondary\">\n {` · ${registerName(reader.registerId) ?? 'Any register'}` +\n (reader.livemode ? '' : ' · test')}\n </Typography>\n </Typography>\n <Chip\n size=\"small\"\n label={reader.status === 'online' ? 'Online' : 'Offline'}\n color={reader.status === 'online' ? 'success' : 'default'}\n />\n <TextField\n select\n size=\"small\"\n label=\"Register\"\n value={reader.registerId ?? ''}\n onChange={async (event) => {\n if (!user) return\n try {\n await posReadersCall(user, {\n action: 'update',\n hostId,\n readerId: reader.id,\n registerId: event.target.value,\n })\n await load()\n } catch (error) {\n notify(error, 'The reader could not be updated')\n }\n }}\n sx={{ minWidth: 140 }}\n >\n <MenuItem value=\"\">{'Any register'}</MenuItem>\n {registers.map((register: any) => (\n <MenuItem key={register.$id} value={register.$id}>\n {register.name}\n </MenuItem>\n ))}\n </TextField>\n <Button\n size=\"small\"\n onClick={() => setRenaming({ id: reader.id, label: reader.label })}\n >\n {'Rename'}\n </Button>\n <Button\n size=\"small\"\n color=\"error\"\n onClick={async () => {\n const confirmed = await confirm({\n title: 'Remove this card reader?',\n description:\n `\"${reader.label}\" is removed from your account and stops taking payments. ` +\n 'To use it again, register it with a new code.',\n confirmationText: 'Remove',\n confirmationButtonProps: { color: 'error' },\n })\n .then(() => true)\n .catch(() => false)\n if (!confirmed || !user) return\n try {\n await posReadersCall(user, { action: 'remove', hostId, readerId: reader.id })\n await load()\n } catch (error) {\n notify(error, 'The reader could not be removed')\n }\n }}\n >\n {'Remove'}\n </Button>\n </Stack>\n ))\n )}\n </Stack>\n ) : null}\n <Stack spacing={1}>\n <Typography variant=\"subtitle2\">{'Customer displays and kiosks'}</Typography>\n {noRegisters ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'A display or kiosk pairs to a register. Add a register first.'}\n </Typography>\n ) : (\n <>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {pairBlocked ??\n 'Pair display gives you a code. Open the address it shows on the tablet and enter the code.'}\n </Typography>\n {registers.map((register: any) => (\n <Stack key={register.$id} spacing={0.5}>\n <Stack direction=\"row\" spacing={1} sx={{ alignItems: 'center' }}>\n <Typography variant=\"body2\" sx={{ flex: 1, fontWeight: 'fontWeightMedium' }} noWrap>\n {register.name}\n </Typography>\n <Button\n size=\"small\"\n disabled={Boolean(pairBlocked)}\n onClick={() => void pairingFlow.open(register.$id, 'display', register.name)}\n aria-label={`Pair display to ${register.name}`}\n >\n {'Pair display'}\n </Button>\n </Stack>\n {(displays[register.$id] ?? []).map((display) => (\n <Stack key={`${register.$id}:${display.id}`} direction=\"row\" spacing={1} sx={{ alignItems: 'center', pl: 2 }}>\n <Typography variant=\"body2\" sx={{ flex: 1 }}>\n {display.label}\n </Typography>\n <Chip\n size=\"small\"\n label={Date.now() - display.lastSeenAtMs < 120_000 ? 'Connected' : 'Not connected'}\n color={Date.now() - display.lastSeenAtMs < 120_000 ? 'success' : 'default'}\n />\n <Button\n size=\"small\"\n color=\"error\"\n onClick={async () => {\n if (!user) return\n try {\n await posDisplayCall(user, {\n action: 'revoke',\n hostId,\n registerId: register.$id,\n displayId: display.id,\n })\n setDisplays((prev) => ({\n ...prev,\n [register.$id]: (prev[register.$id] ?? []).filter((entry) => entry.id !== display.id),\n }))\n } catch (error) {\n notify(error, 'The display could not be signed out')\n }\n }}\n >\n {'Sign out'}\n </Button>\n </Stack>\n ))}\n </Stack>\n ))}\n </>\n )}\n </Stack>\n </Stack>\n\n <Dialog open={Boolean(renaming)} onClose={() => setRenaming(null)} maxWidth=\"xs\" fullWidth>\n <DialogTitle>{'Rename card reader'}</DialogTitle>\n <DialogContent>\n <TextField\n label=\"Name\"\n value={renaming?.label ?? ''}\n onChange={(event) => setRenaming((prev) => (prev ? { ...prev, label: event.target.value } : prev))}\n fullWidth\n autoFocus\n sx={{ mt: 1 }}\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setRenaming(null)}>{'Cancel'}</Button>\n <Button\n variant=\"contained\"\n disabled={!renaming?.label.trim()}\n onClick={async () => {\n if (!renaming || !user) return\n try {\n await posReadersCall(user, {\n action: 'update',\n hostId,\n readerId: renaming.id,\n label: renaming.label.trim(),\n })\n setRenaming(null)\n await load()\n } catch (error) {\n notify(error, 'The reader could not be renamed')\n }\n }}\n >\n {'Save'}\n </Button>\n </DialogActions>\n </Dialog>\n <Dialog open={adding} onClose={() => setAdding(false)} maxWidth=\"sm\" fullWidth>\n <DialogTitle>{'Add a card reader'}</DialogTitle>\n <DialogContent sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 1 }}>\n {'On the reader, open Settings and choose Generate pairing code, then enter the code it shows.'}\n </Typography>\n <TextField\n label=\"Registration code\"\n value={code}\n onChange={(event) => setCode(event.target.value)}\n autoFocus\n slotProps={{ htmlInput: { autoComplete: 'off' } }}\n />\n <TextField label=\"Name\" placeholder=\"Front counter reader\" value={label} onChange={(event) => setLabel(event.target.value)} />\n <TextField select label=\"Register\" value={registerId} onChange={(event) => setRegisterId(event.target.value)}>\n <MenuItem value=\"\">{'Any register'}</MenuItem>\n {registers.map((register: any) => (\n <MenuItem key={register.$id} value={register.$id}>\n {register.name}\n </MenuItem>\n ))}\n </TextField>\n {answer && !answer.locationReady ? (\n <Box sx={{ display: 'grid', gap: 1.5, gridTemplateColumns: { xs: '1fr', sm: '1fr 1fr' } }}>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ gridColumn: '1 / -1' }}>\n {'Where the reader is used. Stripe sets the reader up for this country.'}\n </Typography>\n <TextField label=\"Street\" value={address.line1} onChange={(event) => setAddress({ ...address, line1: event.target.value })} sx={{ gridColumn: '1 / -1' }} />\n <TextField label=\"City\" value={address.city} onChange={(event) => setAddress({ ...address, city: event.target.value })} />\n <TextField label=\"State\" value={address.state} onChange={(event) => setAddress({ ...address, state: event.target.value })} />\n <TextField label=\"Postal code\" value={address.postalCode} onChange={(event) => setAddress({ ...address, postalCode: event.target.value })} />\n <TextField\n label=\"Country\"\n value={address.country}\n onChange={(event) => setAddress({ ...address, country: event.target.value.toUpperCase().slice(0, 2) })}\n />\n </Box>\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setAdding(false)}>{'Cancel'}</Button>\n <Button variant=\"contained\" disabled={busy || !code.trim()} onClick={() => void addReader()}>\n {'Add reader'}\n </Button>\n </DialogActions>\n </Dialog>\n {pairingFlow.dialog}\n </CardDisplay>\n )\n}\nPosDevicesCard.displayName = 'PosDevicesCard'\n\nexport default PosDevicesCard\n"],"names":["Aglyn","pluginDocsHelp","CardDisplay","useConfirmationContext","useSnackbar","useFirestore","useFirestoreCollection","useOrgPlan","useUser","Box","Button","Chip","Dialog","DialogActions","DialogContent","DialogTitle","MenuItem","Stack","TextField","Typography","collection","limit","query","useCallback","useEffect","useState","posDisplayCall","posReadersCall","PosRequestError","POS_DEVICES_ANCHOR","POS_REGISTERS_ANCHOR","usePosPairing","EMPTY_ADDRESS","line1","line2","city","state","postalCode","country","PosDevicesCard","hostId","canManagePos","firestore","data","user","enqueueSnackbar","confirm","registerDocs","idField","noRegisters","undefined","length","registers","sort","a","b","String","name","localeCompare","answer","setAnswer","displays","setDisplays","adding","setAdding","code","setCode","label","setLabel","registerId","setRegisterId","address","setAddress","busy","setBusy","renaming","setRenaming","org","ready","planReady","posEntitled","checkEntitlement","notify","error","fallback","message","variant","persist","onPairingError","pairingFlow","onError","pairBlocked","load","refresh","action","uid","registerIds","map","register","$id","join","active","Promise","all","split","id","result","catch","then","entries","Object","fromEntries","registerName","find","addReader","registrationCode","trim","locationReady","readers","showReaders","Boolean","available","document","window","location","hash","getElementById","scrollIntoView","block","header","help","anchor","HeaderProps","direction","spacing","size","href","onClick","contentGutterX","contentGutterY","color","testMode","reader","sx","alignItems","flexWrap","rowGap","flex","minWidth","component","livemode","status","select","value","onChange","event","readerId","target","confirmed","title","description","confirmationText","confirmationButtonProps","fontWeight","noWrap","disabled","open","aria-label","display","pl","Date","now","lastSeenAtMs","displayId","prev","filter","entry","onClose","maxWidth","fullWidth","autoFocus","mt","flexDirection","gap","slotProps","htmlInput","autoComplete","placeholder","gridTemplateColumns","xs","sm","gridColumn","toUpperCase","slice","dialog","displayName"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-devices-card.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport { pluginDocsHelp } from '@aglyn/aglyn'\nimport { CardDisplay, useConfirmationContext } from '@aglyn/shared-ui-jsx'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport { useFirestore, useFirestoreCollection, useOrgPlan, useUser } from '@aglyn/tenant-feature-instance'\nimport {\n Box,\n Button,\n Chip,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n MenuItem,\n Stack,\n TextField,\n Typography,\n} from '@mui/material'\nimport { collection, limit, query } from 'firebase/firestore'\nimport { useCallback, useEffect, useState } from 'react'\nimport { posDisplayCall, posReadersCall, PosRequestError } from './pos/pos-api'\nimport { POS_DEVICES_ANCHOR } from './pos/pos-kiosk-readiness.component'\nimport { POS_REGISTERS_ANCHOR, usePosPairing } from './pos/pos-pairing.component'\nimport { PosReaderSplashSetting } from './pos-reader-splash-setting.component'\n\ninterface ReaderRow {\n id: string\n label: string\n registerId: string | null\n deviceType: string | null\n serialNumber: string | null\n status: string\n livemode: boolean\n}\n\ninterface ReadersAnswer {\n available: boolean\n testMode: boolean\n locationReady: boolean\n readers: ReaderRow[]\n}\n\ninterface DisplayRow {\n id: string\n label: string\n createdAtMs: number\n lastSeenAtMs: number\n}\n\nexport interface PosDevicesCardProps {\n hostId: string\n /**\n * Whether the viewer may work this site's register: `managePos`, as the\n * shell resolved it, on a site role that may run it (admin or editor).\n * Pairing a tablet is refused by the server otherwise, so the card says why\n * rather than offering a button that fails. Absent reads as not allowed.\n */\n canManagePos?: boolean\n}\n\nconst EMPTY_ADDRESS = { line1: '', line2: '', city: '', state: '', postalCode: '', country: 'US' }\n\n/**\n * The register's hardware (AGL-3607, AGL-3608): Stripe Terminal card readers\n * — registered with the code a reader shows, bound to a register, renamed,\n * removed — and the customer displays paired to each register, which can be\n * signed out. Readers appear only where card readers are offered at all.\n *\n * Each register pairs a new customer display or self-service kiosk here,\n * through the same flow as the register's own Pair display (AGL-3712); a site\n * with no register is sent to the card that makes one.\n */\nexport function PosDevicesCard({ hostId, canManagePos = false }: PosDevicesCardProps) {\n const firestore = useFirestore()\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n const { confirm } = useConfirmationContext()\n const { data: registerDocs } = useFirestoreCollection<any>(\n () => query(collection(firestore, 'hosts', hostId, 'registers'), limit(25)),\n [firestore, hostId],\n { idField: '$id' },\n )\n // Not \"no registers\" until the listen has answered.\n const noRegisters = registerDocs !== undefined && registerDocs.length === 0\n const registers = [...(registerDocs ?? [])].sort((a: any, b: any) =>\n String(a.name ?? '').localeCompare(String(b.name ?? '')),\n )\n const [answer, setAnswer] = useState<ReadersAnswer | null>(null)\n const [displays, setDisplays] = useState<Record<string, DisplayRow[]>>({})\n const [adding, setAdding] = useState(false)\n const [code, setCode] = useState('')\n const [label, setLabel] = useState('')\n const [registerId, setRegisterId] = useState('')\n const [address, setAddress] = useState(EMPTY_ADDRESS)\n const [busy, setBusy] = useState(false)\n const [renaming, setRenaming] = useState<{ id: string; label: string } | null>(null)\n const { org, ready: planReady } = useOrgPlan(hostId)\n const posEntitled = planReady && Aglyn.checkEntitlement(org as any, 'pos')\n\n const notify = useCallback(\n (error: unknown, fallback: string) =>\n enqueueSnackbar(error instanceof PosRequestError ? error.message : fallback, {\n variant: 'warning',\n persist: false,\n }),\n [enqueueSnackbar],\n )\n\n const onPairingError = useCallback(\n (message: string) => enqueueSnackbar(message, { variant: 'warning', persist: false }),\n [enqueueSnackbar],\n )\n const pairingFlow = usePosPairing({ user, hostId, onError: onPairingError })\n /** Why pairing is not offered to this viewer, or null when it is. */\n const pairBlocked = !planReady\n ? 'Checking your plan…'\n : !posEntitled\n ? 'Point of Sale is not on your plan. Upgrade in Billing to pair displays and kiosks.'\n : !canManagePos\n ? 'Only an admin or editor with the \"Use the point of sale\" permission can pair displays and kiosks.'\n : null\n\n const load = useCallback(\n async (refresh = false) => {\n if (!user) return\n try {\n setAnswer(await posReadersCall<ReadersAnswer>(user, { action: 'list', hostId, refresh }))\n } catch {\n setAnswer(null)\n }\n },\n [user, hostId],\n )\n const uid = user?.uid ?? ''\n useEffect(() => {\n void load(true)\n // Keyed on the person, not the session object (see the register page).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [uid, hostId])\n\n const registerIds = registers.map((register: any) => register.$id).join(',')\n useEffect(() => {\n if (!user || !registerIds) return\n let active = true\n void Promise.all(\n registerIds.split(',').map(async (id) => {\n const result = await posDisplayCall<{ displays: DisplayRow[] }>(user, {\n action: 'displays',\n hostId,\n registerId: id,\n }).catch(() => ({ displays: [] as DisplayRow[] }))\n return [id, result.displays] as const\n }),\n ).then((entries) => {\n if (active) setDisplays(Object.fromEntries(entries))\n })\n return () => {\n active = false\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [uid, hostId, registerIds])\n\n const registerName = (id: string | null) =>\n registers.find((register: any) => register.$id === id)?.name ?? null\n\n const addReader = async () => {\n if (!user) return\n setBusy(true)\n try {\n await posReadersCall(user, {\n action: 'register',\n hostId,\n registrationCode: code.trim(),\n label: label.trim(),\n ...(registerId ? { registerId } : {}),\n ...(answer?.locationReady ? {} : { address }),\n })\n setAdding(false)\n setCode('')\n setLabel('')\n setRegisterId('')\n await load()\n } catch (error) {\n notify(error, 'The reader could not be added')\n } finally {\n setBusy(false)\n }\n }\n\n const readers = answer?.readers ?? []\n const showReaders = Boolean(answer?.available)\n\n /*\n * Arrived by a kiosk's \"Open POS devices\" (AGL-3982): this card renders\n * after the page has already tried to scroll to the anchor, so it brings\n * itself into view.\n */\n useEffect(() => {\n if (typeof window === 'undefined' || window.location.hash !== `#${POS_DEVICES_ANCHOR}`) return\n document.getElementById(POS_DEVICES_ANCHOR)?.scrollIntoView?.({ block: 'start' })\n }, [])\n\n return (\n <CardDisplay\n id={POS_DEVICES_ANCHOR}\n header={'POS devices'}\n help={pluginDocsHelp('pos', { anchor: '#card-readers' })}\n HeaderProps={\n showReaders || noRegisters\n ? {\n action: (\n <Stack direction=\"row\" spacing={1}>\n {noRegisters ? (\n <Button size=\"small\" href={`#${POS_REGISTERS_ANCHOR}`}>\n {'Add a register'}\n </Button>\n ) : null}\n {showReaders ? (\n <Button size=\"small\" onClick={() => setAdding(true)}>\n {'Add card reader'}\n </Button>\n ) : null}\n </Stack>\n ),\n }\n : undefined\n }\n contentGutterX\n contentGutterY\n >\n <Stack spacing={2}>\n {showReaders ? (\n <Stack spacing={1}>\n <Typography variant=\"subtitle2\">{'Card readers'}</Typography>\n {readers.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {answer?.testMode\n ? 'No card readers yet. In test mode, add one with the code \"simulated-wpe\" to try a simulated reader.'\n : 'No card readers yet. Add a Stripe Reader S700 or BBPOS WisePOS E with the code it shows on screen.'}\n </Typography>\n ) : (\n readers.map((reader) => (\n <Stack\n key={reader.id}\n direction=\"row\"\n spacing={1}\n sx={{ alignItems: 'center', flexWrap: 'wrap', rowGap: 1 }}\n >\n <Typography variant=\"body2\" sx={{ flex: 1, minWidth: 160 }}>\n {reader.label}\n <Typography component=\"span\" variant=\"caption\" color=\"text.secondary\">\n {` · ${registerName(reader.registerId) ?? 'Any register'}` +\n (reader.livemode ? '' : ' · test')}\n </Typography>\n </Typography>\n <Chip\n size=\"small\"\n label={reader.status === 'online' ? 'Online' : 'Offline'}\n color={reader.status === 'online' ? 'success' : 'default'}\n />\n <TextField\n select\n size=\"small\"\n label=\"Register\"\n value={reader.registerId ?? ''}\n onChange={async (event) => {\n if (!user) return\n try {\n await posReadersCall(user, {\n action: 'update',\n hostId,\n readerId: reader.id,\n registerId: event.target.value,\n })\n await load()\n } catch (error) {\n notify(error, 'The reader could not be updated')\n }\n }}\n sx={{ minWidth: 140 }}\n >\n <MenuItem value=\"\">{'Any register'}</MenuItem>\n {registers.map((register: any) => (\n <MenuItem key={register.$id} value={register.$id}>\n {register.name}\n </MenuItem>\n ))}\n </TextField>\n <Button\n size=\"small\"\n onClick={() => setRenaming({ id: reader.id, label: reader.label })}\n >\n {'Rename'}\n </Button>\n <Button\n size=\"small\"\n color=\"error\"\n onClick={async () => {\n const confirmed = await confirm({\n title: 'Remove this card reader?',\n description:\n `\"${reader.label}\" is removed from your account and stops taking payments. ` +\n 'To use it again, register it with a new code.',\n confirmationText: 'Remove',\n confirmationButtonProps: { color: 'error' },\n })\n .then(() => true)\n .catch(() => false)\n if (!confirmed || !user) return\n try {\n await posReadersCall(user, { action: 'remove', hostId, readerId: reader.id })\n await load()\n } catch (error) {\n notify(error, 'The reader could not be removed')\n }\n }}\n >\n {'Remove'}\n </Button>\n </Stack>\n ))\n )}\n </Stack>\n ) : null}\n {/* What the readers show while idle (AGL-4048); renders nothing\n where card readers are not offered. */}\n {showReaders ? <PosReaderSplashSetting hostId={hostId} canManagePos={canManagePos} /> : null}\n <Stack spacing={1}>\n <Typography variant=\"subtitle2\">{'Customer displays and kiosks'}</Typography>\n {noRegisters ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'A display or kiosk pairs to a register. Add a register first.'}\n </Typography>\n ) : (\n <>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {pairBlocked ??\n 'Pair display gives you a code. Open the address it shows on the tablet and enter the code.'}\n </Typography>\n {registers.map((register: any) => (\n <Stack key={register.$id} spacing={0.5}>\n <Stack direction=\"row\" spacing={1} sx={{ alignItems: 'center' }}>\n <Typography variant=\"body2\" sx={{ flex: 1, fontWeight: 'fontWeightMedium' }} noWrap>\n {register.name}\n </Typography>\n <Button\n size=\"small\"\n disabled={Boolean(pairBlocked)}\n onClick={() => void pairingFlow.open(register.$id, 'display', register.name)}\n aria-label={`Pair display to ${register.name}`}\n >\n {'Pair display'}\n </Button>\n </Stack>\n {(displays[register.$id] ?? []).map((display) => (\n <Stack key={`${register.$id}:${display.id}`} direction=\"row\" spacing={1} sx={{ alignItems: 'center', pl: 2 }}>\n <Typography variant=\"body2\" sx={{ flex: 1 }}>\n {display.label}\n </Typography>\n <Chip\n size=\"small\"\n label={Date.now() - display.lastSeenAtMs < 120_000 ? 'Connected' : 'Not connected'}\n color={Date.now() - display.lastSeenAtMs < 120_000 ? 'success' : 'default'}\n />\n <Button\n size=\"small\"\n color=\"error\"\n onClick={async () => {\n if (!user) return\n try {\n await posDisplayCall(user, {\n action: 'revoke',\n hostId,\n registerId: register.$id,\n displayId: display.id,\n })\n setDisplays((prev) => ({\n ...prev,\n [register.$id]: (prev[register.$id] ?? []).filter((entry) => entry.id !== display.id),\n }))\n } catch (error) {\n notify(error, 'The display could not be signed out')\n }\n }}\n >\n {'Sign out'}\n </Button>\n </Stack>\n ))}\n </Stack>\n ))}\n </>\n )}\n </Stack>\n </Stack>\n\n <Dialog open={Boolean(renaming)} onClose={() => setRenaming(null)} maxWidth=\"xs\" fullWidth>\n <DialogTitle>{'Rename card reader'}</DialogTitle>\n <DialogContent>\n <TextField\n label=\"Name\"\n value={renaming?.label ?? ''}\n onChange={(event) => setRenaming((prev) => (prev ? { ...prev, label: event.target.value } : prev))}\n fullWidth\n autoFocus\n sx={{ mt: 1 }}\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setRenaming(null)}>{'Cancel'}</Button>\n <Button\n variant=\"contained\"\n disabled={!renaming?.label.trim()}\n onClick={async () => {\n if (!renaming || !user) return\n try {\n await posReadersCall(user, {\n action: 'update',\n hostId,\n readerId: renaming.id,\n label: renaming.label.trim(),\n })\n setRenaming(null)\n await load()\n } catch (error) {\n notify(error, 'The reader could not be renamed')\n }\n }}\n >\n {'Save'}\n </Button>\n </DialogActions>\n </Dialog>\n <Dialog open={adding} onClose={() => setAdding(false)} maxWidth=\"sm\" fullWidth>\n <DialogTitle>{'Add a card reader'}</DialogTitle>\n <DialogContent sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 1 }}>\n {'On the reader, open Settings and choose Generate pairing code, then enter the code it shows.'}\n </Typography>\n <TextField\n label=\"Registration code\"\n value={code}\n onChange={(event) => setCode(event.target.value)}\n autoFocus\n slotProps={{ htmlInput: { autoComplete: 'off' } }}\n />\n <TextField label=\"Name\" placeholder=\"Front counter reader\" value={label} onChange={(event) => setLabel(event.target.value)} />\n <TextField select label=\"Register\" value={registerId} onChange={(event) => setRegisterId(event.target.value)}>\n <MenuItem value=\"\">{'Any register'}</MenuItem>\n {registers.map((register: any) => (\n <MenuItem key={register.$id} value={register.$id}>\n {register.name}\n </MenuItem>\n ))}\n </TextField>\n {answer && !answer.locationReady ? (\n <Box sx={{ display: 'grid', gap: 1.5, gridTemplateColumns: { xs: '1fr', sm: '1fr 1fr' } }}>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ gridColumn: '1 / -1' }}>\n {'Where the reader is used. Stripe sets the reader up for this country.'}\n </Typography>\n <TextField label=\"Street\" value={address.line1} onChange={(event) => setAddress({ ...address, line1: event.target.value })} sx={{ gridColumn: '1 / -1' }} />\n <TextField label=\"City\" value={address.city} onChange={(event) => setAddress({ ...address, city: event.target.value })} />\n <TextField label=\"State\" value={address.state} onChange={(event) => setAddress({ ...address, state: event.target.value })} />\n <TextField label=\"Postal code\" value={address.postalCode} onChange={(event) => setAddress({ ...address, postalCode: event.target.value })} />\n <TextField\n label=\"Country\"\n value={address.country}\n onChange={(event) => setAddress({ ...address, country: event.target.value.toUpperCase().slice(0, 2) })}\n />\n </Box>\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setAdding(false)}>{'Cancel'}</Button>\n <Button variant=\"contained\" disabled={busy || !code.trim()} onClick={() => void addReader()}>\n {'Add reader'}\n </Button>\n </DialogActions>\n </Dialog>\n {pairingFlow.dialog}\n </CardDisplay>\n )\n}\nPosDevicesCard.displayName = 'PosDevicesCard'\n\nexport default PosDevicesCard\n"],"names":["Aglyn","pluginDocsHelp","CardDisplay","useConfirmationContext","useSnackbar","useFirestore","useFirestoreCollection","useOrgPlan","useUser","Box","Button","Chip","Dialog","DialogActions","DialogContent","DialogTitle","MenuItem","Stack","TextField","Typography","collection","limit","query","useCallback","useEffect","useState","posDisplayCall","posReadersCall","PosRequestError","POS_DEVICES_ANCHOR","POS_REGISTERS_ANCHOR","usePosPairing","PosReaderSplashSetting","EMPTY_ADDRESS","line1","line2","city","state","postalCode","country","PosDevicesCard","hostId","canManagePos","firestore","data","user","enqueueSnackbar","confirm","registerDocs","idField","noRegisters","undefined","length","registers","sort","a","b","String","name","localeCompare","answer","setAnswer","displays","setDisplays","adding","setAdding","code","setCode","label","setLabel","registerId","setRegisterId","address","setAddress","busy","setBusy","renaming","setRenaming","org","ready","planReady","posEntitled","checkEntitlement","notify","error","fallback","message","variant","persist","onPairingError","pairingFlow","onError","pairBlocked","load","refresh","action","uid","registerIds","map","register","$id","join","active","Promise","all","split","id","result","catch","then","entries","Object","fromEntries","registerName","find","addReader","registrationCode","trim","locationReady","readers","showReaders","Boolean","available","document","window","location","hash","getElementById","scrollIntoView","block","header","help","anchor","HeaderProps","direction","spacing","size","href","onClick","contentGutterX","contentGutterY","color","testMode","reader","sx","alignItems","flexWrap","rowGap","flex","minWidth","component","livemode","status","select","value","onChange","event","readerId","target","confirmed","title","description","confirmationText","confirmationButtonProps","fontWeight","noWrap","disabled","open","aria-label","display","pl","Date","now","lastSeenAtMs","displayId","prev","filter","entry","onClose","maxWidth","fullWidth","autoFocus","mt","flexDirection","gap","slotProps","htmlInput","autoComplete","placeholder","gridTemplateColumns","xs","sm","gridColumn","toUpperCase","slice","dialog","displayName"],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type PosHardwareOrderStatus } from '../../model/pos-hardware';
2
+ export declare const POS_HARDWARE_STATUS_COLOR: Record<PosHardwareOrderStatus, 'default' | 'info' | 'primary' | 'success'>;
3
+ export interface PosHardwareCardProps {
4
+ hostId: string;
5
+ /**
6
+ * Whether the viewer may work this site's register — the same gate the
7
+ * shop's route asks (`managePos` on an admin or editor role). The shop is
8
+ * the register's hardware, so a viewer who may not run it is not shown it.
9
+ */
10
+ canManagePos?: boolean;
11
+ }
12
+ /**
13
+ * The Hardware card (AGL-4038): Stripe card readers and accessories sold by
14
+ * the platform and shipped by Stripe straight to the store, with the store's
15
+ * orders and their tracking underneath.
16
+ *
17
+ * HIDDEN, NOT DISABLED, while the deployment has not opened the shop: it is a
18
+ * gate only the platform can lift, so naming it would point at a step nobody
19
+ * on the workspace can take. The route answers `available: false` until
20
+ * every price, the markup and the shipping figures are configured.
21
+ */
22
+ export declare function PosHardwareCard({ hostId, canManagePos }: PosHardwareCardProps): import("react").JSX.Element;
23
+ export declare namespace PosHardwareCard {
24
+ var displayName: string;
25
+ }
26
+ export default PosHardwareCard;