🚚(frontend) reduce features coupling

Move some components and assets to `doc-management`
to reduce coupling between features:
- SimpleDocItem from `doc-grid` to `doc-management`
- useCreateChildDoc from `doc-tree` to `doc-management`
- isOwnerOrAdmin from `doc-tree` to `doc-management`
This commit is contained in:
Anthony LC
2025-04-23 17:18:57 +02:00
parent 30dfea744a
commit f12d30cffa
13 changed files with 23 additions and 24 deletions

View File

@@ -1,3 +1,4 @@
export * from './useCreateChildDoc';
export * from './useCreateDoc'; export * from './useCreateDoc';
export * from './useCreateFavoriteDoc'; export * from './useCreateFavoriteDoc';
export * from './useDeleteFavoriteDoc'; export * from './useDeleteFavoriteDoc';

View File

@@ -2,16 +2,16 @@ import { useMutation, useQueryClient } from '@tanstack/react-query';
import { APIError, errorCauses, fetchAPI } from '@/api'; import { APIError, errorCauses, fetchAPI } from '@/api';
import { Doc, KEY_LIST_DOC } from '../../doc-management'; import { Doc, KEY_LIST_DOC } from '..';
export type CreateDocParam = Pick<Doc, 'title'> & { export type CreateChildDocParam = Pick<Doc, 'title'> & {
parentId: string; parentId: string;
}; };
export const createDocChildren = async ({ export const createChildDoc = async ({
title, title,
parentId, parentId,
}: CreateDocParam): Promise<Doc> => { }: CreateChildDocParam): Promise<Doc> => {
const response = await fetchAPI(`documents/${parentId}/children/`, { const response = await fetchAPI(`documents/${parentId}/children/`, {
method: 'POST', method: 'POST',
body: JSON.stringify({ body: JSON.stringify({
@@ -26,19 +26,19 @@ export const createDocChildren = async ({
return response.json() as Promise<Doc>; return response.json() as Promise<Doc>;
}; };
interface CreateDocProps { interface UseCreateChildDocProps {
onSuccess: (data: Doc) => void; onSuccess: (doc: Doc) => void;
} }
export function useCreateChildrenDoc({ onSuccess }: CreateDocProps) { export function useCreateChildDoc({ onSuccess }: UseCreateChildDocProps) {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
return useMutation<Doc, APIError, CreateDocParam>({ return useMutation<Doc, APIError, CreateChildDocParam>({
mutationFn: createDocChildren, mutationFn: createChildDoc,
onSuccess: (data) => { onSuccess: (doc) => {
void queryClient.resetQueries({ void queryClient.resetQueries({
queryKey: [KEY_LIST_DOC], queryKey: [KEY_LIST_DOC],
}); });
onSuccess(data); onSuccess(doc);
}, },
}); });
} }

View File

@@ -1 +1,2 @@
export * from './ModalRemoveDoc'; export * from './ModalRemoveDoc';
export * from './SimpleDocItem';

View File

@@ -1,7 +1,6 @@
import { Box, Icon } from '@/components'; import { Box, Icon } from '@/components';
import { QuickSearchItemContent } from '@/components/quick-search/'; import { QuickSearchItemContent } from '@/components/quick-search/';
import { Doc } from '@/docs/doc-management'; import { Doc, SimpleDocItem } from '@/docs/doc-management';
import { SimpleDocItem } from '@/docs/docs-grid/';
import { useResponsiveStore } from '@/stores'; import { useResponsiveStore } from '@/stores';
type DocSearchItemProps = { type DocSearchItemProps = {

View File

@@ -1,4 +1,3 @@
export * from './useCreateChildren';
export * from './useDocChildren'; export * from './useDocChildren';
export * from './useDocTree'; export * from './useDocTree';
export * from './useMove'; export * from './useMove';

View File

@@ -11,8 +11,7 @@ import { css } from 'styled-components';
import { Box, StyledLink } from '@/components'; import { Box, StyledLink } from '@/components';
import { useCunninghamTheme } from '@/cunningham'; import { useCunninghamTheme } from '@/cunningham';
import { Doc } from '@/docs/doc-management'; import { Doc, SimpleDocItem } from '@/docs/doc-management';
import { SimpleDocItem } from '@/docs/docs-grid';
import { KEY_DOC_TREE, useDocTree } from '../api/useDocTree'; import { KEY_DOC_TREE, useDocTree } from '../api/useDocTree';
import { useMoveDoc } from '../api/useMove'; import { useMoveDoc } from '../api/useMove';

View File

@@ -14,10 +14,10 @@ import {
ModalRemoveDoc, ModalRemoveDoc,
Role, Role,
useCopyDocLink, useCopyDocLink,
useCreateChildDoc,
useDuplicateDoc, useDuplicateDoc,
} from '@/docs/doc-management'; } from '@/docs/doc-management';
import { useCreateChildrenDoc } from '../api/useCreateChildren';
import { useDetachDoc } from '../api/useDetach'; import { useDetachDoc } from '../api/useDetach';
import MoveDocIcon from '../assets/doc-extract-bold.svg'; import MoveDocIcon from '../assets/doc-extract-bold.svg';
@@ -118,7 +118,7 @@ export const DocTreeItemActions = ({
}, },
]; ];
const { mutate: createChildrenDoc } = useCreateChildrenDoc({ const { mutate: createChildDoc } = useCreateChildDoc({
onSuccess: (newDoc) => { onSuccess: (newDoc) => {
onCreateSuccess?.(newDoc); onCreateSuccess?.(newDoc);
void router.push(`/docs/${newDoc.id}`); void router.push(`/docs/${newDoc.id}`);
@@ -174,7 +174,7 @@ export const DocTreeItemActions = ({
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
createChildrenDoc({ createChildDoc({
parentId: doc.id, parentId: doc.id,
}); });
}} }}

View File

@@ -5,7 +5,7 @@ import { css } from 'styled-components';
import { Box, Icon, StyledLink, Text } from '@/components'; import { Box, Icon, StyledLink, Text } from '@/components';
import { useCunninghamTheme } from '@/cunningham'; import { useCunninghamTheme } from '@/cunningham';
import { Doc, LinkReach } from '@/docs/doc-management'; import { Doc, LinkReach, SimpleDocItem } from '@/docs/doc-management';
import { DocShareModal } from '@/docs/doc-share'; import { DocShareModal } from '@/docs/doc-share';
import { useResponsiveStore } from '@/stores'; import { useResponsiveStore } from '@/stores';
@@ -13,11 +13,12 @@ import { useResponsiveDocGrid } from '../hooks/useResponsiveDocGrid';
import { DocsGridActions } from './DocsGridActions'; import { DocsGridActions } from './DocsGridActions';
import { DocsGridItemSharedButton } from './DocsGridItemSharedButton'; import { DocsGridItemSharedButton } from './DocsGridItemSharedButton';
import { SimpleDocItem } from './SimpleDocItem';
type DocsGridItemProps = { type DocsGridItemProps = {
doc: Doc; doc: Doc;
dragMode?: boolean; dragMode?: boolean;
}; };
export const DocsGridItem = ({ doc, dragMode = false }: DocsGridItemProps) => { export const DocsGridItem = ({ doc, dragMode = false }: DocsGridItemProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { isDesktop } = useResponsiveStore(); const { isDesktop } = useResponsiveStore();

View File

@@ -1,4 +1,3 @@
export * from './DocsGrid'; export * from './DocsGrid';
export * from './DocsGridActions'; export * from './DocsGridActions';
export * from './SimpleDocItem';
export * from './DocsGridLoader'; export * from './DocsGridLoader';

View File

@@ -3,9 +3,9 @@ import { css } from 'styled-components';
import { Box, StyledLink } from '@/components'; import { Box, StyledLink } from '@/components';
import { useCunninghamTheme } from '@/cunningham'; import { useCunninghamTheme } from '@/cunningham';
import { Doc } from '@/docs/doc-management'; import { Doc, SimpleDocItem } from '@/docs/doc-management';
import { DocShareModal } from '@/docs/doc-share'; import { DocShareModal } from '@/docs/doc-share';
import { DocsGridActions, SimpleDocItem } from '@/docs/docs-grid'; import { DocsGridActions } from '@/docs/docs-grid';
import { useResponsiveStore } from '@/stores'; import { useResponsiveStore } from '@/stores';
type LeftPanelFavoriteItemProps = { type LeftPanelFavoriteItemProps = {