Skip to content

Instantly share code, notes, and snippets.

@frboulais
Created December 1, 2021 09:53
Show Gist options
  • Save frboulais/2a11ac628faacf2532d037314324e1a4 to your computer and use it in GitHub Desktop.
Save frboulais/2a11ac628faacf2532d037314324e1a4 to your computer and use it in GitHub Desktop.
Indie App Santa widget for iOS (by Scriptable)
let data = await loadData()
let day = data
let widget = null
if (config.runsInWidget) {
if (config.widgetFamily == "small") {
widget = await createSmallWidget(day)
} else {
widget = await createMediumWidget(day)
}
Script.setWidget(widget)
Script.complete()
} else if (config.runsWithSiri) {
let widget = await createMediumWidget(day)
await widget.presentMedium()
Script.complete()
} else {
await presentMenu(day)
}
async function presentMenu(day) {
let alert = new Alert()
alert.title = day.app.applicationName
alert.message = day.app.caption
alert.addAction("View Small Widget")
alert.addAction("View Medium Widget")
alert.addAction("Open in Indie App Santa")
alert.addCancelAction("Cancel")
let idx = await alert.presentSheet()
if (idx == 0) {
let widget = await createSmallWidget(day)
await widget.presentSmall()
} else if (idx == 1) {
let widget = await createMediumWidget(day)
await widget.presentMedium()
} else if (idx == 2) {
Safari.open("https://www.indieappsanta.com/open-day?id=" + day.id)
}
}
async function createSmallWidget(day) {
let bgImage = await loadSmallBGImage()
let img = await loadImage(day.app.widgetImageUrl)
let end = getEndDate(day)
let w = new ListWidget()
w.addSpacer()
let hstack = w.addStack()
w.url = "https://www.indieappsanta.com/open-day?id=" + day.id
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(100, 100)
wimg.cornerRadius = 12
hstack.addSpacer()
let wname = w.addText(day.app.applicationName)
wname.font = Font.boldSystemFont(22)
wname.textColor = Color.white()
wname.lineLimit = 1
wname.centerAlignText()
wname.minimumScaleFactor = 1
let wDateView = w.add
let wdate = w.addDate(end)
wdate.applyTimerStyle()
wdate.font = Font.systemFont(14)
wdate.centerAlignText()
wdate.textColor = new Color("#FFFFFF", 0.6)
w.addSpacer()
return w
}
async function createMediumWidget(day) {
let bgImage = await loadMediumBGImage()
let img = await loadImage(day.app.widgetImageUrl)
let end = getEndDate(day)
let w = new ListWidget()
w.url = "https://www.indieappsanta.com/open-day?id=" + day.id
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(100, 100)
hstack.addSpacer(12)
let detailsStack = hstack.addStack()
detailsStack.layoutVertically()
let wname = detailsStack.addText(day.app.applicationName)
wname.font = Font.boldSystemFont(22)
wname.textColor = Color.white()
wname.lineLimit = 1
wname.minimumScaleFactor = 0.5
let wdesc = detailsStack.addText(day.app.caption)
detailsStack.addSpacer(4)
wdesc.font = Font.mediumSystemFont(18)
wdesc.textColor = Color.white()
wdesc.lineLimit = 0
let wdate = detailsStack.addDate(end)
wdate.applyTimerStyle()
wdate.font = Font.systemFont(14)
wdate.textColor = new Color("#FFFFFF", 0.6)
hstack.addSpacer()
vstack.addSpacer()
return w
}
function getEndDate(day) {
let formatter = new DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
return formatter.date(day.expiresAt)
}
async function loadData() {
let url = "https://api.indieappsanta.com/today"
let req = new Request(url)
return req.loadJSON()
}
async function loadSmallBGImage() {
let url = "https://firebasestorage.googleapis.com/v0/b/indie-app-santa.appspot.com/o/widget-background-small.png?alt=media&token=02e316dd-1d8f-477a-8d1e-7f1f93f8ee37"
return await loadImage(url)
}
async function loadMediumBGImage() {
let url = "https://firebasestorage.googleapis.com/v0/b/indie-app-santa.appspot.com/o/widget-background-medium.png?alt=media&token=d7121eb5-9a71-4724-8910-a5128808fb4b"
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