{"version":3,"file":"index.mjs","sources":["../src/reatomComponent.ts","../src/bindField.ts"],"sourcesContent":["import {\n  action,\n  assert,\n  type Frame,\n  named,\n  notify,\n  reatomAbstractRender,\n  ReatomError,\n  type Rec,\n  STACK,\n  top,\n  wrap,\n} from '@reatom/core'\nimport React from 'react'\n\n// https://github.com/webpack/webpack/issues/12960#issuecomment-1086272918\nlet {\n  __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: oldInternals,\n  __CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE: newInternals,\n} = React as any\n\n/** @private */\nexport let _getComponentDebugName = (fallback?: string): string => {\n  let Component =\n    oldInternals?.ReactCurrentOwner?.current?.type ??\n    newInternals?.A?.getOwner?.()?.type\n\n  let name = (Component?.displayName ?? Component?.name) || fallback\n  return name || named('Component')\n}\n\nexport let reatomContext = React.createContext<null | Frame>(null)\n\nexport let useFrame = (): Frame => {\n  let frame = React.useContext(reatomContext) ?? STACK[0]\n\n  assert(\n    frame,\n    'the root is not set, you probably forgot to specify the  provider',\n    ReatomError,\n  )\n\n  return frame\n}\n\nexport const useWrap = <Params extends any[], Payload>(\n  callback: (...params: Params) => Payload,\n  name?: string,\n): ((...params: Params) => Payload) => {\n  let frame = useFrame()\n\n  let ref: {\n    stableFn: (...args: Params) => Payload\n    callback: (...args: Params) => Payload\n  } = React.useMemo(\n    () => ({\n      callback,\n      stableFn: wrap(\n        action((...params) => {\n          try {\n            return ref.callback(...params)\n          } finally {\n            notify()\n          }\n        }, _getComponentDebugName(name)),\n        frame,\n      ),\n    }),\n    [],\n  )\n\n  ;(\n    React.useInsertionEffect ??\n    (typeof document !== 'undefined' ? React.useLayoutEffect : React.useEffect)\n  )(() => {\n    ref.callback = callback\n  })\n\n  return ref.stableFn\n}\n\nexport let isSuspense = (thing: unknown) =>\n  thing instanceof Promise ||\n  (thing instanceof Error && thing.message.startsWith('Suspense Exception'))\n\nexport let reatomComponent = <Props extends Rec = {}>(\n  Component: (props: Props) => React.ReactNode,\n  name?: string,\n): ((props: Props) => React.ReactNode) => {\n  name ||= named('Component', Component.name)\n\n  return {\n    [name](props: Props): React.ReactNode {\n      let frame = useFrame()\n\n      let [, rerender] = React.useState({ result: null as React.ReactNode })\n\n      let { render, mount } = React.useMemo(\n        () =>\n          reatomAbstractRender({\n            frame,\n            render(props: Props) {\n              try {\n                return Component(props)\n              } catch (error) {\n                if (isSuspense(error)) {\n                  return error as never\n                }\n                throw error\n              }\n            },\n            // TODO: useUid? useInsertionEffect?\n            // mount() {\n            //   // reset abort in case if remount (StrictMode and so on) appears\n            //   abortVar.read()?.(null)\n            // },\n            rerender,\n            name,\n          }),\n        [frame],\n      )\n\n      React.useEffect(mount, [mount])\n\n      let { result } = render(props)\n      if (isSuspense(result)) throw result\n      return result\n    },\n  }[name]!\n}\n\nexport let reatomFactoryComponent = <Props extends Rec = {}>(\n  init: (initProps: Props) => (props: Props) => React.ReactNode,\n  name?: string,\n): ((props: Props) => React.ReactNode) =>\n  reatomComponent(\n    (props) =>\n      React.useMemo(() => {\n        const frame = top()\n        try {\n          // @ts-expect-error internals\n          frame.atom.__reatom.linking = false\n          return init(props)\n        } finally {\n          // @ts-expect-error internals\n          frame.atom.__reatom.linking = true\n        }\n      }, [])(props),\n    name,\n  )\n","import type { FieldAtom, Rec } from '@reatom/core'\nimport { abortVar, memoKey, notify, wrap } from '@reatom/core'\nimport type { ChangeEvent } from 'react'\n\nexport function bindField<T = any>(\n  field: FieldAtom<any, T>,\n): {\n  value: T extends boolean ? undefined : T\n  checked: T extends boolean ? boolean : undefined\n  onChange: (\n    value:\n      | T\n      | { currentTarget: T extends boolean ? { checked: T } : { value: T } }\n      | ChangeEvent<{ value: T }>,\n  ) => void\n  onBlur: () => void\n  onFocus: () => void\n  error: undefined | string\n} {\n  const create = () => {\n    const onChange = wrap((event: any) => {\n      const isEvent = !!event?.currentTarget?.addEventListener\n      const value = isEvent\n        ? event.currentTarget.type === 'checkbox'\n          ? event.currentTarget.checked\n          : event.currentTarget.value\n        : event\n\n      field.change(value)\n      notify()\n    })\n\n    const onBlur = wrap(() => {\n      field.focus.out()\n      notify()\n    })\n    const onFocus = wrap(() => {\n      field.focus.in()\n      notify()\n    })\n\n    const controller = abortVar.get()\n\n    return { onChange, onBlur, onFocus, field, controller }\n  }\n\n  const value = field.value()\n\n  let ref = memoKey(field.name, () => ({\n    current: create(),\n  }))\n  if (ref.current.controller?.signal.aborted || ref.current.field !== field) {\n    ref.current = create()\n  }\n\n  const { onChange, onBlur, onFocus } = ref.current\n\n  const { error } = field.validation()\n\n  const result: Rec = {\n    onChange,\n    onBlur,\n    onFocus,\n    error,\n  }\n\n  if (typeof value === 'boolean') {\n    result.checked = value\n  } else {\n    result.value = value\n  }\n\n  // @ts-expect-error generic overloads\n  return result\n}\n"],"names":["__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","oldInternals","__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE","newInternals","React","_getComponentDebugName","fallback","Component","ReactCurrentOwner","current","type","A","getOwner","displayName","name","named","reatomContext","createContext","useFrame","frame","useContext","STACK","assert","ReatomError","useWrap","callback","ref","useMemo","stableFn","wrap","action","slice","call","arguments","notify","useInsertionEffect","document","useLayoutEffect","useEffect","isSuspense","thing","Promise","Error","message","startsWith","reatomComponent","props","rerender","useState","result","render","mount","reatomAbstractRender","error","reatomFactoryComponent","init","top","atom","__reatom","linking","bindField","field","create","onChange","event","change","currentTarget","addEventListener","checked","value","onBlur","focus","out","onFocus","in","controller","abortVar","get","memoKey","signal","aborted","validation"],"mappings":"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"}