diff --git a/src-web/components/UrlBar.tsx b/src-web/components/UrlBar.tsx
index 2e3efa89..f2c4f37c 100644
--- a/src-web/components/UrlBar.tsx
+++ b/src-web/components/UrlBar.tsx
@@ -1,6 +1,6 @@
import classnames from 'classnames';
import type { FormEvent } from 'react';
-import { memo, useCallback, useMemo } from 'react';
+import { memo, useCallback } from 'react';
import { useIsResponseLoading } from '../hooks/useIsResponseLoading';
import { useSendRequest } from '../hooks/useSendRequest';
import { useUpdateRequest } from '../hooks/useUpdateRequest';
@@ -20,7 +20,6 @@ export const UrlBar = memo(function UrlBar({ request, className }: Props) {
const handleMethodChange = useCallback((method: string) => updateRequest.mutate({ method }), []);
const handleUrlChange = useCallback((url: string) => updateRequest.mutate({ url }), []);
const loading = useIsResponseLoading(request.id);
- const useEditor = useMemo(() => ({ useTemplating: true, contentType: 'url' }), []);
const handleSubmit = useCallback(
async (e: FormEvent) => {
@@ -35,7 +34,8 @@ export const UrlBar = memo(function UrlBar({ request, className }: Props) {
, 'onChange' | 'onFocus'> & {
- name: string;
- label: string;
- hideLabel?: boolean;
- labelClassName?: string;
- containerClassName?: string;
- onChange?: (value: string) => void;
- onFocus?: () => void;
- useEditor?: Pick;
- defaultValue?: string;
- leftSlot?: ReactNode;
- rightSlot?: ReactNode;
- size?: 'sm' | 'md';
- className?: string;
- placeholder?: string;
- autoFocus?: boolean;
-};
+type Props = Omit, 'onChange' | 'onFocus'> &
+ Pick & {
+ name: string;
+ label: string;
+ hideLabel?: boolean;
+ labelClassName?: string;
+ containerClassName?: string;
+ onChange?: (value: string) => void;
+ onFocus?: () => void;
+ defaultValue?: string;
+ leftSlot?: ReactNode;
+ rightSlot?: ReactNode;
+ size?: 'sm' | 'md';
+ className?: string;
+ placeholder?: string;
+ autoFocus?: boolean;
+ validate?: (v: string) => boolean;
+ require?: boolean;
+ };
export function Input({
label,
@@ -31,13 +34,15 @@ export function Input({
onChange,
placeholder,
size = 'md',
- useEditor,
name,
leftSlot,
rightSlot,
defaultValue,
+ validate,
+ require,
...props
}: Props) {
+ const [currentValue, setCurrentValue] = useState(defaultValue ?? '');
const id = `input-${name}`;
const inputClassName = classnames(
className,
@@ -46,6 +51,17 @@ export function Input({
!!rightSlot && '!pr-0.5',
);
+ const isValid = useMemo(() => {
+ if (require && !validateRequire(currentValue)) return false;
+ if (validate && !validate(currentValue)) return false;
+ return true;
+ }, [currentValue, validate, require]);
+
+ const handleChange = (value: string) => {
+ setCurrentValue(value);
+ onChange?.(value);
+ };
+
return (
);
}
+
+function validateRequire(v: string) {
+ return v.length > 0;
+}
diff --git a/src-web/components/core/PairEditor.tsx b/src-web/components/core/PairEditor.tsx
index 37686cae..e4c428bd 100644
--- a/src-web/components/core/PairEditor.tsx
+++ b/src-web/components/core/PairEditor.tsx
@@ -200,16 +200,6 @@ const FormRow = memo(function FormRow({
[onChange, pairContainer.pair.name, pairContainer.pair.enabled],
);
- const nameEditorConfig = useMemo(
- () => ({ useTemplating: true, autocomplete: nameAutocomplete }),
- [nameAutocomplete],
- );
-
- const valueEditorConfig = useMemo(
- () => ({ useTemplating: true, autocomplete: valueAutocomplete?.(pairContainer.pair.name) }),
- [valueAutocomplete, pairContainer.pair.name],
- );
-
const handleFocus = useCallback(() => onFocus?.(pairContainer), [onFocus, pairContainer]);
const handleDelete = useCallback(() => onDelete?.(pairContainer), [onDelete, pairContainer]);
@@ -263,13 +253,15 @@ const FormRow = memo(function FormRow({
)}
{onDelete ? (
)",