Files
qiming/qiming-mobile/subpackages/pages/chat-conversation-component/components/more-popup/more-popup.uvue

290 lines
7.4 KiB
Plaintext

<template>
<drawer-popup
ref="popup"
:title="t('Mobile.Conversation.more')"
direction="bottom"
:auto-height="true"
default-height="15%"
max-height="40%"
>
<view class="menu-list">
<view class="menu-item" @click="handleCollect">
<text class="iconfont icon-Star" v-if="!agentInfo?.collect" />
<text class="iconfont icon-Star-fill" v-else />
<text class="menu-text text-ellipsis">{{
t("Mobile.Conversation.favorite")
}}</text>
</view>
<view class="menu-item" @click="handleShare">
<text class="iconfont icon-Share" />
<text class="menu-text text-ellipsis">{{
t("Mobile.Conversation.share")
}}</text>
</view>
<view
class="menu-item"
v-if="agentInfo?.paymentRequired === true && isSubscriptionEnabled"
@click="handleMySubscription"
>
<text class="iconfont icon-Heart" />
<text class="menu-text text-ellipsis">{{
t("Mobile.Conversation.mySubscription")
}}</text>
</view>
<view class="menu-item" @click="handleMoreInfo">
<text class="iconfont icon-Info" />
<text class="menu-text text-ellipsis">{{
t("Mobile.Conversation.moreInfo")
}}</text>
</view>
<template v-if="isTaskAgent && hasHistory">
<view class="menu-item" @click="handleRestartAgent">
<text class="iconfont icon-restart" />
<text class="menu-text text-ellipsis">{{
t("Mobile.Sandbox.restartAgent")
}}</text>
</view>
<view class="menu-item" @click="handleRestartSandbox">
<text class="iconfont icon-restart_agent" />
<text class="menu-text text-ellipsis">{{
currentSandboxId === "-1"
? t("Mobile.Sandbox.restartCloudComp")
: t("Mobile.Sandbox.restartClient")
}}</text>
</view>
</template>
</view>
</drawer-popup>
<drawer-popup
ref="popupMore"
direction="bottom"
height="85vh"
:show-header="true"
>
<more-info v-if="agentInfo" :agent-info="agentInfo" />
<related-conversation
v-if="agentInfo"
:agent-info="agentInfo"
@view-all="handleViewAll"
/>
</drawer-popup>
<drawer-popup
ref="popupViewAll"
:title="t('Mobile.Conversation.allConversations')"
direction="bottom"
height="85vh"
>
<!-- 根据智能体id动态获取历史记录 -->
<agent-conversation-history
v-if="agentInfo"
:agent-id="agentInfo.agentId"
/>
</drawer-popup>
</template>
<script setup lang="uts">
import { ref } from "vue";
import MoreInfo from "../more-info/more-info.uvue";
import RelatedConversation from "../related-conversation/related-conversation.uvue";
import type { AgentDetailDto } from "@/types/interfaces/agent";
import type { ConversationInfo } from "@/types/interfaces/conversationInfo";
import AgentConversationHistory from "../agent-conversation-history/agent-conversation-history.uvue";
import { useI18n } from "@/utils/i18n";
import { TENANT_CONFIG_INFO } from "@/constants/home.constants";
import type { TenantConfigInfo } from "@/types/interfaces/login";
import { SUCCESS_CODE } from "@/constants/codes.constants.uts";
import { apiTenantConfig } from "@/servers/account";
const { t } = useI18n();
interface Props {
agentInfo: AgentDetailDto;
isTaskAgent?: boolean;
hasHistory?: boolean;
currentSandboxId?: string;
}
// 接收组件属性,设置默认值
const props = withDefaults(defineProps<Props>(), {
isTaskAgent: false,
hasHistory: false,
currentSandboxId: "",
});
// 是否开启订阅
const isSubscriptionEnabled = ref<boolean>(false);
const checkSubscriptionEnable = async () => {
const tenantConfigInfoString = uni.getStorageSync(TENANT_CONFIG_INFO);
if (tenantConfigInfoString) {
try {
const tenantConfig = JSON.parse(
tenantConfigInfoString,
) as TenantConfigInfo;
isSubscriptionEnabled.value = tenantConfig.enableSubscription === 1;
} catch (error) {
console.error("解析租户配置失败:", error);
}
}
try {
const res = await apiTenantConfig();
if (res.code === SUCCESS_CODE && res.data != null) {
const latestConfig = res.data!;
isSubscriptionEnabled.value = latestConfig.enableSubscription === 1;
uni.setStorageSync(TENANT_CONFIG_INFO, JSON.stringify(latestConfig));
}
} catch (e) {
console.error("同步最新租户配置失败:", e);
}
};
checkSubscriptionEnable();
// 定义事件
const emit = defineEmits([
"collect",
"restartAgent",
"restartSandbox",
"mySubscription",
]);
const popup = ref<any>(null);
const popupMore = ref<any>(null);
const popupViewAll = ref<any>(null);
const chatList = ref<ConversationInfo[]>([]);
// 打开抽屉
const open = () => {
checkSubscriptionEnable();
popup.value?.open();
};
// 关闭抽屉
const close = () => {
popup.value?.close();
};
// 收藏功能
const handleCollect = () => {
close();
emit("collect");
};
// 订阅功能
const handleMySubscription = () => {
close();
emit("mySubscription");
};
// 分享功能
const handleShare = () => {
// 获取当前页面URL
let currentUrl = "";
// #ifdef H5
currentUrl = window.location.href;
// #endif
// #ifdef MP-WEIXIN
// 微信小程序中获取当前页面路径
const pages = getCurrentPages();
const currentPage = pages[pages.length - 1];
currentUrl = `/${currentPage.route}`;
if (currentPage.options && Object.keys(currentPage.options).length > 0) {
const params = Object.keys(currentPage.options)
.map((key) => `${key}=${currentPage.options[key]}`)
.join("&");
currentUrl += `?${params}`;
}
// #endif
// 复制到剪贴板
uni.setClipboardData({
data: currentUrl,
success: () => {
uni.showToast({
title: t("Mobile.Link.copyAndOpen"),
icon: "success",
duration: 2000,
});
},
fail: (err) => {
console.error("复制失败:", err);
uni.showToast({
title: t("Mobile.Common.copyFailed"),
icon: "error",
duration: 2000,
});
},
});
close();
};
// 更多信息功能
const handleMoreInfo = () => {
close();
popupMore.value?.open();
};
// 重启智能体
const handleRestartAgent = () => {
close();
emit("restartAgent");
};
// 重启容器环境
const handleRestartSandbox = () => {
close();
emit("restartSandbox");
};
const handleViewAll = (data: ConversationInfo[]) => {
chatList.value = data;
popupViewAll.value?.open();
};
onLoad(() => {});
defineExpose({
open,
close,
popupMore,
});
</script>
<style lang="scss" scoped>
.menu-list {
.menu-item {
display: flex;
flex-direction: row;
align-items: center;
padding: 20rpx 30rpx;
transition: background-color 0.2s;
border-radius: 8rpx;
&:active {
background-color: rgba(12, 20, 102, 0.04);
}
.iconfont {
font-size: 40rpx;
color: #333;
}
.icon-Star-fill {
color: #faad14;
}
.menu-text {
margin-left: 24rpx;
font-size: 32rpx;
line-height: 48rpx;
color: rgba(21, 23, 31, 0.7);
flex: 1;
}
}
}
</style>