@diskette/use-render 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -69,7 +69,7 @@ function Button(props: ButtonProps) {
69
69
 
70
70
  ```tsx
71
71
  <Button
72
- render={(state, props) => (
72
+ render={(props, state) => (
73
73
  <a {...props} href="/path" data-pressed={state.isPressed} />
74
74
  )}
75
75
  >
@@ -184,12 +184,12 @@ type StyleResolver<S> =
184
184
  | undefined
185
185
  ```
186
186
 
187
- ### `Renderer<T, S>`
187
+ ### `Renderer<S>`
188
188
 
189
189
  ```ts
190
- type Renderer<T extends ElementType, S> = (
191
- state: S,
190
+ type Renderer<S> = (
192
191
  props: ComponentPropsWithRef<T>,
192
+ state: S,
193
193
  ) => ReactNode
194
194
  ```
195
195
 
package/dist/types.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import type { ComponentPropsWithRef, CSSProperties, ElementType, ReactNode } from 'react';
2
2
  export type ClassNameResolver<State> = ((state: State, baseClassName?: string) => string | undefined) | string | undefined;
3
3
  export type StyleResolver<State> = ((state: State, baseStyle?: CSSProperties) => CSSProperties | undefined) | CSSProperties | undefined;
4
- export type Renderer<S> = (state: S, props: React.HTMLAttributes<any> & {
4
+ export type Renderer<S> = (props: React.HTMLAttributes<any> & {
5
5
  ref?: React.Ref<any> | undefined;
6
- }) => ReactNode;
6
+ }, state: S) => ReactNode;
7
7
  export type DataAttributes = Record<`data-${string}`, string | number | boolean>;
8
8
  export type BaseComponentProps<T extends ElementType> = Omit<ComponentPropsWithRef<T>, 'children' | 'className' | 'style'>;
@@ -49,12 +49,12 @@ export function useRender(tag, state, options) {
49
49
  if (isValidElement(render)) {
50
50
  return cloneElement(render, resolvedProps, resolvedChildren);
51
51
  }
52
- // For `<Component render={(state, props) => <a {...props} />)} />`
52
+ // For `<Component render={(props) => <a {...props} />)} />`
53
53
  if (isFunction(render)) {
54
- return render(state, {
54
+ return render({
55
55
  ...resolvedProps,
56
56
  children: resolvedChildren,
57
- });
57
+ }, state);
58
58
  }
59
59
  return createElement(tag, resolvedProps, resolvedChildren ?? baseChildren);
60
60
  }
@@ -126,9 +126,9 @@ describe('useRender', () => {
126
126
  await expect.element(link).toHaveTextContent('Link');
127
127
  await expect.element(link).toHaveAttribute('href', '/path');
128
128
  });
129
- test('render function receives state and props', async () => {
129
+ test('render function receives props and state', async () => {
130
130
  const Button = createBtn();
131
- const { getByRole } = await render(<Button className="custom" render={(state, props) => (<a {...props} href="/path" data-active={state.isActive} onClick={(e) => {
131
+ const { getByRole } = await render(<Button className="custom" render={(props, state) => (<a {...props} href="/path" data-active={state.isActive} onClick={(e) => {
132
132
  e.preventDefault();
133
133
  props.onClick?.(e);
134
134
  }}/>)}>
@@ -153,7 +153,7 @@ describe('useRender', () => {
153
153
  });
154
154
  test('function render prop with children as function', async () => {
155
155
  const Button = createBtn();
156
- const { getByRole } = await render(<Button render={(state, props) => (<a {...props} href="/path" data-active={state.isActive} onClick={(e) => {
156
+ const { getByRole } = await render(<Button render={(props, state) => (<a {...props} href="/path" data-active={state.isActive} onClick={(e) => {
157
157
  e.preventDefault();
158
158
  props.onClick?.(e);
159
159
  }}/>)}>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@diskette/use-render",
3
3
  "type": "module",
4
- "version": "0.4.0",
4
+ "version": "0.5.0",
5
5
  "exports": "./dist/index.js",
6
6
  "files": [
7
7
  "dist"