Advertisement
mvan231

Reminders widget fixed

Oct 13th, 2021
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.75 KB | None | 0 0
  1. // Reminders due today and tomorrow widget
  2. var MAX_TASKS_SHOWN = 12;
  3. const NOW = new Date();
  4.  
  5.  
  6. const TITLE_FONT = Font.boldSystemFont(8);
  7. const BODY_FONT = Font.semiboldRoundedSystemFont(9);
  8.  
  9. const today = new Date()
  10. const tomorrow = new Date(today)
  11. tomorrow.setDate(tomorrow.getDate() + 1)
  12. tomorrow.setHours(0,0,0,0)
  13. const tomorrow2 = new Date(today)
  14. tomorrow2.setDate(tomorrow2.getDate() + 2)
  15. tomorrow2.setHours(0,0,0,0)
  16.  
  17. const BACKGROUND_DARK_MODE = "system"
  18. // options: "yes", "no", "system"
  19.  
  20. //
  21. // Utils
  22. //
  23.  
  24.  
  25.  
  26. const compareReminderDuedates = (reminderA, reminderB) =>
  27. reminderA.dueDate - reminderB.dueDate;
  28. const sortRemindersByDuedateAsc = reminders =>
  29. reminders.sort(compareReminderDuedates);
  30.  
  31. /** Round date down to 00:00 */
  32. const stripTime = date => new Date(new Date(date).setHours(0, 0, 0, 0));
  33.  
  34. /** d1 - d2: will be negative if d2 > d1 */
  35. const daysBetween = (d1, d2) => {
  36. const differenceMs = stripTime(d1).getTime() - stripTime(d2).getTime();
  37. return Math.floor(differenceMs / 86400000);
  38. };
  39.  
  40. const getOverdueTasks = async () => {
  41. const all = await Reminder.allIncomplete();
  42. return sortRemindersByDuedateAsc(
  43. all.filter(task => task.dueDate && task.dueDate < today)
  44. );
  45. };
  46.  
  47. const getTodayTasks = async () => {
  48. const all = await Reminder.allIncomplete();
  49. return sortRemindersByDuedateAsc(
  50. all.filter(task => today <= task.dueDate && task.dueDate < tomorrow)
  51. );
  52. };
  53.  
  54. const getTomorrowTasks = async () => {
  55. const all = await Reminder.allIncomplete();
  56. return sortRemindersByDuedateAsc(
  57. all.filter(task => tomorrow <= task.dueDate && task.dueDate < tomorrow2)
  58. );
  59. };
  60.  
  61. // overdue tasks
  62.  
  63. const getWidget = async () => {
  64. const overdueTasks = await getOverdueTasks();
  65. const todayTasks = await getTodayTasks();
  66. const tomorrowTasks = await getTomorrowTasks();
  67.  
  68. const widget = new ListWidget();
  69. widget.backgroundColor = BG_COLOR;
  70.  
  71. let isDarkMode =
  72. BACKGROUND_DARK_MODE=="system" ?
  73. await isUsingDarkAppearance() :
  74. BACKGROUND_DARK_MODE=="yes"
  75.  
  76. if (isDarkMode) {
  77. var BG_COLOR = new Color("#000000");
  78. var TITLE_COLOR = new Color("#9E9E9E");
  79. var OVERDUE_COLOR = new Color("#FE4639");
  80. var TASK_COLOR = new Color("#FFFFFF");
  81. var NO_OVERDUE_COLOR = new Color("#2FD15D");
  82. } else {
  83. var BG_COLOR = Color.white();
  84. var TITLE_COLOR = new Color("#8C8C8C");
  85. var OVERDUE_COLOR = new Color("#FD3F32");
  86. var TASK_COLOR = new Color("#000000");
  87. var NO_OVERDUE_COLOR = new Color("#13C759");
  88. }
  89.  
  90. widget.addSpacer(0);
  91.  
  92. const dueNum = overdueTasks.length + todayTasks.length
  93. if (dueNum) {
  94. var title = widget.addText(`Today ${dueNum}`);
  95. }else{
  96. var title = widget.addText(`Today`);
  97. }
  98. title.textColor = TITLE_COLOR;
  99. title.font = TITLE_FONT;
  100.  
  101.  
  102.  
  103.  
  104. if (overdueTasks.length) {
  105. overdueTasks.slice(0, MAX_TASKS_SHOWN).forEach(({ title, dueDate }) => {
  106. const task = widget.addText(`| ${title}`);
  107. task.textColor = OVERDUE_COLOR;
  108. task.font = BODY_FONT;
  109. task.lineLimit = 1;
  110. });
  111. } else {
  112.  
  113. }
  114.  
  115. MAX_TASKS_SHOWN = MAX_TASKS_SHOWN - overdueTasks.length
  116.  
  117. if (MAX_TASKS_SHOWN > 0) {
  118. if (todayTasks.length) {
  119. todayTasks.slice(0, MAX_TASKS_SHOWN).forEach(({ title, dueDate }) => {
  120. const task = widget.addText(`| ${title}`);
  121. task.textColor = TASK_COLOR;
  122. task.font = BODY_FONT;
  123. task.lineLimit = 1;
  124. });
  125. } else {}
  126. } else {}
  127.  
  128. if (dueNum) {
  129.  
  130. } else {
  131. const noTasks = widget.addText("All done.");
  132. noTasks.textColor = NO_OVERDUE_COLOR;
  133. noTasks.font = BODY_FONT;
  134. }
  135.  
  136. // tomorrow
  137.  
  138. // const tomorrowTasks = Reminder.allDueTomorrow();
  139.  
  140. widget.addSpacer(5);
  141.  
  142. MAX_TASKS_SHOWN = MAX_TASKS_SHOWN - todayTasks.length - 2
  143.  
  144. if (MAX_TASKS_SHOWN > 0){
  145. if (tomorrowTasks.length) {
  146. const title = widget.addText(`Tomorrow ${tomorrowTasks.length}`);
  147. title.textColor = TITLE_COLOR;
  148. title.font = TITLE_FONT;
  149. tomorrowTasks.slice(0, MAX_TASKS_SHOWN).forEach(({ title, dueDate }) => {
  150. const task = widget.addText(`| ${title}`);
  151. task.textColor = TASK_COLOR;
  152. task.font = BODY_FONT;
  153. task.lineLimit = 1;
  154. });
  155. } else {}
  156. } else {}
  157.  
  158. widget.addSpacer();
  159.  
  160. return widget;
  161. };
  162.  
  163. async function isUsingDarkAppearance() {
  164. // yes there's a Device.isUsingDarkAppearance() method
  165. // but I find it unreliable
  166. const wv = new WebView()
  167. let js ="(window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches)"
  168. let r = await wv.evaluateJavaScript(js)
  169. return r
  170. }
  171.  
  172. const widget = await getWidget();
  173. Script.setWidget(widget);
  174. Script.complete();
  175. widget.presentSmall();
  176.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement