import { useEffect, useRef, useState } from "react"; import { Image, View, ScrollView, Video } from "@tarojs/components"; import { formatSeconds, saveMediaFile } from "@/utils/index"; import PageCustom from "@/components/page-custom/index"; import NavBarNormal from "@/components/NavBarNormal/index"; import { checkPermission, showAuthModal } from "@/utils/auth"; import { uploadAndNavToGenNewAvatar } from "@/utils/avatar"; import IconPlusBig from "@/components/icon/icon-plus-big"; import IconPlayWhite24 from '@/components/icon/IconPlayWhite20' import { deleteAvatar, fetchMyAvatars } from "@/service/storage"; import style from "./index.module.less"; import { TAvatarItem } from "@/service/storage"; import { useAgentStore, useAgentStoreActions } from "@/store/agentStore"; import Taro, { useDidShow, useUnload } from "@tarojs/taro"; import { isSuccess } from "@/utils"; import WemetaRadio from "@/components/WemetaRadio/index"; import { useModalStore } from "@/store/modalStore"; import { useLoadMoreInfinite, createKey } from "@/utils/loadMoreInfinite"; import BottomBar from "@/components/BottomBar"; import WemetaButton from "@/components/buttons/WemetaButton"; export default function Index() { const agent = useAgentStore((state) => state.agent); const { setCurrentEditAvatar } = useAgentStoreActions() const [scrollTop, setScrollTop] = useState(0); const scrollPositionRef = useRef(0); const { showModal } = useModalStore((state) => state.actions); const fetcher = async ([_url, { pageIndex, pageSize }]) => { const res = await fetchMyAvatars({ pageIndex: pageIndex, pageSize }); return res.data; }; const { list, loadMore, mutate } = useLoadMoreInfinite( createKey("fetchMyAvatars"), fetcher ); const [current, setCurrent] = useState(null); // 选择形象 const handleSelect = async (e: any, item: TAvatarItem) => { e.stopPropagation() console.log(item); if (current?.avatarId === item.avatarId) { setCurrent(null) } else { setCurrent(item); } }; const handleSetBackground = () => { current && setCurrentEditAvatar(current) Taro.navigateTo({ url: '/pages/agent-avatar-confirm/index' }); } const onScrollToLower = () => { loadMore(); console.log("lower"); }; const handleCreate = () => { uploadAndNavToGenNewAvatar(); }; const handleDelete = async (e: any) => { e.stopPropagation() if (!current || !current.canDel) { return } showModal({ content: <>确认删除该形象?, async onConfirm() { const response = await deleteAvatar(current.avatarId); if (isSuccess(response.status)) { setCurrent(null) mutate(); } }, }); }; const handlePreview = (index: number) => { Taro.previewMedia({ current: index, //@ts-ignore sources: list.map((item) => { return { url: item.avatarUrl, type: item.isVideo ? 'video' : 'image', } }), }) } const saveMedia = async (tmpPath: string) => { const res = await saveMediaFile(tmpPath, current?.isVideo); if (res) { Taro.showToast({ title: '保存成功' }) return } Taro.showToast({ title: '保存失败' }) } const handleDownload = async () => { if (!current?.avatarUrl) { return } // 保存至相册 Taro.showLoading(); const authed = await checkPermission("scope.writePhotosAlbum"); if (!authed) { Taro.hideLoading(); showAuthModal("需要您相册权限"); return; } Taro.downloadFile({ url: current.avatarUrl, success: (res) => { if (res.statusCode === 200) { saveMedia(res.tempFilePath) } }, fail: () => { Taro.hideLoading(); }, }) }; useDidShow(() => { mutate() }) useUnload(()=> { Taro.hideLoading() }) const renderMedia = (avatar: TAvatarItem, index: number) => { if (avatar.isVideo) { return <> handlePreview(index)}> } return handlePreview(index)} />; }; const renderList = () => { if (!list.length) { return ( <> {/* */} ); } return list.map((avatar, index) => { const currentUsed = agent?.avatarUrl === avatar.avatarUrl; const isCurrentSelected = current?.avatarId === avatar.avatarId; return ( handleSelect(e, avatar)} > {currentUsed && } {/* */} {!avatar.isOriginal && 图片由AI生成} {renderMedia(avatar, index)} ); }); }; return ( 历史形象 { scrollPositionRef.current = e.detail.scrollTop; }} style={{ flex: 1, height: "100%", // 高度自适应 }} > 创建新形象 {renderList()} 删除 下载 设置为聊天背景 ); }