Skip to content

dai-570415/react-board

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

White board App

Data download & construction

$ git clone https://github.com/dai-570415/react-board.git

$ cd react-board

$ npm install

$ npm start
  • Setting(Firebase.js)
import firebase from 'firebase/app';
import 'firebase/database';
import 'firebase/firestore';
import 'firebase/auth';

const firebaseConfig = {
    apiKey: "Your_Key",
    authDomain: "Your_Key",
    databaseURL: "Your_Key",
    projectId: "Your_Key",
    storageBucket: "Your_Key",
    messagingSenderId: "Your_Key",
    appId: "Your_Key",
    measurementId: "Your_Key"
};

firebase.initializeApp(firebaseConfig);

export default firebase;

以下のコードからcreate-react-app上にデータを作り変え、改良させました。

cf. 元コード(ミニマムなReact)

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>StayHomeBoard</title>
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <script src="https://www.gstatic.com/firebasejs/7.14.2/firebase-app.js"></script>
    <script src="https://www.gstatic.com/firebasejs/7.14.2/firebase-database.js"></script>
    <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    <script crossorigin src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.26.0/babel.min.js"></script>
    <script type="text/babel">
      var firebaseConfig = {
        apiKey: "Your_Key",
        authDomain: "Your_Key",
        databaseURL: "Your_Key",
        projectId: "Your_Key",
        storageBucket: "Your_Key",
        messagingSenderId: "Your_Key",
        appId: "Your_Key",
        measurementId: "Your_Key"
      };
      const firebaseApp = firebase.initializeApp(firebaseConfig);


      const firebaseDb = firebaseApp.database();
      let db = null;

      const Board = () => {

        React.useEffect(() => {
          const params = new URL(document.location).searchParams;
          let roomName = params.get("room_name");
          if (!roomName) {
            let roomName = window.prompt("please input room's name");
            window.location.href = window.location.href + "?room_name=" + roomName;
          }
          db = firebaseDb.ref(roomName);
          db.on("value", (value) => setCards(value.val()));
        }, []);

        const [cards, setCards] = React.useState(null);
        const add = () => {
          const newPostKey = db.push().key;
          db.update({
            [newPostKey]: {
              t: "wash",
              x: Math.floor(Math.random() * (200 - 80) + 80),
              y: Math.floor(Math.random() * (200 - 80) + 80),
            },
          });
        };
        const update = (key, card) => db.update({ [key]: card });
        const remove = (key) => db.child(key).remove();

        const [dragging, setDragging] = React.useState({ key: "", x: 0, y: 0 });

        const [editMode, setEditMode] = React.useState({ key: "" });
        const [input, setInput] = React.useState("");

        if (!cards) return <button onClick={() => add()}>add card</button>;
        return (
          <div
            style={{ width: "1000px", height: "1000px", position: "relative" }}
            onDrop={(e) => {
              if (!dragging || !cards) return;
              update(dragging.key, { ...cards[dragging.key], x: e.clientX - dragging.x, y: e.clientY - dragging.y });
            }}
            onDragOver={(e) => e.preventDefault()} // enable onDrop event
          >
            <button onClick={() => add()}>add card</button>
            {Object.keys(cards).map((key) => (
              <div
                key={key}
                style={{ position: "absolute", top: cards[key].y + "px", left: cards[key].x + "px" }}
                draggable={true}
                onDragStart={(e) => setDragging({ key, x: e.clientX - cards[key].x, y: e.clientY - cards[key].y })}
              >
                {editMode.key === key ? (
                  <textarea
                    onBlur={(e) => {
                      update(key, { ...cards[key], t: input });
                      setEditMode({ key: "" });
                      setInput("");
                    }}
                    onChange={(e) => setInput(e.target.value)}
                    defaultValue={cards[key].t}
                  />
                ) : (
                  <div onClick={(e) => setEditMode({ key })}>{cards[key].t}</div>
                )}
                <button onClick={() => remove(key)}>x</button>
              </div>
            ))}
          </div>
        );
      };
      ReactDOM.render(<Board />, document.getElementById("root"));
    </script>
  </head>
  <body>
    <div id="root" />
  </body>
</html>

About

This is a React whiteboard app.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published