3
3
import { h , render } from 'preact' ;
4
4
import cx from 'classnames' ;
5
5
import PoweredBy from '../../components/PoweredBy/PoweredBy' ;
6
- import connectPoweredBy from '../../connectors/powered-by/connectPoweredBy' ;
6
+ import connectPoweredBy , {
7
+ PoweredByConnectorParams ,
8
+ PoweredByRenderState ,
9
+ PoweredByWidgetDescription ,
10
+ } from '../../connectors/powered-by/connectPoweredBy' ;
7
11
import {
8
12
getContainerNode ,
9
13
createDocumentationMessageGenerator ,
10
14
} from '../../lib/utils' ;
11
15
import { component } from '../../lib/suit' ;
16
+ import { Renderer , WidgetFactory } from '../../types' ;
12
17
13
18
const suit = component ( 'PoweredBy' ) ;
14
19
const withUsage = createDocumentationMessageGenerator ( { name : 'powered-by' } ) ;
15
20
16
- const renderer = ( { containerNode, cssClasses } ) => (
21
+ const renderer = ( {
22
+ containerNode,
23
+ cssClasses,
24
+ } ) : Renderer < PoweredByRenderState , Partial < PoweredByWidgetParams > > => (
17
25
{ url, widgetParams } ,
18
26
isFirstRendering
19
27
) => {
20
28
if ( isFirstRendering ) {
21
- const { theme } = widgetParams ;
29
+ const { theme = 'light' } = widgetParams ;
22
30
23
31
render (
24
32
< PoweredBy cssClasses = { cssClasses } url = { url } theme = { theme } /> ,
@@ -29,36 +37,48 @@ const renderer = ({ containerNode, cssClasses }) => (
29
37
}
30
38
} ;
31
39
32
- /**
33
- * @typedef {Object } PoweredByWidgetCssClasses
34
- * @property {string|string[] } [root] CSS classes added to the root element of the widget.
35
- * @property {string|string[] } [link] CSS class to add to the link.
36
- * @property {string|string[] } [logo] CSS class to add to the SVG logo.
37
- */
38
-
39
- /**
40
- * @typedef {Object } PoweredByWidgetParams
41
- * @property {string|HTMLElement } container Place where to insert the widget in your webpage.
42
- * @property {string } [theme] The theme of the logo ("light" or "dark").
43
- * @property {PoweredByWidgetCssClasses } [cssClasses] CSS classes to add.
44
- */
45
-
46
- /**
47
- * The `poweredBy` widget is used to display the logo to redirect to Algolia.
48
- * @type {WidgetFactory }
49
- * @devNovel PoweredBy
50
- * @category metadata
51
- * @param {PoweredByWidgetParams } widgetParams PoweredBy widget options. Some keys are mandatory: `container`,
52
- * @return {Widget } A new poweredBy widget instance
53
- * @example
54
- * search.addWidgets([
55
- * instantsearch.widgets.poweredBy({
56
- * container: '#poweredBy-container',
57
- * theme: 'dark',
58
- * })
59
- * ]);
60
- */
61
- export default function poweredBy ( widgetParams ) {
40
+ export type PoweredByCSSClasses = {
41
+ /**
42
+ * CSS class to add to the wrapping element.
43
+ */
44
+ root : string | string [ ] ;
45
+
46
+ /**
47
+ * CSS class to add to the link.
48
+ */
49
+ link : string | string [ ] ;
50
+
51
+ /**
52
+ * CSS class to add to the SVG logo.
53
+ */
54
+ logo : string | string [ ] ;
55
+ } ;
56
+
57
+ export type PoweredByWidgetParams = {
58
+ /**
59
+ * CSS Selector or HTMLElement to insert the widget.
60
+ */
61
+ container : string | HTMLElement ;
62
+
63
+ /**
64
+ * The theme of the logo.
65
+ * @default 'light'
66
+ */
67
+ theme ?: 'light' | 'dark' ;
68
+
69
+ /**
70
+ * CSS classes to add.
71
+ */
72
+ cssClasses ?: Partial < PoweredByCSSClasses > ;
73
+ } ;
74
+
75
+ export type PoweredByWidget = WidgetFactory <
76
+ PoweredByWidgetDescription & { $$widgetType : 'ais.poweredBy' } ,
77
+ PoweredByConnectorParams ,
78
+ PoweredByWidgetParams
79
+ > ;
80
+
81
+ const poweredBy : PoweredByWidget = function poweredBy ( widgetParams ) {
62
82
const { container, cssClasses : userCssClasses = { } , theme = 'light' } =
63
83
widgetParams || { } ;
64
84
@@ -91,4 +111,6 @@ export default function poweredBy(widgetParams) {
91
111
...makeWidget ( { theme } ) ,
92
112
$$widgetType : 'ais.poweredBy' ,
93
113
} ;
94
- }
114
+ } ;
115
+
116
+ export default poweredBy ;
0 commit comments