ov25-ui
Version:
A UI configurator for OV25 product visualization
230 lines (229 loc) • 7.16 kB
TypeScript
import React from 'react';
export type DrawerSizes = 'closed' | 'small' | 'large';
export type AnimationState = 'unavailable' | 'open' | 'close' | 'loop' | 'stop';
export interface ProductFilters {
[optionName: string]: {
[filterKey: string]: Array<{
value: string;
checked: boolean;
}>;
};
}
export interface Product {
id: string;
name: string;
price: number;
discount: number;
lowestPrice: number;
metadata: any;
}
export interface Selection {
id: string;
name: string;
thumbnail?: string;
miniThumbnails?: {
small: string;
medium: string;
large: string;
};
price: number;
blurHash: string;
groupId?: string;
filter?: {
[key: string]: string[];
};
swatch?: Swatch;
}
export interface Group {
id: string;
name: string;
selections: Selection[];
}
export interface Option {
id: string;
name: string;
groups: Group[];
hasNonOption?: boolean;
}
export interface ConfiguratorState {
options: Option[];
selectedSelections: Array<{
optionId: string;
groupId: string;
selectionId: string;
}>;
configuratorSettings: {
swatchSettings: SwatchRulesData;
availableProductFilters: {
[key: string]: string[];
};
};
}
export interface SizeOption {
id: 'size';
name: 'size';
groups: [
{
id: 'size-group';
name: 'Size Options';
selections: Array<{
id: string;
name: string;
price: number;
thumbnail?: string;
}>;
}
];
hasNonOption?: boolean;
}
export interface Discount {
percentage: number;
amount: number;
formattedAmount: string;
}
export interface Swatch {
name: string;
option: string;
manufacturerId: string;
description: string;
thumbnail: {
blurHash: string;
thumbnail: string;
miniThumbnails: {
large: string;
medium: string;
small: string;
};
};
}
export type SwatchRulesData = {
freeSwatchLimit: number;
canExeedFreeLimit: boolean;
pricePerSwatch: number;
minSwatches: number;
maxSwatches: number;
enabled: boolean;
};
interface OV25UIContextType {
shadowDOMs?: {
mobileDrawer?: ShadowRoot;
configuratorViewControls?: ShadowRoot;
popoverPortal?: ShadowRoot;
swatchbookPortal?: ShadowRoot;
};
products: Product[];
currentProductId?: string;
configuratorState?: ConfiguratorState;
selectedSelections: Array<{
optionId: string;
groupId?: string;
selectionId: string;
}>;
activeOptionId: string | null;
quantity: number;
price: number;
subtotal: number;
formattedPrice: string;
formattedSubtotal: string;
discount: Discount;
galleryIndex: number;
currentSku: any;
range: any;
drawerSize: DrawerSizes;
isVariantsOpen: boolean;
isDrawerOrDialogOpen: boolean;
arPreviewLink: string | null;
error: Error | null;
canAnimate: boolean;
animationState: AnimationState;
iframeRef: React.RefObject<HTMLIFrameElement>;
isMobile: boolean;
hasSwitchedAfterDefer: boolean;
deferThreeD: boolean;
showOptional: boolean;
productLink: string | null;
apiKey: string;
buyNowFunction: () => void;
addToBasketFunction: () => void;
addSwatchesToCartFunction: () => void;
images?: string[];
logoURL?: string;
isProductGalleryStacked: boolean;
mobileLogoURL?: string;
currentProduct?: Product;
sizeOption: SizeOption;
activeOption?: Option;
availableProductFilters?: ProductFilters;
showFilters?: boolean;
allOptions: (Option | SizeOption)[];
galleryIndexToUse: number;
filteredActiveOption?: Option | null;
searchQueries: {
[optionId: string]: string;
};
selectedSwatches: Swatch[];
swatchRulesData: SwatchRulesData;
isSwatchBookOpen: boolean;
availableCameras: string[];
setProducts: React.Dispatch<React.SetStateAction<Product[]>>;
setCurrentProductId: React.Dispatch<React.SetStateAction<string | undefined>>;
setConfiguratorState: React.Dispatch<React.SetStateAction<ConfiguratorState | undefined>>;
setSelectedSelections: React.Dispatch<React.SetStateAction<Array<{
optionId: string;
groupId?: string;
selectionId: string;
}>>>;
setActiveOptionId: React.Dispatch<React.SetStateAction<string | null>>;
setQuantity: React.Dispatch<React.SetStateAction<number>>;
setPrice: React.Dispatch<React.SetStateAction<number>>;
setSubtotal: React.Dispatch<React.SetStateAction<number>>;
setDiscount: React.Dispatch<React.SetStateAction<Discount>>;
setGalleryIndex: React.Dispatch<React.SetStateAction<number>>;
setCurrentSku: React.Dispatch<React.SetStateAction<any>>;
setRange: React.Dispatch<React.SetStateAction<any>>;
setDrawerSize: React.Dispatch<React.SetStateAction<DrawerSizes>>;
setIsVariantsOpen: React.Dispatch<React.SetStateAction<boolean>>;
setIsDrawerOrDialogOpen: React.Dispatch<React.SetStateAction<boolean>>;
setArPreviewLink: React.Dispatch<React.SetStateAction<string | null>>;
setError: React.Dispatch<React.SetStateAction<Error | null>>;
setCanAnimate: React.Dispatch<React.SetStateAction<boolean>>;
setAnimationState: React.Dispatch<React.SetStateAction<AnimationState>>;
setHasSwitchedAfterDefer: React.Dispatch<React.SetStateAction<boolean>>;
setAvailableProductFilters: React.Dispatch<React.SetStateAction<ProductFilters>>;
setSearchQuery: (optionId: string, query: string) => void;
setSelectedSwatches: React.Dispatch<React.SetStateAction<Swatch[]>>;
setSwatchRulesData: React.Dispatch<React.SetStateAction<SwatchRulesData>>;
toggleSwatch: (swatch: Swatch) => void;
isSwatchSelected: (swatch: Swatch) => boolean;
setIsSwatchBookOpen: React.Dispatch<React.SetStateAction<boolean>>;
setAvailableCameras: React.Dispatch<React.SetStateAction<string[]>>;
selectCamera: (cameraId: string) => void;
handleSelectionSelect: (selection: Selection) => void;
handleOptionClick: (optionId: string) => void;
handleNextOption: () => void;
handlePreviousOption: () => void;
getSelectedValue: (option: Option | SizeOption) => string;
toggleAR: () => void;
}
export declare const OV25UIProvider: React.FC<{
children: React.ReactNode;
productLink: string | null;
apiKey: string;
buyNowFunction: () => void;
addToBasketFunction: () => void;
addSwatchesToCartFunction: () => void;
images?: string[];
deferThreeD?: boolean;
showOptional?: boolean;
logoURL?: string;
isProductGalleryStacked: boolean;
mobileLogoURL?: string;
shadowDOMs?: {
mobileDrawer?: ShadowRoot;
configuratorViewControls?: ShadowRoot;
popoverPortal?: ShadowRoot;
swatchbookPortal?: ShadowRoot;
};
}>;
export declare const useOV25UI: () => OV25UIContextType;
export {};