Guest User

Reminders Widger

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