@akinon/projectzero 1.48.0-rc.2 → 1.48.0-rc.3

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/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # @akinon/projectzero
2
2
 
3
+ ## 1.48.0-rc.3
4
+
5
+ ### Minor Changes
6
+
7
+ - 90282b53: ZERO-2729: Audit packages for yarn and npm and also update app-template
8
+ - 03c4c3eb: ZERO-2731: Update Project Zero CLI command
9
+ - 64699d3: ZERO-2761: Fix invalid import for plugin module
10
+ - 9b6bf91e: ZERO-2660: Change campaings to campaigns
11
+ - 00ffde2f: ZERO-2637: enhance create command with improved messaging
12
+ - d2f0f15c: ZERO-2723: Update sentry version and dependencies
13
+
3
14
  ## 1.48.0-rc.2
4
15
 
5
16
  ## 1.48.0-rc.1
@@ -1,5 +1,126 @@
1
1
  # projectzeronext
2
2
 
3
+ ## 1.48.0-rc.3
4
+
5
+ ### Minor Changes
6
+
7
+ - 90282b53: ZERO-2729: Audit packages for yarn and npm and also update app-template
8
+ - 572d2e84: ZERO-2667: Add iframe support for redirection payment methods
9
+ - c53ea3e6: ZERO-2609: Reset additional form fields when selectedFormType is not company
10
+ - 97b8bdc9: ZERO-2724: Remove onClick event in shipping options component
11
+ - 714e0b46: ZERO-2759: update pz-click-collect peer dependencies
12
+ - 7521265: ZERO-2787: Fix hover classname for favorite item
13
+ - 8217463: ZERO-2887: Add LoaderSpinner to Filters component
14
+ - 27a5296d: ZERO-2631:Fix Checkbox Click
15
+ - 5a4c607: ZERO-2764: Add case-warning rule to eslint-plugin-projectzero
16
+ - bc2b411: ZERO-2825: Add attribute-based shipping options to checkout page
17
+ - e665a0a: ZERO-2625: Add click outside functionality to close mobile menu
18
+ - 52c1373: ZERO-2619: Added fix flag for the staged linter
19
+ - 552ee8a: ZERO-2777: fix link component usage
20
+ - 03c4c3eb: ZERO-2731: Update Project Zero CLI command
21
+ - 2e6104d: ZERO-2888:Edit the numbering in the pagination and the visibility of the prev and next buttons
22
+ - 64699d3: ZERO-2761: Fix invalid import for plugin module
23
+ - 0d3a913e: ZERO-2725: Update decimal scale in Price component
24
+ - 778a9a0b: ZERO-2740: Upgrade next to 14.2.4
25
+ - 9b6bf91e: ZERO-2660: Change campaings to campaigns
26
+ - 06650ca: ZERO-2620: Remove unnecessary pointer-events-none class
27
+ - 74a12699: ZERO-2658:Edit product name clickability on completed order page
28
+ - 4e1c15c: ZERO-2617: Remove TODO comment in ProductInfo component
29
+ - d3474c64: ZERO-2655: Add data source shipping option
30
+ - d2f0f15c: ZERO-2723: Update sentry version and dependencies
31
+ - 75080fd6: ZERO-2630: Add max limit to postcode area
32
+ - 9609eb2: ZERO-2779: Upgrade for tailwind
33
+ - 91265bba: ZERO-2551: Improve pretty url and caching performance
34
+ - 38a634e: ZERO-2893: Refactor category filter handling and URL parameters
35
+ - 959e1fa: ZERO-2778: Upgrade for nextjs
36
+ - 902d828a: ZERO-2621:edit position of loaderSpinner in favorites page
37
+ - 7a4bb764: ZERO-2610:Refactor FilterItem component for better readability and efficiency
38
+ - dfabc06: ZERO-2836: Upgrade version for tailwind
39
+ - dff0d595: ZERO-2659: add formData support to proxy api requests
40
+ - eecb282: ZERO-2607: Update address-related functions to include invalidateTag option
41
+ - 9e25a64: ZERO-2835: Update category page layout with breadcrumb
42
+ - beb499e6: ZERO-2551: Add new tsconfig paths
43
+ - f45aa87: ZERO-2904: Upgrade version for tailwindcss
44
+ - fac2e5b: ZERO-2622: Add isMenuOpen state to Category reducer and update CategoryInfo component
45
+ - 4614eeeb: ZERO-2602: The script that checks the build for standalone projects
46
+ - e9a46acb: ZERO-2738: add CVC input to registered cards in Masterpass
47
+ - f046f8e0: ZERO-2575: update version for react-number-format
48
+ - b9273fd: ZERO-2889: add host headers to requests
49
+ - 86d25315: ZERO-2693: resolve dependency collision warning for eslint-config-next
50
+
51
+ ### Patch Changes
52
+
53
+ - Updated dependencies [90282b53]
54
+ - Updated dependencies [50b9069]
55
+ - Updated dependencies [572d2e84]
56
+ - Updated dependencies [a4c8d6a9]
57
+ - Updated dependencies [fda5b92]
58
+ - Updated dependencies [2d9b2b2]
59
+ - Updated dependencies [c53ea3e6]
60
+ - Updated dependencies [d93a507]
61
+ - Updated dependencies [8d9ac9a]
62
+ - Updated dependencies [18e8197]
63
+ - Updated dependencies [714e0b46]
64
+ - Updated dependencies [70279e7]
65
+ - Updated dependencies [6c25f66]
66
+ - Updated dependencies [bc2b411]
67
+ - Updated dependencies [3bf2dd9]
68
+ - Updated dependencies [e9541a1]
69
+ - Updated dependencies [c53ef7b9]
70
+ - Updated dependencies [9d94f7e]
71
+ - Updated dependencies [2e6104d]
72
+ - Updated dependencies [64699d3]
73
+ - Updated dependencies [0d3a913e]
74
+ - Updated dependencies [1448a96e]
75
+ - Updated dependencies [1ec2e9d]
76
+ - Updated dependencies [d6edb1d]
77
+ - Updated dependencies [d3474c64]
78
+ - Updated dependencies [75080fd6]
79
+ - Updated dependencies [17f8752]
80
+ - Updated dependencies [c45b62c]
81
+ - Updated dependencies [91265bba]
82
+ - Updated dependencies [bbe18b9f]
83
+ - Updated dependencies [d409996]
84
+ - Updated dependencies [4920742]
85
+ - Updated dependencies [12a873e]
86
+ - Updated dependencies [69ca080]
87
+ - Updated dependencies [7e56d6b]
88
+ - Updated dependencies [94b6928]
89
+ - Updated dependencies [98bb8dcd]
90
+ - Updated dependencies [46b7aad]
91
+ - Updated dependencies [dcc8a150]
92
+ - Updated dependencies [8f47cca]
93
+ - Updated dependencies [fad27689]
94
+ - Updated dependencies [dff0d595]
95
+ - Updated dependencies [fdd0b41]
96
+ - Updated dependencies [eecb282]
97
+ - Updated dependencies [f2c325c]
98
+ - Updated dependencies [9e25a64]
99
+ - Updated dependencies [beb499e6]
100
+ - Updated dependencies [146ea39]
101
+ - Updated dependencies [f2c92d5]
102
+ - Updated dependencies [7bd3d99]
103
+ - Updated dependencies [c47be30d]
104
+ - Updated dependencies [e9a46acb]
105
+ - Updated dependencies [f046f8e0]
106
+ - Updated dependencies [b9273fd]
107
+ - Updated dependencies [86d25315]
108
+ - Updated dependencies [c670bd4]
109
+ - Updated dependencies [3f9b8d7]
110
+ - @akinon/next@1.48.0-rc.3
111
+ - @akinon/pz-checkout-gift-pack@1.48.0-rc.3
112
+ - @akinon/pz-one-click-checkout@1.48.0-rc.3
113
+ - @akinon/pz-basket-gift-pack@1.48.0-rc.3
114
+ - @akinon/pz-click-collect@1.48.0-rc.3
115
+ - @akinon/pz-masterpass@1.48.0-rc.3
116
+ - @akinon/pz-akifast@1.48.0-rc.3
117
+ - @akinon/pz-gpay@1.48.0-rc.3
118
+ - @akinon/pz-b2b@1.48.0-rc.3
119
+ - @akinon/pz-bkm@1.48.0-rc.3
120
+ - @akinon/pz-otp@1.48.0-rc.3
121
+ - @akinon/pz-pay-on-delivery@1.48.0-rc.3
122
+ - @akinon/pz-credit-payment@1.48.0-rc.3
123
+
3
124
  ## 1.48.0-rc.2
