diff --git a/src/components/_shared/breadcrumb/Breadcrumb.tsx b/src/components/_shared/breadcrumb/Breadcrumb.tsx index 07b812b8..fa040911 100644 --- a/src/components/_shared/breadcrumb/Breadcrumb.tsx +++ b/src/components/_shared/breadcrumb/Breadcrumb.tsx @@ -1,18 +1,11 @@ import { IconButton } from '@mui/material'; -import { memo, useEffect, useMemo, useState } from 'react'; -import { useTranslation } from 'react-i18next'; +import { memo, useMemo, useState } from 'react'; import { UIVariant, View } from '@/application/types'; import { ReactComponent as RightIcon } from '@/assets/icons/alt_arrow_right.svg'; import { ReactComponent as MoreIcon } from '@/assets/icons/more.svg'; -import { ReactComponent as PrivateSpaceIcon } from '@/assets/icons/private-space.svg'; -import { ReactComponent as ShareIcon } from '@/assets/icons/share-to.svg'; -import { ReactComponent as TeamIcon } from '@/assets/icons/team.svg'; import BreadcrumbItem from '@/components/_shared/breadcrumb/BreadcrumbItem'; import BreadcrumbMoreModal from '@/components/_shared/breadcrumb/BreadcrumbMoreModal'; -import { useCurrentWorkspaceId } from '@/components/app/app.hooks'; -import { useCurrentUser, useService } from '@/components/main/app.hooks'; -import { Progress } from '@/components/ui/progress'; import { getPlatform } from '@/utils/platform'; export interface BreadcrumbProps { @@ -78,78 +71,30 @@ export function Breadcrumb({ crumbs, toView, variant }: BreadcrumbProps) { return (
- + {!isLast && }
); }); }, [crumbs, toView, variant]); - const service = useService(); - const currentWorkspaceId = useCurrentWorkspaceId(); - const currentUser = useCurrentUser(); - const { t } = useTranslation(); - const [isShared, setIsShared] = useState(false); - const [loading, setLoading] = useState(false); - - const isPrivate = crumbs.some((crumb) => crumb.is_private); - - useEffect(() => { - if (!service || !currentWorkspaceId || !currentUser) return; - const loadShareDetail = async () => { - const viewId = crumbs[crumbs.length - 1].view_id; - const ancestorViewIds = crumbs.map((crumb) => crumb.view_id); - - try { - setLoading(true); - const res = await service.getShareDetail(currentWorkspaceId, viewId, ancestorViewIds); - const shared = res.shared_with.some((item) => item.email !== currentUser.email); - - setIsShared(shared); - } catch (error) { - setIsShared(false); - } finally { - setLoading(false); - } - }; - - void loadShareDetail(); - }, [service, currentWorkspaceId, currentUser, crumbs]); - return (
{renderCrumb} - setOpenMore(false)} crumbs={crumbs} toView={toView} /> - {variant === UIVariant.App && !isPrivate && ( -
- - {t('teamSpace')} -
- )} - {variant === UIVariant.App && isPrivate && ( -
- {loading && } - {isShared ? ( - <> - - {t('share')} - - ) : ( - <> - - {t('private')} - - )} -
- )} + setOpenMore(false)} + crumbs={crumbs} + toView={toView} + variant={variant} + />
); } diff --git a/src/components/_shared/breadcrumb/BreadcrumbMoreModal.tsx b/src/components/_shared/breadcrumb/BreadcrumbMoreModal.tsx index 8c6eb955..94aae4f1 100644 --- a/src/components/_shared/breadcrumb/BreadcrumbMoreModal.tsx +++ b/src/components/_shared/breadcrumb/BreadcrumbMoreModal.tsx @@ -1,4 +1,4 @@ -import { View } from '@/application/types'; +import { UIVariant, View } from '@/application/types'; import BreadcrumbItem from '@/components/_shared/breadcrumb/BreadcrumbItem'; import { NormalModal } from '@/components/_shared/modal'; import { useMemo } from 'react'; @@ -9,11 +9,13 @@ function BreadcrumbMoreModal({ onClose, crumbs, toView, + variant, }: { open: boolean; onClose: () => void; crumbs: View[]; toView?: (viewId: string) => Promise; + variant?: UIVariant; }) { const { t } = useTranslation(); const title = useMemo(() => { @@ -52,7 +54,7 @@ function BreadcrumbMoreModal({ }} > {index !== 0 &&
{'-'}
} - + ))} diff --git a/src/components/_shared/breadcrumb/withAppBreadcrumb.tsx b/src/components/_shared/breadcrumb/withAppBreadcrumb.tsx index 43f4ed13..4904a777 100644 --- a/src/components/_shared/breadcrumb/withAppBreadcrumb.tsx +++ b/src/components/_shared/breadcrumb/withAppBreadcrumb.tsx @@ -1,26 +1,87 @@ import { UIVariant } from '@/application/types'; import { BreadcrumbProps } from '@/components/_shared/breadcrumb/Breadcrumb'; import BreadcrumbSkeleton from '@/components/_shared/skeleton/BreadcrumbSkeleton'; -import { useAppHandlers, useBreadcrumb } from '@/components/app/app.hooks'; -import React from 'react'; +import { useAppHandlers, useBreadcrumb, useCurrentWorkspaceId } from '@/components/app/app.hooks'; +import { useCurrentUser, useService } from '@/components/main/app.hooks'; +import { Progress } from '@/components/ui/progress'; +import { ReactComponent as PrivateSpaceIcon } from '@/assets/icons/private-space.svg'; +import { ReactComponent as ShareIcon } from '@/assets/icons/share-to.svg'; +import { ReactComponent as TeamIcon } from '@/assets/icons/team.svg'; +import React, { useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; export function withAppBreadcrumb (Component: React.ComponentType) { - return function PublishBreadcrumbComponent () { + return function AppBreadcrumbComponent () { const isTrash = window.location.pathname === '/app/trash'; - const crumbs = useBreadcrumb(); const toView = useAppHandlers().toView; + const service = useService(); + const currentWorkspaceId = useCurrentWorkspaceId(); + const currentUser = useCurrentUser(); + const { t } = useTranslation(); + const [isShared, setIsShared] = useState(false); + const [loading, setLoading] = useState(false); + + const isPrivate = crumbs?.some((crumb) => crumb.is_private); + + useEffect(() => { + if (!service || !currentWorkspaceId || !currentUser || !crumbs || isTrash) return; + const loadShareDetail = async () => { + const viewId = crumbs[crumbs.length - 1].view_id; + const ancestorViewIds = crumbs.map((crumb) => crumb.view_id); + + try { + setLoading(true); + const res = await service.getShareDetail(currentWorkspaceId, viewId, ancestorViewIds); + const shared = res.shared_with.some((item) => item.email !== currentUser.email); + + setIsShared(shared); + } catch (error) { + setIsShared(false); + } finally { + setLoading(false); + } + }; + + void loadShareDetail(); + }, [service, currentWorkspaceId, currentUser, crumbs, isTrash]); return (
{!crumbs ? : - !isTrash && + !isTrash && ( +
+ + {!isPrivate && ( +
+ + {t('teamSpace')} +
+ )} + {isPrivate && ( +
+ {loading && } + {isShared ? ( + <> + + {t('share')} + + ) : ( + <> + + {t('private')} + + )} +
+ )} +
+ ) }
); }; -} \ No newline at end of file +} diff --git a/src/components/_shared/breadcrumb/withPublishBreadcrumb.tsx b/src/components/_shared/breadcrumb/withPublishBreadcrumb.tsx index dc2ec5d6..5de1a21e 100644 --- a/src/components/_shared/breadcrumb/withPublishBreadcrumb.tsx +++ b/src/components/_shared/breadcrumb/withPublishBreadcrumb.tsx @@ -21,4 +21,4 @@ export function withPublishBreadcrumb (Component: React.ComponentType ); }; -} \ No newline at end of file +}