sme-pos-package 1.0.7 → 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (318) hide show
  1. package/dist/index.d.mts +37 -2
  2. package/dist/index.mjs +17 -104
  3. package/dist/index.mjs.map +1 -1
  4. package/dist/tailwind.preset.d.mts +27 -0
  5. package/dist/tailwind.preset.mjs +2 -0
  6. package/dist/tailwind.preset.mjs.map +1 -0
  7. package/package.json +18 -30
  8. package/public/assets/images/bank-logos.png +0 -0
  9. package/public/assets/images/banner1.png +0 -0
  10. package/public/assets/images/banner2.png +0 -0
  11. package/public/assets/images/banner3.png +0 -0
  12. package/public/assets/images/banner4.png +0 -0
  13. package/public/assets/images/cashier.svg +9 -0
  14. package/public/assets/images/empty-cart.png +0 -0
  15. package/public/assets/images/empty-table-state.png +0 -0
  16. package/public/assets/images/layout-display/left-layout.png +0 -0
  17. package/public/assets/images/layout-display/right-layout.png +0 -0
  18. package/public/assets/images/modal-illustration.png +0 -0
  19. package/public/assets/images/order-empty-state.png +0 -0
  20. package/public/assets/images/order.png +0 -0
  21. package/public/assets/images/payment-success-label.png +0 -0
  22. package/public/assets/images/table-empty.png +0 -0
  23. package/public/assets/images/take-away.png +0 -0
  24. package/public/assets/lottie/loading.json +1 -0
  25. package/public/assets/lottie/soft_pos.json +1 -0
  26. package/public/assets/lottie/success.json +1 -0
  27. package/public/config.json +27 -0
  28. package/public/env.json +17 -0
  29. package/src/animations/success.json +9730 -0
  30. package/src/assets/icons/breadcrumbs-icon.tsx +85 -0
  31. package/src/assets/icons/cart-icon.tsx +14 -0
  32. package/src/assets/icons/common.tsx +270 -0
  33. package/src/assets/icons/customer-view-icon.tsx +20 -0
  34. package/src/assets/icons/dining-table.tsx +34 -0
  35. package/src/assets/icons/edit-line-icon.tsx +18 -0
  36. package/src/assets/icons/emenu-icon.tsx +39 -0
  37. package/src/assets/icons/file-close-line-icon.tsx +18 -0
  38. package/src/assets/icons/helper-icon.tsx +84 -0
  39. package/src/assets/icons/home-gear-line-icon.tsx +18 -0
  40. package/src/assets/icons/kanban-icon.tsx +16 -0
  41. package/src/assets/icons/loading-icon.tsx +45 -0
  42. package/src/assets/icons/logout-box-line-icon.tsx +18 -0
  43. package/src/assets/icons/order-icon.tsx +92 -0
  44. package/src/assets/icons/payment-icon.tsx +429 -0
  45. package/src/assets/icons/pincode.tsx +196 -0
  46. package/src/assets/icons/pos-connect-icon.tsx +67 -0
  47. package/src/assets/icons/pos-device-icon.tsx +52 -0
  48. package/src/assets/icons/pos-icon.tsx +75 -0
  49. package/src/assets/icons/printer-line-icon.tsx +18 -0
  50. package/src/assets/icons/star-icon.tsx +174 -0
  51. package/src/assets/icons/table-icon.tsx +77 -0
  52. package/src/assets/icons/user-add-line-icon.tsx +33 -0
  53. package/src/assets/icons/user-icon.tsx +65 -0
  54. package/src/components/common/button-action.tsx +46 -0
  55. package/src/components/common/button-icon.tsx +23 -0
  56. package/src/components/common/dropdown/index.tsx +79 -0
  57. package/src/components/common/empty-state.tsx +60 -0
  58. package/src/components/common/header/index.tsx +89 -0
  59. package/src/components/common/header/tabs.tsx +119 -0
  60. package/src/components/common/image.tsx +20 -0
  61. package/src/components/common/input/index.tsx +55 -0
  62. package/src/components/common/input/radio-group.tsx +75 -0
  63. package/src/components/common/input/text-area.tsx +28 -0
  64. package/src/components/common/modal/delete-confirm-modal-container.tsx +65 -0
  65. package/src/components/common/modal/index.ts +2 -0
  66. package/src/components/common/modal/modal-direction.tsx +125 -0
  67. package/src/components/common/modal/modal-header.tsx +37 -0
  68. package/src/components/common/modal/modal-wrapper.tsx +56 -0
  69. package/src/components/common/modal/modal-zoom.tsx +61 -0
  70. package/src/components/common/pagination.tsx +95 -0
  71. package/src/components/common/refresh-button.tsx +28 -0
  72. package/src/components/common/search-bar.tsx +27 -0
  73. package/src/components/common/search.tsx +59 -0
  74. package/src/components/common/skeleton.tsx +7 -0
  75. package/src/components/common/tabs-layout.tsx +98 -0
  76. package/src/components/common/use-check-session.tsx +19 -0
  77. package/src/components/customer-management/add-customer/add-customer-drawer.tsx +286 -0
  78. package/src/components/customer-management/add-customer/address-select.tsx +51 -0
  79. package/src/components/customer-management/choose-customer-drawer.tsx +177 -0
  80. package/src/components/customer-management/customer-info-drawer.tsx +166 -0
  81. package/src/components/customer-management/customer-no-data.tsx +18 -0
  82. package/src/components/emenu/emenu-qr-code.tsx +59 -0
  83. package/src/components/emenu/menu-link.tsx +67 -0
  84. package/src/components/index.ts +8 -0
  85. package/src/components/kanban-template/kitchen-template.tsx +60 -0
  86. package/src/components/kanban-template/pos-order-template.tsx +77 -0
  87. package/src/components/kanban-template/pos-template.tsx +170 -0
  88. package/src/components/kitchen-management/change-status-confirm-modal.tsx +61 -0
  89. package/src/components/kitchen-management/index.ts +1 -0
  90. package/src/components/kitchen-management/kitchen-order/index.tsx +153 -0
  91. package/src/components/kitchen-management/kitchen-order/line.tsx +78 -0
  92. package/src/components/kitchen-management/kitchen-order/state.tsx +52 -0
  93. package/src/components/kitchen-management/kitchen-status.tsx +69 -0
  94. package/src/components/kitchen-management/orders-kitchen-management.tsx +113 -0
  95. package/src/components/order-management/index.tsx +128 -0
  96. package/src/components/order-management/order-actions.tsx +46 -0
  97. package/src/components/order-management/order-detail/header.tsx +37 -0
  98. package/src/components/order-management/order-detail/index.ts +3 -0
  99. package/src/components/order-management/order-detail/information.tsx +96 -0
  100. package/src/components/order-management/order-detail/order-detail.tsx +84 -0
  101. package/src/components/order-management/order-detail/order-line.tsx +56 -0
  102. package/src/components/order-management/order-detail/summary.tsx +221 -0
  103. package/src/components/order-management/order-header.tsx +113 -0
  104. package/src/components/order-management/order-pagination.tsx +49 -0
  105. package/src/components/order-management/order-status.tsx +58 -0
  106. package/src/components/order-management/order-table.tsx +179 -0
  107. package/src/components/order-management/order-tabs.tsx +48 -0
  108. package/src/components/pos-management/add-product-from-barcode/index.tsx +97 -0
  109. package/src/components/pos-management/cart-content/action-line.tsx +81 -0
  110. package/src/components/pos-management/cart-content/cancel-order-line-modal.tsx +41 -0
  111. package/src/components/pos-management/cart-content/cart-item.tsx +173 -0
  112. package/src/components/pos-management/cart-content/cart-items.tsx +130 -0
  113. package/src/components/pos-management/cart-content/draft-orders/draft-order-line.tsx +67 -0
  114. package/src/components/pos-management/cart-content/draft-orders/index.tsx +40 -0
  115. package/src/components/pos-management/cart-content/edit-cart-modal.tsx +11 -0
  116. package/src/components/pos-management/cart-content/index.tsx +260 -0
  117. package/src/components/pos-management/cart-content/no-select-order.tsx +26 -0
  118. package/src/components/pos-management/cart-content/order-info/customer-info.tsx +53 -0
  119. package/src/components/pos-management/cart-content/order-info/index.tsx +109 -0
  120. package/src/components/pos-management/cart-content/order-total.tsx +36 -0
  121. package/src/components/pos-management/cart-content/orders-line.tsx +72 -0
  122. package/src/components/pos-management/menu-content/category-tab.tsx +38 -0
  123. package/src/components/pos-management/menu-content/create-order-modal.tsx +65 -0
  124. package/src/components/pos-management/menu-content/product-content.tsx +93 -0
  125. package/src/components/pos-management/menu-content/product-detail/info.tsx +28 -0
  126. package/src/components/pos-management/menu-content/product-detail/modal.tsx +148 -0
  127. package/src/components/pos-management/menu-content/product-detail/option.tsx +87 -0
  128. package/src/components/pos-management/menu-content/product-detail/quantity-control.tsx +155 -0
  129. package/src/components/pos-management/menu-content/product-detail/sale-keypad.tsx +100 -0
  130. package/src/components/pos-management/menu-content/product-item.tsx +65 -0
  131. package/src/components/pos-management/order-helper/cancel-order-confirm.tsx +43 -0
  132. package/src/components/pos-management/order-helper/history-call.tsx +105 -0
  133. package/src/components/pos-management/order-helper/order-helper-modal.tsx +116 -0
  134. package/src/components/pos-management/payment-content/bill/actions.tsx +46 -0
  135. package/src/components/pos-management/payment-content/bill/content.tsx +207 -0
  136. package/src/components/pos-management/payment-content/bill/index.tsx +18 -0
  137. package/src/components/pos-management/payment-content/card-payment/index.tsx +124 -0
  138. package/src/components/pos-management/payment-content/card-payment/pos-payment/pos-connect.tsx +183 -0
  139. package/src/components/pos-management/payment-content/card-payment/pos-payment/qr-connect.tsx +185 -0
  140. package/src/components/pos-management/payment-content/card-payment/waiting-for-payment-pos-modal.tsx +37 -0
  141. package/src/components/pos-management/payment-content/cash-payment/index.tsx +216 -0
  142. package/src/components/pos-management/payment-content/index.tsx +70 -0
  143. package/src/components/pos-management/payment-content/payment-info.tsx +67 -0
  144. package/src/components/pos-management/payment-content/payment-layout.tsx +16 -0
  145. package/src/components/pos-management/payment-content/payment-method-cards.tsx +99 -0
  146. package/src/components/pos-management/payment-content/qr-payment/index.tsx +118 -0
  147. package/src/components/pos-management/payment-content/qr-payment/qr_code.js +29 -0
  148. package/src/components/pos-management/payment-content/qr-payment/vietqr.js +436 -0
  149. package/src/components/pos-management/payment-content/session-close-modal.tsx +35 -0
  150. package/src/components/pos-management/payment-content/soft-pos-payment/index.tsx +48 -0
  151. package/src/components/pos-management/pos-helpers/back-confirm.tsx +45 -0
  152. package/src/components/pos-management/pos-helpers/index.tsx +135 -0
  153. package/src/components/pos-management/pos-helpers/layout-display-modal.tsx +99 -0
  154. package/src/components/pos-management/search.tsx +48 -0
  155. package/src/components/pos-management/table-content/filtered-tables.tsx +59 -0
  156. package/src/components/pos-management/table-content/floor-tabs.tsx +65 -0
  157. package/src/components/pos-management/table-content/index.tsx +76 -0
  158. package/src/components/pos-management/table-content/table-item.tsx +127 -0
  159. package/src/components/pos-management/table-content/tables.tsx +96 -0
  160. package/src/components/restaurant-management/add-floor-modal.tsx +133 -0
  161. package/src/components/restaurant-management/add-table-modal.tsx +198 -0
  162. package/src/components/restaurant-management/delete-floor-confirm-modal.tsx +42 -0
  163. package/src/components/restaurant-management/delete-table-confirm-modal.tsx +51 -0
  164. package/src/components/restaurant-management/header.tsx +22 -0
  165. package/src/components/restaurant-management/index.tsx +54 -0
  166. package/src/components/restaurant-management/left-side.tsx +51 -0
  167. package/src/components/restaurant-management/right-side.tsx +179 -0
  168. package/src/components/restaurant-management/table-empty.tsx +43 -0
  169. package/src/components/session-management/close-session-modal/actions.tsx +45 -0
  170. package/src/components/session-management/close-session-modal/close-session-confirm.tsx +157 -0
  171. package/src/components/session-management/close-session-modal/close-session-ticket.tsx +218 -0
  172. package/src/components/session-management/close-session-modal/container.tsx +25 -0
  173. package/src/components/session-management/close-session-modal/draft-orders-confirm.tsx +53 -0
  174. package/src/components/session-management/close-session-modal/draft-orders-summary.tsx +82 -0
  175. package/src/components/session-management/close-session-modal/draft-orders.tsx +34 -0
  176. package/src/components/session-management/close-session-modal/index.tsx +35 -0
  177. package/src/components/session-management/close-session-modal/order/index.ts +1 -0
  178. package/src/components/session-management/close-session-modal/order/order-line.tsx +64 -0
  179. package/src/components/session-management/close-session-modal/order/orders-in-draft.tsx +31 -0
  180. package/src/components/session-management/close-session-modal/session-summary.tsx +165 -0
  181. package/src/components/session-management/index.ts +1 -0
  182. package/src/components/session-management/open-shift/index.tsx +172 -0
  183. package/src/components/table-management/index.tsx +0 -0
  184. package/src/constants/api/index.ts +1 -0
  185. package/src/constants/headers.constant.tsx +24 -0
  186. package/src/constants/index.ts +1 -0
  187. package/src/constants/language.store.ts +21 -0
  188. package/src/constants/methods.constant.ts +10 -0
  189. package/src/constants/order-state.ts +8 -0
  190. package/src/constants/payment-color.constant.ts +26 -0
  191. package/src/constants/query.constant.ts +14 -0
  192. package/src/constants/routes.constants.ts +23 -0
  193. package/src/constants/template-name.constant.ts +9 -0
  194. package/src/hooks/bill/use-get-bill-information.ts +49 -0
  195. package/src/hooks/bill/use-print-bill.tsx +0 -0
  196. package/src/hooks/common/load-env-config.ts +98 -0
  197. package/src/hooks/common/use-back.ts +13 -0
  198. package/src/hooks/common/use-broadcast.ts +22 -0
  199. package/src/hooks/common/use-click-outside.ts +58 -0
  200. package/src/hooks/common/use-get-base64-photo.ts +71 -0
  201. package/src/hooks/common/use-get-query.ts +25 -0
  202. package/src/hooks/common/use-pos.ts +21 -0
  203. package/src/hooks/common/use-query-params.ts +89 -0
  204. package/src/hooks/common/use-speech.ts +36 -0
  205. package/src/hooks/customer/use-customer-provider.ts +247 -0
  206. package/src/hooks/floor/use-floor-provider.ts +172 -0
  207. package/src/hooks/kitchen/use-kitchen-provider.ts +80 -0
  208. package/src/hooks/order/use-get-point-reward.ts +50 -0
  209. package/src/hooks/order/use-loop-fetch-order.ts +30 -0
  210. package/src/hooks/order/use-order-items.ts +61 -0
  211. package/src/hooks/order/use-orders.ts +76 -0
  212. package/src/hooks/payment/use-payment-provider.ts +221 -0
  213. package/src/hooks/product/use-product-provider.ts +87 -0
  214. package/src/hooks/session/use-check-session.tsx +19 -0
  215. package/src/hooks/session/use-session-provider.ts +79 -0
  216. package/src/hooks/table/use-pos-table-provider.ts +193 -0
  217. package/src/index.css +5 -0
  218. package/src/index.ts +10 -0
  219. package/src/layouts/common.tsx +15 -0
  220. package/src/layouts/index.ts +4 -0
  221. package/src/layouts/pos-layout.tsx +33 -0
  222. package/src/layouts/pos-order-layout.tsx +43 -0
  223. package/src/layouts/sale-layout.tsx +25 -0
  224. package/src/locales/en.json +394 -0
  225. package/src/locales/vi.json +400 -0
  226. package/src/pages/index.ts +4 -0
  227. package/src/pages/login/index.tsx +128 -0
  228. package/src/pages/pincode/index.tsx +198 -0
  229. package/src/pages/pos/kitchen-management/layout.tsx +18 -0
  230. package/src/pages/pos/management-floor/index.tsx +7 -0
  231. package/src/pages/pos/management-order/index.tsx +7 -0
  232. package/src/pages/pos/management-order/order-detail/index.tsx +7 -0
  233. package/src/pages/pos/management-table/index.tsx +0 -0
  234. package/src/pages/pos/payment-success/index.tsx +75 -0
  235. package/src/provider/app-provider.tsx +56 -0
  236. package/src/provider/fallback/custom-error.tsx +26 -0
  237. package/src/provider/main-provider.tsx +41 -0
  238. package/src/provider/meta-provider.tsx +72 -0
  239. package/src/provider/modal-provider.tsx +48 -0
  240. package/src/provider/notification-provider.tsx +64 -0
  241. package/src/provider/pos-provider/close-session-provider/index.tsx +207 -0
  242. package/src/provider/pos-provider/customer-provider/index.tsx +30 -0
  243. package/src/provider/pos-provider/floor-provider/index.tsx +39 -0
  244. package/src/provider/pos-provider/index.ts +6 -0
  245. package/src/provider/pos-provider/kitchen-provider/index.tsx +30 -0
  246. package/src/provider/pos-provider/order-detail-provider/index.tsx +233 -0
  247. package/src/provider/pos-provider/order-provider/index.tsx +803 -0
  248. package/src/provider/pos-provider/payment-provider/index.tsx +30 -0
  249. package/src/provider/pos-provider/product-provider/index.tsx +30 -0
  250. package/src/provider/pos-provider/sale-provider/index.tsx +168 -0
  251. package/src/provider/pos-provider/session-provider/index.tsx +30 -0
  252. package/src/provider/pos-provider/socket-provider/index.tsx +118 -0
  253. package/src/provider/pos-provider/table-provider/index.tsx +30 -0
  254. package/src/provider/public-provider.tsx +104 -0
  255. package/src/provider/use-session-provider.ts +79 -0
  256. package/src/router/app-router.tsx +38 -0
  257. package/src/router/index.tsx +26 -0
  258. package/src/router/pos-route.tsx +75 -0
  259. package/src/router/protected-route.tsx +16 -0
  260. package/src/router/public-route.tsx +11 -0
  261. package/src/store/header/index.ts +21 -0
  262. package/src/store/session/index.ts +25 -0
  263. package/src/store/states/cart.state.ts +135 -0
  264. package/src/store/states/close-session.state.ts +20 -0
  265. package/src/store/states/customer.state.ts +19 -0
  266. package/src/store/states/payment.state.ts +14 -0
  267. package/src/styles/base.css +212 -0
  268. package/src/styles/common.css +65 -0
  269. package/src/styles/lib/tailwind.css +0 -0
  270. package/src/styles/lib/tailwind.theme.css +34 -0
  271. package/src/styles/loading.css +72 -0
  272. package/src/styles/main.css +5 -0
  273. package/src/styles/refreshing-content.css +55 -0
  274. package/src/styles/text.css +44 -0
  275. package/src/types/account.ts +61 -0
  276. package/src/types/branch.ts +6 -0
  277. package/src/types/category.ts +13 -0
  278. package/src/types/common.ts +4 -0
  279. package/src/types/customer.ts +52 -0
  280. package/src/types/dashboard.ts +18 -0
  281. package/src/types/edc.ts +37 -0
  282. package/src/types/export-e-invoice.ts +17 -0
  283. package/src/types/filter.d.ts +12 -0
  284. package/src/types/floor/floor.ts +16 -0
  285. package/src/types/floor.d.ts +36 -0
  286. package/src/types/index.ts +127 -0
  287. package/src/types/invoice.ts +32 -0
  288. package/src/types/modal.ts +15 -0
  289. package/src/types/notification.ts +12 -0
  290. package/src/types/order.ts +182 -0
  291. package/src/types/payment.ts +44 -0
  292. package/src/types/product/product.ts +47 -0
  293. package/src/types/product.ts +137 -0
  294. package/src/types/provider-info.d.ts +14 -0
  295. package/src/types/qr.d.ts +25 -0
  296. package/src/types/report.d.ts +43 -0
  297. package/src/types/sale.d.ts +68 -0
  298. package/src/types/search.d.ts +7 -0
  299. package/src/types/session.d.ts +30 -0
  300. package/src/types/shop-qr.d.ts +89 -0
  301. package/src/types/staff.d.ts +35 -0
  302. package/src/types/store.d.ts +25 -0
  303. package/src/types/table.d.ts +57 -0
  304. package/src/utils/close-session-ticket.tsx +129 -0
  305. package/src/utils/functions.ts +299 -0
  306. package/src/utils/i18n.ts +25 -0
  307. package/src/utils/pos/bill.ts +156 -0
  308. package/src/utils/pos/convert-order.ts +58 -0
  309. package/src/utils/pos/helpers.ts +48 -0
  310. package/src/utils/pos/session.ts +44 -0
  311. package/src/utils/storages/index.ts +1 -0
  312. package/src/utils/storages/local-storage.ts +72 -0
  313. package/tailwind.preset.ts +25 -0
  314. package/tsconfig.json +30 -0
  315. package/tsup.config.ts +30 -0
  316. package/dist/index.d.ts +0 -58
  317. package/dist/index.js +0 -145
  318. package/dist/index.js.map +0 -1
