@lmnto/h-mall-shared 1.0.1
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.
- package/app.css +457 -0
- package/bitbucket-pipelines.yml +223 -0
- package/package.json +43 -0
- package/public/gif/balloon.gif +0 -0
- package/public/gif/gift.gif +0 -0
- package/public/img/ai-dialog.png +0 -0
- package/public/img/ai-x1-banner.png +0 -0
- package/public/img/ai-x1.png +0 -0
- package/public/img/alert-Icon.png +0 -0
- package/public/img/aleta-payment-kyc-require.png +0 -0
- package/public/img/aleta-payment-pending.png +0 -0
- package/public/img/aleta-payment-rejected.png +0 -0
- package/public/img/aleta-payment-subscription-required.png +0 -0
- package/public/img/boost-banner-bg.png +0 -0
- package/public/img/boost-banner-right.png +0 -0
- package/public/img/boost-banner.png +0 -0
- package/public/img/boost-dialog-bg.png +0 -0
- package/public/img/boostPower.png +0 -0
- package/public/img/boostTooltip.png +0 -0
- package/public/img/brand-icon.svg +23 -0
- package/public/img/brand-text.svg +11 -0
- package/public/img/card-icon.png +0 -0
- package/public/img/cashback-Icon.png +0 -0
- package/public/img/crown.svg +9 -0
- package/public/img/empty-box.png +0 -0
- package/public/img/gen3-dialog.png +0 -0
- package/public/img/gen3-home-banner-bg.png +0 -0
- package/public/img/gen3-image.png +0 -0
- package/public/img/gift.png +0 -0
- package/public/img/img-placeholder-illustration.svg +6 -0
- package/public/img/logo.svg +31 -0
- package/public/img/offerBanner.png +0 -0
- package/public/img/pagenotfound.png +0 -0
- package/public/img/partial-pay-payment-successful.png +0 -0
- package/public/img/phoneShippingBG.png +0 -0
- package/public/img/placeholder-image.jpg +0 -0
- package/public/img/powerIcon.png +0 -0
- package/public/img/product-01.png +0 -0
- package/public/img/product-02.jpg +0 -0
- package/public/img/product-03.jpg +0 -0
- package/public/img/product-04.jpg +0 -0
- package/public/img/product-05.png +0 -0
- package/public/img/product-06.png +0 -0
- package/public/img/profile-avatar.svg +12 -0
- package/public/img/promotion-icon.png +0 -0
- package/public/img/session-expired.png +0 -0
- package/public/img/shipping-alert-icon.png +0 -0
- package/public/img/shippingIcon.png +0 -0
- package/public/img/smart-pay-banner-how.png +0 -0
- package/public/img/smart-pay-banner-own.png +0 -0
- package/public/img/smart-pay-chose.png +0 -0
- package/public/img/smart-pay-easy.png +0 -0
- package/public/img/smart-pay-payment.png +0 -0
- package/public/img/smart-plan-fire.gif +0 -0
- package/public/img/smart-plan-sparkle.gif +0 -0
- package/public/img/special.png +0 -0
- package/public/img/specialOfferBg.png +0 -0
- package/public/img/stop-shipping-banner.png +0 -0
- package/public/img/subscriptionBanner.png +0 -0
- package/public/img/subscriptionIcon.png +0 -0
- package/public/img/successIcon.png +0 -0
- package/public/img/wallet-icon.png +0 -0
- package/public/img/world-wide-shipping.png +0 -0
- package/public/next.svg +1 -0
- package/public/vercel.svg +1 -0
- package/shared/components/AddressFormComponent.tsx +215 -0
- package/shared/components/AddressShippingFormComponent.tsx +223 -0
- package/shared/components/AiPaymentDialog.tsx +95 -0
- package/shared/components/AppLoadingComponent.tsx +15 -0
- package/shared/components/AppLoadingComponentV2.tsx +18 -0
- package/shared/components/Button.tsx +48 -0
- package/shared/components/BuySubscriptionDialog.tsx +75 -0
- package/shared/components/CartDrawerComponent.tsx +324 -0
- package/shared/components/CashbackComponent.tsx +48 -0
- package/shared/components/CashbackMigrationComponent.tsx +41 -0
- package/shared/components/CommissionNonEligibleComponent.tsx +27 -0
- package/shared/components/CustomNextImage.tsx +50 -0
- package/shared/components/CustomNextLink.tsx +46 -0
- package/shared/components/EditAddressFormComponent.tsx +254 -0
- package/shared/components/EmptyCartMessageComponent.tsx +25 -0
- package/shared/components/EmptyCartMessageForCartPage.tsx +61 -0
- package/shared/components/EmptyLegacyOrderMessageForOrdersPage.tsx +52 -0
- package/shared/components/EmptyOrderMessageForOrdersPage.tsx +62 -0
- package/shared/components/EmptyOrderMessageForShippingOrdersPage.tsx +62 -0
- package/shared/components/Footer.tsx +71 -0
- package/shared/components/GreetingDialog.tsx +96 -0
- package/shared/components/Header.tsx +106 -0
- package/shared/components/HoldShippingDialog.tsx +165 -0
- package/shared/components/HomeBanners.tsx +298 -0
- package/shared/components/InactiveCartDialog.tsx +69 -0
- package/shared/components/InputCartQuantity.tsx +342 -0
- package/shared/components/Inputfield.tsx +110 -0
- package/shared/components/ListItemComponent.tsx +82 -0
- package/shared/components/LoadingIconComponent.tsx +284 -0
- package/shared/components/OrderNotFoundComponent.tsx +56 -0
- package/shared/components/PageHeader.tsx +42 -0
- package/shared/components/PhoneNumberCountries.tsx +133 -0
- package/shared/components/PhoneShippingDialog.tsx +77 -0
- package/shared/components/PickupDialog.tsx +92 -0
- package/shared/components/ProductNotFoundComponent.tsx +56 -0
- package/shared/components/ProductPriceComponent.tsx +32 -0
- package/shared/components/ProfileMenu.tsx +120 -0
- package/shared/components/RequestCreditNoteInvoiceDialog.tsx +214 -0
- package/shared/components/RequestInvoiceDialog.tsx +194 -0
- package/shared/components/SelectCities.tsx +133 -0
- package/shared/components/SelectComponent.tsx +334 -0
- package/shared/components/SelectCountries.tsx +179 -0
- package/shared/components/SelectPickUpStore.tsx +131 -0
- package/shared/components/SelectStates.tsx +144 -0
- package/shared/components/ServerTime.tsx +68 -0
- package/shared/components/SessionDialogComponent.tsx +60 -0
- package/shared/components/ShippingAddressFormDialogComponent.tsx +51 -0
- package/shared/components/Sidebar.tsx +281 -0
- package/shared/components/SpecialOfferDialog.tsx +193 -0
- package/shared/components/StatusComponents.tsx +25 -0
- package/shared/components/StepperComponent.tsx +79 -0
- package/shared/components/StepperSmartPayComponent.tsx +97 -0
- package/shared/components/SubscriptionPurchaseDialogComponent.tsx +81 -0
- package/shared/components/TableComponent.tsx +144 -0
- package/shared/components/TablePaginationComponent.tsx +151 -0
- package/shared/components/aleta/AletaManagerComponent.tsx +52 -0
- package/shared/components/aleta/KycPendingStatus.tsx +33 -0
- package/shared/components/aleta/KycRejectedStatus.tsx +53 -0
- package/shared/components/aleta/KycRequiredStatus.tsx +53 -0
- package/shared/components/aleta/SubscriptionRequiredStatus.tsx +45 -0
- package/shared/components/icons/AletaWalletIcon.tsx +21 -0
- package/shared/components/icons/BrandIcon.tsx +97 -0
- package/shared/components/icons/BrandText.tsx +47 -0
- package/shared/components/icons/CartIcon.tsx +21 -0
- package/shared/components/icons/DoneIcon.tsx +27 -0
- package/shared/components/icons/HomnifiIcon.tsx +23 -0
- package/shared/components/icons/InfoIcon.tsx +16 -0
- package/shared/components/icons/SmartPayProductIcon.tsx +31 -0
- package/shared/components/payments/DisclaimerAlertDialog.tsx +205 -0
- package/shared/components/payments/EmptyAssets.tsx +23 -0
- package/shared/components/payments/PaybyWalletItemComponent.tsx +116 -0
- package/shared/components/payments/PaymentAssetItemComponent.tsx +101 -0
- package/shared/components/payments/RequestProcessingDialog.tsx +123 -0
- package/shared/components/payments/WalletSectionManager.tsx +82 -0
- package/shared/components/payments/WalletSliderComponent.tsx +326 -0
- package/shared/components/payments/WalletTermsAndConditionComponent.tsx +88 -0
- package/shared/constants/address-shipping.schema.ts +56 -0
- package/shared/constants/address.schema.ts +56 -0
- package/shared/constants/app.ts +323 -0
- package/shared/constants/environment.ts +23 -0
- package/shared/constants/feature-flags.ts +15 -0
- package/shared/constants/query-keys.ts +106 -0
- package/shared/constants/routes.ts +41 -0
- package/shared/constants/socket.ts +15 -0
- package/shared/contexts/HomeProductsContext.tsx +51 -0
- package/shared/contexts/MainWrapperContext.tsx +289 -0
- package/shared/contexts/WebSocketContext.tsx +155 -0
- package/shared/hooks/useAddressForm.ts +169 -0
- package/shared/hooks/useAddresses.ts +28 -0
- package/shared/hooks/useAppForm.ts +39 -0
- package/shared/hooks/useCart.ts +207 -0
- package/shared/hooks/useCopy.ts +45 -0
- package/shared/hooks/useCountries.ts +27 -0
- package/shared/hooks/useCustomRouter.ts +51 -0
- package/shared/hooks/useDebounce.ts +21 -0
- package/shared/hooks/useInvoice.ts +41 -0
- package/shared/hooks/useOnlineUser.ts +38 -0
- package/shared/hooks/usePayments.ts +101 -0
- package/shared/hooks/useShippingAddressForm.ts +70 -0
- package/shared/hooks/useShippingAddresses.ts +33 -0
- package/shared/hooks/useStores.ts +29 -0
- package/shared/hooks/useUserActivity.ts +43 -0
- package/shared/i18n/client.ts +27 -0
- package/shared/i18n/locales/en.ts +383 -0
- package/shared/i18n/locales/it.ts +373 -0
- package/shared/i18n/server.ts +7 -0
- package/shared/services/addresses.service.ts +27 -0
- package/shared/services/api/core/ApiError.ts +29 -0
- package/shared/services/api/core/ApiRequestOptions.ts +25 -0
- package/shared/services/api/core/ApiResult.ts +11 -0
- package/shared/services/api/core/CancelablePromise.ts +130 -0
- package/shared/services/api/core/OpenAPI.ts +37 -0
- package/shared/services/api/core/request.ts +376 -0
- package/shared/services/api/index.ts +64 -0
- package/shared/services/api/models/AddAllProductToShippingCartDto.ts +7 -0
- package/shared/services/api/models/AddProductToCartDto.ts +8 -0
- package/shared/services/api/models/AddProductToShippingCartDto.ts +8 -0
- package/shared/services/api/models/AdminPlaceOrderDto.ts +16 -0
- package/shared/services/api/models/AssignPickupSerialNumberDto.ts +10 -0
- package/shared/services/api/models/CreateUserAddressDto.ts +19 -0
- package/shared/services/api/models/DeletCartProductsArrayDto.ts +7 -0
- package/shared/services/api/models/GenerateInvoiceDto.ts +7 -0
- package/shared/services/api/models/OrderConfirmationEmailDto.ts +8 -0
- package/shared/services/api/models/PlaceOrderDto.ts +9 -0
- package/shared/services/api/models/PlaceShipmentOrderDto.ts +8 -0
- package/shared/services/api/models/ProductBoostDto.ts +18 -0
- package/shared/services/api/models/RemoveAssignedSerialNumberDto.ts +9 -0
- package/shared/services/api/models/RemoveProductToCartDto.ts +8 -0
- package/shared/services/api/models/ShipmentItem.ts +8 -0
- package/shared/services/api/models/ShippingCartUpdateBillingAddressesDto.ts +7 -0
- package/shared/services/api/models/ShippingCartUpdateShippingMethodDto.ts +7 -0
- package/shared/services/api/models/UnfreezeWalletDto.ts +8 -0
- package/shared/services/api/models/UpdateCartBillingAddressesDto.ts +7 -0
- package/shared/services/api/models/UpdateCartPaymentMethodDto.ts +9 -0
- package/shared/services/api/models/UpdateCartShippingMethodDto.ts +7 -0
- package/shared/services/api/models/UpdateCartStoreDto.ts +7 -0
- package/shared/services/api/models/UpdateProductDto.ts +11 -0
- package/shared/services/api/models/UpdateShipmentItemStatusDto.ts +24 -0
- package/shared/services/api/models/UpdateShippingCartPaymentMethodDto.ts +9 -0
- package/shared/services/api/models/UpdateUserAddressDto.ts +19 -0
- package/shared/services/api/models/ValidateAuthCodeDto.ts +8 -0
- package/shared/services/api/models/WithdrawOrderWalletDto.ts +8 -0
- package/shared/services/api/services/AddressesService.ts +160 -0
- package/shared/services/api/services/AdminsDevicesService.ts +28 -0
- package/shared/services/api/services/AdminsOrdersService.ts +117 -0
- package/shared/services/api/services/AdminsPickupsService.ts +57 -0
- package/shared/services/api/services/AdminsProductsService.ts +86 -0
- package/shared/services/api/services/CartsService.ts +190 -0
- package/shared/services/api/services/CashBackQueueService.ts +39 -0
- package/shared/services/api/services/CategoriesService.ts +65 -0
- package/shared/services/api/services/DefaultService.ts +19 -0
- package/shared/services/api/services/FeaturesFlagsService.ts +20 -0
- package/shared/services/api/services/IossQueueService.ts +39 -0
- package/shared/services/api/services/OrderCallbackService.ts +67 -0
- package/shared/services/api/services/OrderEmailsService.ts +40 -0
- package/shared/services/api/services/OrderImportService.ts +228 -0
- package/shared/services/api/services/OrdersService.ts +183 -0
- package/shared/services/api/services/PaymentGatewayService.ts +19 -0
- package/shared/services/api/services/PaymentsService.ts +88 -0
- package/shared/services/api/services/ProductsService.ts +67 -0
- package/shared/services/api/services/ShipmentOrderCallbackService.ts +67 -0
- package/shared/services/api/services/ShipmentOrdersService.ts +88 -0
- package/shared/services/api/services/ShipmentsService.ts +30 -0
- package/shared/services/api/services/ShippingCartService.ts +247 -0
- package/shared/services/api/services/ShippingMethodsService.ts +20 -0
- package/shared/services/api/services/StoresService.ts +25 -0
- package/shared/services/api/services/SyncServiceQueueService.ts +39 -0
- package/shared/services/api/services/UpgradeOrdersService.ts +26 -0
- package/shared/services/api/services/UsersAuthService.ts +45 -0
- package/shared/services/api/services/UsersService.ts +53 -0
- package/shared/services/api/services/XeraQueueService.ts +39 -0
- package/shared/services/index.ts +0 -0
- package/shared/services/payment-method.service.ts +29 -0
- package/shared/stores/cartStore.ts +108 -0
- package/shared/stores/countriesStore.ts +62 -0
- package/shared/stores/formStore.ts +19 -0
- package/shared/stores/loadingStore.ts +12 -0
- package/shared/stores/userStore.ts +32 -0
- package/shared/types/SelectComponent.types.ts +31 -0
- package/shared/types/addressForm.ts +27 -0
- package/shared/types/cart.ts +208 -0
- package/shared/types/category.ts +6 -0
- package/shared/types/creditNote.ts +0 -0
- package/shared/types/feature-flags.ts +5 -0
- package/shared/types/icon.ts +5 -0
- package/shared/types/index.d.ts +84 -0
- package/shared/types/order.ts +332 -0
- package/shared/types/pagination.ts +5 -0
- package/shared/types/payments.ts +68 -0
- package/shared/types/product.ts +54 -0
- package/shared/types/shoppingCart.ts +219 -0
- package/shared/types/upgradeCart.ts +226 -0
- package/shared/types/user.ts +36 -0
- package/shared/utils/app.util.ts +261 -0
- package/shared/utils/notifications.util.ts +39 -0
- package/shared/utils/user-session.util.ts +171 -0
- package/tailwind.config.ts +234 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Dialog,
|
|
5
|
+
DialogBody,
|
|
6
|
+
DialogFooter,
|
|
7
|
+
DialogHeader,
|
|
8
|
+
} from "@material-tailwind/react";
|
|
9
|
+
import React, { useCallback, useEffect } from "react";
|
|
10
|
+
|
|
11
|
+
import subscriptionIcon from "../../public/img/subscriptionIcon.png";
|
|
12
|
+
import { ROUTES } from "../constants/routes";
|
|
13
|
+
import useCustomRouter from "../hooks/useCustomRouter";
|
|
14
|
+
import { _useScopedI18n } from "../i18n/client";
|
|
15
|
+
import ButtonCustom from "./Button";
|
|
16
|
+
import CustomNextImage from "./CustomNextImage";
|
|
17
|
+
|
|
18
|
+
type SubscriptionPurchaseDialogComponentProps = {
|
|
19
|
+
showSubscriptionDialog: boolean;
|
|
20
|
+
onClose: () => void;
|
|
21
|
+
description?: string;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export default function SubscriptionPurchaseDialogComponent({
|
|
25
|
+
showSubscriptionDialog,
|
|
26
|
+
onClose,
|
|
27
|
+
description,
|
|
28
|
+
}: SubscriptionPurchaseDialogComponentProps) {
|
|
29
|
+
//
|
|
30
|
+
const scopeT = _useScopedI18n("sharedComponents.buySubscriptionComponent");
|
|
31
|
+
|
|
32
|
+
const [open, setOpen] = React.useState(showSubscriptionDialog);
|
|
33
|
+
const { push } = useCustomRouter();
|
|
34
|
+
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
setOpen(showSubscriptionDialog);
|
|
37
|
+
}, [showSubscriptionDialog]);
|
|
38
|
+
|
|
39
|
+
const handleClose = () => {
|
|
40
|
+
setOpen(false);
|
|
41
|
+
onClose();
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const handleBuySubscription = useCallback(() => {
|
|
45
|
+
// redirect to subscription page
|
|
46
|
+
return push(`${ROUTES.dashboard.products}?category=subscription`);
|
|
47
|
+
}, [push]);
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<>
|
|
51
|
+
<Dialog
|
|
52
|
+
open={open}
|
|
53
|
+
handler={handleClose}
|
|
54
|
+
size="xs"
|
|
55
|
+
className="md:!max-w-[500px] md:!min-w-[500px] py-4 px-0 md:p-7 flex flex-col items-center justify-center"
|
|
56
|
+
>
|
|
57
|
+
<CustomNextImage
|
|
58
|
+
src={subscriptionIcon.src}
|
|
59
|
+
alt="SessionIcon"
|
|
60
|
+
width={80}
|
|
61
|
+
height={80}
|
|
62
|
+
/>
|
|
63
|
+
<div className="text-center">
|
|
64
|
+
<DialogHeader className="text-lg md:text-xl font-semibold text-black-500 pb-2">
|
|
65
|
+
{scopeT("header")}
|
|
66
|
+
</DialogHeader>
|
|
67
|
+
<div className="w-24 h-1 mx-auto rounded-full header-underline"></div>
|
|
68
|
+
</div>
|
|
69
|
+
|
|
70
|
+
<DialogBody className="text-sm md:text-base text-slate-400 font-medium text-center">
|
|
71
|
+
{description ?? scopeT("description")}
|
|
72
|
+
</DialogBody>
|
|
73
|
+
<DialogFooter className="pb-0">
|
|
74
|
+
<ButtonCustom icon={undefined} onClick={handleBuySubscription}>
|
|
75
|
+
{scopeT(`redirectBtn`)}
|
|
76
|
+
</ButtonCustom>
|
|
77
|
+
</DialogFooter>
|
|
78
|
+
</Dialog>
|
|
79
|
+
</>
|
|
80
|
+
);
|
|
81
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import {
|
|
2
|
+
IconButton,
|
|
3
|
+
List,
|
|
4
|
+
ListItem,
|
|
5
|
+
ListItemPrefix,
|
|
6
|
+
Popover,
|
|
7
|
+
PopoverContent,
|
|
8
|
+
PopoverHandler,
|
|
9
|
+
Typography,
|
|
10
|
+
} from "@material-tailwind/react";
|
|
11
|
+
import React, { useCallback } from "react";
|
|
12
|
+
import { BsChevronExpand } from "react-icons/bs";
|
|
13
|
+
import { HiDotsHorizontal } from "react-icons/hi";
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
ITableComponentHeadersType,
|
|
17
|
+
ITableComponentItemsType,
|
|
18
|
+
ResultPaginate,
|
|
19
|
+
} from "../types";
|
|
20
|
+
|
|
21
|
+
// import { TablePaginationComponent } from './TablePaginationComponent';
|
|
22
|
+
|
|
23
|
+
export type TableComponentProps = {
|
|
24
|
+
children?: React.ReactNode;
|
|
25
|
+
headers: Array<ITableComponentHeadersType>;
|
|
26
|
+
items?: Array<ITableComponentItemsType>;
|
|
27
|
+
pagination?: ResultPaginate<any>;
|
|
28
|
+
onSort: (key: string) => void;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export default function TableComponent({
|
|
32
|
+
children,
|
|
33
|
+
headers,
|
|
34
|
+
items,
|
|
35
|
+
// pagination,
|
|
36
|
+
onSort,
|
|
37
|
+
}: TableComponentProps) {
|
|
38
|
+
//
|
|
39
|
+
const classes = useCallback((isLast: boolean) => {
|
|
40
|
+
return isLast ? "p-4" : "p-4 border-b border-blue-gray-50";
|
|
41
|
+
}, []);
|
|
42
|
+
|
|
43
|
+
return (
|
|
44
|
+
<>
|
|
45
|
+
<table className="mt-4 w-full min-w-max table-auto text-left">
|
|
46
|
+
<thead>
|
|
47
|
+
<tr>
|
|
48
|
+
{headers.map(({ name, key, canSort }, _index) => (
|
|
49
|
+
<th
|
|
50
|
+
key={_index}
|
|
51
|
+
className="cursor-pointer border-y border-blue-gray-100 bg-blue-gray-50/50 p-4 transition-colors hover:bg-blue-gray-50"
|
|
52
|
+
>
|
|
53
|
+
<Typography
|
|
54
|
+
variant="small"
|
|
55
|
+
color="blue-gray"
|
|
56
|
+
className="flex items-center gap-2 font-normal leading-none opacity-70"
|
|
57
|
+
onClick={() => (canSort ? onSort(key) : {})}
|
|
58
|
+
>
|
|
59
|
+
{name}{" "}
|
|
60
|
+
{canSort && (
|
|
61
|
+
<BsChevronExpand strokeWidth={0.1} className="size-3" />
|
|
62
|
+
)}
|
|
63
|
+
</Typography>
|
|
64
|
+
</th>
|
|
65
|
+
))}
|
|
66
|
+
</tr>
|
|
67
|
+
</thead>
|
|
68
|
+
<tbody>
|
|
69
|
+
{items && items?.length > 0
|
|
70
|
+
? items.map((item, index) => (
|
|
71
|
+
<tr key={index}>
|
|
72
|
+
{item.lineItems.map((lineItem, lineIndex) => (
|
|
73
|
+
<td key={lineIndex} className={classes(item.isLast)}>
|
|
74
|
+
{lineItem.key == "actions" ? (
|
|
75
|
+
<>
|
|
76
|
+
<Popover placement="bottom-end">
|
|
77
|
+
<PopoverHandler>
|
|
78
|
+
<IconButton
|
|
79
|
+
variant="outlined"
|
|
80
|
+
className="p-0 ml-2 rounded-full bg-gray-100/40 border-none mt-[-8px]"
|
|
81
|
+
>
|
|
82
|
+
<HiDotsHorizontal className="size-4" />
|
|
83
|
+
</IconButton>
|
|
84
|
+
</PopoverHandler>
|
|
85
|
+
<PopoverContent className="p-1 py-2">
|
|
86
|
+
<List className="py-0">
|
|
87
|
+
{lineItem.value?.map(
|
|
88
|
+
(
|
|
89
|
+
{
|
|
90
|
+
name: actionName,
|
|
91
|
+
icon,
|
|
92
|
+
isActive: actionActive,
|
|
93
|
+
callback,
|
|
94
|
+
},
|
|
95
|
+
i,
|
|
96
|
+
) =>
|
|
97
|
+
actionActive && (
|
|
98
|
+
<ListItem
|
|
99
|
+
key={i}
|
|
100
|
+
onClick={callback}
|
|
101
|
+
className="group rounded-lg py-1.5 text-sm font-normal text-blue-gray-700 hover:bg-purple-100 hover:text-purple-700 focus:bg-purple-100 focus:text-purple-700"
|
|
102
|
+
>
|
|
103
|
+
<ListItemPrefix>{icon}</ListItemPrefix>
|
|
104
|
+
{actionName}
|
|
105
|
+
</ListItem>
|
|
106
|
+
),
|
|
107
|
+
)}
|
|
108
|
+
</List>
|
|
109
|
+
</PopoverContent>
|
|
110
|
+
</Popover>
|
|
111
|
+
</>
|
|
112
|
+
) : (
|
|
113
|
+
<>
|
|
114
|
+
{typeof lineItem.value == "string" ? (
|
|
115
|
+
<Typography
|
|
116
|
+
variant="small"
|
|
117
|
+
color="blue-gray"
|
|
118
|
+
className="font-normal"
|
|
119
|
+
>
|
|
120
|
+
{lineItem.value}
|
|
121
|
+
</Typography>
|
|
122
|
+
) : (
|
|
123
|
+
lineItem.value
|
|
124
|
+
)}
|
|
125
|
+
</>
|
|
126
|
+
)}
|
|
127
|
+
</td>
|
|
128
|
+
))}
|
|
129
|
+
</tr>
|
|
130
|
+
))
|
|
131
|
+
: children}
|
|
132
|
+
</tbody>
|
|
133
|
+
</table>
|
|
134
|
+
|
|
135
|
+
{/* {pagination && (
|
|
136
|
+
<TablePaginationComponent
|
|
137
|
+
totalPage={pagination.total}
|
|
138
|
+
currentPage={pagination.page}
|
|
139
|
+
limit={pagination.limit}
|
|
140
|
+
/>
|
|
141
|
+
)} */}
|
|
142
|
+
</>
|
|
143
|
+
);
|
|
144
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { ArrowLeftIcon, ArrowRightIcon } from "@heroicons/react/24/outline";
|
|
2
|
+
import { Button, IconButton } from "@material-tailwind/react";
|
|
3
|
+
import { usePathname, useRouter, useSearchParams } from "next/navigation";
|
|
4
|
+
import React, { useCallback, useEffect, useMemo } from "react";
|
|
5
|
+
|
|
6
|
+
export type TablePaginationComponentProps = {
|
|
7
|
+
totalPage: number;
|
|
8
|
+
total?: number;
|
|
9
|
+
currentPage: number;
|
|
10
|
+
limit: number;
|
|
11
|
+
fetchOrders: ({
|
|
12
|
+
page,
|
|
13
|
+
limit,
|
|
14
|
+
keyword,
|
|
15
|
+
}: {
|
|
16
|
+
page: number;
|
|
17
|
+
limit: number;
|
|
18
|
+
keyword?: string;
|
|
19
|
+
}) => Promise<any>;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const MAX_VISIBLE_PAGES = 6;
|
|
23
|
+
|
|
24
|
+
export function TablePaginationComponent({
|
|
25
|
+
totalPage,
|
|
26
|
+
total,
|
|
27
|
+
limit,
|
|
28
|
+
fetchOrders,
|
|
29
|
+
}: TablePaginationComponentProps) {
|
|
30
|
+
const searchParams = useSearchParams();
|
|
31
|
+
const [active, setActive] = React.useState(1);
|
|
32
|
+
const { push } = useRouter();
|
|
33
|
+
const pathname = usePathname();
|
|
34
|
+
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
const page = parseInt(`${searchParams.get("page") ?? 1}`);
|
|
37
|
+
(async () => await setActive(page))();
|
|
38
|
+
}, [searchParams, setActive]);
|
|
39
|
+
|
|
40
|
+
// Remove the separate useEffect for fetching and handle it in the pagination actions
|
|
41
|
+
const handlePaginate = useCallback(
|
|
42
|
+
async (page: number) => {
|
|
43
|
+
push(`${pathname}?page=${page}`);
|
|
44
|
+
await fetchOrders({ page, limit });
|
|
45
|
+
},
|
|
46
|
+
[pathname, push, fetchOrders, limit],
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const getItemProps = useCallback(
|
|
50
|
+
(index: number) =>
|
|
51
|
+
({
|
|
52
|
+
variant: active === index ? "filled" : "text",
|
|
53
|
+
color: "gray",
|
|
54
|
+
onClick: () => handlePaginate(index),
|
|
55
|
+
}) as any,
|
|
56
|
+
[active, handlePaginate],
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
const next = useCallback(async () => {
|
|
60
|
+
if (active === totalPage) return;
|
|
61
|
+
const nextPage = active + 1;
|
|
62
|
+
setActive(nextPage);
|
|
63
|
+
await handlePaginate(nextPage);
|
|
64
|
+
}, [active, totalPage, handlePaginate]);
|
|
65
|
+
|
|
66
|
+
const prev = useCallback(async () => {
|
|
67
|
+
if (active === 1) return;
|
|
68
|
+
const prevPage = active - 1;
|
|
69
|
+
setActive(prevPage);
|
|
70
|
+
await handlePaginate(prevPage);
|
|
71
|
+
}, [active, handlePaginate]);
|
|
72
|
+
|
|
73
|
+
const renderBtn = useMemo(() => {
|
|
74
|
+
const totalPages = total ? Math.ceil(total / limit) : totalPage;
|
|
75
|
+
const startPage = Math.max(
|
|
76
|
+
1,
|
|
77
|
+
(active == totalPages ? active - 1 : active) -
|
|
78
|
+
Math.floor(MAX_VISIBLE_PAGES / 2),
|
|
79
|
+
);
|
|
80
|
+
const endPage = Math.min(totalPages, startPage - 1 + MAX_VISIBLE_PAGES - 1);
|
|
81
|
+
|
|
82
|
+
const items = [];
|
|
83
|
+
|
|
84
|
+
// Always show the first page
|
|
85
|
+
items.push(
|
|
86
|
+
<IconButton key={1} {...getItemProps(1)}>
|
|
87
|
+
1
|
|
88
|
+
</IconButton>,
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
if (active != 1) {
|
|
92
|
+
// Show ellipsis if necessary
|
|
93
|
+
if (startPage > 2) {
|
|
94
|
+
items.push(<span key="ellipsis">...</span>);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Render the visible page numbers
|
|
99
|
+
for (let i = startPage + 1; i <= endPage; i++) {
|
|
100
|
+
if (i == totalPages) continue;
|
|
101
|
+
items.push(
|
|
102
|
+
<IconButton key={i} {...getItemProps(i)}>
|
|
103
|
+
{i}
|
|
104
|
+
</IconButton>,
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (active != totalPages) {
|
|
109
|
+
// Show ellipsis if necessary
|
|
110
|
+
if (endPage < totalPages - 1) {
|
|
111
|
+
items.push(<span key="ellipsis">...</span>);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (totalPages > 1) {
|
|
116
|
+
// Always show the last page
|
|
117
|
+
items.push(
|
|
118
|
+
<IconButton key={totalPages} {...getItemProps(totalPages)}>
|
|
119
|
+
{totalPages}
|
|
120
|
+
</IconButton>,
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return items;
|
|
125
|
+
}, [total, totalPage, limit, active, getItemProps]);
|
|
126
|
+
|
|
127
|
+
return (
|
|
128
|
+
<div className="w-full overflow-x-auto overflow-y-hidden py-2">
|
|
129
|
+
<div className="flex items-center gap-4 my-5">
|
|
130
|
+
<Button
|
|
131
|
+
variant="text"
|
|
132
|
+
className="flex items-center gap-2"
|
|
133
|
+
onClick={prev}
|
|
134
|
+
disabled={active === 1}
|
|
135
|
+
>
|
|
136
|
+
<ArrowLeftIcon strokeWidth={2} className="h-4 w-4" /> Previous
|
|
137
|
+
</Button>
|
|
138
|
+
<div className="flex items-center gap-2">{renderBtn}</div>
|
|
139
|
+
<Button
|
|
140
|
+
variant="text"
|
|
141
|
+
className="flex items-center gap-2"
|
|
142
|
+
onClick={next}
|
|
143
|
+
disabled={active === totalPage}
|
|
144
|
+
>
|
|
145
|
+
Next
|
|
146
|
+
<ArrowRightIcon strokeWidth={2} className="h-4 w-4" />
|
|
147
|
+
</Button>
|
|
148
|
+
</div>
|
|
149
|
+
</div>
|
|
150
|
+
);
|
|
151
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import React, { useEffect, useMemo, useState } from "react";
|
|
3
|
+
|
|
4
|
+
import { KYC_STATUS } from "../../constants/app";
|
|
5
|
+
import { useUserStore } from "../../stores/userStore";
|
|
6
|
+
import { KycStatus } from "../../types/user";
|
|
7
|
+
import { KycPendingStatus } from "./KycPendingStatus";
|
|
8
|
+
import { KycRejectedStatus } from "./KycRejectedStatus";
|
|
9
|
+
import { KycRequiredStatus } from "./KycRequiredStatus";
|
|
10
|
+
import { SubscriptionRequiredStatus } from "./SubscriptionRequiredStatus";
|
|
11
|
+
|
|
12
|
+
type AletaManagerComponentProps = {
|
|
13
|
+
children: any;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export function AletaManagerComponent({
|
|
17
|
+
children,
|
|
18
|
+
}: AletaManagerComponentProps) {
|
|
19
|
+
const [kycStatus, setKycStatus] = useState<KycStatus | null>(null);
|
|
20
|
+
|
|
21
|
+
const { user } = useUserStore();
|
|
22
|
+
|
|
23
|
+
// Mock API call to get KYC status
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (user && user?.pgUser?.aletaState) {
|
|
26
|
+
(async () => await setKycStatus(user?.pgUser?.aletaState))();
|
|
27
|
+
}
|
|
28
|
+
}, [user]);
|
|
29
|
+
|
|
30
|
+
// Use a mapping object instead of switch statement for cleaner code
|
|
31
|
+
const statusComponentMap = useMemo(
|
|
32
|
+
() => ({
|
|
33
|
+
[KYC_STATUS.SUBSCRIPTION_REQUIRED]: <SubscriptionRequiredStatus />,
|
|
34
|
+
[KYC_STATUS.KYC_REQUIRED]: <KycRequiredStatus />,
|
|
35
|
+
[KYC_STATUS.KYC_PENDING]: <KycPendingStatus />,
|
|
36
|
+
[KYC_STATUS.KYC_REJECTED]: <KycRejectedStatus />,
|
|
37
|
+
[KYC_STATUS.ACTIVE]: children,
|
|
38
|
+
}),
|
|
39
|
+
[children],
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
// Determine what content to render based on loading, error, and status
|
|
43
|
+
const content = useMemo(() => {
|
|
44
|
+
return kycStatus ? (
|
|
45
|
+
statusComponentMap[kycStatus]
|
|
46
|
+
) : (
|
|
47
|
+
<div>Unknown status</div>
|
|
48
|
+
);
|
|
49
|
+
}, [kycStatus, statusComponentMap]);
|
|
50
|
+
|
|
51
|
+
return <div>{content}</div>;
|
|
52
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Typography } from "@material-tailwind/react";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
import pendingIcon from "../../../public/img/aleta-payment-pending.png";
|
|
5
|
+
import CustomNextImage from "../CustomNextImage";
|
|
6
|
+
|
|
7
|
+
export function KycPendingStatus() {
|
|
8
|
+
return (
|
|
9
|
+
<>
|
|
10
|
+
<div className="flex justify-center md:px-5 py-10 rounded-[12px] bg-[#F5F5F3] text-center">
|
|
11
|
+
<div>
|
|
12
|
+
<div className="flex justify-center">
|
|
13
|
+
<CustomNextImage
|
|
14
|
+
className="mb-[40px]"
|
|
15
|
+
width={72}
|
|
16
|
+
height={57}
|
|
17
|
+
src={pendingIcon.src}
|
|
18
|
+
alt={"kyc require"}
|
|
19
|
+
/>
|
|
20
|
+
</div>
|
|
21
|
+
<Typography
|
|
22
|
+
variant="paragraph"
|
|
23
|
+
className="max-w-[400px] mb-[70px] font-semibold"
|
|
24
|
+
>
|
|
25
|
+
{`Yay! We already have your KYC details.
|
|
26
|
+
Please wait while we create your wallet once the
|
|
27
|
+
verification is complete.`}
|
|
28
|
+
</Typography>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
</>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Typography } from "@material-tailwind/react";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
import kycRequire from "../../../public/img/aleta-payment-kyc-require.png";
|
|
5
|
+
import rejectedIcon from "../../../public/img/aleta-payment-rejected.png";
|
|
6
|
+
import { ROUTES } from "../../constants/routes";
|
|
7
|
+
import useCustomRouter from "../../hooks/useCustomRouter";
|
|
8
|
+
import ButtonCustom from "../Button";
|
|
9
|
+
import CustomNextImage from "../CustomNextImage";
|
|
10
|
+
|
|
11
|
+
export function KycRejectedStatus() {
|
|
12
|
+
const { push } = useCustomRouter();
|
|
13
|
+
return (
|
|
14
|
+
<>
|
|
15
|
+
<div className="flex justify-center md:px-5 py-10 rounded-[12px] bg-[#F5F5F3] text-center">
|
|
16
|
+
<div>
|
|
17
|
+
<div className="flex justify-center">
|
|
18
|
+
<CustomNextImage
|
|
19
|
+
className="mb-[40px]"
|
|
20
|
+
width={72}
|
|
21
|
+
height={57}
|
|
22
|
+
src={rejectedIcon.src}
|
|
23
|
+
alt={"kyc require"}
|
|
24
|
+
/>
|
|
25
|
+
<CustomNextImage
|
|
26
|
+
className="mb-[40px]"
|
|
27
|
+
width={46}
|
|
28
|
+
height={55}
|
|
29
|
+
src={kycRequire.src}
|
|
30
|
+
alt={"kyc Require"}
|
|
31
|
+
/>
|
|
32
|
+
</div>
|
|
33
|
+
<Typography
|
|
34
|
+
variant="paragraph"
|
|
35
|
+
className="max-w-[400px] mb-[70px] font-semibold text-[#FF2727]"
|
|
36
|
+
>
|
|
37
|
+
{`Sorry, your KYC was rejected.`}
|
|
38
|
+
</Typography>
|
|
39
|
+
<div className="flex justify-center">
|
|
40
|
+
<ButtonCustom
|
|
41
|
+
icon={undefined}
|
|
42
|
+
onClick={() => {
|
|
43
|
+
push(ROUTES.aleta.aletaStatus);
|
|
44
|
+
}}
|
|
45
|
+
>
|
|
46
|
+
Visit KYC page
|
|
47
|
+
</ButtonCustom>
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
</>
|
|
52
|
+
);
|
|
53
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Typography } from "@material-tailwind/react";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
import kycRequire from "../../../public/img/aleta-payment-kyc-require.png";
|
|
5
|
+
import rejectedIcon from "../../../public/img/aleta-payment-rejected.png";
|
|
6
|
+
import { ROUTES } from "../../constants/routes";
|
|
7
|
+
import useCustomRouter from "../../hooks/useCustomRouter";
|
|
8
|
+
import ButtonCustom from "../Button";
|
|
9
|
+
import CustomNextImage from "../CustomNextImage";
|
|
10
|
+
|
|
11
|
+
export function KycRequiredStatus() {
|
|
12
|
+
const { push } = useCustomRouter();
|
|
13
|
+
return (
|
|
14
|
+
<>
|
|
15
|
+
<div className="flex justify-center md:px-5 py-10 rounded-[12px] bg-[#F5F5F3] text-center">
|
|
16
|
+
<div>
|
|
17
|
+
<div className="flex justify-center">
|
|
18
|
+
<CustomNextImage
|
|
19
|
+
className="mb-[40px]"
|
|
20
|
+
width={72}
|
|
21
|
+
height={57}
|
|
22
|
+
src={rejectedIcon.src}
|
|
23
|
+
alt={"kyc require"}
|
|
24
|
+
/>
|
|
25
|
+
<CustomNextImage
|
|
26
|
+
className="mb-[40px]"
|
|
27
|
+
width={46}
|
|
28
|
+
height={55}
|
|
29
|
+
src={kycRequire.src}
|
|
30
|
+
alt={"kyc Require"}
|
|
31
|
+
/>
|
|
32
|
+
</div>
|
|
33
|
+
<Typography
|
|
34
|
+
variant="paragraph"
|
|
35
|
+
className="max-w-[400px] mb-[70px] font-semibold text-[#FF2727]"
|
|
36
|
+
>
|
|
37
|
+
{`Please visit the Aleta KYC page to initiate the KYC application.`}
|
|
38
|
+
</Typography>
|
|
39
|
+
<div className="flex justify-center">
|
|
40
|
+
<ButtonCustom
|
|
41
|
+
icon={undefined}
|
|
42
|
+
onClick={() => {
|
|
43
|
+
push(ROUTES.aleta.aletaStatus);
|
|
44
|
+
}}
|
|
45
|
+
>
|
|
46
|
+
Go to Aleta Pay
|
|
47
|
+
</ButtonCustom>
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
</>
|
|
52
|
+
);
|
|
53
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Typography } from "@material-tailwind/react";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
import subscriptionRequired from "../../../public/img/aleta-payment-subscription-required.png";
|
|
5
|
+
import { ROUTES } from "../../constants/routes";
|
|
6
|
+
import useCustomRouter from "../../hooks/useCustomRouter";
|
|
7
|
+
import ButtonCustom from "../Button";
|
|
8
|
+
import CustomNextImage from "../CustomNextImage";
|
|
9
|
+
|
|
10
|
+
export function SubscriptionRequiredStatus() {
|
|
11
|
+
const { push } = useCustomRouter();
|
|
12
|
+
return (
|
|
13
|
+
<>
|
|
14
|
+
<div className="flex justify-center md:px-5 py-10 rounded-[12px] bg-[#F5F5F3] text-center">
|
|
15
|
+
<div>
|
|
16
|
+
<div className="flex justify-center">
|
|
17
|
+
<CustomNextImage
|
|
18
|
+
className="mb-[40px]"
|
|
19
|
+
width={72}
|
|
20
|
+
height={57}
|
|
21
|
+
src={subscriptionRequired.src}
|
|
22
|
+
alt={"subscription require"}
|
|
23
|
+
/>
|
|
24
|
+
</div>
|
|
25
|
+
<Typography
|
|
26
|
+
variant="paragraph"
|
|
27
|
+
className="max-w-[400px] mb-[70px] font-semibold"
|
|
28
|
+
>
|
|
29
|
+
{`We’re excited to get your Aleta wallet ready. Let's first quickly setup your wallet.`}
|
|
30
|
+
</Typography>
|
|
31
|
+
<div className="flex justify-center">
|
|
32
|
+
<ButtonCustom
|
|
33
|
+
icon={undefined}
|
|
34
|
+
onClick={() => {
|
|
35
|
+
push(ROUTES.aleta.aletaFee);
|
|
36
|
+
}}
|
|
37
|
+
>
|
|
38
|
+
Go to Setup
|
|
39
|
+
</ButtonCustom>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
</>
|
|
44
|
+
);
|
|
45
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
export function AletaWalletIcon({ className }: { className?: string }) {
|
|
4
|
+
return (
|
|
5
|
+
<svg
|
|
6
|
+
className={className}
|
|
7
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
8
|
+
width="22"
|
|
9
|
+
height="18"
|
|
10
|
+
viewBox="0 0 22 18"
|
|
11
|
+
fill="none"
|
|
12
|
+
>
|
|
13
|
+
<path
|
|
14
|
+
fillRule="evenodd"
|
|
15
|
+
clipRule="evenodd"
|
|
16
|
+
d="M4.16146 1.0032e-06H15.8385C16.3657 -1.89968e-05 16.8205 -2.8966e-05 17.195 0.030571C17.5904 0.062871 17.9836 0.134191 18.362 0.326981C18.9265 0.614601 19.3854 1.07354 19.673 1.63803C19.8658 2.01641 19.9371 2.40963 19.9694 2.80497C20 3.17954 20 3.6343 20 4.16144V6.00821C20.0476 6.01046 20.0938 6.01331 20.1382 6.01695C20.3668 6.03562 20.6366 6.07969 20.908 6.21799C21.2843 6.40974 21.5903 6.7157 21.782 7.092C21.9203 7.3634 21.9644 7.6332 21.9831 7.8618C22.0001 8.0699 22 8.3157 22 8.5681V9.4319C22 9.6843 22.0001 9.9301 21.9831 10.1382C21.9644 10.3668 21.9203 10.6366 21.782 10.908C21.5903 11.2843 21.2843 11.5903 20.908 11.782C20.6366 11.9203 20.3668 11.9644 20.1382 11.9831C20.0938 11.9867 20.0476 11.9895 20 11.9918V13.8386C20 14.3657 20 14.8205 19.9694 15.195C19.9371 15.5904 19.8658 15.9836 19.673 16.362C19.3854 16.9265 18.9265 17.3854 18.362 17.673C17.9836 17.8658 17.5904 17.9371 17.195 17.9694C16.8205 18 16.3657 18 15.8386 18H4.16144C3.6343 18 3.17954 18 2.80497 17.9694C2.40963 17.9371 2.01641 17.8658 1.63803 17.673C1.07354 17.3854 0.614601 16.9265 0.326981 16.362C0.134191 15.9836 0.0628708 15.5904 0.0305708 15.195C-3.21716e-05 14.8205 -1.62006e-05 14.3657 7.99441e-07 13.8385V4.16146C-1.62006e-05 3.63431 -3.21716e-05 3.17955 0.0305708 2.80497C0.0628708 2.40963 0.134191 2.01641 0.326981 1.63803C0.614601 1.07354 1.07354 0.614601 1.63803 0.326981C2.01641 0.134191 2.40963 0.062871 2.80497 0.030571C3.17955 -2.8966e-05 3.63431 -1.89968e-05 4.16146 1.0032e-06ZM18 12H14.5681C14.3157 12 14.0699 12.0001 13.8618 11.9831C13.6332 11.9644 13.3634 11.9203 13.092 11.782C12.7157 11.5903 12.4097 11.2843 12.218 10.908C12.0797 10.6366 12.0356 10.3668 12.0169 10.1382C11.9999 9.9301 12 9.6843 12 9.4319V8.5681C12 8.3157 11.9999 8.0699 12.0169 7.8618C12.0356 7.6332 12.0797 7.3634 12.218 7.092C12.4097 6.7157 12.7157 6.40974 13.092 6.21799C13.3634 6.07969 13.6332 6.03562 13.8618 6.01695C14.0699 5.99994 14.3157 5.99997 14.5681 6H18V4.2C18 3.62345 17.9992 3.25118 17.9761 2.96784C17.9539 2.69617 17.9162 2.59546 17.891 2.54601C17.7951 2.35785 17.6422 2.20487 17.454 2.109C17.4045 2.0838 17.3038 2.04612 17.0322 2.02393C16.7488 2.00078 16.3766 2 15.8 2H4.2C3.62345 2 3.25117 2.00078 2.96784 2.02393C2.69617 2.04612 2.59546 2.0838 2.54601 2.109C2.35785 2.20487 2.20487 2.35785 2.109 2.54601C2.0838 2.59546 2.04612 2.69617 2.02393 2.96784C2.00078 3.25117 2 3.62345 2 4.2V13.8C2 14.3766 2.00078 14.7488 2.02393 15.0322C2.04612 15.3038 2.0838 15.4045 2.109 15.454C2.20487 15.6422 2.35785 15.7951 2.54601 15.891C2.59546 15.9162 2.69617 15.9539 2.96784 15.9761C3.25117 15.9992 3.62345 16 4.2 16H15.8C16.3766 16 16.7488 15.9992 17.0322 15.9761C17.3038 15.9539 17.4045 15.9162 17.454 15.891C17.6422 15.7951 17.7951 15.6422 17.891 15.454C17.9162 15.4046 17.9539 15.3038 17.9761 15.0322C17.9992 14.7488 18 14.3766 18 13.8V12ZM14.0115 8.0114C14.0111 8.0156 14.0107 8.02 14.0103 8.0246C14.0008 8.1412 14 8.3035 14 8.6V9.4C14 9.6965 14.0008 9.8588 14.0103 9.9754C14.0107 9.98 14.0111 9.9844 14.0115 9.9886C14.0156 9.9889 14.02 9.9893 14.0246 9.9897C14.1412 9.9992 14.3035 10 14.6 10H19.4C19.6965 10 19.8588 9.9992 19.9754 9.9897C19.98 9.9893 19.9844 9.9889 19.9886 9.9885C19.9889 9.9844 19.9893 9.98 19.9897 9.9754C19.9992 9.8588 20 9.6965 20 9.4V8.6C20 8.3035 19.9992 8.1412 19.9897 8.0246C19.9893 8.02 19.9889 8.0156 19.9885 8.0114C19.9844 8.0111 19.98 8.0107 19.9754 8.0103C19.8588 8.0008 19.6965 8 19.4 8H14.6C14.3035 8 14.1412 8.0008 14.0246 8.0103C14.02 8.0107 14.0156 8.0111 14.0115 8.0114Z"
|
|
17
|
+
fill="black"
|
|
18
|
+
/>
|
|
19
|
+
</svg>
|
|
20
|
+
);
|
|
21
|
+
}
|