{ setCont"> { setCont"> { setCont">
import React, { useState ,useRef } from 'react';
import Form from 'react-bootstrap/Form';
import ProgressBar from 'react-bootstrap/ProgressBar';
import Row from 'react-bootstrap/Row';
import Col from 'react-bootstrap/Col';
import { useSelector } from 'react-redux';
import firebase from 'firebase/compat/app'; // 필요한 모듈만 import
import 'firebase/compat/auth';
import 'firebase/compat/database';
import 'firebase/compat/storage';
import mime from 'mime-types';
function MessageForm() {
const chatRoom = useSelector(state => state.chatRoom.currentChatRoom);
const user = useSelector(state => state.user.currentUser);
const [content, setContent] = useState("");
const [errors, setErrors] = useState([]);
const [loading, setLoading] = useState(false);
const [percentage,setPercentage] = useState(0);
const messagesRef = firebase.database().ref("messages");
const inputOpenImageRef = useRef();
const storageRef = firebase.storage().ref();
const handleChange = (event) => {
setContent(event.target.value);
}
const createMessage = (fileUrl = null) => {
const message = {
timestamp: firebase.database.ServerValue.TIMESTAMP,
user: {
id: user.uid,
name: user.displayName,
image: user.photoURL
}
}
if (fileUrl !== null) {
message["image"] = fileUrl;
} else {
message["content"] = content;
}
return message;
}
const handleSubmit = async () => {
if (!content) {
setErrors(prev => prev.concat("Type contents first"));
return;
}
setLoading(true);
//firebase에 메시지를 저장하는 부분
try {
await messagesRef.child(chatRoom.id).push().set(createMessage());
setLoading(false);
setContent("");
setErrors([]);
} catch (error) {
setErrors(prev => prev.concat(error.message));
setLoading(false);
setTimeout(() => {
setErrors([]);
}, 5000);
}
}
const handleOpenImageRef=()=>{
inputOpenImageRef.current.click()
}
const handleUploadImage = (event) =>{
const file = event.target.files[0];
const filePath=`message/public/${file.name}`;
const metadata = {contentType:mime.lookup(file.name)}
try {
//파일을 먼저 스토리지에 저장
let uploadTask = storageRef.child(filePath).put(file,metadata)
//파일 저장되는 퍼센티지 구하기
uploadTask.on("state_changed",UploadTaskSnapshot=>{
const percentage = Math.round(
(UploadTaskSnapshot.bytesTransferred/UploadTaskSnapshot.totalBytes)*100
)
setPercentage(percentage);
})
} catch (error) {
alert(error)
}
}
return (
<div>
<Form onSubmit={handleSubmit}>
<Form.Group controlId='exampleForm.ControlTextarea1'>
<Form.Control value={content} onChange={handleChange} as="textarea" rows={3} />
</Form.Group>
</Form>
{
!(percentage===0||percentage===100)&&
<ProgressBar variant='warning' label={`${percentage}%`} now={percentage} />
}
<div>{errors.map(errorMsg => <p style={{ color: "red" }} key={errorMsg}>{errorMsg}</p>)}</div>
<Row>
<Col><button onClick={handleSubmit} className="message-form-button" style={{ width: '100%' }}>SEND</button></Col>
<Col><button onClick={handleOpenImageRef} className="message-form-button" style={{ width: '100%' }}>UPLOAD</button></Col>
</Row>
<input
style={{display:"none"}}
type='file'
ref={inputOpenImageRef}
//onChange={handleUploadImage}
/>
</div>
)
}
export default MessageForm;