从除了当前授权用户以外的任何人那里收到浏览器通知。

huangapple go评论103阅读模式
英文:

Getting a browser notification from anybody but the current auth. user

问题

  1. // Chat.js中的代码
  2. import { useEffect, useState } from "react";
  3. import { addDoc, collection, serverTimestamp, onSnapshot, query, where, orderBy } from "firebase/firestore";
  4. import { auth, db } from "../firebase-config";
  5. import "../styles/Chat.css";
  6. import IDLogo from "../images/IDLogo.png";
  7. import notificationSound from "../sounds/message_sound.mp3";
  8. import addNotification from "react-push-notification";
  9. import DefaultProfilePicture from "../images/default_pfp.jpeg";
  10. export const Chat = props => {
  11. const { room } = props;
  12. const [newMessage, setNewMessage] = useState();
  13. const [messages, setMessages] = useState([]);
  14. const messagesRef = collection(db, "messages");
  15. useEffect(() => {
  16. const queryMessages = query(messagesRef, where("room", "==", room), orderBy("createdAt"));
  17. const unsubscribe = onSnapshot(queryMessages, snapshot => {
  18. let messages = [];
  19. snapshot.forEach(doc => {
  20. messages.push({ ...doc.data(), id: doc.id });
  21. });
  22. setMessages(messages);
  23. });
  24. return () => unsubscribe();
  25. }, []);
  26. useEffect(() => {
  27. const messagesContainer = messagesRef.current;
  28. messagesContainer.scrollTop = messagesContainer.scrollHeight;
  29. }, [messagesRef]);
  30. const handleSubmit = async e => {
  31. e.preventDefault();
  32. if (newMessage === "") return;
  33. const currentUser = auth.currentUser;
  34. await addDoc(messagesRef, {
  35. text: newMessage,
  36. createdAt: serverTimestamp(),
  37. user: currentUser.displayName,
  38. profilePicture: currentUser.photoURL,
  39. room,
  40. });
  41. if (newMessage && newMessage.user !== auth.currentUser.displayName) {
  42. addNotification({
  43. title: "New Message",
  44. message: newMessage.text,
  45. duration: 5000,
  46. native: true,
  47. icon: IDLogo,
  48. });
  49. }
  50. setNewMessage("");
  51. };
  52. useEffect(() => {
  53. const audio = new Audio(notificationSound);
  54. const lastMessage = messages[messages.length - 1];
  55. if (lastMessage && lastMessage.user !== auth.currentUser.displayName) {
  56. audio.play();
  57. }
  58. }, [messages]);
  59. return (
  60. <div className='chat'>
  61. <div className='header'>
  62. <h1>
  63. Welcome to: <span className='Chat__room--title'>{room.toUpperCase()}</span>
  64. </h1>
  65. </div>
  66. <div ref={messagesRef} className='messages'>
  67. {messages.map(message => (
  68. <p className='Chat__message'>
  69. {message.profilePicture ? (
  70. <img className='profile__picture' referrerpolicy='no-referrer' src={message.profilePicture} alt={message.user} />
  71. ) : (
  72. <img className='profile__picture' src={DefaultProfilePicture} alt={message.user}></img>
  73. )}
  74. {message.user} : {message.text}
  75. </p>
  76. ))}
  77. </div>
  78. <div className='send__message__container'>
  79. <form onSubmit={handleSubmit} className='new__message__form'>
  80. <input
  81. spellCheck='false'
  82. onChange={e => setNewMessage(e.target.value)}
  83. className='new__message__input'
  84. placeholder='Type a message here...'
  85. value={newMessage}
  86. />
  87. <button type='submit' className='signOut--sendMessage__button'>
  88. Send
  89. </button>
  90. </form>
  91. </div>
  92. </div>
  93. );
  94. };
英文:

I'm currently building a chat app in React JS and I've been going crazy for the past two days with this issue. I want to make it so whenever there is a new message, a browser notification appears.

The issue is that I only get a notification when I send a message, not when anybody else sends a message. It's supposed to be literally the other way around.

I'm using the react-push-notification npm package to implement this.

