@instockng/storefront-ui 1.0.100 → 1.0.101

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 (154) hide show
  1. package/dist/components/Checkout.d.ts +1 -3
  2. package/dist/components/Checkout.d.ts.map +1 -1
  3. package/dist/index112.mjs +1 -1
  4. package/dist/index113.mjs +1 -1
  5. package/dist/index114.mjs +6 -6
  6. package/dist/index115.mjs +4 -4
  7. package/dist/index116.mjs +3 -3
  8. package/dist/index117.mjs +1 -1
  9. package/dist/index118.mjs +1 -1
  10. package/dist/index119.mjs +1 -1
  11. package/dist/index120.mjs +2 -2
  12. package/dist/index121.mjs +2 -2
  13. package/dist/index122.mjs +3 -3
  14. package/dist/index123.mjs +1 -1
  15. package/dist/index124.mjs +3 -3
  16. package/dist/index125.mjs +2 -2
  17. package/dist/index126.mjs +2 -2
  18. package/dist/index127.mjs +1 -1
  19. package/dist/index128.mjs +3 -3
  20. package/dist/index129.mjs +1 -1
  21. package/dist/index130.mjs +1 -1
  22. package/dist/index131.mjs +3 -3
  23. package/dist/index132.mjs +2 -2
  24. package/dist/index133.mjs +4 -4
  25. package/dist/index134.mjs +1 -1
  26. package/dist/index135.mjs +3 -3
  27. package/dist/index136.mjs +4 -4
  28. package/dist/index137.mjs +1 -1
  29. package/dist/index138.mjs +1 -1
  30. package/dist/index139.mjs +1 -1
  31. package/dist/index140.mjs +1 -1
  32. package/dist/index141.mjs +1 -1
  33. package/dist/index142.mjs +1 -1
  34. package/dist/index143.mjs +1 -1
  35. package/dist/index144.mjs +2 -2
  36. package/dist/index145.mjs +3 -3
  37. package/dist/index148.mjs +1 -1
  38. package/dist/index150.mjs +1 -1
  39. package/dist/index152.mjs +1 -1
  40. package/dist/index153.mjs +2 -2
  41. package/dist/index157.mjs +2 -2
  42. package/dist/index160.mjs +4 -4
  43. package/dist/index161.mjs +5 -5
  44. package/dist/index162.mjs +2 -2
  45. package/dist/index164.mjs +2 -2
  46. package/dist/index165.mjs +2 -18
  47. package/dist/index166.mjs +11 -25
  48. package/dist/index167.mjs +26 -32
  49. package/dist/index168.mjs +32 -12
  50. package/dist/index169.mjs +9 -9
  51. package/dist/index170.mjs +18 -2
  52. package/dist/index171.mjs +2 -20
  53. package/dist/index172.mjs +13 -39
  54. package/dist/index173.mjs +46 -2
  55. package/dist/index174.mjs +2 -30
  56. package/dist/index175.mjs +24 -12
  57. package/dist/index176.mjs +18 -2
  58. package/dist/index177.mjs +2 -2
  59. package/dist/index178.mjs +2 -2
  60. package/dist/index179.mjs +2 -2
  61. package/dist/index180.mjs +2 -72
  62. package/dist/index181.mjs +72 -2
  63. package/dist/index182.mjs +2 -53
  64. package/dist/index183.mjs +53 -2
  65. package/dist/index184.mjs +2 -36
  66. package/dist/index185.mjs +30 -146
  67. package/dist/index186.mjs +152 -2
  68. package/dist/index187.mjs +2 -2
  69. package/dist/index188.mjs +2 -19
  70. package/dist/index189.mjs +19 -2
  71. package/dist/index190.mjs +2 -2
  72. package/dist/index191.mjs +2 -26
  73. package/dist/index192.mjs +26 -2
  74. package/dist/index193.mjs +2 -2
  75. package/dist/index194.mjs +2 -24
  76. package/dist/index195.mjs +17 -16
  77. package/dist/index196.mjs +23 -2
  78. package/dist/index198.mjs +2 -2
  79. package/dist/index199.mjs +2 -23
  80. package/dist/index20.mjs +337 -366
  81. package/dist/index200.mjs +23 -2
  82. package/dist/index201.mjs +2 -23
  83. package/dist/index202.mjs +23 -2
  84. package/dist/index203.mjs +2 -2
  85. package/dist/index205.mjs +2 -23
  86. package/dist/index206.mjs +23 -2
  87. package/dist/index207.mjs +2 -23
  88. package/dist/index208.mjs +23 -2
  89. package/dist/index209.mjs +2 -2
  90. package/dist/index210.mjs +2 -2
  91. package/dist/index212.mjs +2 -2
  92. package/dist/index213.mjs +2 -2
  93. package/dist/index214.mjs +2 -2
  94. package/dist/index215.mjs +2 -2
  95. package/dist/index216.mjs +2 -127
  96. package/dist/index217.mjs +127 -2
  97. package/dist/index218.mjs +2 -74
  98. package/dist/index219.mjs +60 -60
  99. package/dist/index220.mjs +74 -2
  100. package/dist/index221.mjs +2 -13
  101. package/dist/index222.mjs +2 -7
  102. package/dist/index223.mjs +2 -31
  103. package/dist/index224.mjs +2 -11
  104. package/dist/index225.mjs +2 -4
  105. package/dist/index226.mjs +2 -4
  106. package/dist/index227.mjs +2 -12
  107. package/dist/index228.mjs +2 -5
  108. package/dist/index229.mjs +108 -33
  109. package/dist/index230.mjs +2 -31
  110. package/dist/index231.mjs +2 -28
  111. package/dist/index232.mjs +34 -58
  112. package/dist/index233.mjs +2 -2
  113. package/dist/index234.mjs +244 -2
  114. package/dist/index235.mjs +2 -2
  115. package/dist/index236.mjs +33 -2
  116. package/dist/index237.mjs +65 -2
  117. package/dist/index238.mjs +25 -2
  118. package/dist/index239.mjs +2 -108
  119. package/dist/index240.mjs +2 -2
  120. package/dist/index242.mjs +2 -37
  121. package/dist/index243.mjs +2 -2
  122. package/dist/index244.mjs +2 -2
  123. package/dist/index245.mjs +2 -2
  124. package/dist/index247.mjs +2 -2
  125. package/dist/index248.mjs +2 -244
  126. package/dist/index249.mjs +2 -2
  127. package/dist/index250.mjs +13 -33
  128. package/dist/index251.mjs +7 -65
  129. package/dist/index252.mjs +30 -24
  130. package/dist/index253.mjs +11 -2
  131. package/dist/index254.mjs +4 -2
  132. package/dist/index255.mjs +4 -2
  133. package/dist/index256.mjs +12 -2
  134. package/dist/index257.mjs +5 -2
  135. package/dist/index258.mjs +33 -2
  136. package/dist/index259.mjs +31 -2
  137. package/dist/index260.mjs +28 -4
  138. package/dist/index261.mjs +61 -2
  139. package/dist/index262.mjs +2 -2
  140. package/dist/index263.mjs +4 -2
  141. package/dist/index273.mjs +2 -1
  142. package/dist/index274.mjs +2 -3
  143. package/dist/index275.mjs +2 -2
  144. package/dist/index276.mjs +2 -2
  145. package/dist/index45.mjs +1 -1
  146. package/dist/index47.mjs +1 -1
  147. package/dist/index55.mjs +1 -1
  148. package/dist/index77.mjs +153 -2
  149. package/dist/index78.mjs +2 -23
  150. package/dist/index79.mjs +19 -149
  151. package/dist/index89.mjs +1 -1
  152. package/package.json +1 -1
  153. package/src/components/Checkout.stories.tsx +1 -3
  154. package/src/components/Checkout.tsx +60 -94
