From 74e5eff0f77192b75845d820b1eaf60b36d6d0b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rge=20N=C3=A6ss?= Date: Fri, 25 Oct 2024 17:36:31 +0200 Subject: [PATCH] refactor(releases): don't track deleted releases Releases can't be deleted, only archived --- .../core/releases/components/ReleasesMenu.tsx | 22 +------ .../__tests__/ReleasesMenu.test.tsx | 62 +++---------------- .../__tests__/ReleaseDetailsDialog.test.tsx | 4 +- .../dialog/__tests__/ReleaseForm.test.tsx | 4 +- .../__tests__/useDocumentVersions.test.tsx | 1 - .../releases/navbar/GlobalPerspectiveMenu.tsx | 31 +++------- .../ReleaseMenuButton/ReleaseMenuButton.tsx | 3 +- .../tool/detail/ReleaseDashboardFooter.tsx | 7 +-- .../releases/tool/detail/ReleaseDetail.tsx | 45 ++++---------- .../detail/__tests__/ReleaseDetail.test.tsx | 28 +++------ .../tool/overview/ReleasesOverview.tsx | 13 +--- .../__tests__/ReleasesOverview.test.tsx | 15 +---- .../core/store/release/createReleaseStore.ts | 1 - .../sanity/src/core/store/release/reducer.ts | 25 -------- .../src/core/store/release/useReleases.ts | 8 +-- .../document-layout/useBundleDeletedToast.tsx | 13 ++-- .../banners/DeletedDocumentBanners.tsx | 38 +++--------- .../__tests__/DeletedDocumentBanners.test.tsx | 12 ++-- .../__tests__/DocumentHeaderTitle.test.tsx | 2 +- 19 files changed, 74 insertions(+), 260 deletions(-) diff --git a/packages/sanity/src/core/releases/components/ReleasesMenu.tsx b/packages/sanity/src/core/releases/components/ReleasesMenu.tsx index 400ed6a6b62..5a5eec4ab37 100644 --- a/packages/sanity/src/core/releases/components/ReleasesMenu.tsx +++ b/packages/sanity/src/core/releases/components/ReleasesMenu.tsx @@ -7,10 +7,8 @@ import {styled} from 'styled-components' import {MenuButton, Tooltip} from '../../../ui-components' import {useTranslation} from '../../i18n' import {type ReleaseDocument} from '../../store/release/types' -import {useReleases} from '../../store/release/useReleases' import {usePerspective} from '../hooks' import {LATEST} from '../util/const' -import {isDraftOrPublished} from '../util/util' import {ReleaseBadge} from './ReleaseBadge' const StyledMenu = styled(Menu)` @@ -35,17 +33,14 @@ interface BundleListProps { */ export const ReleasesMenu = memo(function ReleasesMenu(props: BundleListProps): ReactElement { const {releases, loading, actions, button, perspective} = props - const {deletedReleases} = useReleases() const {currentGlobalBundle, setPerspectiveFromRelease} = usePerspective(perspective) const {t} = useTranslation() const sortedBundlesToDisplay = useMemo(() => { if (!releases) return [] - return releases - .filter(({_id, state}) => !isDraftOrPublished(_id) && state !== 'archived') - .sort(({_id: aId}, {_id: bId}) => Number(deletedReleases[aId]) - Number(deletedReleases[bId])) - }, [releases, deletedReleases]) + return releases.filter(({state}) => state !== 'archived') + }, [releases]) const hasBundles = sortedBundlesToDisplay.length > 0 const handleReleaseChange = useCallback( @@ -55,11 +50,6 @@ export const ReleasesMenu = memo(function ReleasesMenu(props: BundleListProps): [setPerspectiveFromRelease], ) - const isBundleDeleted = useCallback( - (releaseId: string) => Boolean(deletedReleases[releaseId]), - [deletedReleases], - ) - return ( <> - + diff --git a/packages/sanity/src/core/releases/components/__tests__/ReleasesMenu.test.tsx b/packages/sanity/src/core/releases/components/__tests__/ReleasesMenu.test.tsx index c5a77617051..7dd1bac1ac0 100644 --- a/packages/sanity/src/core/releases/components/__tests__/ReleasesMenu.test.tsx +++ b/packages/sanity/src/core/releases/components/__tests__/ReleasesMenu.test.tsx @@ -23,7 +23,7 @@ vi.mock('../../util/util', () => ({ })) vi.mock('../../../store/release/useReleases', () => ({ - useReleases: vi.fn().mockReturnValue({deletedReleases: {}}), + useReleases: vi.fn().mockReturnValue({}), })) const mockUseReleases = useReleases as Mock @@ -234,20 +234,20 @@ describe('ReleasesMenu', () => { }) }) - it('should not show deleted releases when not included in the list', async () => { + it('should not show archived releases when not included in the list', async () => { mockUseReleases.mockReturnValue({ dispatch: vi.fn(), loading: false, - data: [], - deletedReleases: { - 'mock-deleted-release': { + data: [ + { _id: 'mock-deleted-release', _type: 'system-tmp.release', + state: 'archived', metadata: { - title: 'Mock Deleted Bundle', + title: 'Mock Archived Bundle', }, } as ReleaseDocument, - }, + ], }) const wrapper = await createTestProvider() render(, { @@ -257,53 +257,7 @@ describe('ReleasesMenu', () => { fireEvent.click(screen.getByRole('button', {name: 'Button Test'})) expect( - within(screen.getByTestId('releases-list')).queryByText('Mock Deleted Bundle'), + within(screen.getByTestId('releases-list')).queryByText('Mock Archived Bundle'), ).not.toBeInTheDocument() }) - - it('should show deleted releases that are included in the list', async () => { - mockUseReleases.mockReturnValue({ - dispatch: vi.fn(), - loading: false, - data: [], - deletedReleases: { - 'mock-deleted-release': { - _id: 'mock-deleted-release', - _type: 'system-tmp.release', - metadata: { - title: 'Mock Deleted Bundle', - }, - } as ReleaseDocument, - }, - }) - const wrapper = await createTestProvider() - render( - , - { - wrapper, - }, - ) - - fireEvent.click(screen.getByRole('button', {name: 'Button Test'})) - - const allMenuBundles = within(screen.getByTestId('releases-list')).getAllByRole('menuitem') - // deleted should be at the end of the release list - const [deletedBundle] = allMenuBundles.reverse() - - within(deletedBundle).getByText('Mock Deleted Bundle') - expect(deletedBundle).toBeDisabled() - }) }) diff --git a/packages/sanity/src/core/releases/components/dialog/__tests__/ReleaseDetailsDialog.test.tsx b/packages/sanity/src/core/releases/components/dialog/__tests__/ReleaseDetailsDialog.test.tsx index dd4887c9939..7fca606df3a 100644 --- a/packages/sanity/src/core/releases/components/dialog/__tests__/ReleaseDetailsDialog.test.tsx +++ b/packages/sanity/src/core/releases/components/dialog/__tests__/ReleaseDetailsDialog.test.tsx @@ -52,7 +52,7 @@ describe('ReleaseDetailsDialog', () => { loading: true, dispatch: vi.fn(), error: undefined, - deletedReleases: {}, + stack: [], }) //mockUseDateTimeFormat.mockReturnValue({format: vi.fn().mockReturnValue('Mocked date')}) @@ -133,7 +133,7 @@ describe('ReleaseDetailsDialog', () => { loading: true, dispatch: vi.fn(), error: undefined, - deletedReleases: {}, + stack: [], }) //mockUseDateTimeFormat.mockReturnValue({format: vi.fn().mockReturnValue('Mocked date')}) diff --git a/packages/sanity/src/core/releases/components/dialog/__tests__/ReleaseForm.test.tsx b/packages/sanity/src/core/releases/components/dialog/__tests__/ReleaseForm.test.tsx index da4ec6bfa8d..d06cf2bd2ec 100644 --- a/packages/sanity/src/core/releases/components/dialog/__tests__/ReleaseForm.test.tsx +++ b/packages/sanity/src/core/releases/components/dialog/__tests__/ReleaseForm.test.tsx @@ -66,7 +66,7 @@ describe('ReleaseForm', () => { loading: false, dispatch: vi.fn(), error: undefined, - deletedReleases: {}, + stack: [], }) mockUseDateTimeFormat.mockReturnValue({format: vi.fn().mockReturnValue('Mocked date')}) @@ -171,7 +171,7 @@ describe('ReleaseForm', () => { data: mockData, loading: false, dispatch: vi.fn(), - deletedReleases: {} as Record, + stack: [], }) mockUseDateTimeFormat.mockReturnValue({format: vi.fn().mockReturnValue('Mocked date')}) diff --git a/packages/sanity/src/core/releases/hooks/__tests__/useDocumentVersions.test.tsx b/packages/sanity/src/core/releases/hooks/__tests__/useDocumentVersions.test.tsx index ed4eaf4f937..2b10ccf250f 100644 --- a/packages/sanity/src/core/releases/hooks/__tests__/useDocumentVersions.test.tsx +++ b/packages/sanity/src/core/releases/hooks/__tests__/useDocumentVersions.test.tsx @@ -73,7 +73,6 @@ async function setupMocks({ data: releases, loading: false, dispatch: vi.fn(), - deletedReleases: {}, stack: [], }) diff --git a/packages/sanity/src/core/releases/navbar/GlobalPerspectiveMenu.tsx b/packages/sanity/src/core/releases/navbar/GlobalPerspectiveMenu.tsx index 8900e21a557..e169df3e9de 100644 --- a/packages/sanity/src/core/releases/navbar/GlobalPerspectiveMenu.tsx +++ b/packages/sanity/src/core/releases/navbar/GlobalPerspectiveMenu.tsx @@ -10,7 +10,6 @@ import {useReleases} from '../../store/release/useReleases' import {ReleaseDetailsDialog} from '../components/dialog/ReleaseDetailsDialog' import {usePerspective} from '../hooks' import {LATEST} from '../util/const' -import {isDraftOrPublished} from '../util/util' const StyledMenu = styled(Menu)` min-width: 200px; @@ -22,21 +21,20 @@ const StyledBox = styled(Box)` ` export function GlobalPerspectiveMenu(): JSX.Element { - const {deletedReleases, loading, data: releases} = useReleases() + const {loading, data: releases} = useReleases() const {currentGlobalBundle, setPerspectiveFromRelease, setPerspective} = usePerspective() const [createBundleDialogOpen, setCreateBundleDialogOpen] = useState(false) const styledMenuRef = useRef(null) const {t} = useTranslation() - const sortedBundlesToDisplay = useMemo(() => { + const filteredReleases = useMemo(() => { if (!releases) return [] - return [...(releases || []), ...Object.values(deletedReleases)].filter( - ({_id, state}) => !isDraftOrPublished(_id) && state !== 'archived', - ) - }, [releases, deletedReleases]) - const hasBundles = sortedBundlesToDisplay.length > 0 + return releases.filter(({_id, state}) => state !== 'archived') + }, [releases]) + + const hasBundles = filteredReleases.length > 0 const handleBundleChange = useCallback( (releaseId: string) => () => { @@ -45,11 +43,6 @@ export function GlobalPerspectiveMenu(): JSX.Element { [setPerspectiveFromRelease], ) - const isBundleDeleted = useCallback( - (releaseId: string) => Boolean(deletedReleases[releaseId]), - [deletedReleases], - ) - /* create new release */ const handleCreateBundleClick = useCallback(() => { setCreateBundleDialogOpen(true) @@ -85,20 +78,15 @@ export function GlobalPerspectiveMenu(): JSX.Element { <> - {sortedBundlesToDisplay.map(({_id, ...release}) => ( + {filteredReleases.map(({_id, ...release}) => ( - + @@ -139,9 +127,8 @@ export function GlobalPerspectiveMenu(): JSX.Element { setPerspective, handleCreateBundleClick, hasBundles, - isBundleDeleted, loading, - sortedBundlesToDisplay, + filteredReleases, t, ]) diff --git a/packages/sanity/src/core/releases/tool/components/ReleaseMenuButton/ReleaseMenuButton.tsx b/packages/sanity/src/core/releases/tool/components/ReleaseMenuButton/ReleaseMenuButton.tsx index c8bfb031f6c..08615c34858 100644 --- a/packages/sanity/src/core/releases/tool/components/ReleaseMenuButton/ReleaseMenuButton.tsx +++ b/packages/sanity/src/core/releases/tool/components/ReleaseMenuButton/ReleaseMenuButton.tsx @@ -18,7 +18,7 @@ export type ReleaseMenuButtonProps = { export const ReleaseMenuButton = ({disabled, release}: ReleaseMenuButtonProps) => { const {updateRelease} = useReleaseOperations() - const isBundleArchived = !!release?.metadata.archivedAt + const isBundleArchived = release?.state === 'archived' const [isPerformingOperation, setIsPerformingOperation] = useState(false) const [selectedAction, setSelectedAction] = useState<'edit'>() @@ -34,6 +34,7 @@ export const ReleaseMenuButton = ({disabled, release}: ReleaseMenuButtonProps) = setIsPerformingOperation(true) await updateRelease({ ...release, + state: isBundleArchived ? 'active' : 'archived', metadata: { ...release.metadata, archivedAt: isBundleArchived ? undefined : new Date().toISOString(), diff --git a/packages/sanity/src/core/releases/tool/detail/ReleaseDashboardFooter.tsx b/packages/sanity/src/core/releases/tool/detail/ReleaseDashboardFooter.tsx index 82d4b612252..5d8a7146fb2 100644 --- a/packages/sanity/src/core/releases/tool/detail/ReleaseDashboardFooter.tsx +++ b/packages/sanity/src/core/releases/tool/detail/ReleaseDashboardFooter.tsx @@ -9,9 +9,8 @@ import {type DocumentInBundleResult} from './useBundleDocuments' export function ReleaseDashboardFooter(props: { documents: DocumentInBundleResult[] release: ReleaseDocument - isBundleDeleted: boolean }) { - const {documents, release, isBundleDeleted} = props + const {documents, release} = props return ( @@ -24,14 +23,14 @@ export function ReleaseDashboardFooter(props: { {/* TODO: Replace this with the real actions. */} - {!isBundleDeleted && !release.publishAt && ( + {!release.publishAt && ( )} - + diff --git a/packages/sanity/src/core/releases/tool/detail/ReleaseDetail.tsx b/packages/sanity/src/core/releases/tool/detail/ReleaseDetail.tsx index 84759341c37..0c8731e8a9b 100644 --- a/packages/sanity/src/core/releases/tool/detail/ReleaseDetail.tsx +++ b/packages/sanity/src/core/releases/tool/detail/ReleaseDetail.tsx @@ -3,8 +3,8 @@ import {useCallback, useEffect, useMemo, useRef, useState} from 'react' import {type RouterContextValue, useRouter} from 'sanity/router' import {LoadingBlock} from '../../../components' -import {Translate, useTranslation} from '../../../i18n' -import {type ReleaseDocument, useReleases} from '../../../store/release' +import {useTranslation} from '../../../i18n' +import {useReleases} from '../../../store/release' import {releasesLocaleNamespace} from '../../i18n' import {type ReleasesRouterState} from '../../types/router' import {getBundleIdFromReleaseId} from '../../util/getBundleIdFromReleaseId' @@ -39,14 +39,13 @@ export const ReleaseDetail = () => { const {releaseId: releaseIdRaw}: ReleasesRouterState = router.state const releaseId = decodeURIComponent(releaseIdRaw || '') - const {data, loading, deletedReleases} = useReleases() - const deletedBundle = deletedReleases[releaseId] as ReleaseDocument | undefined + const {data, loading} = useReleases() const {loading: documentsLoading, results} = useBundleDocuments(releaseId) const documentIds = results.map((result) => result.document?._id) const history = useReleaseHistory(documentIds, releaseId) - const release = data?.find( + const releaseInDetail = data?.find( (storeBundle) => getBundleIdFromReleaseId(storeBundle._id) === releaseId, ) @@ -67,41 +66,24 @@ export const ReleaseDetail = () => { // review screen will not be available once published // so redirect to summary screen useEffect(() => { - if (activeView === 'review' && release?.publishAt) { + if (activeView === 'review' && releaseInDetail?.publishAt) { navigateToSummary() } - }, [activeView, release?.publishAt, navigateToSummary]) + }, [activeView, releaseInDetail?.publishAt, navigateToSummary]) const scrollContainerRef = useRef(null) const detailContent = useMemo(() => { - if (deletedBundle) { - return ( - - - - - - - - - - ) - } if (documentsLoading) { return } - if (!release) return null + if (!releaseInDetail) return null if (activeView === 'summary') { return ( @@ -112,14 +94,14 @@ export const ReleaseDetail = () => { return ( ) } return null - }, [activeView, release, deletedBundle, documentsLoading, history.documentsHistory, results, t]) + }, [activeView, releaseInDetail, documentsLoading, history.documentsHistory, results, t]) if (loading) { return ( @@ -131,7 +113,6 @@ export const ReleaseDetail = () => { ) } - const releaseInDetail = (release || deletedBundle) as ReleaseDocument if (releaseInDetail) { return ( @@ -151,11 +132,7 @@ export const ReleaseDetail = () => { {detailContent} - + {inspector === 'activity' && ( diff --git a/packages/sanity/src/core/releases/tool/detail/__tests__/ReleaseDetail.test.tsx b/packages/sanity/src/core/releases/tool/detail/__tests__/ReleaseDetail.test.tsx index a82e40dd60a..0cce488598e 100644 --- a/packages/sanity/src/core/releases/tool/detail/__tests__/ReleaseDetail.test.tsx +++ b/packages/sanity/src/core/releases/tool/detail/__tests__/ReleaseDetail.test.tsx @@ -10,7 +10,7 @@ import {ReleaseDetail} from '../ReleaseDetail' import {useBundleDocuments} from '../useBundleDocuments' vi.mock('../../../../store/release', () => ({ - useReleases: vi.fn().mockReturnValue({data: [], loading: false, deletedReleases: {}}), + useReleases: vi.fn().mockReturnValue({data: [], loading: false}), })) vi.mock('../../../../store/release/useReleaseOperations', () => ({ @@ -95,7 +95,7 @@ describe.skip('ReleaseDetail', () => { data: [], loading: true, dispatch: vi.fn(), - deletedReleases: {}, + stack: [], }) await renderTest() }) @@ -132,7 +132,7 @@ describe.skip('ReleaseDetail', () => { ], loading: false, dispatch: vi.fn(), - deletedReleases: {}, + stack: [], }) await renderTest() }) @@ -173,7 +173,7 @@ describe.skip('after releases have loaded', () => { ], loading: false, dispatch: vi.fn(), - deletedReleases: {}, + stack: [], }) }) @@ -358,7 +358,7 @@ describe.skip('after releases have loaded', () => { ], loading: false, dispatch: vi.fn(), - deletedReleases: {}, + stack: [], }) await renderTest() @@ -386,21 +386,7 @@ describe.skip('after releases have loaded', () => { data: [], loading: false, dispatch: vi.fn(), - deletedReleases: { - 'test-release-id': { - title: 'Test release', - publishAt: undefined, - archivedAt: undefined, - _id: 'test-release-id', - _createdAt: new Date().toISOString(), - _type: 'release', - hue: 'blue', - icon: 'string', - createdBy: 'author-id', - _updatedAt: new Date().toISOString(), - _rev: 'abc', - }, - }, + stack: [], }) await renderTest() }) @@ -422,7 +408,7 @@ describe.skip('after releases have loaded', () => { data: [], loading: false, dispatch: vi.fn(), - deletedReleases: {}, + stack: [], }) await renderTest() }) diff --git a/packages/sanity/src/core/releases/tool/overview/ReleasesOverview.tsx b/packages/sanity/src/core/releases/tool/overview/ReleasesOverview.tsx index cee6761fd47..a94a1149a0c 100644 --- a/packages/sanity/src/core/releases/tool/overview/ReleasesOverview.tsx +++ b/packages/sanity/src/core/releases/tool/overview/ReleasesOverview.tsx @@ -115,7 +115,7 @@ const getInitialFilterDate = (router: RouterContextValue) => () => { } export function ReleasesOverview() { - const {data: releases, loading: loadingReleases, deletedReleases} = useReleases() + const {data: releases, loading: loadingReleases} = useReleases() const [releaseGroupMode, setReleaseGroupMode] = useState('open') const router = useRouter() const [releaseFilterDate, setReleaseFilterDate] = useState( @@ -147,23 +147,16 @@ export function ReleasesOverview() { const loadingOrHasReleases = loading || hasReleases const tableReleases = useMemo(() => { - const deletedTableReleases = Object.values(deletedReleases).map((deletedRelease) => ({ - ...deletedRelease, - publishAt: deletedRelease.publishAt || deletedRelease.metadata.intendedPublishAt, - isDeleted: true, - })) - - if (!hasReleases || !releasesMetadata) return deletedTableReleases + if (!hasReleases || !releasesMetadata) return [] return [ - ...deletedTableReleases, ...releases.map((release) => ({ ...release, publishAt: release.publishAt || release.metadata.intendedPublishAt, documentsMetadata: releasesMetadata[release._id] || {}, })), ] - }, [deletedReleases, hasReleases, releasesMetadata, releases]) + }, [hasReleases, releasesMetadata, releases]) const groupedReleases = useMemo( () => diff --git a/packages/sanity/src/core/releases/tool/overview/__tests__/ReleasesOverview.test.tsx b/packages/sanity/src/core/releases/tool/overview/__tests__/ReleasesOverview.test.tsx index c5e603f90ae..357a599de03 100644 --- a/packages/sanity/src/core/releases/tool/overview/__tests__/ReleasesOverview.test.tsx +++ b/packages/sanity/src/core/releases/tool/overview/__tests__/ReleasesOverview.test.tsx @@ -52,7 +52,7 @@ describe.todo('ReleasesOverview', () => { data: [], loading: true, dispatch: vi.fn(), - deletedReleases: {}, + stack: [], }) mockUseReleasesMetadata.mockReturnValue({ loading: true, @@ -92,7 +92,7 @@ describe.todo('ReleasesOverview', () => { data: [], loading: false, dispatch: vi.fn(), - deletedReleases: {}, + stack: [], }) mockUseReleasesMetadata.mockReturnValue({ loading: false, @@ -177,16 +177,7 @@ describe.todo('ReleasesOverview', () => { data: releases, loading: false, dispatch: vi.fn(), - deletedReleases: { - 'deleted-release-id': { - _id: 'deleted-release-id', - _createdAt: new Date(Date.now() - 24 * 60 * 60 * 1000 * 5).toISOString(), - _updatedAt: new Date(Date.now() - 24 * 60 * 60 * 1000 * 5).toISOString(), - metadata: { - title: 'Deleted Release', - }, - } satisfies ReleaseDocument, - }, + stack: [], }) mockUseReleasesMetadata.mockReturnValue({ loading: false, diff --git a/packages/sanity/src/core/store/release/createReleaseStore.ts b/packages/sanity/src/core/store/release/createReleaseStore.ts index d171ea25b5b..bf35b3baf95 100644 --- a/packages/sanity/src/core/store/release/createReleaseStore.ts +++ b/packages/sanity/src/core/store/release/createReleaseStore.ts @@ -55,7 +55,6 @@ const LISTEN_OPTIONS: ListenOptions = { const INITIAL_STATE: ReleasesReducerState = { releases: new Map(), - deletedReleases: {}, state: 'loaded' as const, releaseStack: [], } diff --git a/packages/sanity/src/core/store/release/reducer.ts b/packages/sanity/src/core/store/release/reducer.ts index 25a0ed07d23..fdc1291df2f 100644 --- a/packages/sanity/src/core/store/release/reducer.ts +++ b/packages/sanity/src/core/store/release/reducer.ts @@ -47,7 +47,6 @@ export type ReleasesReducerAction = export interface ReleasesReducerState { releases: Map - deletedReleases: Record state: 'initialising' | 'loading' | 'loaded' | 'error' error?: Error @@ -117,30 +116,6 @@ export function releasesReducer( } } - case 'BUNDLE_DELETED': { - const currentReleases = new Map(state.releases) - const deletedBundleId = action.id - const isDeletedByCurrentUser = action.currentUserId === action.deletedByUserId - const localDeletedBundle = currentReleases.get(deletedBundleId) - currentReleases.delete(deletedBundleId) - - // only capture the deleted release if deleted by another user - const nextDeletedReleases = - !isDeletedByCurrentUser && localDeletedBundle - ? { - ...state.deletedReleases, - [localDeletedBundle._id]: localDeletedBundle, - } - : state.deletedReleases - - return { - ...state, - releases: currentReleases, - deletedReleases: nextDeletedReleases, - releaseStack: [...state.releaseStack].filter((id) => id !== deletedBundleId), - } - } - case 'BUNDLE_UPDATED': { const updatedBundle = action.payload const id = updatedBundle._id as string diff --git a/packages/sanity/src/core/store/release/useReleases.ts b/packages/sanity/src/core/store/release/useReleases.ts index 77a5b40fca4..2df94d3287c 100644 --- a/packages/sanity/src/core/store/release/useReleases.ts +++ b/packages/sanity/src/core/store/release/useReleases.ts @@ -8,10 +8,9 @@ import {type ReleaseDocument} from './types' interface ReleasesState { data: ReleaseDocument[] // releases: Map - deletedReleases: Record error?: Error loading: boolean - dispatch: React.Dispatch + dispatch: (event: ReleasesReducerAction) => void /** * An array of release ids ordered chronologically to represent the state of documents at the @@ -27,14 +26,11 @@ export function useReleases(): ReleasesState { const {state$, dispatch} = useReleasesStore() const state = useObservable(state$)! const releasesAsArray = useMemo(() => Array.from(state.releases.values()), [state.releases]) - const {deletedReleases, error} = state return { data: releasesAsArray, - // releases: state.releases, - deletedReleases: deletedReleases, dispatch, - error, + error: state.error, loading: ['loading', 'initialising'].includes(state.state), stack: state.releaseStack, } diff --git a/packages/sanity/src/structure/panes/document/document-layout/useBundleDeletedToast.tsx b/packages/sanity/src/structure/panes/document/document-layout/useBundleDeletedToast.tsx index 91ccfd3bdd9..cc7601133e2 100644 --- a/packages/sanity/src/structure/panes/document/document-layout/useBundleDeletedToast.tsx +++ b/packages/sanity/src/structure/panes/document/document-layout/useBundleDeletedToast.tsx @@ -4,21 +4,18 @@ import {Translate, usePerspective, useReleases, useTranslation} from 'sanity' export const useBundleDeletedToast = () => { const {currentGlobalBundle} = usePerspective() - const {data: bundles, deletedReleases} = useReleases() + const {data: bundles} = useReleases() const toast = useToast() const {t} = useTranslation() - const {_id: currentGlobalBundleId} = currentGlobalBundle useEffect(() => { - if (!currentGlobalBundleId || !Object.keys(deletedReleases).length || !bundles?.length) return + const hasCheckedOutBundleBeenArchived = currentGlobalBundle.state === 'archived' - const hasCheckedOutBundleBeenDeleted = Boolean(deletedReleases[currentGlobalBundleId]) - - if (hasCheckedOutBundleBeenDeleted) { + if (hasCheckedOutBundleBeenArchived) { const { metadata: {title: deletedBundleTitle}, _id: deletedBundleId, - } = deletedReleases[currentGlobalBundleId] + } = currentGlobalBundle toast.push({ id: `bundle-deleted-toast-${deletedBundleId}`, @@ -35,5 +32,5 @@ export const useBundleDeletedToast = () => { duration: 10000, }) } - }, [bundles?.length, currentGlobalBundleId, deletedReleases, toast, t]) + }, [bundles?.length, toast, t, currentGlobalBundle]) } diff --git a/packages/sanity/src/structure/panes/document/documentPanel/banners/DeletedDocumentBanners.tsx b/packages/sanity/src/structure/panes/document/documentPanel/banners/DeletedDocumentBanners.tsx index e66e7978c62..b5c63b5222f 100644 --- a/packages/sanity/src/structure/panes/document/documentPanel/banners/DeletedDocumentBanners.tsx +++ b/packages/sanity/src/structure/panes/document/documentPanel/banners/DeletedDocumentBanners.tsx @@ -1,12 +1,11 @@ import {DocumentRemoveIcon, ReadOnlyIcon} from '@sanity/icons' import {Text} from '@sanity/ui' -import {useCallback, useEffect, useState} from 'react' +import {useCallback} from 'react' import { type ReleaseDocument, Translate, useDocumentOperation, usePerspective, - useReleases, useTimelineSelector, useTranslation, } from 'sanity' @@ -16,36 +15,13 @@ import {structureLocaleNamespace} from '../../../../i18n' import {useDocumentPane} from '../../useDocumentPane' import {Banner} from './Banner' -const useIsLocaleBundleDeleted = () => { - const {currentGlobalBundle} = usePerspective() - const {data: bundles, deletedReleases} = useReleases() - const {_id: currentGlobalBundleId} = currentGlobalBundle - const [checkedOutBundleId, setCheckedOutBundleId] = useState( - currentGlobalBundleId, - ) - - useEffect(() => { - /** - * only named versions other than default (drafts and published) are considered checked-out - */ - if (currentGlobalBundleId !== 'drafts') { - setCheckedOutBundleId(currentGlobalBundleId) - } - }, [currentGlobalBundleId, setCheckedOutBundleId]) - - if (!checkedOutBundleId || !Object.keys(deletedReleases).length || !bundles?.length) { - return null - } - return deletedReleases[checkedOutBundleId] -} - export function DeletedDocumentBanners() { const {isDeleted, isDeleting} = useDocumentPane() - const deletedCheckedOutBundle = useIsLocaleBundleDeleted() - - if (deletedCheckedOutBundle) - return + const {currentGlobalBundle} = usePerspective() + if (currentGlobalBundle.state === 'archived') { + return + } if (isDeleted && !isDeleting) return } @@ -87,7 +63,7 @@ function DeletedDocumentBanner() { ) } -const DeletedBundleBanner = ({deletedBundle}: {deletedBundle: ReleaseDocument}) => { +const ArchivedReleaseBanner = ({release}: {release: ReleaseDocument}) => { const {t} = useTranslation() return ( @@ -98,7 +74,7 @@ const DeletedBundleBanner = ({deletedBundle}: {deletedBundle: ReleaseDocument}) } diff --git a/packages/sanity/src/structure/panes/document/documentPanel/banners/__tests__/DeletedDocumentBanners.test.tsx b/packages/sanity/src/structure/panes/document/documentPanel/banners/__tests__/DeletedDocumentBanners.test.tsx index 15a1ac1510d..d4c0d1b562c 100644 --- a/packages/sanity/src/structure/panes/document/documentPanel/banners/__tests__/DeletedDocumentBanners.test.tsx +++ b/packages/sanity/src/structure/panes/document/documentPanel/banners/__tests__/DeletedDocumentBanners.test.tsx @@ -56,15 +56,15 @@ describe('DeletedDocumentBanners', () => { }) it('prefers to show release deleted banner when document was in a release', async () => { - const mockBundleDocument = {_id: 'test'} as ReleaseDocument - mockUsePerspective.mockReturnValue({currentGlobalBundle: mockBundleDocument} as ReturnType< + const mockReleaseDocument = {_id: 'test', state: 'archived'} as ReleaseDocument + mockUsePerspective.mockReturnValue({currentGlobalBundle: mockReleaseDocument} as ReturnType< typeof usePerspective >) mockUseReleases.mockReturnValue({ - data: [mockBundleDocument], - deletedReleases: {test: mockBundleDocument}, + data: [mockReleaseDocument], dispatch: vi.fn(), loading: false, + stack: [], }) mockUseDocumentPane.mockReturnValue({ isDeleted: true, @@ -80,7 +80,7 @@ describe('DeletedDocumentBanners', () => { }) it('shows the fallback document deleted banner when document was not in a release', async () => { - const mockBundleDocument: ReleaseDocument = {_id: 'test'} as ReleaseDocument + const mockBundleDocument: ReleaseDocument = {_id: 'test', state: 'archived'} as ReleaseDocument mockUsePerspective.mockReturnValue({ currentGlobalBundle: LATEST, @@ -89,9 +89,9 @@ describe('DeletedDocumentBanners', () => { mockUseReleases.mockReturnValue({ data: [mockBundleDocument], - deletedReleases: {test: mockBundleDocument}, dispatch: vi.fn(), loading: false, + stack: [], }) mockUseDocumentPane.mockReturnValue({ diff --git a/packages/sanity/src/structure/panes/document/documentPanel/header/perspective/__tests__/DocumentHeaderTitle.test.tsx b/packages/sanity/src/structure/panes/document/documentPanel/header/perspective/__tests__/DocumentHeaderTitle.test.tsx index cba29575e35..73ac6c0390e 100644 --- a/packages/sanity/src/structure/panes/document/documentPanel/header/perspective/__tests__/DocumentHeaderTitle.test.tsx +++ b/packages/sanity/src/structure/panes/document/documentPanel/header/perspective/__tests__/DocumentHeaderTitle.test.tsx @@ -74,7 +74,7 @@ describe('DocumentHeaderTitle', () => { data: [], loading: false, dispatch: vi.fn(), - deletedReleases: {}, + stack: [], }) })