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:
Radosław Gierwiało
2025-11-20 23:22:05 +01:00
parent c1b5ae2ad3
commit 1772fc522e
11 changed files with 704 additions and 0 deletions

View 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;