@@ -0,0 +1,207 @@
1
+ // import { IcPrint } from "@assets/icons/breadcrumbs-icon";
2
+ // import { UsbPrinter } from "@atomsolution/usb-printer-capacitor";
3
+ // import ButtonAction from "@components/common/button-action";
4
+ // import { ScreenType } from "@components/customer-view";
5
+ // import { QUERY_KEYS } from "@constants/query.constant";
6
+ // import { LoadingIcon } from "@fctc/sme-widget-ui";
7
+ // import { useGetBase64Photo } from "@hooks/common/use-get-base64-photo";
8
+ // import { usePlatform } from "@hooks/common/use-platform";
9
+ // import { useQueryParams } from "@hooks/common/use-query-params";
10
+ // import { usePosAppProvider } from "@provider/app-provider";
11
+ // import { useOrderDetail } from "@provider/pos-provider/order-detail-provider";
12
+ // import { useOrder } from "@provider/pos-provider/order-provider";
13
+ // import { useSale } from "@provider/pos-provider/sale-provider";
14
+ // import { usePosTable } from "@provider/pos-provider/table-provider";
15
+ // import { dd_mm_yyyy, hh_mm } from "@utils/functions";
16
+ // import { CapacitorPresentation } from "dual-screen-plugin";
17
+ // import { useEffect, useMemo, useState } from "react";
18
+ // import { toast } from "react-toastify";
19
+
20
+ // const Content = ({ isHideAction }: { isHideAction?: boolean }) => {
21
+ // const { items } = useOrderDetail();
22
+ // const { orderDetailById: data } = useOrder();
23
+ // const { getQuery } = useQueryParams();
24
+
25
+ // const tableId = getQuery(QUERY_KEYS.TABLE_ID);
26
+ // const { company, userProfile } = usePosAppProvider();
27
+
28
+ // const { data: logo } = useGetBase64Photo(userProfile?.company?.logo);
29
+ // const { tablesByFloor } = usePosTable();
30
+
31
+ // const { data: saleData } = useSale().queryResult;
32
+ // const { isAndroid } = usePlatform();
33
+ // const address = useMemo(() => {
34
+ // return userProfile?.company?.address;
35
+ // }, [userProfile?.company]);
36
+
37
+ // const addressFormat = useMemo(() => {
38
+ // return `${address?.street} đường ${address?.street2}, ${
39
+ // address?.ward ?? ""
40
+ // }, Tỉnh ${address?.state} `;
41
+ // }, [userProfile?.company]);
42
+
43
+ // // const paymentMethod = useMemo(() => {
44
+ // // const paymentId = data?.payment_ids?.[0]?.payment_method_id?.id;
45
+ // // if (!paymentId) return "";
46
+ // // const methods = saleData?.["pos.payment.method"]?.data;
47
+ // // return methods?.find((method: any) => method.id === paymentId)?.name ?? "";
48
+ // // }, [data?.payment_ids, saleData]);
49
+
50
+ // const paymentMethod = "Soft POS";
51
+ // const amountTotalWithoutTax = useMemo(() => {
52
+ // return (data?.amount_total ?? 0) - (data?.amount_tax ?? 0);
53
+ // }, [data?.amount_total, data?.amount_tax]);
54
+
55
+ // const tableNumber = useMemo(() => {
56
+ // const table = tablesByFloor?.find(
57
+ // (table: any) => table?.id === Number(tableId)
58
+ // );
59
+
60
+ // return table?.table_number ?? "";
61
+ // }, [tablesByFloor]);
62
+
63
+ // const handlePrintText = async () => {
64
+ // if (!isAndroid) return;
65
+ // try {
66
+ // setPrinting(true);
67
+ // await UsbPrinter.connect();
68
+
69
+ // const textBill = generateTextBill();
70
+ // await UsbPrinter.printText({
71
+ // text: textBill,
72
+ // });
73
+
74
+ // await UsbPrinter.disconnect();
75
+ // setPrinting(false);
76
+ // } catch (e) {
77
+ // setPrinting(false);
78
+ // toast.error(`USB Print failed: ${e}`);
79
+ // }
80
+ // };
81
+
82
+ // const money = (amount: number) => {
83
+ // return amount.toLocaleString();
84
+ // };
85
+
86
+ // const generateTextBill = () => {
87
+ // // Tạo danh sách sản phẩm
88
+ // const productLines =
89
+ // items
90
+ // ?.map((item, index) => {
91
+ // const itemTotal = item.price * item.quantity;
92
+ // return `[L]${index + 1}. ${item.name}[R]${item.quantity} x ${money(
93
+ // item.unitPrice
94
+ // )}
95
+ // [R]${money(itemTotal)} VND`;
96
+ // })
97
+ // .join("\n") || "";
98
+
99
+ // const textBill = `[C]<font size='big'><b>${
100
+ // userProfile?.company?.invoice_name
101
+ // }</b></font>
102
+ // [C]<font size='small'>${addressFormat}</font>
103
+ // [C]
104
+ // [C]<font size=''>Bàn: <b>${tableNumber || "Trống"}</b> | Thời gian: <b>${
105
+ // data?.create_date && hh_mm(data?.create_date)
106
+ // } - ${data?.create_date && dd_mm_yyyy(data?.create_date)}</b></font>
107
+ // [C]
108
+ // [L]Số hoá đơn:[R]<b>${data?.pos_reference}</b>
109
+ // [L]Phương thức thanh toán:[R]<b>${paymentMethod || "Chưa xác định"}</b>
110
+ // [C]----------------------------------------
111
+ // [L]<b>TT | Tên món | SL | Đơn giá | Thành tiền</b>
112
+ // [C]----------------------------------------
113
+ // ${productLines}
114
+ // [C]----------------------------------------
115
+ // [L]Thuế (VAT):[R]${money(data?.amount_tax ?? 0)} VND
116
+ // [L]Thành tiền:[R]${money(amountTotalWithoutTax)} VND
117
+ // [C]========================================
118
+ // [L]<font size='wide,tall'><b>Tổng tiền:</b></font>[R]<font size='wide,tall'><b>${money(
119
+ // data?.amount_total ?? 0
120
+ // )} VND</b></font>
121
+ // [C]========================================
122
+ // [C]
123
+ // [C]<font size='small'>${
124
+ // userProfile?.company?.invoice_name
125
+ // } xin chân thành cảm ơn!
126
+ // [C]Powered by ${company?.companyInfo?.data?.[0]?.display_name}</font>
127
+ // [C]
128
+ // [C]
129
+ // [C]`;
130
+
131
+ // return textBill.trimStart();
132
+ // };
133
+
134
+ // const [printing, setPrinting] = useState(false);
135
+
136
+ // useEffect(() => {
137
+ // CapacitorPresentation.sendMessage({
138
+ // data: {
139
+ // screen: ScreenType.PAYMENT_SUCCESS,
140
+ // data: {
141
+ // totalAmount: data?.amount_total,
142
+ // time: `${data?.create_date && hh_mm(data?.create_date)} - ${
143
+ // data?.create_date && dd_mm_yyyy(data?.create_date)
144
+ // }`,
145
+ // paymentMethod: paymentMethod,
146
+ // orderNumber: data?.pos_reference,
147
+ // },
148
+ // },
149
+ // });
150
+ // }, [paymentMethod, data]);
151
+
152
+ // useEffect(() => {
153
+ // logo && handlePrintText();
154
+ // }, [logo]);
155
+
156
+ // return (
157
+ // <div className="flex flex-col gap-3 w-full pt-8">
158
+ // {!isHideAction && (
159
+ // <div className="flex flex-col items-center justify-center gap-2.5">
160
+ // {/* <div className="flex items-center gap-2">
161
+ // <label className="text-sm">
162
+ // <input
163
+ // type="radio"
164
+ // name="printMode"
165
+ // value="text"
166
+ // checked={printMode === "text"}
167
+ // onChange={() => setPrintMode("text")}
168
+ // className="mr-1"
169
+ // />
170
+ // In văn bản
171
+ // </label>
172
+ // <label className="text-sm">
173
+ // <input
174
+ // type="radio"
175
+ // name="printMode"
176
+ // value="svg"
177
+ // checked={printMode === "svg"}
178
+ // onChange={() => setPrintMode("svg")}
179
+ // className="mr-1"
180
+ // />
181
+ // In hình ảnh
182
+ // </label>
183
+ // </div> */}
184
+ // <ButtonAction
185
+ // iconSrc={printing ? <LoadingIcon /> : <IcPrint />}
186
+ // onClick={() => handlePrintText()}
187
+ // text={`In hoá đơn`}
188
+ // className="button-secondary w-[437px]"
189
+ // />
190
+ // </div>
191
+ // )}
192
+ // <div className="flex justify-center">
193
+ // {/* {productLines && (
194
+ // <div className="bg-white rounded-2xl">
195
+ // <div
196
+ // dangerouslySetInnerHTML={{
197
+ // __html: htmlString,
198
+ // }}
199
+ // ></div>
200
+ // </div>
201
+ // )} */}
202
+ // </div>
203
+ // </div>
204
+ // );
205
+ // };
206
+
207
+ // export default Content;
@@ -0,0 +1,18 @@
1
+ // import { useSpeech } from "@hooks/common/use-speech";
2
+ // import { useOrderDetail } from "@provider/pos-provider/order-detail-provider";
3
+ // import { useEffect } from "react";
4
+ // import Content from "./content";
5
+
6
+ // const BillContent = () => {
7
+ // const { speak } = useSpeech();
8
+ // const { taxAmount, totalAmount } = useOrderDetail();
9
+ // const total = totalAmount + taxAmount;
10
+
11
+ // useEffect(() => {
12
+ // speak(`Thanh toán thành công, ${total} đồng`);
13
+ // }, []);
14
+
15
+ // return <Content />;
16
+ // };
17
+
18
+ // export default BillContent;
@@ -0,0 +1,124 @@
1
+ import {
2
+ BorderGradient,
3
+ DashedLine,
4
+ IcBankCard,
5
+ IcCardPaymentMerchant,
6
+ IcCardPaymentPos,
7
+ IcConnect,
8
+ } from "@assets/icons/payment-icon";
9
+ import ButtonAction from "@components/common/button-action";
10
+ import { ORDER_STATE } from "@constants/order-state";
11
+ import useLoopFetchOrder from "@hooks/order/use-loop-fetch-order";
12
+ import { usePayment } from "@provider/pos-provider/payment-provider";
13
+ import { useSocketData } from "@provider/pos-provider/socket-provider";
14
+ import { JSX, useEffect, useState } from "react";
15
+ import { toast } from "react-toastify";
16
+ import { PaymentInfo } from "../payment-info";
17
+ import { PaymentLayout } from "../payment-layout";
18
+ import { MessageHandlerType, PublishType } from "./pos-payment/qr-connect";
19
+ import WaitingForPaymentPosModal from "./waiting-for-payment-pos-modal";
20
+
21
+ export const CardPaymentMethod = ({ total }: { total: number }) => {
22
+ useLoopFetchOrder();
23
+
24
+ return (
25
+ <PaymentLayout
26
+ leftContent={<LeftContent />}
27
+ rightContent={<RightContent total={total} />}
28
+ />
29
+ );
30
+ };
31
+
32
+ const LeftContent = () => {
33
+ return (
34
+ <div className="flex flex-col gap-3 items-center">
35
+ <DeviceIcon icon={IcCardPaymentMerchant} />
36
+ <DashedLine />
37
+ <IcConnect />
38
+ <DashedLine />
39
+ <DeviceIcon icon={IcCardPaymentPos} />
40
+ </div>
41
+ );
42
+ };
43
+
44
+ const RightContent = ({ total }: { total: number }) => {
45
+ const { onRequestPayment } = usePayment();
46
+ const { clientMtqq } = useSocketData();
47
+ const [orderStatus, setOrderStatus] = useState<string>(ORDER_STATE.NEW);
48
+ const [showWaitingModal, setShowWaitingModal] = useState(false);
49
+
50
+ useEffect(() => {
51
+ orderStatus === "waiting_for_payment"
52
+ ? setShowWaitingModal(true)
53
+ : setShowWaitingModal(false);
54
+ }, [orderStatus]);
55
+
56
+ useEffect(() => {
57
+ clientMtqq?.on("message", (_: any, payload: any) => {
58
+ const props = JSON.parse(payload.toString());
59
+ const handler: MessageHandlerType = {
60
+ [PublishType.Payment]: (payload) => {
61
+ if (typeof payload === "boolean") {
62
+ toast.success("Gọi thanh toán thành công");
63
+ setOrderStatus("waiting_for_payment");
64
+ }
65
+ },
66
+ [PublishType.PaymentResult]: (payload) => {
67
+ const { isSuccess, orderId } = payload;
68
+ if (isSuccess) {
69
+ toast.success("Thanh toán thành công12");
70
+ setOrderStatus("waiting_for_update");
71
+ } else {
72
+ toast.error("Thanh toán thất bại");
73
+ setOrderStatus("payemnt_failed");
74
+ }
75
+ },
76
+ };
77
+ if (props?.payload && props?.type) {
78
+ handler[props?.type as PublishType]?.(props.payload);
79
+ }
80
+ });
81
+ }, [clientMtqq]);
82
+
83
+ const handleRequestPayment = async (amount: number) => {
84
+ try {
85
+ await onRequestPayment(amount);
86
+ } catch (error: any) {
87
+ toast.error(error?.message || "");
88
+ }
89
+ };
90
+ return (
91
+ <>
92
+ <div className="flex flex-col gap-3 h-full justify-center ">
93
+ <PaymentInfo />
94
+ <ButtonAction
95
+ onClick={() => handleRequestPayment(total)}
96
+ iconSrc={<IcBankCard />}
97
+ text="Thanh toán trên POS"
98
+ className="button-primary h-[56px]"
99
+ />
100
+ </div>
101
+ <WaitingForPaymentPosModal
102
+ isOpen={showWaitingModal}
103
+ onClose={() => setOrderStatus(ORDER_STATE.NEW)}
104
+ onRetry={() => onRequestPayment(total)}
105
+ />
106
+ </>
107
+ );
108
+ };
109
+
110
+ const DeviceIcon = ({ icon }: { icon: JSX.Element }) => {
111
+ return (
112
+ <div
113
+ className="rounded-full relative size-[90px] flex justify-center items-center"
114
+ style={{}}
115
+ >
116
+ <div className=" z-0 absolute top-0 left-0 ">
117
+ <BorderGradient />
118
+ </div>
119
+ <div className="relative size-20 border border-stroke-disabled rounded-full flex justify-center items-center">
120
+ {icon}
121
+ </div>
122
+ </div>
123
+ );
124
+ };
@@ -0,0 +1,183 @@
1
+ import { IcDisConnectPos, IcPosConnect } from "@assets/icons/pos-connect-icon";
2
+ import QrConnect, {
3
+ MessageHandlerType,
4
+ MqttConnectType,
5
+ PublishType,
6
+ } from "@components/pos-management/payment-content/card-payment/pos-payment/qr-connect";
7
+
8
+ import { QUERY_KEYS } from "@constants/query.constant";
9
+ import { useQueryParams } from "@hooks/common/use-query-params";
10
+ import { useSpeech } from "@hooks/common/use-speech";
11
+ import { LoadDataModel, useSale } from "@provider/pos-provider/sale-provider";
12
+ import { useSocketData } from "@provider/pos-provider/socket-provider";
13
+ import { parseStringToObject, randomNumber } from "@utils/functions";
14
+ import { t } from "i18next";
15
+ import { useEffect, useState } from "react";
16
+ import { toast } from "react-toastify";
17
+
18
+ export const PosConnect = ({ dataUser }: { dataUser: any }) => {
19
+ const { clientMtqq, onPublish, onDisconnect, onConnect } = useSocketData();
20
+ const { speak } = useSpeech();
21
+
22
+ const { getQuery } = useQueryParams();
23
+ const posId = getQuery(QUERY_KEYS.POS_ID);
24
+
25
+ const sessionId = getQuery(QUERY_KEYS.SESSION_ID);
26
+ const { getData } = useSale();
27
+
28
+ const POSName = getData(LoadDataModel.POS_CONFIG)?.[0]?.name;
29
+ const qrLocal = localStorage.getItem(`mttqQrConnect${posId}`);
30
+ const serialNumberPosLocal = localStorage.getItem(`serialNumberPos${posId}`);
31
+
32
+ const [socketPaymentQr, setSocketPaymentQr] = useState("");
33
+ const [showQrConnect, setShowQrConnect] = useState(false);
34
+ const [serialNumberPos, setSerialNumberPos] = useState("");
35
+ const [isConnect, setIsConnect] = useState(0);
36
+
37
+ const onGetQrConnect = async () => {
38
+ if (!dataUser?.company.cif) {
39
+ return undefined;
40
+ }
41
+ if (qrLocal) return qrLocal;
42
+
43
+ const serialNumber = randomNumber();
44
+ localStorage.setItem(`serialNumber${posId}`, serialNumber);
45
+ const res: MqttConnectType = {
46
+ cif: dataUser?.company.cif,
47
+ platform: "web",
48
+ serialNumber: serialNumber,
49
+ posId: `${POSName}(${posId?.toString()})`,
50
+ };
51
+ localStorage.setItem(`mttqQrConnect${posId}`, JSON.stringify(res));
52
+ return JSON.stringify(res);
53
+ };
54
+
55
+ const onConnectDevice = async () => {
56
+ const qr = await onGetQrConnect();
57
+ qr && setSocketPaymentQr(qr);
58
+ setShowQrConnect(true);
59
+ };
60
+
61
+ useEffect(() => {
62
+ qrLocal && setSocketPaymentQr(qrLocal);
63
+ serialNumberPosLocal && setSerialNumberPos(serialNumberPosLocal);
64
+ }, [qrLocal, serialNumberPosLocal]);
65
+
66
+ const cancelConnect = () => {
67
+ setSocketPaymentQr("");
68
+ setSerialNumberPos("");
69
+ localStorage.removeItem(`serialNumberPos${posId}`);
70
+ localStorage.removeItem(`mttqQrConnect${posId}`);
71
+ };
72
+
73
+ useEffect(() => {
74
+ clientMtqq?.on("message", (_: any, payload: any) => {
75
+ const props =
76
+ typeof JSON.parse(payload.toString()) === "object"
77
+ ? JSON.parse(payload.toString())
78
+ : parseStringToObject(JSON.parse(payload.toString()));
79
+ // console.log("props", props);
80
+ const handleRequiredPayment = async () => {
81
+ speak(`Bàn ${props?.payload?.table_number} yêu cầu thanh toán`);
82
+ toast.success(`Bàn ${props?.payload?.table_number} yêu cầu thanh toán`);
83
+ };
84
+ const handler: MessageHandlerType = {
85
+ [PublishType.RequestPayment]: () => handleRequiredPayment(),
86
+ [PublishType.Ping]: (payload) => {
87
+ if (typeof payload === "object") {
88
+ setIsConnect(3000);
89
+ // console.log("payload", payload);
90
+ const serialNumberOnMessage = payload.serialNumber;
91
+ localStorage.setItem(
92
+ `serialNumberPos${posId}`,
93
+ serialNumberOnMessage
94
+ );
95
+ setShowQrConnect(false);
96
+ serialNumberOnMessage && setSerialNumberPos(serialNumberOnMessage);
97
+ if (payload.showToast)
98
+ toast.success(
99
+ `${t("receive_connection_from")}:` + payload.serialNumber
100
+ );
101
+ }
102
+ },
103
+ };
104
+ if (props?.payload && props?.type) {
105
+ handler[props?.type as PublishType]?.(props.payload);
106
+ }
107
+ });
108
+ }, [clientMtqq]);
109
+
110
+ useEffect(() => {
111
+ const topics = [];
112
+ socketPaymentQr && topics.push(socketPaymentQr);
113
+ dataUser?.x_node &&
114
+ sessionId &&
115
+ topics.push(`["${dataUser?.x_node}","pos.${sessionId}"]`);
116
+ if (dataUser?.x_node && onConnect) {
117
+ onConnect(topics);
118
+ }
119
+ }, [dataUser, sessionId, posId, socketPaymentQr]);
120
+
121
+ useEffect(() => {
122
+ const interval = setInterval(() => {
123
+ if (socketPaymentQr && serialNumberPos) {
124
+ onPublish(
125
+ socketPaymentQr,
126
+ JSON.stringify({ type: PublishType.Ping, payload: true })
127
+ );
128
+ setIsConnect((prev) => prev - 1000);
129
+ }
130
+ }, 1500);
131
+
132
+ return () => clearInterval(interval);
133
+ }, [socketPaymentQr, serialNumberPos, clientMtqq]);
134
+
135
+ useEffect(() => {
136
+ return () => {
137
+ clientMtqq && onDisconnect();
138
+ };
139
+ }, []);
140
+
141
+ return (
142
+ <>
143
+ <div
144
+ className={`flex gap-2 items-center rounded-full h-11 bg-white px-[6px] ${
145
+ !serialNumberPos && "cursor-pointer"
146
+ }`}
147
+ onClick={() => !serialNumberPos && onConnectDevice()}
148
+ >
149
+ <div className="size-8 rounded-full bg-sub-secondary flex justify-center items-center relative">
150
+ <IcPosConnect />
151
+ {serialNumberPos && (
152
+ <div className="absolute size-[10px] bg-white rounded-full right-0 bottom-0 flex justify-center items-center">
153
+ <div
154
+ className="size-[7px] rounded-full"
155
+ style={{
156
+ background: isConnect > 0 ? "#22c55e" : "#ef4444",
157
+ }}
158
+ />
159
+ </div>
160
+ )}
161
+ </div>
162
+ <p className="pr-[10px] tetx-sm text-semibold text-text-primary">
163
+ {serialNumberPos ? serialNumberPos : "Kết nối"}
164
+ </p>
165
+ {serialNumberPos && (
166
+ <div onClick={() => cancelConnect()}>
167
+ <IcDisConnectPos />
168
+ </div>
169
+ )}
170
+ </div>
171
+ {showQrConnect && (
172
+ <QrConnect
173
+ isOpen={showQrConnect}
174
+ onClose={() => setShowQrConnect(false)}
175
+ posId={posId && !isNaN(Number(posId)) ? Number(posId) : 0}
176
+ name={POSName}
177
+ />
178
+ )}
179
+ </>
180
+ );
181
+ };
182
+
183
+ export default PosConnect;