Не получается отсортировать по времени в firestore V9 FIREBASE, REACT
Делаю чат приложение на react с использованиеем firebase. Не могу настроить программу так, что бы корректно изображались сообщения. Они все идут в разброс. Не понимаю, что я делаю не так, много чего пытался но результата 0. Пробую через orderBy, но это не даёт результата
Помогите плз)))
import { Avatar, Button, Container, Grid, TextField } from '@mui/material';
import React, { useState } from 'react';
import { useAuthState } from 'react-firebase-hooks/auth';
import { auth, db } from '..';
import Loader from './Loader';
import { serverTimestamp, collection, addDoc, orderBy, query, getDocs, where} from "firebase/firestore";
import { useCollectionData, } from "react-firebase-hooks/firestore"
const Chat = () => {
const [user] = useAuthState(auth)
const [value, setValue] = useState('')
const messagesColection = collection(db, "messages")
const [messages, loading] = query(useCollectionData(messagesColection, orderBy('createdAt')))
const sendMessage = async() => {
await addDoc(messagesColection, {
displayName: user.displayName,
uid: user.uid,
photoURL: user.photoURL,
text: value,
createdAt: serverTimestamp(),
});
setValue('')
}
if (loading) {
return <Loader/>
}
return (
<Container>
<Grid Container
justifyContent={"center"}
alignItems={"center"}
style={{height: window.innerHeight - 50, position: "relative", top: "15px"}}
>
<div style={{width:"80%", height: '70vh', border:'1px solid gray', overflowY: 'auto'}}>
{messages.map( message =>
<div style={{
margin:10,
border: user.uid === message.uid ? '2px solid red' : '1px solid #000',
marginLeft: user.uid === message.uid ? 'auto' : '10px',
width: 'fit-content',
padding: "5px"
}}>
<Grid container>
<Avatar src={message.photoURL}/>
<div>{message.displayName}</div>
</Grid>
<div>{message.text}</div>
</div>)}
</div>
<Grid
container
direction={"column"}
alignItems={"flex-end"}
style={{width: '80%'}}
>
<TextField
fullWidth
rowsMax={2}
variant={"outlined"}
value={value}
onChange={e => setValue(e.target.value)}
/>
<Button onClick={sendMessage} variant={"outlined"}>Send</Button>
</Grid>
</Grid>
</Container>
);
}
export default Chat;
Ответы (1 шт):
Автор решения: BratVlad
→ Ссылка
В общем получилось, это было сложно
import { Button, Container, Grid, TextField } from '@mui/material';
import React, { useState } from 'react';
import { useAuthState } from 'react-firebase-hooks/auth';
import { auth, db } from '..';
import Loader from './Loader';
import { serverTimestamp, collection, addDoc, orderBy, query} from "firebase/firestore";
import { useCollectionData, } from "react-firebase-hooks/firestore"
import SendIcon from '@mui/icons-material/Send';
import Message from './Message'
import "./Chat.css"
const Chat = () => {
const [user] = useAuthState(auth)
const [value, setValue] = useState('')
const messagesColection = collection(db, "messages")
const queryMessages = query(messagesColection, orderBy("createdAt"));
const [messages, loading] = query(useCollectionData(queryMessages, orderBy('createdAt')))
const sendMessage = async() => {
await addDoc(messagesColection, {
displayName: user.displayName,
uid: user.uid,
photoURL: user.photoURL,
text: value,
createdAt: serverTimestamp(),
});
setValue('')
}
if (loading) {
return <Loader/>
}
return (
<Container>
<Grid Container
justifyContent={"center"}
alignItems={"center"}
className={"containerMessages"}
// style={{height: window.innerHeight - 50}}
>
<div style={{height: '80vh', border:'1px solid gray', overflowY: 'auto', marginBottom: "15px"}}>
{messages.map( message =>
<div
className='containerMessage'
style={{
margin:10,
background: user.uid === message.uid ? 'box-shadow: 6px 0px 12px 0px #943ba38f;' : 'linear-gradient(333deg, #253be2b3, #253be2b3)',
background: user.uid === message.uid ? 'linear-gradient(333deg, #253be2b3, #00000000)' : 'linear-gradient(105deg, #943ba38f, #00000000)',
marginLeft: user.uid === message.uid ? 'auto' : '10px',
width: 'fit-content',
}}>
<Message
name={message.displayName}
avatar={message.photoURL}
text={message.text}
uid={message.uid}
></Message>
</div>)}
</div>
{(value !== '') ?
<Grid
direction={"column"}
alignItems={"flex-end"}
container
>
<TextField
fullWidth
rowsMax={2}
variant={"outlined"}
value={value}
onChange={e => setValue(e.target.value)}
marginBottom={"10px"}
/>
<Button size="large" onClick={sendMessage} variant={"outlined"} endIcon={<SendIcon />}>Send</Button>
</Grid>
:
<Grid
container
direction={"column"}
alignItems={"flex-end"}
marginBottom={"10px"}
className={"areaMessage"}
>
<TextField
error
fullWidth
id="outlined-error"
label="Write a message"
value={value}
onChange={e => setValue(e.target.value)}
/>
<Button size="large" disabled variant={"outlined"} endIcon={<SendIcon />}>Send</Button>
</Grid>
}
</Grid>
</Container>
);
}
export default Chat;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>