// Variables used by Scriptable. // These must be at the very top of the file. Do not edit. // icon-color: deep-green; icon-glyph: car; /************** Version 1.1.0 Changelog: v1.1.0: - X-Callback-URL Parameter skipDialogs=true added to skip the update process alerts - x-success support to go back in case of a X-Callback Notice: You need a free API Key from https://developer.mapquest.com for this Widget Please add the API Key to your Widget via widget parameter. **************/ const zoomLevel = 17 let type, iconColorPosition, iconColorUpdate, cachedParameter; //////////////////////////////////////////////////////////////////////////////// if (Device.isUsingDarkAppearance()) { type = 'dark' iconColorPosition = 'CB4335' iconColorUpdate = 'EDEDED' } else { type = 'light' iconColorPosition = '222222' iconColorUpdate = '222222' } //////////////////////////////////////////////////////////////////////////////// let fm = FileManager.local() let paths = { 'location': fm.joinPath(fm.documentsDirectory(), 'widget-car-location'), 'parameter': fm.joinPath(fm.documentsDirectory(), 'widget-car-location-parameter'), 'small': fm.joinPath(fm.documentsDirectory(), 'widget-car-location-image-small'), 'medium': fm.joinPath(fm.documentsDirectory(), 'widget-car-location-image-medium'), 'large': fm.joinPath(fm.documentsDirectory(), 'widget-car-location-image-large') } let locactionInformationExists = fm.fileExists(paths['location']) if (fm.fileExists(paths['parameter'])) { cachedParameter = fm.readString(paths['parameter']) } //////////////////////////////////////////////////////////////////////////////// let widgetInputRAW = args.widgetParameter || cachedParameter; // set stored Parameter as fallback in case that the script will be run in the app let widgetInput = null; if (widgetInputRAW !== null && widgetInputRAW !== undefined) { widgetInput = widgetInputRAW.toString().split(';') } else { throw new Error('No API Key! Please add a API-Key from "developer.mapquest.com" to the widget parameter') } fm.writeString(paths['parameter'], widgetInputRAW.toString()) //////////////////////////////////////////////////////////////////////////////// async function updateLocationImage (location, size) { let sizeQuery switch (size) { case 'small': sizeQuery = '200,200@2x'; break; case 'medium': sizeQuery = '400,200@2x'; break; case 'large': sizeQuery = '400,400@2x'; break; default: throw new Error('Not supported Size!') } let url = `https://www.mapquestapi.com/staticmap/v5/map?key=${widgetInput[0].trim()}&locations=${location.latitude},${location.longitude}&zoom=${zoomLevel}&format=png&size=${sizeQuery}&type=${type}&defaultMarker=marker-${iconColorPosition}` let req = new Request(url) let img = await req.loadImage() fm.writeImage(paths[size], img) } async function updateLocation() { let l = await Location.current() await updateLocationImage(l, 'small') await updateLocationImage(l, 'medium') await updateLocationImage(l, 'large') fm.writeString(paths['location'], `${l.latitude};${l.longitude}`) return } //////////////////////////////////////////////////////////////////////////////// // Create Widget let widget = new ListWidget(); widget.setPadding(10, 10, 10, 10) // Taping on small widget isn't working due to iOS 14 limitation if (config.widgetFamily !== 'small') { let stack = widget.addStack() stack.layoutHorizontally() stack.addSpacer() let iconStack = stack.addStack() iconStack.layoutVertically() let updateImage = iconStack.addImage(SFSymbol.named('arrow.triangle.2.circlepath').image) updateImage.imageSize = new Size(25,25) updateImage.tintColor = new Color(iconColorUpdate) updateImage.url = URLScheme.forRunningScript() + '&option=updateLocation' iconStack.addSpacer(10) let navigationImage = iconStack.addImage(SFSymbol.named('arrow.triangle.turn.up.right.diamond').image) navigationImage.imageSize = new Size(25,25) navigationImage.tintColor = new Color(iconColorUpdate) let locationString = fm.readString(paths['location']) if (locactionInformationExists && locationString) { let location = locationString.split(';') if ((widgetInput[1] || '').trim().toLocaleLowerCase() == 'google') { navigationImage.url = `comgooglemaps://?daddr=${location[0]},${location[1]}&travelMode=walking` } else { navigationImage.url = `http://maps.apple.com/maps?saddr=Current%20Location&daddr=${location[0]},${location[1]}` } } widget.addSpacer() } if (locactionInformationExists) { widget.backgroundImage = fm.readImage(paths[config.widgetFamily || 'large']) } else { let initText = widget.addText('You have to set the location. Click the icon in the right corner.') initText.font = Font.systemFont(20) initText.minimumScaleFactor = 0.5 widget.addSpacer() } let appQuery = args.queryParameters if (config.runsInWidget === false && ((appQuery.option && appQuery.option == 'updateLocation') || locactionInformationExists == false)) { if (appQuery.skipDialogs && appQuery.skipDialogs === 'true') { await updateLocation() } else { let a = new Alert() a.message = 'Do you like to set the current position as the position of your car?' a.addAction('Yes') a.addCancelAction('No') if(await a.present() === 0) { await updateLocation() let b = new Alert() b.message = 'New location was set' b.addAction('Close') await b.present() } } if (appQuery['x-success']) { Safari.open(appQuery['x-success']) Script.complete() } }else if(config.runsInWidget === false) { await widget.presentLarge() } else { Script.setWidget(widget) } Script.complete()