Created
December 1, 2021 09:53
-
-
Save frboulais/2a11ac628faacf2532d037314324e1a4 to your computer and use it in GitHub Desktop.
Indie App Santa widget for iOS (by Scriptable)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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