Download components/HelpManagement.js from tuandesu/undefined: direct link, hf CLI and curl.
- Browser
- Download file 4.62 kB
-
https://huggingface.co/spaces/tuandesu/undefined/resolve/main/components/HelpManagement.js
- Command line
-
hf download hf://spaces/tuandesu/undefined/components/HelpManagement.js
-
curl -L -o HelpManagement.js https://huggingface.co/spaces/tuandesu/undefined/resolve/main/components/HelpManagement.js
4.62 kB
| import React, { useState, useEffect } from 'react'; | |
| import axios from 'axios'; | |
| import { ToastContainer, toast } from 'react-toastify'; | |
| import 'react-toastify/dist/ReactToastify.css'; | |
| import ReactQuill from 'react-quill'; | |
| import 'react-quill/dist/quill.snow.css'; | |
| const HelpManagement = ({ isAdmin }) => { | |
| const [helpContent, setHelpContent] = useState(''); | |
| const [isEditing, setIsEditing] = useState(false); | |
| const [file, setFile] = useState(null); | |
| useEffect(() => { | |
| fetchHelpContent(); | |
| }, []); | |
| const fetchHelpContent = async () => { | |
| try { | |
| const response = await axios.get('/api/help-content'); | |
| setHelpContent(response.data.content); | |
| } catch (error) { | |
| toast.error('Failed to load help content'); | |
| } | |
| }; | |
| const handleFileUpload = (e) => { | |
| const file = e.target.files[0]; | |
| if (file) { | |
| setFile(file); | |
| } | |
| }; | |
| const handleImport = async () => { | |
| if (!file) return; | |
| try { | |
| const formData = new FormData(); | |
| formData.append('file', file); | |
| const response = await axios.post('/api/help-content/import', formData, { | |
| headers: { | |
| 'Content-Type': 'multipart/form-data', | |
| }, | |
| }); | |
| setHelpContent(response.data.content); | |
| toast.success('Help content imported successfully'); | |
| setFile(null); | |
| } catch (error) { | |
| toast.error('Failed to import help content'); | |
| } | |
| }; | |
| const handleSave = async () => { | |
| try { | |
| await axios.put('/api/help-content', { content: helpContent }); | |
| toast.success('Help content saved successfully'); | |
| setIsEditing(false); | |
| } catch (error) { | |
| toast.error('Failed to save help content'); | |
| } | |
| }; | |
| return ( | |
| <div className="container mx-auto p-6"> | |
| <div className="bg-white dark:bg-gray-800 rounded-lg shadow-lg p-6"> | |
| <div className="flex justify-between items-center mb-6"> | |
| <h2 className="text-2xl font-bold text-gray-800 dark:text-white">Help Center</h2> | |
| {isAdmin && ( | |
| <div className="flex space-x-3"> | |
| {!isEditing ? ( | |
| <button | |
| onClick={() => setIsEditing(true)} | |
| className="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition" | |
| > | |
| Edit Content | |
| </button> | |
| ) : ( | |
| <button | |
| onClick={handleSave} | |
| className="px-4 py-2 bg-green-600 text-white rounded-lg hover:bg-green-700 transition" | |
| > | |
| Save Changes | |
| </button> | |
| )} | |
| </div> | |
| )} | |
| </div> | |
| {isEditing ? ( | |
| <div className="space-y-4"> | |
| <div className="mb-4"> | |
| <ReactQuill | |
| theme="snow" | |
| value={helpContent} | |
| onChange={setHelpContent} | |
| modules={{ | |
| toolbar: [ | |
| [{ header: [1, 2, false] }], | |
| ['bold', 'italic', 'underline', 'strike', 'blockquote'], | |
| [{ list: 'ordered' }, { list: 'bullet' }], | |
| ['link', 'image'], | |
| ['clean'], | |
| ], | |
| }} | |
| /> | |
| </div> | |
| <div className="border-t pt-4"> | |
| <h3 className="text-lg font-medium text-gray-800 dark:text-white mb-3">Import from File</h3> | |
| <div className="flex items-center space-x-3"> | |
| <input | |
| type="file" | |
| accept=".html,.txt" | |
| onChange={handleFileUpload} | |
| className="block w-full text-sm text-gray-500 | |
| file:mr-4 file:py-2 file:px-4 | |
| file:rounded-md file:border-0 | |
| file:text-sm file:font-semibold | |
| file:bg-blue-50 file:text-blue-700 | |
| hover:file:bg-blue-100" | |
| /> | |
| <button | |
| onClick={handleImport} | |
| disabled={!file} | |
| className={`px-4 py-2 rounded-lg ${file ? 'bg-blue-600 hover:bg-blue-700' : 'bg-gray-400'} text-white transition`} | |
| > | |
| Import | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| ) : ( | |
| <div | |
| className="prose dark:prose-invert max-w-none" | |
| dangerouslySetInnerHTML={{ __html: helpContent }} | |
| /> | |
| )} | |
| </div> | |
| <ToastContainer position="bottom-right" autoClose={3000} /> | |
| </div> | |
| ); | |
| }; | |
| export default HelpManagement; |