AlertFront.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. import Twitch from "./TwitchPubSug";
  2. import electron, { ipcRenderer } from "electron";
  3. import path from "path";
  4. import generateID from "./utils/generateid";
  5. let template = (id: string, instance: AlertFront) => {
  6. let template = `
  7. <div class="form-row">
  8. <div class="col-4">
  9. <div class="input-group">
  10. <div class="input-group-prepend">
  11. <div class="input-group-text">Title</div>
  12. </div>
  13. <input type="text" class="form-control" id="rewardtitle">
  14. </div>
  15. </div>
  16. <div class="col-8">
  17. <div class="custom-file">
  18. <input type="button" class="custom-file-input" id="fileinput">
  19. <label class="custom-file-label" for="fileinput" id="filepath"></label>
  20. </div>
  21. <div class="form-btns">
  22. <button class="btn btn-primary btn-test" id="testButton">Test</button>
  23. <button class="btn btn-danger btn-remove" id="removeButton">Remove</button>
  24. </div>
  25. </div>
  26. </div>
  27. `
  28. let el = document.createElement("form");
  29. el.id = id;
  30. el.className = "col-12";
  31. el.innerHTML = template;
  32. let rewardTitleInput = el.querySelector("#rewardtitle") as HTMLInputElement;
  33. rewardTitleInput.addEventListener("change", e => {
  34. console.log(id);
  35. instance.setReward(id, (e.target as HTMLInputElement).value);
  36. e.preventDefault();
  37. })
  38. let fileinputButton = el.querySelector("#fileinput") as HTMLInputElement;
  39. fileinputButton.addEventListener("click", e => {
  40. ipcRenderer.send("chooseFile", id);
  41. e.preventDefault();
  42. })
  43. let testButton = el.querySelector("#testButton");
  44. testButton.addEventListener("click", e => {
  45. instance.test(id);
  46. e.preventDefault();
  47. })
  48. let removeButton = el.querySelector("#removeButton");
  49. removeButton.addEventListener("click", e => {
  50. instance.remove(id);
  51. e.preventDefault();
  52. })
  53. return el;
  54. }
  55. class AlertFront {
  56. el: HTMLElement;
  57. binds: {
  58. [key: string]: HTMLFormElement;
  59. }
  60. constructor(private twitch: Twitch){
  61. this.el = document.getElementById("alerts");
  62. this.binds = {};
  63. this.updateBinds();
  64. electron.ipcRenderer.on("filepath", (event, id, value)=>{
  65. console.log("Got file from main process");
  66. this.setFilepath(id, value);
  67. })
  68. }
  69. updateBinds(){
  70. this.el.childNodes.forEach((val, key, par)=>{
  71. if(val.nodeName == "FORM"){
  72. let form = val as HTMLFormElement;
  73. if(form.id){
  74. this.binds[form.id] = form;
  75. }
  76. }
  77. })
  78. }
  79. updateView(){
  80. this.updateBinds();
  81. let obj = window.settings.options.alerts;
  82. for(let key in obj){
  83. let el: HTMLFormElement;
  84. if(!this.binds[key]){
  85. let newEl = template(key, this);
  86. this.el.appendChild(newEl);
  87. this.binds[key] = newEl;
  88. el = newEl;
  89. }else{
  90. el = this.binds[key];
  91. }
  92. let reward = el.querySelector("#rewardtitle") as HTMLInputElement;
  93. reward.value = obj[key].rewardtitle;
  94. let filepath = el.querySelector("#filepath") as HTMLInputElement;
  95. if(obj[key].filepath){
  96. filepath.innerText = path.basename(obj[key].filepath);
  97. }else{
  98. filepath.innerText = "Choose File";
  99. }
  100. }
  101. }
  102. add(){
  103. this.updateBinds();
  104. let counter = 0;
  105. while(true){
  106. let newID = generateID(6);
  107. if(!(newID in this.binds)){
  108. window.settings.options.alerts[newID] = {
  109. rewardtitle: "",
  110. filepath: ""
  111. }
  112. window.settings.save();
  113. break;
  114. }
  115. if(counter > 5){
  116. throw new Error("Is this even possible?");
  117. }
  118. counter++;
  119. }
  120. this.updateView();
  121. }
  122. setReward(id: string, value: string){
  123. if(window.settings.options.alerts[id]){
  124. window.settings.options.alerts[id].rewardtitle = value;
  125. window.settings.save();
  126. this.updateView();
  127. }
  128. }
  129. setFilepath(id: string, value: string){
  130. if(window.settings.options.alerts[id]){
  131. window.settings.options.alerts[id].filepath = value;
  132. window.settings.save();
  133. this.updateView();
  134. }
  135. }
  136. test(id: string){
  137. this.twitch.emit("reward", {
  138. timestamp: "now",
  139. redemption: {
  140. id: "testid",
  141. channel_id: "test",
  142. redeemed_at: "now",
  143. reward: {
  144. channel_id: "tester",
  145. cost: 1000,
  146. id: "tester",
  147. is_sub_only: true,
  148. is_user_input_required: true,
  149. prompt: "",
  150. title: window.settings.options.alerts[id].rewardtitle
  151. },
  152. status: "",
  153. user: {
  154. display_name: "Tester",
  155. id: "tester",
  156. login: "tester"
  157. },
  158. user_input: ""
  159. }
  160. })
  161. }
  162. remove(id: string){
  163. if(this.binds[id]){
  164. this.binds[id].remove();
  165. delete this.binds[id];
  166. }
  167. delete window.settings.options.alerts[id];
  168. window.settings.save();
  169. this.updateView();
  170. }
  171. }
  172. export default AlertFront