next.js/examples/with-nhost-auth-realtime-graphql/pages/index.js
index.js129 lines2.5 KB
import { useState } from "react";
import { useSubscription, useMutation, gql } from "@apollo/client";
import { PrivateRoute } from "../components/private-route";
import { nhost } from "../utils/nhost";

const INSERT_ITEM = gql`
  mutation insertItem($item: items_insert_input!) {
    insert_items_one(object: $item) {
      id
    }
  }
`;

const S_GET_ITEMS = gql`
  subscription sGetItems {
    items {
      id
      name
    }
  }
`;

const DELETE_ITEM = gql`
  mutation deleteItem($item_id: uuid!) {
    delete_items_by_pk(id: $item_id) {
      id
    }
  }
`;

function InsertItem() {
  const [name, setName] = useState("");
  const [insertItem] = useMutation(INSERT_ITEM);

  async function handleFormSubmit(e) {
    e.preventDefault();
    try {
      insertItem({
        variables: {
          item: {
            name,
          },
        },
      });
    } catch (error) {
      console.error(error);
      return alert("Error inserting item");
    }

    setName("");
  }

  return (
    <div style={{ padding: "10px" }}>
      <form onSubmit={handleFormSubmit}>
        <div>
          <input
            type="name"
            value={name}
            onChange={(e) => setName(e.target.value)}
          />
        </div>
        <div>
          <button type="submit">Insert item</button>
        </div>
      </form>
    </div>
  );
}

function ListItems() {
  const { loading, error, data } = useSubscription(S_GET_ITEMS);
  const [deleteItem] = useMutation(DELETE_ITEM);

  async function handleDeleteItem(itemId) {
    try {
      deleteItem({
        variables: {
          item_id: itemId,
        },
      });
    } catch (error) {
      console.log(error);
      return alert("Error deleting item");
    }
  }

  if (loading && !data) {
    return <div>Loading...</div>;
  }

  if (error) {
    return <div>Error loading items</div>;
  }

  const { items } = data;

  return (
    <div style={{ padding: "10px" }}>
      {items.map((item) => {
        return (
          <li key={item.id}>
            {item.name} [
            <span onClick={() => handleDeleteItem(item.id)}>delete</span>]
          </li>
        );
      })}
    </div>
  );
}

function Home() {
  return (
    <div>
      <div style={{ display: "flex", alignItems: "center" }}>
        <pre>{nhost.auth.user().display_name}</pre>
        <div style={{ paddingLeft: "10px" }}>
          <button onClick={() => nhost.auth.logout()}>logout</button>
        </div>
      </div>
      <h1>Dashboard</h1>
      <InsertItem />
      <ListItems />
    </div>
  );
}

export default PrivateRoute(Home);
Quest for Codev2.0.0
/
SIGN IN