@akinon/pz-basket-gift-pack 1.42.0-rc.9 → 1.43.0-rc.0

Sign up to get free protection for your applications and to get access to all the features.
package/CHANGELOG.md CHANGED
@@ -1,28 +1,13 @@
1
1
  # @akinon/pz-basket-gift-pack
2
2
 
3
- ## 1.42.0-rc.9
4
-
5
- ## 1.42.0-rc.8
6
-
7
- ## 1.42.0-rc.7
3
+ ## 1.43.0-rc.0
8
4
 
9
5
  ### Minor Changes
10
6
 
11
7
  - 50b9069: ZERO-2767: update plugin readme files
8
+ - 18e8197: ZERO-2782: Add modal support for basket gift pack
12
9
 
13
- ## 1.42.0-rc.6
14
-
15
- ## 1.42.0-rc.5
16
-
17
- ## 1.42.0-rc.4
18
-
19
- ## 1.42.0-rc.3
20
-
21
- ## 1.42.0-rc.2
22
-
23
- ## 1.42.0-rc.1
24
-
25
- ## 1.42.0-rc.0
10
+ ## 1.42.0
26
11
 
27
12
  ## 1.41.0
28
13
 
package/README.md CHANGED
@@ -10,8 +10,22 @@ yarn add @akinon/pz-basket-gift-pack
10
10
  npx @akinon/projectzero@latest --plugins
