@croct/plug-react
Version:
React components and hooks to plug your React applications into Croct.
25 lines (22 loc) • 1.64 kB
text/typescript
import { ReactNode, ReactElement } from 'react';
import { VersionedSlotId, VersionedSlotMap, SlotContent } from '@croct/plug/slot';
import { JsonObject } from '@croct/plug/sdk/json';
import { FetchResponseOptions } from '@croct/sdk/contentFetcher';
import { UseContentOptions, FetchResponse } from '../../hooks/useContent.cjs';
import '@croct/plug/plug';
import '@croct/sdk/utilityTypes';
type Renderer<P> = (props: P) => ReactNode;
type SlotProps<P, I = P, F = P, S extends VersionedSlotId = VersionedSlotId, O extends FetchResponseOptions = FetchResponseOptions> = O & UseContentOptions<I, F> & {
id: S;
children: Renderer<FetchResponse<P | I | F, O>>;
};
type SlotComponent = {
<P, I, F, O extends FetchResponseOptions>(props: Extract<P | I | F, JsonObject> extends never ? SlotProps<JsonObject, never, never, keyof VersionedSlotMap extends never ? string : never, O> : SlotProps<P, I, F, keyof VersionedSlotMap extends never ? string : never, O>): ReactElement;
<S extends VersionedSlotId, O extends FetchResponseOptions>(props: SlotProps<SlotContent<S>, never, never, S, O>): ReactElement;
<I, S extends VersionedSlotId, O extends FetchResponseOptions>(props: SlotProps<SlotContent<S>, I, never, S, O>): ReactElement;
<F, S extends VersionedSlotId, O extends FetchResponseOptions>(props: SlotProps<SlotContent<S>, never, F, S, O>): ReactElement;
<I, F, S extends VersionedSlotId, O extends FetchResponseOptions>(props: SlotProps<SlotContent<S>, I, F, S, O>): ReactElement;
(props: SlotProps<void, void, void>): ReactElement;
};
declare const Slot: SlotComponent;
export { Slot, type SlotProps };