@akinon/projectzero 1.108.0-rc.87 → 1.108.0-rc.9
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 +24 -228
- package/app-template/.env.example +1 -0
- package/app-template/CHANGELOG.md +576 -4915
- package/app-template/package.json +26 -21
- package/app-template/public/locales/en/account.json +3 -1
- package/app-template/public/locales/en/product.json +23 -1
- package/app-template/public/locales/tr/account.json +3 -1
- package/app-template/public/locales/tr/product.json +22 -0
- package/app-template/src/app/[commerce]/[locale]/[currency]/account/orders/[id]/page.tsx +20 -1
- package/app-template/src/app/[commerce]/[locale]/[currency]/basket/page.tsx +82 -9
- package/app-template/src/app/[commerce]/[locale]/[currency]/landing-page/[pk]/page.tsx +1 -12
- package/app-template/src/app/api/virtual-try-on/limited-categories/route.ts +1 -0
- package/app-template/src/app/api/virtual-try-on/route.ts +1 -0
- package/app-template/src/assets/fonts/pz-icon.css +0 -3
- package/app-template/src/components/input.tsx +1 -2
- package/app-template/src/components/modal.tsx +2 -0
- package/app-template/src/components/select.tsx +1 -1
- package/app-template/src/plugins.js +6 -1
- package/app-template/src/settings.js +1 -6
- package/app-template/src/views/account/orders/order-detail-header.tsx +1 -1
- package/app-template/src/views/basket/basket-item.tsx +13 -16
- package/app-template/src/views/basket/summary.tsx +7 -10
- package/app-template/src/views/checkout/steps/shipping/address-box.tsx +30 -17
- package/app-template/src/views/checkout/steps/shipping/addresses.tsx +1 -1
- package/app-template/src/views/guest-login/index.tsx +1 -6
- package/app-template/src/views/header/search/index.tsx +10 -1
- package/app-template/src/views/product/layout.tsx +15 -1
- package/app-template/src/views/product/product-info.tsx +8 -0
- package/commands/plugins.ts +14 -29
- package/dist/commands/plugins.js +14 -23
- package/package.json +1 -1
- package/app-template/src/app/[commerce]/[locale]/[currency]/product/[pk]/loading.tsx +0 -67
- package/app-template/src/views/basket/basket-content.tsx +0 -106
|
@@ -87,7 +87,16 @@ export default function Search() {
|
|
|
87
87
|
ref={inputRef}
|
|
88
88
|
/>
|
|
89
89
|
|
|
90
|
-
<PluginModule
|
|
90
|
+
<PluginModule
|
|
91
|
+
component={Component.HeaderImageSearchFeature}
|
|
92
|
+
props={{
|
|
93
|
+
settings: {
|
|
94
|
+
customStyles: {
|
|
95
|
+
controlsInner: 'bg-red-500'
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}}
|
|
99
|
+
/>
|
|
91
100
|
|
|
92
101
|
<Icon
|
|
93
102
|
name="close"
|
|
@@ -22,6 +22,16 @@ export default async function ProductLayout({
|
|
|
22
22
|
breadcrumbData,
|
|
23
23
|
children
|
|
24
24
|
}: ProductPageProps) {
|
|
25
|
+
const categoryIds = breadcrumbData
|
|
26
|
+
?.map((item) => item.extra_context?.attributes?.category_id)
|
|
27
|
+
.filter(Boolean)
|
|
28
|
+
.join(',');
|
|
29
|
+
|
|
30
|
+
const categoryPaths = breadcrumbData
|
|
31
|
+
?.map((item) => item.path)
|
|
32
|
+
.filter(Boolean)
|
|
33
|
+
.join(',');
|
|
34
|
+
|
|
25
35
|
return (
|
|
26
36
|
<div className="container mx-auto">
|
|
27
37
|
<div className="max-w-5xl mx-auto my-5 px-7">
|
|
@@ -31,7 +41,11 @@ export default async function ProductLayout({
|
|
|
31
41
|
<div className="col-span-5 lg:col-span-3">
|
|
32
42
|
<ProductInfoSlider product={data.product} />
|
|
33
43
|
</div>
|
|
34
|
-
<div
|
|
44
|
+
<div
|
|
45
|
+
className="flex flex-col items-center col-span-5 lg:col-span-2"
|
|
46
|
+
data-category-ids={categoryIds}
|
|
47
|
+
data-category-paths={categoryPaths}
|
|
48
|
+
>
|
|
35
49
|
<div className="w-full">{children}</div>
|
|
36
50
|
</div>
|
|
37
51
|
</div>
|
|
@@ -13,6 +13,7 @@ import { useStockAlert } from '../../hooks/use-stock-alert';
|
|
|
13
13
|
import { ProductVariants } from './product-variants';
|
|
14
14
|
import { ProductActions } from './product-actions';
|
|
15
15
|
import { ProductShare } from './product-share';
|
|
16
|
+
import PluginModule, { Component } from '@akinon/next/components/plugin-module';
|
|
16
17
|
|
|
17
18
|
export default function ProductInfo({ data }: ProductPageProps) {
|
|
18
19
|
const { data: session } = useSession();
|
|
@@ -105,6 +106,13 @@ export default function ProductInfo({ data }: ProductPageProps) {
|
|
|
105
106
|
onCloseModal={closeModal}
|
|
106
107
|
/>
|
|
107
108
|
|
|
109
|
+
<PluginModule
|
|
110
|
+
component={Component.VirtualTryOnPlugin}
|
|
111
|
+
props={{
|
|
112
|
+
product: data.product
|
|
113
|
+
}}
|
|
114
|
+
/>
|
|
115
|
+
|
|
108
116
|
<MiscButtons
|
|
109
117
|
productName={data.product.name}
|
|
110
118
|
productPk={data.product.pk}
|
package/commands/plugins.ts
CHANGED
|
@@ -29,14 +29,7 @@ async function checkVersion(pkg: PackageJson) {
|
|
|
29
29
|
|
|
30
30
|
if (!semver.satisfies(pkg.dependencies['@akinon/next'], latestVersion)) {
|
|
31
31
|
console.warn(
|
|
32
|
-
`\x1b[
|
|
33
|
-
`\x1b[41m version ${pkg.dependencies['@akinon/next']}`,
|
|
34
|
-
`\x1b[43m Please upgrade it to the latest version (${latestVersion}) to ensure plugin compatibility.`,
|
|
35
|
-
'\x1b[0m\n'
|
|
36
|
-
);
|
|
37
|
-
} else {
|
|
38
|
-
console.log(
|
|
39
|
-
`\x1b[42m Info: The package "${packageName}" is currently in the current version (${latestVersion}).`,
|
|
32
|
+
`\x1b[43mWarning: The "${packageName}" package is currently at version ${pkg.dependencies['@akinon/next']}. Please upgrade it to the latest version (${latestVersion}) to ensure plugin compatibility.`,
|
|
40
33
|
'\x1b[0m\n'
|
|
41
34
|
);
|
|
42
35
|
}
|
|
@@ -61,27 +54,7 @@ export default async () => {
|
|
|
61
54
|
}
|
|
62
55
|
}
|
|
63
56
|
|
|
64
|
-
|
|
65
|
-
const packageJsonPaths = [
|
|
66
|
-
path.resolve(rootDir, './package.json'),
|
|
67
|
-
path.resolve(rootDir, './apps/projectzeronext/package.json')
|
|
68
|
-
];
|
|
69
|
-
|
|
70
|
-
for (const packageJsonPath of packageJsonPaths) {
|
|
71
|
-
try {
|
|
72
|
-
const pkg = require(packageJsonPath);
|
|
73
|
-
if (pkg.dependencies['@akinon/next']) {
|
|
74
|
-
return pkg;
|
|
75
|
-
}
|
|
76
|
-
} catch (error) {
|
|
77
|
-
continue;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
throw new Error('Could not find package.json with @akinon/next dependency');
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const pkg = findPackageJson();
|
|
57
|
+
const pkg: PackageJson = require(path.resolve(rootDir, './package.json'));
|
|
85
58
|
await checkVersion(pkg);
|
|
86
59
|
|
|
87
60
|
const pluginsFilePath = findPluginsFilePath();
|
|
@@ -164,6 +137,10 @@ export default async () => {
|
|
|
164
137
|
name: 'Tamara Payment Extension',
|
|
165
138
|
value: 'pz-tamara-extension'
|
|
166
139
|
},
|
|
140
|
+
{
|
|
141
|
+
name: 'Similar Products',
|
|
142
|
+
value: 'pz-similar-products'
|
|
143
|
+
},
|
|
167
144
|
{
|
|
168
145
|
name: 'Hepsipay',
|
|
169
146
|
value: 'pz-hepsipay'
|
|
@@ -171,6 +148,14 @@ export default async () => {
|
|
|
171
148
|
{
|
|
172
149
|
name: 'Flow Payment',
|
|
173
150
|
value: 'pz-flow-payment'
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
name: 'Virtual Try-On',
|
|
154
|
+
value: 'pz-virtual-try-on'
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
name: 'CyberSource UC',
|
|
158
|
+
value: 'pz-cybersource-uc'
|
|
174
159
|
}
|
|
175
160
|
];
|
|
176
161
|
|
package/dist/commands/plugins.js
CHANGED
|
@@ -50,10 +50,7 @@ function checkVersion(pkg) {
|
|
|
50
50
|
const pkgInfo = (yield response.json());
|
|
51
51
|
const latestVersion = pkgInfo['dist-tags'].latest;
|
|
52
52
|
if (!semver_1.default.satisfies(pkg.dependencies['@akinon/next'], latestVersion)) {
|
|
53
|
-
console.warn(`\x1b[
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
console.log(`\x1b[42m Info: The package "${packageName}" is currently in the current version (${latestVersion}).`, '\x1b[0m\n');
|
|
53
|
+
console.warn(`\x1b[43mWarning: The "${packageName}" package is currently at version ${pkg.dependencies['@akinon/next']}. Please upgrade it to the latest version (${latestVersion}) to ensure plugin compatibility.`, '\x1b[0m\n');
|
|
57
54
|
}
|
|
58
55
|
}
|
|
59
56
|
catch (error) {
|
|
@@ -75,25 +72,7 @@ exports.default = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
75
72
|
throw new Error('plugins.js was not found in either of the expected locations.');
|
|
76
73
|
}
|
|
77
74
|
}
|
|
78
|
-
|
|
79
|
-
const packageJsonPaths = [
|
|
80
|
-
path_1.default.resolve(rootDir, './package.json'),
|
|
81
|
-
path_1.default.resolve(rootDir, './apps/projectzeronext/package.json')
|
|
82
|
-
];
|
|
83
|
-
for (const packageJsonPath of packageJsonPaths) {
|
|
84
|
-
try {
|
|
85
|
-
const pkg = require(packageJsonPath);
|
|
86
|
-
if (pkg.dependencies['@akinon/next']) {
|
|
87
|
-
return pkg;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
catch (error) {
|
|
91
|
-
continue;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
throw new Error('Could not find package.json with @akinon/next dependency');
|
|
95
|
-
}
|
|
96
|
-
const pkg = findPackageJson();
|
|
75
|
+
const pkg = require(path_1.default.resolve(rootDir, './package.json'));
|
|
97
76
|
yield checkVersion(pkg);
|
|
98
77
|
const pluginsFilePath = findPluginsFilePath();
|
|
99
78
|
let installedPlugins = [];
|
|
@@ -173,6 +152,10 @@ exports.default = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
173
152
|
name: 'Tamara Payment Extension',
|
|
174
153
|
value: 'pz-tamara-extension'
|
|
175
154
|
},
|
|
155
|
+
{
|
|
156
|
+
name: 'Similar Products',
|
|
157
|
+
value: 'pz-similar-products'
|
|
158
|
+
},
|
|
176
159
|
{
|
|
177
160
|
name: 'Hepsipay',
|
|
178
161
|
value: 'pz-hepsipay'
|
|
@@ -180,6 +163,14 @@ exports.default = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
180
163
|
{
|
|
181
164
|
name: 'Flow Payment',
|
|
182
165
|
value: 'pz-flow-payment'
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
name: 'Virtual Try-On',
|
|
169
|
+
value: 'pz-virtual-try-on'
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
name: 'CyberSource UC',
|
|
173
|
+
value: 'pz-cybersource-uc'
|
|
183
174
|
}
|
|
184
175
|
];
|
|
185
176
|
try {
|
package/package.json
CHANGED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { Skeleton, SkeletonWrapper } from 'components';
|
|
2
|
-
|
|
3
|
-
export default function Loading() {
|
|
4
|
-
return (
|
|
5
|
-
<div className="container mx-auto">
|
|
6
|
-
<div className="max-w-5xl mx-auto my-5 px-7">
|
|
7
|
-
<SkeletonWrapper className="md:mb-7">
|
|
8
|
-
<Skeleton className="w-[17.25rem] h-4 lg:w-64" />
|
|
9
|
-
</SkeletonWrapper>
|
|
10
|
-
</div>
|
|
11
|
-
<div className="grid max-w-5xl grid-cols-2 lg:gap-8 mx-auto px-7">
|
|
12
|
-
<div className="col-span-2 mb-7 md:mb-0 lg:col-span-1">
|
|
13
|
-
<div className="flex gap-1">
|
|
14
|
-
<SkeletonWrapper className="hidden md:block md:mb-7">
|
|
15
|
-
{Array(5)
|
|
16
|
-
.fill(null)
|
|
17
|
-
.map((_, index) => (
|
|
18
|
-
<Skeleton key={index} className="w-20 h-24 mb-2" />
|
|
19
|
-
))}
|
|
20
|
-
</SkeletonWrapper>
|
|
21
|
-
|
|
22
|
-
<div className="flex-1">
|
|
23
|
-
<SkeletonWrapper className="md:mb-7">
|
|
24
|
-
<Skeleton className="w-full h-[30.375rem] md:h-[36.375rem]" />
|
|
25
|
-
</SkeletonWrapper>
|
|
26
|
-
</div>
|
|
27
|
-
</div>
|
|
28
|
-
</div>
|
|
29
|
-
<div className="flex flex-col items-center col-span-2 lg:col-span-1">
|
|
30
|
-
<div className="w-full">
|
|
31
|
-
<SkeletonWrapper className="w-full md:mb-7 flex justify-center items-center">
|
|
32
|
-
<Skeleton className="w-96 h-16 mb-9" />
|
|
33
|
-
<Skeleton className="hidden w-36 h-14 mb-9 md:block" />
|
|
34
|
-
|
|
35
|
-
<div className="flex flex-col justify-center items-center mb-9">
|
|
36
|
-
<Skeleton className="w-36 h-4 mb-2" />
|
|
37
|
-
<div className="flex items-center gap-2">
|
|
38
|
-
{Array(3)
|
|
39
|
-
.fill(null)
|
|
40
|
-
.map((_, index) => (
|
|
41
|
-
<Skeleton key={index} className="w-24 h-10" />
|
|
42
|
-
))}
|
|
43
|
-
</div>
|
|
44
|
-
</div>
|
|
45
|
-
|
|
46
|
-
<div className="flex flex-col justify-center items-center mb-4">
|
|
47
|
-
<Skeleton className="w-36 h-4 mb-2" />
|
|
48
|
-
<div className="flex items-center gap-2">
|
|
49
|
-
{Array(5)
|
|
50
|
-
.fill(null)
|
|
51
|
-
.map((_, index) => (
|
|
52
|
-
<Skeleton key={index} className="w-11 h-11" />
|
|
53
|
-
))}
|
|
54
|
-
</div>
|
|
55
|
-
</div>
|
|
56
|
-
|
|
57
|
-
<Skeleton className="hidden w-full h-14 mb-6 md:block" />
|
|
58
|
-
<Skeleton className="w-40 h-10 mb-9 md:w-72" />
|
|
59
|
-
<Skeleton className="w-24 h-10 mb-7" />
|
|
60
|
-
<Skeleton className="w-full h-36" />
|
|
61
|
-
</SkeletonWrapper>
|
|
62
|
-
</div>
|
|
63
|
-
</div>
|
|
64
|
-
</div>
|
|
65
|
-
</div>
|
|
66
|
-
);
|
|
67
|
-
}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { useLocalization } from '@akinon/next/hooks';
|
|
4
|
-
import { Basket } from '@akinon/next/types';
|
|
5
|
-
import { Button, LoaderSpinner, Link } from '@theme/components';
|
|
6
|
-
import { BasketItem, Summary } from '@theme/views/basket';
|
|
7
|
-
import { ROUTES } from '@theme/routes';
|
|
8
|
-
import PluginModule, { Component } from '@akinon/next/components/plugin-module';
|
|
9
|
-
import { useEffect, useState } from 'react';
|
|
10
|
-
import { pushCartView } from '@theme/utils/gtm';
|
|
11
|
-
|
|
12
|
-
interface BasketContentProps {
|
|
13
|
-
initialBasket: Basket;
|
|
14
|
-
multiBasket: boolean;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export function BasketContent({
|
|
18
|
-
initialBasket,
|
|
19
|
-
multiBasket
|
|
20
|
-
}: BasketContentProps) {
|
|
21
|
-
const { t } = useLocalization();
|
|
22
|
-
const [basket, setBasket] = useState<Basket>(initialBasket);
|
|
23
|
-
|
|
24
|
-
useEffect(() => {
|
|
25
|
-
if (basket) {
|
|
26
|
-
const products = basket.basketitem_set.map((basketItem) => ({
|
|
27
|
-
...basketItem.product
|
|
28
|
-
}));
|
|
29
|
-
pushCartView(products);
|
|
30
|
-
}
|
|
31
|
-
}, [basket]);
|
|
32
|
-
|
|
33
|
-
const handleBasketUpdate = (updatedBasket: Basket) => {
|
|
34
|
-
setBasket(updatedBasket);
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
if (!basket) {
|
|
38
|
-
return (
|
|
39
|
-
<div className="flex justify-center w-full">
|
|
40
|
-
<LoaderSpinner />
|
|
41
|
-
</div>
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
return (
|
|
46
|
-
<div className="max-w-screen-xl p-4 flex flex-col text-primary-800 lg:p-8 xl:flex-row xl:mx-auto">
|
|
47
|
-
{basket.basketitem_set && basket.basketitem_set.length > 0 ? (
|
|
48
|
-
<>
|
|
49
|
-
<div className="flex-1 xl:mr-16">
|
|
50
|
-
<div className="flex items-center justify-between py-2 border-b border-gray-200 lg:py-3">
|
|
51
|
-
<h2 className="text-xl lg:text-2xl font-light">
|
|
52
|
-
{t('basket.my_cart')}
|
|
53
|
-
</h2>
|
|
54
|
-
<Link
|
|
55
|
-
href={ROUTES.HOME}
|
|
56
|
-
className="text-xs hover:text-secondary-500"
|
|
57
|
-
>
|
|
58
|
-
{t('basket.back_to_shopping')}
|
|
59
|
-
</Link>
|
|
60
|
-
</div>
|
|
61
|
-
<ul>
|
|
62
|
-
{multiBasket ? (
|
|
63
|
-
<PluginModule
|
|
64
|
-
component={Component.MultiBasket}
|
|
65
|
-
props={{
|
|
66
|
-
BasketItem,
|
|
67
|
-
onBasketUpdate: handleBasketUpdate
|
|
68
|
-
}}
|
|
69
|
-
/>
|
|
70
|
-
) : (
|
|
71
|
-
basket.basketitem_set.map((basketItem, index) => (
|
|
72
|
-
<BasketItem
|
|
73
|
-
key={index}
|
|
74
|
-
basketItem={basketItem}
|
|
75
|
-
onBasketUpdate={handleBasketUpdate}
|
|
76
|
-
/>
|
|
77
|
-
))
|
|
78
|
-
)}
|
|
79
|
-
</ul>
|
|
80
|
-
</div>
|
|
81
|
-
<Summary basket={basket} onBasketUpdate={handleBasketUpdate} />
|
|
82
|
-
</>
|
|
83
|
-
) : (
|
|
84
|
-
<div className="flex flex-col items-center container max-w-screen-sm py-4 px-4 xs:py-6 xs:px-6 sm:py-8 sm:px-8 lg:max-w-screen-xl">
|
|
85
|
-
<h1
|
|
86
|
-
className="w-full text-xl font-light text-secondary text-center sm:text-2xl"
|
|
87
|
-
data-testid="basket-empty"
|
|
88
|
-
>
|
|
89
|
-
{t('basket.empty.title')}
|
|
90
|
-
</h1>
|
|
91
|
-
|
|
92
|
-
<div className="w-full text-sm text-black-800 text-center my-4 mb-2 sm:text-base">
|
|
93
|
-
<p>{t('basket.empty.content_first')}</p>
|
|
94
|
-
<p>{t('basket.empty.content_second')}.</p>
|
|
95
|
-
</div>
|
|
96
|
-
|
|
97
|
-
<Link href={ROUTES.HOME} passHref>
|
|
98
|
-
<Button className="px-10 mt-2" appearance="filled">
|
|
99
|
-
{t('basket.empty.button')}
|
|
100
|
-
</Button>
|
|
101
|
-
</Link>
|
|
102
|
-
</div>
|
|
103
|
-
)}
|
|
104
|
-
</div>
|
|
105
|
-
);
|
|
106
|
-
}
|