Fixed logic when options are present but its not global variables.

This commit is contained in:
Lucas Oliveira 2024-03-20 18:26:05 +01:00
commit 1b6102524a
3 changed files with 75 additions and 56 deletions

View file

@ -4,7 +4,7 @@ import { useEffect, useRef, useState } from "react";
import { InputComponentType } from "../../types/components"; import { InputComponentType } from "../../types/components";
import { handleKeyDown } from "../../utils/reactflowUtils"; import { handleKeyDown } from "../../utils/reactflowUtils";
import { classNames, cn } from "../../utils/utils"; import { classNames, cn } from "../../utils/utils";
import IconComponent from "../genericIconComponent"; import ForwardedIconComponent from "../genericIconComponent";
import { import {
Command, Command,
CommandEmpty, CommandEmpty,
@ -19,7 +19,7 @@ import { Popover, PopoverContentWithoutPortal } from "../ui/popover";
export default function InputComponent({ export default function InputComponent({
autoFocus = false, autoFocus = false,
onBlur, onBlur,
value, value = "",
onChange, onChange,
disabled, disabled,
required = false, required = false,
@ -42,7 +42,7 @@ export default function InputComponent({
// Clear component state // Clear component state
useEffect(() => { useEffect(() => {
if (disabled && value !== "") { if (disabled && value && onChange && value !== "") {
onChange(""); onChange("");
} }
}, [disabled]); }, [disabled]);
@ -75,7 +75,7 @@ export default function InputComponent({
)} )}
placeholder={password && editNode ? "Key" : placeholder} placeholder={password && editNode ? "Key" : placeholder}
onChange={(e) => { onChange={(e) => {
onChange(e.target.value); onChange && onChange(e.target.value);
}} }}
onCopy={(e) => { onCopy={(e) => {
e.preventDefault(); e.preventDefault();
@ -95,25 +95,30 @@ export default function InputComponent({
ref={refInput} ref={refInput}
type="text" type="text"
onBlur={onInputLostFocus} onBlur={onInputLostFocus}
value={value} value={
selectedOption !== "" || !onChange ? selectedOption : value
}
autoFocus={autoFocus} autoFocus={autoFocus}
disabled={disabled || selectedOption !== ""} disabled={disabled}
onClick={() => { onClick={() => {
selectedOption !== "" && setShowOptions(true); (selectedOption !== "" || !onChange) && setShowOptions(true);
}} }}
required={required} required={required}
className={classNames( className={classNames(
password && !pwdVisible && value !== "" password &&
selectedOption === "" &&
!pwdVisible &&
value !== ""
? " text-clip password " ? " text-clip password "
: "", : "",
editNode ? " input-edit-node " : "", editNode ? " input-edit-node " : "",
password && editNode ? "pr-8" : "", password && selectedOption === "" && editNode ? "pr-8" : "",
password && !editNode ? "pr-10" : "", password && selectedOption === "" && !editNode ? "pr-10" : "",
className! className!
)} )}
placeholder={password && editNode ? "Key" : placeholder} placeholder={password && editNode ? "Key" : placeholder}
onChange={(e) => { onChange={(e) => {
onChange(e.target.value); onChange && onChange(e.target.value);
}} }}
onKeyDown={(e) => { onKeyDown={(e) => {
handleKeyDown(e, value, ""); handleKeyDown(e, value, "");
@ -148,7 +153,7 @@ export default function InputComponent({
setShowOptions(false); setShowOptions(false);
}} }}
> >
<IconComponent <ForwardedIconComponent
name="Check" name="Check"
className={cn( className={cn(
"mr-2 h-4 w-4 text-primary", "mr-2 h-4 w-4 text-primary",
@ -169,11 +174,11 @@ export default function InputComponent({
</Popover> </Popover>
<div <div
className={cn( className={cn(
"pointer-events-auto absolute inset-y-0 h-full w-full", "pointer-events-auto absolute inset-y-0 h-full w-full cursor-pointer",
selectedOption !== "" ? "" : "hidden" selectedOption !== "" || !onChange ? "" : "hidden"
)} )}
onClick={ onClick={
selectedOption !== "" selectedOption !== "" || !onChange
? (e) => { ? (e) => {
setShowOptions((old) => !old); setShowOptions((old) => !old);
e.preventDefault(); e.preventDefault();
@ -187,21 +192,30 @@ export default function InputComponent({
<span <span
className={cn( className={cn(
password ? "right-8" : "right-0", password && selectedOption === "" ? "right-8" : "right-0",
"absolute inset-y-0 flex items-center pr-2" "absolute inset-y-0 flex items-center pr-2.5"
)} )}
> >
<button <button
onClick={() => { onClick={() => {
setShowOptions(!showOptions); setShowOptions(!showOptions);
}} }}
className="text-muted-foreground hover:text-accent-foreground" className={cn(
selectedOption !== ""
? "text-medium-indigo"
: "text-muted-foreground",
"hover:text-accent-foreground"
)}
> >
<IconComponent name="Globe" className="h-4 w-4" aria-hidden="true" /> <ForwardedIconComponent
name="Globe"
className={"h-4 w-4"}
aria-hidden="true"
/>
</button> </button>
</span> </span>
{password && ( {password && selectedOption === "" && (
<button <button
type="button" type="button"
tabIndex={-1} tabIndex={-1}
@ -217,6 +231,7 @@ export default function InputComponent({
}} }}
> >
{password && {password &&
selectedOption === "" &&
(pwdVisible ? ( (pwdVisible ? (
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"

View file

@ -1,4 +1,5 @@
import { useState } from "react"; import { useState } from "react";
import ForwardedIconComponent from "../../../components/genericIconComponent";
import InputComponent from "../../../components/inputComponent"; import InputComponent from "../../../components/inputComponent";
import { Button } from "../../../components/ui/button"; import { Button } from "../../../components/ui/button";
import { Input } from "../../../components/ui/input"; import { Input } from "../../../components/ui/input";
@ -10,7 +11,7 @@ import { useGlobalVariablesStore } from "../../../stores/globalVariables";
//TODO IMPLEMENT FORM LOGIC //TODO IMPLEMENT FORM LOGIC
export default function AddNewVariableButton({children}): JSX.Element { export default function AddNewVariableButton({ children }): JSX.Element {
const [key, setKey] = useState(""); const [key, setKey] = useState("");
const [value, setValue] = useState(""); const [value, setValue] = useState("");
const [provider, setProvider] = useState(""); const [provider, setProvider] = useState("");
@ -35,42 +36,45 @@ export default function AddNewVariableButton({children}): JSX.Element {
return ( return (
<BaseModal open={open} setOpen={setOpen} size="x-small"> <BaseModal open={open} setOpen={setOpen} size="x-small">
<BaseModal.Header <BaseModal.Header
description={"write a text variable to use anywhere on your flow"} description={"Write a text global variable to use in any flow."}
> >
<span>Create a new Variable</span> <span className="pr-2"> Create Variable </span>
<ForwardedIconComponent
name="Globe"
className="h-6 w-6 pl-1 text-primary "
aria-hidden="true"
/>
</BaseModal.Header> </BaseModal.Header>
<BaseModal.Trigger> <BaseModal.Trigger>{children}</BaseModal.Trigger>
{children}
</BaseModal.Trigger>
<BaseModal.Content> <BaseModal.Content>
<div className="flex gap-4 h-full w-full flex-col align-middle"> <div className="flex h-full w-full flex-col gap-4 align-middle">
<Label>Variable name </Label> <Label>Variable name </Label>
<Input <Input
value={key} value={key}
onChange={(e) => { onChange={(e) => {
setKey(e.target.value); setKey(e.target.value);
}} }}
placeholder="Insert a name for the variable..." placeholder="Insert a name for the variable..."
></Input> ></Input>
<Label>Provider (optional) </Label> <Label>Provider (optional) </Label>
<InputComponent <InputComponent
value={provider} setSelectedOption={(e) => {
onChange={(e) => { setProvider(e);
setProvider(e); }}
}} selectedOption={provider}
password={false} password={false}
options={["OPENAI_API_KEY", "ANTHROPIC_API_KEY"]} options={["OPENAI_API_KEY", "ANTHROPIC_API_KEY"]}
placeholder="Choose a provider between the environment variables..." placeholder="Choose a provider between the environment variables..."
></InputComponent> ></InputComponent>
<Label>Variable Value </Label> <Label>Variable Value </Label>
<Textarea <Textarea
value={value} value={value}
onChange={(e) => { onChange={(e) => {
setValue(e.target.value); setValue(e.target.value);
}} }}
placeholder="Insert a value for the variable..." placeholder="Insert a value for the variable..."
className="w-full resize-none custom-scroll" className="w-full resize-none custom-scroll"
/> />
</div> </div>
</BaseModal.Content> </BaseModal.Content>
<BaseModal.Footer> <BaseModal.Footer>

View file

@ -7,9 +7,9 @@ import { sourceHandleType, targetHandleType } from "./../flow/index";
export type InputComponentType = { export type InputComponentType = {
autoFocus?: boolean; autoFocus?: boolean;
onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void; onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;
value: string; value?: string;
disabled?: boolean; disabled?: boolean;
onChange: (value: string) => void; onChange?: (value: string) => void;
password: boolean; password: boolean;
required?: boolean; required?: boolean;
isForm?: boolean; isForm?: boolean;