Created
February 25, 2024 14:47
-
-
Save jag-k/e7068a779fd72a5dfef1ccbda77e3700 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
// This script shows a random Scriptable API in a widget. The script is meant to be used with a widget configured on the Home Screen. | |
// You can run the script in the app to preview the widget or you can go to the Home Screen, add a new Scriptable widget and configure the widget to run this script. | |
// You can also try creating a shortcut that runs this script. Running the shortcut will show widget. | |
let api = await randomAPI() | |
let widget = await createWidget(api) | |
if (config.runsInWidget) { | |
// The script runs inside a widget, so we pass our instance of ListWidget to be shown inside the widget on the Home Screen. | |
Script.setWidget(widget) | |
} else { | |
// The script runs inside the app, so we preview the widget. | |
widget.presentMedium() | |
} | |
// Calling Script.complete() signals to Scriptable that the script have finished running. | |
// This can speed up the execution, in particular when running the script from Shortcuts or using Siri. | |
Script.complete() | |
async function createWidget(api) { | |
let appIcon = await loadAppIcon() | |
let title = "Random Scriptable API" | |
let widget = new ListWidget() | |
// Add background gradient | |
let gradient = new LinearGradient() | |
gradient.locations = [0, 1] | |
gradient.colors = [ | |
new Color("141414"), | |
new Color("13233F") | |
] | |
widget.backgroundGradient = gradient | |
// Show app icon and title | |
let titleStack = widget.addStack() | |
let appIconElement = titleStack.addImage(appIcon) | |
appIconElement.imageSize = new Size(15, 15) | |
appIconElement.cornerRadius = 4 | |
titleStack.addSpacer(4) | |
let titleElement = titleStack.addText(title) | |
titleElement.textColor = Color.white() | |
titleElement.textOpacity = 0.7 | |
titleElement.font = Font.mediumSystemFont(13) | |
widget.addSpacer(12) | |
// Show API | |
let nameElement = widget.addText(api.name) | |
nameElement.textColor = Color.white() | |
nameElement.font = Font.boldSystemFont(18) | |
widget.addSpacer(2) | |
let descriptionElement = widget.addText(api.description) | |
descriptionElement.minimumScaleFactor = 0.5 | |
descriptionElement.textColor = Color.white() | |
descriptionElement.font = Font.systemFont(18) | |
// UI presented in Siri ans Shortcuta is non-interactive, so we only show the footer when not running the script from Siri. | |
if (!config.runsWithSiri) { | |
widget.addSpacer(8) | |
// Add button to open documentation | |
let linkSymbol = SFSymbol.named("arrow.up.forward") | |
let footerStack = widget.addStack() | |
let linkStack = footerStack.addStack() | |
linkStack.centerAlignContent() | |
linkStack.url = api.url | |
let linkElement = linkStack.addText("Read more") | |
linkElement.font = Font.mediumSystemFont(13) | |
linkElement.textColor = Color.blue() | |
linkStack.addSpacer(3) | |
let linkSymbolElement = linkStack.addImage(linkSymbol.image) | |
linkSymbolElement.imageSize = new Size(11, 11) | |
linkSymbolElement.tintColor = Color.blue() | |
footerStack.addSpacer() | |
// Add link to documentation | |
let docsSymbol = SFSymbol.named("book") | |
let docsElement = footerStack.addImage(docsSymbol.image) | |
docsElement.imageSize = new Size(20, 20) | |
docsElement.tintColor = Color.white() | |
docsElement.imageOpacity = 0.5 | |
docsElement.url = "https://docs.scriptable.app" | |
} | |
return widget | |
} | |
async function randomAPI() { | |
let docs = await loadDocs() | |
let apiNames = Object.keys(docs) | |
let num = Math.round(Math.random() * apiNames.length) | |
let apiName = apiNames[num] | |
let api = docs[apiName] | |
return { | |
name: apiName, | |
description: api["!doc"], | |
url: api["!url"] | |
} | |
} | |
async function loadDocs() { | |
let url = "https://docs.scriptable.app/scriptable.json" | |
let req = new Request(url) | |
return await req.loadJSON() | |
} | |
async function loadAppIcon() { | |
let url = "https://is5-ssl.mzstatic.com/image/thumb/Purple124/v4/21/1e/13/211e13de-2e74-4221-f7db-d6d2c53b4323/AppIcon-1x_U007emarketing-0-7-0-85-220.png/540x540sr.jpg" | |
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