bolt.diy/app/components/settings/providers/APIKeysTab.tsx
2025-02-10 20:18:54 -08:00

78 lines
3.4 KiB
TypeScript

import { useState } from 'react';
import { toast } from 'react-toastify';
import Cookies from 'js-cookie';
import { anthropicNumFreeUsesCookieName, anthropicApiKeyCookieName, MaxFreeUses } from '~/utils/freeUses';
import { setNutAdminKey, setProblemsUsername, getNutAdminKey, getProblemsUsername } from '~/lib/replay/Problems';
export default function ConnectionsTab() {
const [apiKey, setApiKey] = useState(Cookies.get(anthropicApiKeyCookieName) || '');
const [username, setUsername] = useState(getProblemsUsername() || '');
const [adminKey, setAdminKey] = useState(getNutAdminKey() || '');
const numFreeUses = +(Cookies.get(anthropicNumFreeUsesCookieName) || 0);
const handleSaveAPIKey = async (key: string) => {
if (!key || !key.startsWith('sk-ant-')) {
toast.error('Please provide a valid Anthropic API key');
return;
}
Cookies.set('anthropicApiKey', key);
setApiKey(key);
};
const handleSaveUsername = async (username: string) => {
setProblemsUsername(username);
setUsername(username);
};
const handleSaveAdminKey = async (key: string) => {
setNutAdminKey(key);
setAdminKey(key);
};
return (
<div className="p-4 mb-4 border border-bolt-elements-borderColor rounded-lg bg-bolt-elements-background-depth-3">
<h3 className="text-lg font-medium text-bolt-elements-textPrimary mb-4">Anthropic API Key</h3>
<div className="flex mb-4">
<div className="flex-1 mr-2">
<input
type="text"
value={apiKey}
onChange={(e) => handleSaveAPIKey(e.target.value)}
className="w-full bg-white dark:bg-bolt-elements-background-depth-4 relative px-2 py-1.5 rounded-md focus:outline-none placeholder-bolt-elements-textTertiary text-bolt-elements-textPrimary dark:text-bolt-elements-textPrimary border border-bolt-elements-borderColor disabled:opacity-50"
/>
</div>
</div>
{numFreeUses < MaxFreeUses && (
<div className="flex mb-4">
<div className="flex-1 mr-2">
{MaxFreeUses - numFreeUses} / {MaxFreeUses} free uses remaining
</div>
</div>
)}
<h3 className="text-lg font-medium text-bolt-elements-textPrimary mb-4">Problems User Name</h3>
<div className="flex mb-4">
<div className="flex-1 mr-2">
<input
type="text"
value={username}
onChange={(e) => handleSaveUsername(e.target.value)}
className="w-full bg-white dark:bg-bolt-elements-background-depth-4 relative px-2 py-1.5 rounded-md focus:outline-none placeholder-bolt-elements-textTertiary text-bolt-elements-textPrimary dark:text-bolt-elements-textPrimary border border-bolt-elements-borderColor disabled:opacity-50"
/>
</div>
</div>
<h3 className="text-lg font-medium text-bolt-elements-textPrimary mb-4">Nut Admin Key</h3>
<div className="flex mb-4">
<div className="flex-1 mr-2">
<input
type="text"
value={adminKey}
onChange={(e) => handleSaveAdminKey(e.target.value)}
className="w-full bg-white dark:bg-bolt-elements-background-depth-4 relative px-2 py-1.5 rounded-md focus:outline-none placeholder-bolt-elements-textTertiary text-bolt-elements-textPrimary dark:text-bolt-elements-textPrimary border border-bolt-elements-borderColor disabled:opacity-50"
/>
</div>
</div>
</div>
);
}