{"version":3,"file":"frontend.cjs","sources":["../../src/api/frontend.ts"],"sourcesContent":["// @ts-nocheck\nimport { Component, cloneElement, isValidElement } from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport { Spinner } from \"@blueprintjs/core\";\nimport { APIContext, APIActions, APIHelpers } from \"./provider\";\nimport { debounce } from \"underscore\";\nimport { APIConfig } from \"./types\";\nimport { QueryParams, JSONView } from \"../util\";\nimport { IndexingProvider } from \"./indexing\";\n\ninterface APIPlaceholderProps {\n  isLoading: boolean;\n}\n\nconst APIResultPlaceholder = (props: APIPlaceholderProps) => {\n  return h(\"div.api-result-placeholder\", [h(Spinner)]);\n};\n\ntype ChildFunction<T> = (d: T) => React.ReactNode;\n\ntype APIChild<T> =\n  | React.ReactElement<{ data: T; isLoading: boolean }>\n  | ChildFunction<T>;\n\ntype APIViewProps<T> = {\n  children?: APIChild<T>;\n  placeholder: React.ComponentType<APIPlaceholderProps>;\n  params: QueryParams;\n  route: string | null;\n  isLoading: boolean;\n  data: T;\n  totalCount?: number;\n  pageCount?: number;\n};\n\ninterface APIResultProps<T> extends APIViewProps<T> {\n  onSuccess: (d: T) => void;\n  debounce: number;\n  opts?: Partial<APIConfig>;\n}\n\ntype APIResultState<T> = { data: T; isLoading: boolean };\n\nclass APIResultView<T> extends Component<APIResultProps<T>, APIResultState<T>> {\n  static contextType = APIContext;\n  static defaultProps = {\n    route: null,\n    params: {},\n    opts: {}, // Options passed to `get`\n    debug: false,\n    onSuccess: () => {},\n    primaryKey: \"id\",\n    // If placeholder is not defined, the render\n    // method will be called with null data\n    placeholder: APIResultPlaceholder,\n    debounce: 300,\n    children: (data) => {\n      return h(JSONView, { data });\n    },\n  };\n  _didFetch: boolean;\n  _lazyGetData: () => Promise<void>;\n\n  constructor(props, context) {\n    super(props, context);\n\n    this._didFetch = false;\n\n    this.getData = this.getData.bind(this);\n    this._lazyGetData = debounce(this.getData, this.props.debounce);\n\n    this.state = { data: null, isLoading: false };\n    this.getData();\n  }\n\n  buildURL(props = null) {\n    const { route, params } = props ?? this.props;\n    const { buildURL } = APIHelpers(this.context);\n    return buildURL(route, params);\n  }\n\n  componentDidUpdate(prevProps) {\n    if (prevProps.debounce !== this.props.debounce) {\n      this._lazyGetData = debounce(this.getData, this.props.debounce);\n    }\n    if (this.buildURL() === this.buildURL(prevProps)) return;\n\n    return this._lazyGetData();\n  }\n\n  async getData() {\n    this._didFetch = false;\n    // if (this.context?.get == null) {\n    //   return\n    // }\n    const { route, params, opts } = this.props;\n    if (route == null) {\n      return;\n    }\n    const { get } = APIActions(this.context);\n    this.setState({ isLoading: true });\n    const data = await get(route, params, opts);\n    this._didFetch = true;\n    // Run side effects...\n    this.props.onSuccess(data);\n    this.setState({ data, isLoading: false });\n  }\n\n  renderInner() {\n    const { data, isLoading } = this.state;\n    const { children } = this.props;\n\n    if (typeof children == \"function\") {\n      return children(data) as React.ReactElement;\n    } else if (isValidElement(children)) {\n      return cloneElement(children, {\n        data,\n        isLoading,\n      });\n    } else {\n      throw new Error(\n        \"The APIResultView component must have a single child element or a function\",\n      );\n    }\n  }\n\n  render() {\n    const { data, isLoading } = this.state;\n    const { placeholder } = this.props;\n    if (data == null && placeholder != null) {\n      return h(placeholder, { isLoading });\n    }\n\n    if (Array.isArray(data)) {\n      return h(\n        IndexingProvider,\n        {\n          totalCount: data.length,\n          indexOffset: 0,\n        },\n        this.renderInner(),\n      );\n    }\n    return this.renderInner();\n  }\n}\n\nexport { APIResultView, APIResultProps, APIPlaceholderProps };\n"],"names":["h","Spinner","Component","APIContext","JSONView","debounce","APIHelpers","APIActions","isValidElement","cloneElement","IndexingProvider"],"mappings":";;;;;;;;;;;AAcA,MAAM,uBAAuB,CAAC,UAA+B;AAC3D,SAAOA,WAAAA,QAAE,8BAA8B,CAACA,WAAAA,QAAEC,KAAAA,OAAO,CAAC,CAAC;AACrD;AA2BA,MAAM,sBAAyBC,MAAAA,UAAgD;AAAA,EAC7E,OAAO,cAAcC,SAAAA;AAAAA,EACrB,OAAO,eAAe;AAAA,IACpB,OAAO;AAAA,IACP,QAAQ,CAAA;AAAA,IACR,MAAM,CAAA;AAAA;AAAA,IACN,OAAO;AAAA,IACP,WAAW,MAAM;AAAA,IAAC;AAAA,IAClB,YAAY;AAAA;AAAA;AAAA,IAGZ,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU,CAAC,SAAS;AAClB,aAAOH,mBAAEI,SAAAA,UAAU,EAAE,MAAM;AAAA,IAC7B;AAAA,EAAA;AAAA,EAEF;AAAA,EACA;AAAA,EAEA,YAAY,OAAO,SAAS;AAC1B,UAAM,OAAO,OAAO;AAEpB,SAAK,YAAY;AAEjB,SAAK,UAAU,KAAK,QAAQ,KAAK,IAAI;AACrC,SAAK,eAAeC,oBAAS,KAAK,SAAS,KAAK,MAAM,QAAQ;AAE9D,SAAK,QAAQ,EAAE,MAAM,MAAM,WAAW,MAAA;AACtC,SAAK,QAAA;AAAA,EACP;AAAA,EAEA,SAAS,QAAQ,MAAM;AACrB,UAAM,EAAE,OAAO,OAAA,IAAW,SAAS,KAAK;AACxC,UAAM,EAAE,SAAA,IAAaC,oBAAW,KAAK,OAAO;AAC5C,WAAO,SAAS,OAAO,MAAM;AAAA,EAC/B;AAAA,EAEA,mBAAmB,WAAW;AAC5B,QAAI,UAAU,aAAa,KAAK,MAAM,UAAU;AAC9C,WAAK,eAAeD,oBAAS,KAAK,SAAS,KAAK,MAAM,QAAQ;AAAA,IAChE;AACA,QAAI,KAAK,SAAA,MAAe,KAAK,SAAS,SAAS,EAAG;AAElD,WAAO,KAAK,aAAA;AAAA,EACd;AAAA,EAEA,MAAM,UAAU;AACd,SAAK,YAAY;AAIjB,UAAM,EAAE,OAAO,QAAQ,KAAA,IAAS,KAAK;AACrC,QAAI,SAAS,MAAM;AACjB;AAAA,IACF;AACA,UAAM,EAAE,IAAA,IAAQE,oBAAW,KAAK,OAAO;AACvC,SAAK,SAAS,EAAE,WAAW,KAAA,CAAM;AACjC,UAAM,OAAO,MAAM,IAAI,OAAO,QAAQ,IAAI;AAC1C,SAAK,YAAY;AAEjB,SAAK,MAAM,UAAU,IAAI;AACzB,SAAK,SAAS,EAAE,MAAM,WAAW,OAAO;AAAA,EAC1C;AAAA,EAEA,cAAc;AACZ,UAAM,EAAE,MAAM,UAAA,IAAc,KAAK;AACjC,UAAM,EAAE,aAAa,KAAK;AAE1B,QAAI,OAAO,YAAY,YAAY;AACjC,aAAO,SAAS,IAAI;AAAA,IACtB,WAAWC,qBAAe,QAAQ,GAAG;AACnC,aAAOC,MAAAA,aAAa,UAAU;AAAA,QAC5B;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IACH,OAAO;AACL,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF;AAAA,EAEA,SAAS;AACP,UAAM,EAAE,MAAM,UAAA,IAAc,KAAK;AACjC,UAAM,EAAE,gBAAgB,KAAK;AAC7B,QAAI,QAAQ,QAAQ,eAAe,MAAM;AACvC,aAAOT,mBAAE,aAAa,EAAE,WAAW;AAAA,IACrC;AAEA,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,aAAOA,WAAAA;AAAAA,QACLU,SAAAA;AAAAA,QACA;AAAA,UACE,YAAY,KAAK;AAAA,UACjB,aAAa;AAAA,QAAA;AAAA,QAEf,KAAK,YAAA;AAAA,MAAY;AAAA,IAErB;AACA,WAAO,KAAK,YAAA;AAAA,EACd;AACF;;"}