woocommerce/plugins/woocommerce-blocks/assets/js/blocks/product-gallery/frontend.tsx

81 lines
1.6 KiB
TypeScript

/**
* External dependencies
*/
import { store as interactivityApiStore } from '@woocommerce/interactivity';
interface State {
[ key: string ]: unknown;
}
interface Context {
woocommerce: {
selectedImage: string;
imageId: string;
isDialogOpen: boolean;
};
}
interface Selectors {
woocommerce: {
isSelected: ( store: unknown ) => boolean;
pagerDotFillOpacity: ( store: SelectorsStore ) => number;
isDialogOpen: ( store: unknown ) => boolean;
};
}
interface Actions {
woocommerce: {
thumbnails: {
handleClick: ( context: Context ) => void;
};
};
}
interface Store {
state: State;
context: Context;
selectors: Selectors;
actions: Actions;
ref?: HTMLElement;
}
type SelectorsStore = Pick< Store, 'context' | 'selectors' | 'ref' >;
interactivityApiStore( {
state: {},
selectors: {
woocommerce: {
isSelected: ( { context }: Store ) => {
return (
context?.woocommerce.selectedImage ===
context?.woocommerce.imageId
);
},
pagerDotFillOpacity( store: SelectorsStore ) {
const { context } = store;
return context?.woocommerce.selectedImage ===
context?.woocommerce.imageId
? 1
: 0.2;
},
isDialogOpen: ( { context }: Store ) => {
return context?.woocommerce.isDialogOpen;
},
},
},
actions: {
woocommerce: {
thumbnails: {
handleClick: ( { context }: Store ) => {
context.woocommerce.selectedImage =
context.woocommerce.imageId;
},
},
handleSelectImage: ( { context }: Store ) => {
context.woocommerce.selectedImage = context.woocommerce.imageId;
},
},
},
} );