Skip to content

Commit a693832

Browse files
committedMar 4, 2025
refactor(sanity): move release filtering code to reusable useFilteredReleases hook (#7907)
1 parent a3defc3 commit a693832

File tree

2 files changed

+87
-61
lines changed

2 files changed

+87
-61
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import {useMemo} from 'react'
2+
import {
3+
getReleaseIdFromReleaseDocumentId,
4+
getVersionFromId,
5+
type ReleaseDocument,
6+
useActiveReleases,
7+
useArchivedReleases,
8+
useDocumentVersions,
9+
usePerspective,
10+
} from 'sanity'
11+
12+
import {usePaneRouter} from '../components/paneRouter/usePaneRouter'
13+
import {type DocumentPaneContextValue} from '../panes/document/DocumentPaneContext'
14+
15+
type FilterReleases = {
16+
notCurrentReleases: ReleaseDocument[]
17+
currentReleases: ReleaseDocument[]
18+
inCreation: ReleaseDocument | null
19+
}
20+
21+
/**
22+
* @internal
23+
*/
24+
export function useFilteredReleases({
25+
displayed,
26+
documentId,
27+
}: Pick<DocumentPaneContextValue, 'displayed' | 'documentId'>): FilterReleases {
28+
const {selectedReleaseId} = usePerspective()
29+
const {data: releases} = useActiveReleases()
30+
const {data: archivedReleases} = useArchivedReleases()
31+
const {data: documentVersions} = useDocumentVersions({documentId})
32+
const isCreatingDocument = displayed && !displayed._createdAt
33+
const {params} = usePaneRouter()
34+
35+
return useMemo(() => {
36+
if (!documentVersions) return {notCurrentReleases: [], currentReleases: [], inCreation: null}
37+
// Gets the releases ids from the document versions, it means, the releases that the document belongs to
38+
const releasesIds = documentVersions.map((id) => getVersionFromId(id))
39+
const activeReleases = releases.reduce(
40+
(acc: FilterReleases, release) => {
41+
const versionDocExists = releasesIds.includes(
42+
getReleaseIdFromReleaseDocumentId(release._id),
43+
)
44+
const releaseId = getReleaseIdFromReleaseDocumentId(release._id)
45+
const isCreatingThisVersion =
46+
isCreatingDocument &&
47+
releaseId === getVersionFromId(displayed._id || '') &&
48+
releaseId === selectedReleaseId
49+
50+
if (isCreatingThisVersion) {
51+
acc.inCreation = release
52+
} else if (versionDocExists) {
53+
acc.currentReleases.push(release)
54+
} else {
55+
acc.notCurrentReleases.push(release)
56+
}
57+
return acc
58+
},
59+
{notCurrentReleases: [], currentReleases: [], inCreation: null},
60+
)
61+
62+
// without historyVersion, version is not in an archived release
63+
if (!params?.historyVersion) return activeReleases
64+
65+
const archivedRelease = archivedReleases.find(
66+
(r) => getReleaseIdFromReleaseDocumentId(r._id) === params?.historyVersion,
67+
)
68+
69+
// only for explicitly archived releases; published releases use published perspective
70+
if (archivedRelease?.state === 'archived') {
71+
activeReleases.currentReleases.push(archivedRelease)
72+
}
73+
74+
return activeReleases
75+
}, [
76+
archivedReleases,
77+
isCreatingDocument,
78+
displayed?._id,
79+
documentVersions,
80+
params?.historyVersion,
81+
releases,
82+
selectedReleaseId,
83+
])
84+
}

‎packages/sanity/src/structure/panes/document/documentPanel/header/perspective/DocumentPerspectiveList.tsx

+3-61
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,8 @@ import {
1313
type ReleaseDocument,
1414
Translate,
1515
useActiveReleases,
16-
useArchivedReleases,
1716
useDateTimeFormat,
1817
type UseDateTimeFormatOptions,
19-
useDocumentVersions,
2018
usePerspective,
2119
useSchema,
2220
useSetPerspective,
@@ -26,14 +24,9 @@ import {
2624
import {usePaneRouter} from 'sanity/structure'
2725

2826
import {isLiveEditEnabled} from '../../../../../components/paneItem/helpers'
27+
import {useFilteredReleases} from '../../../../../hooks/useFilteredReleases'
2928
import {useDocumentPane} from '../../../useDocumentPane'
3029

31-
type FilterReleases = {
32-
notCurrentReleases: ReleaseDocument[]
33-
currentReleases: ReleaseDocument[]
34-
inCreation: ReleaseDocument | null
35-
}
36-
3730
const TooltipContent = ({release}: {release: ReleaseDocument}) => {
3831
const {t} = useTranslation()
3932

@@ -85,62 +78,11 @@ export const DocumentPerspectiveList = memo(function DocumentPerspectiveList() {
8578
const setPerspective = useSetPerspective()
8679
const {params} = usePaneRouter()
8780
const dateTimeFormat = useDateTimeFormat(DATE_TIME_FORMAT)
88-
const {data: releases, loading} = useActiveReleases()
89-
const {data: archivedReleases} = useArchivedReleases()
81+
const {loading} = useActiveReleases()
9082
const schema = useSchema()
9183
const {editState, displayed, documentType, documentId} = useDocumentPane()
92-
const {data: documentVersions} = useDocumentVersions({documentId})
9384
const isCreatingDocument = displayed && !displayed._createdAt
94-
95-
const filteredReleases: FilterReleases = useMemo(() => {
96-
if (!documentVersions) return {notCurrentReleases: [], currentReleases: [], inCreation: null}
97-
// Gets the releases ids from the document versions, it means, the releases that the document belongs to
98-
const releasesIds = documentVersions.map((id) => getVersionFromId(id))
99-
const activeReleases = releases.reduce(
100-
(acc: FilterReleases, release) => {
101-
const versionDocExists = releasesIds.includes(
102-
getReleaseIdFromReleaseDocumentId(release._id),
103-
)
104-
const releaseId = getReleaseIdFromReleaseDocumentId(release._id)
105-
const isCreatingThisVersion =
106-
isCreatingDocument &&
107-
releaseId === getVersionFromId(displayed._id || '') &&
108-
releaseId === selectedReleaseId
109-
110-
if (isCreatingThisVersion) {
111-
acc.inCreation = release
112-
} else if (versionDocExists) {
113-
acc.currentReleases.push(release)
114-
} else {
115-
acc.notCurrentReleases.push(release)
116-
}
117-
return acc
118-
},
119-
{notCurrentReleases: [], currentReleases: [], inCreation: null},
120-
)
121-
122-
// without historyVersion, version is not in an archived release
123-
if (!params?.historyVersion) return activeReleases
124-
125-
const archivedRelease = archivedReleases.find(
126-
(r) => getReleaseIdFromReleaseDocumentId(r._id) === params?.historyVersion,
127-
)
128-
129-
// only for explicitly archived releases; published releases use published perspective
130-
if (archivedRelease?.state === 'archived') {
131-
activeReleases.currentReleases.push(archivedRelease)
132-
}
133-
134-
return activeReleases
135-
}, [
136-
archivedReleases,
137-
isCreatingDocument,
138-
displayed?._id,
139-
documentVersions,
140-
params?.historyVersion,
141-
releases,
142-
selectedReleaseId,
143-
])
85+
const filteredReleases = useFilteredReleases({displayed, documentId})
14486

14587
const handlePerspectiveChange = useCallback(
14688
(perspective: Parameters<typeof setPerspective>[0]) => () => {

0 commit comments

Comments
 (0)
Please sign in to comment.