Newer
Older
smart-home-server / devices / relay / relay_esp8266 / WebPages.h
#ifndef WEB_PAGES_H
#define WEB_PAGES_H

// -------------------- WiFi setup page --------------------
const char* wifiSetupPage = R"HTML(
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>WiFi setup</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link
    href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"
    rel="stylesheet">
</head>
<body class="bg-dark text-light">
  <div class="container py-4">
    <div class="row justify-content-center">
      <div class="col-12 col-md-8 col-lg-5">
        <div class="card shadow-sm">
          <div class="card-body">
            <h1 class="h4 text-center mb-3">WiFi setup</h1>
            <p class="text-muted text-center mb-4">
              Connect the device to your home WiFi network.
            </p>
            <form method="POST" action="/save_wifi">
              <div class="mb-3">
                <label class="form-label">WiFi SSID</label>
                <input name="ssid" class="form-control" placeholder="MyWiFi">
              </div>
              <div class="mb-3">
                <label class="form-label">Password</label>
                <input name="pass" type="password" class="form-control" placeholder="••••••••">
              </div>
              <div class="d-grid">
                <button type="submit" class="btn btn-primary">
                  Save &amp; reboot
                </button>
              </div>
            </form>
          </div>
        </div>
        <p class="text-center text-muted mt-3 mb-0">
          ESP-01 Relay
        </p>
      </div>
    </div>
  </div>
</body>
</html>
)HTML";

// -------------------- Firmware update page --------------------
const char* updatePage = R"HTML(
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Firmware Update</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link
    href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"
    rel="stylesheet">
</head>
<body class="bg-dark text-light">
  <div class="container py-4">
    <div class="row justify-content-center">
      <div class="col-12 col-md-8 col-lg-5">
        <div class="card shadow-sm">
          <div class="card-body">
            <h1 class="h4 mb-3 text-center">Firmware Update</h1>
            <p class="text-muted text-center mb-4">
              Select a compiled <code>.bin</code> file and upload it to update the firmware.
            </p>
            <form method="POST" action="/update" enctype="multipart/form-data">
              <div class="mb-3">
                <input type="file" name="firmware" class="form-control">
              </div>
              <div class="d-grid">
                <button type="submit" class="btn btn-primary">
                  Upload &amp; flash
                </button>
              </div>
            </form>
          </div>
        </div>
        <p class="text-center mt-3 mb-0">
          <a href="/panel" class="link-light text-decoration-none">Back to control panel</a>
        </p>
      </div>
    </div>
  </div>
</body>
</html>
)HTML";

// -------------------- Panel page (header + footer) --------------------
const char* panelPageHeader = R"HTML(
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Bedside Light Panel</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link
    href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"
    rel="stylesheet">
</head>
<body class="bg-dark text-light">
  <div class="container py-4">
    <div class="row justify-content-center">
      <div class="col-12 col-md-8 col-lg-6">
        <div class="card shadow-sm">
          <div class="card-body">
            <h1 class="h4 mb-2 text-center">Bedside Matrix Night Light</h1>
            <p class="text-muted text-center mb-4">
              Tap the touch button on the device to turn the light on or off.
            </p>
            <form method="POST" action="/panel">
              <div class="mb-3">
)HTML";

const char* panelPageFooter = R"HTML(
              </div>
              <div class="mb-3 d-grid">
                <input type="hidden" name="powerState" value="">
                <button name="toggleLight" class="btn btn-lg">
                  Power
                </button>
              </div>
              <div class="mt-4 d-flex justify-content-between align-items-center">
                <button type="submit" class="btn btn-primary">
                  Save settings
                </button>
                <a href="/update" class="btn btn-outline-secondary btn-sm">
                  Firmware update
                </a>
                <button type="button"
                        class="btn btn-outline-danger btn-sm"
                        onclick="
                          if (confirm('Reboot device?')) {
                            fetch('/reboot', {method: 'POST'})
                              .then(() => setTimeout(() => location.reload(), 2000));
                          }
                        ">
                  Reboot
                </button>
              </div>
            </form>
          </div>
        </div>
        <p class="text-center text-muted mt-3 mb-0">
          ESP-01 Relay
        </p>
      </div>
    </div>
  </div>

  <script>
    function ajaxSubmitForm(form) {
      const formData = new FormData(form);
      fetch("/panel", {
        method: "POST",
        body: formData
      });
    }

    function updatePowerBtnState(powerBtn) {
      if(!powerStatus) {
        powerBtn.classList.remove("btn-success");
        powerBtn.classList.add("btn-warning");
        powerBtn.innerHTML = "Power off";
      } else {
        powerBtn.classList.remove("btn-warning");
        powerBtn.classList.add("btn-success");
        powerBtn.innerHTML = "Power on";
      }
    }

    document.addEventListener("DOMContentLoaded", e => {
      const form = document.querySelector("form");
      const powerBtn = form.querySelector("[name='toggleLight']");

      updatePowerBtnState(powerBtn);
      form.querySelector("input[name='powerState']").value = powerStatus;

      powerBtn.addEventListener("click", e => {
        e.preventDefault();
        powerStatus = !powerStatus;
        form.querySelector("input[name='powerState']").value = powerStatus;
        updatePowerBtnState(powerBtn);
        ajaxSubmitForm(form);
      });
    });
  </script>
</body>
</html>
)HTML";

#endif