File size: 5,338 Bytes
f8b5d42 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | import React, { useState } from "react";
import { X } from "@phosphor-icons/react";
import System from "@/models/system";
import showToast from "@/utils/toast";
export default function AddVariableModal({ closeModal, onRefresh }) {
const [error, setError] = useState(null);
const handleCreate = async (e) => {
e.preventDefault();
setError(null);
const formData = new FormData(e.target);
const newVariable = {};
for (const [key, value] of formData.entries())
newVariable[key] = value.trim();
if (!newVariable.key || !newVariable.value) {
setError("Key and value are required");
return;
}
try {
await System.promptVariables.create(newVariable);
showToast("Variable created successfully", "success", { clear: true });
if (onRefresh) onRefresh();
closeModal();
} catch (error) {
console.error("Error creating variable:", error);
setError("Failed to create variable");
}
};
return (
<div className="fixed inset-0 z-50 overflow-auto bg-black bg-opacity-50 flex items-center justify-center">
<div className="relative w-full max-w-2xl bg-theme-bg-secondary rounded-lg shadow border-2 border-theme-modal-border">
<div className="relative p-6 border-b rounded-t border-theme-modal-border">
<div className="w-full flex gap-x-2 items-center">
<h3 className="text-xl font-semibold text-white overflow-hidden overflow-ellipsis whitespace-nowrap">
Add New Variable
</h3>
</div>
<button
onClick={closeModal}
type="button"
className="absolute top-4 right-4 transition-all duration-300 bg-transparent rounded-lg text-sm p-1 inline-flex items-center hover:bg-theme-modal-border hover:border-theme-modal-border hover:border-opacity-50 border-transparent border"
>
<X size={24} weight="bold" className="text-white" />
</button>
</div>
<div className="p-6">
<form onSubmit={handleCreate}>
<div className="space-y-4">
<div>
<label
htmlFor="key"
className="block mb-2 text-sm font-medium text-white"
>
Key
</label>
<input
name="key"
type="text"
minLength={3}
maxLength={255}
className="border-none bg-theme-settings-input-bg w-full text-white placeholder:text-theme-settings-input-placeholder text-sm rounded-lg focus:outline-primary-button active:outline-primary-button outline-none block w-full p-2.5"
placeholder="e.g., company_name"
required={true}
autoComplete="off"
pattern="^[a-zA-Z0-9_]+$"
/>
<p className="mt-2 text-xs text-white/60">
Key must be unique and will be used in prompts as {"{key}"}.
Only letters, numbers and underscores are allowed.
</p>
</div>
<div>
<label
htmlFor="value"
className="block mb-2 text-sm font-medium text-white"
>
Value
</label>
<input
name="value"
type="text"
className="border-none bg-theme-settings-input-bg w-full text-white placeholder:text-theme-settings-input-placeholder text-sm rounded-lg focus:outline-primary-button active:outline-primary-button outline-none block w-full p-2.5"
placeholder="e.g., Acme Corp"
required={true}
autoComplete="off"
/>
</div>
<div>
<label
htmlFor="description"
className="block mb-2 text-sm font-medium text-white"
>
Description
</label>
<input
name="description"
type="text"
className="border-none bg-theme-settings-input-bg w-full text-white placeholder:text-theme-settings-input-placeholder text-sm rounded-lg focus:outline-primary-button active:outline-primary-button outline-none block w-full p-2.5"
placeholder="Optional description"
autoComplete="off"
/>
</div>
{error && <p className="text-red-400 text-sm">Error: {error}</p>}
</div>
<div className="flex justify-between items-center mt-6 pt-6 border-t border-theme-modal-border">
<button
onClick={closeModal}
type="button"
className="transition-all duration-300 text-white hover:bg-zinc-700 px-4 py-2 rounded-lg text-sm"
>
Cancel
</button>
<button
type="submit"
className="transition-all duration-300 bg-white text-black hover:opacity-60 px-4 py-2 rounded-lg text-sm"
>
Create variable
</button>
</div>
</form>
</div>
</div>
</div>
);
}
|