useC2C.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import React, { useContext } from "react";
  2. import { useSocket } from "@scripters/use-socket.io";
  3. import { join } from "client2client.io";
  4. import { useTranslation } from "react-i18next";
  5. import Waiter from "../ui/Waiter";
  6. export const C2CContext = React.createContext([null, false]);
  7. export const C2CProvider = ({ room, ...props }) => {
  8. const { t } = useTranslation();
  9. const socket = useSocket();
  10. const [joined, setJoined] = React.useState(false);
  11. const [isMaster, setIsMaster] = React.useState(false);
  12. const [c2c, setC2c] = React.useState(null);
  13. const roomRef = React.useRef(null);
  14. React.useEffect(() => {
  15. const disconnect = () => {
  16. console.log("Disconnected…");
  17. setJoined(false);
  18. setIsMaster(false);
  19. };
  20. socket.on("disconnect", disconnect);
  21. return () => {
  22. socket.off("disconnect", disconnect);
  23. };
  24. }, [socket]);
  25. React.useEffect(() => {
  26. if (!socket) {
  27. return;
  28. }
  29. if (!socket.connected) {
  30. socket.connect();
  31. }
  32. join({
  33. socket,
  34. room,
  35. onMaster: () => {
  36. console.log("Is now first player…");
  37. setIsMaster(true);
  38. },
  39. onJoined: (newRoom) => {
  40. console.log("Connected…");
  41. roomRef.current = newRoom;
  42. setC2c(newRoom);
  43. setJoined(true);
  44. return () => {
  45. socket.disconnect();
  46. };
  47. },
  48. });
  49. return () => {
  50. socket.disconnect();
  51. };
  52. }, [room, socket]);
  53. if (!joined || !c2c) {
  54. return <Waiter message={t("Waiting for connection…")} />;
  55. }
  56. return (
  57. <C2CContext.Provider value={[c2c, joined, isMaster, room]}>
  58. {props.children}
  59. </C2CContext.Provider>
  60. );
  61. };
  62. export const useC2C = () => {
  63. const [c2c, joined, isMaster, room] = useContext(C2CContext);
  64. return [c2c, joined, isMaster, room];
  65. };
  66. export default { C2CContext, C2CProvider, useC2C };