@lookiero/checkout 0.2.41 → 0.2.43
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/dist/domain/checkoutItem/command/replaceCheckoutItem.d.ts +14 -0
- package/dist/domain/checkoutItem/command/replaceCheckoutItem.js +7 -0
- package/dist/domain/checkoutItem/model/checkoutItem.d.ts +4 -1
- package/dist/domain/checkoutItem/model/checkoutItem.js +11 -1
- package/dist/domain/checkoutItem/model/checkoutItemReplaced.d.ts +13 -0
- package/dist/domain/checkoutItem/model/checkoutItemReplaced.js +4 -0
- package/dist/infrastructure/delivery/baseBootstrap.js +3 -1
- package/dist/infrastructure/domain/checkout/model/httpCheckouts.js +1 -3
- package/dist/infrastructure/domain/checkout/model/httpCheckoutsStart.js +1 -1
- package/dist/infrastructure/domain/checkout/react/useStartCheckout.js +1 -1
- package/dist/infrastructure/domain/checkoutBooking/model/httpCheckoutBookings.js +1 -3
- package/dist/infrastructure/domain/checkoutBooking/model/httpCheckoutBookingsBook.js +1 -1
- package/dist/infrastructure/domain/checkoutBooking/react/useBookCheckouBookingForCheckoutItem.js +1 -1
- package/dist/infrastructure/domain/checkoutItem/model/httpCheckoutItems.js +3 -0
- package/dist/infrastructure/domain/checkoutItem/model/httpCheckoutItemsKeep.js +1 -1
- package/dist/infrastructure/domain/checkoutItem/model/httpCheckoutItemsReplace.d.ts +5 -0
- package/dist/infrastructure/domain/checkoutItem/model/httpCheckoutItemsReplace.js +13 -0
- package/dist/infrastructure/domain/checkoutItem/model/httpCheckoutItemsReturn.js +1 -1
- package/dist/infrastructure/domain/checkoutItem/react/useKeepCheckoutItem.js +1 -1
- package/dist/infrastructure/domain/checkoutItem/react/useReplaceCheckoutItem.d.ts +16 -0
- package/dist/infrastructure/domain/checkoutItem/react/useReplaceCheckoutItem.js +13 -0
- package/dist/infrastructure/domain/checkoutItem/react/useReturnCheckoutItem.js +1 -1
- package/dist/infrastructure/domain/uiSetting/react/useUpdateUiSetting.js +1 -1
- package/dist/infrastructure/ui/shared/components/molecules/inputField/InputField.d.ts +1 -0
- package/dist/infrastructure/ui/shared/components/molecules/selectField/SelectField.d.ts +2 -0
- package/dist/infrastructure/ui/shared/components/molecules/selectField/SelectField.js +1 -1
- package/dist/infrastructure/ui/views/item/Item.js +25 -8
- package/dist/infrastructure/ui/views/item/components/itemActions/ItemActions.d.ts +3 -0
- package/dist/infrastructure/ui/views/item/components/itemActions/ItemActions.js +11 -5
- package/dist/infrastructure/ui/views/item/components/itemActions/ItemActions.style.d.ts +3 -0
- package/dist/infrastructure/ui/views/item/components/itemActions/ItemActions.style.js +4 -1
- package/dist/infrastructure/ui/views/summary/Summary.js +2 -5
- package/package.json +1 -1
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Command } from "@lookiero/messaging";
|
|
2
|
+
declare const REPLACE_CHECKOUT_ITEM = "replace_checkout_item";
|
|
3
|
+
interface ReplaceCheckoutItemPayload {
|
|
4
|
+
readonly aggregateId: string;
|
|
5
|
+
readonly replacedFor: string;
|
|
6
|
+
}
|
|
7
|
+
interface ReplaceCheckoutItem extends Command<typeof REPLACE_CHECKOUT_ITEM>, ReplaceCheckoutItemPayload {
|
|
8
|
+
}
|
|
9
|
+
interface ReplaceCheckoutItemFunction {
|
|
10
|
+
(payload: ReplaceCheckoutItemPayload): ReplaceCheckoutItem;
|
|
11
|
+
}
|
|
12
|
+
declare const replaceCheckoutItem: ReplaceCheckoutItemFunction;
|
|
13
|
+
export type { ReplaceCheckoutItem };
|
|
14
|
+
export { REPLACE_CHECKOUT_ITEM, replaceCheckoutItem };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { command } from "@lookiero/messaging";
|
|
2
|
+
const REPLACE_CHECKOUT_ITEM = "replace_checkout_item";
|
|
3
|
+
const replaceCheckoutItem = ({ aggregateId, ...payload }) => ({
|
|
4
|
+
...command({ aggregateId, name: REPLACE_CHECKOUT_ITEM }),
|
|
5
|
+
...payload,
|
|
6
|
+
});
|
|
7
|
+
export { REPLACE_CHECKOUT_ITEM, replaceCheckoutItem };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AggregateRoot, CommandHandlerFunction } from "@lookiero/messaging";
|
|
2
2
|
import { KeepCheckoutItem } from "../command/keepCheckoutItem";
|
|
3
|
+
import { ReplaceCheckoutItem } from "../command/replaceCheckoutItem";
|
|
3
4
|
import { ReturnCheckoutItem } from "../command/returnCheckoutItem";
|
|
4
5
|
import { Feedbacks } from "./feedbacks";
|
|
5
6
|
import { Price } from "./price";
|
|
@@ -14,8 +15,10 @@ interface CheckoutItem extends AggregateRoot {
|
|
|
14
15
|
readonly status: CheckoutItemStatus;
|
|
15
16
|
readonly price: Price;
|
|
16
17
|
readonly feedbacks: Feedbacks;
|
|
18
|
+
readonly replacedFor?: string;
|
|
17
19
|
}
|
|
18
20
|
declare const keepCheckoutItemHandler: CommandHandlerFunction<KeepCheckoutItem, CheckoutItem>;
|
|
19
21
|
declare const returnCheckoutItemHandler: CommandHandlerFunction<ReturnCheckoutItem, CheckoutItem>;
|
|
22
|
+
declare const replaceCheckoutItemHandler: CommandHandlerFunction<ReplaceCheckoutItem, CheckoutItem>;
|
|
20
23
|
export type { CheckoutItem };
|
|
21
|
-
export { CheckoutItemStatus, keepCheckoutItemHandler, returnCheckoutItemHandler };
|
|
24
|
+
export { CheckoutItemStatus, keepCheckoutItemHandler, returnCheckoutItemHandler, replaceCheckoutItemHandler };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import invariant from "tiny-invariant";
|
|
2
2
|
import { checkoutItemKept } from "./checkoutItemKept";
|
|
3
|
+
import { checkoutItemReplaced } from "./checkoutItemReplaced";
|
|
3
4
|
import { checkoutItemReturned } from "./checkoutItemReturned";
|
|
4
5
|
var CheckoutItemStatus;
|
|
5
6
|
(function (CheckoutItemStatus) {
|
|
@@ -27,4 +28,13 @@ const returnCheckoutItemHandler = () => async ({ aggregateRoot, command }) => {
|
|
|
27
28
|
domainEvents: [checkoutItemReturned({ aggregateId })],
|
|
28
29
|
};
|
|
29
30
|
};
|
|
30
|
-
|
|
31
|
+
const replaceCheckoutItemHandler = () => async ({ aggregateRoot, command }) => {
|
|
32
|
+
const { aggregateId } = command;
|
|
33
|
+
invariant(aggregateRoot.status !== CheckoutItemStatus.REPLACED, "CheckoutItem is already replaced");
|
|
34
|
+
return {
|
|
35
|
+
...aggregateRoot,
|
|
36
|
+
status: CheckoutItemStatus.REPLACED,
|
|
37
|
+
domainEvents: [checkoutItemReplaced({ aggregateId })],
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
export { CheckoutItemStatus, keepCheckoutItemHandler, returnCheckoutItemHandler, replaceCheckoutItemHandler };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { DomainEvent } from "@lookiero/messaging";
|
|
2
|
+
declare const CHECKOUT_ITEM_REPLACED = "checkout_item_replaced";
|
|
3
|
+
interface CheckoutItemReplacedPayload {
|
|
4
|
+
readonly aggregateId: string;
|
|
5
|
+
}
|
|
6
|
+
interface CheckoutItemReplaced extends DomainEvent<typeof CHECKOUT_ITEM_REPLACED>, CheckoutItemReplacedPayload {
|
|
7
|
+
}
|
|
8
|
+
interface CheckoutItemReplacedFunction {
|
|
9
|
+
(payload: CheckoutItemReplacedPayload): CheckoutItemReplaced;
|
|
10
|
+
}
|
|
11
|
+
declare const checkoutItemReplaced: CheckoutItemReplacedFunction;
|
|
12
|
+
export type { CheckoutItemReplaced };
|
|
13
|
+
export { CHECKOUT_ITEM_REPLACED, checkoutItemReplaced };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { domainEvent } from "@lookiero/messaging";
|
|
2
|
+
const CHECKOUT_ITEM_REPLACED = "checkout_item_replaced";
|
|
3
|
+
const checkoutItemReplaced = ({ aggregateId }) => domainEvent({ aggregateId, name: CHECKOUT_ITEM_REPLACED });
|
|
4
|
+
export { CHECKOUT_ITEM_REPLACED, checkoutItemReplaced };
|
|
@@ -4,8 +4,9 @@ import { startCheckoutHandler } from "../../domain/checkout/model/checkout";
|
|
|
4
4
|
import { BOOK_CHECKOUT_BOOKING_FOR_CHECKOUT_ITEM } from "../../domain/checkoutBooking/command/bookCheckoutBookingForCheckoutItem";
|
|
5
5
|
import { bookCheckoutBookingForCheckoutItemHandler, } from "../../domain/checkoutBooking/model/checkoutBooking";
|
|
6
6
|
import { KEEP_CHECKOUT_ITEM } from "../../domain/checkoutItem/command/keepCheckoutItem";
|
|
7
|
+
import { REPLACE_CHECKOUT_ITEM } from "../../domain/checkoutItem/command/replaceCheckoutItem";
|
|
7
8
|
import { RETURN_CHECKOUT_ITEM } from "../../domain/checkoutItem/command/returnCheckoutItem";
|
|
8
|
-
import { keepCheckoutItemHandler, returnCheckoutItemHandler, } from "../../domain/checkoutItem/model/checkoutItem";
|
|
9
|
+
import { keepCheckoutItemHandler, replaceCheckoutItemHandler, returnCheckoutItemHandler, } from "../../domain/checkoutItem/model/checkoutItem";
|
|
9
10
|
import { UPDATE_UI_SETTING } from "../../domain/uiSetting/command/updateUiSetting";
|
|
10
11
|
import { updateUiSettingHandler } from "../../domain/uiSetting/model/uiSetting";
|
|
11
12
|
import { viewBookedSizeChangeProductsVariantsForCheckoutItemHandler, VIEW_BOOKED_SIZE_CHANGE_PRODUCT_VARIANTS_FOR_CHECKOUT_ITEM, } from "../../projection/bookedSizeChangeProductsVariants/viewBookedSizeChangeProductVariantsForCheckoutItem";
|
|
@@ -41,6 +42,7 @@ const baseBootstrap = ({ checkoutByIdView, firstAvailableCheckoutByCustomerIdVie
|
|
|
41
42
|
})
|
|
42
43
|
.command(KEEP_CHECKOUT_ITEM, keepCheckoutItemHandler)(getCheckoutItem, saveCheckoutItem, ...checkoutItemsDependencies)
|
|
43
44
|
.command(RETURN_CHECKOUT_ITEM, returnCheckoutItemHandler)(getCheckoutItem, saveCheckoutItem, ...checkoutItemsDependencies)
|
|
45
|
+
.command(REPLACE_CHECKOUT_ITEM, replaceCheckoutItemHandler)(getCheckoutItem, saveCheckoutItem, ...checkoutItemsDependencies)
|
|
44
46
|
.query(VIEW_BOOKED_SIZE_CHANGE_PRODUCT_VARIANTS_FOR_CHECKOUT_ITEM, viewBookedSizeChangeProductsVariantsForCheckoutItemHandler, {
|
|
45
47
|
view: bookedSizeChangeProductsVariantsForCheckoutItemView,
|
|
46
48
|
})
|
|
@@ -15,7 +15,5 @@ const toDomain = (checkout) => {
|
|
|
15
15
|
};
|
|
16
16
|
};
|
|
17
17
|
const getCheckout = ({ queryBus }) => async (aggregateId) => toDomain(await queryBus(viewCheckoutById({ checkoutId: aggregateId })));
|
|
18
|
-
const saveCheckout = ({ httpPost }) => async (aggregateRoot) => {
|
|
19
|
-
await httpCheckoutsStart({ httpPost })(aggregateRoot);
|
|
20
|
-
};
|
|
18
|
+
const saveCheckout = ({ httpPost }) => async (aggregateRoot) => await httpCheckoutsStart({ httpPost })(aggregateRoot);
|
|
21
19
|
export { getCheckout, saveCheckout };
|
|
@@ -4,7 +4,7 @@ import { startCheckout } from "../../../../domain/checkout/command/startCheckout
|
|
|
4
4
|
import { MESSAGING_CONTEXT_ID } from "../../../delivery/baseBootstrap";
|
|
5
5
|
const useStartCheckout = ({ checkoutId }) => {
|
|
6
6
|
const [commandBus, status] = useCommand({ contextId: MESSAGING_CONTEXT_ID });
|
|
7
|
-
const start = useCallback(
|
|
7
|
+
const start = useCallback(() => commandBus(startCheckout({ aggregateId: checkoutId })), [checkoutId, commandBus]);
|
|
8
8
|
return [start, status];
|
|
9
9
|
};
|
|
10
10
|
export { useStartCheckout };
|
|
@@ -11,7 +11,5 @@ const toDomain = (checkoutBooking) => {
|
|
|
11
11
|
};
|
|
12
12
|
};
|
|
13
13
|
const getCheckoutBooking = ({ queryBus }) => async (aggregateId) => toDomain(await queryBus(viewCheckoutBookingById({ checkoutBookingId: aggregateId })));
|
|
14
|
-
const saveCheckoutBooking = ({ httpPost }) => async (aggregateRoot) => {
|
|
15
|
-
await httpCheckoutBookingsBook({ httpPost })(aggregateRoot);
|
|
16
|
-
};
|
|
14
|
+
const saveCheckoutBooking = ({ httpPost }) => async (aggregateRoot) => await httpCheckoutBookingsBook({ httpPost })(aggregateRoot);
|
|
17
15
|
export { getCheckoutBooking, saveCheckoutBooking };
|
|
@@ -6,7 +6,7 @@ const httpCheckoutBookingsBook = ({ httpPost }) => async ({ aggregateId, checkou
|
|
|
6
6
|
return;
|
|
7
7
|
}
|
|
8
8
|
const { checkoutItemId } = checkoutBookingBooked;
|
|
9
|
-
httpPost({
|
|
9
|
+
await httpPost({
|
|
10
10
|
endpoint: "/book-size-change-product-variants-for-checkout-item",
|
|
11
11
|
body: {
|
|
12
12
|
checkoutId,
|
package/dist/infrastructure/domain/checkoutBooking/react/useBookCheckouBookingForCheckoutItem.js
CHANGED
|
@@ -5,7 +5,7 @@ import { bookCheckoutBookingForCheckoutItem } from "../../../../domain/checkoutB
|
|
|
5
5
|
import { MESSAGING_CONTEXT_ID } from "../../../delivery/baseBootstrap";
|
|
6
6
|
const useBookCheckouBookingForCheckoutItem = ({ checkoutId, checkoutItemId, checkoutBookingId, }) => {
|
|
7
7
|
const [commandBus, status] = useCommand({ contextId: MESSAGING_CONTEXT_ID });
|
|
8
|
-
const book = useCallback(
|
|
8
|
+
const book = useCallback(() => commandBus(bookCheckoutBookingForCheckoutItem({
|
|
9
9
|
aggregateId: checkoutBookingId || uuid(),
|
|
10
10
|
checkoutId,
|
|
11
11
|
checkoutItemId,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import invariant from "tiny-invariant";
|
|
2
2
|
import { viewCheckoutItemById, } from "../../../../projection/checkoutItem/viewCheckoutItemById";
|
|
3
3
|
import { httpCheckoutItemsKeep } from "./httpCheckoutItemsKeep";
|
|
4
|
+
import { httpCheckoutItemsReplace } from "./httpCheckoutItemsReplace";
|
|
4
5
|
import { httpCheckoutItemsReturn } from "./httpCheckoutItemsReturn";
|
|
5
6
|
const toDomain = (checkoutItem) => {
|
|
6
7
|
invariant(checkoutItem, "No checkoutItem found!");
|
|
@@ -9,6 +10,7 @@ const toDomain = (checkoutItem) => {
|
|
|
9
10
|
status: checkoutItem.status,
|
|
10
11
|
price: checkoutItem.price,
|
|
11
12
|
feedbacks: checkoutItem.feedback,
|
|
13
|
+
replacedFor: checkoutItem.replacedFor,
|
|
12
14
|
aggregateId: checkoutItem.id,
|
|
13
15
|
domainEvents: [],
|
|
14
16
|
};
|
|
@@ -18,6 +20,7 @@ const saveCheckoutItem = ({ httpPost }) => async (aggregateRoot) => {
|
|
|
18
20
|
await Promise.all([
|
|
19
21
|
httpCheckoutItemsKeep({ httpPost })(aggregateRoot),
|
|
20
22
|
httpCheckoutItemsReturn({ httpPost })(aggregateRoot),
|
|
23
|
+
httpCheckoutItemsReplace({ httpPost })(aggregateRoot),
|
|
21
24
|
]);
|
|
22
25
|
};
|
|
23
26
|
export { getCheckoutItem, saveCheckoutItem };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { HttpCheckoutItemsSaveFunction } from "./httpCheckoutItems";
|
|
2
|
+
interface HttpCheckoutItemsReplaceFunction extends HttpCheckoutItemsSaveFunction {
|
|
3
|
+
}
|
|
4
|
+
declare const httpCheckoutItemsReplace: HttpCheckoutItemsReplaceFunction;
|
|
5
|
+
export { httpCheckoutItemsReplace };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { CHECKOUT_ITEM_REPLACED, } from "../../../../domain/checkoutItem/model/checkoutItemReplaced";
|
|
2
|
+
const isCheckoutItemReplaced = (event) => event.name === CHECKOUT_ITEM_REPLACED;
|
|
3
|
+
const httpCheckoutItemsReplace = ({ httpPost }) => async ({ aggregateId, replacedFor, domainEvents }) => {
|
|
4
|
+
const checkoutItemReplaced = domainEvents.find(isCheckoutItemReplaced);
|
|
5
|
+
if (!checkoutItemReplaced) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
await httpPost({
|
|
9
|
+
endpoint: "/replace-checkout-item",
|
|
10
|
+
body: { checkoutItemId: aggregateId, replacedFor },
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
export { httpCheckoutItemsReplace };
|
|
@@ -4,7 +4,7 @@ import { keepCheckoutItem } from "../../../../domain/checkoutItem/command/keepCh
|
|
|
4
4
|
import { MESSAGING_CONTEXT_ID } from "../../../delivery/baseBootstrap";
|
|
5
5
|
const useKeepCheckoutItem = ({ checkoutItemId }) => {
|
|
6
6
|
const [commandBus, status] = useCommand({ contextId: MESSAGING_CONTEXT_ID });
|
|
7
|
-
const keep = useCallback(
|
|
7
|
+
const keep = useCallback(() => commandBus(keepCheckoutItem({
|
|
8
8
|
aggregateId: checkoutItemId,
|
|
9
9
|
})), [checkoutItemId, commandBus]);
|
|
10
10
|
return [keep, status];
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { CommandStatus } from "@lookiero/messaging-react";
|
|
2
|
+
interface ReplaceCheckoutItemFunctionArgs {
|
|
3
|
+
readonly replacedFor: string;
|
|
4
|
+
}
|
|
5
|
+
interface ReplaceCheckoutItemFunction {
|
|
6
|
+
(args: ReplaceCheckoutItemFunctionArgs): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
interface UseReplaceCheckoutItemFunctionArgs {
|
|
9
|
+
readonly checkoutItemId: string;
|
|
10
|
+
}
|
|
11
|
+
declare type UseReplaceCheckoutItemResult = [replace: ReplaceCheckoutItemFunction, status: CommandStatus];
|
|
12
|
+
interface UseReplaceCheckoutItemFunction {
|
|
13
|
+
(args: UseReplaceCheckoutItemFunctionArgs): UseReplaceCheckoutItemResult;
|
|
14
|
+
}
|
|
15
|
+
declare const useReplaceCheckoutItem: UseReplaceCheckoutItemFunction;
|
|
16
|
+
export { useReplaceCheckoutItem };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { useCommand } from "@lookiero/messaging-react";
|
|
2
|
+
import { useCallback } from "react";
|
|
3
|
+
import { replaceCheckoutItem } from "../../../../domain/checkoutItem/command/replaceCheckoutItem";
|
|
4
|
+
import { MESSAGING_CONTEXT_ID } from "../../../delivery/baseBootstrap";
|
|
5
|
+
const useReplaceCheckoutItem = ({ checkoutItemId }) => {
|
|
6
|
+
const [commandBus, status] = useCommand({ contextId: MESSAGING_CONTEXT_ID });
|
|
7
|
+
const replace = useCallback(({ replacedFor }) => commandBus(replaceCheckoutItem({
|
|
8
|
+
aggregateId: checkoutItemId,
|
|
9
|
+
replacedFor,
|
|
10
|
+
})), [checkoutItemId, commandBus]);
|
|
11
|
+
return [replace, status];
|
|
12
|
+
};
|
|
13
|
+
export { useReplaceCheckoutItem };
|
|
@@ -4,7 +4,7 @@ import { returnCheckoutItem as returnCheckoutItemCommand } from "../../../../dom
|
|
|
4
4
|
import { MESSAGING_CONTEXT_ID } from "../../../delivery/baseBootstrap";
|
|
5
5
|
const useReturnCheckoutItem = ({ checkoutItemId }) => {
|
|
6
6
|
const [commandBus, status] = useCommand({ contextId: MESSAGING_CONTEXT_ID });
|
|
7
|
-
const returnCheckoutItem = useCallback(
|
|
7
|
+
const returnCheckoutItem = useCallback(({ feedbacks }) => commandBus(returnCheckoutItemCommand({
|
|
8
8
|
aggregateId: checkoutItemId,
|
|
9
9
|
feedbacks,
|
|
10
10
|
})), [checkoutItemId, commandBus]);
|
|
@@ -5,7 +5,7 @@ import { updateUiSetting } from "../../../../domain/uiSetting/command/updateUiSe
|
|
|
5
5
|
import { MESSAGING_CONTEXT_ID } from "../../../delivery/baseBootstrap";
|
|
6
6
|
const useUpdateUiSetting = () => {
|
|
7
7
|
const [commandBus, status] = useCommand({ contextId: MESSAGING_CONTEXT_ID });
|
|
8
|
-
const update = useCallback(
|
|
8
|
+
const update = useCallback(({ key, value }) => commandBus(updateUiSetting({
|
|
9
9
|
aggregateId: uuid(),
|
|
10
10
|
key,
|
|
11
11
|
value,
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { FC } from "react";
|
|
2
2
|
import { StyleProp, TextStyle, TouchableHighlightProps, ViewStyle } from "react-native";
|
|
3
|
+
import { InputFieldStyle } from "../inputField/InputField";
|
|
3
4
|
interface SelectFieldStyle {
|
|
4
5
|
readonly selectField: StyleProp<ViewStyle>;
|
|
5
6
|
readonly modalContent: StyleProp<ViewStyle>;
|
|
6
7
|
readonly option: StyleProp<ViewStyle>;
|
|
7
8
|
readonly optionText: StyleProp<TextStyle>;
|
|
9
|
+
readonly inputField: Partial<InputFieldStyle>;
|
|
8
10
|
}
|
|
9
11
|
interface Option {
|
|
10
12
|
readonly label: string;
|
|
@@ -18,7 +18,7 @@ const SelectField = ({ placeholder, value, options, style: customStyle, onChange
|
|
|
18
18
|
return (React.createElement(React.Fragment, null,
|
|
19
19
|
React.createElement(TouchableHighlight, { style: customStyle?.selectField, underlayColor: colorGrayscaleS, onPress: handleOnPressSelectField, ...touchableRestProps },
|
|
20
20
|
React.createElement(View, { pointerEvents: "none" },
|
|
21
|
-
React.createElement(InputField, { editable: false, icon: "arrow-down", label: placeholder, value: selectedValue?.label }))),
|
|
21
|
+
React.createElement(InputField, { editable: false, icon: "arrow-down", label: placeholder, style: customStyle?.inputField, value: selectedValue?.label }))),
|
|
22
22
|
React.createElement(Modal, { visible: modalVisible, scroll: true, onClose: handleOnModalClose },
|
|
23
23
|
React.createElement(View, { style: [style.modalContent, customStyle?.modalContent] }, options.map(({ label, value }) => (React.createElement(TouchableHighlight, { key: value, style: [style.option, customStyle?.option], underlayColor: colorGrayscaleS, onPress: () => handleOnPressOption(value) },
|
|
24
24
|
React.createElement(Text, { level: 3, style: [style.optionText, customStyle?.optionText] }, label))))))));
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { QueryStatus } from "@lookiero/messaging-react";
|
|
1
|
+
import { CommandStatus, QueryStatus } from "@lookiero/messaging-react";
|
|
2
2
|
import React, { useCallback, useEffect, useState } from "react";
|
|
3
3
|
import { View } from "react-native";
|
|
4
4
|
import { useParams } from "react-router-native";
|
|
@@ -6,6 +6,7 @@ import { CheckoutItemStatus } from "../../../../domain/checkoutItem/model/checko
|
|
|
6
6
|
import "../../../../projection/checkout/viewFirstAvailableCheckoutByCustomerId";
|
|
7
7
|
import { useBookCheckouBookingForCheckoutItem } from "../../../domain/checkoutBooking/react/useBookCheckouBookingForCheckoutItem";
|
|
8
8
|
import { useKeepCheckoutItem } from "../../../domain/checkoutItem/react/useKeepCheckoutItem";
|
|
9
|
+
import { useReturnCheckoutItem } from "../../../domain/checkoutItem/react/useReturnCheckoutItem";
|
|
9
10
|
import { useViewBookedSizeChangeProductsVariantsForCheckoutItem } from "../../../projection/bookedSizeChangeProductsVariants/react/useViewBookedSizeChangeProductsVariantsForCheckoutItem";
|
|
10
11
|
import { useViewFirstAvailableCheckoutByCustomerId } from "../../../projection/checkout/react/useViewFirstAvailableCheckoutByCustomerId";
|
|
11
12
|
import { useListReturnQuestionsByCheckoutItemId } from "../../../projection/returnQuestion/react/useListReturnQuestionsByCheckoutItemId";
|
|
@@ -19,11 +20,20 @@ import { ProductVariantDescription } from "./components/productVariantDescriptio
|
|
|
19
20
|
import { ProductVariantSlider } from "./components/productVariantSlider/ProductVariantSlider";
|
|
20
21
|
import { ReturnQuestionsFeedback } from "./components/returnQuestionsFeedback/ReturnQuestionsFeedback";
|
|
21
22
|
import { ReturnQuestionsForm } from "./components/returnQuestionsForm/ReturnQuestionsForm";
|
|
23
|
+
import { SizeChangeModal } from "./components/sizeChangeModal/SizeChangeModal";
|
|
24
|
+
import { SizeWithoutStockModal } from "./components/sizeWithoutStockModal/SizeWithoutStockModal";
|
|
22
25
|
const Item = ({ customerId }) => {
|
|
23
26
|
const { id } = useParams();
|
|
24
27
|
const [checkout, checkoutStatus] = useViewFirstAvailableCheckoutByCustomerId({ customerId });
|
|
25
28
|
const checkoutItem = checkout?.items.find((checkoutItem) => checkoutItem.id === id);
|
|
26
29
|
const [customerDecissionMade, setCustomerDecissionMade] = useState(() => checkoutItem.status === CheckoutItemStatus.INITIAL || checkoutItem.status === CheckoutItemStatus.EXPIRED);
|
|
30
|
+
const handleOnBannerPress = useCallback(() => setCustomerDecissionMade(!customerDecissionMade), [customerDecissionMade]);
|
|
31
|
+
const [sizeWithoutStockModalVisible, setSizeWithoutStockModalVisible] = useState(false);
|
|
32
|
+
const handleOnShowSizeWithoutStockModal = useCallback(() => setSizeWithoutStockModalVisible(true), []);
|
|
33
|
+
const handleOnHideSizeWithoutStockModal = useCallback(() => setSizeWithoutStockModalVisible(false), []);
|
|
34
|
+
const [sizeChangeModalVisible, setSizeChangeModalVisible] = useState(false);
|
|
35
|
+
const handleOnShowSizeChangeModal = useCallback(() => setSizeChangeModalVisible(true), []);
|
|
36
|
+
const handleOnHideSizeChangeModal = useCallback(() => setSizeChangeModalVisible(false), []);
|
|
27
37
|
const [bookedSizeChangeProductsVariants, bookedSizeChangeProductsVariantsStatus] = useViewBookedSizeChangeProductsVariantsForCheckoutItem({
|
|
28
38
|
checkoutItemId: checkoutItem.id,
|
|
29
39
|
});
|
|
@@ -35,20 +45,25 @@ const Item = ({ customerId }) => {
|
|
|
35
45
|
const [returnQuestions, returnQuestionsStatus] = useListReturnQuestionsByCheckoutItemId({
|
|
36
46
|
checkoutItemId: checkoutItem.id,
|
|
37
47
|
});
|
|
38
|
-
const [keepCheckoutItem] = useKeepCheckoutItem({ checkoutItemId: checkoutItem.id });
|
|
48
|
+
const [keepCheckoutItem, keepCheckoutItemStatus] = useKeepCheckoutItem({ checkoutItemId: checkoutItem.id });
|
|
49
|
+
const [returnCheckoutItem, returnCheckoutItemStatus] = useReturnCheckoutItem({
|
|
50
|
+
checkoutItemId: checkoutItem.id,
|
|
51
|
+
});
|
|
52
|
+
const [stickyHeight, setStickyHeight] = useState(0);
|
|
53
|
+
const handleOnStickyLayout = useCallback(({ height }) => setStickyHeight(height), []);
|
|
39
54
|
useEffect(() => {
|
|
40
55
|
checkout?.bookingId === undefined && bookCheckouBooking();
|
|
41
56
|
}, [bookCheckouBooking, checkout?.bookingId]);
|
|
42
|
-
const [stickyHeight, setStickyHeight] = useState(0);
|
|
43
|
-
const handleOnStickyLayout = useCallback(({ height }) => setStickyHeight(height), []);
|
|
44
57
|
const [returnQuestionsVisible, setReturnQuestionsVisible] = useState(false);
|
|
45
58
|
const handleOnShowReturnQuestions = useCallback(() => setReturnQuestionsVisible(true), []);
|
|
46
59
|
const handleOnHideReturnQuestions = useCallback(() => setReturnQuestionsVisible(false), []);
|
|
47
60
|
const handleOnEditFeedback = useCallback(() => handleOnShowReturnQuestions(), [handleOnShowReturnQuestions]);
|
|
48
|
-
const handleOnSubmit = useCallback(() =>
|
|
49
|
-
|
|
61
|
+
const handleOnSubmit = useCallback((feedback) => {
|
|
62
|
+
handleOnHideReturnQuestions();
|
|
63
|
+
returnCheckoutItem({ feedbacks: feedback });
|
|
64
|
+
}, [handleOnHideReturnQuestions, returnCheckoutItem]);
|
|
65
|
+
const handleOnReplace = useCallback(() => handleOnShowSizeChangeModal(), [handleOnShowSizeChangeModal]);
|
|
50
66
|
const handleOnReturn = useCallback(() => handleOnShowReturnQuestions(), [handleOnShowReturnQuestions]);
|
|
51
|
-
const handleOnBannerPress = useCallback(() => setCustomerDecissionMade(!customerDecissionMade), [customerDecissionMade]);
|
|
52
67
|
const dependenciesLoadedStatuses = [QueryStatus.ERROR, QueryStatus.SUCCESS];
|
|
53
68
|
const dependenciesLoaded = dependenciesLoadedStatuses.includes(returnQuestionsStatus) &&
|
|
54
69
|
dependenciesLoadedStatuses.includes(checkoutStatus) &&
|
|
@@ -61,6 +76,8 @@ const Item = ({ customerId }) => {
|
|
|
61
76
|
.map((productVariant) => productVariant.size)
|
|
62
77
|
.concat(checkoutItem.productVariant.size) || [];
|
|
63
78
|
return (React.createElement(React.Fragment, null,
|
|
79
|
+
React.createElement(SizeWithoutStockModal, { visible: sizeWithoutStockModalVisible, onDismiss: handleOnHideSizeWithoutStockModal }),
|
|
80
|
+
React.createElement(SizeChangeModal, { visible: sizeChangeModalVisible, onDismiss: handleOnHideSizeChangeModal }),
|
|
64
81
|
React.createElement(SafeAreaScrollView, null,
|
|
65
82
|
React.createElement(Body, null,
|
|
66
83
|
!customerDecissionMade && (React.createElement(CustomerDecissionBanner, { checkoutItemStatus: checkoutItem.status, onPress: handleOnBannerPress })),
|
|
@@ -70,7 +87,7 @@ const Item = ({ customerId }) => {
|
|
|
70
87
|
React.createElement(ProductVariantDescription, { brand: brand, color: color, name: name, price: price, size: size }),
|
|
71
88
|
checkoutItem.feedback && (React.createElement(View, { style: style.feedbackContainer },
|
|
72
89
|
React.createElement(ReturnQuestionsFeedback, { feedback: checkoutItem.feedback || {}, returnQuestions: returnQuestions || [], onEditFeedback: handleOnEditFeedback })))))),
|
|
73
|
-
customerDecissionMade && (React.createElement(ItemActions, { size: checkoutItem.productVariant.size, sizes: sizes, onKeep: keepCheckoutItem, onLayout: handleOnStickyLayout, onReplace: handleOnReplace, onReturn: handleOnReturn })),
|
|
90
|
+
customerDecissionMade && (React.createElement(ItemActions, { keepButtonLoading: keepCheckoutItemStatus === CommandStatus.LOADING, returnButtonLoading: returnCheckoutItemStatus === CommandStatus.LOADING, size: checkoutItem.productVariant.size, sizes: sizes, onKeep: keepCheckoutItem, onLayout: handleOnStickyLayout, onReplace: handleOnReplace, onReturn: handleOnReturn, onSizeSelectorPress: handleOnShowSizeWithoutStockModal })),
|
|
74
91
|
React.createElement(ReturnQuestionsForm, { checkoutItemPrice: checkoutItem.price, feedback: checkoutItem.feedback || {}, productVariant: checkoutItem.productVariant, returnQuestions: returnQuestions || [], visible: returnQuestionsVisible, onClose: handleOnHideReturnQuestions, onSubmit: handleOnSubmit })));
|
|
75
92
|
};
|
|
76
93
|
export { Item };
|
|
@@ -4,6 +4,9 @@ import { Layout } from "../../../../shared/components/layouts/sticky/Sticky";
|
|
|
4
4
|
interface ItemActionsProps {
|
|
5
5
|
readonly sizes: SizeProjection[];
|
|
6
6
|
readonly size: SizeProjection;
|
|
7
|
+
readonly keepButtonLoading?: boolean;
|
|
8
|
+
readonly returnButtonLoading?: boolean;
|
|
9
|
+
readonly onSizeSelectorPress?: () => void;
|
|
7
10
|
readonly onKeep: (value: string) => void;
|
|
8
11
|
readonly onReturn: () => void;
|
|
9
12
|
readonly onReplace: () => void;
|
|
@@ -1,25 +1,31 @@
|
|
|
1
1
|
import { Button } from "@lookiero/aurora-next/build/components/atoms/Button/Button";
|
|
2
2
|
import { BUTTON_VARIANT } from "@lookiero/aurora-next/build/components/atoms/Button/Button.definition";
|
|
3
3
|
import { useI18nMessage } from "@lookiero/i18n-react";
|
|
4
|
-
import React, { useMemo } from "react";
|
|
4
|
+
import React, { useCallback, useMemo } from "react";
|
|
5
5
|
import { View } from "react-native";
|
|
6
6
|
import { Body } from "../../../../components/layouts/body/Body";
|
|
7
7
|
import { I18nMessages } from "../../../../i18n/i18n";
|
|
8
8
|
import { Sticky } from "../../../../shared/components/layouts/sticky/Sticky";
|
|
9
9
|
import { SelectField } from "../../../../shared/components/molecules/selectField/SelectField";
|
|
10
10
|
import { style } from "./ItemActions.style";
|
|
11
|
-
const ItemActions = ({ sizes, size, onKeep, onReplace, onReturn, onLayout }) => {
|
|
11
|
+
const ItemActions = ({ sizes, size, keepButtonLoading = false, returnButtonLoading = false, onSizeSelectorPress = () => void 0, onKeep, onReplace, onReturn, onLayout, }) => {
|
|
12
12
|
const sizeSelectorLabelText = useI18nMessage({ id: I18nMessages.ITEM_SIZES_LABEL });
|
|
13
13
|
const keepButtonText = useI18nMessage({ id: I18nMessages.ITEM_KEEP_BUTTON });
|
|
14
14
|
const returnButtonText = useI18nMessage({ id: I18nMessages.ITEM_RETURN_BUTTON });
|
|
15
15
|
const sizeSelectorOptions = useMemo(() => sizes.map((size) => ({ label: size.lookiero, value: size.id })), [sizes]);
|
|
16
16
|
const disabledSizeSelector = useMemo(() => sizeSelectorOptions.length === 1 && sizeSelectorOptions[0]?.value === size.id, [sizeSelectorOptions, size.id]);
|
|
17
|
+
const handleOnPressSizeSelector = useCallback(() => onSizeSelectorPress(), [onSizeSelectorPress]);
|
|
17
18
|
return (React.createElement(Sticky, { onLayout: onLayout },
|
|
18
19
|
React.createElement(Body, { style: { column: style.container } },
|
|
19
|
-
React.createElement(Button, { onPress: onKeep }, keepButtonText),
|
|
20
|
+
React.createElement(Button, { busy: keepButtonLoading, onPress: onKeep }, keepButtonText),
|
|
20
21
|
React.createElement(View, { style: style.row },
|
|
21
|
-
!size.unique && (React.createElement(SelectField, {
|
|
22
|
+
!size.unique && (React.createElement(SelectField, { ...(disabledSizeSelector && {
|
|
23
|
+
onPress: handleOnPressSizeSelector,
|
|
24
|
+
}), options: sizeSelectorOptions, placeholder: sizeSelectorLabelText || "", testID: "size-selector", value: size.id, style: {
|
|
25
|
+
selectField: style.sizeSelector,
|
|
26
|
+
inputField: { input: disabledSizeSelector && style.inputDisabled },
|
|
27
|
+
}, onChange: onReplace })),
|
|
22
28
|
React.createElement(View, { style: style.returnButtonContainer },
|
|
23
|
-
React.createElement(Button, { variant: BUTTON_VARIANT.SECONDARY, onPress: onReturn }, returnButtonText))))));
|
|
29
|
+
React.createElement(Button, { busy: returnButtonLoading, variant: BUTTON_VARIANT.SECONDARY, onPress: onReturn }, returnButtonText))))));
|
|
24
30
|
};
|
|
25
31
|
export { ItemActions };
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { StyleSheet } from "react-native";
|
|
2
2
|
import { theme } from "../../../../theme/theme";
|
|
3
|
-
const { spaceL, spaceXL } = theme();
|
|
3
|
+
const { colorGrayscaleL, spaceL, spaceXL } = theme();
|
|
4
4
|
const style = StyleSheet.create({
|
|
5
5
|
container: {
|
|
6
6
|
paddingHorizontal: spaceXL,
|
|
7
7
|
},
|
|
8
|
+
inputDisabled: {
|
|
9
|
+
color: colorGrayscaleL,
|
|
10
|
+
},
|
|
8
11
|
returnButtonContainer: {
|
|
9
12
|
flex: 1,
|
|
10
13
|
},
|
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
import { Text } from "@lookiero/aurora-next/build/components/primitives/Text/Text";
|
|
2
2
|
import { useI18nMessage } from "@lookiero/i18n-react";
|
|
3
|
-
import React
|
|
3
|
+
import React from "react";
|
|
4
4
|
import { StyleSheet, View } from "react-native";
|
|
5
5
|
import { SafeAreaScrollView } from "../../components/templates/SafeAreaScrollView";
|
|
6
|
-
import { SizeWithoutStockModal } from "../item/components/sizeWithoutStockModal/SizeWithoutStockModal";
|
|
7
6
|
const Summary = () => {
|
|
8
7
|
const summaryText = useI18nMessage({ id: "summary" });
|
|
9
|
-
const [modalVisible, setModalVisible] = useState(true);
|
|
10
8
|
return (React.createElement(SafeAreaScrollView, null,
|
|
11
9
|
React.createElement(View, { style: styles.container },
|
|
12
|
-
React.createElement(Text, { heading: true, level: 3 }, summaryText)
|
|
13
|
-
React.createElement(SizeWithoutStockModal, { visible: modalVisible, onDismiss: () => setModalVisible(false) }))));
|
|
10
|
+
React.createElement(Text, { heading: true, level: 3 }, summaryText))));
|
|
14
11
|
};
|
|
15
12
|
const styles = StyleSheet.create({
|
|
16
13
|
container: {
|