diff --git a/src/components/item/form/AppForm.tsx b/src/components/item/form/AppForm.tsx index 72bbde0d5..df17dee96 100644 --- a/src/components/item/form/AppForm.tsx +++ b/src/components/item/form/AppForm.tsx @@ -3,11 +3,12 @@ import { ChangeEventHandler, useState } from 'react'; import { Add, ArrowBack } from '@mui/icons-material'; import { Alert, Stack, TextField, Typography, alpha } from '@mui/material'; -import { DiscriminatedItem, ItemType, buildAppExtra } from '@graasp/sdk'; +import { App, DiscriminatedItem, ItemType, buildAppExtra } from '@graasp/sdk'; import { Button } from '@graasp/ui'; import AppCard from '@/components/main/AppCard'; -import { CUSTOM_APP_CYPRESS_ID, CUSTOM_APP_URL_ID } from '@/config/selectors'; +import { CUSTOM_APP_BUTTON_ID, CUSTOM_APP_URL_ID } from '@/config/selectors'; +import defaultImage from '@/resources/defaultApp.png'; import { sortByName } from '@/utils/item'; import { useBuilderTranslation } from '../../../config/i18n'; @@ -17,78 +18,92 @@ import NameForm from './NameForm'; type AppGridProps = { showFull: boolean; - setHasMostUsedData: (value: boolean) => void; currentUrl: string; handleSelection: (value: null | { name: string; url: string }) => void; searchQuery?: string; }; +type MostUsedApp = { + url: string; + name: string; + count: number; +}; + +type AppCardListProps = { + apps: (App | MostUsedApp)[]; + currentUrl: string; + handleSelection: (value: null | { name: string; url: string }) => void; + searchQuery?: string; +}; + +const AppCardList = ({ + apps, + currentUrl, + handleSelection, + searchQuery, +}: AppCardListProps) => { + // filter out with search query + const dataToShow = searchQuery + ? apps.filter((app) => + app.name.toLowerCase().includes(searchQuery.toLowerCase()), + ) + : apps; + dataToShow.sort(sortByName); + return ( + <> + {dataToShow.map((ele) => ( + { + if (ele.url === currentUrl) { + // reset fields + handleSelection(null); + } else { + handleSelection({ url: ele.url, name: ele.name }); + } + }} + /> + ))} + + ); +}; + const AppGrid = ({ showFull, - setHasMostUsedData, currentUrl, handleSelection, searchQuery, }: AppGridProps): JSX.Element | JSX.Element[] => { const { useApps, useMostUsedApps } = hooks; - const { data, isLoading } = useApps(); - const { data: dataMostUsed } = useMostUsedApps(); + const { data: allApps, isLoading } = useApps(); + const { data: mostUsedApps } = useMostUsedApps(); const { t: translateBuilder } = useBuilderTranslation(); // at first, try to present the user the 'most used' data - if (dataMostUsed && dataMostUsed.length !== 0 && !showFull) { - setHasMostUsedData(true); + if (mostUsedApps && mostUsedApps.length !== 0 && !showFull) { return ( - <> - {dataMostUsed.map((ele) => ( - { - if (ele.url === currentUrl) { - // reset fields - handleSelection(null); - } else { - handleSelection({ url: ele.url, name: ele.name }); - } - }} - /> - ))} - + ); } - if (data) { - // filter out with search query - const dataToShow = searchQuery - ? data.filter((d) => - d.name.toLowerCase().includes(searchQuery.toLowerCase()), - ) - : data; - dataToShow.sort(sortByName); - + if (allApps) { return ( - <> - {dataToShow.map((ele) => ( - { - if (ele.url === currentUrl) { - // reset fields - handleSelection(null); - } else { - handleSelection({ url: ele.url, name: ele.name }); - } - }} - /> - ))} - + ); } @@ -112,7 +127,6 @@ type Props = { const AppForm = ({ onChange, updatedProperties = {} }: Props): JSX.Element => { const [showFull, setShowFull] = useState(false); - const [hasMostUsedData, setHasMostUsedData] = useState(false); const { t: translateBuilder } = useBuilderTranslation(); const [isCustomApp, setIsCustomApp] = useState(false); @@ -196,10 +210,10 @@ const AppForm = ({ onChange, updatedProperties = {} }: Props): JSX.Element => { ); } return ( - + { size="small" onChange={searchAnApp} /> - + - {hasMostUsedData && !showFull + {!showFull ? translateBuilder(BUILDER.APP_SECTION_MOST_USED) : translateBuilder(BUILDER.APP_SECTION_ALL_APP)} @@ -223,44 +237,48 @@ const AppForm = ({ onChange, updatedProperties = {} }: Props): JSX.Element => { size="small" variant="text" onClick={() => setShowFull(!showFull)} - id={CUSTOM_APP_CYPRESS_ID} + id={CUSTOM_APP_BUTTON_ID} > - {hasMostUsedData && - (!showFull - ? translateBuilder(BUILDER.APP_SECTION_ALL_APP_BUTTON_TEXT) - : translateBuilder(BUILDER.APP_SECTION_MOST_USED_BUTTON_TEXT))} + {!showFull + ? translateBuilder(BUILDER.APP_SECTION_ALL_APP_BUTTON_TEXT) + : translateBuilder(BUILDER.APP_SECTION_MOST_USED_BUTTON_TEXT)} - - {translateBuilder(BUILDER.CREATE_CUSTOM_APP_LABEL)} - - + + + {translateBuilder(BUILDER.CREATE_CUSTOM_APP_LABEL)} + + +