@wix/headless-stores 0.0.8 → 0.0.10

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 (105) hide show
  1. package/cjs/dist/react/BuyNow.d.ts +1 -0
  2. package/cjs/dist/react/BuyNow.js +1 -0
  3. package/cjs/dist/react/Category.d.ts +17 -0
  4. package/cjs/dist/react/Category.js +37 -0
  5. package/cjs/dist/react/Collection.d.ts +141 -0
  6. package/cjs/dist/react/Collection.js +198 -0
  7. package/cjs/dist/react/FilteredCollection.d.ts +65 -0
  8. package/cjs/dist/react/FilteredCollection.js +117 -0
  9. package/cjs/dist/react/PayNow.d.ts +1 -0
  10. package/cjs/dist/react/PayNow.js +1 -0
  11. package/cjs/dist/react/Product.d.ts +70 -0
  12. package/cjs/dist/react/Product.js +56 -0
  13. package/cjs/dist/react/ProductMediaGallery.d.ts +128 -0
  14. package/cjs/dist/react/ProductMediaGallery.js +100 -0
  15. package/cjs/dist/react/ProductModifiers.d.ts +156 -0
  16. package/cjs/dist/react/ProductModifiers.js +159 -0
  17. package/cjs/dist/react/ProductVariantSelector.d.ts +169 -0
  18. package/cjs/dist/react/ProductVariantSelector.js +166 -0
  19. package/cjs/dist/react/RelatedProducts.d.ts +60 -0
  20. package/cjs/dist/react/RelatedProducts.js +68 -0
  21. package/cjs/dist/react/SocialSharing.d.ts +119 -0
  22. package/cjs/dist/react/SocialSharing.js +80 -0
  23. package/cjs/dist/react/Sort.d.ts +17 -0
  24. package/cjs/dist/react/Sort.js +41 -0
  25. package/cjs/dist/react/index.d.ts +10 -0
  26. package/cjs/dist/react/index.js +33 -0
  27. package/cjs/dist/services/catalog-options-service.d.ts +30 -0
  28. package/cjs/dist/services/catalog-options-service.js +162 -0
  29. package/cjs/dist/services/catalog-price-range-service.d.ts +23 -0
  30. package/cjs/dist/services/catalog-price-range-service.js +95 -0
  31. package/cjs/dist/services/category-service.d.ts +25 -0
  32. package/cjs/dist/services/category-service.js +67 -0
  33. package/cjs/dist/services/collection-service.d.ts +37 -0
  34. package/cjs/dist/services/collection-service.js +454 -0
  35. package/cjs/dist/services/filter-service.d.ts +56 -0
  36. package/cjs/dist/services/filter-service.js +155 -0
  37. package/cjs/dist/services/product-media-gallery-service.d.ts +25 -0
  38. package/cjs/dist/services/product-media-gallery-service.js +105 -0
  39. package/cjs/dist/services/product-modifiers-service.d.ts +36 -0
  40. package/cjs/dist/services/product-modifiers-service.js +104 -0
  41. package/cjs/dist/services/product-service.d.ts +27 -0
  42. package/cjs/dist/services/product-service.js +51 -0
  43. package/cjs/dist/services/related-products-service.d.ts +25 -0
  44. package/cjs/dist/services/related-products-service.js +54 -0
  45. package/cjs/dist/services/selected-variant-service.d.ts +51 -0
  46. package/cjs/dist/services/selected-variant-service.js +396 -0
  47. package/cjs/dist/services/social-sharing-service.d.ts +41 -0
  48. package/cjs/dist/services/social-sharing-service.js +157 -0
  49. package/cjs/dist/services/sort-service.d.ts +19 -0
  50. package/cjs/dist/services/sort-service.js +37 -0
  51. package/cjs/dist/utils/url-params.d.ts +5 -0
  52. package/cjs/dist/utils/url-params.js +50 -0
  53. package/dist/react/BuyNow.d.ts +1 -0
  54. package/dist/react/BuyNow.js +1 -0
  55. package/dist/react/Category.d.ts +17 -0
  56. package/dist/react/Category.js +31 -0
  57. package/dist/react/Collection.d.ts +141 -0
  58. package/dist/react/Collection.js +190 -0
  59. package/dist/react/FilteredCollection.d.ts +65 -0
  60. package/dist/react/FilteredCollection.js +107 -0
  61. package/dist/react/PayNow.d.ts +1 -0
  62. package/dist/react/PayNow.js +1 -0
  63. package/dist/react/Product.d.ts +70 -0
  64. package/dist/react/Product.js +50 -0
  65. package/dist/react/ProductMediaGallery.d.ts +128 -0
  66. package/dist/react/ProductMediaGallery.js +92 -0
  67. package/dist/react/ProductModifiers.d.ts +156 -0
  68. package/dist/react/ProductModifiers.js +151 -0
  69. package/dist/react/ProductVariantSelector.d.ts +169 -0
  70. package/dist/react/ProductVariantSelector.js +157 -0
  71. package/dist/react/RelatedProducts.d.ts +60 -0
  72. package/dist/react/RelatedProducts.js +60 -0
  73. package/dist/react/SocialSharing.d.ts +119 -0
  74. package/dist/react/SocialSharing.js +71 -0
  75. package/dist/react/Sort.d.ts +17 -0
  76. package/dist/react/Sort.js +36 -0
  77. package/dist/react/index.d.ts +10 -0
  78. package/dist/react/index.js +10 -0
  79. package/dist/services/catalog-options-service.d.ts +30 -0
  80. package/dist/services/catalog-options-service.js +158 -0
  81. package/dist/services/catalog-price-range-service.d.ts +23 -0
  82. package/dist/services/catalog-price-range-service.js +91 -0
  83. package/dist/services/category-service.d.ts +25 -0
  84. package/dist/services/category-service.js +63 -0
  85. package/dist/services/collection-service.d.ts +37 -0
  86. package/dist/services/collection-service.js +417 -0
  87. package/dist/services/filter-service.d.ts +56 -0
  88. package/dist/services/filter-service.js +152 -0
  89. package/dist/services/product-media-gallery-service.d.ts +25 -0
  90. package/dist/services/product-media-gallery-service.js +101 -0
  91. package/dist/services/product-modifiers-service.d.ts +36 -0
  92. package/dist/services/product-modifiers-service.js +100 -0
  93. package/dist/services/product-service.d.ts +27 -0
  94. package/dist/services/product-service.js +47 -0
  95. package/dist/services/related-products-service.d.ts +25 -0
  96. package/dist/services/related-products-service.js +50 -0
  97. package/dist/services/selected-variant-service.d.ts +51 -0
  98. package/dist/services/selected-variant-service.js +392 -0
  99. package/dist/services/social-sharing-service.d.ts +41 -0
  100. package/dist/services/social-sharing-service.js +153 -0
  101. package/dist/services/sort-service.d.ts +19 -0
  102. package/dist/services/sort-service.js +34 -0
  103. package/dist/utils/url-params.d.ts +5 -0
  104. package/dist/utils/url-params.js +46 -0
  105. package/package.json +2 -1
