atomm 对象
atomm 是平台 SDK(platform-sdk.js)加载后注入到页面的全局对象,提供平台能力与 UI 工具。在生成器代码中可直接使用。
生命周期 atomm.lifecycle
通过 lifecycle.on 注册平台生命周期钩子:
atomm.lifecycle.on('export', async () => { ... })
UI 提示 atomm.ui
弹出平台全局提示(toast)。参数为对象:
type:可选success/warning/error/info,默认successmessage:提示文案duration:可选,展示时长,单位秒,0表示不自动关闭;不传默认 3 秒
toast() 返回本条提示的 id;用 closeToast(id) 主动关闭。duration: 0 的常驻提示必须这样关,否则会一直挂着。
atomm.ui.toast({ type: 'success', message: '已完成' })
// 指定展示 5 秒
atomm.ui.toast({ type: 'info', message: '正在处理…', duration: 5 })
// duration: 0 常驻不自动关闭,任务完成后用 closeToast 关掉
const id = await atomm.ui.toast({ type: 'info', message: '导出中…', duration: 0 })
// …任务完成…
await atomm.ui.closeToast(id)
传字符串(如 toast('已完成'))不会生效——平台只读取对象上的 message 与 type,字符串会被当成空消息。ui 命名空间目前提供 toast(返回提示 id)与 closeToast。
语言 atomm.app
平台当前的界面语言,用来让生成器跟着平台一起本地化。
// 当前语言短码,必定是受支持的 17 种之一
const locale = await atomm.app.getLocale()
// 全部受支持语言(短码 + 展示名)
const locales = await atomm.app.getSupportedLocales()
// → [{ code: 'zh', name: '简体中文' }, { code: 'en', name: 'English' }, …]
在首次渲染之前读一次语言,用它初始化文案后再挂载应用,界面就不会先闪一下默认语言:
let locale = 'en'
try {
locale = await atomm.app.getLocale()
} catch {
// 不在平台内(如直接打开页面)会立即失败,沿用默认语言
}
// 用 locale 初始化文案后再挂载应用
这是一次性读取,不是订阅——平台切语言会整页重载,你的应用随之重启并读到新值,不需要自己监听变化。生成器里也不要另放语言切换:它只能切生成器自己,会和平台界面的语言对不上。
getLocale() 返回的一定是下表这 17 种之一,但你的应用未必都翻译了。拿到没有对应文案的语言时,回退到英文或你自己的默认语言。
| 短码 | 展示名 | 语言 |
|---|---|---|
zh | 简体中文 | 简体中文 |
en | English | 英语 |
zh-hant | 繁體中文 | 繁体中文 |
de | Deutsch | 德语 |
es | Español | 西班牙语 |
fr | Français | 法语 |
it | Italiano | 意大利语 |
ja | 日本語 | 日语 |
ko | 한국어 | 韩语 |
ru | Русский | 俄语 |
uk | Українська | 乌克兰语 |
sl | Slovenščina | 斯洛文尼亚语 |
th | ไทย | 泰语 |
pl | Polski | 波兰语 |
cs | Čeština | 捷克语 |
id | Bahasa Indonesia | 印尼语 |
vi | Tiếng Việt | 越南语 |
表格顺序即 getSupportedLocales() 的返回顺序,「展示名」就是它返回的 name。
开发工具包的「模拟器」里有「预览语言」下拉,切换会改变 getLocale() 的返回值并重载生成器,不用真到平台上切语言。见开发工具包。
用户 atomm.user
// 当前是否已登录(只回布尔,不含 token 与个人信息)
const loggedIn = await atomm.user.isLoggedIn()
// 未登录时主动拉起登录弹窗,等用户登录完成后继续;返回最终是否已登录
if (!loggedIn) {
const ok = await atomm.user.login()
if (!ok) return // 用户取消或登录失败
}
// 到这里已登录,继续你的逻辑
login() 只在用户点击等手势发生后约 5 秒内放行,脚本自行发起的调用会被平台拒绝,并在控制台指出。把它放进点击回调即可,这同时也避免了被浏览器弹窗拦截。登录是耗时交互,平台已为它放宽超时(约 5 分钟),无需你自己加超时。
不在平台内时
直接打开页面(没有经平台承载)时,atomm.ui、atomm.app、atomm.user 的调用都会立即失败(Promise 被 reject),不会卡住。代码可能在平台外运行时,直接调用并用 try/catch 兜住即可:
try {
await atomm.ui.toast({ type: 'info', message: 'hi' })
} catch {
// 不在平台内,忽略
}