@akinon/next 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/.prettierrc +13 -0
  2. package/api/auth.ts +217 -0
  3. package/api/cache.ts +44 -0
  4. package/api/client.ts +157 -0
  5. package/api/logout.ts +42 -0
  6. package/assets/styles/index.scss +24 -0
  7. package/bin/pz-install-plugins.js +33 -0
  8. package/components/client-root.tsx +69 -0
  9. package/components/image.tsx +133 -0
  10. package/components/mobile-app-toggler.tsx +15 -0
  11. package/components/oauth-login.tsx +24 -0
  12. package/components/plugin-module.tsx +78 -0
  13. package/components/pz-providers.tsx +24 -0
  14. package/components/pz-root.tsx +21 -0
  15. package/components/redirect-three-d/content/index.tsx +64 -0
  16. package/components/redirect-three-d/index.tsx +17 -0
  17. package/components/selected-payment-option-view.tsx +66 -0
  18. package/components/trans.tsx +39 -0
  19. package/data/client/account.ts +188 -0
  20. package/data/client/address.ts +107 -0
  21. package/data/client/api.ts +42 -0
  22. package/data/client/basket.ts +85 -0
  23. package/data/client/checkout.ts +477 -0
  24. package/data/client/misc.ts +101 -0
  25. package/data/client/product.ts +90 -0
  26. package/data/client/user.ts +83 -0
  27. package/data/client/wishlist.ts +79 -0
  28. package/data/server/category.ts +121 -0
  29. package/data/server/flatpage.ts +21 -0
  30. package/data/server/index.ts +8 -0
  31. package/data/server/list.ts +56 -0
  32. package/data/server/menu.ts +35 -0
  33. package/data/server/product.ts +86 -0
  34. package/data/server/seo.ts +48 -0
  35. package/data/server/special-page.ts +42 -0
  36. package/data/server/widget.ts +27 -0
  37. package/data/urls.ts +184 -0
  38. package/hocs/client/index.ts +1 -0
  39. package/hocs/client/with-segment-defaults.tsx +26 -0
  40. package/hocs/server/index.ts +1 -0
  41. package/hocs/server/with-segment-defaults.tsx +83 -0
  42. package/hooks/index.ts +8 -0
  43. package/hooks/use-captcha.tsx +76 -0
  44. package/hooks/use-common-product-attributes.ts +36 -0
  45. package/hooks/use-debounce.ts +20 -0
  46. package/hooks/use-localization.ts +63 -0
  47. package/hooks/use-media-query.ts +36 -0
  48. package/hooks/use-on-click-outside.tsx +28 -0
  49. package/hooks/use-router.ts +45 -0
  50. package/hooks/use-translation.ts +14 -0
  51. package/lib/cache.ts +185 -0
  52. package/localization/index.ts +5 -0
  53. package/localization/provider.tsx +58 -0
  54. package/middlewares/currency.ts +55 -0
  55. package/middlewares/default.ts +224 -0
  56. package/middlewares/index.ts +29 -0
  57. package/middlewares/locale.ts +61 -0
  58. package/middlewares/oauth-login.ts +78 -0
  59. package/middlewares/pretty-url.ts +94 -0
  60. package/middlewares/redirection-payment.ts +117 -0
  61. package/middlewares/three-d-redirection.ts +122 -0
  62. package/middlewares/url-redirection.ts +61 -0
  63. package/package.json +20 -0
  64. package/plugins.js +7 -0
  65. package/redux/hooks.ts +7 -0
  66. package/redux/middlewares/checkout.ts +231 -0
  67. package/redux/middlewares/index.ts +50 -0
  68. package/redux/reducers/checkout.ts +164 -0
  69. package/redux/reducers/config.ts +28 -0
  70. package/redux/reducers/header.ts +59 -0
  71. package/redux/reducers/index.ts +15 -0
  72. package/redux/reducers/root.ts +61 -0
  73. package/tailwind/rtl.js +137 -0
  74. package/types/commerce/account.ts +68 -0
  75. package/types/commerce/address.ts +94 -0
  76. package/types/commerce/basket.ts +43 -0
  77. package/types/commerce/category.ts +114 -0
  78. package/types/commerce/checkout.ts +132 -0
  79. package/types/commerce/flatpage.ts +7 -0
  80. package/types/commerce/index.ts +10 -0
  81. package/types/commerce/misc.ts +127 -0
  82. package/types/commerce/order.ts +108 -0
  83. package/types/commerce/product.ts +110 -0
  84. package/types/commerce/widget.ts +28 -0
  85. package/types/gtm.ts +16 -0
  86. package/types/index.ts +207 -0
  87. package/types/next-auth.d.ts +24 -0
  88. package/utils/app-fetch.ts +62 -0
  89. package/utils/generate-commerce-search-params.ts +22 -0
  90. package/utils/get-currency.ts +29 -0
  91. package/utils/image-loader.ts +31 -0
  92. package/utils/index.ts +132 -0
  93. package/utils/localization.ts +29 -0
  94. package/utils/log.ts +138 -0
  95. package/utils/menu-generator.ts +27 -0
  96. package/utils/mobile-3d-iframe.ts +58 -0
  97. package/utils/server-translation.ts +57 -0
  98. package/utils/server-variables.ts +9 -0
