cj-tauri 1.1.2 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -77
- package/bin/cj-tauri.js +287 -287
- package/cjpm.toml +13 -2
- package/cli/cjpm.toml +22 -13
- package/cli/src/doctor.cj +308 -304
- package/cli/src/main.cj +129 -121
- package/cli/src/manifest.cj +632 -0
- package/cli/src/manifest_test.cj +87 -0
- package/cli/src/project.cj +770 -754
- package/cli/src/resolve.cj +348 -348
- package/cli/src/scaffold.cj +46 -38
- package/cli/src/sync.cj +526 -0
- package/cli/src/util.cj +9 -0
- package/cli/templates/app/README.md +30 -59
- package/cli/templates/app/{ui → assets/ui}/index.html +2 -0
- package/cli/templates/app/cj-tauri.toml +32 -0
- package/cli/templates/app/cjpm.toml +21 -4
- package/cli/templates/app/src/main.cj +29 -16
- package/cli/templates/app-react/README.md +34 -45
- package/cli/templates/app-react/{ui → assets/ui}/index.html +25 -25
- package/cli/templates/app-react/{ui → assets/ui}/src/App.css +67 -67
- package/cli/templates/app-react/{ui → assets/ui}/src/App.jsx +124 -124
- package/cli/templates/app-react/cj-tauri.toml +33 -0
- package/cli/templates/app-react/cjpm.toml +21 -4
- package/cli/templates/app-react/src/main.cj +18 -29
- package/cli/templates/app-vue/README.md +34 -38
- package/cli/templates/app-vue/{ui → assets/ui}/index.html +25 -25
- package/cli/templates/app-vue/{ui → assets/ui}/src/App.vue +176 -176
- package/cli/templates/app-vue/cj-tauri.toml +33 -0
- package/cli/templates/app-vue/cjpm.toml +21 -4
- package/cli/templates/app-vue/src/main.cj +18 -29
- package/cli/templates/{ohos-pc → ohos-skeleton}/README.md +5 -0
- package/cli/templates/{ohos-pc → ohos-skeleton}/build-hap.sh +15 -0
- package/cli/templates/{ohos-pc → ohos-skeleton}/entry/cjpm.toml +8 -0
- package/cli/templates/ohos-skeleton/entry/src/main/cangjie/dialog_host.cj +217 -0
- package/cli/templates/ohos-skeleton/entry/src/main/cangjie/index.cj +527 -0
- package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/module.json5 +8 -0
- package/native/build_win.bat +62 -62
- package/native/core/bridge_core.c +1681 -1626
- package/native/core/bridge_core.h +675 -618
- package/native/core/bridge_js.h +108 -108
- package/native/platforms/harmonyos/README.md +115 -6
- package/native/platforms/linux/bridge_linux.c +2787 -2485
- package/native/platforms/windows/bridge_win.c +3740 -3248
- package/native/tests/gtk_threading_probe.c +143 -143
- package/native/tests/test_bridge_core.c +1339 -1228
- package/package.json +53 -51
- package/prebuilt/linux-x64/cj-tauri +0 -0
- package/src/api_system.cj +67 -67
- package/src/app.cj +325 -940
- package/src/app_events.cj +166 -0
- package/src/app_host_ops.cj +287 -0
- package/src/app_run.cj +283 -0
- package/src/app_spec.cj +76 -0
- package/src/arkweb_menu.cj +216 -0
- package/src/arkweb_script.cj +0 -12
- package/src/capability.cj +409 -409
- package/src/clipboard_bridge.cj +178 -0
- package/src/dialog_spec.cj +79 -0
- package/src/dragdrop.cj +26 -26
- package/src/embedded_assets.cj +98 -98
- package/src/host.cj +752 -604
- package/src/host_arkweb.cj +201 -17
- package/src/host_webkit.cj +663 -548
- package/src/host_webview2.cj +663 -548
- package/src/hotkey.cj +66 -66
- package/src/ipc_hub.cj +337 -337
- package/src/ipc_message.cj +286 -286
- package/src/launch.cj +62 -0
- package/src/logging.cj +127 -127
- package/src/menu.cj +197 -197
- package/src/platform/platform_app_context.cj +77 -0
- package/src/platform/platform_assets.cj +33 -0
- package/src/platform/platform_discover.cj +176 -0
- package/src/platform/platform_env.cj +29 -0
- package/src/platform/platform_feature.cj +31 -0
- package/src/platform/platform_page_source.cj +87 -0
- package/src/platform/platform_target_info.cj +32 -0
- package/src/platform_host_provider.cj +87 -0
- package/src/plugin.cj +333 -299
- package/src/plugins/clipboard/plugin_clipboard.cj +152 -144
- package/src/plugins/dialog/plugin_dialog.cj +209 -209
- package/src/plugins/fs/plugin_fs.cj +105 -1
- package/src/plugins/http/http_backend.cj +131 -0
- package/src/plugins/http/http_desktop.cj +195 -0
- package/src/plugins/http/http_ohos.cj +204 -0
- package/src/plugins/http/plugin_http.cj +310 -459
- package/src/plugins/log/plugin_log.cj +105 -105
- package/src/plugins/menu/plugin_menu.cj +8 -0
- package/src/plugins/notification/plugin_notification.cj +154 -146
- package/src/plugins/serial/plugin_serial.cj +17 -1
- package/src/plugins/serial/serial_bridge.cj +9 -1
- package/src/plugins/serial/serial_manager_ohos.cj +92 -0
- package/src/plugins/serial/serial_ohos.cj +529 -0
- package/src/plugins/shell/plugin_shell.cj +29 -1
- package/src/plugins/sqlite/plugin_sqlite.cj +8 -0
- package/src/plugins/ws/plugin_ws.cj +488 -470
- package/src/process_hidden.cj +174 -174
- package/src/scope.cj +391 -391
- package/src/shell_event.cj +69 -69
- package/src/tests/app_spec_test.cj +126 -0
- package/src/tests/capability_test.cj +243 -243
- package/src/tests/dialog_spec_test.cj +73 -0
- package/src/tests/fake_host.cj +201 -186
- package/src/tests/ipc_hub_test.cj +487 -487
- package/src/tests/logging_test.cj +62 -62
- package/src/tests/platform_contract_test.cj +251 -0
- package/src/tests/plugin_clipboard_test.cj +222 -222
- package/src/tests/plugin_dialog_test.cj +237 -237
- package/src/tests/plugin_fs_test.cj +207 -0
- package/src/tests/plugin_http_test.cj +124 -124
- package/src/tests/plugin_notification_test.cj +205 -205
- package/src/tests/plugin_serial_test.cj +48 -0
- package/src/tests/plugin_test.cj +66 -3
- package/src/tests/plugin_ws_test.cj +40 -40
- package/src/tests/process_hidden_test.cj +129 -129
- package/src/tests/scope_test.cj +350 -350
- package/src/tests/system_host_test.cj +99 -81
- package/src/tests/urlutil_test.cj +53 -53
- package/src/tests/version_test.cj +75 -75
- package/src/tests/window_registry_test.cj +123 -123
- package/src/tray.cj +90 -90
- package/src/urlutil.cj +159 -159
- package/src/version.cj +44 -44
- package/src/window.cj +51 -51
- package/src/window_registry.cj +116 -116
- package/cli/templates/ohos-pc/entry/src/main/cangjie/index.cj +0 -167
- package/prebuilt/win32-x64/cj-tauri.exe +0 -0
- package/src/host_factory.cj +0 -48
- /package/cli/templates/app/{capabilities → assets/capabilities}/default.json +0 -0
- /package/cli/templates/app-react/{capabilities → assets/capabilities}/default.json +0 -0
- /package/cli/templates/app-react/{ui → assets/ui}/package.json +0 -0
- /package/cli/templates/app-react/{ui → assets/ui}/src/main.jsx +0 -0
- /package/cli/templates/app-react/{ui → assets/ui}/vite.config.js +0 -0
- /package/cli/templates/app-vue/{capabilities → assets/capabilities}/default.json +0 -0
- /package/cli/templates/app-vue/{ui → assets/ui}/package.json +0 -0
- /package/cli/templates/app-vue/{ui → assets/ui}/src/main.js +0 -0
- /package/cli/templates/app-vue/{ui → assets/ui}/vite.config.js +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/AppScope/app.json5 +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/AppScope/resources/base/element/string.json +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/AppScope/resources/base/media/background.png +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/AppScope/resources/base/media/foreground.png +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/AppScope/resources/base/media/layered_image.json +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/build-profile.json5 +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/build-profile.json5 +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/hvigorfile.ts +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/oh-package.json5 +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/cangjie/ability_stage.cj +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/cangjie/app_host.cj +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/cangjie/main_ability.cj +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/element/color.json +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/element/string.json +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/media/background.png +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/media/foreground.png +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/media/layered_image.json +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/media/startIcon.png +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/profile/main_pages.json +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/rawfile/capabilities.json +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/rawfile/index.html +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/hvigor/hvigor-config.json5 +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/hvigorfile.ts +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/oh-package.json5 +0 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
package ohos_app_cangjie_entry
|
|
2
|
+
|
|
3
|
+
import kit.ArkUI.*
|
|
4
|
+
import ohos.arkui.state_macro_manage.*
|
|
5
|
+
import std.collection.HashMap
|
|
6
|
+
import cjTauri.*
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* 「每个窗口已回填的请求 id」——组件与父组件共享的一格状态(同包、UI 线程内)。
|
|
10
|
+
*
|
|
11
|
+
* 为什么需要它:父组件要判断「当前这条还在展示、不能再取下一条」,而展示中这件事
|
|
12
|
+
* 只有组件自己知道(`answered` 是它的私有 @State)。把答案放在这里,两边读同一份,
|
|
13
|
+
* 就不用把闭包当构造参数传给 @Component(那条路宏支持有限,且多窗口下容易串台)。
|
|
14
|
+
*
|
|
15
|
+
* 没登记过的窗口回 -1:与 `dialogRequestId` 的初值相等,所以**首次**允许取请求。
|
|
16
|
+
*/
|
|
17
|
+
let dialogAnswered: HashMap<String, Int64> = HashMap<String, Int64>()
|
|
18
|
+
|
|
19
|
+
/** 取某窗口「已回填的请求 id」,没记录过返回 -1(= 还没有任何一条被答过) */
|
|
20
|
+
func dialogAnsweredIdOf(label: String): Int64 {
|
|
21
|
+
match (dialogAnswered.get(label)) {
|
|
22
|
+
case Some(v) => return v
|
|
23
|
+
case None => return -1
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** 记下某窗口已回填的 id(回填发生在 UI 线程,与读取同线程,不需要锁) */
|
|
28
|
+
func markDialogAnswered(label: String, id: Int64): Unit {
|
|
29
|
+
dialogAnswered[label] = id
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/*
|
|
33
|
+
* 对话框 overlay 的外观常量(0xAARRGGBB,Int64 就是 ResourceColor)。
|
|
34
|
+
*
|
|
35
|
+
* **遮罩必须带 alpha**:早先这里是 `Color.Black`(= 0xFF000000,完全不透明),
|
|
36
|
+
* 弹出时整页被一块黑板盖住——用户真机实测的原话是「背景全黑了」。
|
|
37
|
+
* 现在 0x66 ≈ 40% 不透明,页面内容透得出来,才像对话框盖在页面上。
|
|
38
|
+
*
|
|
39
|
+
* 这几个常量就是业务侧的定制位:改配色改这里,改布局改下面 `CjDialogHost.build()`。
|
|
40
|
+
* 想彻底换成自己的样式(比如页内 HTML 弹窗)就不要调 `dialog:message`——
|
|
41
|
+
* overlay 只是「零配置可用」的默认实现,不是唯一通路。
|
|
42
|
+
*/
|
|
43
|
+
let DIALOG_SCRIM: Int64 = 0x66000000
|
|
44
|
+
|
|
45
|
+
let DIALOG_CARD_BG: Int64 = 0xFFFFFFFF
|
|
46
|
+
|
|
47
|
+
let DIALOG_TITLE_TEXT: Int64 = 0xFF1A1A1A
|
|
48
|
+
|
|
49
|
+
let DIALOG_BODY_TEXT: Int64 = 0xFF44474F
|
|
50
|
+
|
|
51
|
+
/* 取消键的浅灰底:中性动作不抢主色,桌面惯例里主色只给「确定」 */
|
|
52
|
+
let DIALOG_BTN_NEUTRAL: Int64 = 0xFFF1F3F5
|
|
53
|
+
|
|
54
|
+
/* 确定键底色按 kind 区分:info 蓝 / warning 橙 / error 红;单键与双键共用这一支 */
|
|
55
|
+
let DIALOG_ACCENT_INFO: Int64 = 0xFF0A59F7
|
|
56
|
+
|
|
57
|
+
let DIALOG_ACCENT_WARNING: Int64 = 0xFFED6F21
|
|
58
|
+
|
|
59
|
+
let DIALOG_ACCENT_ERROR: Int64 = 0xFFE84026
|
|
60
|
+
|
|
61
|
+
/*
|
|
62
|
+
* kind → 强调色(`normalizeDialogKind` 是框架共享层的归一,认不出的 kind 已回落成 info)
|
|
63
|
+
*
|
|
64
|
+
* 只影响「确定键底色」这一个可视点:警告与错误在桌面惯例里都用颜色区分,
|
|
65
|
+
* 而单键/双键的**语义**判定在框架侧(`dialogShapeOf`),这里不重复判一次。
|
|
66
|
+
*/
|
|
67
|
+
func dialogAccentColor(kind: String): Int64 {
|
|
68
|
+
match (normalizeDialogKind(kind)) {
|
|
69
|
+
case "warning" => return DIALOG_ACCENT_WARNING
|
|
70
|
+
case "error" => return DIALOG_ACCENT_ERROR
|
|
71
|
+
case _ => return DIALOG_ACCENT_INFO
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/*
|
|
76
|
+
* 宿主对话框的默认呈现(声明式 overlay)。
|
|
77
|
+
*
|
|
78
|
+
* ## 为什么必须是声明式
|
|
79
|
+
*
|
|
80
|
+
* 页面经 `dialog:message` 要求弹框时,命令是从 `javaScriptProxy` 的 `post` 回调同步栈上回来的;
|
|
81
|
+
* 在那条栈上调 `showAlertDialog` / `getPromptAction().showDialog`(含 `workerthread: true`)
|
|
82
|
+
* 会被 ArkUI **静默丢弃**——不抛异常、窗口不画、回调不来(取证见 docs/鸿蒙ArkWeb接入踩坑.md §10.11)。
|
|
83
|
+
* 所以唯一的落法是:回调里只置状态,`build()` 里按状态把 overlay 画成组件树的最后一个孩子。
|
|
84
|
+
*
|
|
85
|
+
* ## 为什么做成组件
|
|
86
|
+
*
|
|
87
|
+
* 内联在 `CjTauriWebView` 里时,业务想换个样子只能改模板——而 `targets/` 是 `cj-tauri sync`
|
|
88
|
+
* 的派生物,改了下次 sync 就没了。抽成组件后业务只需在根 `Stack` 里放一个实例:
|
|
89
|
+
*
|
|
90
|
+
* ```
|
|
91
|
+
* if (this.dialogActive) {
|
|
92
|
+
* CjDialogHost(windowLabel: this.windowLabel, requestId: this.dialogRequestId,
|
|
93
|
+
* title: this.dialogTitle, message: this.dialogMessage,
|
|
94
|
+
* twoKey: this.dialogIsConfirm, kind: this.dialogKind)
|
|
95
|
+
* }
|
|
96
|
+
* ```
|
|
97
|
+
*
|
|
98
|
+
* 调用点必须保持**纯调用**:挂链式修饰(`.width(...)` 之类)会让 `@Component` 宏展开时
|
|
99
|
+
* 补不上 `__gen_parent`,报的是「expected N arguments」(见 AGENTS §4)。
|
|
100
|
+
*
|
|
101
|
+
* ## 点完为什么自己会消失
|
|
102
|
+
*
|
|
103
|
+
* 按钮回填走模块级 `answerArkWebDialog`(框架队列),而父组件的 `dialogActive` 不会因为
|
|
104
|
+
* 一次点击而变——所以收起由组件自己记:`answered` 记住已回填的请求 id,`requestId`
|
|
105
|
+
* 与它不等时才画。下一轮请求进来父组件赋一个新的 `requestId`,卡片自然重新出现。
|
|
106
|
+
* 这条不依赖父组件回调,也就不需要把闭包当构造参数传进来。
|
|
107
|
+
*
|
|
108
|
+
* ## 收起后必须 visibility(None),不能只把子内容裁掉
|
|
109
|
+
*
|
|
110
|
+
* 组件要挂在外层 `Stack` 里就得始终返回一个根节点,所以外层 `Column` 收起来之后**仍然在**——
|
|
111
|
+
* 它是 100%×100% 的透明容器,在 ArkUI 里照样参与命中测试、照样吃掉落在页面上的点击。
|
|
112
|
+
* 真机第二轮反馈的原话是「点完对话框后,点其他没反应了」:卡片确实没了,整页却点不动,
|
|
113
|
+
* 凶手就是这层看不见的壳。
|
|
114
|
+
*
|
|
115
|
+
* `Visibility.Hidden` 不够——它只是不画,**布局占位与命中区都还在**;只有
|
|
116
|
+
* `Visibility.None` 才既不占位也不响应事件。所以这里两分:该画时 Visible,收起时 None。
|
|
117
|
+
* (同类风险:任何「常驻但条件内空的 overlay 容器」都要这么写,别只依赖背景透明。)
|
|
118
|
+
*/
|
|
119
|
+
@Component
|
|
120
|
+
class CjDialogHost {
|
|
121
|
+
/* label 决定回填给哪个窗口的宿主(多窗口下不能串台) */
|
|
122
|
+
@Prop
|
|
123
|
+
var windowLabel: String
|
|
124
|
+
|
|
125
|
+
/* 请求 id:父组件每来一条新请求就换一个值,组件据此判断该不该重新显示 */
|
|
126
|
+
@Prop
|
|
127
|
+
var requestId: Int64
|
|
128
|
+
|
|
129
|
+
@Prop
|
|
130
|
+
var title: String
|
|
131
|
+
|
|
132
|
+
@Prop
|
|
133
|
+
var message: String
|
|
134
|
+
|
|
135
|
+
/* true = 双键(取消 + 确定),false = 单键(只有确定);判定在框架侧,这里只消费 */
|
|
136
|
+
@Prop
|
|
137
|
+
var twoKey: Bool
|
|
138
|
+
|
|
139
|
+
/* info / warning / error,只用于确定键配色 */
|
|
140
|
+
@Prop
|
|
141
|
+
var kind: String
|
|
142
|
+
|
|
143
|
+
/* 已回填过的请求 id(-1 = 还没有)。@State 不允许与 private 同用,宏会拒绝。 */
|
|
144
|
+
@State
|
|
145
|
+
var answered: Int64 = -1
|
|
146
|
+
|
|
147
|
+
func build() {
|
|
148
|
+
/* 外层这一层 **不设背景**:遮罩只在「确实该画」的那一支里,否则收起的瞬间
|
|
149
|
+
整页会被一层灰蒙住不散(内联版第一版就有这个毛病)。 */
|
|
150
|
+
Column {
|
|
151
|
+
if (this.requestId != this.answered) {
|
|
152
|
+
Column {
|
|
153
|
+
Column(space: 14) {
|
|
154
|
+
Text(this.title)
|
|
155
|
+
.fontSize(19)
|
|
156
|
+
.fontWeight(FontWeight.Bold)
|
|
157
|
+
.fontColor(DIALOG_TITLE_TEXT)
|
|
158
|
+
.width(100.percent)
|
|
159
|
+
Text(this.message)
|
|
160
|
+
.fontSize(15)
|
|
161
|
+
.fontColor(DIALOG_BODY_TEXT)
|
|
162
|
+
.width(100.percent)
|
|
163
|
+
Row(space: 12) {
|
|
164
|
+
if (this.twoKey) {
|
|
165
|
+
Button("取消")
|
|
166
|
+
.fontSize(15)
|
|
167
|
+
.fontColor(DIALOG_BODY_TEXT)
|
|
168
|
+
.backgroundColor(DIALOG_BTN_NEUTRAL)
|
|
169
|
+
.onClick({ _ => this.answer(false) })
|
|
170
|
+
}
|
|
171
|
+
Button("确定")
|
|
172
|
+
.fontSize(15)
|
|
173
|
+
.fontColor(Color.White)
|
|
174
|
+
.backgroundColor(dialogAccentColor(this.kind))
|
|
175
|
+
.onClick({ _ => this.answer(true) })
|
|
176
|
+
}
|
|
177
|
+
.width(100.percent)
|
|
178
|
+
.justifyContent(FlexAlign.End)
|
|
179
|
+
}
|
|
180
|
+
.width(86.percent)
|
|
181
|
+
.constraintSize(maxWidth: 420)
|
|
182
|
+
.padding(20)
|
|
183
|
+
.backgroundColor(DIALOG_CARD_BG)
|
|
184
|
+
.borderRadius(16)
|
|
185
|
+
}
|
|
186
|
+
.width(100.percent)
|
|
187
|
+
.height(100.percent)
|
|
188
|
+
.justifyContent(FlexAlign.Center)
|
|
189
|
+
.backgroundColor(DIALOG_SCRIM)
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
.width(100.percent)
|
|
193
|
+
.height(100.percent)
|
|
194
|
+
/* 收起后整块退出命中测试(详见类头注释):只裁子内容会留下 100% 的透明层,
|
|
195
|
+
真机上表现为「点完对话框后整页点不动」。 */
|
|
196
|
+
.visibility(if (this.requestId != this.answered) {
|
|
197
|
+
Visibility.Visible
|
|
198
|
+
} else {
|
|
199
|
+
Visibility.None
|
|
200
|
+
})
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* 回填用户的选择并收起自己。
|
|
205
|
+
*
|
|
206
|
+
* 先记 `answered` 再回填:回填会进框架的队列锁,连点时第二下不该再压在同一个 id 上
|
|
207
|
+
* (那次回填会被宿主的 `awaitingDialogs` 校验拒掉,日志里看得见)。
|
|
208
|
+
*/
|
|
209
|
+
private func answer(confirmed: Bool): Unit {
|
|
210
|
+
let id = this.requestId
|
|
211
|
+
this.answered = id
|
|
212
|
+
/* 同时登记到共享状态:父组件靠它判断「上一条已答完、可以取下一条」,
|
|
213
|
+
否则 overlay 收起后父组件永远以为还在展示,第二次点菜单就不弹了。 */
|
|
214
|
+
markDialogAnswered(this.windowLabel, id)
|
|
215
|
+
answerArkWebDialog(this.windowLabel, id, confirmed)
|
|
216
|
+
}
|
|
217
|
+
}
|