Skip to content

Instantly share code, notes, and snippets.

@frboulais
Forked from simonbs/Indie App Santa.js
Last active December 7, 2020 07:31
Show Gist options
  • Save frboulais/8d8b8f1a9b42f8226d234d398b56d49d to your computer and use it in GitHub Desktop.
Save frboulais/8d8b8f1a9b42f8226d234d398b56d49d to your computer and use it in GitHub Desktop.
Indie App Santa
// Variables used by Scriptable.
// These must be at the very top of the file. Do not edit.
// icon-color: red; icon-glyph: calendar-alt;
let data = await loadData()
let app = data.today[0]
let widget = null
if (config.runsInWidget) {
  if (config.widgetFamily == "small") {
    widget = await createSmallWidget(app)
  } else {
    widget = await createMediumWidget(app)
  }
  Script.setWidget(widget)
  Script.complete()
} else if (config.runsWithSiri) {
  let widget = await createMediumWidget(app)
  await widget.presentMedium()
  Script.complete()
} else {
  await presentMenu(app)
}
async function presentMenu(app) {
  let alert = new Alert()
  alert.title = app.name
  alert.message = app.description
  alert.addAction("View Small Widget")
  alert.addAction("View Medium Widget")
  alert.addAction("Open App Store")
  alert.addCancelAction("Cancel")
  let idx = await alert.presentSheet()
  if (idx == 0) {
    let widget = await createSmallWidget(app)
    await widget.presentSmall()
  } else if (idx == 1) {
    let widget = await createMediumWidget(app)
    await widget.presentMedium()
  } else if (idx == 2) {
    Safari.open(app.url)
  }
}
async function createSmallWidget(app) {
  let bgImage = await loadSmallBGImage()
  let img = await loadImage(app.image)
  let end = getEndDate(app)
  let w = new ListWidget()
  let hstack = w.addStack()
  w.url = app.url
  w.refreshAfterDate = end
  w.setPadding(5, 10, 5, 10)
  w.backgroundImage = bgImage
  hstack.layoutHorizontally()
  hstack.addSpacer()
  let wimg = hstack.addImage(img)
  wimg.imageSize = new Size(60, 60)
  wimg.cornerRadius = 12
  hstack.addSpacer()
  w.addSpacer(8)
  let wname = w.addText(app.name)
  wname.font = Font.boldRoundedSystemFont(22)
  wname.textColor = Color.white()
  wname.lineLimit = 1
  wname.centerAlignText()
  wname.minimumScaleFactor = 0.5
  let wdesc = w.addText(app.description)
  wdesc.font = Font.boldRoundedSystemFont(14)
  wdesc.textColor = Color.white()
  wdesc.centerAlignText()
  w.addSpacer(8)
  let wdate = w.addDate(end)
  wdate.applyTimerStyle()
  wdate.font = Font.boldRoundedSystemFont(14)
  wdate.centerAlignText()
  wdate.textColor = new Color("F6C848")
  return w
}
async function createMediumWidget(app) {
  let bgImage = await loadMediumBGImage()
  let img = await loadImage(app.image)
  let end = getEndDate(app)
  let w = new ListWidget()
  w.url = app.url
  w.refreshAfterDate = end
  w.backgroundImage = bgImage
  w.setPadding(10, 10, 10, 10)
  let vstack = w.addStack()
  vstack.layoutVertically()
  vstack.addSpacer()
  let hstack = vstack.addStack()
  hstack.layoutHorizontally()
  hstack.centerAlignContent()
  let wimg = hstack.addImage(img)
  wimg.cornerRadius = 16
  wimg.imageSize = new Size(75, 75)
  hstack.addSpacer(12)
  let detailsStack = hstack.addStack()
  detailsStack.layoutVertically()
  let wname = detailsStack.addText(app.name)
  wname.font = Font.boldRoundedSystemFont(22)
  wname.textColor = Color.white()
  wname.lineLimit = 1
  wname.minimumScaleFactor = 0.5
  let wdesc = detailsStack.addText(app.description)
  detailsStack.addSpacer(4)
  wdesc.font = Font.boldRoundedSystemFont(16)
  wdesc.textColor = Color.white()
  wdesc.lineLimit = 0
  let wdate = detailsStack.addDate(end)
  wdate.applyTimerStyle()
  wdate.font = Font.boldRoundedSystemFont(14)
  wdate.textColor = new Color("F6C848")
  hstack.addSpacer()
  vstack.addSpacer()
  return w
}
function getEndDate(app) {
  let formatter = new DateFormatter()
  formatter.dateFormat = "yyyy-MM-dd'T'HH:mmZ"
  return formatter.date(app.end + "T05:00Z")
}
  
async function loadData() {
  let url = "https://api.sheety.co/4d96b32779a88a9ad81851c7c514d54f/indieappsanta/today"
  let req = new Request(url)
  return req.loadJSON()
}
async function loadSmallBGImage() {
  let url = "http://www.appcraftstudio.com/images/indieappsanta/small-widget-background.png"
  return await loadImage(url)
}
async function loadMediumBGImage() {
  let url = "http://www.appcraftstudio.com/images/indieappsanta/medium-widget-background.png"
  return await loadImage(url)
}
async function loadImage(url) {
  let req = new Request(url)
  return req.loadImage()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment