/* eslint-disable react-perf/jsx-no-new-object-as-prop */ /* eslint-disable react-perf/jsx-no-new-function-as-prop */ import { DataRenderer, SimpleGraphDecorator } from '../../.storybook/decorators/with-simple-data'; import type { Meta } from '@storybook/react/*'; import { HookTester, type TesterHookStory } from '../stories/utils/hook-tester'; import { useElements } from './use-elements'; import { Paper } from '../components/paper/paper'; import { PAPER_CLASSNAME, PRIMARY } from 'storybook-config/theme'; import { makeRootDocumentation, makeStory } from '@joint/react/src/stories/utils/make-story'; import { getAPILink } from '@joint/react/src/stories/utils/get-api-documentation-link'; const API_URL = getAPILink('useElements'); const meta: Meta = { title: 'Hooks/useElements', component: HookTester, decorators: [SimpleGraphDecorator], parameters: makeRootDocumentation({ apiURL: API_URL, description: `\`useElements\` is a hook that returns the elements of the current graph. It supports selector functions to get specific properties of the elements and re-renders the component only when selected properties are changed.`, code: `import { useElements } from '@joint/react' function Component() { const elements = useElements(); return
elements are: {JSON.stringify(elements)}
; }`, }), }; export default meta; type Story = TesterHookStory; export const Default = makeStory({ args: { useHook: useElements, hookArgs: [], render: (result) => (
{ return ; }} />
), }, apiURL: API_URL, code: `import { useElements } from '@joint/react' function Component() { const elements = useElements(); return
elements are: {JSON.stringify(elements)}
; }`, description: 'Get all elements.', }); export const WithSelectedJustIds = makeStory({ args: { useHook: useElements, hookArgs: [(elements) => elements.map((element) => element.id)], render: (result) => ( { return ; }} /> ), }, apiURL: API_URL, code: `import { useElements } from '@joint/react' function Component() { const elementIds = useElements((elements) => elements.map((element) => element.id)); return
element ids are: {JSON.stringify(elementIds)}
; }`, description: 'Get the ids of the elements.', }); export const WithGetJustSize = makeStory({ args: { useHook: useElements, hookArgs: [(elements) => elements.size], render: (result) => (
{ return ; }} />
), }, apiURL: API_URL, code: `import { useElements } from '@joint/react' function Component() { const size = useElements((elements) => elements.size); return
size of elements is: {JSON.stringify(size)}
; }`, description: 'Get the size of the elements.', }); export const WithJustPosition = makeStory({ args: { useHook: useElements, hookArgs: [ (elements) => elements.map((element) => ({ x: element.x, y: element.y, })), ], render: (result) => (
{ return ; }} />
), }, apiURL: API_URL, code: `import { useElements } from '@joint/react' function Component() { const positions = useElements((elements) => elements.map((element) => ({ x: element.x, y: element.y })) ); return
positions are: {JSON.stringify(positions)}
; }`, description: 'Get the positions of the elements.', }); export const WithJustPositionButNotReRenderBecauseCompareFN = makeStory({ args: { useHook: useElements, hookArgs: [ (elements) => elements.map((element) => ({ x: element.x, y: element.y, })), (_previous, _next) => true, ], render: (result) => (
{ return ; }} />
), }, apiURL: API_URL, code: `import { useElements } from '@joint/react' function Component() { const positions = useElements( (elements) => elements.map((element) => ({ x: element.x, y: element.y })), (_previous, _next) => true ); return
positions are: {JSON.stringify(positions)}
; }`, description: 'Get the positions of the elements but do not re-render because of custom compare function.', }); export const WithAdditionalData = makeStory({ args: { useHook: useElements, hookArgs: [ (elements) => elements.map((element) => ({ id: element.id, data: element.data, other: 'something' })), ], render: (result) => (
{ return ; }} />
), }, apiURL: API_URL, code: `import { useElements } from '@joint/react' function Component() { const elements = useElements((elements) => elements.map((element) => ({ id: element.id, data: element.data, other: 'something' })) ); return
elements with new data are: {JSON.stringify(elements)}
; }`, description: 'Get the elements with additional data.', });