|
@@ -13,8 +13,10 @@ import { useVoiceStore } from "@/store/voiceStore";
|
|
|
import { EVoiceStatus, TVoiceItem } from "@/types/voice";
|
|
|
import { TAgentDetail } from "@/types/agent";
|
|
|
|
|
|
-import { getVoiceStatus } from "@/service/voice";
|
|
|
+import { deleteVoice, getVoiceStatus } from "@/service/voice";
|
|
|
import ThinkingAnimation from "@/components/think-animation";
|
|
|
+import { useModalStore } from "@/store/modalStore";
|
|
|
+import { isSuccess } from "@/utils";
|
|
|
|
|
|
interface Props {
|
|
|
agent: TAgentDetail | null;
|
|
@@ -30,10 +32,11 @@ type TTask = {
|
|
|
export default ({ onPlay, agent }: Props) => {
|
|
|
const intervalRef = useRef<NodeJS.Timeout | null>(null);
|
|
|
const [show, setShow] = useState(false);
|
|
|
-
|
|
|
+ const {showModal} = useModalStore()
|
|
|
|
|
|
const { getVoices } = useVoiceStore();
|
|
|
const myVoices = useVoiceStore((state) => state.myVoices);
|
|
|
+ const voices = useVoiceStore((state) => state.voices);
|
|
|
|
|
|
// {
|
|
|
// message: '生成中',
|
|
@@ -42,6 +45,33 @@ export default ({ onPlay, agent }: Props) => {
|
|
|
// }
|
|
|
const [cloning, setCloning] = useState<TTask>();
|
|
|
|
|
|
+ //获取一个默认声音
|
|
|
+ const getDefaultVoice = ()=> {
|
|
|
+ // 优先使用我的声音
|
|
|
+ if(myVoices.length){
|
|
|
+ return myVoices[0]
|
|
|
+ }
|
|
|
+ // 其次使用系统声音
|
|
|
+ const systemVoices = voices.filter((item)=> item.isSystem)
|
|
|
+ if(systemVoices.length){
|
|
|
+ return systemVoices[0]
|
|
|
+ }
|
|
|
+ return null
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查需要不要改变默认声音
|
|
|
+ const syncDefaultVoice = (item: TVoiceItem)=> {
|
|
|
+ // 说明删除的声音是当前使用的声音
|
|
|
+ if(agent?.voiceId === item.voiceId){
|
|
|
+ // 需要默认找一个声音
|
|
|
+ const defaultVoice = getDefaultVoice()
|
|
|
+ if(defaultVoice){
|
|
|
+ handleSelect(defaultVoice)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
const handleSelect = (item: TVoiceItem) => {
|
|
|
if (item.status == EVoiceStatus.DONE) {
|
|
|
if (item.voiceName) {
|
|
@@ -49,6 +79,21 @@ export default ({ onPlay, agent }: Props) => {
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
+ const handleLongPress = (item: TVoiceItem) => {
|
|
|
+ if(voices.length <= 1){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ showModal({
|
|
|
+ content: '确认删除该声音?',
|
|
|
+ onConfirm: async () => {
|
|
|
+ const response = await deleteVoice(item.voiceId)
|
|
|
+ if(isSuccess(response.status)){
|
|
|
+ await getVoices();
|
|
|
+ syncDefaultVoice(item);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ };
|
|
|
|
|
|
// 克隆按钮状态
|
|
|
const handleCloneStatus = (status: ECloneStatus) => {
|
|
@@ -141,7 +186,6 @@ export default ({ onPlay, agent }: Props) => {
|
|
|
const renderItem = (item) => {
|
|
|
if (item.taskId) {
|
|
|
return <CardListItem
|
|
|
- className="pb-16"
|
|
|
underline
|
|
|
leftRenderer={() => {
|
|
|
return (
|
|
@@ -157,7 +201,6 @@ export default ({ onPlay, agent }: Props) => {
|
|
|
|
|
|
return (
|
|
|
<CardListItem
|
|
|
- className="pb-16"
|
|
|
underline
|
|
|
leftRenderer={() => {
|
|
|
return (
|
|
@@ -169,9 +212,13 @@ export default ({ onPlay, agent }: Props) => {
|
|
|
rightRenderer={() => {
|
|
|
return renderRightColumn(item);
|
|
|
}}
|
|
|
+ onLongPress={()=> handleLongPress(item)}
|
|
|
onClick={() => handleSelect(item)}
|
|
|
>
|
|
|
- <View className="flex items-center h-full ">{item.voiceName}</View>
|
|
|
+ <View className="flex flex-col gap-4 py-16">
|
|
|
+ <View className="flex items-center leading-22">{item.voiceName}</View>
|
|
|
+ <View className="text-12 text-gray-45 leading-20">{item.createTime.slice(0,7)}创建</View>
|
|
|
+ </View>
|
|
|
</CardListItem>
|
|
|
);
|
|
|
};
|
|
@@ -184,7 +231,7 @@ export default ({ onPlay, agent }: Props) => {
|
|
|
return <EmptyData></EmptyData>;
|
|
|
}
|
|
|
return (
|
|
|
- <View className="py-12 px-16">
|
|
|
+ <View className="px-16 flex flex-col w-full">
|
|
|
{voices.map((item, _index) => {
|
|
|
return renderItem(item);
|
|
|
})}
|