Spaces:
Running
Running
| 'use client'; | |
| import { useEffect, useState } from 'react'; | |
| import useSettings from '@/hooks/useSettings'; | |
| import { TopBar, MainContent } from '@/components/layout'; | |
| import { apiClient } from '@/utils/api'; | |
| export default function Settings() { | |
| const { settings, setSettings } = useSettings(); | |
| const [status, setStatus] = useState<'idle' | 'saving' | 'success' | 'error'>('idle'); | |
| const handleSubmit = async (e: React.FormEvent) => { | |
| e.preventDefault(); | |
| setStatus('saving'); | |
| apiClient | |
| .post('/api/settings', settings) | |
| .then(() => { | |
| setStatus('success'); | |
| }) | |
| .catch(error => { | |
| console.error('Error saving settings:', error); | |
| setStatus('error'); | |
| }) | |
| .finally(() => { | |
| setTimeout(() => setStatus('idle'), 2000); | |
| }); | |
| }; | |
| const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => { | |
| const { name, value } = e.target; | |
| setSettings(prev => ({ ...prev, [name]: value })); | |
| }; | |
| return ( | |
| <> | |
| <TopBar> | |
| <div> | |
| <h1 className="text-lg">Settings</h1> | |
| </div> | |
| <div className="flex-1"></div> | |
| </TopBar> | |
| <MainContent> | |
| <form onSubmit={handleSubmit} className="space-y-6"> | |
| <div className="grid grid-cols-1 gap-6 sm:grid-cols-2"> | |
| <div> | |
| <div className="space-y-4"> | |
| <div> | |
| <label htmlFor="HF_TOKEN" className="block text-sm font-medium mb-2"> | |
| Hugging Face Token | |
| <div className="text-gray-500 text-sm ml-1"> | |
| Create a Read token on{' '} | |
| <a href="https://huggingface.co/settings/tokens" target="_blank" rel="noreferrer"> | |
| {' '} | |
| Huggingface | |
| </a>{' '} | |
| if you need to access gated/private models. | |
| </div> | |
| </label> | |
| <input | |
| type="password" | |
| id="HF_TOKEN" | |
| name="HF_TOKEN" | |
| value={settings.HF_TOKEN} | |
| onChange={handleChange} | |
| className="w-full px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg focus:ring-2 focus:ring-gray-600 focus:border-transparent" | |
| placeholder="Enter your Hugging Face token" | |
| /> | |
| </div> | |
| <div> | |
| <label htmlFor="TRAINING_FOLDER" className="block text-sm font-medium mb-2"> | |
| Training Folder Path | |
| <div className="text-gray-500 text-sm ml-1"> | |
| We will store your training information here. Must be an absolute path. If blank, it will default | |
| to the output folder in the project root. | |
| </div> | |
| </label> | |
| <input | |
| type="text" | |
| id="TRAINING_FOLDER" | |
| name="TRAINING_FOLDER" | |
| value={settings.TRAINING_FOLDER} | |
| onChange={handleChange} | |
| className="w-full px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg focus:ring-2 focus:ring-gray-600 focus:border-transparent" | |
| placeholder="Enter training folder path" | |
| /> | |
| </div> | |
| <div> | |
| <label htmlFor="DATASETS_FOLDER" className="block text-sm font-medium mb-2"> | |
| Dataset Folder Path | |
| <div className="text-gray-500 text-sm ml-1"> | |
| Where we store and find your datasets.{' '} | |
| <span className="text-orange-800"> | |
| Warning: This software may modify datasets so it is recommended you keep a backup somewhere else | |
| or have a dedicated folder for this software. | |
| </span> | |
| </div> | |
| </label> | |
| <input | |
| type="text" | |
| id="DATASETS_FOLDER" | |
| name="DATASETS_FOLDER" | |
| value={settings.DATASETS_FOLDER} | |
| onChange={handleChange} | |
| className="w-full px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg focus:ring-2 focus:ring-gray-600 focus:border-transparent" | |
| placeholder="Enter datasets folder path" | |
| /> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <button | |
| type="submit" | |
| disabled={status === 'saving'} | |
| className="w-full px-4 py-2 bg-gray-700 hover:bg-gray-600 rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed" | |
| > | |
| {status === 'saving' ? 'Saving...' : 'Save Settings'} | |
| </button> | |
| {status === 'success' && <p className="text-green-500 text-center">Settings saved successfully!</p>} | |
| {status === 'error' && <p className="text-red-500 text-center">Error saving settings. Please try again.</p>} | |
| </form> | |
| </MainContent> | |
| </> | |
| ); | |
| } | |