feat: 对齐常驻商城与七鱼客服交互
- 同步商城 H5 登录态与原生 token - 完善商城/原生 tab 切换、动画及返回交互 - 修复七鱼客服键盘避让和状态栏恢复 - 调整开屏跳过按钮与登录入口交互
This commit is contained in:
1 parent
b4343ea528
commit
3b089e2205
37 files changed
+2970
-375
No files matched your search
@@ -0,0 +1,53 @@
|
||||
typedef WebCanGoBack = Future<bool> Function();
|
||||
typedef WebGoBack = Future<void> Function();
|
||||
typedef WebRunJavaScriptReturningResult = Future<Object> Function(String code);
|
||||
|
||||
const visibleWebBackControlJavaScript = r'''
|
||||
(() => {
|
||||
const selectors = [
|
||||
'.back-btn',
|
||||
'[aria-label="返回"]',
|
||||
'[aria-label="Back"]',
|
||||
'[title="返回"]',
|
||||
'[title="Back"]',
|
||||
].join(',');
|
||||
const candidates = Array.from(document.querySelectorAll(selectors));
|
||||
const control = candidates.find((element) => {
|
||||
const rect = element.getBoundingClientRect();
|
||||
const style = window.getComputedStyle(element);
|
||||
if (
|
||||
rect.width <= 0 || rect.height <= 0 || rect.bottom <= 0 ||
|
||||
rect.right <= 0 || rect.top >= window.innerHeight ||
|
||||
rect.left >= window.innerWidth || style.display === 'none' ||
|
||||
style.visibility === 'hidden' || style.pointerEvents === 'none' ||
|
||||
Number(style.opacity || 1) <= 0
|
||||
) return false;
|
||||
const x = Math.min(Math.max(rect.left + rect.width / 2, 0), window.innerWidth - 1);
|
||||
const y = Math.min(Math.max(rect.top + rect.height / 2, 0), window.innerHeight - 1);
|
||||
const topElement = document.elementFromPoint(x, y);
|
||||
return topElement !== null && (topElement === element || element.contains(topElement));
|
||||
});
|
||||
if (!control) return false;
|
||||
control.click();
|
||||
return true;
|
||||
})()
|
||||
''';
|
||||
|
||||
Future<bool> tryGoBackInWebHistory({
|
||||
required WebCanGoBack canGoBack,
|
||||
required WebGoBack goBack,
|
||||
}) async {
|
||||
if (!await canGoBack()) return false;
|
||||
await goBack();
|
||||
return true;
|
||||
}
|
||||
|
||||
Future<bool> tryGoBackUsingVisibleWebControl({
|
||||
required WebRunJavaScriptReturningResult runJavaScriptReturningResult,
|
||||
}) async {
|
||||
final result = await runJavaScriptReturningResult(
|
||||
visibleWebBackControlJavaScript,
|
||||
);
|
||||
if (result is bool) return result;
|
||||
return result.toString().replaceAll('"', '').trim().toLowerCase() == 'true';
|
||||
}
|
||||
Reference in new issue
Block a user