@@ -18,7 +18,6 @@ import { FormSelect } from './ui/form-select';
18
18
  import { Button } from './ui/button';
19
19
  import {
20
20
  Loader2,
21
- Mail,
22
21
  Phone,
23
22
  Zap,
24
23
  Banknote,
@@ -41,19 +40,20 @@ const cleanPhoneNumber = (phone: string): string => {
41
40
  return phone.replace(/\D/g, '');
42
41
  };
43
42
 
43
+ // Split a full name into first and last name
44
+ const splitFullName = (fullName: string): { firstName: string; lastName: string } => {
45
+ const parts = fullName.trim().split(/\s+/);
46
+ const firstName = parts[0] || '';
47
+ const lastName = parts.slice(1).join(' ') || '-';
48
+ return { firstName, lastName };
49
+ };
50
+
44
51
  // Yup validation schemas for each step
45
52
  const customerSchema = Yup.object({
46
- firstName: Yup.string()
47
- .required('First name is required')
48
- .min(2, 'First name must be at least 2 characters')
49
- .max(50, 'First name must be less than 50 characters'),
50
- lastName: Yup.string()
51
- .required('Last name is required')
52
- .min(2, 'Last name must be at least 2 characters')
53
- .max(50, 'Last name must be less than 50 characters'),
54
- email: Yup.string()
55
- .required('Email is required')
56
- .email('Please enter a valid email address'),
53
+ fullName: Yup.string()
54
+ .required('Name is required')
55
+ .min(2, 'Name must be at least 2 characters')
56
+ .max(100, 'Name must be less than 100 characters'),
57
57
  phone: Yup.string()
58
58
  .required('Phone number is required')
59
59
  .test('nigerian-phone', 'Please enter a valid Nigerian phone number (e.g. 0812 564 8668)', (value) => {
@@ -97,9 +97,7 @@ const paymentSchema = Yup.object({
97
97
  export type PaymentMethod = 'cod' | 'online';
98
98
 
99
99
  export interface CheckoutFormData {
100
- firstName: string;
101
- lastName: string;
102
- email: string;
100
+ fullName: string;
103
101
  phone: string;
104
102
  address: string;
105
103
  city: string;
@@ -167,10 +165,10 @@ export function Checkout({
167
165
  // Get TikTok attribution cookies for Events API
168
166
  const { ttp, ttclid } = getTikTokCookies();
169
167
 
168
+ const { firstName, lastName } = splitFullName(formData.fullName);
170
169
  const order = await checkout.mutateAsync({
171
- firstName: formData.firstName,
172
- lastName: formData.lastName,
173
- email: formData.email,
170
+ firstName,
171
+ lastName,
174
172
  phone: formData.phone,
175
173
  address: formData.address,
176
174
  city: formData.city,
@@ -239,9 +237,7 @@ export function Checkout({
239
237
  }, [isOpen]);
240
238
 
241
239
  const [formData, setFormData] = useState<CheckoutFormData>({
242
- firstName: initialData?.firstName || '',
243
- lastName: initialData?.lastName || '',
244
- email: initialData?.email || '',
240
+ fullName: initialData?.fullName || '',
245
241
  phone: initialData?.phone || '',
246
242
  address: initialData?.address || '',
247
243
  city: initialData?.city || '',
@@ -263,11 +259,10 @@ export function Checkout({
263
259
 
264
260
  useEffect(() => {
265
261
  if (isOpen && cart && !initialData && !hasLoadedCartData) {
262
+ const cartName = [cart.customerFirstName, cart.customerLastName].filter(Boolean).join(' ');
266
263
  setFormData((prev) => ({
267
264
  ...prev,
268
- firstName: cart.customerFirstName || prev.firstName,
269
- lastName: cart.customerLastName || prev.lastName,
270
- email: cart.customerEmail || prev.email,
265
+ fullName: cartName || prev.fullName,
271
266
  phone: cart.customerPhone || prev.phone,
272
267
  deliveryZoneId: cart.deliveryZone?.id || prev.deliveryZoneId,
273
268
  }));
@@ -312,20 +307,16 @@ export function Checkout({
312
307
 
313
308
  // Auto-save customer fields on blur
314
309
  const handleCustomerFieldBlur = useCallback(
315
- (field: 'firstName' | 'lastName' | 'email' | 'phone') => {
310
+ (field: 'fullName' | 'phone') => {
316
311
  const value = formData[field];
317
312
  if (!value) return; // Don't save empty values
318
313
 
319
- // Use proper type from updateCartMutation
320
- type UpdateCartParams = Parameters<typeof updateCartMutation.mutate>[0];
321
- const updateData: Partial<UpdateCartParams> = {};
322
-
323
- if (field === 'firstName') updateData.customerFirstName = value;
324
- else if (field === 'lastName') updateData.customerLastName = value;
325
- else if (field === 'email') updateData.customerEmail = value;
326
- else if (field === 'phone') updateData.customerPhone = value;
327
-
328
- updateCartMutation.mutate(updateData);
314
+ if (field === 'fullName') {
315
+ const { firstName, lastName } = splitFullName(value);
316
+ updateCartMutation.mutate({ customerFirstName: firstName, customerLastName: lastName });
317
+ } else if (field === 'phone') {
318
+ updateCartMutation.mutate({ customerPhone: value });
319
+ }
329
320
  },
330
321
  [formData, updateCartMutation]
331
322
  );
@@ -415,8 +406,9 @@ export function Checkout({
415
406
 
416
407
  // Initiate Paystack payment popup
417
408
  // The onSuccess callback in the hook will handle the checkout completion
409
+ const { firstName: psFirstName, lastName: psLastName } = splitFullName(formData.fullName);
418
410
  paystack.initializePayment({
419
- email: formData.email || cart?.customerEmail || 'customer@example.com',
411
+ email: cart?.customerEmail || 'customer@example.com',
420
412
  amount: amountInKobo,
421
413
  currency: 'NGN',
422
414
  metadata: {
@@ -425,9 +417,8 @@ export function Checkout({
425
417
  address: formData.address,
426
418
  city: formData.city,
427
419
  delivery_zone_id: selectedDeliveryZoneId || formData.deliveryZoneId,
428
- firstName: formData.firstName,
429
- lastName: formData.lastName,
430
- email: formData.email,
420
+ firstName: psFirstName,
421
+ lastName: psLastName,
431
422
  phone: formData.phone,
432
423
  fbc,
433
424
  fbp,
@@ -437,7 +428,7 @@ export function Checkout({
437
428
  {
438
429
  display_name: 'Customer Name',
439
430
  variable_name: 'customer_name',
440
- value: `${formData.firstName} ${formData.lastName}`,
431
+ value: formData.fullName,
441
432
  },
442
433
  {
443
434
  display_name: 'Phone Number',
@@ -474,10 +465,10 @@ export function Checkout({
474
465
  // Get TikTok attribution cookies for Events API
475
466
  const { ttp, ttclid } = getTikTokCookies();
476
467
 
468
+ const { firstName, lastName } = splitFullName(formData.fullName);
477
469
  const order = await checkout.mutateAsync({
478
- firstName: formData.firstName,
479
- lastName: formData.lastName,
480
- email: formData.email,
470
+ firstName,
471
+ lastName,
481
472
  phone: formData.phone,
482
473
  address: formData.address,
483
474
  city: formData.city,
@@ -799,57 +790,32 @@ export function Checkout({
799
790
  {/* Step 1: Customer Information */}
800
791
  <div className="w-full min-w-full flex-shrink-0 p-4">
801
792
  <div className="space-y-4">
802
- <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
803
- <FormInput
804
- label="First Name"
805
- type="text"
806
- name="firstName"
807
- value={formData.firstName}
808
- onChange={handleInputChange}
809
- onBlur={() => handleCustomerFieldBlur('firstName')}
810
- error={formErrors.firstName}
811
- autoCorrect="off"
812
- required
813
- />
814
- <FormInput
815
- label="Last Name"
816
- type="text"
817
- name="lastName"
818
- value={formData.lastName}
819
- onChange={handleInputChange}
820
- onBlur={() => handleCustomerFieldBlur('lastName')}
821
- error={formErrors.lastName}
822
- autoCorrect="off"
823
- required
824
- />
825
- <FormInput
826
- label="Email"
827
- type="email"
828
- name="email"
829
- value={formData.email}
830
- onChange={handleInputChange}
831
- onBlur={() => handleCustomerFieldBlur('email')}
832
- error={formErrors.email}
833
- icon={<Mail size={16} />}
834
- autoCorrect="off"
835
- required
836
- />
837
- <FormInput
838
- label="Phone Number"
839
- type="tel"
840
- name="phone"
841
- value={formData.phone}
842
- onChange={handleInputChange}
843
- onBlur={() => handleCustomerFieldBlur('phone')}
844
- placeholder="e.g. 08012345678"
845
- maxLength={18}
846
- error={formErrors.phone}
847
- icon={<Phone size={16} />}
848
- autoCorrect="off"
849
- required
850
- className="font-semibold"
851
- />
852
- </div>
793
+ <FormInput
794
+ label="Full Name"
795
+ type="text"
796
+ name="fullName"
797
+ value={formData.fullName}
798
+ onChange={handleInputChange}
799
+ onBlur={() => handleCustomerFieldBlur('fullName')}
800
+ error={formErrors.fullName}
801
+ autoCorrect="off"
802
+ required
803
+ />
804
+ <FormInput
805
+ label="Phone Number"
806
+ type="tel"
807
+ name="phone"
808
+ value={formData.phone}
809
+ onChange={handleInputChange}
810
+ onBlur={() => handleCustomerFieldBlur('phone')}
811
+ placeholder="e.g. 08012345678"
812
+ maxLength={18}
813
+ error={formErrors.phone}
814
+ icon={<Phone size={16} />}
815
+ autoCorrect="off"
816
+ required
817
+ className="font-semibold"
818
+ />
853
819
  </div>
854
820
  </div>
855
821