page.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. "use client";
  2. import { debounce } from "lodash";
  3. import { useEffect, useState } from "react";
  4. import { Collapse, Loader } from "tiny-ui";
  5. import { WLEDClient } from "wled-client";
  6. import { Layout, Management } from "./components";
  7. const CLIENTS = process.env.CLIENTS || [];
  8. const NAMES = process.env.NAMES || [];
  9. export default function Home() {
  10. const [names, setNames] = useState(null);
  11. const [clients, setClients] = useState(null);
  12. const [connections, setConnections] = useState(null);
  13. useEffect(() => {
  14. let t = [];
  15. let c = [];
  16. let n = [];
  17. for (let client of CLIENTS) {
  18. c.push(client);
  19. t.push(new WLEDClient(client));
  20. }
  21. for (let name of NAMES) {
  22. n.push(name);
  23. }
  24. setClients(c);
  25. setConnections(t);
  26. setNames(n);
  27. }, []);
  28. const handleCopy = async (payload) => {
  29. if (payload?.clients && payload?.value) {
  30. for (let client of payload.clients) {
  31. let indx = clients.findIndex((o) => o === client);
  32. if (connections[indx]) {
  33. let wled = connections[indx];
  34. for (let n of Object.keys(payload?.value)) {
  35. if (n && payload?.value?.[n]) {
  36. await wled.savePreset(n, payload?.value[n]);
  37. }
  38. }
  39. await wled.reinit();
  40. }
  41. }
  42. }
  43. };
  44. const handleDelete = async (payload) => {
  45. if (payload?.clients && payload?.value) {
  46. for (let client of payload?.clients) {
  47. let indx = clients.findIndex((o) => o === client);
  48. if (connections[indx]) {
  49. let wled = connections[indx];
  50. for (let n of payload?.value) {
  51. await wled.deletePreset(n);
  52. }
  53. await wled.reinit();
  54. }
  55. }
  56. }
  57. };
  58. const handleSync = async (payload) => {
  59. if (payload?.clients) {
  60. for (let client of payload?.clients) {
  61. let indx = clients.findIndex((o) => o === client);
  62. if (connections[indx]) {
  63. let wled = connections[indx];
  64. switch (payload?.value) {
  65. case "enable":
  66. await wled.enableUDPSync({ send: true, receive: false });
  67. break;
  68. case "disable":
  69. await wled.disableUDPSync();
  70. break;
  71. }
  72. await wled.reinit();
  73. }
  74. }
  75. }
  76. };
  77. const handlePower = async (payload) => {
  78. if (payload?.clients && payload?.value) {
  79. for (let client of payload?.clients) {
  80. let indx = clients.findIndex((o) => o === client);
  81. if (connections[indx]) {
  82. let wled = connections[indx];
  83. switch (payload?.value) {
  84. case "on":
  85. await wled.turnOn();
  86. await wled.reinit();
  87. break;
  88. case "off":
  89. await wled.turnOff();
  90. await wled.reinit();
  91. break;
  92. case "toggle":
  93. await wled.toggle();
  94. await wled.reinit();
  95. break;
  96. case "reboot":
  97. await wled.reboot();
  98. setTimeout(async () => {
  99. await wled.reinit(true);
  100. }, 3000);
  101. break;
  102. }
  103. }
  104. }
  105. }
  106. };
  107. const handleBrightness = async (payload) => {
  108. if (payload?.clients && payload?.value) {
  109. for (let client of payload?.clients) {
  110. let indx = clients.findIndex((o) => o === client);
  111. if (connections[indx]) {
  112. let wled = connections[indx];
  113. await wled.setBrightness(payload?.value);
  114. await wled.reinit();
  115. }
  116. }
  117. }
  118. };
  119. const debounceHandleBrightness = debounce(handleBrightness, 500);
  120. const handlePreset = async (payload) => {
  121. if (payload?.clients && payload?.value) {
  122. for (let client of payload?.clients) {
  123. let indx = clients.findIndex((o) => o === client);
  124. if (connections[indx]) {
  125. let wled = connections[indx];
  126. await wled.setPreset(payload?.value);
  127. await wled.reinit();
  128. }
  129. }
  130. }
  131. };
  132. return (
  133. <Layout page="home">
  134. {(connections && clients && (
  135. <Collapse bordered={false}>
  136. {clients?.map((o, i) => (
  137. <Management
  138. key={i + 1}
  139. itemKey={`${i + 1}`}
  140. clients={clients}
  141. client={o}
  142. clientName={names[i]}
  143. connection={connections[i]}
  144. onCopy={handleCopy}
  145. onDelete={handleDelete}
  146. onSync={handleSync}
  147. onPower={handlePower}
  148. onBrightness={debounceHandleBrightness}
  149. onPreset={handlePreset}
  150. />
  151. ))}
  152. </Collapse>
  153. )) || <Loader size="lg" />}
  154. </Layout>
  155. );
  156. return;
  157. }