4
125
 
5
126
  ### Minor Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "projectzeronext",
3
- "version": "1.48.0-rc.2",
3
+ "version": "1.48.0-rc.3",
4
4
  "private": true,
5
5
  "license": "MIT",
6
6
  "scripts": {
@@ -22,19 +22,19 @@
22
22
  "prestart": "pz-prestart"
23
23
  },
24
24
  "dependencies": {
25
- "@akinon/next": "1.48.0-rc.2",
26
- "@akinon/pz-akifast": "1.48.0-rc.2",
27
- "@akinon/pz-b2b": "1.48.0-rc.2",
28
- "@akinon/pz-basket-gift-pack": "1.48.0-rc.2",
29
- "@akinon/pz-bkm": "1.48.0-rc.2",
30
- "@akinon/pz-checkout-gift-pack": "1.48.0-rc.2",
31
- "@akinon/pz-click-collect": "1.48.0-rc.2",
32
- "@akinon/pz-credit-payment": "1.48.0-rc.2",
33
- "@akinon/pz-gpay": "1.48.0-rc.2",
34
- "@akinon/pz-masterpass": "1.48.0-rc.2",
35
- "@akinon/pz-one-click-checkout": "1.48.0-rc.2",
36
- "@akinon/pz-otp": "1.48.0-rc.2",
37
- "@akinon/pz-pay-on-delivery": "1.48.0-rc.2",
25
+ "@akinon/next": "1.48.0-rc.3",
26
+ "@akinon/pz-akifast": "1.48.0-rc.3",
27
+ "@akinon/pz-b2b": "1.48.0-rc.3",
28
+ "@akinon/pz-basket-gift-pack": "1.48.0-rc.3",
29
+ "@akinon/pz-bkm": "1.48.0-rc.3",
30
+ "@akinon/pz-checkout-gift-pack": "1.48.0-rc.3",
31
+ "@akinon/pz-click-collect": "1.48.0-rc.3",
32
+ "@akinon/pz-credit-payment": "1.48.0-rc.3",
33
+ "@akinon/pz-gpay": "1.48.0-rc.3",
34
+ "@akinon/pz-masterpass": "1.48.0-rc.3",
35
+ "@akinon/pz-one-click-checkout": "1.48.0-rc.3",
36
+ "@akinon/pz-otp": "1.48.0-rc.3",
37
+ "@akinon/pz-pay-on-delivery": "1.48.0-rc.3",
38
38
  "@hookform/resolvers": "2.9.0",
39
39
  "@next/third-parties": "14.1.0",
40
40
  "@react-google-maps/api": "2.17.1",
@@ -58,7 +58,7 @@
58
58
  "yup": "0.32.11"
59
59
  },
