mirror of
https://github.com/kuaifan/dootask.git
synced 2026-09-21 03:16:29 +00:00
新移动端从 EEUI(weex) 切到 Expo(react-native),UA 标识从 'eeui' 改为 'DooTaskApp', 桥接底层从全局 requireModuleJs 切到 window.__nativeBridge.call(method,args) Promise RPC。 约 52 个文件批量改名(256 处引用): - 平台识别:$A.isEEUIApp/Vue.prototype.$isEEUIApp → isMobileApp / $isMobileApp app.js 顶部 UA 正则 /eeui/i → /DooTaskApp/i app.js requireModuleJs 等待逻辑替换为 window.__nativeBridge 就绪判定 - 桥接 API:$A.eeuiAppXXX → $A.nativeAppXXX - functions/eeui.js 删除,重写为 functions/native-app.js 底层走 window.__nativeBridge.call;nativeAppSendMessage 把旧 sendMessage 的 各 action 拆解为独立 method 调用(updateTheme/windowSize/setBadge/vibrate/ callTel/picturePreview/videoPreview/startMeeting/updateMeetingInfo 等) - types/dootask-globals.d.ts:方法签名同步改名 - store/actions.js:清理 saveUserInfoBase 内旧的 userChatList/userUploadUrl sendMessage(二期由 /share 接收页直接调接口替代) 二期 /share 接收页(跨 App 分享): - pages/share.vue(新增):原生 Share Extension / Android Intent 通过 dootask://share?token=... 拉起 App 后跳本页; 调 nativeAppGetSharedPayload 取分享元数据; 复用 api/users/share/list 渲染会话列表; 用户选会话 → POST api/dialog/msg/sendfiles 上传 + sendtext 发文本/URL; 完成后 nativeAppClearSharedPayload 清理 + 跳目标会话 - routes.js 注册 /share 路由 - language/original-web.txt 加 share.vue 用到的文案 构建链路(electron/build.js): - appbuild app 子命令:前端产物从复制到 resources/mobile/src/public + EEUI docker 构建 改为同步到 resources/mobile/assets/web(由 plugins/withWebAssets 注入原生 bundle) - android-upload apk 路径:从 platforms/android/eeuiApp/... 改为 android/app/build/outputs/apk/release(Expo prebuild 标准布局) 子模块 resources/mobile 指针更新到新 Expo 工程提交(feat/mobile-expo-rewrite 分支)。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
122 lines
3.0 KiB
Vue
122 lines
3.0 KiB
Vue
<template>
|
|
<Modal
|
|
ref="modal"
|
|
:value="show"
|
|
:styles="modalStyles"
|
|
:mask-closable="false"
|
|
:footer-hide="true"
|
|
:mask="!windowPortrait"
|
|
:fullscreen="windowPortrait"
|
|
:transition-names="transitionNames"
|
|
:class-name="className"
|
|
:beforeClose="onBeforeClose">
|
|
<DialogWrapper
|
|
v-if="show"
|
|
ref="dialogWrapper"
|
|
:dialogId="dialogId"
|
|
:style="dialogStyles"
|
|
:beforeBack="onBeforeClose"
|
|
location="modal"/>
|
|
</Modal>
|
|
</template>
|
|
|
|
<script>
|
|
import {mapState} from "vuex";
|
|
import DialogWrapper from "./DialogWrapper";
|
|
import emitter from "../../../store/events";
|
|
|
|
export default {
|
|
name: "DialogModal",
|
|
components: {DialogWrapper},
|
|
|
|
data() {
|
|
return {
|
|
show: false,
|
|
timer: null,
|
|
closIng: false,
|
|
}
|
|
},
|
|
|
|
mounted() {
|
|
emitter.on('handleMoveTop', this.handleMoveTop);
|
|
},
|
|
|
|
beforeDestroy() {
|
|
emitter.off('handleMoveTop', this.handleMoveTop);
|
|
},
|
|
|
|
computed: {
|
|
...mapState(['dialogId', 'windowOrientation']),
|
|
|
|
modalStyles() {
|
|
if (this.windowPortrait) {
|
|
return {}
|
|
}
|
|
return {
|
|
width: '90%',
|
|
maxWidth: '720px'
|
|
}
|
|
},
|
|
|
|
dialogStyles() {
|
|
if (this.windowPortrait) {
|
|
return {}
|
|
}
|
|
const height = Math.min(1100, this.windowHeight)
|
|
const factor = height > 900 ? 200 : 70;
|
|
return {
|
|
height: '600px',
|
|
maxHeight: (height - factor - 30) + 'px'
|
|
}
|
|
},
|
|
|
|
transitionNames() {
|
|
return this.windowPortrait ? ['mobile-dialog', ''] : ['ease', 'fade']
|
|
},
|
|
|
|
className() {
|
|
const cls = ['dialog-modal', `dialog-${this.windowOrientation}`]
|
|
if (this.closIng > 0) {
|
|
cls.push('dialog-closing')
|
|
}
|
|
return cls.join(' ')
|
|
}
|
|
},
|
|
|
|
watch: {
|
|
dialogId() {
|
|
this.handleShow()
|
|
},
|
|
|
|
windowPortrait() {
|
|
this.handleShow()
|
|
},
|
|
|
|
show(v) {
|
|
this.$store.state.dialogModalShow = v;
|
|
$A.nativeAppSetScrollDisabled(v && this.windowPortrait)
|
|
}
|
|
},
|
|
|
|
methods: {
|
|
onBeforeClose() {
|
|
if (this.$refs.dialogWrapper) {
|
|
this.$refs.dialogWrapper.operateVisible = false
|
|
}
|
|
return new Promise(async _ => {
|
|
this.closIng++
|
|
await this.$store.dispatch("openDialog", 0)
|
|
await new Promise(resolve => setTimeout(resolve, 300))
|
|
this.closIng--
|
|
})
|
|
},
|
|
handleShow() {
|
|
this.show = this.dialogId > 0 && (this.windowPortrait || this.routeName !== 'manage-messenger')
|
|
},
|
|
handleMoveTop(type) {
|
|
type === 'dialogModal' && this.$refs.modal?.handleMoveTop();
|
|
}
|
|
}
|
|
}
|
|
</script>
|