@akinon/pz-checkout-gift-pack 1.42.0-rc.0 → 1.42.0-rc.10
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +28 -0
- package/README.md +15 -14
- package/package.json +1 -1
- package/src/index.tsx +80 -47
package/CHANGELOG.md
CHANGED
@@ -1,5 +1,33 @@
|
|
1
1
|
# @akinon/pz-checkout-gift-pack
|
2
2
|
|
3
|
+
## 1.42.0-rc.10
|
4
|
+
|
5
|
+
### Minor Changes
|
6
|
+
|
7
|
+
- 69ca080: ZERO-2780: add modal support for checkout gift pack
|
8
|
+
|
9
|
+
## 1.42.0-rc.9
|
10
|
+
|
11
|
+
## 1.42.0-rc.8
|
12
|
+
|
13
|
+
## 1.42.0-rc.7
|
14
|
+
|
15
|
+
### Minor Changes
|
16
|
+
|
17
|
+
- 50b9069: ZERO-2767: update plugin readme files
|
18
|
+
|
19
|
+
## 1.42.0-rc.6
|
20
|
+
|
21
|
+
## 1.42.0-rc.5
|
22
|
+
|
23
|
+
## 1.42.0-rc.4
|
24
|
+
|
25
|
+
## 1.42.0-rc.3
|
26
|
+
|
27
|
+
## 1.42.0-rc.2
|
28
|
+
|
29
|
+
## 1.42.0-rc.1
|
30
|
+
|
3
31
|
## 1.42.0-rc.0
|
4
32
|
|
5
33
|
## 1.41.0
|
package/README.md
CHANGED
@@ -1,29 +1,30 @@
|
|
1
|
-
# pz-checkout-gift-package
|
1
|
+
# @akinon/pz-checkout-gift-package
|
2
2
|
|
3
3
|
### Install the npm package
|
4
4
|
|
5
5
|
```bash
|
6
6
|
# For latest version
|
7
|
-
yarn add
|
7
|
+
yarn add @akinon/pz-checkout-gift-package
|
8
8
|
|
9
|
-
#
|
10
|
-
|
11
|
-
```
|
12
|
-
|
13
|
-
### Next Config Configuration
|
14
|
-
|
15
|
-
##### apps/web/next.config.js**
|
16
|
-
|
17
|
-
```javascript
|
18
|
-
const withTM = require("next-transpile-modules")(["pz-checkout-gift-package"]);
|
9
|
+
# Preferred installation method
|
10
|
+
npx @akinon/projectzero@latest --plugins
|
19
11
|
```
|
20
12
|
|
21
13
|
### Example Usage
|
22
|
-
##### File Path: src/views/checkout/summary.tsx
|
23
14
|
|
15
|
+
##### File Path: src/views/checkout/summary.tsx
|
24
16
|
|
25
17
|
```javascript
|
26
18
|
import { CheckoutGiftPackage } from 'pz-checkout-gift-package';
|
27
19
|
|
28
|
-
<CheckoutGiftPackage
|
20
|
+
<CheckoutGiftPackage />;
|
29
21
|
```
|
22
|
+
|
23
|
+
### Props
|
24
|
+
|
25
|
+
| Properties | Type | Description |
|
26
|
+
| --- | --- | --- |
|
27
|
+
| useModal | `boolean` | This prop determines whether the gift pack form will be displayed inside a modal. When set to true, the form will open inside a modal. |
|
28
|
+
| modalClassName | `string` | This prop is used to customize the overall style of the modal. |
|
29
|
+
| modalTitle | `string` | This prop sets the title of the modal. |
|
30
|
+
| modalContentClassName | `string` | This prop is used to customize the style of the modal content. |
|
package/package.json
CHANGED
package/src/index.tsx
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
import { useAppSelector } from '@akinon/next/redux/hooks';
|
2
2
|
import { yupResolver } from '@hookform/resolvers/yup';
|
3
3
|
import clsx from 'clsx';
|
4
|
-
import {
|
4
|
+
import { twMerge } from 'tailwind-merge';
|
5
|
+
import { Accordion, Button, Icon, Modal } from '@akinon/next/components';
|
5
6
|
import { useEffect, useState } from 'react';
|
6
7
|
import { SubmitHandler, useForm } from 'react-hook-form';
|
7
8
|
import { RootState } from 'redux/store';
|
@@ -14,6 +15,10 @@ interface GiftPackForm {
|
|
14
15
|
|
15
16
|
interface CheckoutGiftPackProps {
|
16
17
|
className?: string;
|
18
|
+
useModal?: boolean;
|
19
|
+
modalClassName?: string;
|
20
|
+
modalTitle?: string;
|
21
|
+
modalContentClassName?: string;
|
17
22
|
translations: {
|
18
23
|
addGiftPackText: string;
|
19
24
|
giftPackAdded: string;
|
@@ -31,6 +36,10 @@ interface CheckoutGiftPackProps {
|
|
31
36
|
|
32
37
|
export const CheckoutGiftPack = ({
|
33
38
|
className,
|
39
|
+
useModal = false,
|
40
|
+
modalClassName,
|
41
|
+
modalContentClassName,
|
42
|
+
modalTitle = 'Gift Note',
|
34
43
|
translations
|
35
44
|
}: CheckoutGiftPackProps) => {
|
36
45
|
const [isNoteFormOpen, setIsNoteFormOpen] = useState(false);
|
@@ -102,6 +111,51 @@ export const CheckoutGiftPack = ({
|
|
102
111
|
resetField('message');
|
103
112
|
};
|
104
113
|
|
114
|
+
const formContent = (
|
115
|
+
<form
|
116
|
+
className={clsx({
|
117
|
+
hidden: !isNoteFormOpen
|
118
|
+
})}
|
119
|
+
onSubmit={handleSubmit(onSubmit)}
|
120
|
+
>
|
121
|
+
<textarea
|
122
|
+
className={clsx(
|
123
|
+
'w-full border border-solid p-4 placeholder:text-[0.75rem] placeholder:text-[#9c9d9d] outline-none text-[0.75rem]',
|
124
|
+
noteLength > 160 ? 'border-[#e85150]' : 'border-[#7b9d75]'
|
125
|
+
)}
|
126
|
+
rows={4}
|
127
|
+
placeholder={_translations.placeholderInput}
|
128
|
+
{...register('message')}
|
129
|
+
/>
|
130
|
+
{errors.message && (
|
131
|
+
<span className="text-sm text-[#d72a04] text-[0.875rem]">
|
132
|
+
{errors.message.message}
|
133
|
+
</span>
|
134
|
+
)}
|
135
|
+
<div className="text-[0.75rem]">
|
136
|
+
{noteLength} / 160 {_translations.charactersLength}
|
137
|
+
</div>
|
138
|
+
<div className="flex justify-end items-end gap-2">
|
139
|
+
{giftBox?.note !== DEFAULT_NOTE && (
|
140
|
+
<Button
|
141
|
+
appearance="ghost"
|
142
|
+
className="text-[0.75rem] underline cursor-pointer border-0 px-0 py-0 h-auto hover:bg-transparent hover:text-[#e95151]"
|
143
|
+
onClick={removeGiftNote}
|
144
|
+
>
|
145
|
+
{_translations.removeGiftNoteText}
|
146
|
+
</Button>
|
147
|
+
)}
|
148
|
+
<Button
|
149
|
+
type="submit"
|
150
|
+
className="w-[7rem] h-[1.75rem] font-[0.75rem] uppercase"
|
151
|
+
appearance="outlined"
|
152
|
+
>
|
153
|
+
{_translations.save}
|
154
|
+
</Button>
|
155
|
+
</div>
|
156
|
+
</form>
|
157
|
+
);
|
158
|
+
|
105
159
|
useEffect(() => {
|
106
160
|
if (giftBox?.note !== DEFAULT_NOTE) {
|
107
161
|
setValue('message', giftBox?.note);
|
@@ -166,54 +220,33 @@ export const CheckoutGiftPack = ({
|
|
166
220
|
</Button>
|
167
221
|
</div>
|
168
222
|
</div>
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
titleClassName="text-[0.75rem]"
|
178
|
-
isCollapse={true}
|
179
|
-
>
|
180
|
-
<textarea
|
181
|
-
className={clsx(
|
182
|
-
'w-full border border-solid p-4 placeholder:text-[0.75rem] placeholder:text-[#9c9d9d] outline-none text-[0.75rem]',
|
183
|
-
noteLength > 160 ? 'border-[#e85150]' : 'border-[#7b9d75]'
|
184
|
-
)}
|
185
|
-
rows={4}
|
186
|
-
placeholder={_translations.placeholderInput}
|
187
|
-
{...register('message')}
|
188
|
-
/>
|
189
|
-
{errors.message && (
|
190
|
-
<span className="text-sm text-[#d72a04] text-[0.875rem]">
|
191
|
-
{errors.message.message}
|
192
|
-
</span>
|
223
|
+
|
224
|
+
{useModal ? (
|
225
|
+
<Modal
|
226
|
+
portalId="checkout-gift-pack-modal"
|
227
|
+
title={modalTitle}
|
228
|
+
className={twMerge(
|
229
|
+
'w-full sm:w-[28rem] max-h-[90vh] overflow-y-auto',
|
230
|
+
modalClassName
|
193
231
|
)}
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
<div className=
|
198
|
-
{
|
199
|
-
<Button
|
200
|
-
appearance="ghost"
|
201
|
-
className="text-[0.75rem] underline cursor-pointer border-0 px-0 py-0 h-auto hover:bg-transparent hover:text-[#e95151]"
|
202
|
-
onClick={removeGiftNote}
|
203
|
-
>
|
204
|
-
{_translations.removeGiftNoteText}
|
205
|
-
</Button>
|
206
|
-
)}
|
207
|
-
<Button
|
208
|
-
type="submit"
|
209
|
-
className="w-[7rem] h-[1.75rem] font-[0.75rem] uppercase"
|
210
|
-
appearance="outlined"
|
211
|
-
>
|
212
|
-
{_translations.save}
|
213
|
-
</Button>
|
232
|
+
open={isNoteFormOpen}
|
233
|
+
setOpen={setIsNoteFormOpen}
|
234
|
+
>
|
235
|
+
<div className={twMerge('px-6 py-4', modalContentClassName)}>
|
236
|
+
{formContent}
|
214
237
|
</div>
|
215
|
-
</
|
216
|
-
|
238
|
+
</Modal>
|
239
|
+
) : (
|
240
|
+
<div className={clsx('py-2 px-5', { hidden: !isNoteFormOpen })}>
|
241
|
+
<Accordion
|
242
|
+
title={_translations.accordionTitle}
|
243
|
+
titleClassName="text-[0.75rem]"
|
244
|
+
isCollapse={true}
|
245
|
+
>
|
246
|
+
{formContent}
|
247
|
+
</Accordion>
|
248
|
+
</div>
|
249
|
+
)}
|
217
250
|
</div>
|
218
251
|
);
|
219
252
|
};
|