{"version":3,"file":"filestack-react.modern.mjs","sources":["../src/picker/use-picker.tsx","../src/filestack-provider.tsx","../src/picker/picker-overlay.tsx","../src/picker/picker-inline.tsx","../src/picker/picker-drop-pane.tsx"],"sourcesContent":["'use client';\n\nimport * as filestack from 'filestack-js';\nimport type { PickerInstance, PickerResponse } from 'filestack-js';\nimport { useEffect, useId, useRef } from 'react';\nimport type { PickerBaseProps } from './picker-base';\n\n/**\n * Return value of {@link usePicker}.\n */\nexport interface UsePickerResult {\n  /** DOM `id` attribute the picker will mount into. */\n  containerId: string;\n}\n\nconst _useStableReference = <T,>(value: T): T => {\n  const serialized = JSON.stringify(value);\n  const ref = useRef<{ serialized: string; value: T }>({ serialized, value });\n  if (ref.current.serialized !== serialized) {\n    ref.current = { serialized, value };\n  }\n  return ref.current.value;\n};\n\n/**\n * Drive a Filestack picker through its lifecycle.\n *\n * Instantiates `filestack.Filestack(apikey, clientOptions).picker(...)` inside\n * a `useEffect`, opens it, and closes it on unmount. Stable references are\n * derived for `pickerOptions` / `clientOptions` so callers can pass new-but-equal\n * object literals on every render without re-creating the picker.\n */\nconst usePicker = ({\n  apikey,\n  pickerOptions = {},\n  clientOptions = {},\n  onSuccess,\n  onUploadDone,\n  onError = () => {}\n}: PickerBaseProps): UsePickerResult => {\n  const id = useId().replace(/:/g, '');\n  const rootId = `fs-root-${id}`;\n  const containerId = `fs-container-${id}`;\n\n  const stablePickerOptions = _useStableReference(pickerOptions);\n  const stableClientOptions = _useStableReference(clientOptions);\n\n  const onUploadDoneRef = useRef<(result: PickerResponse) => void>(() => {});\n  onUploadDoneRef.current = (result: PickerResponse) => {\n    const handler = onUploadDone || onSuccess || (() => {});\n    handler(result);\n  };\n\n  const onErrorRef = useRef<(error: Error) => void>(() => {});\n  onErrorRef.current = (error: Error) => {\n    onError(error);\n  };\n\n  // Serializes picker `open()`/`close()` calls across effect runs. `open()` and\n  // `close()` are async, and the container DOM id (derived from `useId`) is\n  // stable across an effect's setup→cleanup→setup cycle — so without\n  // serialization the operations can interleave on the same container. In React\n  // StrictMode this manifests as the picker mounting twice, or the first\n  // instance's late `close()` tearing down the container the second instance\n  // just mounted into (leaving nothing rendered). Chaining guarantees the\n  // strict order: open A → close A → open B.\n  const operationChainRef = useRef<Promise<unknown>>(Promise.resolve());\n\n  useEffect(() => {\n    const picker: PickerInstance = filestack\n      .Filestack(apikey as string, stableClientOptions)\n      .picker({\n        rootId,\n        container: `#${containerId}`,\n        onUploadDone: (result: PickerResponse) =>\n          onUploadDoneRef.current(result),\n        ...stablePickerOptions\n      });\n\n    operationChainRef.current = operationChainRef.current.then(() =>\n      picker.open().catch((error: Error) => onErrorRef.current(error))\n    );\n\n    return () => {\n      operationChainRef.current = operationChainRef.current.then(() =>\n        picker.close().catch(() => {})\n      );\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [apikey, stableClientOptions, stablePickerOptions]);\n\n  return { containerId };\n};\n\nexport default usePicker;\n","'use client';\n\nimport { createContext, useContext } from 'react';\nimport type { ReactNode } from 'react';\nimport type { PickerBaseProps } from './picker/picker-base';\n\n/**\n * Value exposed on {@link FilestackContext} — the same shape as\n * {@link PickerBaseProps} (apikey + picker/client options + callbacks).\n */\nexport type FilestackContextValue = PickerBaseProps;\n\n/**\n * Props accepted by {@link FilestackProvider}.\n */\nexport interface FilestackProviderProps extends PickerBaseProps {\n  /** React subtree that may read picker defaults from this provider. */\n  children?: ReactNode;\n}\n\nexport const FilestackContext = createContext<FilestackContextValue | null>(\n  null\n);\n\n/**\n * Supplies default props to descendant picker components via React context.\n *\n * Picker components call {@link useResolvedPickerProps} to merge their own\n * props with the values declared on the nearest provider — scalars (apikey,\n * callbacks) prefer the component's own prop when set, while `pickerOptions`\n * and `clientOptions` are shallow-merged with context as the base.\n */\nconst FilestackProvider = ({\n  apikey,\n  pickerOptions,\n  clientOptions,\n  onSuccess,\n  onUploadDone,\n  onError,\n  children\n}: FilestackProviderProps) => {\n  const value: FilestackContextValue = {\n    apikey,\n    pickerOptions,\n    clientOptions,\n    onSuccess,\n    onUploadDone,\n    onError\n  };\n  return (\n    <FilestackContext.Provider value={value}>\n      {children}\n    </FilestackContext.Provider>\n  );\n};\n\n/**\n * Merge component props with {@link FilestackContext} defaults. Component\n * props win for scalars; option objects are shallow-merged with context first.\n */\nexport const useResolvedPickerProps = (\n  props: PickerBaseProps\n): Required<Pick<PickerBaseProps, 'pickerOptions' | 'clientOptions'>> &\n  Omit<PickerBaseProps, 'pickerOptions' | 'clientOptions'> => {\n  const ctx = useContext(FilestackContext) || ({} as FilestackContextValue);\n  return {\n    apikey: props.apikey !== undefined ? props.apikey : ctx.apikey,\n    pickerOptions: { ...ctx.pickerOptions, ...props.pickerOptions },\n    clientOptions: { ...ctx.clientOptions, ...props.clientOptions },\n    onSuccess: props.onSuccess !== undefined ? props.onSuccess : ctx.onSuccess,\n    onUploadDone:\n      props.onUploadDone !== undefined ? props.onUploadDone : ctx.onUploadDone,\n    onError: props.onError !== undefined ? props.onError : ctx.onError\n  };\n};\n\nexport default FilestackProvider;\n","'use client';\n\nimport { cloneElement, isValidElement } from 'react';\nimport type { ReactElement } from 'react';\nimport { PickerDisplayMode } from 'filestack-js';\nimport type { PickerBaseProps } from './picker-base';\nimport usePicker from './use-picker';\nimport { useResolvedPickerProps } from '../filestack-provider';\n\n/**\n * Props for {@link PickerOverlay}.\n */\nexport interface PickerOverlayProps extends PickerBaseProps {\n  /**\n   * Optional custom container element. When provided, it is cloned with the\n   * generated DOM `id` so the picker mounts inside it.\n   */\n  children?: ReactElement<{ id?: string }>;\n}\n\nconst PickerOverlay = (props: PickerOverlayProps) => {\n  const resolved = useResolvedPickerProps(props);\n  const { containerId } = usePicker({\n    ...resolved,\n    pickerOptions: {\n      displayMode: PickerDisplayMode.overlay,\n      ...resolved.pickerOptions\n    }\n  });\n\n  if (props.children && isValidElement(props.children)) {\n    return cloneElement(props.children, { id: containerId });\n  }\n  return <div id={containerId} />;\n};\n\nexport default PickerOverlay;\n","'use client';\n\nimport { cloneElement, isValidElement } from 'react';\nimport type { ReactElement } from 'react';\nimport { PickerDisplayMode } from 'filestack-js';\nimport type { PickerBaseProps } from './picker-base';\nimport usePicker from './use-picker';\nimport { useResolvedPickerProps } from '../filestack-provider';\n\n/**\n * Props for {@link PickerInline}.\n */\nexport interface PickerInlineProps extends PickerBaseProps {\n  /**\n   * Optional custom container element. When provided, it is cloned with the\n   * generated DOM `id` so the picker mounts inside it. Otherwise a default\n   * 500px-tall `<div>` is rendered.\n   */\n  children?: ReactElement<{ id?: string }>;\n}\n\nconst PickerInline = (props: PickerInlineProps) => {\n  const resolved = useResolvedPickerProps(props);\n  const { containerId } = usePicker({\n    ...resolved,\n    pickerOptions: {\n      displayMode: PickerDisplayMode.inline,\n      ...resolved.pickerOptions\n    }\n  });\n\n  if (props.children && isValidElement(props.children)) {\n    return cloneElement(props.children, { id: containerId });\n  }\n  return (\n    <div\n      data-testid='picker-inline'\n      style={{ height: '500px' }}\n      id={containerId}\n    />\n  );\n};\n\nexport default PickerInline;\n","'use client';\n\nimport { cloneElement, isValidElement } from 'react';\nimport type { ReactElement } from 'react';\nimport { PickerDisplayMode } from 'filestack-js';\nimport type { PickerBaseProps } from './picker-base';\nimport usePicker from './use-picker';\nimport { useResolvedPickerProps } from '../filestack-provider';\n\n/**\n * Props for {@link PickerDropPane}.\n */\nexport interface PickerDropPaneProps extends PickerBaseProps {\n  /**\n   * Optional custom container element. When provided, it is cloned with the\n   * generated DOM `id` so the picker mounts inside it.\n   */\n  children?: ReactElement<{ id?: string }>;\n}\n\nconst PickerDropPane = (props: PickerDropPaneProps) => {\n  const resolved = useResolvedPickerProps(props);\n  const { containerId } = usePicker({\n    ...resolved,\n    pickerOptions: {\n      displayMode: PickerDisplayMode.dropPane,\n      ...resolved.pickerOptions\n    }\n  });\n\n  if (props.children && isValidElement(props.children)) {\n    return cloneElement(props.children, { id: containerId });\n  }\n  return <div id={containerId} />;\n};\n\nexport default PickerDropPane;\n"],"names":["_useStableReference","value","serialized","JSON","stringify","ref","useRef","current","usePicker","apikey","pickerOptions","clientOptions","onSuccess","onUploadDone","onError","id","useId","replace","rootId","containerId","stablePickerOptions","stableClientOptions","onUploadDoneRef","result","handler","onErrorRef","error","operationChainRef","Promise","resolve","useEffect","picker","filestack","Filestack","_extends","container","then","open","catch","close","FilestackContext","createContext","FilestackProvider","children","_jsx","Provider","useResolvedPickerProps","props","ctx","useContext","undefined","PickerOverlay","resolved","displayMode","PickerDisplayMode","overlay","isValidElement","cloneElement","PickerInline","inline","style","height","PickerDropPane","dropPane"],"mappings":"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"}