diff --git a/cypress/e2e/item/publish/coEditorSettings.cy.ts b/cypress/e2e/item/publish/coEditorSettings.cy.ts index 1b16b2c08..2286f2f15 100644 --- a/cypress/e2e/item/publish/coEditorSettings.cy.ts +++ b/cypress/e2e/item/publish/coEditorSettings.cy.ts @@ -38,7 +38,7 @@ it('Change choice', () => { const item = ITEM_WITH_CATEGORIES_CONTEXT.items[0]; const newOptionValue = DISPLAY_CO_EDITORS_OPTIONS.NO.value; - cy.wait('@getLatestValidationGroup').then(() => { + cy.wait('@getPublicationStatus').then(() => { cy.get(buildDataCyWrapper(CO_EDITOR_SETTINGS_CHECKBOX_ID)).click(); }); diff --git a/cypress/e2e/item/publish/publishedItem.cy.ts b/cypress/e2e/item/publish/publishedItem.cy.ts index 65b5b736c..a442e28e8 100644 --- a/cypress/e2e/item/publish/publishedItem.cy.ts +++ b/cypress/e2e/item/publish/publishedItem.cy.ts @@ -8,11 +8,10 @@ import { PackedFolderItemFactory, PackedItem, PermissionLevel, + PublicationStatus, PublishableItemTypeChecker, } from '@graasp/sdk'; -import { PublicationStatus } from '@/types/publication'; - import { buildItemPath } from '../../../../src/config/paths'; import { EMAIL_NOTIFICATION_CHECKBOX, @@ -37,14 +36,22 @@ const openPublishItemTab = (id: string) => { const setUpAndVisitItemPage = ( item: PackedItem | ItemForTest, { + itemPublicationStatus, itemValidationGroups, currentMember, }: { + itemPublicationStatus?: PublicationStatus; itemValidationGroups?: ItemValidationGroup[]; currentMember?: Member | null; } = {}, ) => { - cy.setUpApi({ items: [item], itemValidationGroups, currentMember }); + cy.setUpApi({ + items: [item], + itemValidationGroups, + currentMember, + itemPublicationStatus: + itemPublicationStatus ?? PublicationStatus.Unpublished, + }); cy.visit(buildItemPath(item.id)); }; @@ -125,7 +132,7 @@ describe('Private Item', () => { const status = PublicationStatus.Unpublished; beforeEach(() => { - setUpAndVisitItemPage(privateItem); + setUpAndVisitItemPage(privateItem, { itemPublicationStatus: status }); openPublishItemTab(privateItem.id); }); @@ -149,6 +156,7 @@ describe('Private Item', () => { beforeEach(() => { setUpAndVisitItemPage(privateItem, { + itemPublicationStatus: status, itemValidationGroups: [itemValidationGroup], }); openPublishItemTab(privateItem.id); @@ -169,23 +177,25 @@ describe('Private Item', () => { }); describe('Visibility of published item is private again', () => { + const status = PublicationStatus.NotPublic; const itemValidationGroup = ItemValidationGroupFactory(privateItem); beforeEach(() => { setUpAndVisitItemPage(PublishedItemFactory(privateItem), { + itemPublicationStatus: status, itemValidationGroups: [itemValidationGroup], }); openPublishItemTab(privateItem.id); }); it('Publication status should be Not Public', () => { - getPublicationStatusComponent(PublicationStatus.NotPublic) + getPublicationStatusComponent(status) .should('exist') .should('be.visible'); }); it('Should ask before change item visility to public', () => { - getPublicationButton(PublicationStatus.NotPublic).click(); // Click on change visibility + getPublicationButton(status).click(); // Click on change visibility confirmSetItemToPublic(); waitOnSetItemPublic(privateItem); }); @@ -199,6 +209,7 @@ describe('Private Item', () => { beforeEach(() => { setUpAndVisitItemPage(privateItem, { + itemPublicationStatus: status, itemValidationGroups: [itemValidationGroup], }); openPublishItemTab(privateItem.id); @@ -226,7 +237,7 @@ describe('Public Item', () => { const status = PublicationStatus.Unpublished; beforeEach(() => { - setUpAndVisitItemPage(publicItem); + setUpAndVisitItemPage(publicItem, { itemPublicationStatus: status }); openPublishItemTab(publicItem.id); }); @@ -250,6 +261,7 @@ describe('Public Item', () => { beforeEach(() => { setUpAndVisitItemPage(PublishedItemFactory(publicItem), { + itemPublicationStatus: status, itemValidationGroups: [itemValidationGroup], }); openPublishItemTab(publicItem.id); @@ -274,6 +286,7 @@ describe('Public Item', () => { beforeEach(() => { setUpAndVisitItemPage(publicItem, { + itemPublicationStatus: status, itemValidationGroups: [itemValidationGroup], }); openPublishItemTab(publicItem.id); @@ -305,6 +318,7 @@ describe('Public Item', () => { beforeEach(() => { setUpAndVisitItemPage(publicItem, { + itemPublicationStatus: status, itemValidationGroups: [itemValidationGroup], }); openPublishItemTab(publicItem.id); @@ -328,6 +342,7 @@ describe('Public Item', () => { beforeEach(() => { setUpAndVisitItemPage(PublishedItemFactory(publicItem), { + itemPublicationStatus: status, itemValidationGroups: [itemValidationGroup], }); openPublishItemTab(publicItem.id); @@ -352,7 +367,7 @@ describe('Public Item', () => { statusExpected: PublicationStatus, ) => { it(testTitle, () => { - setUpAndVisitItemPage(item); + setUpAndVisitItemPage(item, { itemPublicationStatus: statusExpected }); openPublishItemTab(item.id); getPublicationStatusComponent(statusExpected) .should('exist') diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index 82bc05e39..7484a9e4e 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -1,4 +1,4 @@ -import { CookieKeys } from '@graasp/sdk'; +import { CookieKeys, PublicationStatus } from '@graasp/sdk'; import 'cypress-localstorage-commands'; @@ -64,6 +64,7 @@ import { mockGetMembersBy, mockGetOwnItems, mockGetParents, + mockGetPublicationStatus, mockGetPublishItemInformations, mockGetPublishItemsForMember, mockGetRecycledItems, @@ -114,6 +115,7 @@ Cypress.Commands.add( categories = SAMPLE_CATEGORIES, itemValidationAndReview = ITEM_VALIDATION_AND_REVIEW, itemValidationGroups = [], + itemPublicationStatus = PublicationStatus.Unpublished, deleteItemsError = false, postItemError = false, moveItemsError = false, @@ -322,6 +324,7 @@ Cypress.Commands.add( mockUploadInvitationCSV(items, false); + mockGetPublicationStatus(itemPublicationStatus); mockPublishItem(items); mockUnpublishItem(items); diff --git a/cypress/support/server.ts b/cypress/support/server.ts index 4f8cfae32..cbbb442bb 100644 --- a/cypress/support/server.ts +++ b/cypress/support/server.ts @@ -15,6 +15,7 @@ import { Member, PermissionLevel, PermissionLevelCompare, + PublicationStatus, RecycledItemData, ShortLink, ShortLinkPayload, @@ -55,7 +56,6 @@ const { buildItemUnpublishRoute, buildGetItemRoute, GET_OWN_ITEMS_ROUTE, - buildPostItemMembershipRoute, buildGetMemberRoute, buildPostManyItemMembershipsRoute, ITEMS_ROUTE, @@ -96,6 +96,7 @@ const { buildPostUserCSVUploadRoute, buildGetPublishedItemsForMemberRoute, buildItemPublishRoute, + buildGetPublicationStatusRoute, buildUpdateMemberPasswordRoute, buildPostItemValidationRoute, buildGetShortLinkAvailableRoute, @@ -595,11 +596,7 @@ export const mockPostItemMembership = ( cy.intercept( { method: HttpMethod.Post, - url: new RegExp( - `${API_HOST}/${parseStringToRegExp( - buildPostItemMembershipRoute(ID_FORMAT), - )}`, - ), + url: `${API_HOST}/item-memberships?*`, }, ({ reply, body }) => { if (shouldThrowError) { @@ -1908,6 +1905,17 @@ export const mockUploadInvitationCSV = ( ).as('uploadCSV'); }; +export const mockGetPublicationStatus = (status: PublicationStatus): void => { + const interceptingPathFormat = buildGetPublicationStatusRoute(ID_FORMAT); + cy.intercept( + { + method: HttpMethod.Get, + url: new RegExp(`${API_HOST}/${interceptingPathFormat}`), + }, + ({ reply }) => reply(status), + ).as('getPublicationStatus'); +}; + export const mockPublishItem = (items: ItemForTest[]): void => { const interceptingPathFormat = buildItemPublishRoute(ID_FORMAT); cy.intercept( diff --git a/package.json b/package.json index be0692e7b..f78ee7683 100644 --- a/package.json +++ b/package.json @@ -21,8 +21,8 @@ "@emotion/styled": "11.11.5", "@graasp/chatbox": "3.1.0", "@graasp/map": "1.16.0", - "@graasp/query-client": "3.15.2", - "@graasp/sdk": "4.18.0", + "@graasp/query-client": "3.16.0", + "@graasp/sdk": "4.19.0", "@graasp/translations": "1.32.0", "@graasp/ui": "4.21.0", "@mui/icons-material": "5.16.4", diff --git a/src/components/hooks/usePublicationStatus.tsx b/src/components/hooks/usePublicationStatus.tsx deleted file mode 100644 index f693fdc8b..000000000 --- a/src/components/hooks/usePublicationStatus.tsx +++ /dev/null @@ -1,140 +0,0 @@ -import { useEffect, useState } from 'react'; - -import { - ItemPublished, - ItemTypeUnion, - ItemValidation, - ItemValidationGroup, - ItemValidationStatus, - PackedItem, - PublishableItemTypeChecker, -} from '@graasp/sdk'; - -import groupBy from 'lodash.groupby'; - -import { hooks } from '@/config/queryClient'; -import { PublicationStatus } from '@/types/publication'; - -const { useLastItemValidationGroup, useItemPublishedInformation } = hooks; - -const containValidationStatus = ( - mapByStatus: { [status: string]: ItemValidation[] }, - status: ItemValidationStatus, -) => (mapByStatus[status] ?? []).length > 0; - -const isValidationOutdated = ({ - item, - validationGroup, -}: { - item: PackedItem; - validationGroup?: ItemValidationGroup; -}) => validationGroup && validationGroup.createdAt <= item.updatedAt; - -const computeValidationSuccess = ({ - publishedEntry, -}: { - publishedEntry?: ItemPublished; -}) => { - if (publishedEntry) { - return PublicationStatus.Published; - } - - return PublicationStatus.ReadyToPublish; -}; - -const isUnpublished = (validationGroup?: ItemValidationGroup) => - !validationGroup; - -const isNotPublic = ({ - item, - publishedEntry, -}: { - item: PackedItem; - publishedEntry?: ItemPublished; -}) => !item.public && Boolean(publishedEntry); - -const isPublishedChildren = ({ - item, - publishedEntry, -}: { - item: PackedItem; - publishedEntry?: ItemPublished; -}) => Boolean(publishedEntry) && publishedEntry?.item?.path !== item?.path; - -const isTypeNotAllowedToBePublished = (itemType: ItemTypeUnion) => - !PublishableItemTypeChecker.isItemTypeAllowedToBePublished(itemType); - -type Props = { item: PackedItem }; -type UsePublicationStatus = { - status: PublicationStatus; - isLoading: boolean; - isinitialLoading: boolean; -}; - -const computePublicationStatus = ({ - item, - publishedEntry, - validationGroup, -}: { - item: PackedItem; - publishedEntry?: ItemPublished; - validationGroup?: ItemValidationGroup; -}): PublicationStatus => { - const mapByStatus = groupBy( - validationGroup?.itemValidations, - ({ status }) => status, - ); - - switch (true) { - case isPublishedChildren({ item, publishedEntry }): - return PublicationStatus.PublishedChildren; - case isTypeNotAllowedToBePublished(item.type): - return PublicationStatus.ItemTypeNotAllowed; - case isUnpublished(validationGroup): - return PublicationStatus.Unpublished; - case isValidationOutdated({ item, validationGroup }): - return PublicationStatus.Outdated; - case containValidationStatus(mapByStatus, ItemValidationStatus.Failure): - return PublicationStatus.Invalid; - case containValidationStatus(mapByStatus, ItemValidationStatus.Pending): - return PublicationStatus.Pending; - case isNotPublic({ item, publishedEntry }): - return PublicationStatus.NotPublic; - case containValidationStatus(mapByStatus, ItemValidationStatus.Success): - return computeValidationSuccess({ publishedEntry }); - default: - return PublicationStatus.Invalid; - } -}; - -export const usePublicationStatus = ({ item }: Props): UsePublicationStatus => { - const { data: itemPublishedEntry, isLoading: isPublishedLoading } = - useItemPublishedInformation({ - itemId: item.id, - }); - const { data: lastItemValidationGroup, isLoading: isValidationLoading } = - useLastItemValidationGroup(item.id); - const [status, setStatus] = useState(); - const isLoading = isPublishedLoading || isValidationLoading; - const isinitialLoading = isLoading && !status; - - useEffect(() => { - if (!isLoading) { - setStatus( - computePublicationStatus({ - item, - publishedEntry: itemPublishedEntry ?? undefined, - validationGroup: lastItemValidationGroup, - }), - ); - } - }, [itemPublishedEntry, lastItemValidationGroup, item, isLoading]); - - return { - status: status ?? PublicationStatus.Unpublished, - isLoading, - isinitialLoading, - }; -}; - -export default usePublicationStatus; diff --git a/src/components/item/publish/CoEditorsContainer.tsx b/src/components/item/publish/CoEditorsContainer.tsx index 8c9c49b86..61f0f50f5 100644 --- a/src/components/item/publish/CoEditorsContainer.tsx +++ b/src/components/item/publish/CoEditorsContainer.tsx @@ -2,18 +2,16 @@ import { useEffect, useState } from 'react'; import { Checkbox, FormControlLabel, Stack, Typography } from '@mui/material'; -import { PackedItem } from '@graasp/sdk'; +import { PackedItem, PublicationStatus } from '@graasp/sdk'; import { useDataSyncContext } from '@/components/context/DataSyncContext'; -import usePublicationStatus from '@/components/hooks/usePublicationStatus'; import { useBuilderTranslation } from '@/config/i18n'; -import { mutations } from '@/config/queryClient'; +import { hooks, mutations } from '@/config/queryClient'; import { CO_EDITOR_SETTINGS_CHECKBOX_ID, EMAIL_NOTIFICATION_CHECKBOX, } from '@/config/selectors'; import { BUILDER } from '@/langs/constants'; -import { PublicationStatus } from '@/types/publication'; const SYNC_STATUS_KEY = 'PublishCoEditors'; @@ -23,6 +21,8 @@ type Props = { onNotificationChanged: (enabled: boolean) => void; }; +const { usePublicationStatus } = hooks; + export const CoEditorsContainer = ({ item, notifyCoEditors, @@ -30,7 +30,7 @@ export const CoEditorsContainer = ({ }: Props): JSX.Element | null => { const { t } = useBuilderTranslation(); const { computeStatusFor } = useDataSyncContext(); - const { status } = usePublicationStatus({ item }); + const { data: status } = usePublicationStatus(item.id); const { settings, id: itemId, name: itemName } = item; const [displayCoEditors, setDisplayCoEditors] = useState( settings.displayCoEditors ?? false, @@ -73,7 +73,7 @@ export const CoEditorsContainer = ({ const handleNotifyCoEditorsChange = (isChecked: boolean): void => onNotificationChanged(isChecked); - if (hiddenStatus.includes(status)) { + if (!status || hiddenStatus.includes(status)) { return null; } diff --git a/src/components/item/publish/ItemPublishTab.tsx b/src/components/item/publish/ItemPublishTab.tsx index e7680816e..89425c15b 100644 --- a/src/components/item/publish/ItemPublishTab.tsx +++ b/src/components/item/publish/ItemPublishTab.tsx @@ -3,6 +3,7 @@ import { useOutletContext } from 'react-router-dom'; import { Container, Stack, Typography, useMediaQuery } from '@mui/material'; +import { PublicationStatus } from '@graasp/sdk'; import { Loader, theme } from '@graasp/ui'; import SyncIcon from '@/components/common/SyncIcon'; @@ -11,7 +12,6 @@ import { DataSyncContextProvider, useDataSyncContext, } from '@/components/context/DataSyncContext'; -import usePublicationStatus from '@/components/hooks/usePublicationStatus'; import CategoriesContainer from '@/components/item/publish/CategoriesContainer'; import CoEditorsContainer from '@/components/item/publish/CoEditorsContainer'; import EditItemDescription from '@/components/item/publish/EditItemDescription'; @@ -21,9 +21,9 @@ import PublicationStatusComponent from '@/components/item/publish/PublicationSta import PublicationThumbnail from '@/components/item/publish/PublicationThumbnail'; import { OutletType } from '@/components/pages/item/type'; import { useBuilderTranslation } from '@/config/i18n'; +import { hooks } from '@/config/queryClient'; import { BUILDER } from '@/langs/constants'; import { SomeBreakPoints } from '@/types/breakpoint'; -import { PublicationStatus } from '@/types/publication'; import EditItemName from './EditItemName'; import CustomizedTags from './customizedTags/CustomizedTags'; @@ -31,6 +31,8 @@ import PublicationButtonSelector from './publicationButtons/PublicationButtonSel type StackOrder = { order?: number | SomeBreakPoints }; +const { usePublicationStatus } = hooks; + const ItemPublishTab = (): JSX.Element => { const { t } = useBuilderTranslation(); const { item, canAdmin } = useOutletContext(); @@ -38,11 +40,9 @@ const ItemPublishTab = (): JSX.Element => { const isMobile = useMediaQuery(theme.breakpoints.down('md')); const { status } = useDataSyncContext(); const { - status: publicationStatus, - isinitialLoading: isPublicationStatusLoading, - } = usePublicationStatus({ - item, - }); + data: publicationStatus, + isInitialLoading: isPublicationStatusLoading, + } = usePublicationStatus(item.id); const [notifyCoEditors, setNotifyCoEditors] = useState(false); @@ -142,7 +142,10 @@ const ItemPublishTab = (): JSX.Element => { ); const buildView = () => { - if (publicationStatus === PublicationStatus.ItemTypeNotAllowed) { + if ( + !publicationStatus || + publicationStatus === PublicationStatus.ItemTypeNotAllowed + ) { return buildPublicationStack(); } diff --git a/src/components/item/publish/PublicationStatusComponent.tsx b/src/components/item/publish/PublicationStatusComponent.tsx index a232b3a2f..00ae6bf9b 100644 --- a/src/components/item/publish/PublicationStatusComponent.tsx +++ b/src/components/item/publish/PublicationStatusComponent.tsx @@ -8,14 +8,13 @@ import PendingActionsIcon from '@mui/icons-material/PendingActions'; import PublicOffIcon from '@mui/icons-material/PublicOff'; import { Chip, ChipProps, CircularProgress } from '@mui/material'; -import { PackedItem } from '@graasp/sdk'; +import { PackedItem, PublicationStatus } from '@graasp/sdk'; import { useBuilderTranslation, useEnumsTranslation } from '@/config/i18n'; +import { hooks } from '@/config/queryClient'; import { buildPublicationStatus } from '@/config/selectors'; import { BUILDER } from '@/langs/constants'; -import { PublicationStatus, PublicationStatusMap } from '@/types/publication'; - -import usePublicationStatus from '../../hooks/usePublicationStatus'; +import { PublicationStatusMap } from '@/types/publication'; function capitalizeFirstLetter(text: string) { return text.charAt(0).toUpperCase() + text.slice(1); @@ -30,14 +29,14 @@ type PublicationComponentMap = PublicationStatusMap<{ type Props = { item: PackedItem; }; - +const { usePublicationStatus } = hooks; export const PublicationStatusComponent = ({ item }: Props): JSX.Element => { const { t } = useBuilderTranslation(); const { t: translateEnum } = useEnumsTranslation(); - const { status, isinitialLoading } = usePublicationStatus({ item }); + const { data: status, isInitialLoading } = usePublicationStatus(item.id); const translatedType = capitalizeFirstLetter(translateEnum(item.type)); - if (isinitialLoading) { + if (isInitialLoading) { return ( } @@ -48,6 +47,17 @@ export const PublicationStatusComponent = ({ item }: Props): JSX.Element => { ); } + if (!status) { + return ( + } + label={t(BUILDER.LIBRARY_SETTINGS_PUBLICATION_STATUS_UNKOWN)} + variant="outlined" + color="error" + /> + ); + } + const chipMap: PublicationComponentMap = { [PublicationStatus.Published]: { icon: , diff --git a/src/components/item/publish/publicationButtons/InvalidButton.tsx b/src/components/item/publish/publicationButtons/InvalidButton.tsx index 95e41e932..783a63228 100644 --- a/src/components/item/publish/publicationButtons/InvalidButton.tsx +++ b/src/components/item/publish/publicationButtons/InvalidButton.tsx @@ -1,6 +1,6 @@ import { Alert, LoadingButton } from '@mui/lab'; -import { PackedItem } from '@graasp/sdk'; +import { PackedItem, PublicationStatus } from '@graasp/sdk'; import useModalStatus from '@/components/hooks/useModalStatus'; import { ADMIN_CONTACT } from '@/config/constants'; @@ -8,7 +8,6 @@ import { useBuilderTranslation } from '@/config/i18n'; import { mutations } from '@/config/queryClient'; import { buildItemPublicationButton } from '@/config/selectors'; import { BUILDER } from '@/langs/constants'; -import { PublicationStatus } from '@/types/publication'; import PublicVisibilityModal from '../PublicVisibilityModal'; import PublicationButton from './PublicationButton'; diff --git a/src/components/item/publish/publicationButtons/NotPublicButton.tsx b/src/components/item/publish/publicationButtons/NotPublicButton.tsx index 23643648b..9cfb3d4aa 100644 --- a/src/components/item/publish/publicationButtons/NotPublicButton.tsx +++ b/src/components/item/publish/publicationButtons/NotPublicButton.tsx @@ -1,12 +1,11 @@ import { Alert, LoadingButton } from '@mui/lab'; -import { PackedItem } from '@graasp/sdk'; +import { PackedItem, PublicationStatus } from '@graasp/sdk'; import useModalStatus from '@/components/hooks/useModalStatus'; import { useBuilderTranslation } from '@/config/i18n'; import { buildItemPublicationButton } from '@/config/selectors'; import { BUILDER } from '@/langs/constants'; -import { PublicationStatus } from '@/types/publication'; import PublicVisibilityModal from '../PublicVisibilityModal'; import PublicationButton from './PublicationButton'; diff --git a/src/components/item/publish/publicationButtons/OutdatedButton.tsx b/src/components/item/publish/publicationButtons/OutdatedButton.tsx index 200792304..668254f02 100644 --- a/src/components/item/publish/publicationButtons/OutdatedButton.tsx +++ b/src/components/item/publish/publicationButtons/OutdatedButton.tsx @@ -1,12 +1,11 @@ import { Alert, LoadingButton } from '@mui/lab'; -import { PackedItem } from '@graasp/sdk'; +import { PackedItem, PublicationStatus } from '@graasp/sdk'; import { useBuilderTranslation } from '@/config/i18n'; import { mutations } from '@/config/queryClient'; import { buildItemPublicationButton } from '@/config/selectors'; import { BUILDER } from '@/langs/constants'; -import { PublicationStatus } from '@/types/publication'; import PublicationButton from './PublicationButton'; diff --git a/src/components/item/publish/publicationButtons/PublicationButtonSelector.tsx b/src/components/item/publish/publicationButtons/PublicationButtonSelector.tsx index 926f29a2b..0f33cb95f 100644 --- a/src/components/item/publish/publicationButtons/PublicationButtonSelector.tsx +++ b/src/components/item/publish/publicationButtons/PublicationButtonSelector.tsx @@ -1,9 +1,8 @@ import { ReactNode } from 'react'; -import { PackedItem } from '@graasp/sdk'; +import { PackedItem, PublicationStatus } from '@graasp/sdk'; -import { usePublicationStatus } from '@/components/hooks/usePublicationStatus'; -import { PublicationStatus } from '@/types/publication'; +import { hooks } from '@/config/queryClient'; import InvalidButton from './InvalidButton'; import NotAllowedItemTypeButton from './NotAllowedItemTypeButton'; @@ -20,12 +19,14 @@ type Props = { notifyCoEditors: boolean; }; +const { usePublicationStatus } = hooks; + export const PublicationButtonSelector = ({ item, notifyCoEditors, }: Props): ReactNode | undefined => { - const { status, isinitialLoading: isStatusFirstLoading } = - usePublicationStatus({ item }); + const { data: status, isInitialLoading: isStatusFirstLoading } = + usePublicationStatus(item.id); switch (status) { case PublicationStatus.Unpublished: diff --git a/src/components/item/publish/publicationButtons/PublishedButton.tsx b/src/components/item/publish/publicationButtons/PublishedButton.tsx index 66dda7802..e80655fdc 100644 --- a/src/components/item/publish/publicationButtons/PublishedButton.tsx +++ b/src/components/item/publish/publicationButtons/PublishedButton.tsx @@ -2,13 +2,17 @@ import LinkIcon from '@mui/icons-material/Link'; import { LoadingButton } from '@mui/lab'; import { Alert, Button } from '@mui/material'; -import { ClientHostManager, Context, PackedItem } from '@graasp/sdk'; +import { + ClientHostManager, + Context, + PackedItem, + PublicationStatus, +} from '@graasp/sdk'; import { useBuilderTranslation } from '@/config/i18n'; import { mutations } from '@/config/queryClient'; import { buildItemPublicationButton } from '@/config/selectors'; import { BUILDER } from '@/langs/constants'; -import { PublicationStatus } from '@/types/publication'; import PublicationButton from './PublicationButton'; diff --git a/src/components/item/publish/publicationButtons/ReadyToPublishButton.tsx b/src/components/item/publish/publicationButtons/ReadyToPublishButton.tsx index 7dc6da663..7128857a8 100644 --- a/src/components/item/publish/publicationButtons/ReadyToPublishButton.tsx +++ b/src/components/item/publish/publicationButtons/ReadyToPublishButton.tsx @@ -1,14 +1,13 @@ import { LoadingButton } from '@mui/lab'; import { Alert } from '@mui/material'; -import { PackedItem } from '@graasp/sdk'; +import { PackedItem, PublicationStatus } from '@graasp/sdk'; import useModalStatus from '@/components/hooks/useModalStatus'; import { useBuilderTranslation } from '@/config/i18n'; import { mutations } from '@/config/queryClient'; import { buildItemPublicationButton } from '@/config/selectors'; import { BUILDER } from '@/langs/constants'; -import { PublicationStatus } from '@/types/publication'; import PublicVisibilityModal from '../PublicVisibilityModal'; import PublicationButton from './PublicationButton'; diff --git a/src/components/item/publish/publicationButtons/UnpublishedButton.tsx b/src/components/item/publish/publicationButtons/UnpublishedButton.tsx index 05cea4583..c484b8b5b 100644 --- a/src/components/item/publish/publicationButtons/UnpublishedButton.tsx +++ b/src/components/item/publish/publicationButtons/UnpublishedButton.tsx @@ -1,13 +1,12 @@ import { LoadingButton } from '@mui/lab'; -import { PackedItem } from '@graasp/sdk'; +import { PackedItem, PublicationStatus } from '@graasp/sdk'; import useModalStatus from '@/components/hooks/useModalStatus'; import { useBuilderTranslation } from '@/config/i18n'; import { mutations } from '@/config/queryClient'; import { buildItemPublicationButton } from '@/config/selectors'; import { BUILDER } from '@/langs/constants'; -import { PublicationStatus } from '@/types/publication'; import PublicVisibilityModal from '../PublicVisibilityModal'; import PublicationButton from './PublicationButton'; diff --git a/src/config/selectors.ts b/src/config/selectors.ts index 108891101..ae2044f4e 100644 --- a/src/config/selectors.ts +++ b/src/config/selectors.ts @@ -1,8 +1,10 @@ // todo: this makes tests slow because it compiles ui everytime // import { Platform } from '@graasp/ui'; -import { DescriptionPlacementType, ShortLink } from '@graasp/sdk'; - -import { PublicationStatus } from '@/types/publication'; +import { + DescriptionPlacementType, + PublicationStatus, + ShortLink, +} from '@graasp/sdk'; export const SHARED_ITEMS_ROOT_CONTAINER = 'sharedItemsPageRootContainer'; export const RECYCLED_ITEMS_ROOT_CONTAINER = 'recycledItemsPageRootContainer'; diff --git a/src/langs/constants.ts b/src/langs/constants.ts index 4a9c627f9..4847d89ce 100644 --- a/src/langs/constants.ts +++ b/src/langs/constants.ts @@ -169,6 +169,8 @@ export const BUILDER = { 'LIBRARY_SETTINGS_PUBLICATION_STATUS_OUTDATED', LIBRARY_SETTINGS_PUBLICATION_STATUS_UNPUBLISHED: 'LIBRARY_SETTINGS_PUBLICATION_STATUS_UNPUBLISHED', + LIBRARY_SETTINGS_PUBLICATION_STATUS_UNKOWN: + 'LIBRARY_SETTINGS_PUBLICATION_STATUS_UNKOWN', LIBRARY_SETTINGS_PUBLICATION_STATUS_TYPE_NOT_ALLOWED: 'LIBRARY_SETTINGS_PUBLICATION_STATUS_TYPE_NOT_ALLOWED', LIBRARY_SETTINGS_ITEM_NAME_CANNOT_BE_EMPTY: diff --git a/src/langs/en.json b/src/langs/en.json index 86792724d..03752c490 100644 --- a/src/langs/en.json +++ b/src/langs/en.json @@ -221,6 +221,7 @@ "LIBRARY_SETTINGS_PUBLICATION_STATUS_INVALID": "Invalid", "LIBRARY_SETTINGS_PUBLICATION_STATUS_OUTDATED": "Outdated", "LIBRARY_SETTINGS_PUBLICATION_STATUS_UNPUBLISHED": "Unpublished", + "LIBRARY_SETTINGS_PUBLICATION_STATUS_UNKOWN": "Unknown", "LIBRARY_SETTINGS_PUBLICATION_STATUS_TYPE_NOT_ALLOWED": "{{itemType}} cannot be published", "LIBRARY_SETTINGS_ITEM_NAME_CANNOT_BE_EMPTY": "The item's name can't be empty", "PUBLIC_VISIBILITY_MODAL_TITLE": "Item visibility", diff --git a/src/types/publication.ts b/src/types/publication.ts index 41330ef9f..1c1d4c215 100644 --- a/src/types/publication.ts +++ b/src/types/publication.ts @@ -1,14 +1,4 @@ -export enum PublicationStatus { - Unpublished = 'unpublished', - Published = 'published', - PublishedChildren = 'publishedChildren', - ReadyToPublish = 'readyToPublish', - Pending = 'pending', - Invalid = 'invalid', - Outdated = 'outdated', - NotPublic = 'notPublic', - ItemTypeNotAllowed = 'itemTypeNotAllowed', -} +import { PublicationStatus } from '@graasp/sdk'; export type PublicationStatusMap = { [status in PublicationStatus]: T; diff --git a/yarn.lock b/yarn.lock index f1161bf51..d888d580a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1706,26 +1706,25 @@ __metadata: languageName: node linkType: hard -"@graasp/query-client@npm:3.15.2": - version: 3.15.2 - resolution: "@graasp/query-client@npm:3.15.2" +"@graasp/query-client@npm:3.16.0": + version: 3.16.0 + resolution: "@graasp/query-client@npm:3.16.0" dependencies: "@tanstack/react-query": "npm:4.36.1" "@tanstack/react-query-devtools": "npm:4.36.1" axios: "npm:1.7.2" http-status-codes: "npm:2.3.0" - qs: "npm:6.12.1" peerDependencies: "@graasp/sdk": ^4.0.0 "@graasp/translations": "*" react: ^18.0.0 - checksum: 10/137cbbdc721b244ee85b3e3a658b0aef3ecfd816eddafaaa8408783d5a5d97680303b2bde61d1b4de9939562b556c6224a18f0d1891c8f27cd44d7983a923c2e + checksum: 10/cf24eebd6ab11a6f12d8b9ff3f198bcfd141ccb73884e142320a7a81d689f15708dd5169bde31ce3dfc860819883f0439e5381e4d8afc490bb9abd1df675e069 languageName: node linkType: hard -"@graasp/sdk@npm:4.18.0": - version: 4.18.0 - resolution: "@graasp/sdk@npm:4.18.0" +"@graasp/sdk@npm:4.19.0": + version: 4.19.0 + resolution: "@graasp/sdk@npm:4.19.0" dependencies: "@faker-js/faker": "npm:8.4.1" filesize: "npm:10.1.4" @@ -1734,7 +1733,7 @@ __metadata: peerDependencies: date-fns: ^3 uuid: ^9 || ^10.0.0 - checksum: 10/9a74d520c652429e3432df2a5321179c53628c82067dfd395599cf77558e57100e40cb35dc35065e4314afb436e467512fe3586d15b113923218aacdfb60dc7d + checksum: 10/d2fb382f5669ab1b8e265612208d6766672be8b6fa833fe1af8e4f17d2c3f7f384e4bf3f5fd004ec76c8c1ab1ad382c37730477e90ec1ae85b3079ca6a8e68aa languageName: node linkType: hard @@ -8030,8 +8029,8 @@ __metadata: "@emotion/styled": "npm:11.11.5" "@graasp/chatbox": "npm:3.1.0" "@graasp/map": "npm:1.16.0" - "@graasp/query-client": "npm:3.15.2" - "@graasp/sdk": "npm:4.18.0" + "@graasp/query-client": "npm:3.16.0" + "@graasp/sdk": "npm:4.19.0" "@graasp/translations": "npm:1.32.0" "@graasp/ui": "npm:4.21.0" "@mui/icons-material": "npm:5.16.4" @@ -11599,15 +11598,6 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.12.1": - version: 6.12.1 - resolution: "qs@npm:6.12.1" - dependencies: - side-channel: "npm:^1.0.6" - checksum: 10/035bcad2a1ab0175bac7a74c904c15913bdac252834149ccff988c93a51de02642fe7be10e43058ba4dc4094bb28ce9b59d12b9e91d40997f445cfde3ecc1c29 - languageName: node - linkType: hard - "qs@npm:^6.10.0": version: 6.11.2 resolution: "qs@npm:6.11.2"