@@ -0,0 +1,101 @@
1
+ import { defineService, implementService, } from "@wix/services-definitions";
2
+ import { SignalsServiceDefinition } from "@wix/services-definitions/core-services/signals";
3
+ import { SelectedVariantServiceDefinition } from "./selected-variant-service";
4
+ import { ProductServiceDefinition } from "./product-service";
5
+ export const ProductMediaGalleryServiceDefinition = defineService("productMediaGallery");
6
+ export const ProductMediaGalleryService = implementService.withConfig()(ProductMediaGalleryServiceDefinition, ({ getService }) => {
7
+ const signalsService = getService(SignalsServiceDefinition);
8
+ const selectedVariantService = getService(SelectedVariantServiceDefinition);
9
+ const productService = getService(ProductServiceDefinition);
10
+ const selectedImageIndex = signalsService.signal(0);
11
+ const relevantImages = signalsService.computed(() => {
12
+ const product = productService.product.get();
13
+ const selectedChoices = selectedVariantService.selectedChoices?.get() || {};
14
+ // Get images based on selected choices if available
15
+ let selectedChoicesImages = [];
16
+ Object.keys(selectedChoices).forEach((choiceKey) => {
17
+ const productOption = product?.options?.find((option) => option.name === choiceKey)?.choicesSettings?.choices?.find((choice) => choice.name === selectedChoices[choiceKey]);
18
+ if (productOption) {
19
+ selectedChoicesImages.push(...(productOption?.linkedMedia?.map((media) => media.image) || []));
20
+ }
21
+ });
22
+ if (selectedChoicesImages?.length) {
23
+ return selectedChoicesImages;
24
+ }
25
+ const productItemsImages = product?.media?.itemsInfo?.items?.map((item) => item.image).filter(Boolean);
26
+ if (productItemsImages?.length) {
27
+ return productItemsImages;
28
+ }
29
+ if (product?.media?.main) {
30
+ return [product.media.main.image];
31
+ }
32
+ return [];
33
+ });
34
+ const product = productService.product;
35
+ const isLoading = productService.isLoading;
36
+ const totalImages = signalsService.computed(() => {
37
+ return relevantImages.get().length;
38
+ });
39
+ const productName = signalsService.computed(() => {
40
+ const prod = productService.product.get();
41
+ return prod?.name || "Product";
42
+ });
43
+ const subscribeToVariantChanges = () => {
44
+ return selectedVariantService.selectedChoices.subscribe(() => {
45
+ selectedImageIndex.set(0);
46
+ });
47
+ };
48
+ subscribeToVariantChanges();
49
+ const setSelectedImageIndex = (index) => {
50
+ const images = relevantImages.get();
51
+ if (!images.length)
52
+ return;
53
+ const maxIndex = images.length - 1;
54
+ const validIndex = Math.max(0, Math.min(index, maxIndex));
55
+ selectedImageIndex.set(validIndex);
56
+ };
57
+ const nextImage = () => {
58
+ const images = relevantImages.get();
59
+ const currentIndex = selectedImageIndex.get();
60
+ if (!images.length)
61
+ return;
62
+ const nextIndex = currentIndex >= images.length - 1
63
+ ? 0
64
+ : currentIndex + 1;
65
+ selectedImageIndex.set(nextIndex);
66
+ };
67
+ const previousImage = () => {
68
+ const images = relevantImages.get();
69
+ const currentIndex = selectedImageIndex.get();
70
+ if (!images.length)
71
+ return;
72
+ const prevIndex = currentIndex <= 0
73
+ ? images.length - 1
74
+ : currentIndex - 1;
75
+ selectedImageIndex.set(prevIndex);
76
+ };
77
+ return {
78
+ selectedImageIndex,
79
+ relevantImages,
80
+ setSelectedImageIndex,
81
+ nextImage,
82
+ previousImage,
83
+ product,
84
+ isLoading,
85
+ totalImages,
86
+ productName,
87
+ };
88
+ });
89
+ export async function loadProductMediaGalleryServiceConfig(
90
+ // @ts-ignore
91
+ productSlug) {
92
+ try {
93
+ // No need to fetch product data here since this service depends on ProductServiceDefinition
94
+ // which already loads the product data. We just need to return an empty config.
95
+ return {};
96
+ }
97
+ catch (error) {
98
+ console.error("Failed to load product media gallery config:", error);
99
+ throw error;
100
+ }
101
+ }
@@ -0,0 +1,36 @@
1
+ import { type ServiceFactoryConfig } from "@wix/services-definitions";
2
+ import type { Signal, ReadOnlySignal } from "./Signal";
3
+ import { productsV3 } from "@wix/stores";
4
+ export interface ModifierValue {
5
+ modifierName: string;
6
+ choiceValue?: string;
7
+ freeTextValue?: string;
8
+ }
9
+ export interface ProductModifiersServiceAPI {
10
+ modifiers: ReadOnlySignal<productsV3.ConnectedModifier[]>;
11
+ selectedModifiers: Signal<Record<string, ModifierValue>>;
12
+ hasModifiers: ReadOnlySignal<boolean>;
13
+ isLoading: Signal<boolean>;
14
+ error: Signal<string | null>;
15
+ setModifierChoice: (modifierName: string, choiceValue: string) => void;
16
+ setModifierFreeText: (modifierName: string, freeTextValue: string) => void;
17
+ clearModifier: (modifierName: string) => void;
18
+ clearAllModifiers: () => void;
19
+ getModifierValue: (modifierName: string) => ModifierValue | null;
20
+ isModifierRequired: (modifierName: string) => boolean;
21
+ hasRequiredModifiers: () => boolean;
22
+ areAllRequiredModifiersFilled: () => boolean;
23
+ }
24
+ export declare const ProductModifiersServiceDefinition: string & {
25
+ __api: ProductModifiersServiceAPI;
26
+ __config: {};
27
+ isServiceDefinition?: boolean;
28
+ } & ProductModifiersServiceAPI;
29
+ export declare const ProductModifiersService: import("@wix/services-definitions").ServiceFactory<string & {
30
+ __api: ProductModifiersServiceAPI;
31
+ __config: {};
32
+ isServiceDefinition?: boolean;
33
+ } & ProductModifiersServiceAPI, {
34
+ product: productsV3.V3Product;
35
+ }, import("@wix/services-definitions").ThreadMode.MAIN>;
36
+ export declare function createProductModifiersServiceConfig(product: productsV3.V3Product): ServiceFactoryConfig<typeof ProductModifiersService>;
@@ -0,0 +1,100 @@
1
+ import { defineService, implementService, } from "@wix/services-definitions";
2
+ import { SignalsServiceDefinition } from "@wix/services-definitions/core-services/signals";
3
+ export const ProductModifiersServiceDefinition = defineService("productModifiers");
4
+ export const ProductModifiersService = implementService.withConfig()(ProductModifiersServiceDefinition, ({ getService, config }) => {
5
+ const signalsService = getService(SignalsServiceDefinition);
6
+ const configProduct = config.product;
7
+ const selectedModifiers = signalsService.signal({});
8
+ const isLoading = signalsService.signal(false);
9
+ const error = signalsService.signal(null);
10
+ // Extract modifiers from product
11
+ const modifiers = signalsService.computed(() => {
12
+ return (configProduct?.modifiers || []);
13
+ });
14
+ const hasModifiers = signalsService.computed(() => {
15
+ const mods = modifiers.get();
16
+ return mods.length > 0;
17
+ });
18
+ const setModifierChoice = (modifierName, choiceValue) => {
19
+ const current = selectedModifiers.get();
20
+ selectedModifiers.set({
21
+ ...current,
22
+ [modifierName]: {
23
+ modifierName,
24
+ choiceValue,
25
+ },
26
+ });
27
+ };
28
+ const setModifierFreeText = (modifierName, freeTextValue) => {
29
+ const current = selectedModifiers.get();
30
+ selectedModifiers.set({
31
+ ...current,
32
+ [modifierName]: {
33
+ modifierName,
34
+ freeTextValue,
35
+ },
36
+ });
37
+ };
38
+ const clearModifier = (modifierName) => {
39
+ const current = selectedModifiers.get();
40
+ const updated = { ...current };
41
+ delete updated[modifierName];
42
+ selectedModifiers.set(updated);
43
+ };
44
+ const clearAllModifiers = () => {
45
+ selectedModifiers.set({});
46
+ };
47
+ const getModifierValue = (modifierName) => {
48
+ const current = selectedModifiers.get();
49
+ return current[modifierName] || null;
50
+ };
51
+ const isModifierRequired = (modifierName) => {
52
+ const mods = modifiers.get();
53
+ const modifier = mods.find(m => m.name === modifierName);
54
+ return modifier?.mandatory || false;
55
+ };
56
+ const hasRequiredModifiers = () => {
57
+ const mods = modifiers.get();
58
+ return mods.some(m => m.mandatory);
59
+ };
60
+ const areAllRequiredModifiersFilled = () => {
61
+ const mods = modifiers.get();
62
+ const current = selectedModifiers.get();
63
+ return mods.every(modifier => {
64
+ if (!modifier.mandatory)
65
+ return true;
66
+ const selectedValue = current[modifier.name || ""];
67
+ if (!selectedValue)
68
+ return false;
69
+ // Check based on modifier type
70
+ const renderType = modifier.modifierRenderType;
71
+ if (renderType === "SWATCH_CHOICES" || renderType === "TEXT_CHOICES") {
72
+ return !!selectedValue.choiceValue;
73
+ }
74
+ else if (renderType === "FREE_TEXT") {
75
+ return !!selectedValue.freeTextValue && selectedValue.freeTextValue.trim() !== "";
76
+ }
77
+ return false;
78
+ });
79
+ };
80
+ return {
81
+ modifiers,
82
+ selectedModifiers,
83
+ hasModifiers,
84
+ isLoading,
85
+ error,
86
+ setModifierChoice,
87
+ setModifierFreeText,
88
+ clearModifier,
89
+ clearAllModifiers,
90
+ getModifierValue,
91
+ isModifierRequired,
92
+ hasRequiredModifiers,
93
+ areAllRequiredModifiersFilled,
94
+ };
95
+ });
96
+ export function createProductModifiersServiceConfig(product) {
97
+ return {
98
+ product,
99
+ };
100
+ }
@@ -0,0 +1,27 @@
1
+ import { type ServiceFactoryConfig } from "@wix/services-definitions";
2
+ import type { Signal } from "./Signal";
3
+ import { productsV3 } from "@wix/stores";
4
+ export interface ProductServiceAPI {
5
+ product: Signal<productsV3.V3Product | null>;
6
+ isLoading: Signal<boolean>;
7
+ error: Signal<string | null>;
8
+ }
9
+ export declare const ProductServiceDefinition: string & {
10
+ __api: ProductServiceAPI;
11
+ __config: {};
12
+ isServiceDefinition?: boolean;
13
+ } & ProductServiceAPI;
14
+ export declare const ProductService: import("@wix/services-definitions").ServiceFactory<string & {
15
+ __api: ProductServiceAPI;
16
+ __config: {};
17
+ isServiceDefinition?: boolean;
18
+ } & ProductServiceAPI, {
19
+ product: productsV3.V3Product;
20
+ }, import("@wix/services-definitions").ThreadMode.MAIN>;
21
+ export type ProductServiceConfigResult = {
22
+ type: "success";
23
+ config: ServiceFactoryConfig<typeof ProductService>;
24
+ } | {
25
+ type: "notFound";
26
+ };
27
+ export declare function loadProductServiceConfig(productSlug: string): Promise<ProductServiceConfigResult>;
@@ -0,0 +1,47 @@
1
+ import { defineService, implementService, } from "@wix/services-definitions";
2
+ import { SignalsServiceDefinition } from "@wix/services-definitions/core-services/signals";
3
+ import { productsV3 } from "@wix/stores";
4
+ export const ProductServiceDefinition = defineService("product");
5
+ export const ProductService = implementService.withConfig()(ProductServiceDefinition, ({ getService, config }) => {
6
+ const signalsService = getService(SignalsServiceDefinition);
7
+ const product = signalsService.signal(config.product);
8
+ const isLoading = signalsService.signal(false);
9
+ const error = signalsService.signal(null);
10
+ return {
11
+ product,
12
+ isLoading,
13
+ error,
14
+ };
15
+ });
16
+ export async function loadProductServiceConfig(productSlug) {
17
+ try {
18
+ // Use getProductBySlug directly - single API call with comprehensive fields
19
+ const productResponse = await productsV3.getProductBySlug(productSlug, {
20
+ fields: [
21
+ "DESCRIPTION",
22
+ "DIRECT_CATEGORIES_INFO",
23
+ "BREADCRUMBS_INFO",
24
+ "INFO_SECTION",
25
+ "MEDIA_ITEMS_INFO",
26
+ "PLAIN_DESCRIPTION",
27
+ "THUMBNAIL",
28
+ "URL",
29
+ "VARIANT_OPTION_CHOICE_NAMES",
30
+ "WEIGHT_MEASUREMENT_UNIT_INFO",
31
+ ],
32
+ });
33
+ if (!productResponse.product) {
34
+ return { type: "notFound" };
35
+ }
36
+ return {
37
+ type: "success",
38
+ config: {
39
+ product: productResponse.product,
40
+ },
41
+ };
42
+ }
43
+ catch (error) {
44
+ console.error(`Failed to load product for slug "${productSlug}":`, error);
45
+ return { type: "notFound" };
46
+ }
47
+ }
@@ -0,0 +1,25 @@
1
+ import { type ServiceFactoryConfig } from "@wix/services-definitions";
2
+ import type { Signal } from "./Signal";
3
+ import { productsV3 } from "@wix/stores";
4
+ export interface RelatedProductsServiceAPI {
5
+ relatedProducts: Signal<productsV3.V3Product[]>;
6
+ isLoading: Signal<boolean>;
7
+ error: Signal<string | null>;
8
+ hasRelatedProducts: Signal<boolean>;
9
+ loadRelatedProducts: (productId: string, limit?: number) => Promise<void>;
10
+ refreshRelatedProducts: () => Promise<void>;
11
+ }
12
+ export declare const RelatedProductsServiceDefinition: string & {
13
+ __api: RelatedProductsServiceAPI;
14
+ __config: {};
15
+ isServiceDefinition?: boolean;
16
+ } & RelatedProductsServiceAPI;
17
+ export declare const RelatedProductsService: import("@wix/services-definitions").ServiceFactory<string & {
18
+ __api: RelatedProductsServiceAPI;
19
+ __config: {};
20
+ isServiceDefinition?: boolean;
21
+ } & RelatedProductsServiceAPI, {
22
+ productId: string;
23
+ limit?: number;
24
+ }, import("@wix/services-definitions").ThreadMode.MAIN>;
25
+ export declare function loadRelatedProductsServiceConfig(productId: string, limit?: number): Promise<ServiceFactoryConfig<typeof RelatedProductsService>>;
@@ -0,0 +1,50 @@
1
+ import { defineService, implementService, } from "@wix/services-definitions";
2
+ import { SignalsServiceDefinition } from "@wix/services-definitions/core-services/signals";
3
+ import { productsV3 } from "@wix/stores";
4
+ export const RelatedProductsServiceDefinition = defineService("relatedProducts");
5
+ export const RelatedProductsService = implementService.withConfig()(RelatedProductsServiceDefinition, ({ getService, config }) => {
6
+ const signalsService = getService(SignalsServiceDefinition);
7
+ const relatedProducts = signalsService.signal([]);
8
+ const isLoading = signalsService.signal(false);
9
+ const error = signalsService.signal(null);
10
+ const hasRelatedProducts = signalsService.signal(false);
11
+ const loadRelatedProducts = async (productId, limit = 4) => {
12
+ isLoading.set(true);
13
+ error.set(null);
14
+ try {
15
+ let relatedQuery = productsV3.queryProducts().ne("_id", productId);
16
+ const relatedResult = await relatedQuery.limit(limit).find();
17
+ relatedProducts.set(relatedResult.items || []);
18
+ hasRelatedProducts.set((relatedResult.items || []).length > 0);
19
+ }
20
+ catch (err) {
21
+ const errorMessage = err instanceof Error ? err.message : "Failed to load related products";
22
+ error.set(errorMessage);
23
+ relatedProducts.set([]);
24
+ hasRelatedProducts.set(false);
25
+ }
26
+ finally {
27
+ isLoading.set(false);
28
+ }
29
+ };
30
+ const refreshRelatedProducts = async () => {
31
+ await loadRelatedProducts(config.productId, config.limit);
32
+ };
33
+ if (config.productId) {
34
+ loadRelatedProducts(config.productId, config.limit);
35
+ }
36
+ return {
37
+ relatedProducts,
38
+ isLoading,
39
+ error,
40
+ hasRelatedProducts,
41
+ loadRelatedProducts,
42
+ refreshRelatedProducts,
43
+ };
44
+ });
45
+ export async function loadRelatedProductsServiceConfig(productId, limit = 4) {
46
+ return {
47
+ productId,
48
+ limit,
49
+ };
50
+ }
@@ -0,0 +1,51 @@
1
+ import { type ServiceFactoryConfig } from "@wix/services-definitions";
2
+ import type { Signal, ReadOnlySignal } from "./Signal";
3
+ import { productsV3 } from "@wix/stores";
4
+ export interface SelectedVariantServiceAPI {
5
+ selectedChoices: Signal<Record<string, string>>;
6
+ selectedVariantId: ReadOnlySignal<string | null>;
7
+ currentVariant: ReadOnlySignal<productsV3.Variant | null>;
8
+ currentPrice: ReadOnlySignal<string>;
9
+ currentCompareAtPrice: ReadOnlySignal<string | null>;
10
+ isInStock: ReadOnlySignal<boolean>;
11
+ isPreOrderEnabled: ReadOnlySignal<boolean>;
12
+ isLoading: Signal<boolean>;
13
+ error: Signal<string | null>;
14
+ variants: Signal<productsV3.Variant[]>;
15
+ options: Signal<Record<string, string[]>>;
16
+ basePrice: Signal<number>;
17
+ discountPrice: Signal<number | null>;
18
+ isOnSale: Signal<boolean | null>;
19
+ quantityAvailable: Signal<number>;
20
+ productId: Signal<string>;
21
+ sku: Signal<string>;
22
+ ribbonLabel: Signal<string | null>;
23
+ product: ReadOnlySignal<productsV3.V3Product | null>;
24
+ productOptions: ReadOnlySignal<productsV3.ConnectedOption[]>;
25
+ currency: ReadOnlySignal<string>;
26
+ selectedVariant: () => productsV3.Variant | null;
27
+ finalPrice: () => number;
28
+ isLowStock: (threshold?: number) => boolean;
29
+ setSelectedChoices: (choices: Record<string, string>) => void;
30
+ addToCart: (quantity?: number, modifiers?: Record<string, any>) => Promise<void>;
31
+ setOption: (group: string, value: string) => void;
32
+ selectVariantById: (id: string) => void;
33
+ loadProductVariants: (data: productsV3.Variant[]) => void;
34
+ resetSelections: () => void;
35
+ getAvailableChoicesForOption: (optionName: string) => string[];
36
+ isChoiceAvailable: (optionName: string, choiceValue: string) => boolean;
37
+ hasAnySelections: () => boolean;
38
+ }
39
+ export declare const SelectedVariantServiceDefinition: string & {
40
+ __api: SelectedVariantServiceAPI;
41
+ __config: {};
42
+ isServiceDefinition?: boolean;
43
+ } & SelectedVariantServiceAPI;
44
+ export declare const SelectedVariantService: import("@wix/services-definitions").ServiceFactory<string & {
45
+ __api: SelectedVariantServiceAPI;
46
+ __config: {};
47
+ isServiceDefinition?: boolean;
48
+ } & SelectedVariantServiceAPI, {
49
+ product: productsV3.V3Product;
50
+ }, import("@wix/services-definitions").ThreadMode.MAIN>;
51
+ export declare function loadSelectedVariantServiceConfig(productSlug: string): Promise<ServiceFactoryConfig<typeof SelectedVariantService>>;