import React, { useEffect, useState } from "react"; import { Box, render, UseInput, UseStdout } from "./interactive/Ink"; import { getApiKey } from "../zygonApi"; import { ConfiguredFilter } from "./interactive/Filter"; import { Breadcrumb, Step } from "./interactive/Breadcrumb"; import { EntityPicker } from "./interactive/EntityPicker"; import { FieldsPicker } from "./interactive/FieldsPicker"; import { FiltersPicker } from "./interactive/FiltersPicker"; import { QueryResults } from "./interactive/QueryResults"; import { KeyboardShortcuts, KeyboardShortcutsProvider, } from "./interactive/KeyboardShortcuts"; export type Entity = "app" | "account" | "user" | "task"; export const entityToTable = (entity: Entity): string => { switch (entity) { case "app": return "appInstance"; case "account": return "appAccount"; case "user": return "collaborator"; case "task": return "todo"; } }; const useShellDimensions = (useStdout: UseStdout): [number, number] => { const { stdout } = useStdout(); const [dimensions, setDimensions] = useState<[number, number]>([ stdout?.columns || 0, (stdout?.rows || 1) - 1, ]); useEffect(() => { const handler = () => setDimensions([stdout?.columns || 0, (stdout?.rows || 1) - 1]); stdout?.on("resize", handler); return () => { stdout?.off("resize", handler); }; }, [stdout]); return dimensions; }; type ZQueryBuilderProps = { apiKey: string; useStdout: UseStdout; useInput: UseInput; }; const ZQueryBuilder = ({ apiKey, useStdout, useInput }: ZQueryBuilderProps) => { const [width, height] = useShellDimensions(useStdout); const [entity, setEntity] = useState(null); const [selectedFields, setSelectedFields] = useState>([]); const [selectedFilters, setSelectedFilters] = useState< Array >([]); const [step, setStep] = useState(Step.Entity); return ( {step === Step.Entity && ( { setEntity(entity); setStep(Step.Fields); }} useInput={useInput} /> )} {step === Step.Fields && ( { setSelectedFields(fields); setStep(Step.Filters); }} useInput={useInput} apiKey={apiKey} /> )} {step === Step.Filters && ( { setSelectedFilters(filters); setStep(Step.Results); }} useInput={useInput} apiKey={apiKey} /> )} {step === Step.Results && ( )} ); }; export const interactive = async () => { const apiKey = getApiKey(); const { useStdout, useInput } = await import("ink"); await render( , ); };