11
11
  ```
12
12
 
13
+ ### Example Usage
14
+
15
+ ##### File Path: src/views/basket/basket-item.tsx
16
+
17
+ ```javascript
18
+ import { BasketGiftPackage } from 'pz-basket-gift-pack';
19
+
20
+ <BasketGiftPackage basketItem={basketItem} />;
21
+ ```
22
+
13
23
  ### Props
14
24
 
15
- | Properties | Type | Description |
16
- | ---------- | -------- | -------------------- |
17
- | basketItem | `object` | Product information. |
25
+ | Properties | Type | Description |
26
+ | --- | --- | --- |
27
+ | basketItem | `object` | Product information. |
28
+ | 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. |
29
+ | modalClassName | `string` | This prop is used to customize the overall style of the modal. |
30
+ | modalTitle | `string` | This prop sets the title of the modal. |
31
+ | modalContentClassName | `string` | This prop is used to customize the style of the modal content. |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akinon/pz-basket-gift-pack",
3
- "version": "1.42.0-rc.9",
3
+ "version": "1.43.0-rc.0",
4
4
  "license": "MIT",
5
5
  "main": "src/index.tsx",
6
6
  "peerDependencies": {
package/src/index.tsx CHANGED
@@ -8,8 +8,7 @@ import { useForm, SubmitHandler } from 'react-hook-form';
8
8
  import { yupResolver } from '@hookform/resolvers/yup';
9
9
  import * as yup from 'yup';
10
10
  import { useEffect, useState } from 'react';
11
- import { Button } from '@akinon/next/components/button';
12
- import { Icon } from '@akinon/next/components/icon';
11
+ import { Button, Icon, Modal } from '@akinon/next/components';
13
12
  import { BasketItem as BasketItemType } from '@akinon/next/types';
14
13
 
15
14
  interface GiftPackForm {
@@ -18,6 +17,10 @@ interface GiftPackForm {
18
17
 
19
18
  interface Props {
20
19
  basketItem: BasketItemType;
20
+ useModal?: boolean;
21
+ modalTitle?: string;
22
+ modalClassName?: string;
23
+ modalContentClassName?: string;
21
24
  translations?: {
22
25
  placeholderInput?: string;
23
26
  warningMessage?: string;
@@ -38,7 +41,11 @@ interface Props {
38
41
  export const BasketGiftPack = ({
39
42
  basketItem,
40
43
  translations,
41
- className
44
+ className,
45
+ useModal = false,
46
+ modalTitle = 'Gift Note',
47
+ modalClassName,
48
+ modalContentClassName
42
49
  }: Props) => {
43
50
  const defaultTranslations = {
44
51
  placeholderInput:
@@ -130,6 +137,61 @@ export const BasketGiftPack = ({
130
137
  }
131
138
  };
132
139
 
140
+ const formContent = (
141
+ <form onSubmit={handleSubmit(onSubmit)}>
142
+ {!useModal && (
143
+ <div className="flex justify-between mb-3">
144
+ <span className="text-[0.75rem] font-bold">
145
+ {_translations.addGiftNote}
146
+ </span>
147
+ <Button
148
+ appearance="ghost"
149
+ className="text-[#000000] cursor-pointer border-0 px-0 py-0 text-[0.75rem] select-none underline h-auto hover:bg-transparent hover:text-[#000000]"
150
+ onClick={(e) => {
151
+ e.preventDefault();
152
+ setHasNote((prevstate) => ({ ...prevstate, state: false }));
153
+ }}
154
+ >
155
+ {_translations.close}
156
+ </Button>
157
+ </div>
158
+ )}
159
+ <textarea
160
+ className="w-full border border-solid border-[#4a4f53] p-4 placeholder:text-[0.75rem] placeholder:text-[#c8c9c8] outline-none text-[0.75rem]"
161
+ rows={7}
162
+ name="message"
163
+ value={note !== defaultMessage ? note : ' '}
164
+ placeholder={_translations.placeholderInput}
165
+ {...register('message')}
166
+ />
167
+ {errors.message && (
168
+ <span className="text-sm text-[#d72a04]">{errors.message.message}</span>
169
+ )}
170
+ <div className="flex justify-between items-center mt-2">
171
+ <span
172
+ className={clsx(
173
+ 'text-[0.75rem] ',
174
+ textAreaCount > 160 ? 'text-[#e85150]' : 'text-[#82a27c]'
175
+ )}
176
+ >
177
+ {textAreaCount}/160 {_translations.charactersLength}
178
+ </span>
179
+ <div className="flex items-center gap-3">
180
+ <Button
181
+ appearance="ghost"
182
+ className="text-[#000000] cursor-pointer border-0 px-0 py-0 text-[0.75rem] select-none underline h-auto hover:bg-transparent hover:text-[#000000]"
183
+ onClick={removeNote}
184
+ >
185
+ {_translations.removeNote}
186
+ </Button>
187
+ <Button type="submit" className="w-28 h-7 font-medium uppercase">
188
+ {_translations.save}
189
+ </Button>
190
+ </div>
191
+ </div>
192
+ </form>
193
+ );
194
+
133
195
  useEffect(() => {
134
196
  for (const [key, value] of Object.entries(basketItem.attributes)) {
135
197
  if (value === '') {
@@ -220,64 +282,32 @@ export const BasketGiftPack = ({
220
282
  {_translations.removeGiftPack}
221
283
  </Button>
222
284
  </div>
223
- <div
224
- className={clsx('mt-4', {
225
- hidden: !hasNote.state
226
- })}
227
- >
228
- <form onSubmit={handleSubmit(onSubmit)}>
229
- <div className="flex justify-between mb-3">
230
- <span className="text-[0.75rem] font-bold">
231
- {_translations.addGiftNote}
232
- </span>
233
- <Button
234
- appearance="ghost"
235
- className="text-[#000000] cursor-pointer border-0 px-0 py-0 text-[0.75rem] select-none underline h-auto hover:bg-transparent hover:text-[#000000]"
236
- onClick={(e) => {
237
- e.preventDefault();
238
- setHasNote((prevstate) => ({ ...prevstate, state: false }));
239
- }}
240
- >
241
- {_translations.close}
242
- </Button>
243
- </div>
244
- <textarea
245
- className="w-full border border-solid border-[#4a4f53] p-4 placeholder:text-[0.75rem] placeholder:text-[#c8c9c8] outline-none text-[0.75rem]"
246
- rows={7}
247
- name="message"
248
- value={note !== defaultMessage ? note : ' '}
249
- placeholder={_translations.placeholderInput}
250
- {...register('message')}
251
- />
252
- {errors.message && (
253
- <span className="text-sm text-[#d72a04]">
254
- {errors.message.message}
255
- </span>
285
+ {useModal ? (
286
+ <Modal
287
+ portalId="basket-gift-pack-modal"
288
+ title={modalTitle}
289
+ className={twMerge(
290
+ 'w-full sm:w-[28rem] max-h-[90vh] overflow-y-auto',
291
+ modalClassName
256
292
  )}
257
- <div className="flex justify-between items-center mt-2">
258
- <span
259
- className={clsx(
260
- 'text-[0.75rem] ',
261
- textAreaCount > 160 ? 'text-[#e85150]' : 'text-[#82a27c]'
262
- )}
263
- >
264
- {textAreaCount}/160 {_translations.charactersLength}
265
- </span>
266
- <div className="flex items-center gap-3">
267
- <Button
268
- appearance="ghost"
269
- className="text-[#000000] cursor-pointer border-0 px-0 py-0 text-[0.75rem] select-none underline h-auto hover:bg-transparent hover:text-[#000000]"
270
- onClick={removeNote}
271
- >
272
- {_translations.removeNote}
273
- </Button>
274
- <Button type="submit" className="w-28 h-7 font-medium uppercase">
275
- {_translations.save}
276
- </Button>
277
- </div>
293
+ open={hasNote.state}
294
+ setOpen={(state) =>
295
+ setHasNote((prevstate) => ({ ...prevstate, state }))
296
+ }
297
+ >
298
+ <div className={twMerge('px-6 py-4', modalContentClassName)}>
299
+ {formContent}
278
300
  </div>
279
- </form>
280
- </div>
301
+ </Modal>
302
+ ) : (
303
+ <div
304
+ className={clsx('mt-4', {
305
+ hidden: !hasNote.state
306
+ })}
307
+ >
308
+ {formContent}
309
+ </div>
310
+ )}
281
311
  </div>
282
312
  );
283
313
  };