@@ -0,0 +1,231 @@
1
+ 'use client';
2
+
3
+ import { Middleware } from '@reduxjs/toolkit';
4
+ import {
5
+ setAddressList,
6
+ setBankAccounts,
7
+ setCanGuestPurchase,
8
+ setCardType,
9
+ setDeliveryOptions,
10
+ setErrors,
11
+ setHasGiftBox,
12
+ setInstallmentOptions,
13
+ setLoyaltyBalance,
14
+ setPaymentChoices,
15
+ setPaymentOptions,
16
+ setPreOrder,
17
+ setShippingOptions,
18
+ setShippingStepCompleted
19
+ } from '../../redux/reducers/checkout';
20
+ import { RootState, TypedDispatch } from 'redux/store';
21
+ import { checkoutApi } from '../../data/client/checkout';
22
+ import { CheckoutContext, PreOrder } from '../../types';
23
+ import { getCookie, setCookie } from '../../utils';
24
+ import settings from 'settings';
25
+ import { LocaleUrlStrategy } from '../../localization';
26
+ import { showMobile3dIframe } from '../../utils/mobile-3d-iframe';
27
+
28
+ interface CheckoutResult {
29
+ payload: {
30
+ errors?: any;
31
+ pre_order?: PreOrder;
32
+ context_list?: CheckoutContext[];
33
+ };
34
+ }
35
+
36
+ interface MiddlewareParams {
37
+ getState: () => RootState;
38
+ dispatch: TypedDispatch;
39
+ }
40
+
41
+ export const errorMiddleware: Middleware = ({ dispatch }: MiddlewareParams) => {
42
+ return (next) => (action) => {
43
+ const result: CheckoutResult = next(action);
44
+ const errors = result?.payload?.errors;
45
+
46
+ if (errors) {
47
+ dispatch(setErrors(errors));
48
+ }
49
+
50
+ return result;
51
+ };
52
+ };
53
+
54
+ export const preOrderMiddleware: Middleware = ({
55
+ getState,
56
+ dispatch
57
+ }: MiddlewareParams) => {
58
+ return (next) => (action) => {
59
+ const result: CheckoutResult = next(action);
60
+ const preOrder = result?.payload?.pre_order;
61
+
62
+ if (
63
+ !preOrder ||
64
+ action?.meta?.arg?.endpointName === 'guestLogin' ||
65
+ action?.meta?.arg?.endpointName === 'getCheckoutLoyaltyBalance'
66
+ ) {
67
+ return result;
68
+ }
69
+
70
+ const {
71
+ deliveryOptions,
72
+ addressList: addresses,
73
+ shippingOptions,
74
+ paymentOptions,
75
+ installmentOptions
76
+ } = getState().checkout;
77
+ const { endpoints: apiEndpoints } = checkoutApi;
78
+
79
+ dispatch(setPreOrder(preOrder));
80
+
81
+ if (!preOrder.delivery_option && deliveryOptions.length > 0) {
82
+ dispatch(
83
+ apiEndpoints.setDeliveryOption.initiate(
84
+ deliveryOptions.find((opt) => opt.delivery_option_type === 'customer')
85
+ ?.pk
86
+ )
87
+ );
88
+ }
89
+
90
+ if (
91
+ (!preOrder.shipping_address || !preOrder.billing_address) &&
92
+ addresses.length > 0 &&
93
+ preOrder.delivery_option?.delivery_option_type === 'customer'
94
+ ) {
95
+ dispatch(
96
+ apiEndpoints.setAddresses.initiate({
97
+ shippingAddressPk: addresses[0].pk,
98
+ billingAddressPk: addresses[0].pk
99
+ })
100
+ );
101
+ }
102
+
103
+ if (
104
+ shippingOptions.length > 0 &&
105
+ (!preOrder.shipping_option ||
106
+ !shippingOptions.find((opt) => opt.pk === preOrder.shipping_option?.pk))
107
+ ) {
108
+ dispatch(apiEndpoints.setShippingOption.initiate(shippingOptions[0].pk));
109
+ }
110
+
111
+ if (!preOrder.payment_option && paymentOptions.length > 0) {
112
+ dispatch(apiEndpoints.setPaymentOption.initiate(paymentOptions[0].pk));
113
+ }
114
+
115
+ if (!preOrder.installment && installmentOptions.length > 0) {
116
+ dispatch(
117
+ apiEndpoints.setInstallmentOption.initiate(installmentOptions[0].pk)
118
+ );
119
+ }
120
+
121
+ dispatch(
122
+ setShippingStepCompleted(
123
+ [
124
+ preOrder.delivery_option?.delivery_option_type === 'retail_store'
125
+ ? true
126
+ : preOrder.shipping_address?.pk,
127
+ preOrder.billing_address?.pk,
128
+ preOrder.shipping_option?.pk,
129
+ addresses.length > 0
130
+ ].every(Boolean)
131
+ )
132
+ );
133
+
134
+ return result;
135
+ };
136
+ };
137
+
138
+ export const contextListMiddleware: Middleware = ({
139
+ dispatch,
140
+ getState
141
+ }: MiddlewareParams) => {
142
+ return (next) => (action) => {
143
+ const { isMobileApp } = getState().root;
144
+ const result: CheckoutResult = next(action);
145
+
146
+ if (result?.payload?.context_list) {
147
+ result.payload.context_list.forEach((context) => {
148
+ const redirectUrl = context.page_context.redirect_url;
149
+
150
+ if (redirectUrl) {
151
+ const currentLocale = getCookie('pz-locale');
152
+
153
+ let url = redirectUrl;
154
+
155
+ if (currentLocale && !redirectUrl.includes('/orders/redirection')) {
156
+ const { defaultLocaleValue, localeUrlStrategy } =
157
+ settings.localization;
158
+
159
+ url =
160
+ currentLocale === defaultLocaleValue &&
161
+ localeUrlStrategy !== LocaleUrlStrategy.ShowAllLocales
162
+ ? redirectUrl
163
+ : `/${currentLocale}${redirectUrl}`;
164
+ }
165
+
166
+ if (isMobileApp) {
167
+ showMobile3dIframe(url);
168
+ } else {
169
+ window.location.href = url;
170
+ }
171
+
172
+ return;
173
+ }
174
+
175
+ if (context.page_context.has_gift_box) {
176
+ dispatch(setHasGiftBox(context.page_context.has_gift_box));
177
+ }
178
+
179
+ if (typeof context.page_context.can_guest_purchase === 'boolean') {
180
+ dispatch(
181
+ setCanGuestPurchase(context.page_context.can_guest_purchase)
182
+ );
183
+ }
184
+
185
+ if (context.page_context.delivery_options) {
186
+ dispatch(setDeliveryOptions(context.page_context.delivery_options));
187
+ }
188
+
189
+ if (context.page_context.addresses) {
190
+ dispatch(setAddressList(context.page_context.addresses));
191
+ }
192
+
193
+ if (context.page_context.shipping_options) {
194
+ dispatch(setShippingOptions(context.page_context.shipping_options));
195
+ }
196
+
197
+ if (context.page_context.payment_options) {
198
+ dispatch(setPaymentOptions(context.page_context.payment_options));
199
+ }
200
+
201
+ if (context.page_context.payment_choices) {
202
+ dispatch(setPaymentChoices(context.page_context.payment_choices));
203
+ }
204
+
205
+ if (context.page_context.bank_accounts) {
206
+ dispatch(setBankAccounts(context.page_context.bank_accounts));
207
+ }
208
+
209
+ if (
210
+ !result.payload.context_list.find(
211
+ (ctx) => ctx.page_name === 'DeliveryOptionSelectionPage'
212
+ )
213
+ ) {
214
+ if (context.page_context.card_type) {
215
+ dispatch(setCardType(context.page_context.card_type));
216
+ }
217
+
218
+ if (context.page_context.installments) {
219
+ dispatch(setInstallmentOptions(context.page_context.installments));
220
+ }
221
+ }
222
+
223
+ if (context.page_context.balance) {
224
+ dispatch(setLoyaltyBalance(context.page_context.balance));
225
+ }
226
+ });
227
+ }
228
+
229
+ return result;
230
+ };
231
+ };
@@ -0,0 +1,50 @@
1
+ 'use client';
2
+
3
+ import { signOut } from 'next-auth/react';
4
+ import { ROUTES } from 'routes';
5
+ import type { Middleware } from '@reduxjs/toolkit';
6
+ import {
7
+ errorMiddleware,
8
+ contextListMiddleware,
9
+ preOrderMiddleware
10
+ } from './checkout';
11
+ import { api } from '../../data/client/api';
12
+ import logger from '@akinon/next/utils/log';
13
+
14
+ export const rtkQueryResponseHandler: Middleware =
15
+ ({ dispatch }) =>
16
+ (next) =>
17
+ (action) => {
18
+ return next(action);
19
+ };
20
+
21
+ export const rtkQueryErrorHandler: Middleware =
22
+ () => (next) => async (action) => {
23
+ if (action?.payload?.status === 401) {
24
+ await signOut({
25
+ callbackUrl: `${ROUTES.AUTH}?callbackUrl=${window.location.pathname}`
26
+ });
27
+ logger.debug('Session expired: 401');
28
+
29
+ return;
30
+ }
31
+
32
+ if (action?.payload?.status === 404) {
33
+ logger.warn(
34
+ `404 - Not Found. Endpoint: ${action.meta.arg.endpointName}, url: ${action.meta.baseQueryMeta.request.url}`
35
+ );
36
+ }
37
+
38
+ return next(action);
39
+ };
40
+
41
+ const middlewares = [
42
+ api.middleware,
43
+ rtkQueryResponseHandler,
44
+ rtkQueryErrorHandler,
45
+ errorMiddleware,
46
+ preOrderMiddleware,
47
+ contextListMiddleware
48
+ ];
49
+
50
+ export default middlewares;
@@ -0,0 +1,164 @@
1
+ 'use client';
2
+
3
+ import { createSlice } from '@reduxjs/toolkit';
4
+
5
+ import {
6
+ Address,
7
+ BankAccount,
8
+ CheckoutStep,
9
+ CreditCardType,
10
+ DeliveryOption,
11
+ InstallmentOption,
12
+ PaymentChoice,
13
+ PaymentOption,
14
+ PreOrder,
15
+ ShippingOption
16
+ } from '../../types';
17
+
18
+ export interface CheckoutState {
19
+ // TODO: Add types
20
+ errors: any;
21
+ hasGiftBox: boolean;
22
+ canGuestPurchase: boolean;
23
+ steps: {
24
+ current: CheckoutStep;
25
+ shipping: {
26
+ completed: boolean;
27
+ busy: boolean;
28
+ };
29
+ payment: {
30
+ completed: boolean;
31
+ busy: boolean;
32
+ };
33
+ };
34
+ preOrder: PreOrder;
35
+ addressList: Address[];
36
+ deliveryOptions: DeliveryOption[];
37
+ shippingOptions: ShippingOption[];
38
+ paymentOptions: PaymentOption[];
39
+ paymentChoices: PaymentChoice[];
40
+ cardType: CreditCardType;
41
+ installmentOptions: InstallmentOption[];
42
+ bankAccounts: BankAccount[];
43
+ selectedBankAccountPk: number;
44
+ loyaltyBalance?: string;
45
+ }
46
+
47
+ const initialState: CheckoutState = {
48
+ errors: null,
49
+ hasGiftBox: false,
50
+ canGuestPurchase: false,
51
+ steps: {
52
+ current: CheckoutStep.Shipping,
53
+ shipping: {
54
+ completed: false,
55
+ busy: false
56
+ },
57
+ payment: {
58
+ completed: false,
59
+ busy: false
60
+ }
61
+ },
62
+ preOrder: null,
63
+ addressList: [],
64
+ deliveryOptions: [],
65
+ shippingOptions: [],
66
+ paymentOptions: [],
67
+ paymentChoices: [],
68
+ cardType: null,
69
+ installmentOptions: [],
70
+ bankAccounts: [],
71
+ selectedBankAccountPk: null
72
+ };
73
+
74
+ const checkoutSlice = createSlice({
75
+ name: 'checkout',
76
+ initialState,
77
+ reducers: {
78
+ resetCheckoutState() {
79
+ return initialState;
80
+ },
81
+ setErrors(state, { payload }) {
82
+ state.errors = payload;
83
+ },
84
+ setHasGiftBox(state, { payload }) {
85
+ state.hasGiftBox = payload;
86
+ },
87
+ setCanGuestPurchase(state, { payload }) {
88
+ state.canGuestPurchase = payload;
89
+ },
90
+ setCurrentStep(state, { payload }) {
91
+ state.steps.current = payload;
92
+ },
93
+ setShippingStepCompleted(state, { payload }) {
94
+ state.steps.shipping.completed = payload;
95
+ },
96
+ setShippingStepBusy(state, { payload }) {
97
+ state.steps.shipping.busy = payload;
98
+ },
99
+ setPaymentStepCompleted(state, { payload }) {
100
+ state.steps.payment.completed = payload;
101
+ },
102
+ setPaymentStepBusy(state, { payload }) {
103
+ state.steps.payment.busy = payload;
104
+ },
105
+ setPreOrder(state, { payload }) {
106
+ state.preOrder = payload;
107
+ },
108
+ setAddressList(state, { payload }) {
109
+ state.addressList = payload;
110
+ },
111
+ setDeliveryOptions(state, { payload }) {
112
+ state.deliveryOptions = payload;
113
+ },
114
+ setShippingOptions(state, { payload }) {
115
+ state.shippingOptions = payload;
116
+ },
117
+ setPaymentOptions(state, { payload }) {
118
+ state.paymentOptions = payload;
119
+ },
120
+ setPaymentChoices(state, { payload }) {
121
+ state.paymentChoices = payload;
122
+ },
123
+ setCardType(state, { payload }) {
124
+ state.cardType = payload;
125
+ },
126
+ setInstallmentOptions(state, { payload }) {
127
+ state.installmentOptions = payload;
128
+ },
129
+ setBankAccounts(state, { payload }) {
130
+ state.bankAccounts = payload;
131
+ },
132
+ setSelectedBankAccountPk(state, { payload }) {
133
+ state.selectedBankAccountPk = payload;
134
+ },
135
+ setLoyaltyBalance(state, { payload }) {
136
+ state.loyaltyBalance = payload;
137
+ }
138
+ }
139
+ });
140
+
141
+ export const {
142
+ resetCheckoutState,
143
+ setErrors,
144
+ setHasGiftBox,
145
+ setCanGuestPurchase,
146
+ setCurrentStep,
147
+ setShippingStepCompleted,
148
+ setShippingStepBusy,
149
+ setPaymentStepCompleted,
150
+ setPaymentStepBusy,
151
+ setPreOrder,
152
+ setAddressList,
153
+ setDeliveryOptions,
154
+ setShippingOptions,
155
+ setPaymentOptions,
156
+ setPaymentChoices,
157
+ setCardType,
158
+ setInstallmentOptions,
159
+ setBankAccounts,
160
+ setSelectedBankAccountPk,
161
+ setLoyaltyBalance
162
+ } = checkoutSlice.actions;
163
+
164
+ export default checkoutSlice.reducer;
@@ -0,0 +1,28 @@
1
+ 'use client';
2
+
3
+ import { createSlice, PayloadAction } from '@reduxjs/toolkit';
4
+ import { Config } from '../../types';
5
+
6
+ const initialState: Config = {
7
+ user_phone_regex: '^(05)\\d{9}$',
8
+ user_phone_format: '05999999999',
9
+ country: {
10
+ pk: 1,
11
+ name: 'Türkiye',
12
+ code: 'tr'
13
+ }
14
+ };
15
+
16
+ const configSlice = createSlice({
17
+ name: 'config',
18
+ initialState,
19
+ reducers: {
20
+ setConfig: (state, action: PayloadAction<Config>) => {
21
+ return action.payload;
22
+ }
23
+ }
24
+ });
25
+
26
+ export const { setConfig } = configSlice.actions;
27
+
28
+ export default configSlice.reducer;
@@ -0,0 +1,59 @@
1
+ 'use client';
2
+
3
+ import { createSlice } from '@reduxjs/toolkit';
4
+
5
+ export interface HeaderState {
6
+ isMobileMenuOpen: boolean;
7
+ isSearchOpen: boolean;
8
+ openedMenu: string | null;
9
+ }
10
+
11
+ const initialState: HeaderState = {
12
+ isMobileMenuOpen: false,
13
+ isSearchOpen: false,
14
+ openedMenu: null
15
+ };
16
+
17
+ const headerSlice = createSlice({
18
+ name: 'header',
19
+ initialState,
20
+ reducers: {
21
+ openMobileMenu(state) {
22
+ state.isMobileMenuOpen = true;
23
+ },
24
+ closeMobileMenu(state) {
25
+ state.isMobileMenuOpen = false;
26
+ },
27
+ toggleMobileMenu(state) {
28
+ state.isMobileMenuOpen = !state.isMobileMenuOpen;
29
+ },
30
+ openSearch(state) {
31
+ state.isSearchOpen = true;
32
+ },
33
+ closeSearch(state) {
34
+ state.isSearchOpen = false;
35
+ },
36
+ toggleSearch(state) {
37
+ state.isSearchOpen = !state.isSearchOpen;
38
+ },
39
+ setOpenedMenu(state, action) {
40
+ state.openedMenu = action.payload;
41
+ },
42
+ resetHeaderState() {
43
+ return initialState;
44
+ }
45
+ }
46
+ });
47
+
48
+ export const {
49
+ openMobileMenu,
50
+ closeMobileMenu,
51
+ toggleMobileMenu,
52
+ openSearch,
53
+ closeSearch,
54
+ toggleSearch,
55
+ setOpenedMenu,
56
+ resetHeaderState
57
+ } = headerSlice.actions;
58
+
59
+ export default headerSlice.reducer;
@@ -0,0 +1,15 @@
1
+ import rootReducer from './root';
2
+ import checkoutReducer from './checkout';
3
+ import configReducer from './config';
4
+ import headerReducer from './header';
5
+ import { api } from '../../data/client/api';
6
+
7
+ const reducers = {
8
+ [api.reducerPath]: api.reducer,
9
+ root: rootReducer,
10
+ checkout: checkoutReducer,
11
+ config: configReducer,
12
+ header: headerReducer
13
+ };
14
+
15
+ export default reducers;
@@ -0,0 +1,61 @@
1
+ import { createSlice } from '@reduxjs/toolkit';
2
+ import Settings from 'settings';
3
+
4
+ const initialState = {
5
+ commerceUrl: Settings.commerceUrl,
6
+ isMobileApp:
7
+ typeof window !== 'undefined' &&
8
+ localStorage.getItem('isMobileApp') === 'true',
9
+ miniBasket: {
10
+ open: false,
11
+ highlightedItem: null
12
+ },
13
+ rootModal: {
14
+ open: false,
15
+ title: null,
16
+ content: null
17
+ }
18
+ };
19
+
20
+ const rootSlice = createSlice({
21
+ name: 'root',
22
+ initialState,
23
+ reducers: {
24
+ openMiniBasket: (state) => {
25
+ state.miniBasket.open = true;
26
+ },
27
+ closeMiniBasket: (state) => {
28
+ state.miniBasket.open = false;
29
+ },
30
+ toggleMiniBasket: (state) => {
31
+ state.miniBasket.open = !state.miniBasket.open;
32
+ },
33
+ setHighlightedItem: (state, action: { payload: number | null }) => {
34
+ state.miniBasket.highlightedItem = action.payload;
35
+ },
36
+ openRootModal: (
37
+ state,
38
+ action: { payload: { title?: string; content?: string } }
39
+ ) => {
40
+ state.rootModal.open = true;
41
+ state.rootModal.title = action.payload.title;
42
+ state.rootModal.content = action.payload.content;
43
+ },
44
+ closeRootModal: (state) => {
45
+ state.rootModal.open = false;
46
+ state.rootModal.title = null;
47
+ state.rootModal.content = null;
48
+ }
49
+ }
50
+ });
51
+
52
+ export const {
53
+ openMiniBasket,
54
+ closeMiniBasket,
55
+ toggleMiniBasket,
56
+ setHighlightedItem,
57
+ openRootModal,
58
+ closeRootModal
59
+ } = rootSlice.actions;
60
+
61
+ export default rootSlice.reducer;