Skip to content

Commit

Permalink
feat(html): allow render function injection
Browse files Browse the repository at this point in the history
  • Loading branch information
sarahdayan committed Mar 18, 2022
1 parent 621b8e1 commit 5acae2f
Show file tree
Hide file tree
Showing 5 changed files with 18 additions and 8 deletions.
1 change: 1 addition & 0 deletions packages/autocomplete-js/src/autocomplete.ts
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ export function autocomplete<TItem extends BaseItem>(
: props.value.renderer.panelContainer,
propGetters,
state: lastStateRef.current,
renderer: props.value.renderer,
};

const render =
Expand Down
1 change: 1 addition & 0 deletions packages/autocomplete-js/src/getDefaultOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ const defaultRender: AutocompleteRender<any> = ({ children }, root) => {
const defaultRenderer: AutocompleteRenderer = {
createElement: preactCreateElement,
Fragment: PreactFragment,
render,
};

export function getDefaultOptions<TItem extends BaseItem>(
Expand Down
6 changes: 4 additions & 2 deletions packages/autocomplete-js/src/render.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ import {
AutocompleteScopeApi,
BaseItem,
} from '@algolia/autocomplete-core';
import { render as preactRender } from 'preact';

import {
AutocompleteClassNames,
AutocompleteComponents,
AutocompleteDom,
AutocompletePropGetters,
AutocompleteRender,
AutocompleteRenderer,
AutocompleteState,
HTMLTemplate,
Pragma,
Expand All @@ -31,6 +31,7 @@ type RenderProps<TItem extends BaseItem> = {
panelContainer: HTMLElement;
propGetters: AutocompletePropGetters<TItem>;
state: AutocompleteState<TItem>;
renderer: { renderer: AutocompleteRenderer };
};

export function renderSearchBox<TItem extends BaseItem>({
Expand Down Expand Up @@ -76,6 +77,7 @@ export function renderPanel<TItem extends BaseItem>(
propGetters,
state,
components,
renderer,
}: RenderProps<TItem>
): void {
if (!state.isOpen) {
Expand Down Expand Up @@ -205,7 +207,7 @@ export function renderPanel<TItem extends BaseItem>(
Fragment,
components,
html,
render: preactRender,
render: renderer.renderer.render,
...autocompleteScopeApi,
},
dom.panel
Expand Down
8 changes: 2 additions & 6 deletions packages/autocomplete-js/src/types/AutocompleteRender.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ import { AutocompleteScopeApi, BaseItem } from '@algolia/autocomplete-core';

import { AutocompleteComponents } from './AutocompleteComponents';
import {
ComponentChild,
HTMLTemplate,
Pragma,
PragmaFrag,
Render,
VNode,
} from './AutocompleteRenderer';
import { AutocompleteState } from './AutocompleteState';
Expand All @@ -20,11 +20,7 @@ export type AutocompleteRender<TItem extends BaseItem> = (
createElement: Pragma;
Fragment: PragmaFrag;
html: HTMLTemplate;
render(
vnode: ComponentChild,
containerNode: Element | Document | ShadowRoot | DocumentFragment,
replaceNode?: Element | Text | undefined
): void;
render?: Render;
},
root: HTMLElement
) => void;
10 changes: 10 additions & 0 deletions packages/autocomplete-js/src/types/AutocompleteRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@ export type VNode<TProps = any> = {
props: TProps & { children: ComponentChildren; key?: any };
};

export type Render = (
vnode: ComponentChild,
parent: Element | Document | ShadowRoot | DocumentFragment,
replaceNode?: Element | Text | undefined
) => void;

export type AutocompleteRenderer = {
/**
* The function to create virtual nodes.
Expand All @@ -35,6 +41,10 @@ export type AutocompleteRenderer = {
* @default preact.Fragment
*/
Fragment: PragmaFrag;
/**
* The function to render children to an element.
*/
render?: Render;
};

export type HTMLTemplate = typeof htm;

0 comments on commit 5acae2f

Please sign in to comment.