Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🪟🔧 Connector builder: Performance improvements #20620

Merged
merged 118 commits into from
Jan 5, 2023
Merged
Show file tree
Hide file tree
Changes from 108 commits
Commits
Show all changes
118 commits
Select commit Hold shift + click to select a range
d2ed762
improve some types
Dec 5, 2022
f474a1c
Merge remote-tracking branch 'upstream/master' into chore-improve-con…
Dec 5, 2022
5b0521f
improve further
Dec 5, 2022
af659fd
Merge remote-tracking branch 'upstream/master' into chore-improve-con…
Dec 6, 2022
1cd3bbb
clean up a bit more
Dec 6, 2022
807c436
refactor loading state
Dec 6, 2022
6c76e0f
Merge remote-tracking branch 'upstream/master' into flash1293/connect…
Dec 6, 2022
05c3107
move loading state up
Dec 6, 2022
eee4303
remove isLoading references
Dec 6, 2022
7d6f977
remove unused props and make fetch connector error work
Dec 6, 2022
0fe11f0
remove special component for name
Dec 6, 2022
34d4814
remove top level state for unifinished flows
Dec 6, 2022
67d62c5
Merge remote-tracking branch 'upstream/master' into flash1293/connect…
Dec 6, 2022
afea882
Merge branch 'flash1293/connector-form-name-override' into flash1293/…
Dec 6, 2022
c7e7475
Merge branch 'master' into flash1293/connector-form-loading-state
Dec 6, 2022
cc7f65f
Merge branch 'chore-improve-connector-form-types' into flash1293/conn…
Dec 6, 2022
a1c6cbd
start removing uiwidget
Dec 6, 2022
9be8337
Update airbyte-webapp/src/views/Connector/ConnectorCard/ConnectorCard…
Dec 6, 2022
37cee8f
Merge remote-tracking branch 'upstream/master' into flash1293/connect…
Dec 6, 2022
5686241
Merge branch 'flash1293/connector-form-loading-state' of github.com:a…
Dec 6, 2022
7b73364
remove undefined option for selected id
Dec 6, 2022
7058d26
Merge branch 'flash1293/connector-form-loading-state' into flash1293/…
Dec 6, 2022
dd7e82a
Merge branch 'flash1293/connector-form-name-override' into flash1293/…
Dec 6, 2022
6d4c7d3
Merge remote-tracking branch 'upstream/master' into flash1293/connect…
Dec 7, 2022
d624792
Merge branch 'flash1293/connector-form-loading-state' into flash1293/…
Dec 7, 2022
36cf941
Merge branch 'flash1293/connector-form-name-override' into flash1293/…
Dec 7, 2022
b7a6322
Merge remote-tracking branch 'upstream/master' into flash1293/connect…
Dec 7, 2022
72b602a
Merge branch 'flash1293/connector-form-loading-state' into flash1293/…
Dec 7, 2022
5e47a4a
Merge branch 'flash1293/connector-form-name-override' into flash1293/…
Dec 7, 2022
6c71028
Merge remote-tracking branch 'origin/master' into flash1293/connector…
Dec 8, 2022
809625f
remove unused prop
Dec 8, 2022
10446eb
Merge branch 'flash1293/connector-form-loading-state' into flash1293/…
Dec 8, 2022
4a7a885
Merge branch 'flash1293/connector-form-name-override' into flash1293/…
Dec 8, 2022
2024b60
Merge branch 'flash1293/connector-form-unifinished-flows' into flash1…
Dec 8, 2022
ee30092
fix types
Dec 8, 2022
d91df38
remove uiwidget state
Dec 8, 2022
93fe558
Merge remote-tracking branch 'origin/master' into flash1293/connector…
Dec 9, 2022
cbc023a
Merge branch 'flash1293/connector-form-name-override' into flash1293/…
Dec 9, 2022
ec54d38
Merge branch 'flash1293/connector-form-unifinished-flows' into flash1…
Dec 9, 2022
47152ea
clean up
Dec 9, 2022
6ec0e10
adjust comment
Dec 9, 2022
1aa7829
handle errors in a nice way
Dec 9, 2022
7b90088
do not respect default on oneOf fields
Dec 9, 2022
fbefbdd
rename to formblock
Dec 9, 2022
6b3e5e2
reduce re-renders
Dec 9, 2022
9aa3f80
Merge remote-tracking branch 'origin/master' into flash1293/connector…
Dec 12, 2022
c765003
Merge branch 'flash1293/connector-form-unifinished-flows' into flash1…
Dec 12, 2022
5cd77ec
pass error to secure inputs
Dec 12, 2022
5dfbc22
Merge remote-tracking branch 'origin/master' into flash1293/connector…
Dec 13, 2022
a6aa741
simplify and improve styling
Dec 13, 2022
95717d2
align top
Dec 13, 2022
40d162d
Merge branch 'flash1293/connector-form-unifinished-flows' into flash1…
Dec 13, 2022
b9384ee
Merge remote-tracking branch 'origin/master' into flash1293/connector…
Dec 13, 2022
582a5f2
code review
Dec 13, 2022
18d6ce8
remove comment
Dec 13, 2022
60c1f1c
Merge branch 'master' into flash1293/connector-form-remove-ui-widget-…
Dec 14, 2022
9cb595d
Merge remote-tracking branch 'origin/master' into flash1293/connector…
Dec 15, 2022
fe74a45
review comments
Dec 15, 2022
5c00ad0
rename file
Dec 15, 2022
bd0dffc
be strict about boolean values
Dec 15, 2022
1ff8c13
add example
Dec 15, 2022
c6ee526
track form error in error boundary
Dec 15, 2022
05bbd6f
Merge branch 'flash1293/connector-form-remove-ui-widget-state' of git…
Dec 15, 2022
fff4703
Merge remote-tracking branch 'origin/master' into flash1293/connector…
Dec 16, 2022
94ba866
review comments
Dec 16, 2022
97bb0a7
handle unexpected cases better
Dec 16, 2022
633b9b2
Merge branch 'master' into flash1293/connector-form-remove-ui-widget-…
Dec 16, 2022
e47517f
Merge branch 'master' into flash1293/connector-form-remove-ui-widget-…
Dec 16, 2022
e931956
Merge remote-tracking branch 'origin/master' into feature/connector-b…
Dec 16, 2022
219fcc1
speed up some bits
Dec 17, 2022
8cb6873
more changes
Dec 17, 2022
6889f66
enrich error with connector id
Dec 19, 2022
7b60406
Merge branch 'flash1293/connector-form-remove-ui-widget-state' into f…
Dec 19, 2022
d5e56eb
Merge branch 'master' into flash1293/connector-form-remove-ui-widget-…
Dec 19, 2022
35a74ba
Merge branch 'flash1293/connector-form-remove-ui-widget-state' into f…
Dec 19, 2022
02c8096
🪟🎉 Add copy stream button (#20577)
Dec 19, 2022
526adfc
rename prop
Dec 20, 2022
7d49233
🪟🎉 Connector builder: Integrate connector form for test input (#20385)
Dec 20, 2022
c5da764
Merge remote-tracking branch 'origin/master' into flash1293/connector…
Dec 20, 2022
6c0bf9d
Merge branch 'flash1293/connector-form-remove-ui-widget-state' into f…
Dec 20, 2022
477977f
use request_body_json instead of request_body_data
lmossman Dec 20, 2022
200cfe7
:window: :art: Move `Add` button into the line of Connector Builder k…
lmossman Dec 21, 2022
c7fd310
🪟🎉 Connector builder: Allow defining inputs (#20431)
Dec 22, 2022
e0e3796
fix merge conflict with dropdown prop being renamed to control
Dec 22, 2022
e23a6d8
[Connector Builder] Add paginator (#20698)
lmossman Dec 22, 2022
610e668
[Connector Builder] Add stream slicer (#20748)
lmossman Dec 22, 2022
e68ff49
debounce form builder values update to reduce load
Dec 22, 2022
9ccf294
Merge branch 'master' into flash1293/connector-form-remove-ui-widget-…
Dec 22, 2022
ae9a229
Merge branch 'flash1293/connector-form-remove-ui-widget-state' into f…
Dec 22, 2022
a9e1d09
🪟🔧 Connector builder: use new lowcode manifest (#20715)
Dec 22, 2022
e4f7bba
debounce validation as well
Dec 27, 2022
16c71ae
Merge branch 'master' into flash1293/connector-form-remove-ui-widget-…
Jan 2, 2023
54c070d
Merge branch 'flash1293/connector-form-remove-ui-widget-state' into f…
Jan 2, 2023
2e20fa6
akways show stream test button in error state if there are errors
Jan 2, 2023
65199d0
fix type of oauth input
Jan 2, 2023
6b71161
Merge branch 'feature/connector-builder' into flash1293/performance-work
Jan 2, 2023
81c12b2
review comments
Jan 2, 2023
b447b24
fix more
Jan 2, 2023
92722e0
Merge branch 'master' into flash1293/connector-form-remove-ui-widget-…
Jan 3, 2023
718c233
Merge branch 'flash1293/connector-form-remove-ui-widget-state' into f…
Jan 3, 2023
26acc32
Merge branch 'feature/connector-builder' into flash1293/performance-work
Jan 3, 2023
6a8be0b
Merge remote-tracking branch 'origin/master' into feature/connector-b…
Jan 3, 2023
e166b03
Merge branch 'feature/connector-builder' into flash1293/performance-work
Jan 3, 2023
16ce351
add validation schema for add stream form
lmossman Jan 3, 2023
25d6586
validate all views on test click
lmossman Jan 3, 2023
64a5eb9
add type to prevent console warning
lmossman Jan 4, 2023
bb808df
Merge branch 'feature/connector-builder' into flash1293/performance-work
Jan 4, 2023
59fdde9
Merge remote-tracking branch 'origin/master' into flash1293/performan…
Jan 4, 2023
3b630e7
Merge remote-tracking branch 'origin/master' into flash1293/performan…
Jan 5, 2023
dc3409c
review comment
Jan 5, 2023
07b1282
make sure testing state and form state stay consistent
Jan 5, 2023
a50f75a
improve builder errors
Jan 5, 2023
f32e101
Merge remote-tracking branch 'origin/master' into flash1293/performan…
Jan 5, 2023
a4217ad
remove test state from streamconfig view
Jan 5, 2023
c45ca5b
merge with master
lmossman Jan 5, 2023
1352249
remove console log
lmossman Jan 5, 2023
2b730a8
remove unnecessary positive index check
lmossman Jan 5, 2023
ee32865
Merge branch 'master' into flash1293/performance-work
lmossman Jan 5, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Form } from "formik";
import debounce from "lodash/debounce";
import { useEffect, useMemo } from "react";

import { BuilderView, useConnectorBuilderState } from "services/connectorBuilder/ConnectorBuilderStateService";
import { BuilderView, useConnectorBuilderFormState } from "services/connectorBuilder/ConnectorBuilderStateService";

import { builderFormValidationSchema, BuilderFormValues } from "../types";
import styles from "./Builder.module.scss";
Expand All @@ -29,7 +29,7 @@ function getView(selectedView: BuilderView) {
}

export const Builder: React.FC<BuilderProps> = ({ values, toggleYamlEditor, validateForm }) => {
const { setBuilderFormValues, selectedView } = useConnectorBuilderState();
const { setBuilderFormValues, selectedView } = useConnectorBuilderFormState();
const debouncedSetBuilderFormValues = useMemo(
() =>
debounce((values) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { faSliders, faUser } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import classnames from "classnames";
import { useFormikContext } from "formik";
import React from "react";
import { FormattedMessage, useIntl } from "react-intl";

import Indicator from "components/Indicator";
Expand All @@ -10,7 +11,7 @@ import { Heading } from "components/ui/Heading";
import { Text } from "components/ui/Text";

import { useConfirmationModalService } from "hooks/services/ConfirmationModal";
import { BuilderView, useConnectorBuilderState } from "services/connectorBuilder/ConnectorBuilderStateService";
import { BuilderView, useConnectorBuilderFormState } from "services/connectorBuilder/ConnectorBuilderStateService";

import { DownloadYamlButton } from "../DownloadYamlButton";
import { BuilderFormValues, DEFAULT_BUILDER_FORM_VALUES, getInferredInputs } from "../types";
Expand Down Expand Up @@ -52,11 +53,11 @@ interface BuilderSidebarProps {
toggleYamlEditor: () => void;
}

export const BuilderSidebar: React.FC<BuilderSidebarProps> = ({ className, toggleYamlEditor }) => {
export const BuilderSidebar: React.FC<BuilderSidebarProps> = React.memo(({ className, toggleYamlEditor }) => {
const { formatMessage } = useIntl();
const { hasErrors } = useBuilderErrors();
const { openConfirmationModal, closeConfirmationModal } = useConfirmationModalService();
const { yamlManifest, selectedView, setSelectedView, setTestStreamIndex } = useConnectorBuilderState();
const { yamlManifest, selectedView, setSelectedView, setTestStreamIndex } = useConnectorBuilderFormState();
const { values, setValues } = useFormikContext<BuilderFormValues>();
const handleResetForm = () => {
openConfirmationModal({
Expand Down Expand Up @@ -150,4 +151,4 @@ export const BuilderSidebar: React.FC<BuilderSidebarProps> = ({ className, toggl
</Button>
</div>
);
};
});
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { useField } from "formik";
import { useIntl } from "react-intl";

import { useConfirmationModalService } from "hooks/services/ConfirmationModal";
import { BuilderView, useConnectorBuilderState } from "services/connectorBuilder/ConnectorBuilderStateService";
import { BuilderView, useConnectorBuilderFormState } from "services/connectorBuilder/ConnectorBuilderStateService";

import { BuilderStream } from "../types";
import { AddStreamButton } from "./AddStreamButton";
Expand All @@ -26,7 +26,7 @@ export const StreamConfigView: React.FC<StreamConfigViewProps> = ({ streamNum })
const { formatMessage } = useIntl();
const [field, , helpers] = useField<BuilderStream[]>("streams");
const { openConfirmationModal, closeConfirmationModal } = useConfirmationModalService();
const { setSelectedView, setTestStreamIndex } = useConnectorBuilderState();
const { setSelectedView, setTestStreamIndex } = useConnectorBuilderFormState();

const streamPath = `streams[${streamNum}]`;
const streamFieldPath = (fieldPath: string) => `${streamPath}.${fieldPath}`;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { FormattedMessage } from "react-intl";
import { Button } from "components/ui/Button";
import { Tooltip } from "components/ui/Tooltip";

import { useConnectorBuilderState } from "services/connectorBuilder/ConnectorBuilderStateService";
import { useConnectorBuilderFormState } from "services/connectorBuilder/ConnectorBuilderStateService";
import { downloadFile } from "utils/file";

import styles from "./DownloadYamlButton.module.scss";
Expand All @@ -18,7 +18,7 @@ interface DownloadYamlButtonProps {
}

export const DownloadYamlButton: React.FC<DownloadYamlButtonProps> = ({ className, yaml, yamlIsValid }) => {
const { editorView } = useConnectorBuilderState();
const { editorView } = useConnectorBuilderFormState();
const { hasErrors, validateAndTouch } = useBuilderErrors();

const downloadYaml = () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,25 @@ import { Tooltip } from "components/ui/Tooltip";

import { SourceDefinitionSpecificationDraft } from "core/domain/connector";
import { StreamReadRequestBodyConfig } from "core/request/ConnectorBuilderClient";
import { useConnectorBuilderState } from "services/connectorBuilder/ConnectorBuilderStateService";
import { useConnectorBuilderTestState } from "services/connectorBuilder/ConnectorBuilderStateService";
import { useConnectorBuilderFormState } from "services/connectorBuilder/ConnectorBuilderStateService";
import { ConnectorForm } from "views/Connector/ConnectorForm";

import styles from "./ConfigMenu.module.scss";
import { ConfigMenuErrorBoundaryComponent } from "./ConfigMenuErrorBoundary";

interface ConfigMenuProps {
className?: string;
configJsonErrors: number;
testInputJsonErrors: number;
isOpen: boolean;
setIsOpen: (open: boolean) => void;
}

export const ConfigMenu: React.FC<ConfigMenuProps> = ({ className, configJsonErrors, isOpen, setIsOpen }) => {
export const ConfigMenu: React.FC<ConfigMenuProps> = ({ className, testInputJsonErrors, isOpen, setIsOpen }) => {
const { formatMessage } = useIntl();
const { configJson, setConfigJson, jsonManifest, editorView, setEditorView } = useConnectorBuilderState();
const { jsonManifest, editorView, setEditorView } = useConnectorBuilderFormState();

const { testInputJson, setTestInputJson } = useConnectorBuilderTestState();

const [showInputsWarning, setShowInputsWarning] = useLocalStorage<boolean>("connectorBuilderInputsWarning", true);

Expand Down Expand Up @@ -61,8 +64,8 @@ export const ConfigMenu: React.FC<ConfigMenuProps> = ({ className, configJsonErr
>
<FormattedMessage id="connectorBuilder.inputsButton" />
</Button>
{configJsonErrors > 0 && (
<NumberBadge className={styles.inputsErrorBadge} value={configJsonErrors} color="red" />
{testInputJsonErrors > 0 && (
<NumberBadge className={styles.inputsErrorBadge} value={testInputJsonErrors} color="red" />
)}
</>
}
Expand Down Expand Up @@ -107,16 +110,16 @@ export const ConfigMenu: React.FC<ConfigMenuProps> = ({ className, configJsonErr
bodyClassName={styles.formContent}
footerClassName={styles.inputFormModalFooter}
selectedConnectorDefinitionSpecification={connectorDefinitionSpecification}
formValues={{ connectionConfiguration: configJson }}
formValues={{ connectionConfiguration: testInputJson }}
onSubmit={async (values) => {
setConfigJson(values.connectionConfiguration as StreamReadRequestBodyConfig);
setTestInputJson(values.connectionConfiguration as StreamReadRequestBodyConfig);
setIsOpen(false);
}}
onCancel={() => {
setIsOpen(false);
}}
onReset={() => {
setConfigJson({});
setTestInputJson({});
}}
submitLabel={formatMessage({ id: "connectorBuilder.saveInputsForm" })}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@ import { useIntl } from "react-intl";
import { Heading } from "components/ui/Heading";
import { ListBox, ListBoxControlButtonProps } from "components/ui/ListBox";

import { useConnectorBuilderState } from "services/connectorBuilder/ConnectorBuilderStateService";
import {
useConnectorBuilderTestState,
useConnectorBuilderFormState,
} from "services/connectorBuilder/ConnectorBuilderStateService";

import { ReactComponent as CaretDownIcon } from "../../ui/ListBox/CaretDownIcon.svg";
import styles from "./StreamSelector.module.scss";
Expand All @@ -27,7 +30,8 @@ const ControlButton: React.FC<ListBoxControlButtonProps<string>> = ({ selectedOp

export const StreamSelector: React.FC<StreamSelectorProps> = ({ className }) => {
const { formatMessage } = useIntl();
const { streams, selectedView, testStreamIndex, setSelectedView, setTestStreamIndex } = useConnectorBuilderState();
const { selectedView, testStreamIndex, setSelectedView, setTestStreamIndex } = useConnectorBuilderFormState();
const { streams } = useConnectorBuilderTestState();
const options = streams.map((stream) => {
const label =
stream.name && stream.name.trim() ? capitalize(stream.name) : formatMessage({ id: "connectorBuilder.emptyName" });
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,27 +7,27 @@ import { Button } from "components/ui/Button";
import { Text } from "components/ui/Text";
import { Tooltip } from "components/ui/Tooltip";

import { useConnectorBuilderState } from "services/connectorBuilder/ConnectorBuilderStateService";
import { useConnectorBuilderFormState } from "services/connectorBuilder/ConnectorBuilderStateService";

import { useBuilderErrors } from "../useBuilderErrors";
import styles from "./StreamTestButton.module.scss";

interface StreamTestButtonProps {
readStream: () => void;
hasConfigJsonErrors: boolean;
hasTestInputJsonErrors: boolean;
setTestInputOpen: (open: boolean) => void;
}

export const StreamTestButton: React.FC<StreamTestButtonProps> = ({
readStream,
hasConfigJsonErrors,
hasTestInputJsonErrors,
setTestInputOpen,
}) => {
const { editorView, yamlIsValid } = useConnectorBuilderState();
const { editorView, yamlIsValid } = useConnectorBuilderFormState();
const { hasErrors, validateAndTouch } = useBuilderErrors();

const handleClick = () => {
if (hasConfigJsonErrors) {
if (hasTestInputJsonErrors) {
setTestInputOpen(true);
return;
}
Expand All @@ -49,7 +49,7 @@ export const StreamTestButton: React.FC<StreamTestButtonProps> = ({
tooltipContent = <FormattedMessage id="connectorBuilder.invalidYamlTest" />;
}

if ((editorView === "ui" && hasErrors(false)) || hasConfigJsonErrors) {
if ((editorView === "ui" && hasErrors(false)) || hasTestInputJsonErrors) {
showWarningIcon = true;
tooltipContent = <FormattedMessage id="connectorBuilder.configErrorsTest" />;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,23 @@ import { Spinner } from "components/ui/Spinner";
import { Text } from "components/ui/Text";

import { useReadStream } from "services/connectorBuilder/ConnectorBuilderApiService";
import { useConnectorBuilderState } from "services/connectorBuilder/ConnectorBuilderStateService";
import {
useConnectorBuilderTestState,
useConnectorBuilderFormState,
} from "services/connectorBuilder/ConnectorBuilderStateService";

import { LogsDisplay } from "./LogsDisplay";
import { ResultDisplay } from "./ResultDisplay";
import { StreamTestButton } from "./StreamTestButton";
import styles from "./StreamTester.module.scss";

export const StreamTester: React.FC<{
hasConfigJsonErrors: boolean;
hasTestInputJsonErrors: boolean;
setTestInputOpen: (open: boolean) => void;
}> = ({ hasConfigJsonErrors, setTestInputOpen }) => {
}> = ({ hasTestInputJsonErrors, setTestInputOpen }) => {
const { formatMessage } = useIntl();
const { jsonManifest, configJson, streams, testStreamIndex } = useConnectorBuilderState();
const { jsonManifest, testStreamIndex } = useConnectorBuilderFormState();
const { streams, testInputJson } = useConnectorBuilderTestState();
const {
data: streamReadData,
refetch: readStream,
Expand All @@ -28,7 +32,7 @@ export const StreamTester: React.FC<{
} = useReadStream({
manifest: jsonManifest,
stream: streams[testStreamIndex]?.name,
config: configJson,
config: testInputJson,
});

const [logsFlex, setLogsFlex] = useState(0);
Expand Down Expand Up @@ -60,7 +64,7 @@ export const StreamTester: React.FC<{

<StreamTestButton
readStream={readStream}
hasConfigJsonErrors={hasConfigJsonErrors}
hasTestInputJsonErrors={hasTestInputJsonErrors}
setTestInputOpen={setTestInputOpen}
/>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@ import { jsonSchemaToFormBlock } from "core/form/schemaToFormBlock";
import { buildYupFormForJsonSchema } from "core/form/schemaToYup";
import { StreamReadRequestBodyConfig } from "core/request/ConnectorBuilderClient";
import { Spec } from "core/request/ConnectorManifest";
import { useConnectorBuilderState } from "services/connectorBuilder/ConnectorBuilderStateService";
import {
useConnectorBuilderTestState,
useConnectorBuilderFormState,
} from "services/connectorBuilder/ConnectorBuilderStateService";
import { links } from "utils/links";

import { ConfigMenu } from "./ConfigMenu";
Expand All @@ -20,28 +23,29 @@ import styles from "./StreamTestingPanel.module.scss";

const EMPTY_SCHEMA = {};

function useConfigJsonErrors(configJson: StreamReadRequestBodyConfig, spec?: Spec): number {
function useTestInputJsonErrors(testInputJson: StreamReadRequestBodyConfig, spec?: Spec): number {
return useMemo(() => {
try {
const jsonSchema = spec && spec.connection_specification ? spec.connection_specification : EMPTY_SCHEMA;
const formFields = jsonSchemaToFormBlock(jsonSchema);
const validationSchema = buildYupFormForJsonSchema(jsonSchema, formFields);
validationSchema.validateSync(configJson, { abortEarly: false });
validationSchema.validateSync(testInputJson, { abortEarly: false });
return 0;
} catch (e) {
if (ValidationError.isError(e)) {
return e.errors.length;
}
return 1;
}
}, [configJson, spec]);
}, [testInputJson, spec]);
}

export const StreamTestingPanel: React.FC<unknown> = () => {
const [isTestInputOpen, setTestInputOpen] = useState(false);
const { jsonManifest, configJson, streamListErrorMessage, yamlEditorIsMounted } = useConnectorBuilderState();
const { jsonManifest, yamlEditorIsMounted } = useConnectorBuilderFormState();
const { testInputJson, streamListErrorMessage } = useConnectorBuilderTestState();

const configJsonErrors = useConfigJsonErrors(configJson, jsonManifest.spec);
const testInputJsonErrors = useTestInputJsonErrors(testInputJson, jsonManifest.spec);

if (!yamlEditorIsMounted) {
return (
Expand All @@ -67,13 +71,13 @@ export const StreamTestingPanel: React.FC<unknown> = () => {
<>
<ConfigMenu
className={styles.configButton}
configJsonErrors={configJsonErrors}
testInputJsonErrors={testInputJsonErrors}
isOpen={isTestInputOpen}
setIsOpen={setTestInputOpen}
/>
<div className={styles.selectAndTestContainer}>
<StreamSelector className={styles.streamSelector} />
<StreamTester hasConfigJsonErrors={configJsonErrors > 0} setTestInputOpen={setTestInputOpen} />
<StreamTester hasTestInputJsonErrors={testInputJsonErrors > 0} setTestInputOpen={setTestInputOpen} />
</div>
</>
)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { CodeEditor } from "components/ui/CodeEditor";

import { ConnectorManifest } from "core/request/ConnectorManifest";
import { useConfirmationModalService } from "hooks/services/ConfirmationModal";
import { useConnectorBuilderState } from "services/connectorBuilder/ConnectorBuilderStateService";
import { useConnectorBuilderFormState } from "services/connectorBuilder/ConnectorBuilderStateService";

import { UiYamlToggleButton } from "../Builder/UiYamlToggleButton";
import { DownloadYamlButton } from "../DownloadYamlButton";
Expand All @@ -31,7 +31,7 @@ export const YamlEditor: React.FC<YamlEditorProps> = ({ toggleYamlEditor }) => {
setYamlEditorIsMounted,
setYamlIsValid,
setJsonManifest,
} = useConnectorBuilderState();
} = useConnectorBuilderFormState();
const [yamlValue, setYamlValue] = useState(yamlManifest);

// debounce the setJsonManifest calls so that it doesnt result in a network call for every keystroke
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ import { FormikErrors, useFormikContext } from "formik";
import intersection from "lodash/intersection";
import { useCallback } from "react";

import { BuilderView, useConnectorBuilderState } from "services/connectorBuilder/ConnectorBuilderStateService";
import { BuilderView, useConnectorBuilderFormState } from "services/connectorBuilder/ConnectorBuilderStateService";

import { BuilderFormValues } from "./types";

export const useBuilderErrors = () => {
const { touched, errors, validateForm, setFieldTouched } = useFormikContext<BuilderFormValues>();
const { setSelectedView, setTestStreamIndex } = useConnectorBuilderState();
const { setSelectedView, setTestStreamIndex } = useConnectorBuilderFormState();

const invalidViews = useCallback(
(ignoreUntouched: boolean, limitToViews?: BuilderView[], inputErrors?: FormikErrors<BuilderFormValues>) => {
Expand Down
Loading