diff --git a/.eslintrc b/.eslintrc index 9c6627a6..29fd1f83 100644 --- a/.eslintrc +++ b/.eslintrc @@ -118,15 +118,7 @@ { "allowHigherOrderFunctions": true } - ], - // "@typescript-eslint/explicit-function-return-type": [ - // "error", - // { - // "allowExpressions": true, - // "allowTypedFunctionExpressions": true, - // "allowHigherOrderFunctions": true, - // } - // ] + ] } }, { diff --git a/cypress/e2e/header.cy.ts b/cypress/e2e/header.cy.ts index e8320a56..c87ae037 100644 --- a/cypress/e2e/header.cy.ts +++ b/cypress/e2e/header.cy.ts @@ -1,10 +1,9 @@ import { HOME_PATH } from '../../src/config/paths'; import { HEADER_MEMBER_MENU_BUTTON_ID, - HEADER_MEMBER_MENU_SEE_PROFILE_BUTTON_ID, // HEADER_MEMBER_MENU_SIGN_IN_BUTTON_ID, - HEADER_MEMBER_MENU_SIGN_OUT_BUTTON_ID, // buildMemberMenuItemId, + HEADER_MEMBER_MENU_SEE_PROFILE_BUTTON_ID, + HEADER_MEMBER_MENU_SIGN_OUT_BUTTON_ID, } from '../../src/config/selectors'; -// import { MOCK_SESSIONS } from '../fixtures/members'; import { MEMBER_PROFILE_PATH, SIGN_IN_PATH } from '../support/constants'; // catch hook warning from react diff --git a/cypress/e2e/navigation.cy.ts b/cypress/e2e/navigation.cy.ts index f9636313..e898f6b5 100644 --- a/cypress/e2e/navigation.cy.ts +++ b/cypress/e2e/navigation.cy.ts @@ -27,10 +27,10 @@ describe('Navigation', () => { cy.setUpApi({ items: [...items, ...sharedItems], }); - // eslint-disable-next-line no-console - console.log(items); cy.visit('/'); + cy.wait(['@getCurrentMember', '@getOwnItems', '@getSharedItems']); + cy.get(`#${MY_ITEMS_ID} #${SHOW_MORE_ITEMS_ID}`).click(); items.forEach((i) => cy.get(`.${buildTreeItemClass(i.id)}`, { timeout: 2000 }), diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index 4c62c19e..80d1009c 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -53,7 +53,6 @@ Cypress.Commands.add( ); mockGetItemChat({ chatMessages }); mockGetItemMembershipsForItem(items, currentMember); - // mockGetPublicItem({ items: cachedItems }); mockGetItemTags(items, currentMember); @@ -61,7 +60,6 @@ Cypress.Commands.add( mockGetLoginSchemaType(items, currentMember); mockGetChildren(items, currentMember); - // mockGetPublicChildren(cachedItems); mockGetDescendants(items, currentMember); @@ -70,7 +68,6 @@ Cypress.Commands.add( mockGetCurrentMember(currentMember, getCurrentMemberError); mockDefaultDownloadFile({ items, currentMember }); - // mockPublicDefaultDownloadFile(cachedItems); mockSignOut(); @@ -140,11 +137,6 @@ declare global { getIframeDocument(iframeSelector: string): Chainable; getIframeBody(iframeSelector: string): Chainable; - // clickElementInIframe( - // iframeSelector: string, - // elementSelector: string, - // ): Chainable; - checkContentInElementInIframe( iframeSelector: string, elementSelector: string, diff --git a/cypress/support/server.ts b/cypress/support/server.ts index 3f29838c..e90ca199 100644 --- a/cypress/support/server.ts +++ b/cypress/support/server.ts @@ -118,14 +118,6 @@ const checkMemberHasAccess = ({ return { statusCode: StatusCodes.FORBIDDEN }; }; -// const checkIsPublic = (item: MockItem): { statusCode: number } | undefined => { -// const isPublic = item?.tags?.find(({ tagId }) => tagId === PUBLIC_TAG_ID); -// if (!isPublic) { -// return { statusCode: StatusCodes.UNAUTHORIZED }; -// } -// return undefined; -// }; - export const mockGetOwnItems = ({ items, currentMember, @@ -305,39 +297,6 @@ export const mockGetItemMembershipsForItem = ( ).as('getItemMemberships'); }; -// export const mockGetPublicItem = ( -// { items }: { items: MockItem[] }, -// shouldThrowError?: boolean, -// ): void => { -// cy.intercept( -// { -// method: DEFAULT_GET.method, -// url: new RegExp(`${API_HOST}/${buildGetPublicItemRoute(ID_FORMAT)}$`), -// }, -// ({ url, reply }) => { -// const itemId = url.slice(API_HOST.length).split('/')[3]; -// const item = getItemById(items, itemId); - -// // item does not exist in db -// if (!item || shouldThrowError) { -// return reply({ -// statusCode: StatusCodes.NOT_FOUND, -// }); -// } - -// const error = checkIsPublic(item); -// if (isError(error)) { -// return reply(error); -// } - -// return reply({ -// body: item, -// statusCode: StatusCodes.OK, -// }); -// }, -// ).as('getPublicItem'); -// }; - export const mockGetChildren = (items: MockItem[], member: Member): void => { cy.intercept( { @@ -400,35 +359,6 @@ export const mockGetDescendants = (items: MockItem[], member: Member): void => { ).as('getDescendants'); }; -// export const mockGetPublicChildren = (items: MockItem[]): void => { -// cy.intercept( -// { -// method: DEFAULT_GET.method, -// url: new RegExp(`${API_HOST}/p/items/${ID_FORMAT}/children`), -// }, -// ({ url, reply }) => { -// const id = url.slice(API_HOST.length).split('/')[3]; -// const item = items.find(({ id: thisId }) => id === thisId); -// // item does not exist in db -// if (!item) { -// return reply({ -// statusCode: StatusCodes.NOT_FOUND, -// }); -// } - -// const error = checkIsPublic(item); -// if (isError(error)) { -// return reply(error); -// } - -// const children = items.filter((testItem) => -// isChildOf(testItem.path, item.path), -// ); -// return reply(children); -// }, -// ).as('getPublicChildren'); -// }; - export const mockGetMemberBy = ( members: Member[], shouldThrowError?: boolean, @@ -498,49 +428,6 @@ export const mockDefaultDownloadFile = ( ).as('downloadFile'); }; -// export const mockPublicDefaultDownloadFile = ( -// items: MockItem[], -// shouldThrowError?: boolean, -// ): void => { -// cy.intercept( -// { -// method: DEFAULT_GET.method, -// url: new RegExp( -// `${API_HOST}/${buildPublicDownloadFilesRoute(ID_FORMAT)}`, -// ), -// }, -// ({ reply, url }) => { -// if (shouldThrowError) { -// return reply({ statusCode: StatusCodes.BAD_REQUEST }); -// } - -// const id = url.slice(API_HOST.length).split('/')[3]; -// const item = items.find(({ id: thisId }) => id === thisId); -// const { replyUrl } = qs.parse(url.slice(url.indexOf('?') + 1)); - -// // item does not exist in db -// if (!item) { -// return reply({ -// statusCode: StatusCodes.NOT_FOUND, -// }); -// } - -// const error = checkIsPublic(item); -// if (isError(error)) { -// return reply(error); -// } - -// // either return the file url or the fixture data -// // info: we don't test fixture data anymore since the frontend uses url only -// if (replyUrl) { -// return reply({ url: item.filepath }); -// } - -// return reply({ fixture: item.filepath }); -// }, -// ).as('publicDownloadFile'); -// }; - export const mockGetItemTags = (items: MockItem[], member: Member): void => { cy.intercept( { diff --git a/src/config/notifier.ts b/src/config/notifier.ts index cffabba2..0119f597 100644 --- a/src/config/notifier.ts +++ b/src/config/notifier.ts @@ -1,17 +1,10 @@ import { toast } from 'react-toastify'; -import { FAILURE_MESSAGES, SUCCESS_MESSAGES } from '@graasp/translations'; +import { Notifier } from '@graasp/query-client'; -import { useMessagesTranslation } from '@/config/i18n'; +// import { FAILURE_MESSAGES, SUCCESS_MESSAGES } from '@graasp/translations'; -type NotifierType = { - type: string; - payload: { error: string }; -}; - -// todo: check how this works and improve error reporting -export default ({ type, payload }: NotifierType): void => { - const { t } = useMessagesTranslation(); +const notifier: Notifier = ({ type, payload }) => { const message = null; switch (type) { // error messages @@ -22,13 +15,15 @@ export default ({ type, payload }: NotifierType): void => { // error notification if (payload?.error && message) { - const translatedMessage = - t(message) || t(FAILURE_MESSAGES.UNEXPECTED_ERROR); - toast.error(translatedMessage); + // todo: can't use translation hooks inside this function + // const translatedMessage = + // t(message) || t(FAILURE_MESSAGES.UNEXPECTED_ERROR); + toast.error(message); } // success notification else if (message) { - const translatedMessage = t(message) || t(SUCCESS_MESSAGES.DEFAULT_SUCCESS); - toast.success(translatedMessage); + // const translatedMessage = t(message) || t(SUCCESS_MESSAGES.DEFAULT_SUCCESS); + toast.success(message); } }; +export default notifier; diff --git a/src/config/queryClient.ts b/src/config/queryClient.ts index 43f3044d..bc5c61a8 100644 --- a/src/config/queryClient.ts +++ b/src/config/queryClient.ts @@ -15,9 +15,8 @@ const { API_HOST, DOMAIN, // todo: improve types - notifier: notifier as (e: unknown) => void, - // todo: re-enable once websockets work in refactor - enableWebsocket: false, + notifier, + enableWebsocket: true, defaultQueryOptions: { keepPreviousData: true, // avoid refetching when same data are closely fetched diff --git a/src/modules/common/HiddenWrapper.tsx b/src/modules/common/HiddenWrapper.tsx index 927a7869..22fb6249 100644 --- a/src/modules/common/HiddenWrapper.tsx +++ b/src/modules/common/HiddenWrapper.tsx @@ -1,7 +1,9 @@ import { Box, styled } from '@mui/material'; import { ItemRecord } from '@graasp/sdk/frontend'; +import { PLAYER } from '@graasp/translations'; +import { usePlayerTranslation } from '@/config/i18n'; import { buildHiddenWrapperId } from '@/config/selectors'; export const HIDDEN_STYLE = { @@ -23,18 +25,17 @@ const HiddenWrapper = ({ hidden: boolean; itemId: ItemRecord['id']; children: JSX.Element; -}): JSX.Element => ( - - {children} - -); +}): JSX.Element => { + const { t } = usePlayerTranslation(); + return ( + + {children} + + ); +}; export default HiddenWrapper; diff --git a/src/modules/item/Item.tsx b/src/modules/item/Item.tsx index a41d02ac..f0b0a2be 100644 --- a/src/modules/item/Item.tsx +++ b/src/modules/item/Item.tsx @@ -266,6 +266,9 @@ const ItemContent = ({ item }: ItemContentProps) => { ); return folderButton; + // todo: check that the folders are displayed as expected. + // in case everything is okay, remove the following + // // display children shortcut pinned folders // if (isShortcut && isShortcutPinned) { // return folderButton; diff --git a/src/modules/pages/ItemPage.tsx b/src/modules/pages/ItemPage.tsx index e1540323..0c69cca3 100644 --- a/src/modules/pages/ItemPage.tsx +++ b/src/modules/pages/ItemPage.tsx @@ -25,7 +25,7 @@ const ItemScreenWrapper = (rootId: string) => { const { usePostItemLogin, useSignOut } = mutations; -const ItemPage = (): JSX.Element => { +const ItemPage = (): JSX.Element | null => { const { mutate: signOut } = useSignOut(); const { mutate: itemLoginSignIn } = usePostItemLogin(); const { rootId } = useParams(); @@ -35,8 +35,7 @@ const ItemPage = (): JSX.Element => { if (!rootId) { navigate(HOME_PATH); - // TODO: return not found? - return ForbiddenContent; + return null; } const Component = ItemLoginAuthorization({ diff --git a/src/modules/tree/DynamicTreeView.tsx b/src/modules/tree/DynamicTreeView.tsx index ffaaede1..e61d604e 100644 --- a/src/modules/tree/DynamicTreeView.tsx +++ b/src/modules/tree/DynamicTreeView.tsx @@ -41,15 +41,6 @@ const DynamicTreeView = ({ const [expandedItems, setExpandedItems] = useState(initialExpendedItems); const [showAll, setShowAll] = useState(false); - // const { - // data: children, - // isLoading: isLoadingChildren, - // isError: isErrorChildren, - // } = useDescendants(rootId, { - // enabled: isFolder, - // getUpdates: isFolder, - // }); - if (isLoading) { return ; } @@ -63,11 +54,6 @@ const DynamicTreeView = ({ const onToggle = (_event: unknown, nodeIds: string[]) => setExpandedItems(nodeIds); - // show only folder items in the navigation tree - // const itemsFiltered = items?.filter((item) => - // GRAASP_MENU_ITEMS.includes(item.type), - // ); - const itemsToShow = items?.filter((item) => onlyShowContainerItems ? GRAASP_MENU_ITEMS.includes(item.type) : true, ); diff --git a/vite.config.ts b/vite.config.ts index d8f775e9..fceb2df7 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -13,7 +13,7 @@ export default ({ mode }: { mode: string }): UserConfigExport => { base: '', server: { port: parseInt(process.env.VITE_PORT, 10), - // open: true, + open: true, watch: { ignored: ['**/coverage/**'], },