-
Notifications
You must be signed in to change notification settings - Fork 244
/
「源码」小组件示例.js
103 lines (95 loc) · 2.87 KB
/
「源码」小组件示例.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
// Variables used by Scriptable.
// These must be at the very top of the file. Do not edit.
// icon-color: orange; icon-glyph: comments;
//
// iOS 桌面组件脚本 @「小件件」
// 开发说明:请从 Widget 类开始编写,注释请勿修改
// https://x.im3x.cn
//
// 添加require,是为了vscode中可以正确引入包,以获得自动补全等功能
if (typeof require === 'undefined') require = importModule
const { Base } = require("./「小件件」开发环境")
// @组件代码开始
class Widget extends Base {
/**
* 传递给组件的参数,可以是桌面 Parameter 数据,也可以是外部如 URLScheme 等传递的数据
* @param {string} arg 自定义参数
*/
constructor (arg) {
super(arg)
this.name = '示例小组件'
this.desc = '「小件件」—— 原创精美实用小组件'
}
/**
* 渲染函数,函数名固定
* 可以根据 this.widgetFamily 来判断小组件尺寸,以返回不同大小的内容
*/
async render () {
const data = await this.getData()
switch (this.widgetFamily) {
case 'large':
return await this.renderLarge(data)
case 'medium':
return await this.renderMedium(data)
default:
return await this.renderSmall(data)
}
}
/**
* 渲染小尺寸组件
*/
async renderSmall (data) {
let w = new ListWidget()
await this.renderHeader(w, data['logo'], data['title'])
const t = w.addText(data['content'])
t.font = Font.lightSystemFont(16)
w.addSpacer()
w.url = this.actionUrl('open-url', data['url'])
return w
}
/**
* 渲染中尺寸组件
*/
async renderMedium (data, num = 3) {
let w = new ListWidget()
await this.renderHeader(w, data['logo'], data['title'])
data['data'].slice(0, num).map(d => {
const cell = w.addStack()
cell.centerAlignContent()
const cell_box = cell.addStack()
cell_box.size = new Size(3, 15)
cell_box.backgroundColor = new Color('#ff837a', 0.6)
cell.addSpacer(10)
const cell_text = cell.addText(d['title'])
cell_text.font = Font.lightSystemFont(16)
cell.url = this.actionUrl("open-url", d['url'])
cell.addSpacer()
w.addSpacer(10)
})
w.addSpacer()
return w
}
/**
* 渲染大尺寸组件
*/
async renderLarge (data) {
return await this.renderMedium(data, 10)
}
/**
* 获取数据函数,函数名可不固定
*/
async getData () {
const api = 'https://x.im3x.cn/v1/test-api.json'
return await this.httpGet(api, true, false)
}
/**
* 自定义注册点击事件,用 actionUrl 生成一个触发链接,点击后会执行下方对应的 action
* @param {string} url 打开的链接
*/
async actionOpenUrl (url) {
Safari.openInApp(url, false)
}
}
// @组件代码结束
const { Testing } = require("./「小件件」开发环境")
await Testing(Widget)