import type { IUser, IDocument } from '@think/domains'; import useSWR from 'swr'; import { useState, useCallback, useEffect } from 'react'; import { useAsyncLoading } from 'hooks/useAsyncLoading'; import { HttpClient } from 'services/HttpClient'; import { getPublicDocumentDetail } from 'services/document'; interface IAuthority { id: string; documentId: string; userId: string; readable: boolean; editable: boolean; } type ICreateDocument = Partial>; type IDocumentWithAuth = { document: IDocument; authority: IAuthority }; type IUpdateDocument = Partial>; /** * 创建文档 * @returns */ export const useCreateDocument = () => { const [create, loading] = useAsyncLoading((data: ICreateDocument): Promise => { return HttpClient.post('/document/create', data); }); return { create, loading }; }; /** * 更新文档阅读量 * @param id * @returns */ export const updateDocumentViews = (id: string) => { return HttpClient.get('/document/views/' + id); }; /** * 删除文档 * @param id * @returns */ export const useDeleteDocument = (id) => { const [deleteDocument, loading] = useAsyncLoading((): Promise => { return HttpClient.delete('/document/delete/' + id); }); return { deleteDocument, loading }; }; /** * 获取文档详情 * @param documentId * @returns */ export const useDocumentDetail = (documentId, options = null) => { const { data, error, mutate } = useSWR( `/document/detail/${documentId}`, (url) => HttpClient.get(url), options ); const loading = !data && !error; const update = async (data: IUpdateDocument) => { const res = await HttpClient.post('/document/update/' + documentId, data); mutate(); return res; }; const toggleStatus = async (data: Partial>) => { const ret = await HttpClient.post('/document/share/' + documentId, data); mutate(); return ret; }; return { data, loading, error, update, toggleStatus }; }; /** * 获取知识库最近更新的10条文档 * @returns */ export const useRecentDocuments = () => { const { data, error, mutate } = useSWR('/document/recent', (url) => HttpClient.get(url)); const loading = !data && !error; return { data, error, loading, refresh: mutate }; }; /** * 收藏文档 * @param documentId * @returns */ export const useDocumentStar = (documentId) => { const { data, error, mutate } = useSWR(`/collector/check/${documentId}`, () => HttpClient.post(`/collector/check`, { type: 'document', targetId: documentId, }) ); const toggleStar = async () => { await HttpClient.post('/collector/toggle/', { type: 'document', targetId: documentId, }); mutate(); }; return { data, error, toggleStar }; }; /** * 获取用户收藏的文档 * @returns */ export const useStaredDocuments = () => { const { data, error, mutate } = useSWR('/collector/documents', (url) => HttpClient.post(url)); const loading = !data && !error; return { data, error, loading, refresh: mutate }; }; /** * 获取公开文档 * @param documentId * @returns */ export const usePublicDocument = (documentId: string) => { const [fetch] = useAsyncLoading(getPublicDocumentDetail); const [document, setDocument] = useState(null); const [error, setError] = useState<(Error & { statusCode?: number }) | null>(null); const loading = !document && !error; const queryData = useCallback( (sharePassword = '') => { fetch(documentId, { sharePassword }) .then((doc) => { setDocument(doc); setError(null); }) .catch(setError); }, [documentId, error] ); useEffect(() => { queryData(); }, [documentId]); return { data: document, loading, error, query: queryData, }; }; /** * 协作文档 * @param documentId * @returns */ export const useCollaborationDocument = (documentId) => { const { data, error, mutate } = useSWR>( `/document/user/${documentId}`, (url) => HttpClient.get(url), { shouldRetryOnError: false } ); const loading = !data && !error; const addUser = async (userName) => { const ret = await HttpClient.post(`/document/user/${documentId}/add`, { documentId, userName, readable: true, editable: false, }); mutate(); return ret; }; const updateUser = async (docAuth) => { const ret = await HttpClient.post(`/document/user/${documentId}/update`, { documentId, ...docAuth, }); mutate(); return ret; }; const deleteUser = async (docAuth) => { const ret = await HttpClient.post(`/document/user/${documentId}/delete`, { documentId, ...docAuth, }); mutate(); return ret; }; return { users: data, loading, error, addUser, updateUser, deleteUser }; }; /** * 获取子文档 * @param documentId * @param isShare 访问路径 * @returns */ export const useChildrenDocument = ({ wikiId, documentId, isShare = false }) => { const { data, error, mutate } = useSWR>( isShare ? '/document/public/children' : `/document/children`, wikiId || documentId ? (url) => HttpClient.post(url, { wikiId, documentId, isShare }) : null, { shouldRetryOnError: false } ); const loading = !data && !error; return { data, loading, error, refresh: mutate }; };