Last active
November 5, 2023 14:45
-
-
Save eopo/9344584035f487db0e229d655bdb39c4 to your computer and use it in GitHub Desktop.
iOS widget powered by the Scriptable app that shows the current capacity of FitnessFirst Gyms
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
/** | |
* Script for scriptable to get the current capacity of FitnessFirst Gyms | |
*/ | |
let gymId = 'essen1' | |
let param = args.widgetParameter | |
if (param != null && param.length > 0) { | |
gymId = param | |
} | |
const currentGymCapacity = await fetchGymCapacity(gymId) | |
const storeInfo = await fetchGymInfo(gymId) | |
const gymName = await fetchGymInfo(gymId) | |
const widget = new ListWidget() | |
await createWidget() | |
if (!config.runsInWidget) { | |
await widget.presentSmall() | |
} | |
Script.setWidget(widget) | |
Script.complete() | |
//Create the widget | |
async function createWidget() { | |
const headlineText = widget.addText("🏋️ Capacity") | |
headlineText.font = Font.mediumRoundedSystemFont(19) | |
widget.addSpacer() | |
const widgetStack = widget.addStack() | |
widgetStack.layoutVertically() | |
widgetStack.bottomAlignContent() | |
const capacityText = widgetStack.addText(currentGymCapacity.toString() + "%") | |
capacityText.font = Font.mediumRoundedSystemFont(50) | |
if (currentGymCapacity < 20) { | |
capacityText.textColor = new Color("#33cc33") | |
} else if (currentGymCapacity < 30){ | |
capacityText.textColor = new Color("#ff9900") | |
}else{ | |
capacityText.textColor = new Color("#ff3300") | |
} | |
widgetStack.addSpacer(1) | |
const gymNameText = widgetStack.addText(gymName) | |
gymNameText.font = Font.regularSystemFont(12) | |
} | |
//Fetches the current capacity of the John Reed gym | |
async function fetchGymCapacity(id) { | |
const url = 'https://www.fitnessfirst.de/club/api/checkins/' + id | |
const req = new Request(url) | |
const result = await req.loadJSON() | |
return Math.round(result.data.check_ins*100/ result.data.allowed_people) | |
} | |
//Fetches the name of the gym | |
async function fetchGymInfo(id) { | |
const url = 'https://www.fitnessfirst.de/api/v1/node/club_page?include=field_features,field_opening_times&filter[status][value]=1&page[limit]=40&sort=title' | |
const req = new Request(url) | |
const apiResult = await req.loadJSON() | |
for (var i in apiResult.data){ | |
if(apiResult.data[i].attributes.field_easy_solution_club_id == id) | |
{ | |
return apiResult.data[i].attributes.title; | |
} | |
} | |
return 'Your Gym' | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thank you!
One studio to add to your list:
I also adjusted the
page[limit]=40
to 100 for my studio to be part of the result set.Another nice thing i figured out. If you have the Fitness First App you can set the widget interaction to "URL" and the URL to
com.netpulse.fitnessfirst://
that will open the App when you tap on the widget