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,30 @@
1
+ import usePaymentProvider, {
2
+ usePaymentProviderType,
3
+ } from "@hooks/payment/use-payment-provider"
4
+ import { createContext, useContext } from "react"
5
+
6
+ const ReactContext = createContext<usePaymentProviderType>(
7
+ {} as usePaymentProviderType
8
+ )
9
+
10
+ export const PaymentProvider = ({
11
+ children,
12
+ }: {
13
+ children: React.ReactNode
14
+ }) => {
15
+ return (
16
+ <ReactContext.Provider value={usePaymentProvider()}>
17
+ {children}
18
+ </ReactContext.Provider>
19
+ )
20
+ }
21
+
22
+ export const usePayment = () => {
23
+ const context = useContext(ReactContext)
24
+
25
+ if (!context) {
26
+ throw new Error("usePayment must be used within a PaymentProvider")
27
+ }
28
+
29
+ return context
30
+ }
@@ -0,0 +1,30 @@
1
+ import useProductProvider, {
2
+ useProductProviderType,
3
+ } from "@hooks/product/use-product-provider"
4
+ import { createContext, useContext } from "react"
5
+
6
+ const ReactContext = createContext<useProductProviderType>(
7
+ {} as useProductProviderType
8
+ )
9
+
10
+ export const ProductProvider = ({
11
+ children,
12
+ }: {
13
+ children: React.ReactNode
14
+ }) => {
15
+ return (
16
+ <ReactContext.Provider value={useProductProvider()}>
17
+ {children}
18
+ </ReactContext.Provider>
19
+ )
20
+ }
21
+
22
+ export const useProduct = () => {
23
+ const context = useContext(ReactContext)
24
+
25
+ if (!context) {
26
+ throw new Error("useProduct must be used within a ProductProvider")
27
+ }
28
+
29
+ return context
30
+ }
@@ -0,0 +1,168 @@
1
+ import { QUERY_KEYS } from "@constants/query.constant";
2
+ import { useService } from "@fctc/widget-logic/provider";
3
+ import { sessionStorageUtils } from "@fctc/widget-logic/utils";
4
+ import { usePosAppProvider } from "@provider/app-provider";
5
+ import { useQuery } from "@tanstack/react-query";
6
+ import { createContext, useContext } from "react";
7
+
8
+ import { useCallback } from "react";
9
+ import { useSearchParams } from "react-router-dom";
10
+
11
+ export enum LoadDataModel {
12
+ ACCOUNT_CASH_ROUNDING = "account.cash.rounding",
13
+ ACCOUNT_FISCAL_POSITION = "account.fiscal.position",
14
+ ACCOUNT_FISCAL_POSITION_TAX = "account.fiscal.position.tax",
15
+ ACCOUNT_TAX = "account.tax",
16
+ ACCOUNT_TAX_GROUP = "account.tax.group",
17
+ DECIMAL_PRECISION = "decimal.precision",
18
+ IR_MODULE_MODULE = "ir.module.module",
19
+ IR_UI_VIEW = "ir.ui.view",
20
+ POS_BILL = "pos.bill",
21
+ POS_CATEGORY = "pos.category",
22
+ POS_CONFIG = "pos.config",
23
+ POS_NOTE = "pos.note",
24
+ POS_ORDER = "pos.order",
25
+ POS_ORDER_LINE = "pos.order.line",
26
+ POS_PACK_OPERATION_LOT = "pos.pack.operation.lot",
27
+ POS_PAYMENT = "pos.payment",
28
+ POS_PAYMENT_METHOD = "pos.payment.method",
29
+ POS_PRINTER = "pos.printer",
30
+ POS_SESSION = "pos.session",
31
+ POS_PREPARATION_DISPLAY_DISPLAY = "pos_preparation_display.display",
32
+ PRODUCT_ATTRIBUTE = "product.attribute",
33
+ PRODUCT_ATTRIBUTE_CUSTOM_VALUE = "product.attribute.custom.value",
34
+ PRODUCT_CATEGORY = "product.category",
35
+ PRODUCT_COMBO = "product.combo",
36
+ PRODUCT_COMBO_ITEM = "product.combo.item",
37
+ PRODUCT_PACKAGING = "product.packaging",
38
+ PRODUCT_PRICELIST = "product.pricelist",
39
+ PRODUCT_PRICELIST_ITEM = "product.pricelist.item",
40
+ PRODUCT_PRODUCT = "product.product",
41
+ PRODUCT_TAG = "product.tag",
42
+ PRODUCT_TEMPLATE_ATTRIBUTE_LINE = "product.template.attribute.line",
43
+ PRODUCT_TEMPLATE_ATTRIBUTE_VALUE = "product.template.attribute.value",
44
+ RES_COMPANY = "res.company",
45
+ RES_COUNTRY = "res.country",
46
+ RES_COUNTRY_STATE = "res.country.state",
47
+ RES_CURRENCY = "res.currency",
48
+ RES_LANG = "res.lang",
49
+ RES_PARTNER = "res.partner",
50
+ RES_USERS = "res.users",
51
+ STOCK_PICKING_TYPE = "stock.picking.type",
52
+ UOM_CATEGORY = "uom.category",
53
+ UOM_UOM = "uom.uom",
54
+ LOYALTY_PROGRAM = "loyalty.program",
55
+ LOYALTY_RULE = "loyalty.rule",
56
+ RESTAURANT_TABLE = "restaurant.table",
57
+ RESTAURANT_FLOOR = "restaurant.floor",
58
+ POS_MAKE_PAYMENT = "pos.make.payment",
59
+ }
60
+
61
+ const useGetLoadPosSession = (enabled = true) => {
62
+ const { useLoadDataPosSession } = useService();
63
+ const loadDataPosSessionMutation = useLoadDataPosSession().mutateAsync;
64
+ const { user } = usePosAppProvider();
65
+ const xNode = user?.userProfile?.data?.x_node;
66
+ const service = sessionStorageUtils.getMenuFocus().service || `wesap`;
67
+ const [searchParams] = useSearchParams();
68
+ const sessionId = searchParams.get(QUERY_KEYS.SESSION_ID);
69
+
70
+ const queryResult = useQuery<any>({
71
+ queryKey: ["get-load-pos-session", service, xNode, sessionId],
72
+ queryFn: () => {
73
+ return loadDataPosSessionMutation({
74
+ model: LoadDataModel.POS_SESSION,
75
+ ids: [sessionId],
76
+ service: service ?? "",
77
+ xNode: xNode ?? "",
78
+ });
79
+ },
80
+ enabled: enabled && !!service && !!xNode && !!sessionId,
81
+ });
82
+ const { data, isLoading } = queryResult;
83
+
84
+ const getSpec = useCallback(
85
+ (model: LoadDataModel) => {
86
+ if (!data || isLoading) return undefined;
87
+
88
+ const { fields, relations } = data[model] ?? {};
89
+
90
+ let spec: Record<string, any> = {};
91
+
92
+ if (fields?.length) {
93
+ spec = Object.fromEntries(fields.map((key: string) => [key, {}]));
94
+ } else if (relations) {
95
+ spec = Object.fromEntries(
96
+ Object.keys(relations).map((key) => [key, {}])
97
+ );
98
+ }
99
+
100
+ if ("payment_ids" in spec) {
101
+ spec["payment_ids"] = {
102
+ fields: {
103
+ currency_id: {
104
+ fields: {
105
+ id: {},
106
+ display_name: {},
107
+ },
108
+ },
109
+ payment_date: {},
110
+ payment_method_id: {
111
+ fields: {
112
+ id: {},
113
+ display_name: {},
114
+ },
115
+ },
116
+ amount: {},
117
+ payment_method_payment_mode: {},
118
+ card_no: {},
119
+ card_brand: {},
120
+ cardholder_name: {},
121
+ },
122
+ };
123
+ }
124
+
125
+ return spec;
126
+ },
127
+ [data, isLoading]
128
+ );
129
+
130
+ const getData = useCallback(
131
+ (model: LoadDataModel) => {
132
+ if (!data || isLoading) return undefined;
133
+ return (data[model]?.data ?? {}) as Record<string, any>;
134
+ },
135
+ [data, isLoading]
136
+ );
137
+
138
+ const isModePosRestaurant = getData(LoadDataModel.POS_CONFIG)?.[0]
139
+ ?.module_pos_restaurant;
140
+
141
+ return { queryResult, getSpec, getData, isModePosRestaurant };
142
+ };
143
+
144
+ export default useGetLoadPosSession;
145
+
146
+ export type useGetLoadPosSessionType = ReturnType<typeof useGetLoadPosSession>;
147
+
148
+ const ReactContext = createContext<useGetLoadPosSessionType>(
149
+ {} as useGetLoadPosSessionType
150
+ );
151
+
152
+ export const SaleProvider = ({ children }: { children: React.ReactNode }) => {
153
+ return (
154
+ <ReactContext.Provider value={useGetLoadPosSession()}>
155
+ {children}
156
+ </ReactContext.Provider>
157
+ );
158
+ };
159
+
160
+ export const useSale = () => {
161
+ const context = useContext(ReactContext);
162
+
163
+ if (!context) {
164
+ throw new Error("useSale must be used within a SaleProvider");
165
+ }
166
+
167
+ return context;
168
+ };
@@ -0,0 +1,30 @@
1
+ import useSessionProvider, {
2
+ useSessionProviderType,
3
+ } from "@hooks/session/use-session-provider"
4
+ import { createContext, useContext } from "react"
5
+
6
+ const ReactContext = createContext<useSessionProviderType>(
7
+ {} as useSessionProviderType
8
+ )
9
+
10
+ export const SessionProvider = ({
11
+ children,
12
+ }: {
13
+ children: React.ReactNode
14
+ }) => {
15
+ return (
16
+ <ReactContext.Provider value={useSessionProvider()}>
17
+ {children}
18
+ </ReactContext.Provider>
19
+ )
20
+ }
21
+
22
+ export const useSession = () => {
23
+ const context = useContext(ReactContext)
24
+
25
+ if (!context) {
26
+ throw new Error("useSession must be used within a SessionProvider")
27
+ }
28
+
29
+ return context
30
+ }
@@ -0,0 +1,118 @@
1
+ import { QUERY_KEYS } from "@constants/query.constant";
2
+ import { useQueryParams } from "@hooks/common/use-query-params";
3
+ import { usePosAppProvider } from "@provider/app-provider";
4
+ import mqtt from "mqtt";
5
+ import { createContext, useContext, useState } from "react";
6
+
7
+ const useSocket = () => {
8
+ const [clientMtqq, setClientMtqq] = useState<any>();
9
+ const { user } = usePosAppProvider();
10
+
11
+ const { getQuery } = useQueryParams();
12
+ const posId = getQuery(QUERY_KEYS.POS_ID);
13
+ const dataUser = user?.userProfile?.data;
14
+
15
+ const onConnect = (topicName: string | string[]) => {
16
+ console.log("🔌 Trying to connect to MQTT...");
17
+ const options = {
18
+ clientId: [dataUser?.company.cif, "web", `serialNumber${posId}`].join(
19
+ "-"
20
+ ),
21
+ reconnectPeriod: 3000,
22
+ keepalive: 20,
23
+ clean: false,
24
+ };
25
+ const client = mqtt.connect("wss://sme-socket-dev.atomsolution.vn", {
26
+ path: "/mqtt",
27
+ ...options,
28
+ });
29
+ client.on("connect", () => {
30
+ if (!topicName || topicName?.length === 0) return;
31
+ client.subscribe(topicName, (err) => {
32
+ if (err) {
33
+ console.error("❌ Subscribe error:", err);
34
+ } else {
35
+ console.log("📡 Subscribed successfully!", client);
36
+ }
37
+ });
38
+ });
39
+
40
+ client.on("error", (err) => {
41
+ console.error("❌ MQTT Error:", err);
42
+ });
43
+
44
+ client.on("reconnect", () => {
45
+ console.log("♻️ Reconnecting to MQTT...");
46
+ });
47
+
48
+ setClientMtqq(client);
49
+ };
50
+
51
+ const onDisconnect = () => {
52
+ clientMtqq?.end(true);
53
+ setClientMtqq(undefined);
54
+ };
55
+
56
+ const onPublish = (topic: string, payload: string) => {
57
+ clientMtqq?.publish(topic, payload);
58
+ // if (clientMtqq) console.log("send", topic, payload);
59
+ };
60
+
61
+ const onSubscribe = (topic: string | string[]) => {
62
+ clientMtqq.on("connect", () => {
63
+ clientMtqq.subscribe(topic, (err: any) => {
64
+ if (err) {
65
+ console.error("❌ Subscribe error:", err);
66
+ } else {
67
+ console.log("📡 Subscribed successfully!", clientMtqq);
68
+ }
69
+ });
70
+ });
71
+ };
72
+
73
+ return { clientMtqq, onDisconnect, onPublish, onConnect, onSubscribe };
74
+ };
75
+
76
+ export type useSocketType = ReturnType<typeof useSocket>;
77
+
78
+ const ReactContext = createContext<useSocketType>({} as useSocketType);
79
+
80
+ const SocketProvider = ({ children }: { children: React.ReactNode }) => {
81
+ return (
82
+ <ReactContext.Provider value={useSocket()}>
83
+ {children}
84
+ </ReactContext.Provider>
85
+ );
86
+ };
87
+
88
+ export default SocketProvider;
89
+
90
+ export const useSocketData = () => {
91
+ const context = useContext(ReactContext);
92
+
93
+ if (!context) {
94
+ throw new Error("useSocketData must be used within a ");
95
+ }
96
+
97
+ return context;
98
+ };
99
+
100
+ export function convertMessage(str: string) {
101
+ try {
102
+ let obj = JSON.parse(str);
103
+
104
+ if (typeof obj === "string") {
105
+ obj = JSON.parse(obj);
106
+ }
107
+
108
+ const type = obj?.type?.split("-")?.pop();
109
+
110
+ return {
111
+ type,
112
+ sound: obj?.payload?.sound ?? false,
113
+ };
114
+ } catch (e) {
115
+ console.error("❌ Invalid JSON", e);
116
+ return undefined;
117
+ }
118
+ }
@@ -0,0 +1,30 @@
1
+ import usePosTableProvider, {
2
+ usePosTableProviderType,
3
+ } from "@hooks/table/use-pos-table-provider"
4
+ import { TTable } from "@type/table"
5
+ import { createContext, useContext } from "react"
6
+
7
+ const ReactContext = createContext<usePosTableProviderType>(
8
+ {} as usePosTableProviderType
9
+ )
10
+
11
+ export const TableProvider = ({ children }: { children: React.ReactNode }) => {
12
+ const queryResult = usePosTableProvider(true)
13
+ return (
14
+ <ReactContext.Provider value={queryResult}>
15
+ {children}
16
+ </ReactContext.Provider>
17
+ )
18
+ }
19
+
20
+ export const usePosTable = () => {
21
+ const context = useContext(ReactContext)
22
+
23
+ if (!context) {
24
+ throw new Error("usePosTable must be used within a TableProvider")
25
+ }
26
+
27
+ return context
28
+ }
29
+
30
+ export type TTableRes = TDataRes<TTable[]>
@@ -0,0 +1,104 @@
1
+ import { useEnv } from "@fctc/widget-logic/provider";
2
+ import { isObjectEmpty, sessionStorageUtils } from "@fctc/widget-logic/utils";
3
+ import useHeaderStore from "@store/header";
4
+ import { useEffect } from "react";
5
+ import { usePosAppProvider } from "./app-provider";
6
+ import { I18nProvider } from "@fctc/sme-widget-ui";
7
+ import { ToastContainer } from "react-toastify";
8
+
9
+ const PublicProvider = ({ children }: { children: React.ReactNode }) => {
10
+ const { setupEnv, env, setEnvFile } = useEnv();
11
+ const { user } = usePosAppProvider();
12
+ const dataUser = user?.userProfile?.data;
13
+ const service = sessionStorageUtils.getMenuFocus().service;
14
+ const { selectedLang } = useHeaderStore();
15
+
16
+ useEffect(() => {
17
+ async function loadEnvAndConfig() {
18
+ try {
19
+ const envResponse = await fetch("/env.json");
20
+ const envConfig = await envResponse.json();
21
+ const configResponse = await fetch("/config.json");
22
+ const config = await configResponse.json();
23
+ console.log("config", config);
24
+ setupEnv({
25
+ baseUrl: envConfig.baseUrl,
26
+ default_service: "mms",
27
+ config: {
28
+ grantType: envConfig.config?.grantType,
29
+ clientId: window.location.hostname.includes("mms")
30
+ ? envConfig.config?.mmsClientId
31
+ : envConfig.config?.mpClientId,
32
+ clientSecret: envConfig.config?.clientSecret,
33
+ redirectUri: window.location.hostname.includes("mms")
34
+ ? envConfig.config?.mmsRedirectUrl
35
+ : envConfig.config?.mpRedirectUrl,
36
+ websiteCode: window.location.hostname.includes("mms")
37
+ ? envConfig.config?.websiteMmscode
38
+ : envConfig.config?.websiteMpcode,
39
+ },
40
+ refreshTokenEndpoint: "/id/api/v2/token",
41
+ xNode: service === "wesap" ? dataUser?.x_node : "",
42
+ });
43
+
44
+ setEnvFile(config);
45
+
46
+ document.documentElement.style.setProperty(
47
+ "--background-button",
48
+ config?.VITE_BG_BUTTON
49
+ );
50
+ document.documentElement.style.setProperty(
51
+ "--primary",
52
+ config?.VITE_BG_BUTTON
53
+ );
54
+ document.documentElement.style.setProperty(
55
+ "--background-page",
56
+ config?.VITE_BACKGROUND_PAGE
57
+ );
58
+ document.documentElement.style.setProperty(
59
+ "--text-color",
60
+ config?.TEXT_COLOR
61
+ );
62
+ document.documentElement.style.setProperty(
63
+ "--stroke-default",
64
+ config?.STROKE_DEFAULT
65
+ );
66
+ document.documentElement.style.setProperty(
67
+ "--selected-color",
68
+ config?.SELECTED_COLOR
69
+ );
70
+ document.documentElement.style.setProperty(
71
+ "--active-menu-bg-color",
72
+ config?.SIDEBAR_ACTIVE_MENU_BACKGROUND
73
+ );
74
+ document.documentElement.style.setProperty(
75
+ "--active-menu-text-color",
76
+ config?.SIDEBAR_ACTIVE_MENU_TEXT
77
+ );
78
+ document.documentElement.style.setProperty(
79
+ "--active-border-color",
80
+ config?.BORDER_ACTIVE_COLOR
81
+ );
82
+ } catch (error) {
83
+ console.error("Error loading env or config:", error);
84
+ }
85
+ }
86
+
87
+ if (!env?.requests) {
88
+ loadEnvAndConfig();
89
+ }
90
+ }, []);
91
+
92
+ return (
93
+ <I18nProvider lang={String(selectedLang?.value)}>
94
+ <ToastContainer position="bottom-right" />
95
+ {
96
+ env?.requests &&
97
+ !isObjectEmpty(env?.requests) &&
98
+ env?.envFile &&
99
+ children
100
+ }
101
+ </I18nProvider>
102
+ );
103
+ };
104
+ export default PublicProvider;
@@ -0,0 +1,79 @@
1
+ import { useService } from "@fctc/widget-logic/provider";
2
+ import { sessionStorageUtils } from "@fctc/widget-logic/utils";
3
+ import { useMutation } from "@tanstack/react-query";
4
+ import { usePosAppProvider } from "./app-provider";
5
+
6
+ const useSessionProvider = () => {
7
+ const { useCreateSession, useHandleClosingSession, useCreatePosConfig } =
8
+ useService();
9
+
10
+ const createSessionMutation = useCreateSession().mutateAsync;
11
+ const setOpeningCashBoxMutation = useHandleClosingSession().mutateAsync;
12
+ const createPosConfigMutation = useCreatePosConfig().mutateAsync;
13
+
14
+ const { user } = usePosAppProvider();
15
+ const dataUser = user?.userProfile?.data;
16
+ const service = sessionStorageUtils.getMenuFocus().service || `wesap`;
17
+ const xNode = dataUser?.x_node || "";
18
+
19
+ const openSession = useMutation({
20
+ mutationFn: async (configId: number) => {
21
+ return await createSessionMutation({
22
+ configId,
23
+ model: "pos.session",
24
+ service,
25
+ xNode,
26
+ });
27
+ },
28
+ });
29
+
30
+ const setOpeningCashBox = useMutation({
31
+ mutationFn: ({
32
+ cashBoxValue,
33
+ sessionId,
34
+ }: {
35
+ cashBoxValue: number;
36
+ sessionId: number;
37
+ }) => {
38
+ return setOpeningCashBoxMutation({
39
+ model: "pos.session",
40
+ ids: [Number(sessionId)],
41
+ service,
42
+ xNode,
43
+ method: "set_opening_control",
44
+ kwargs: {
45
+ cashbox_value: cashBoxValue,
46
+ notes: "Opening cashbox",
47
+ },
48
+ });
49
+ },
50
+ });
51
+
52
+ const createPosConfig = useMutation({
53
+ mutationFn: async ({
54
+ name,
55
+ modulePosRestaurant,
56
+ }: {
57
+ name: string;
58
+ modulePosRestaurant: string;
59
+ }) => {
60
+ return await createPosConfigMutation({
61
+ model: "pos.config",
62
+ name,
63
+ service,
64
+ xNode,
65
+ modulePosRestaurant,
66
+ });
67
+ },
68
+ });
69
+
70
+ return {
71
+ openSession,
72
+ setOpeningCashBox,
73
+ createPosConfig,
74
+ };
75
+ };
76
+
77
+ export default useSessionProvider;
78
+
79
+ export type useSessionProviderType = ReturnType<typeof useSessionProvider>;
@@ -0,0 +1,38 @@
1
+ import {
2
+ EnvProvider,
3
+ MainProvider,
4
+ MetaProvider,
5
+ ServiceProvider,
6
+ } from "@fctc/widget-logic/provider";
7
+ import CustomError from "@provider/fallback/custom-error";
8
+ import { ModalProvider } from "@provider/modal-provider";
9
+ import PublicProvider from "@provider/public-provider";
10
+ import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
11
+ import { AnimatePresence } from "framer-motion";
12
+ import { ErrorBoundary } from "react-error-boundary";
13
+
14
+ const queryClient = new QueryClient({});
15
+ const AppProvider = ({ children }: { children: React.ReactNode }) => {
16
+ return (
17
+ <AnimatePresence mode="wait">
18
+ {/* <Suspense fallback={<CustomSuspense />}> */}
19
+ <ErrorBoundary fallback={<CustomError />}>
20
+ <EnvProvider>
21
+ <QueryClientProvider client={queryClient}>
22
+ <MainProvider>
23
+ <ServiceProvider>
24
+ <MetaProvider>
25
+ <ModalProvider>
26
+ <PublicProvider>{children}</PublicProvider>
27
+ </ModalProvider>
28
+ </MetaProvider>
29
+ </ServiceProvider>
30
+ </MainProvider>
31
+ </QueryClientProvider>
32
+ </EnvProvider>
33
+ </ErrorBoundary>
34
+ {/* </Suspense> */}
35
+ </AnimatePresence>
36
+ );
37
+ };
38
+ export default AppProvider;
@@ -0,0 +1,26 @@
1
+ import { ROUTES } from "@constants/routes.constants"
2
+ import { LoginPage } from "@pages/login"
3
+ import EnterPinCode from "@pages/pincode"
4
+ import { Navigate, Route, Routes } from "react-router-dom"
5
+ import POSRoutes from "./pos-route"
6
+ import ProtectedRoute from "./protected-route"
7
+ import PublicRoute from "./public-route"
8
+
9
+ const AppRouter = () => {
10
+ return (
11
+ <Routes>
12
+ <Route path="/" element={<Navigate to={ROUTES.pinCode} replace />} />
13
+
14
+ <Route element={<PublicRoute />}>
15
+ <Route path={ROUTES.login} element={<LoginPage />} />
16
+ </Route>
17
+
18
+ <Route element={<ProtectedRoute />}>
19
+ <Route path={ROUTES.pinCode} element={<EnterPinCode />} />
20
+ {POSRoutes()}
21
+ </Route>
22
+ </Routes>
23
+ )
24
+ }
25
+
26
+ export default AppRouter