Chat.js:

  1. import { useEffect, useState } from &quot;react&quot;;
  2. import { addDoc, collection, serverTimestamp, onSnapshot, query, where, orderBy } from &quot;firebase/firestore&quot;;
  3. import { auth, db } from &quot;../firebase-config&quot;;
  4. import &quot;../styles/Chat.css&quot;;
  5. import IDLogo from &quot;../images/IDLogo.png&quot;;
  6. import notificationSound from &quot;../sounds/message_sound.mp3&quot;;
  7. import addNotification from &quot;react-push-notification&quot;;
  8. import DefaultProfilePicture from &quot;../images/default_pfp.jpeg&quot;;
  9. export const Chat = props =&gt; {
  10. const { room } = props;
  11. const [newMessage, setNewMessage] = useState();
  12. const [messages, setMessages] = useState([]);
  13. const messagesRef = collection(db, &quot;messages&quot;);
  14. useEffect(() =&gt; {
  15. const queryMessages = query(messagesRef, where(&quot;room&quot;, &quot;==&quot;, room), orderBy(&quot;createdAt&quot;));
  16. const unsubscribe = onSnapshot(queryMessages, snapshot =&gt; {
  17. let messages = [];
  18. snapshot.forEach(doc =&gt; {
  19. messages.push({ ...doc.data(), id: doc.id });
  20. });
  21. setMessages(messages);
  22. });
  23. return () =&gt; unsubscribe();
  24. }, []);
  25. useEffect(() =&gt; {
  26. const messagesContainer = messagesRef.current;
  27. messagesContainer.scrollTop = messagesContainer.scrollHeight;
  28. }, [messagesRef]);
  29. const handleSubmit = async e =&gt; {
  30. e.preventDefault();
  31. if (newMessage === &quot;&quot;) return;
  32. const currentUser = auth.currentUser;
  33. await addDoc(messagesRef, {
  34. text: newMessage,
  35. createdAt: serverTimestamp(),
  36. user: currentUser.displayName,
  37. profilePicture: currentUser.photoURL,
  38. room,
  39. });
  40. if (newMessage &amp;&amp; newMessage.user !== auth.currentUser.displayName) {
  41. addNotification({
  42. title: &quot;New Message&quot;,
  43. message: newMessage.text,
  44. duration: 5000,
  45. native: true,
  46. icon: IDLogo,
  47. });
  48. }
  49. setNewMessage(&quot;&quot;);
  50. };
  51. useEffect(() =&gt; {
  52. const audio = new Audio(notificationSound);
  53. const lastMessage = messages[messages.length - 1];
  54. if (lastMessage &amp;&amp; lastMessage.user !== auth.currentUser.displayName) {
  55. audio.play();
  56. }
  57. }, [messages]);
  58. return (
  59. &lt;div className=&#39;chat&#39;&gt;
  60. &lt;div className=&#39;header&#39;&gt;
  61. &lt;h1&gt;
  62. Welcome to: &lt;span className=&#39;Chat__room--title&#39;&gt;{room.toUpperCase()}&lt;/span&gt;
  63. &lt;/h1&gt;
  64. &lt;/div&gt;
  65. &lt;div ref={messagesRef} className=&#39;messages&#39;&gt;
  66. {messages.map(message =&gt; (
  67. &lt;p className=&#39;Chat__message&#39;&gt;
  68. {message.profilePicture ? (
  69. &lt;img className=&#39;profile__picture&#39; referrerpolicy=&#39;no-referrer&#39; src={message.profilePicture} alt={message.user} /&gt;
  70. ) : (
  71. &lt;img className=&#39;profile__picture&#39; src={DefaultProfilePicture} alt={message.user}&gt;&lt;/img&gt;
  72. )}
  73. {message.user} : {message.text}
  74. &lt;/p&gt;
  75. ))}
  76. &lt;/div&gt;
  77. &lt;div className=&#39;send__message__container&#39;&gt;
  78. &lt;form onSubmit={handleSubmit} className=&#39;new__message__form&#39;&gt;
  79. &lt;input
  80. spellCheck=&#39;false&#39;
  81. onChange={e =&gt; setNewMessage(e.target.value)}
  82. className=&#39;new__message__input&#39;
  83. placeholder=&#39;Type a message here...&#39;
  84. value={newMessage}
  85. /&gt;
  86. &lt;button type=&#39;submit&#39; className=&#39;signOut--sendMessage__button&#39;&gt;
  87. Send
  88. &lt;/button&gt;
  89. &lt;/form&gt;
  90. &lt;/div&gt;
  91. &lt;/div&gt;
  92. );
  93. };

答案1

得分: 1

Just move your add notification function out of handle submit function :

如果 (newMessage && newMessage.user !== auth.currentUser.displayName) {
添加通知({
标题: "新消息",
消息: newMessage.text,
持续时间: 5000,
原生: true,
图标: IDLogo,
});
}

Take it to the next useEffect :

将其移到下一个 useEffect 中:

useEffect(() => {
const audio = new Audio(notificationSound);
const lastMessage = messages[messages.length - 1];

if (lastMessage && lastMessage.user !== auth.currentUser.displayName) {
audio.play();
添加通知({
标题: "新消息",
消息: newMessage.text,
持续时间: 5000,
原生: true,
图标: IDLogo,
});
}
}, [messages]);

英文:

Just move your add notification function out of handle submit function :

  1. if (newMessage &amp;&amp; newMessage.user !== auth.currentUser.displayName) {
  2. addNotification({
  3. title: &quot;New Message&quot;,
  4. message: newMessage.text,
  5. duration: 5000,
  6. native: true,
  7. icon: IDLogo,
  8. });
  9. }

Take it to the next useEffect :

  1. useEffect(() =&gt; {
  2. const audio = new Audio(notificationSound);
  3. const lastMessage = messages[messages.length - 1];
  4. if (lastMessage &amp;&amp; lastMessage.user !== auth.currentUser.displayName) {
  5. audio.play();
  6. addNotification({
  7. title: &quot;New Message&quot;,
  8. message: newMessage.text,
  9. duration: 5000,
  10. native: true,
  11. icon: IDLogo,
  12. });
  13. }}, [messages]);

huangapple
  • 本文由 发表于 2023年4月20日 08:56:22
  • 转载请务必保留本文链接:https://go.coder-hub.com/76059819.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定