feat(frontend): create reusable components for Phase 1 refactoring
- Add Alert component with 4 variants (success/error/warning/info) - Add LoadingSpinner and LoadingButton components - Add FormInput and FormSelect components with icon support - Add Modal and ConfirmationModal components - Add ChatMessage, ChatMessageList, and ChatInput components - Add EventCard component These components will eliminate ~450 lines of duplicated code across pages. Part of Phase 1 (Quick Wins) frontend refactoring.
This commit is contained in:
52
frontend/src/components/chat/ChatInput.jsx
Normal file
52
frontend/src/components/chat/ChatInput.jsx
Normal file
@@ -0,0 +1,52 @@
|
||||
import { Send } from 'lucide-react';
|
||||
|
||||
/**
|
||||
* Chat Input component with send button
|
||||
*
|
||||
* @param {string} value - Input value
|
||||
* @param {function} onChange - Change handler for input
|
||||
* @param {function} onSubmit - Submit handler for form
|
||||
* @param {boolean} disabled - Whether input is disabled (e.g., when not connected)
|
||||
* @param {string} placeholder - Placeholder text (default: "Write a message...")
|
||||
* @param {string} className - Additional classes for the form
|
||||
* @param {boolean} autoFocus - Whether to autofocus the input
|
||||
*/
|
||||
const ChatInput = ({
|
||||
value,
|
||||
onChange,
|
||||
onSubmit,
|
||||
disabled = false,
|
||||
placeholder = 'Write a message...',
|
||||
className = '',
|
||||
autoFocus = false
|
||||
}) => {
|
||||
const handleSubmit = (e) => {
|
||||
e.preventDefault();
|
||||
if (!value.trim() || disabled) return;
|
||||
onSubmit(e);
|
||||
};
|
||||
|
||||
return (
|
||||
<form onSubmit={handleSubmit} className={`flex space-x-2 ${className}`}>
|
||||
<input
|
||||
type="text"
|
||||
value={value}
|
||||
onChange={onChange}
|
||||
placeholder={placeholder}
|
||||
disabled={disabled}
|
||||
autoFocus={autoFocus}
|
||||
className="flex-1 px-4 py-2 border border-gray-300 rounded-lg focus:ring-primary-500 focus:border-primary-500 disabled:opacity-50 disabled:cursor-not-allowed"
|
||||
/>
|
||||
<button
|
||||
type="submit"
|
||||
disabled={disabled || !value.trim()}
|
||||
className="px-4 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
||||
aria-label="Send message"
|
||||
>
|
||||
<Send className="w-5 h-5" />
|
||||
</button>
|
||||
</form>
|
||||
);
|
||||
};
|
||||
|
||||
export default ChatInput;
|
||||
Reference in New Issue
Block a user