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,198 @@
1
+ import LoadingIcon from "@assets/icons/loading-icon";
2
+ import { PinCodeIcon } from "@assets/icons/pincode";
3
+ import ButtonAction from "@components/common/button-action";
4
+ import OpenSessionModal from "@components/session-management/open-shift";
5
+ import { useService } from "@fctc/widget-logic/provider";
6
+ import { usePosAppProvider } from "@provider/app-provider";
7
+ import { t } from "i18next";
8
+ import { OTPInput } from "input-otp";
9
+ import { useState } from "react";
10
+ import { useForm } from "react-hook-form";
11
+ import { useNavigate } from "react-router-dom";
12
+ import { toast } from "react-toastify";
13
+
14
+ const EnterPinCode = () => {
15
+ const model = "pos.pin.wizard";
16
+ const service = "wesap";
17
+ const specification = {
18
+ display_name: {},
19
+ pin: {},
20
+ };
21
+ const context = {
22
+ lang: "vi_VN",
23
+ tz: "Asia/Saigon",
24
+ uid: 37,
25
+ };
26
+
27
+ const navigate = useNavigate();
28
+ const methods = useForm({
29
+ mode: "onBlur",
30
+ });
31
+
32
+ const { useSave, useButton } = useService();
33
+ const [openModal, setOpenModal] = useState(false);
34
+ const [posConfigId, setPosConfigId] = useState<any>(null);
35
+ const [otpValue, setOtpValue] = useState<string>("");
36
+ const [isError, setIsError] = useState(false);
37
+ const [isLoading, setIsLoading] = useState(false);
38
+
39
+ const { user } = usePosAppProvider();
40
+ const { mutateAsync: callButtonMutate } = useButton();
41
+ const { mutateAsync: fetchSave } = useSave();
42
+
43
+ const onValidateOtp = async () => {
44
+ if (otpValue.length !== 6) {
45
+ setIsError(true);
46
+ return;
47
+ }
48
+ setIsLoading(true);
49
+ const clearOtpValue = () => {
50
+ setOtpValue("");
51
+ };
52
+ try {
53
+ const data = await fetchSave({
54
+ ids: [],
55
+ data: {
56
+ pin: otpValue,
57
+ },
58
+ model,
59
+ context,
60
+ specification: specification,
61
+ service,
62
+ xNode: user?.userProfile?.data?.x_node,
63
+ });
64
+
65
+ const dataCallButton = await callButtonMutate({
66
+ model,
67
+ method: "action_resolve_pin",
68
+ ids: data?.[0]?.id ? [data?.[0]?.id] : data?.id ? [data?.id] : [],
69
+ context,
70
+ service,
71
+ xNode: user?.userProfile?.data?.x_node,
72
+ });
73
+
74
+ if (dataCallButton?.type === "ir.actions.client") {
75
+ if (dataCallButton?.params?.error_code === "no_open_session") {
76
+ setOpenModal(!openModal);
77
+ setPosConfigId(dataCallButton?.params?.pos_config_id);
78
+ return;
79
+ }
80
+ if (dataCallButton?.params?.type === "warning") {
81
+ clearOtpValue();
82
+ toast.error(dataCallButton?.params?.message);
83
+ }
84
+ } else if (dataCallButton?.type === "ir.actions.act_url") {
85
+ if (dataCallButton?.url) {
86
+ sessionStorage.setItem(
87
+ "enter_pincode",
88
+ window.location.href.split("console")[1]
89
+ );
90
+ localStorage.setItem(
91
+ "backUrl",
92
+ window.location.href.split("console")[1]
93
+ );
94
+ navigate(dataCallButton?.url);
95
+ }
96
+ }
97
+ } catch (error: any) {
98
+ if (error?.message) {
99
+ clearOtpValue();
100
+ toast.error(error?.message);
101
+ } else {
102
+ toast.error(`${t("confirm_button")} ${t("failure")}`);
103
+ }
104
+ } finally {
105
+ setIsLoading(false);
106
+ }
107
+ };
108
+
109
+ const onKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
110
+ if (e.key === "Enter") {
111
+ e.preventDefault();
112
+ onValidateOtp();
113
+ }
114
+ };
115
+
116
+ // useEffect(() => {
117
+ // if (otpValue.length === 6 && isAndroid) hideKeyboard()
118
+ // }, [otpValue])
119
+
120
+ return (
121
+ <div className="flex justify-center items-center h-screen bg-neutral-100-96 enter-pin-code-form">
122
+ <div className="w-[760px] rounded-xl border border-stroke-default m-auto px-6 py-10 bg-white flex flex-col gap-8">
123
+ <div className="flex flex-col gap-1 w-full items-center">
124
+ <PinCodeIcon />
125
+ <div className="flex flex-col gap-1 text-center">
126
+ <span className="text-2xl font-semibold">
127
+ {t("enter_pin_title")}
128
+ </span>
129
+ <span className="text-sm font-normal">
130
+ {t("enter_pin_subtitle")}
131
+ </span>
132
+ </div>
133
+ </div>
134
+ <div className="max-w-[464px] mx-auto">
135
+ <OTPInput
136
+ maxLength={6}
137
+ value={otpValue}
138
+ onKeyDown={onKeyDown}
139
+ onChange={(val) => {
140
+ const cleanVal = val.replace(/\D/g, "").slice(0, 6);
141
+ setOtpValue(cleanVal);
142
+ setIsError(false);
143
+ }}
144
+ onPaste={(e) => {
145
+ e.preventDefault();
146
+ const pasted = e.clipboardData.getData("text");
147
+ const cleanVal = pasted.replace(/\D/g, "").slice(0, 6);
148
+ setOtpValue(cleanVal);
149
+ setIsError(false);
150
+ }}
151
+ render={({ slots }) => (
152
+ <div className="grid grid-cols-6 gap-4 px-2 ">
153
+ {slots.map((slot, index) => (
154
+ <div
155
+ key={index}
156
+ className={`w-full aspect-square rounded-xl border ${
157
+ isError
158
+ ? "border-colored-error text-colored-error"
159
+ : slot?.isActive
160
+ ? "border-secondary"
161
+ : "border-stroke-default text-primary"
162
+ } flex items-center font-semibold leading-7 min-w-16 aspect-square justify-center text-xl`}
163
+ >
164
+ {slot?.char}
165
+ </div>
166
+ ))}
167
+ </div>
168
+ )}
169
+ />
170
+ </div>
171
+ <div className="flex justify-center">
172
+ <ButtonAction
173
+ onClick={onValidateOtp}
174
+ iconSrc={isLoading && <LoadingIcon />}
175
+ className={`button-primary ${
176
+ isLoading ? "cursor-not-allowed" : ""
177
+ } w-full`}
178
+ text={t("continue_enter_pincode")}
179
+ />
180
+ </div>
181
+ </div>
182
+
183
+ {openModal && (
184
+ <OpenSessionModal
185
+ openModal={openModal}
186
+ setOpenModal={setOpenModal}
187
+ methods={methods}
188
+ row={{}}
189
+ record={{
190
+ id: posConfigId,
191
+ }}
192
+ />
193
+ )}
194
+ </div>
195
+ );
196
+ };
197
+
198
+ export default EnterPinCode;
@@ -0,0 +1,18 @@
1
+ // import { Outlet } from "react-router-dom";
2
+ // import { KitchenProvider } from "@provider/pos-provider/kitchen-provider";
3
+ // import { ProductProvider } from "@provider/pos-provider/product-provider";
4
+ // import { SaleProvider } from "@provider/pos-provider/sale-provider";
5
+
6
+ // const KitchenManagementLayout = () => {
7
+ // return (
8
+ // <SaleProvider>
9
+ // <ProductProvider>
10
+ // <KitchenProvider>
11
+ // <Outlet />
12
+ // </KitchenProvider>
13
+ // </ProductProvider>
14
+ // </SaleProvider>
15
+ // );
16
+ // };
17
+
18
+ // export default KitchenManagementLayout;
@@ -0,0 +1,7 @@
1
+ import ManagementFloor from "@components/restaurant-management";
2
+
3
+ const ManagementFloorsPage = () => {
4
+ return <ManagementFloor />;
5
+ };
6
+
7
+ export default ManagementFloorsPage;
@@ -0,0 +1,7 @@
1
+ import { ManagementOrder } from "@components/order-management"
2
+
3
+ const ManagementOrderPage = () => {
4
+ return <ManagementOrder />
5
+ }
6
+
7
+ export default ManagementOrderPage
@@ -0,0 +1,7 @@
1
+ import OrderDetail from "@components/order-management/order-detail/order-detail";
2
+
3
+ const OrderDetailPage = () => {
4
+ return <OrderDetail />;
5
+ };
6
+
7
+ export default OrderDetailPage;
File without changes
@@ -0,0 +1,75 @@
1
+ import ButtonAction from "@components/common/button-action";
2
+ import { ORDER_STATE } from "@constants/order-state";
3
+ import { QUERY_KEYS } from "@constants/query.constant";
4
+ import { useQueryParams } from "@hooks/common/use-query-params";
5
+ import { useOrderDetail } from "@provider/pos-provider/order-detail-provider";
6
+ import { useOrder } from "@provider/pos-provider/order-provider";
7
+ import Lottie from "lottie-react";
8
+ import { useEffect } from "react";
9
+ import { useNavigate } from "react-router-dom";
10
+ import animationData from "../../../../public/assets/lottie/success.json";
11
+ import POSPath from "@constants/routes.constants";
12
+
13
+ const PaymentSuccess = () => {
14
+ const { getQuery, formatQuery } = useQueryParams();
15
+ const orderId = getQuery(QUERY_KEYS.ORDER_ID);
16
+ const navigate = useNavigate();
17
+ const { orders, setOrders } = useOrder();
18
+ const { taxAmount, totalAmount } = useOrderDetail();
19
+
20
+ const onComplete = () => {
21
+ navigate({
22
+ pathname: POSPath.MENUS,
23
+ search: `?${formatQuery([QUERY_KEYS.POS_ID, QUERY_KEYS.SESSION_ID])}`,
24
+ });
25
+ };
26
+
27
+ const onPrint = () => {};
28
+ useEffect(() => {
29
+ setOrders(
30
+ orders.map((order) =>
31
+ order.id == Number(orderId)
32
+ ? {
33
+ ...order,
34
+ state: ORDER_STATE.PAID,
35
+ }
36
+ : order
37
+ )
38
+ );
39
+ }, []);
40
+
41
+ return (
42
+ <div className="flex flex-col items-center gap-5 h-screen w-full justify-center bg-white">
43
+ <div style={{ width: 200 }}>
44
+ <Lottie animationData={animationData} />
45
+ </div>
46
+ <div className="flex flex-col items-center gap-[10px]">
47
+ <p className="text-xl font-semibold text-colored-success">
48
+ Thanh toán thành công
49
+ </p>
50
+ <p className="w-[400px] text-sm text-text-disable font-medium text-center">
51
+ Thanh toán đơn hàng {orderId} thành công. Bạn có thể xem chi tiết đơn
52
+ hàng{" "}
53
+ <span className="text-colored-primary underline cursor-pointer">
54
+ tại đây
55
+ </span>
56
+ . hệ thống sẽ tự động chuyển về trang bán hàng sau 10s.
57
+ </p>
58
+ </div>
59
+ <div className="flex gap-2 w-full max-w-[444px]">
60
+ <ButtonAction
61
+ text="Hoàn tất"
62
+ className="button-primary w-full"
63
+ onClick={() => onComplete()}
64
+ />
65
+ <ButtonAction
66
+ text="In hóa đơn"
67
+ className="button-primary w-full"
68
+ onClick={() => onPrint()}
69
+ />
70
+ </div>
71
+ </div>
72
+ );
73
+ };
74
+
75
+ export default PaymentSuccess;
@@ -0,0 +1,56 @@
1
+ import {
2
+ useCompany,
3
+ useUser,
4
+ type useCompanyType,
5
+ type useUserType,
6
+ } from "@fctc/widget-logic/hooks";
7
+ import { useEnv } from "@fctc/widget-logic/provider";
8
+
9
+ import { createContext, useContext, useMemo } from "react";
10
+
11
+ type PosAppProviderType = {
12
+ user: useUserType;
13
+ company: useCompanyType;
14
+ userProfile: any;
15
+ };
16
+
17
+ const PosAppProviderInitialValue: PosAppProviderType = {
18
+ user: {} as useUserType,
19
+ company: {} as useCompanyType,
20
+ userProfile: {},
21
+ };
22
+ const ReactContext = createContext<PosAppProviderType>(
23
+ PosAppProviderInitialValue
24
+ );
25
+
26
+ const PosAppProvider = ({ children }: { children: React.ReactNode }) => {
27
+ const { env } = useEnv();
28
+ const user = useUser({ service: env.default_service });
29
+ const company = useCompany({ service: env.default_service });
30
+
31
+ const userProfile = useMemo(() => {
32
+ return user?.userProfile?.data;
33
+ }, [user]);
34
+
35
+ return (
36
+ <ReactContext.Provider
37
+ value={{
38
+ user,
39
+ company,
40
+ userProfile,
41
+ }}
42
+ >
43
+ {children}
44
+ </ReactContext.Provider>
45
+ );
46
+ };
47
+ export default PosAppProvider;
48
+ export const usePosAppProvider = () => {
49
+ const context = useContext(ReactContext);
50
+
51
+ if (!context) {
52
+ return PosAppProviderInitialValue;
53
+ }
54
+
55
+ return context;
56
+ };
@@ -0,0 +1,26 @@
1
+ const CustomError = () => {
2
+ return (
3
+ <div className="flex w-full h-screen items-center justify-center overflow-auto bg-weak-50 p-4">
4
+ <div className="flex h-fit flex-col items-center justify-center rounded-[16px] bg-white px-4 py-[48px]">
5
+ {/* <div className='aspect-[154/140] w-[44%]'>
6
+ <Image src={crash_app} className='!object-contain' />
7
+ </div> */}
8
+ <p className="mt-4 w-full text-center text-xl font-semibold text-strong-950">
9
+ An error occurred!
10
+ </p>
11
+ <p className="mt-4 w-full text-center text-soft-400">
12
+ Sorry, we are unable to process your request at this time. Please try
13
+ again later.
14
+ </p>
15
+ <a
16
+ className="mt-6 flex w-full items-center justify-center rounded-[10px] border border-primary-custom py-3 text-base font-medium text-text-primary"
17
+ href={"/"}
18
+ >
19
+ Back to home
20
+ </a>
21
+ </div>
22
+ </div>
23
+ )
24
+ }
25
+
26
+ export default CustomError
@@ -0,0 +1,41 @@
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 { QueryClient, QueryClientProvider } from "@tanstack/react-query";
10
+ import { AnimatePresence } from "framer-motion";
11
+ import { ErrorBoundary } from "react-error-boundary";
12
+
13
+ const queryClient = new QueryClient({});
14
+ const AppProvider = ({
15
+ user,
16
+ children,
17
+ }: {
18
+ user: any;
19
+ children: React.ReactNode;
20
+ }) => {
21
+ return (
22
+ <AnimatePresence mode="wait">
23
+ {/* <Suspense fallback={<CustomSuspense />}> */}
24
+ <ErrorBoundary fallback={<CustomError />}>
25
+ <EnvProvider>
26
+ <QueryClientProvider client={queryClient}>
27
+ <MainProvider>
28
+ <ServiceProvider>
29
+ <MetaProvider>
30
+ <ModalProvider>{children}</ModalProvider>
31
+ </MetaProvider>
32
+ </ServiceProvider>
33
+ </MainProvider>
34
+ </QueryClientProvider>
35
+ </EnvProvider>
36
+ </ErrorBoundary>
37
+ {/* </Suspense> */}
38
+ </AnimatePresence>
39
+ );
40
+ };
41
+ export default AppProvider;
@@ -0,0 +1,72 @@
1
+ import { useEnv } from "@fctc/widget-logic/provider";
2
+ import { ContextApi } from "@fctc/widget-logic/types";
3
+ import { ReactNode, useEffect } from "react";
4
+
5
+ type MetaProviderProps = {
6
+ children: ReactNode;
7
+ };
8
+
9
+ export const MetaProvider = ({ children }: MetaProviderProps) => {
10
+ const { env }: ContextApi = useEnv();
11
+
12
+ function updateMetadata() {
13
+ const metadata = env?.defaultCompany;
14
+
15
+ if (!metadata) return;
16
+
17
+ if (metadata.display_name) {
18
+ document.title = metadata.display_name;
19
+ }
20
+
21
+ // document.documentElement.style.setProperty(
22
+ // "--primary",
23
+ // metadata?.primary_color
24
+ // );
25
+ // document.documentElement.style.setProperty(
26
+ // "--secondary",
27
+ // metadata?.secondary_color
28
+ // );
29
+
30
+ // Update description meta tag
31
+ const metaDescription = document.querySelector('meta[name="description"]');
32
+ if (metaDescription) {
33
+ metaDescription.setAttribute("content", metadata.display_name);
34
+ } else {
35
+ const newMetaDescription = document.createElement("meta");
36
+ newMetaDescription.name = "description";
37
+ newMetaDescription.content = metadata.display_name;
38
+ document.head.appendChild(newMetaDescription);
39
+ }
40
+
41
+ // Function to update or create link elements
42
+ const updateIcon = (rel: string, href: string) => {
43
+ let linkIcon = document.querySelector(
44
+ `link[rel="${rel}"]`
45
+ ) as HTMLLinkElement | null;
46
+ if (linkIcon) {
47
+ linkIcon.href = href;
48
+ } else {
49
+ linkIcon = document.createElement("link");
50
+ linkIcon.rel = rel;
51
+ linkIcon.href = href;
52
+ document.head.appendChild(linkIcon);
53
+ }
54
+ };
55
+
56
+ if (metadata.logo) {
57
+ updateIcon("icon", "/document-icon.svg");
58
+ updateIcon("apple-touch-icon", "/document-icon.svg");
59
+
60
+ const faviconLink = document.querySelector('link[href="favicon.ico"]');
61
+ if (faviconLink) {
62
+ faviconLink.remove();
63
+ }
64
+ }
65
+ }
66
+
67
+ useEffect(() => {
68
+ updateMetadata();
69
+ }, [env?.defaultCompany]);
70
+
71
+ return <>{children}</>;
72
+ };
@@ -0,0 +1,48 @@
1
+ import { createContext, useContext, useState } from 'react'
2
+
3
+ type ModalContext = {
4
+ isAppScale: boolean
5
+ handleCheckScaleApp: () => void
6
+ handleToggleInModal: (isOpen: boolean) => void
7
+ }
8
+
9
+ const Context = createContext<ModalContext | undefined>(undefined)
10
+
11
+ const Provider = ({ children }: { children: React.ReactNode }) => {
12
+ const [isAppScale, setIsAppScale] = useState(false)
13
+ const handleCheckScaleApp = () => {
14
+ const bottomModals = document.querySelectorAll('.bottom-modal')
15
+ const isOpen = bottomModals.length > 1
16
+
17
+ if ((isOpen && !isAppScale) || (!isOpen && isAppScale)) {
18
+ setIsAppScale(isOpen)
19
+ }
20
+ }
21
+
22
+ const handleToggleInModal = (isOpen: boolean) => {
23
+ if (isOpen) {
24
+ if (!isAppScale) {
25
+ setIsAppScale(isOpen)
26
+ }
27
+ } else {
28
+ const bottomModals = document.querySelectorAll('.bottom-modal')
29
+ if (bottomModals.length == 1 && isAppScale) {
30
+ setIsAppScale(isOpen)
31
+ }
32
+ }
33
+ }
34
+ return (
35
+ <Context.Provider value={{ isAppScale, handleCheckScaleApp: handleCheckScaleApp, handleToggleInModal }}>
36
+ {children}
37
+ </Context.Provider>
38
+ )
39
+ }
40
+ export const ModalProvider = Provider
41
+
42
+ export const useModal = () => {
43
+ const context = useContext(Context)
44
+ if (!context) {
45
+ throw new Error('useModal must be used within a ModalProvider')
46
+ }
47
+ return context
48
+ }
@@ -0,0 +1,64 @@
1
+ // import { sessionStorageUtils } from "@fctc/widget-logic/utils";
2
+ // import { useEnv } from "@fctc/widget-logic/provider";
3
+ // import { useService } from "@fctc/widget-logic/provider";
4
+
5
+ // import { createContext, useContext } from "react";
6
+ // import { usePosAppProvider } from "./app-provider";
7
+
8
+ // const ReactContext = createContext<useNotificationProviderType>(
9
+ // {} as useNotificationProviderType
10
+ // );
11
+
12
+ // export const NotificationsProvider = ({
13
+ // children,
14
+ // }: {
15
+ // children: React.ReactNode;
16
+ // }) => {
17
+ // return (
18
+ // <ReactContext.Provider value={useNotificationProvider()}>
19
+ // {children}
20
+ // </ReactContext.Provider>
21
+ // );
22
+ // };
23
+
24
+ // export const useNotificationView = () => {
25
+ // const context = useContext(ReactContext);
26
+
27
+ // if (!context) {
28
+ // throw new Error(
29
+ // "useNotificationView must be used within a NotificationsProvider"
30
+ // );
31
+ // }
32
+
33
+ // return context;
34
+ // };
35
+
36
+ // const useNotificationProvider = () => {
37
+ // const { useGetNotifications } = useService();
38
+ // const { env } = useEnv();
39
+ // const { user } = usePosAppProvider();
40
+ // const service =
41
+ // sessionStorageUtils?.getMenuFocus()?.service || env?.default_service;
42
+ // const dataUser = user?.userProfile?.data;
43
+ // const queryResult = useGetNotifications({
44
+ // body: {
45
+ // failures: true,
46
+ // systray_get_activities: true,
47
+ // context: env?.context,
48
+ // },
49
+ // service: service,
50
+ // xNode: service == "wesap" && dataUser?.x_node,
51
+ // enabled: false,
52
+ // queryKey: [],
53
+ // });
54
+
55
+ // return {
56
+ // queryResult,
57
+ // };
58
+ // };
59
+
60
+ // export default useNotificationProvider;
61
+
62
+ // export type useNotificationProviderType = ReturnType<
63
+ // typeof useNotificationProvider
64
+ // >;