60
60
  "devDependencies": {
61
- "@akinon/eslint-plugin-projectzero": "1.48.0-rc.2",
61
+ "@akinon/eslint-plugin-projectzero": "1.48.0-rc.3",
62
62
  "@semantic-release/changelog": "6.0.2",
63
63
  "@semantic-release/exec": "6.0.3",
64
64
  "@semantic-release/git": "10.0.1",
@@ -94,7 +94,7 @@
94
94
  "stylelint-config-standard": "25.0.0",
95
95
  "stylelint-scss": "4.2.0",
96
96
  "stylelint-selector-bem-pattern": "2.1.1",
97
- "tailwindcss": "3.4.10",
97
+ "tailwindcss": "3.4.12",
98
98
  "ts-jest": "29.1.1",
99
99
  "ts-node": "10.7.0",
100
100
  "typescript": "5.2.2"
@@ -22,17 +22,28 @@ const CategoryActiveFilters = () => {
22
22
  const handleRemoveFilter = ({ facet, choice }) => {
23
23
  if (facet.widget_type === WIDGET_TYPE.category) {
24
24
  dispatch(removeCategoryFacet({ facet, choice }));
25
- return;
25
+ } else {
26
+ dispatch(toggleFacet({ facet, choice }));
26
27
  }
27
28
 
28
- dispatch(toggleFacet({ facet, choice }));
29
+ const urlSearchParams = new URLSearchParams(window.location.search);
30
+ urlSearchParams.delete(facet.search_key);
31
+ router.replace(pathname + '?' + urlSearchParams.toString());
29
32
  };
30
33
 
31
34
  const url = useMemo(() => {
32
- const facetSearchParams =
33
- convertFacetSearchParams(selectedFacets).toString();
35
+ const facetSearchParams = convertFacetSearchParams(selectedFacets);
36
+ const urlSearchParams = new URLSearchParams(searchParams.toString());
34
37
 
35
- const urlSearchParams = new URLSearchParams(facetSearchParams);
38
+ for (const key of Array.from(urlSearchParams.keys())) {
39
+ if (facetSearchParams.has(key)) {
40
+ urlSearchParams.delete(key);
41
+ }
42
+ }
43
+
44
+ for (const [key, value] of Array.from(facetSearchParams.entries())) {
45
+ urlSearchParams.append(key, value);
46
+ }
36
47
 
37
48
  const searchText = searchParams.get('search_text');
38
49
  const page = searchParams.get('page');
@@ -53,7 +64,6 @@ const CategoryActiveFilters = () => {
53
64
 
54
65
  useEffect(() => {
55
66
  router.push(url);
56
-
57
67
  // eslint-disable-next-line react-hooks/exhaustive-deps
58
68
  }, [url]);
59
69
 
@@ -1,12 +1,14 @@
1
1
  import clsx from 'clsx';
2
2
  import { useAppDispatch } from '@akinon/next/redux/hooks';
3
3
  import { Facet, FacetChoice } from '@akinon/next/types';
4
- import { Accordion, Radio, Checkbox } from '../../../components';
4
+ import { Accordion, Radio, Checkbox, LoaderSpinner } from '../../../components';
5
5
  import { WIDGET_TYPE } from '../../../types';
6
6
  import { SizeFilter } from './size-filter';
7
7
  import { toggleFacet } from '@theme/redux/reducers/category';
8
8
  import { commonProductAttributes } from '@theme/settings';
9
9
  import { useRouter } from '@akinon/next/hooks';
10
+ import { usePathname } from 'next/navigation';
11
+ import { useState } from 'react';
10
12
 
11
13
  const COMPONENT_TYPES = {
12
14
  [WIDGET_TYPE.category]: Radio,
@@ -19,6 +21,8 @@ const sizeKey = commonProductAttributes.find(
19
21
 
20
22
  interface Props {
21
23
  facet: Facet;
24
+ isPending: boolean;
25
+ startTransition: (callback: () => void) => void;
22
26
  }
23
27
 
24
28
  const sortByPredefinedOrder = (
@@ -78,16 +82,33 @@ const getComponentByWidgetType = (widgetType: string, facetKey: string) => {
78
82
  return COMPONENT_TYPES[widgetType] || COMPONENT_TYPES[WIDGET_TYPE.category];
79
83
  };
80
84
 
81
- export const FilterItem = ({ facet }: Props) => {
85
+ export const FilterItem = ({ facet, isPending, startTransition }: Props) => {
82
86
  const dispatch = useAppDispatch();
83
87
  const router = useRouter();
84
-
85
- const handleSelectFilter = (choice: FacetChoice) => {
86
- if (facet.key === 'category_ids') {
87
- router.push(choice.url);
88
- } else {
89
- dispatch(toggleFacet({ facet, choice }));
90
- }
88
+ const pathname = usePathname();
89
+
90
+ const [pendingChoice, setPendingChoice] = useState<string | null>(null);
91
+
92
+ const handleSelectFilter = ({
93
+ facet,
94
+ choice
95
+ }: {
96
+ facet: Facet;
97
+ choice: FacetChoice;
98
+ }) => {
99
+ setPendingChoice(choice.label);
100
+ startTransition(() => {
101
+ if (facet.key === 'category_ids') {
102
+ router.push(choice.url);
103
+ } else {
104
+ dispatch(toggleFacet({ facet, choice }));
105
+ }
106
+ setPendingChoice(null);
107
+
108
+ const urlSearchParams = new URLSearchParams(window.location.search);
109
+ urlSearchParams.delete(facet.search_key);
110
+ router.replace(pathname + '?' + urlSearchParams.toString());
111
+ });
91
112
  };
92
113
 
93
114
  const Component = getComponentByWidgetType(facet.widget_type, facet.key);
@@ -107,23 +128,34 @@ export const FilterItem = ({ facet }: Props) => {
107
128
  })}
108
129
  >
109
130
  {choices.map((choice, index) => (
110
- <Component
111
- key={choice.label}
112
- data={choice}
113
- name={facet.key}
114
- onChange={() => facet.key !== sizeKey && handleSelectFilter(choice)}
115
- onClick={() => facet.key === sizeKey && handleSelectFilter(choice)}
116
- checked={choice.is_selected}
117
- data-testid={`${choice.label.trim()}`}
118
- >
119
- {choice.label} (
120
- <span
121
- data-testid={`filter-count-${facet.name.toLowerCase()}-${index}`}
131
+ <div key={choice.label} className="relative">
132
+ <Component
133
+ key={choice.label}
134
+ data={choice}
135
+ name={facet.key}
136
+ onChange={() => handleSelectFilter({ facet, choice })}
137
+ onClick={() =>
138
+ facet.key === sizeKey && handleSelectFilter({ facet, choice })
139
+ }
140
+ checked={choice.is_selected}
141
+ data-testid={`${choice.label.trim()}`}
142
+ disabled={isPending}
122
143
  >
123
- {choice.quantity}
124
- </span>
125
- )
126
- </Component>
144
+ {choice.label} (
145
+ <span
146
+ data-testid={`filter-count-${facet.name.toLowerCase()}-${index}`}
147
+ >
148
+ {choice.quantity}
149
+ </span>
150
+ )
151
+ </Component>
152
+
153
+ {isPending && pendingChoice === choice.label && (
154
+ <div className="absolute inset-0 flex items-center justify-center z-50">
155
+ <LoaderSpinner />
156
+ </div>
157
+ )}
158
+ </div>
127
159
  ))}
128
160
  </div>
129
161
  </Accordion>
@@ -1,13 +1,12 @@
1
1
  'use client';
2
2
 
3
3
  import clsx from 'clsx';
4
-
5
4
  import { Button, Icon } from '@theme/components';
6
5
  import { useLocalization } from '@akinon/next/hooks';
7
6
  import { useAppDispatch, useAppSelector } from '@akinon/next/redux/hooks';
8
7
  import { resetSelectedFacets } from '@theme/redux/reducers/category';
9
8
  import CategoryActiveFilters from '@theme/views/category/category-active-filters';
10
- import { useMemo } from 'react';
9
+ import { useMemo, useState, useTransition } from 'react';
11
10
  import { FilterItem } from './filter-item';
12
11
 
13
12
  interface Props {
@@ -21,12 +20,11 @@ export const Filters = (props: Props) => {
21
20
  const { t } = useLocalization();
22
21
  const { isMenuOpen, setIsMenuOpen } = props;
23
22
 
23
+ const [isPending, startTransition] = useTransition();
24
+
24
25
  const haveFilter = useMemo(() => {
25
- return (
26
- facets.filter(
27
- (facet) =>
28
- facet.data.choices.filter((choice) => choice.is_selected).length > 0
29
- ).length > 0
26
+ return facets.some((facet) =>
27
+ facet.data.choices.some((choice) => choice.is_selected)
30
28
  );
31
29
  }, [facets]);
32
30
 
@@ -51,12 +49,22 @@ export const Filters = (props: Props) => {
51
49
  <span className="text-sm">1 {t('category.filters.results')}</span>
52
50
  <span>{t('category.filters.ready_to_wear')}</span>
53
51
  </div>
52
+
54
53
  {facets.map((facet) => {
55
- return <FilterItem key={facet.key} facet={facet} />;
54
+ return (
55
+ <FilterItem
56
+ key={facet.key}
57
+ facet={facet}
58
+ isPending={isPending}
59
+ startTransition={startTransition}
60
+ />
61
+ );
56
62
  })}
63
+
57
64
  <div className="lg:hidden">
58
65
  <CategoryActiveFilters />
59
66
  </div>
67
+
60
68
  {haveFilter && (
61
69
  <div className="lg:hidden">
62
70
  <Button
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akinon/projectzero",
3
- "version": "1.48.0-rc.2",
3
+ "version": "1.48.0-rc.3",
4
4
  "private": false,
5
5
  "description": "CLI tool to manage your Project Zero Next project",
6
6
  "bin": {