|
@@ -1,9 +1,10 @@
|
|
|
-import { ScrollView, View, Image } from "@tarojs/components";
|
|
|
+import { ScrollView, View, Image, Text } from "@tarojs/components";
|
|
|
|
|
|
-import FigureList from "@/components/list/FigureList";
|
|
|
+import IconError from '@/images/svgs/knowledge/IconError.svg'
|
|
|
+import IconCorrect from '@/images/svgs/knowledge/IconCorrect.svg'
|
|
|
import FigureListItem from "@/components/list/FigureListItem";
|
|
|
import { useDidShow } from "@tarojs/taro";
|
|
|
-import { useEffect } from "react";
|
|
|
+import { useEffect, useState } from "react";
|
|
|
|
|
|
import RotateLoading from "@/components/rotate-loading";
|
|
|
import Taro from "@tarojs/taro";
|
|
@@ -15,10 +16,9 @@ import EmptyData from "@/components/empty-data";
|
|
|
import type { TKnowledgeItem } from "@/types/knowledge";
|
|
|
|
|
|
import { deleteMyKnowledge, getKnowledgeList } from "@/service/knowledge";
|
|
|
-import { useContext } from "react";
|
|
|
+
|
|
|
import { useLoadMoreInfinite, createKey } from "@/utils/loadMoreInfinite";
|
|
|
import { isSuccess } from "@/utils";
|
|
|
-import LoginMutationContext from "@/pages/knowledge/LoginMutationContext";
|
|
|
|
|
|
export interface IProps {
|
|
|
types?: EKnowlegeTypes[];
|
|
@@ -26,34 +26,22 @@ export interface IProps {
|
|
|
}
|
|
|
|
|
|
const Index = ({ types, setTotalCount }: IProps) => {
|
|
|
- const { isMutate, setLoginShow } = useContext(LoginMutationContext)
|
|
|
-
|
|
|
const fetcher = async ([_url, { nextId, pageSize }, [types]]) => {
|
|
|
const res = await getKnowledgeList({ startId: nextId, pageSize, types });
|
|
|
return res.data;
|
|
|
};
|
|
|
- const { list, loadMore, mutate, data, pageIndex, error } = useLoadMoreInfinite<
|
|
|
+ const { list, loadMore, mutate, data, pageIndex } = useLoadMoreInfinite<
|
|
|
TKnowledgeItem[]
|
|
|
- >(createKey("getKnowledgeList", 20, [types]), fetcher);
|
|
|
+ >(createKey("getKnowledgeList", 30, [types]), fetcher);
|
|
|
|
|
|
const onScrollToLower = async () => {
|
|
|
loadMore();
|
|
|
};
|
|
|
|
|
|
useDidShow(() => {
|
|
|
- mutate();
|
|
|
+ mutate(undefined, { revalidate: true });
|
|
|
});
|
|
|
|
|
|
- useEffect(()=> {
|
|
|
- mutate();
|
|
|
- }, [isMutate])
|
|
|
- useEffect(()=> {
|
|
|
- if(error?.code === 401){
|
|
|
- setLoginShow(true)
|
|
|
- }
|
|
|
-
|
|
|
- }, [error])
|
|
|
-
|
|
|
useEffect(() => {
|
|
|
if (data && pageIndex === 1) {
|
|
|
setTotalCount(data?.[0].totalCount || 0);
|
|
@@ -69,7 +57,7 @@ const Index = ({ types, setTotalCount }: IProps) => {
|
|
|
});
|
|
|
};
|
|
|
|
|
|
- const handleLongPress = async (id: string | number) => {
|
|
|
+ const handleDelete = async (id: string | number) => {
|
|
|
Taro.showModal({
|
|
|
content: "确认删除该知识?",
|
|
|
async success(result) {
|
|
@@ -87,19 +75,59 @@ const Index = ({ types, setTotalCount }: IProps) => {
|
|
|
});
|
|
|
};
|
|
|
|
|
|
- const rightRenderer = (item: TKnowledgeItem) => {
|
|
|
- if (!item.isParsing) {
|
|
|
- return <></>;
|
|
|
+ const handleHello = async (e: any) => {
|
|
|
+ const detail = e.detail as { type: string; id: string };
|
|
|
+ console.log(detail);
|
|
|
+ // 置顶与取消置顶
|
|
|
+ if (detail.type === "delete") {
|
|
|
+ handleDelete(detail.id);
|
|
|
}
|
|
|
+ };
|
|
|
|
|
|
+ const rightRenderer = (item: TKnowledgeItem) => {
|
|
|
+ if (item.isParsing) {
|
|
|
+ return (
|
|
|
+ <View className="flex items-center gap-4 self-center">
|
|
|
+ <RotateLoading />
|
|
|
+ <View className="text-primary text-12">解析中</View>
|
|
|
+ </View>
|
|
|
+ );
|
|
|
+ }
|
|
|
+ if(item.parseStatus === 'parsed'){
|
|
|
+ return (
|
|
|
+ <View className="flex items-center self-center">
|
|
|
+ <Image src={IconCorrect} className="w-20 h-20" />
|
|
|
+ </View>
|
|
|
+ );
|
|
|
+ }
|
|
|
return (
|
|
|
- <View className="flex items-center gap-4">
|
|
|
- <RotateLoading />
|
|
|
- <View className="text-primary text-12">解析中</View>
|
|
|
+ <View className="flex items-center self-center">
|
|
|
+ <Image src={IconError} className="w-20 h-20" />
|
|
|
</View>
|
|
|
);
|
|
|
};
|
|
|
|
|
|
+ const renderSummary = (item: TKnowledgeItem) => {
|
|
|
+ const createTime = item.createTime.slice(5, 16);
|
|
|
+ if (item.enableExactAnswer) {
|
|
|
+ return (
|
|
|
+ <View className="flex gap-8 items-center">
|
|
|
+ <View>{createTime}</View>
|
|
|
+ <View>|</View>
|
|
|
+ <View className="">
|
|
|
+ 已开启 <Text className="text-primary">{item.answerCnt}</Text>{" "}
|
|
|
+ 条精准问答
|
|
|
+ </View>
|
|
|
+ </View>
|
|
|
+ );
|
|
|
+ }
|
|
|
+ return (
|
|
|
+ <>
|
|
|
+ {createTime} | {item.fileSizeStr}
|
|
|
+ </>
|
|
|
+ );
|
|
|
+ };
|
|
|
+
|
|
|
return (
|
|
|
<ScrollView
|
|
|
scrollY
|
|
@@ -109,37 +137,39 @@ const Index = ({ types, setTotalCount }: IProps) => {
|
|
|
height: "100%", // 高度自适应
|
|
|
}}
|
|
|
>
|
|
|
- <View className="px-16">
|
|
|
- {list.length <= 0 ? (
|
|
|
- <View className="pt-46">
|
|
|
- <EmptyData type={"plane"} />
|
|
|
- </View>
|
|
|
- ) : (
|
|
|
- <></>
|
|
|
- )}
|
|
|
- <FigureList>
|
|
|
- {list.map((item) => {
|
|
|
- return (
|
|
|
- <FigureListItem
|
|
|
- figure={() => <KnowledgeIcon data={item} />}
|
|
|
- underline
|
|
|
- arrow={item.parseStatus === "parsed"}
|
|
|
- onClick={() => handleEdit(item)}
|
|
|
- rightRenderer={() => rightRenderer(item)}
|
|
|
- >
|
|
|
- <View
|
|
|
- className="flex flex-col flex-1 gap-2 w-full"
|
|
|
- onLongPress={() => handleLongPress(item.knowledgeId)}
|
|
|
+ {list.length <= 0 ? (
|
|
|
+ <View className="pt-46">
|
|
|
+ <EmptyData type={"plane"} />
|
|
|
+ </View>
|
|
|
+ ) : (
|
|
|
+ <></>
|
|
|
+ )}
|
|
|
+ {/* <slide-delete> 如果被嵌套太深,会无法正常执行原生小程序逻辑 */}
|
|
|
+ <View className="flex flex-col gap-8 mx-16">
|
|
|
+ {list.map((item) => {
|
|
|
+ // @ts-ignore
|
|
|
+ return (
|
|
|
+ <View className="rounded-12 overflow-hidden">
|
|
|
+ <slide-delete pid={item.knowledgeId} onAction={handleHello}>
|
|
|
+ <FigureListItem
|
|
|
+ className="bg-white p-16"
|
|
|
+ figure={() => <KnowledgeIcon data={item} />}
|
|
|
+ onClick={() => handleEdit(item)}
|
|
|
+ rightRenderer={() => rightRenderer(item)}
|
|
|
>
|
|
|
- <View className="text-14 leading-22">{item.title}</View>
|
|
|
- <View className="text-12 leading-20 text-gray-45">
|
|
|
- {item.createTime} | {item.fileSize}
|
|
|
+ <View className="flex flex-col flex-1 gap-2 w-full truncate">
|
|
|
+ <View className="text-14 leading-22 truncate">
|
|
|
+ {item.title}
|
|
|
+ </View>
|
|
|
+ <View className="text-12 leading-20 text-gray-45 flex items-center">
|
|
|
+ {renderSummary(item)}
|
|
|
+ </View>
|
|
|
</View>
|
|
|
- </View>
|
|
|
- </FigureListItem>
|
|
|
- );
|
|
|
- })}
|
|
|
- </FigureList>
|
|
|
+ </FigureListItem>
|
|
|
+ </slide-delete>
|
|
|
+ </View>
|
|
|
+ );
|
|
|
+ })}
|
|
|
</View>
|
|
|
</ScrollView>
|
|
|
);
|