useUsers.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import React from "react";
  2. import { useC2C } from "./useC2C";
  3. function useUsers() {
  4. const usersRef = React.useRef([]);
  5. const [users, setUsers] = React.useState([]);
  6. const [c2c, joined, isMaster] = useC2C();
  7. React.useEffect(() => {
  8. if (joined) {
  9. console.log("joined");
  10. if (!isMaster) {
  11. c2c.call("getUserList").then((userList) => {
  12. usersRef.current = userList;
  13. setUsers(userList);
  14. });
  15. }
  16. }
  17. }, [joined, c2c, isMaster]);
  18. React.useEffect(() => {
  19. const unsub = [];
  20. if (joined) {
  21. if (isMaster) {
  22. c2c
  23. .register("getUserList", () => {
  24. return usersRef.current;
  25. })
  26. .then((unregister) => {
  27. unsub.push(unregister);
  28. });
  29. unsub.push(
  30. c2c.subscribe("userLeave", (userId) => {
  31. console.log("userLeave");
  32. usersRef.current = usersRef.current.filter(
  33. ({ id }) => id !== userId
  34. );
  35. setUsers(usersRef.current);
  36. console.log("publish new user list", usersRef.current);
  37. c2c.publish("updateUserList", usersRef.current);
  38. })
  39. );
  40. unsub.push(
  41. c2c.subscribe("userUpdate", (user) => {
  42. if (usersRef.current.find((u) => u.id === user.id)) {
  43. const newUsers = usersRef.current.map((u) =>
  44. u.id === user.id ? user : u
  45. );
  46. usersRef.current = newUsers;
  47. } else {
  48. const newUsers = [...usersRef.current, user];
  49. usersRef.current = newUsers;
  50. }
  51. setUsers(usersRef.current);
  52. console.log("publish new user list", usersRef.current);
  53. c2c.publish("updateUserList", usersRef.current);
  54. })
  55. );
  56. }
  57. unsub.push(
  58. c2c.subscribe("updateUserList", (newList) => {
  59. console.log("User list", newList);
  60. usersRef.current = newList;
  61. setUsers(usersRef.current);
  62. })
  63. );
  64. }
  65. return () => {
  66. unsub.forEach((u) => u());
  67. };
  68. }, [joined, c2c, isMaster]);
  69. return users;
  70. }
  71. export default useUsers;