@lookiero/checkout 0.3.19 → 0.3.20
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/package.json +1 -1
- package/dist/src/infrastructure/delivery/baseBootstrap.d.ts +9 -2
- package/dist/src/infrastructure/delivery/baseBootstrap.js +4 -1
- package/dist/src/infrastructure/delivery/bootstrap.js +4 -0
- package/dist/src/infrastructure/delivery/mock/checkoutFeedbackDataSource.d.ts +14 -0
- package/dist/src/infrastructure/delivery/mock/checkoutFeedbackDataSource.js +12 -0
- package/dist/src/infrastructure/delivery/mock/dataSourceCheckoutFeedbacks.d.ts +14 -0
- package/dist/src/infrastructure/delivery/mock/dataSourceCheckoutFeedbacks.js +19 -0
- package/dist/src/infrastructure/projection/checkout/react/useViewFirstAvailableCheckoutByCustomerId.js +9 -1
- package/dist/src/infrastructure/ui/components/organisms/checkoutQuestions/behaviors/useCheckoutQuestionFeedback.d.ts +29 -0
- package/dist/src/infrastructure/ui/components/organisms/checkoutQuestions/behaviors/useCheckoutQuestionFeedback.js +28 -0
- package/dist/src/infrastructure/ui/components/organisms/checkoutQuestions/components/buttonCheckoutQuestionItem/ButtonCheckoutQuestionItem.js +7 -3
- package/dist/src/infrastructure/ui/components/organisms/checkoutQuestions/components/iconCheckoutQuestionItem/IconCheckoutQuestionItem.js +7 -3
- package/dist/src/infrastructure/ui/components/organisms/checkoutQuestions/components/textareaCheckoutQuestionItem/TextareaCheckoutQuestionItem.js +6 -5
- package/dist/src/infrastructure/ui/views/feedback/Feedback.js +11 -16
- package/dist/src/infrastructure/ui/views/feedback/Feedback.style.d.ts +0 -3
- package/dist/src/infrastructure/ui/views/feedback/Feedback.style.js +0 -3
- package/dist/src/infrastructure/ui/views/feedback/components/checkoutQuestionsForm/CheckoutQuestionsForm.d.ts +3 -0
- package/dist/src/infrastructure/ui/views/feedback/components/checkoutQuestionsForm/CheckoutQuestionsForm.js +18 -3
- package/dist/src/infrastructure/ui/views/feedback/components/checkoutQuestionsForm/CheckoutQuestionsForm.style.d.ts +6 -0
- package/dist/src/infrastructure/ui/views/feedback/components/checkoutQuestionsForm/CheckoutQuestionsForm.style.js +7 -0
- package/package.json +1 -1
package/dist/package.json
CHANGED
|
@@ -4,6 +4,8 @@ import { Checkout } from "../../domain/checkout/model/checkout";
|
|
|
4
4
|
import { CheckoutsGetFunction, CheckoutsSaveFunction } from "../../domain/checkout/model/checkouts";
|
|
5
5
|
import { CheckoutBooking } from "../../domain/checkoutBooking/model/checkoutBooking";
|
|
6
6
|
import { CheckoutBookingsGetFunction, CheckoutBookingsSaveFunction } from "../../domain/checkoutBooking/model/checkoutBookings";
|
|
7
|
+
import { CheckoutFeedback } from "../../domain/checkoutFeedback/model/checkoutFeedback";
|
|
8
|
+
import { CheckoutFeedbacksGetFunction, CheckoutFeedbacksSaveFunction } from "../../domain/checkoutFeedback/model/checkoutFeedbacks";
|
|
7
9
|
import { CheckoutItem } from "../../domain/checkoutItem/model/checkoutItem";
|
|
8
10
|
import { CheckoutItemsGetFunction, CheckoutItemsSaveFunction } from "../../domain/checkoutItem/model/checkoutItems";
|
|
9
11
|
import { UiSetting } from "../../domain/uiSetting/model/uiSetting";
|
|
@@ -22,7 +24,7 @@ import { UiSettingByKeyView } from "../../projection/uiSetting/viewUiSettingByKe
|
|
|
22
24
|
declare const MESSAGING_CONTEXT_ID = "Checkout";
|
|
23
25
|
type NeverWhenEmptyRecord<K extends [Record<string, unknown>]> = K extends [Record<string, never>] ? [never?] : K;
|
|
24
26
|
type RepositoryDependencies<A extends AggregateRoot, GetFunctionArgs extends RepositoryGetFunctionArgs, SaveFunctionArgs extends RepositorySaveFunctionArgs> = Omit<Parameters<RepositoryGetFunction<A, GetFunctionArgs>>[0] & Parameters<RepositorySaveFunction<A, SaveFunctionArgs>>[0], keyof RepositoryGetFunctionArgs>;
|
|
25
|
-
interface BaseBootstrapFunctionArgs<UiSettingGetFunctionArgs extends RepositoryGetFunctionArgs, UiSettingSaveFunctionArgs extends RepositorySaveFunctionArgs, CheckoutGetFunctionArgs extends RepositoryGetFunctionArgs, CheckoutSaveFunctionArgs extends RepositorySaveFunctionArgs, CheckoutItemGetFunctionArgs extends RepositoryGetFunctionArgs, CheckoutItemSaveFunctionArgs extends RepositorySaveFunctionArgs, CheckoutBookingGetFunctionArgs extends RepositoryGetFunctionArgs, CheckoutBookingSaveFunctionArgs extends RepositorySaveFunctionArgs> {
|
|
27
|
+
interface BaseBootstrapFunctionArgs<UiSettingGetFunctionArgs extends RepositoryGetFunctionArgs, UiSettingSaveFunctionArgs extends RepositorySaveFunctionArgs, CheckoutGetFunctionArgs extends RepositoryGetFunctionArgs, CheckoutSaveFunctionArgs extends RepositorySaveFunctionArgs, CheckoutItemGetFunctionArgs extends RepositoryGetFunctionArgs, CheckoutItemSaveFunctionArgs extends RepositorySaveFunctionArgs, CheckoutBookingGetFunctionArgs extends RepositoryGetFunctionArgs, CheckoutBookingSaveFunctionArgs extends RepositorySaveFunctionArgs, CheckoutFeedbackGetFunctionArgs extends RepositoryGetFunctionArgs, CheckoutFeedbackSaveFunctionArgs extends RepositorySaveFunctionArgs> {
|
|
26
28
|
readonly checkoutByIdView: CheckoutByIdView;
|
|
27
29
|
readonly firstAvailableCheckoutByCustomerIdView: FirstAvailableCheckoutByCustomerIdView;
|
|
28
30
|
readonly isCheckoutEnabledByCustomerIdView: IsCheckoutEnabledByCustomerIdView;
|
|
@@ -54,9 +56,14 @@ interface BaseBootstrapFunctionArgs<UiSettingGetFunctionArgs extends RepositoryG
|
|
|
54
56
|
readonly checkoutBookingsDependencies: NeverWhenEmptyRecord<[
|
|
55
57
|
RepositoryDependencies<CheckoutBooking, CheckoutBookingGetFunctionArgs, CheckoutBookingSaveFunctionArgs>
|
|
56
58
|
]>;
|
|
59
|
+
readonly getCheckoutFeedback: CheckoutFeedbacksGetFunction<CheckoutFeedbackGetFunctionArgs>;
|
|
60
|
+
readonly saveCheckoutFeedback: CheckoutFeedbacksSaveFunction<CheckoutFeedbackSaveFunctionArgs>;
|
|
61
|
+
readonly checkoutFeedbacksDependencies: NeverWhenEmptyRecord<[
|
|
62
|
+
RepositoryDependencies<CheckoutFeedback, CheckoutFeedbackGetFunctionArgs, CheckoutFeedbackSaveFunctionArgs>
|
|
63
|
+
]>;
|
|
57
64
|
}
|
|
58
65
|
interface BaseBootstrapFunction {
|
|
59
|
-
<UiSettingGetArgs extends RepositoryGetFunctionArgs, UiSettingSaveArgs extends RepositorySaveFunctionArgs, CheckoutGetFunctionArgs extends RepositoryGetFunctionArgs, CheckoutSaveFunctionArgs extends RepositorySaveFunctionArgs, CheckoutItemGetFunctionArgs extends RepositoryGetFunctionArgs, CheckoutItemSaveFunctionArgs extends RepositorySaveFunctionArgs, CheckoutBookingGetFunctionArgs extends RepositoryGetFunctionArgs, CheckoutBookingSaveFunctionArgs extends RepositorySaveFunctionArgs>(args: BaseBootstrapFunctionArgs<UiSettingGetArgs, UiSettingSaveArgs, CheckoutGetFunctionArgs, CheckoutSaveFunctionArgs, CheckoutItemGetFunctionArgs, CheckoutItemSaveFunctionArgs, CheckoutBookingGetFunctionArgs, CheckoutBookingSaveFunctionArgs>): BuildBootstrapFunctionReturn;
|
|
66
|
+
<UiSettingGetArgs extends RepositoryGetFunctionArgs, UiSettingSaveArgs extends RepositorySaveFunctionArgs, CheckoutGetFunctionArgs extends RepositoryGetFunctionArgs, CheckoutSaveFunctionArgs extends RepositorySaveFunctionArgs, CheckoutItemGetFunctionArgs extends RepositoryGetFunctionArgs, CheckoutItemSaveFunctionArgs extends RepositorySaveFunctionArgs, CheckoutBookingGetFunctionArgs extends RepositoryGetFunctionArgs, CheckoutBookingSaveFunctionArgs extends RepositorySaveFunctionArgs, CheckoutFeedbackGetFunctionArgs extends RepositoryGetFunctionArgs, CheckoutFeedbackSaveFunctionArgs extends RepositorySaveFunctionArgs>(args: BaseBootstrapFunctionArgs<UiSettingGetArgs, UiSettingSaveArgs, CheckoutGetFunctionArgs, CheckoutSaveFunctionArgs, CheckoutItemGetFunctionArgs, CheckoutItemSaveFunctionArgs, CheckoutBookingGetFunctionArgs, CheckoutBookingSaveFunctionArgs, CheckoutFeedbackGetFunctionArgs, CheckoutFeedbackSaveFunctionArgs>): BuildBootstrapFunctionReturn;
|
|
60
67
|
}
|
|
61
68
|
declare const baseBootstrap: BaseBootstrapFunction;
|
|
62
69
|
export { baseBootstrap, MESSAGING_CONTEXT_ID };
|
|
@@ -4,6 +4,8 @@ import { START_CHECKOUT } from "../../domain/checkout/command/startCheckout";
|
|
|
4
4
|
import { markCheckoutAsPaidHandler, startCheckoutHandler } from "../../domain/checkout/model/checkout";
|
|
5
5
|
import { BOOK_CHECKOUT_BOOKING_FOR_CHECKOUT_ITEM } from "../../domain/checkoutBooking/command/bookCheckoutBookingForCheckoutItem";
|
|
6
6
|
import { bookCheckoutBookingForCheckoutItemHandler, } from "../../domain/checkoutBooking/model/checkoutBooking";
|
|
7
|
+
import { GIVE_CHECKOUT_FEEDBACK } from "../../domain/checkoutFeedback/command/giveCheckoutFeedback";
|
|
8
|
+
import { giveCheckoutFeedbackHandler } from "../../domain/checkoutFeedback/model/checkoutFeedback";
|
|
7
9
|
import { KEEP_CHECKOUT_ITEM } from "../../domain/checkoutItem/command/keepCheckoutItem";
|
|
8
10
|
import { REPLACE_CHECKOUT_ITEM } from "../../domain/checkoutItem/command/replaceCheckoutItem";
|
|
9
11
|
import { RETURN_CHECKOUT_ITEM } from "../../domain/checkoutItem/command/returnCheckoutItem";
|
|
@@ -23,7 +25,7 @@ import { viewPricingByCheckoutIdHandler, VIEW_PRICING_BY_CHECKOUT_ID, } from "..
|
|
|
23
25
|
import { listReturnQuestionsByCheckoutItemIdHandler, LIST_RETURN_QUESTIONS_BY_CHECKOUT_ITEM_ID, } from "../../projection/returnQuestion/listReturnQuestionsByCheckoutItemId";
|
|
24
26
|
import { viewUiSettingByKeyHandler, VIEW_UI_SETTING_BY_KEY, } from "../../projection/uiSetting/viewUiSettingByKey";
|
|
25
27
|
const MESSAGING_CONTEXT_ID = "Checkout";
|
|
26
|
-
const baseBootstrap = ({ checkoutByIdView, firstAvailableCheckoutByCustomerIdView, isCheckoutEnabledByCustomerIdView, fiveItemsDiscountByCustomerIdView, uiSettingByKeyView, checkoutItemByIdView, returnQuestionsByCheckoutItemIdView, bookedSizeChangeProductsVariantsForCheckoutItemView, pricingByCheckoutIdView, paymentFlowPayloadByCheckoutIdView, checkoutQuestionsByCheckoutIdView, getUiSetting, saveUiSetting, uiSettingsDependencies, getCheckout, saveCheckout, checkoutsDependencies, getCheckoutItem, saveCheckoutItem, checkoutItemsDependencies, getCheckoutBooking, saveCheckoutBooking, checkoutBookingsDependencies, }) => messagingBootstrap({ id: MESSAGING_CONTEXT_ID })
|
|
28
|
+
const baseBootstrap = ({ checkoutByIdView, firstAvailableCheckoutByCustomerIdView, isCheckoutEnabledByCustomerIdView, fiveItemsDiscountByCustomerIdView, uiSettingByKeyView, checkoutItemByIdView, returnQuestionsByCheckoutItemIdView, bookedSizeChangeProductsVariantsForCheckoutItemView, pricingByCheckoutIdView, paymentFlowPayloadByCheckoutIdView, checkoutQuestionsByCheckoutIdView, getUiSetting, saveUiSetting, uiSettingsDependencies, getCheckout, saveCheckout, checkoutsDependencies, getCheckoutItem, saveCheckoutItem, checkoutItemsDependencies, getCheckoutBooking, saveCheckoutBooking, checkoutBookingsDependencies, getCheckoutFeedback, saveCheckoutFeedback, checkoutFeedbacksDependencies, }) => messagingBootstrap({ id: MESSAGING_CONTEXT_ID })
|
|
27
29
|
.query(VIEW_FIVE_ITEMS_DISCOUNT_BY_CUSTOMER_ID, viewFiveItemsDiscountByCustomerIdHandler, {
|
|
28
30
|
view: fiveItemsDiscountByCustomerIdView,
|
|
29
31
|
})
|
|
@@ -61,6 +63,7 @@ const baseBootstrap = ({ checkoutByIdView, firstAvailableCheckoutByCustomerIdVie
|
|
|
61
63
|
view: bookedSizeChangeProductsVariantsForCheckoutItemView,
|
|
62
64
|
})
|
|
63
65
|
.command(BOOK_CHECKOUT_BOOKING_FOR_CHECKOUT_ITEM, bookCheckoutBookingForCheckoutItemHandler)(getCheckoutBooking, saveCheckoutBooking, ...checkoutBookingsDependencies)
|
|
66
|
+
.command(GIVE_CHECKOUT_FEEDBACK, giveCheckoutFeedbackHandler)(getCheckoutFeedback, saveCheckoutFeedback, ...checkoutFeedbacksDependencies)
|
|
64
67
|
.query(VIEW_UI_SETTING_BY_KEY, viewUiSettingByKeyHandler, {
|
|
65
68
|
view: uiSettingByKeyView,
|
|
66
69
|
})
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getCheckout, saveCheckout } from "../domain/checkout/model/httpCheckouts";
|
|
2
2
|
import { getCheckoutBooking, saveCheckoutBooking } from "../domain/checkoutBooking/model/httpCheckoutBookings";
|
|
3
|
+
import { getCheckoutFeedback, saveCheckoutFeedback } from "../domain/checkoutFeedback/model/httpCheckoutFeedbacks";
|
|
3
4
|
import { getCheckoutItem, saveCheckoutItem } from "../domain/checkoutItem/model/httpCheckoutItems";
|
|
4
5
|
import { getUiSetting, saveUiSetting } from "../domain/uiSetting/model/storageUiSettings";
|
|
5
6
|
import { read, write } from "../persistence/asyncStorageStorage";
|
|
@@ -51,6 +52,9 @@ const bootstrap = ({ apiUrl, authToken }) => {
|
|
|
51
52
|
getCheckoutBooking,
|
|
52
53
|
saveCheckoutBooking,
|
|
53
54
|
checkoutBookingsDependencies: [{ httpPost }],
|
|
55
|
+
getCheckoutFeedback,
|
|
56
|
+
saveCheckoutFeedback,
|
|
57
|
+
checkoutFeedbacksDependencies: [{ httpPost }],
|
|
54
58
|
});
|
|
55
59
|
};
|
|
56
60
|
export { bootstrap };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { CheckoutFeedbackProjection } from "../../../projection/checkoutFeedback/checkoutFeedback";
|
|
2
|
+
interface CheckoutFeedbackDataSourceFunctionArgs {
|
|
3
|
+
readonly data: CheckoutFeedbackProjection;
|
|
4
|
+
}
|
|
5
|
+
interface CheckoutFeedbackDataSource {
|
|
6
|
+
readonly getCheckoutFeedback: (id: string) => CheckoutFeedbackProjection | undefined;
|
|
7
|
+
readonly saveCheckoutFeedback: (checkoutFeedback: CheckoutFeedbackProjection) => void;
|
|
8
|
+
}
|
|
9
|
+
interface CheckoutFeedbackDataSourceFunction {
|
|
10
|
+
(args: CheckoutFeedbackDataSourceFunctionArgs): CheckoutFeedbackDataSource;
|
|
11
|
+
}
|
|
12
|
+
declare const checkoutFeedbackDataSource: CheckoutFeedbackDataSourceFunction;
|
|
13
|
+
export type { CheckoutFeedbackDataSource };
|
|
14
|
+
export { checkoutFeedbackDataSource };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const checkoutFeedbackDataSource = ({ data: initialData }) => {
|
|
2
|
+
let data = initialData;
|
|
3
|
+
const getCheckoutFeedback = () => data;
|
|
4
|
+
const saveCheckoutFeedback = (checkoutFeedback) => {
|
|
5
|
+
data = checkoutFeedback;
|
|
6
|
+
};
|
|
7
|
+
return {
|
|
8
|
+
getCheckoutFeedback,
|
|
9
|
+
saveCheckoutFeedback,
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
export { checkoutFeedbackDataSource };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { RepositoryGetFunctionArgs, RepositorySaveFunctionArgs } from "@lookiero/messaging";
|
|
2
|
+
import { CheckoutFeedback } from "../../../domain/checkoutFeedback/model/checkoutFeedback";
|
|
3
|
+
import { CheckoutFeedbacksGetFunction, CheckoutFeedbacksSaveFunction } from "../../../domain/checkoutFeedback/model/checkoutFeedbacks";
|
|
4
|
+
import { CheckoutFeedbackProjection } from "../../../projection/checkoutFeedback/checkoutFeedback";
|
|
5
|
+
import { CheckoutFeedbackDataSource } from "./checkoutFeedbackDataSource";
|
|
6
|
+
declare const toCheckoutFeedbackProjection: (checkoutFeedback: CheckoutFeedback) => CheckoutFeedbackProjection;
|
|
7
|
+
declare const getCheckoutFeedback: CheckoutFeedbacksGetFunction<RepositoryGetFunctionArgs>;
|
|
8
|
+
interface DataSourceCheckoutItemsSaveFunctionArgs extends RepositorySaveFunctionArgs {
|
|
9
|
+
readonly dataSource: CheckoutFeedbackDataSource;
|
|
10
|
+
}
|
|
11
|
+
interface DataSourceCheckoutItemsSaveFunction extends CheckoutFeedbacksSaveFunction<DataSourceCheckoutItemsSaveFunctionArgs> {
|
|
12
|
+
}
|
|
13
|
+
declare const saveCheckoutFeedback: DataSourceCheckoutItemsSaveFunction;
|
|
14
|
+
export { getCheckoutFeedback, saveCheckoutFeedback, toCheckoutFeedbackProjection };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import invariant from "tiny-invariant";
|
|
2
|
+
import { viewCheckoutFeedbackById, } from "../../../projection/checkoutFeedback/viewCheckoutFeedbackById";
|
|
3
|
+
const toCheckoutFeedbackDomain = (checkoutFeedback) => {
|
|
4
|
+
invariant(checkoutFeedback, "No checkoutFeedback found!");
|
|
5
|
+
return {
|
|
6
|
+
aggregateId: checkoutFeedback.id,
|
|
7
|
+
feedbacks: checkoutFeedback.feedbacks,
|
|
8
|
+
domainEvents: [],
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
const toCheckoutFeedbackProjection = (checkoutFeedback) => ({
|
|
12
|
+
id: checkoutFeedback.aggregateId,
|
|
13
|
+
feedbacks: checkoutFeedback.feedbacks,
|
|
14
|
+
});
|
|
15
|
+
const getCheckoutFeedback = ({ queryBus }) => async (aggregateId) => toCheckoutFeedbackDomain(await queryBus(viewCheckoutFeedbackById({ checkoutFeedbackId: aggregateId })));
|
|
16
|
+
const saveCheckoutFeedback = ({ dataSource }) => async (aggregateRoot) => {
|
|
17
|
+
dataSource.saveCheckoutFeedback(toCheckoutFeedbackProjection(aggregateRoot));
|
|
18
|
+
};
|
|
19
|
+
export { getCheckoutFeedback, saveCheckoutFeedback, toCheckoutFeedbackProjection };
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { useQuery } from "@lookiero/messaging-react";
|
|
2
|
+
import { CHECKOUT_PAID } from "../../../../domain/checkout/model/checkoutPaid";
|
|
3
|
+
import { CHECKOUT_FEEDBACK_GIVEN, } from "../../../../domain/checkoutFeedback/model/checkoutFeedbackGiven";
|
|
2
4
|
import { CHECKOUT_ITEM_KEPT } from "../../../../domain/checkoutItem/model/checkoutItemKept";
|
|
3
5
|
import { CHECKOUT_ITEM_REPLACED, } from "../../../../domain/checkoutItem/model/checkoutItemReplaced";
|
|
4
6
|
import { CHECKOUT_ITEM_RETURNED, } from "../../../../domain/checkoutItem/model/checkoutItemReturned";
|
|
@@ -7,7 +9,13 @@ import { MESSAGING_CONTEXT_ID } from "../../../delivery/baseBootstrap";
|
|
|
7
9
|
const isCheckoutItemKept = (event) => event.name === CHECKOUT_ITEM_KEPT;
|
|
8
10
|
const isCheckoutItemReturned = (event) => event.name === CHECKOUT_ITEM_RETURNED;
|
|
9
11
|
const isCheckoutItemReplaced = (event) => event.name === CHECKOUT_ITEM_REPLACED;
|
|
10
|
-
const
|
|
12
|
+
const isCheckoutPaid = (event) => event.name === CHECKOUT_PAID;
|
|
13
|
+
const isCheckoutFeedbackGiven = (event) => event.name === CHECKOUT_FEEDBACK_GIVEN;
|
|
14
|
+
const shouldInvalidate = (event) => isCheckoutItemKept(event) ||
|
|
15
|
+
isCheckoutItemReplaced(event) ||
|
|
16
|
+
isCheckoutItemReturned(event) ||
|
|
17
|
+
isCheckoutPaid(event) ||
|
|
18
|
+
isCheckoutFeedbackGiven(event);
|
|
11
19
|
const useViewFirstAvailableCheckoutByCustomerId = ({ customerId }) => useQuery({
|
|
12
20
|
query: viewFirstAvailableCheckoutByCustomerId({ customerId }),
|
|
13
21
|
contextId: MESSAGING_CONTEXT_ID,
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { FC, ReactNode } from "react";
|
|
2
|
+
import { FeedbackProjection } from "../../../../../../projection/checkoutFeedback/feedback";
|
|
3
|
+
interface OnChangeCheckoutQuestionFeedbackFunctionArgs {
|
|
4
|
+
readonly checkoutQuestionId: string;
|
|
5
|
+
readonly checkoutQuestionFeedback: string | undefined;
|
|
6
|
+
}
|
|
7
|
+
interface OnChangeCheckoutQuestionFeedbackFunction {
|
|
8
|
+
(args: OnChangeCheckoutQuestionFeedbackFunctionArgs): void;
|
|
9
|
+
}
|
|
10
|
+
interface CheckoutQuestionFeedbackContextProviderProps {
|
|
11
|
+
readonly feedback: FeedbackProjection | undefined;
|
|
12
|
+
readonly children: ReactNode;
|
|
13
|
+
}
|
|
14
|
+
declare const CheckoutQuestionFeedbackProvider: FC<CheckoutQuestionFeedbackContextProviderProps>;
|
|
15
|
+
interface UseCheckoutQuestionFeedbackForIdFunctionArgs {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
}
|
|
18
|
+
interface UseCheckoutQuestionFeedbackForIdFunction {
|
|
19
|
+
(args: UseCheckoutQuestionFeedbackForIdFunctionArgs): {
|
|
20
|
+
readonly feedback: string | undefined;
|
|
21
|
+
readonly onChange: OnChangeCheckoutQuestionFeedbackFunction;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
declare const useCheckoutQuestionFeedbackForId: UseCheckoutQuestionFeedbackForIdFunction;
|
|
25
|
+
interface UseCheckoutQuestionFeedbackFunction {
|
|
26
|
+
(): FeedbackProjection;
|
|
27
|
+
}
|
|
28
|
+
declare const useCheckoutQuestionFeedback: UseCheckoutQuestionFeedbackFunction;
|
|
29
|
+
export { useCheckoutQuestionFeedbackForId, useCheckoutQuestionFeedback, CheckoutQuestionFeedbackProvider };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from "react";
|
|
2
|
+
import invariant from "tiny-invariant";
|
|
3
|
+
const CheckoutQuestionFeedbackContext = createContext(null);
|
|
4
|
+
const CheckoutQuestionFeedbackProvider = ({ feedback = {}, children, }) => {
|
|
5
|
+
const [contextFeedback, setContextFeedback] = useState(feedback);
|
|
6
|
+
const onChange = useCallback(({ checkoutQuestionId, checkoutQuestionFeedback }) => setContextFeedback((feedback) => checkoutQuestionFeedback
|
|
7
|
+
? { ...feedback, [checkoutQuestionId]: checkoutQuestionFeedback }
|
|
8
|
+
: Object.entries(feedback).reduce((acc, [id, feedback]) => (id !== checkoutQuestionId ? { ...acc, [id]: feedback } : acc), {})), []);
|
|
9
|
+
useEffect(() => setContextFeedback(feedback), [feedback]);
|
|
10
|
+
const value = useMemo(() => ({
|
|
11
|
+
feedback: contextFeedback,
|
|
12
|
+
onChange,
|
|
13
|
+
}), [contextFeedback, onChange]);
|
|
14
|
+
return React.createElement(CheckoutQuestionFeedbackContext.Provider, { value: value }, children);
|
|
15
|
+
};
|
|
16
|
+
const useCheckoutQuestionFeedbackForId = ({ id }) => {
|
|
17
|
+
const checkoutQuestionFeedbackContext = useContext(CheckoutQuestionFeedbackContext);
|
|
18
|
+
invariant(checkoutQuestionFeedbackContext, "Your are trying to use the useCheckoutQuestionFeedbackForId hook without wrapping your app with the <CheckoutQuestionFeedbackProvider>.");
|
|
19
|
+
const { feedback, onChange } = checkoutQuestionFeedbackContext;
|
|
20
|
+
return { feedback: feedback[id], onChange };
|
|
21
|
+
};
|
|
22
|
+
const useCheckoutQuestionFeedback = () => {
|
|
23
|
+
const checkoutQuestionFeedbackContext = useContext(CheckoutQuestionFeedbackContext);
|
|
24
|
+
invariant(checkoutQuestionFeedbackContext, "Your are trying to use the useCheckoutQuestionFeedback hook without wrapping your app with the <CheckoutQuestionFeedbackProvider>.");
|
|
25
|
+
const { feedback } = checkoutQuestionFeedbackContext;
|
|
26
|
+
return feedback;
|
|
27
|
+
};
|
|
28
|
+
export { useCheckoutQuestionFeedbackForId, useCheckoutQuestionFeedback, CheckoutQuestionFeedbackProvider };
|
|
@@ -3,16 +3,20 @@ import { BUTTON_VARIANT } from "@lookiero/aurora-next/build/components/atoms/But
|
|
|
3
3
|
import { useI18nMessage } from "@lookiero/i18n-react";
|
|
4
4
|
import React, { useCallback } from "react";
|
|
5
5
|
import { CHECKOUT_QUESTIONS_PREFIX } from "../../../../../i18n/i18n";
|
|
6
|
+
import { theme } from "../../../../../theme/theme";
|
|
7
|
+
import { useCheckoutQuestionFeedbackForId } from "../../behaviors/useCheckoutQuestionFeedback";
|
|
6
8
|
import { style } from "./ButtonCheckoutQuestionItem.style";
|
|
7
|
-
const
|
|
9
|
+
const { colorAccent, colorBase } = theme();
|
|
10
|
+
const ButtonCheckoutQuestionItem = ({ checkoutQuestion, checkoutQuestionParentId, }) => {
|
|
11
|
+
const { feedback, onChange } = useCheckoutQuestionFeedbackForId({ id: checkoutQuestionParentId });
|
|
8
12
|
const optionText = useI18nMessage({ id: checkoutQuestion.name, prefix: CHECKOUT_QUESTIONS_PREFIX });
|
|
9
|
-
const handleOnPress = useCallback(() =>
|
|
13
|
+
const handleOnPress = useCallback(() => onChange({ checkoutQuestionId: checkoutQuestionParentId, checkoutQuestionFeedback: checkoutQuestion.id }), [onChange, checkoutQuestion.id, checkoutQuestionParentId]);
|
|
10
14
|
return (React.createElement(Button
|
|
11
15
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
12
16
|
// @ts-ignore
|
|
13
17
|
, {
|
|
14
18
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
15
19
|
// @ts-ignore
|
|
16
|
-
style: style.button, variant: BUTTON_VARIANT.SECONDARY, onPress: handleOnPress }, optionText));
|
|
20
|
+
style: [style.button, { backgroundColor: feedback === checkoutQuestion.id ? colorAccent : colorBase }], variant: BUTTON_VARIANT.SECONDARY, onPress: handleOnPress }, optionText));
|
|
17
21
|
};
|
|
18
22
|
export { ButtonCheckoutQuestionItem };
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import React, { useCallback } from "react";
|
|
2
2
|
import { Pressable } from "react-native";
|
|
3
3
|
import invariant from "tiny-invariant";
|
|
4
|
+
import { theme } from "../../../../../theme/theme";
|
|
5
|
+
import { useCheckoutQuestionFeedbackForId } from "../../behaviors/useCheckoutQuestionFeedback";
|
|
4
6
|
import { style } from "./IconCheckoutQuestionItem.style";
|
|
5
7
|
import { Happy } from "./icons/Happy";
|
|
6
8
|
import { Normal } from "./icons/Normal";
|
|
7
9
|
import { Sad } from "./icons/Sad";
|
|
10
|
+
const { colorAccent } = theme();
|
|
8
11
|
const ICON = {
|
|
9
12
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
10
13
|
"checkout.checkout_question.icon.bad": Sad,
|
|
@@ -13,11 +16,12 @@ const ICON = {
|
|
|
13
16
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
14
17
|
"checkout.checkout_question.icon.good": Happy,
|
|
15
18
|
};
|
|
16
|
-
const IconCheckoutQuestionItem = ({ checkoutQuestion }) => {
|
|
19
|
+
const IconCheckoutQuestionItem = ({ checkoutQuestion, checkoutQuestionParentId, }) => {
|
|
17
20
|
const Icon = ICON[checkoutQuestion.name];
|
|
18
|
-
const
|
|
21
|
+
const { feedback, onChange } = useCheckoutQuestionFeedbackForId({ id: checkoutQuestionParentId });
|
|
22
|
+
const handleOnPress = useCallback(() => onChange({ checkoutQuestionId: checkoutQuestionParentId, checkoutQuestionFeedback: checkoutQuestion.id }), [onChange, checkoutQuestion.id, checkoutQuestionParentId]);
|
|
19
23
|
invariant(Icon, "CheckoutQuestion icon does not exist");
|
|
20
24
|
return (React.createElement(Pressable, { onPress: handleOnPress },
|
|
21
|
-
React.createElement(Icon, { style: style.icon, testID: checkoutQuestion.name })));
|
|
25
|
+
React.createElement(Icon, { fill: feedback === checkoutQuestion.id ? colorAccent : "none", style: style.icon, testID: checkoutQuestion.name })));
|
|
22
26
|
};
|
|
23
27
|
export { IconCheckoutQuestionItem };
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { useI18nMessage } from "@lookiero/i18n-react";
|
|
2
|
-
import React, { useCallback
|
|
2
|
+
import React, { useCallback } from "react";
|
|
3
3
|
import { InputField } from "../../../../../../../shared/ui/components/molecules/inputField/InputField";
|
|
4
4
|
import { RETURN_QUESTIONS_PREFIX } from "../../../../../i18n/i18n";
|
|
5
|
+
import { useCheckoutQuestionFeedbackForId } from "../../behaviors/useCheckoutQuestionFeedback";
|
|
5
6
|
const TEXTAREA_MIN_HEIGHT = 96;
|
|
6
|
-
const TextareaCheckoutQuestionItem = ({ checkoutQuestion }) => {
|
|
7
|
+
const TextareaCheckoutQuestionItem = ({ checkoutQuestion, checkoutQuestionParentId, }) => {
|
|
7
8
|
const placeholderText = useI18nMessage({
|
|
8
9
|
id: checkoutQuestion.placeholder,
|
|
9
10
|
prefix: RETURN_QUESTIONS_PREFIX,
|
|
10
11
|
});
|
|
11
|
-
const
|
|
12
|
-
const handleOnChange = useCallback((value) =>
|
|
13
|
-
return (React.createElement(InputField, { label: placeholderText, minHeight: TEXTAREA_MIN_HEIGHT, placeholder: placeholderText, value:
|
|
12
|
+
const { feedback, onChange } = useCheckoutQuestionFeedbackForId({ id: checkoutQuestionParentId });
|
|
13
|
+
const handleOnChange = useCallback((value) => onChange({ checkoutQuestionId: checkoutQuestionParentId, checkoutQuestionFeedback: value }), [onChange, checkoutQuestionParentId]);
|
|
14
|
+
return (React.createElement(InputField, { label: placeholderText, minHeight: TEXTAREA_MIN_HEIGHT, placeholder: placeholderText, value: feedback, multiline: true, onChange: handleOnChange }));
|
|
14
15
|
};
|
|
15
16
|
export { TextareaCheckoutQuestionItem };
|
|
@@ -1,35 +1,30 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { useI18nMessage } from "@lookiero/i18n-react";
|
|
3
|
-
import { QueryStatus } from "@lookiero/messaging-react";
|
|
1
|
+
import { CommandStatus, QueryStatus } from "@lookiero/messaging-react";
|
|
4
2
|
import React, { useCallback } from "react";
|
|
5
3
|
import { Spinner } from "../../../../shared/ui/components/atoms/spinner/Spinner";
|
|
4
|
+
import { useGiveCheckoutFeedback } from "../../../domain/checkoutFeedback/react/useGiveCheckoutFeedback";
|
|
6
5
|
import { useViewFirstAvailableCheckoutByCustomerId } from "../../../projection/checkout/react/useViewFirstAvailableCheckoutByCustomerId";
|
|
7
6
|
import { useListCheckoutQuestionsByCheckoutId } from "../../../projection/checkoutQuestion/react/useListCheckoutQuestionsByCheckoutId";
|
|
8
7
|
import { Body } from "../../components/layouts/body/Body";
|
|
8
|
+
import { CheckoutQuestionFeedbackProvider } from "../../components/organisms/checkoutQuestions/behaviors/useCheckoutQuestionFeedback";
|
|
9
9
|
import { SafeAreaScrollView } from "../../components/templates/SafeAreaScrollView";
|
|
10
|
-
import { I18nMessages } from "../../i18n/i18n";
|
|
11
10
|
import { style } from "./Feedback.style";
|
|
12
11
|
import { CheckoutQuestionsForm } from "./components/checkoutQuestionsForm/CheckoutQuestionsForm";
|
|
13
12
|
const Feedback = ({ customerId }) => {
|
|
14
|
-
const buttonText = useI18nMessage({ id: I18nMessages.FEEDBACK_BUTTON });
|
|
15
13
|
const [checkout, checkoutStatus] = useViewFirstAvailableCheckoutByCustomerId({ customerId });
|
|
16
14
|
const [checkoutQuestions, checkoutQuestionsStatus] = useListCheckoutQuestionsByCheckoutId({
|
|
17
15
|
checkoutId: checkout?.id,
|
|
18
16
|
});
|
|
19
|
-
const
|
|
17
|
+
const [giveCheckoutFeedback, giveCheckoutFeedbackStatus] = useGiveCheckoutFeedback({
|
|
18
|
+
checkoutId: checkout?.id,
|
|
19
|
+
});
|
|
20
|
+
const handleOnSubmit = useCallback((feedbacks) => giveCheckoutFeedback({ feedbacks }), [giveCheckoutFeedback]);
|
|
20
21
|
const dependenciesLoadedStatuses = [QueryStatus.ERROR, QueryStatus.SUCCESS];
|
|
21
22
|
const dependenciesLoaded = dependenciesLoadedStatuses.includes(checkoutStatus) && dependenciesLoadedStatuses.includes(checkoutQuestionsStatus);
|
|
22
23
|
if (!dependenciesLoaded)
|
|
23
24
|
return React.createElement(Spinner, null);
|
|
24
|
-
return (React.createElement(
|
|
25
|
-
React.createElement(
|
|
26
|
-
React.createElement(
|
|
27
|
-
|
|
28
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
29
|
-
// @ts-ignore
|
|
30
|
-
, {
|
|
31
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
32
|
-
// @ts-ignore
|
|
33
|
-
style: style.button, onPress: handlePress }, buttonText))));
|
|
25
|
+
return (React.createElement(CheckoutQuestionFeedbackProvider, { feedback: {} },
|
|
26
|
+
React.createElement(SafeAreaScrollView, null,
|
|
27
|
+
React.createElement(Body, { style: { column: style.bodyColumn } },
|
|
28
|
+
React.createElement(CheckoutQuestionsForm, { checkoutQuestions: checkoutQuestions || [], submitButtonDisabled: giveCheckoutFeedbackStatus === CommandStatus.LOADING, onSubmit: handleOnSubmit })))));
|
|
34
29
|
};
|
|
35
30
|
export { Feedback };
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { FC } from "react";
|
|
2
|
+
import { FeedbackProjection } from "../../../../../../projection/checkoutFeedback/feedback";
|
|
2
3
|
import { CheckoutQuestionProjection } from "../../../../../../projection/checkoutQuestion/checkoutQuestion";
|
|
3
4
|
interface CheckoutQuestionsFormProps {
|
|
4
5
|
readonly checkoutQuestions: CheckoutQuestionProjection[];
|
|
6
|
+
readonly submitButtonDisabled: boolean;
|
|
7
|
+
readonly onSubmit: (feedback: FeedbackProjection) => void;
|
|
5
8
|
}
|
|
6
9
|
declare const CheckoutQuestionsForm: FC<CheckoutQuestionsFormProps>;
|
|
7
10
|
export { CheckoutQuestionsForm };
|
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Button } from "@lookiero/aurora-next/build/components/atoms/Button/Button";
|
|
2
|
+
import { useI18nMessage } from "@lookiero/i18n-react";
|
|
3
|
+
import React, { useCallback } from "react";
|
|
2
4
|
import { CheckoutQuestionType, } from "../../../../../../projection/checkoutQuestion/checkoutQuestion";
|
|
3
5
|
import { CheckoutQuestions } from "../../../../components/organisms/checkoutQuestions/CheckoutQuestions";
|
|
6
|
+
import { useCheckoutQuestionFeedback } from "../../../../components/organisms/checkoutQuestions/behaviors/useCheckoutQuestionFeedback";
|
|
4
7
|
import { CheckoutQuestionItemProvider, } from "../../../../components/organisms/checkoutQuestions/behaviors/useCheckoutQuestionItem";
|
|
5
8
|
import { ButtonCheckoutQuestionItem } from "../../../../components/organisms/checkoutQuestions/components/buttonCheckoutQuestionItem/ButtonCheckoutQuestionItem";
|
|
6
9
|
import { HostDefaultCheckoutQuestionItem } from "../../../../components/organisms/checkoutQuestions/components/hostDefaultCheckoutQuestionItem/HostDefaultCheckoutQuestionItem";
|
|
7
10
|
import { HostSelectCheckoutQuestionItem } from "../../../../components/organisms/checkoutQuestions/components/hostSelectCheckoutQuestionItem/HostSelectCheckoutQuestionItem";
|
|
8
11
|
import { IconCheckoutQuestionItem } from "../../../../components/organisms/checkoutQuestions/components/iconCheckoutQuestionItem/IconCheckoutQuestionItem";
|
|
9
12
|
import { TextareaCheckoutQuestionItem } from "../../../../components/organisms/checkoutQuestions/components/textareaCheckoutQuestionItem/TextareaCheckoutQuestionItem";
|
|
13
|
+
import { I18nMessages } from "../../../../i18n/i18n";
|
|
14
|
+
import { style } from "./CheckoutQuestionsForm.style";
|
|
10
15
|
const checkoutQuestionItems = {
|
|
11
16
|
[CheckoutQuestionType.HOST_DEFAULT]: HostDefaultCheckoutQuestionItem,
|
|
12
17
|
[CheckoutQuestionType.HOST_TEXTAREA]: HostDefaultCheckoutQuestionItem,
|
|
@@ -15,6 +20,16 @@ const checkoutQuestionItems = {
|
|
|
15
20
|
[CheckoutQuestionType.ICON]: IconCheckoutQuestionItem,
|
|
16
21
|
[CheckoutQuestionType.BUTTON]: ButtonCheckoutQuestionItem,
|
|
17
22
|
};
|
|
18
|
-
const CheckoutQuestionsForm = ({ checkoutQuestions }) =>
|
|
19
|
-
|
|
23
|
+
const CheckoutQuestionsForm = ({ checkoutQuestions, submitButtonDisabled, onSubmit, }) => {
|
|
24
|
+
const buttonText = useI18nMessage({ id: I18nMessages.FEEDBACK_BUTTON });
|
|
25
|
+
const feedback = useCheckoutQuestionFeedback();
|
|
26
|
+
const handlePress = useCallback(() => onSubmit(feedback), [feedback, onSubmit]);
|
|
27
|
+
return (React.createElement(React.Fragment, null,
|
|
28
|
+
React.createElement(CheckoutQuestionItemProvider, { checkoutQuestionItems: checkoutQuestionItems },
|
|
29
|
+
React.createElement(CheckoutQuestions, { checkoutQuestions: checkoutQuestions })),
|
|
30
|
+
React.createElement(Button, { busy: submitButtonDisabled,
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
32
|
+
// @ts-ignore
|
|
33
|
+
style: style.button, onPress: handlePress }, buttonText)));
|
|
34
|
+
};
|
|
20
35
|
export { CheckoutQuestionsForm };
|