-
Notifications
You must be signed in to change notification settings - Fork 0
/
widget.js
154 lines (120 loc) · 3.67 KB
/
widget.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
const widget = new ListWidget()
let values = await loadValues()
let percent = values.StateOfCharge
const isCharging = values.ModeConverter == 'CHARGING'
const isOff = values.ModeConverter == 'OFF'
let isValid = !Number.isNaN(percent)
console.log("isValid " + isValid)
console.log("percent " + percent)
console.log("isCharging " + isCharging)
if (!isValid)
percent = 0
let progressStack = await progressCircle(widget, percent)
const mainIconName = isValid ? "house.fill" : "exclamationmark.triangle"
const hasBadge = isCharging || isOff
let mainIcon = SFSymbol.named(mainIconName)
mainIcon.applyFont(Font.regularSystemFont(26))
mainIcon = progressStack.addImage(mainIcon.image)
const mainImageSize = hasBadge ? 30 : 36;
mainIcon.imageSize = new Size(mainImageSize, mainImageSize)
mainIcon.tintColor = new Color("#fafafa")
if (hasBadge) {
const badgeName = isCharging ? "bolt.fill" : "zzz"
let badgeIcon = SFSymbol.named(badgeName)
badgeIcon.applyFont(Font.regularSystemFont(26))
badgeIcon = progressStack.addImage(badgeIcon.image)
badgeIcon.imageSize = new Size(12, 12)
badgeIcon.tintColor = new Color("#fafafa")
}
widget.presentAccessoryCircular() // Does not present correctly
//widget.presentSmall()
Script.setWidget(widget)
Script.complete()
async function progressCircle(
on,
value = 50,
colour = "hsl(0, 0%, 100%)",
background = "hsl(0, 0%, 10%)",
size = 60,
barWidth = 5.5
) {
if (value > 1) {
value /= 100
}
if (value < 0) {
value = 0
}
if (value > 1) {
value = 1
}
async function isUsingDarkAppearance() {
return !Color.dynamic(Color.white(), Color.black()).red
}
let isDark = await isUsingDarkAppearance()
if (colour.split("-").length > 1) {
if (isDark) {
colour = colour.split("-")[1]
} else {
colour = colour.split("-")[0]
}
}
if (background.split("-").length > 1) {
if (isDark) {
background = background.split("-")[1]
} else {
background = background.split("-")[0]
}
}
let w = new WebView()
await w.loadHTML('<canvas id="c"></canvas>')
let base64 = await w.evaluateJavaScript(
`
let colour = "${colour}",
background = "${background}",
size = ${size}*3,
lineWidth = ${barWidth}*3,
percent = ${value * 100}
let canvas = document.getElementById('c'),
c = canvas.getContext('2d')
canvas.width = size
canvas.height = size
let posX = canvas.width / 2,
posY = canvas.height / 2,
onePercent = 360 / 100,
result = onePercent * percent
c.lineCap = 'round'
c.beginPath()
c.arc( posX, posY, (size-lineWidth-1)/2, (Math.PI/180) * 270, (Math.PI/180) * (270 + 360) )
c.strokeStyle = background
c.lineWidth = lineWidth
c.stroke()
c.beginPath()
c.strokeStyle = colour
c.lineWidth = lineWidth
c.arc( posX, posY, (size-lineWidth-1)/2, (Math.PI/180) * 270, (Math.PI/180) * (270 + result) )
c.stroke()
completion(canvas.toDataURL().replace("data:image/png;base64,",""))`,
true
)
const image = Image.fromData(Data.fromBase64String(base64))
let stack = on.addStack()
stack.size = new Size(size, size)
stack.backgroundImage = image
stack.centerAlignContent()
let padding = barWidth * 2
stack.setPadding(padding, padding, padding, padding)
return stack
}
async function loadValues() {
let url = "https://api.kvstore.io/collections/TODO-COLLECTION/items/TODO-ITEMKEY"
let req = new Request(url)
req.headers = { "kvstoreio_api_key": "TODO-APIKEY" }
let jsonString = await req.loadString()
// kvstore json
let json = JSON.parse(jsonString)
jsonString = json.value
// abgelegtes json als value
let innerJson = JSON.parse(jsonString);
console.log(innerJson)
return innerJson
}