|
@@ -1,67 +1,60 @@
|
|
-import { useEffect, useState } from "react";
|
|
|
|
|
|
+import { useEffect, useRef, useState } from "react";
|
|
import { Image, View, ScrollView } from "@tarojs/components";
|
|
import { Image, View, ScrollView } from "@tarojs/components";
|
|
|
|
|
|
import PageCustom from "@/components/page-custom/index";
|
|
import PageCustom from "@/components/page-custom/index";
|
|
import NavBarNormal from "@/components/nav-bar-normal/index";
|
|
import NavBarNormal from "@/components/nav-bar-normal/index";
|
|
|
|
|
|
import { uploadAndNavToGenNewAvatar } from "@/utils/avatar";
|
|
import { uploadAndNavToGenNewAvatar } from "@/utils/avatar";
|
|
-import { useAvatars } from "./useAvatars";
|
|
|
|
import IconPlusBig from "@/components/icon/icon-plus-big";
|
|
import IconPlusBig from "@/components/icon/icon-plus-big";
|
|
|
|
|
|
import { editAgentAvatar } from "@/service/agent";
|
|
import { editAgentAvatar } from "@/service/agent";
|
|
-import { deleteAvatar } from "@/service/storage";
|
|
|
|
|
|
+import { deleteAvatar, fetchMyAvatars } from "@/service/storage";
|
|
|
|
|
|
import style from "./index.module.less";
|
|
import style from "./index.module.less";
|
|
import { TAvatarItem } from "@/service/storage";
|
|
import { TAvatarItem } from "@/service/storage";
|
|
import { useAgentStore } from "@/store/agentStore";
|
|
import { useAgentStore } from "@/store/agentStore";
|
|
-import useSWRMutation from "swr/mutation";
|
|
|
|
|
|
+
|
|
import Taro from "@tarojs/taro";
|
|
import Taro from "@tarojs/taro";
|
|
import { isSuccess } from "@/utils";
|
|
import { isSuccess } from "@/utils";
|
|
|
|
+import IconDeleteGray16 from "@/components/icon/IconDeleteGray16";
|
|
|
|
+import { useLoadMore } from "@/utils/loadMore";
|
|
|
|
+import EmptyData from "@/components/empty-data";
|
|
|
|
+import { useModalStore } from "@/store/modalStore";
|
|
|
|
+
|
|
|
|
|
|
export default function Index() {
|
|
export default function Index() {
|
|
const { agent, fetchAgent } = useAgentStore();
|
|
const { agent, fetchAgent } = useAgentStore();
|
|
- const { avatars, initLoad, loadAvatars } = useAvatars();
|
|
|
|
|
|
+ const [list, setList] = useState<(TAvatarItem | TAvatarItem & { deletedTmp: boolean })[]>([]);
|
|
|
|
+ const [scrollTop, setScrollTop] = useState(0);
|
|
|
|
+ const scrollPositionRef = useRef(0);
|
|
|
|
+
|
|
|
|
+ const { showModal } = useModalStore()
|
|
|
|
+
|
|
|
|
+ const fetcher = async ([_url, _nextId, page, pageSize]) => {
|
|
|
|
+ const res = await fetchMyAvatars({ pageIndex: page, pageSize });
|
|
|
|
+ return res.data;
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ const { data, loadMore, refetch } = useLoadMore<TAvatarItem[]>({
|
|
|
|
+ url: 'fetchMyAvatars',
|
|
|
|
+ fetcher,
|
|
|
|
+ });
|
|
|
|
+
|
|
const [current, setCurrent] = useState<TAvatarItem | null>(null);
|
|
const [current, setCurrent] = useState<TAvatarItem | null>(null);
|
|
|
|
|
|
- // 用 useSWRMutation 包装 editAgentAvatar
|
|
|
|
- const { trigger: editAvatar, isMutating } = useSWRMutation(
|
|
|
|
- ["editAgentAvatar"],
|
|
|
|
- async (
|
|
|
|
- _key,
|
|
|
|
- {
|
|
|
|
- arg,
|
|
|
|
- }: {
|
|
|
|
- arg: {
|
|
|
|
- agentId: string;
|
|
|
|
- avatarId: string | number;
|
|
|
|
- enabledChatBg: boolean;
|
|
|
|
- };
|
|
|
|
- }
|
|
|
|
- ) => {
|
|
|
|
- return await editAgentAvatar(
|
|
|
|
- arg.agentId,
|
|
|
|
- arg.avatarId,
|
|
|
|
- arg.enabledChatBg
|
|
|
|
- );
|
|
|
|
- }
|
|
|
|
- );
|
|
|
|
|
|
|
|
const handleClick = async (item: TAvatarItem) => {
|
|
const handleClick = async (item: TAvatarItem) => {
|
|
console.log(item);
|
|
console.log(item);
|
|
if (!agent?.agentId) {
|
|
if (!agent?.agentId) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- // if (item.avatarId === current?.avatarId) {
|
|
|
|
- // setCurrent(null);
|
|
|
|
- // return;
|
|
|
|
- // }
|
|
|
|
|
|
|
|
Taro.showLoading();
|
|
Taro.showLoading();
|
|
- const result = await editAvatar({
|
|
|
|
- agentId: agent.agentId,
|
|
|
|
- avatarId: item.avatarId,
|
|
|
|
- enabledChatBg: false,
|
|
|
|
- });
|
|
|
|
|
|
+ const result = await editAgentAvatar(
|
|
|
|
+ agent.agentId,
|
|
|
|
+ item.avatarId,
|
|
|
|
+ false,
|
|
|
|
+ );
|
|
await fetchAgent(agent.agentId)
|
|
await fetchAgent(agent.agentId)
|
|
Taro.hideLoading();
|
|
Taro.hideLoading();
|
|
setCurrent(item);
|
|
setCurrent(item);
|
|
@@ -70,15 +63,75 @@ export default function Index() {
|
|
}
|
|
}
|
|
};
|
|
};
|
|
const onScrollToLower = () => {
|
|
const onScrollToLower = () => {
|
|
- loadAvatars();
|
|
|
|
|
|
+ loadMore();
|
|
|
|
+ console.log('lower')
|
|
};
|
|
};
|
|
const handleCreate = () => {
|
|
const handleCreate = () => {
|
|
uploadAndNavToGenNewAvatar();
|
|
uploadAndNavToGenNewAvatar();
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+ const handleDelete = async (e:any, avatar: TAvatarItem) => {
|
|
|
|
+ e.stopPropagation()
|
|
|
|
+ showModal({
|
|
|
|
+ content: <>确认删除该形象?</>,
|
|
|
|
+ async onConfirm() {
|
|
|
|
+ const response = await deleteAvatar(avatar.avatarId)
|
|
|
|
+ if(isSuccess(response.status)){
|
|
|
|
+
|
|
|
|
+ // todo: 如何解决闪动问题? 直接操作 DOM 隐藏或删除?
|
|
|
|
+ setList(prevList => {
|
|
|
|
+ return prevList.map(item =>
|
|
|
|
+ item.avatarId === avatar.avatarId ? { ...item, deletedTmp: true } : item
|
|
|
|
+ );
|
|
|
|
+ })
|
|
|
|
+ setTimeout(()=> {
|
|
|
|
+ setScrollTop(scrollPositionRef.current)
|
|
|
|
+ }, 100)
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
- initLoad();
|
|
|
|
- }, []);
|
|
|
|
|
|
+ if (data?.data) {
|
|
|
|
+ setList([...list, ...data.data]);
|
|
|
|
+ }
|
|
|
|
+ }, [data]);
|
|
|
|
+
|
|
|
|
+ const renderList = ()=> {
|
|
|
|
+ if(!list.length){
|
|
|
|
+ return <>
|
|
|
|
+ <EmptyData></EmptyData>
|
|
|
|
+ </>
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return list.map((avatar) => {
|
|
|
|
+ return (
|
|
|
|
+ <View
|
|
|
|
+ className={
|
|
|
|
+ `${current?.avatarUrl === avatar.avatarUrl
|
|
|
|
+ ? style.gridItemActived
|
|
|
|
+ : style.gridItem} ${avatar?.deletedTmp ? style.deleted:''}`
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ onClick={() => handleClick(avatar)}
|
|
|
|
+ >
|
|
|
|
+ <View className={style.deleteButton} onClick={(e)=> handleDelete(e, avatar)}>
|
|
|
|
+ <IconDeleteGray16/>
|
|
|
|
+ </View>
|
|
|
|
+ <Image
|
|
|
|
+ src={avatar.avatarUrl}
|
|
|
|
+ mode="widthFix"
|
|
|
|
+ className="w-full"
|
|
|
|
+ />
|
|
|
|
+ </View>
|
|
|
|
+ );
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
return (
|
|
return (
|
|
<PageCustom>
|
|
<PageCustom>
|
|
@@ -87,6 +140,10 @@ export default function Index() {
|
|
<ScrollView
|
|
<ScrollView
|
|
scrollY
|
|
scrollY
|
|
onScrollToLower={onScrollToLower}
|
|
onScrollToLower={onScrollToLower}
|
|
|
|
+ scrollTop={scrollTop}
|
|
|
|
+ onScroll={(e)=> {
|
|
|
|
+ scrollPositionRef.current = e.detail.scrollTop
|
|
|
|
+ }}
|
|
style={{
|
|
style={{
|
|
flex: 1,
|
|
flex: 1,
|
|
height: "100%", // 高度自适应
|
|
height: "100%", // 高度自适应
|
|
@@ -102,24 +159,7 @@ export default function Index() {
|
|
创建新形象
|
|
创建新形象
|
|
</View>
|
|
</View>
|
|
</View>
|
|
</View>
|
|
- {avatars.map((avatar) => {
|
|
|
|
- return (
|
|
|
|
- <View
|
|
|
|
- className={
|
|
|
|
- current?.avatarId === avatar.avatarId
|
|
|
|
- ? style.gridItemActived
|
|
|
|
- : style.gridItem
|
|
|
|
- }
|
|
|
|
- onClick={() => handleClick(avatar)}
|
|
|
|
- >
|
|
|
|
- <Image
|
|
|
|
- src={avatar.avatarUrl}
|
|
|
|
- mode="widthFix"
|
|
|
|
- className="w-full"
|
|
|
|
- />
|
|
|
|
- </View>
|
|
|
|
- );
|
|
|
|
- })}
|
|
|
|
|
|
+ {renderList()}
|
|
</View>
|
|
</View>
|
|
</View>
|
|
</View>
|
|
</ScrollView>
|
|
</ScrollView>
|