0.0.1Updated a month ago
import { render } from "npm:preact-render-to-string";
import { Tailwind } from "../../app/tailwind/tailwind.tsx";
import { PluginType } from "../plugin/plugin_type.ts";
import type { Core } from "../core.ts";
import type { I_Component } from "../plugin/types/component.ts";

export class PluginComponentManager {
  constructor(private core: typeof Core) {}

  private render(this: Record<string, unknown>, component: I_Component) {
    Tailwind.TrackPlugin(component.id.replace(/\:\:.+$/, ''), render(<>{component.render(this || {})}</>));
    return component.render(this || {})
  }

  RenderAll(plugin_id: string, config: Record<string, unknown>) {
    const plugin = this.core.Plugins.Find(plugin_id);
    if(!plugin?.hasService(PluginType.ComponentProvider)) return <div>Plugin not found!</div>;

    return (
      plugin.services(PluginType.ComponentProvider).map(provider =>
        provider.components.map(this.render.bind(config))
      )
    )
  }

  Render(name: string, config: Record<string, unknown>) {
    const [plugin_id, _component_id] = name.split('::');

    const plugin = this.core.Plugins.Find(plugin_id);
    if(!plugin) return undefined;

    const services = plugin.services(PluginType.ComponentProvider);
    const components = services.flatMap(service => service.components.filter(c => c.id == name));

    return components.map(this.render.bind(config));
  }
}