← Files DataARCHIVED FILE

templates/data-app/base/src/components/CustomBlockHost.jsx

1.15 KB · Sep 30, 2026 · 23:19 UTC

↓ Download file

import React, { createContext, useContext, useMemo } from "react";

const CustomBlockContext = createContext(null);

export function useCustomBlock() {
  const context = useContext(CustomBlockContext);
  if (!context) throw new Error("Custom blocks must render inside CustomBlockHost.");
  return context;
}

class CustomBlockBoundary extends React.Component {
  state = { failed: false };

  static getDerivedStateFromError() {
    return { failed: true };
  }

  render() {
    return this.state.failed
      ? <div className="custom-block-fallback" role="status">Custom visualization unavailable.</div>
      : this.props.children;
  }
}

export function CustomBlockHost({ blockId, title, data, filters, accessibilitySummary, openSource, children }) {
  const context = useMemo(() => ({
    blockId, title, data, filters, accessibilitySummary, openSource,
  }), [blockId, title, data, filters, accessibilitySummary, openSource]);

  return (
    <CustomBlockBoundary>
      <CustomBlockContext.Provider value={context}>
        <div className="custom-block" data-custom-block-id={blockId}>{children}</div>
      </CustomBlockContext.Provider>
    </CustomBlockBoundary>
  );
}

SHA-256: b7bfec00a46435291b07d32ff39a2ec65e309aa532902fd94e9b1c72a8994a32