From 4c782ed1683d5ba6c44c1f3a249a0f7ffbe808f2 Mon Sep 17 00:00:00 2001 From: gregor <gregor.schulz@holi.social> Date: Wed, 26 Feb 2025 10:42:26 +0100 Subject: [PATCH] fix space linkhub edit form handling --- .../spaces/linkHub/EditDigitalTool.tsx | 73 ++++++++----------- 1 file changed, 32 insertions(+), 41 deletions(-) diff --git a/core/screens/spaces/linkHub/EditDigitalTool.tsx b/core/screens/spaces/linkHub/EditDigitalTool.tsx index 59a578123d..2bf8ce3569 100644 --- a/core/screens/spaces/linkHub/EditDigitalTool.tsx +++ b/core/screens/spaces/linkHub/EditDigitalTool.tsx @@ -17,9 +17,9 @@ import DigitalToolInputForm, { COLLECTION_TYPES, } from '@holi/core/screens/spaces/linkHub/components/DigitalToolInputForm' import { - updateCollaborationToolMutation, type UpdateCollaborationToolResponse, UpdateCollaborationToolSchema, + updateCollaborationToolMutation, } from '@holi/core/screens/spaces/linkHub/mutations' import { spaceByIdQuery } from '@holi/core/screens/spaces/queries' import { SpaceConnectionType } from '@holi/core/screens/spaces/types' @@ -39,14 +39,13 @@ const { useParam } = createParamHooks<EditDigitalToolParams>() const EditDigitalTool = () => { const [spaceIdOrName] = useParam('spaceIdOrName') const [toolId] = useParam('toolIdOrName') - const { navigateBack, replaceRoute } = useRouting() + const { navigateBack } = useRouting() const setScreenOptions = useSetScreenOptions() const { t } = useTranslation() const [url, setUrl] = useState('') const [urlError, setUrlError] = useState<string | undefined>() const [title, setTitle] = useState('') const [description, setDescription] = useState<string | undefined>('') - const [saveButtonDisabled, setSaveButtonDisabled] = useState(true) const [thumbnail, setThumbnail] = useState<HoliImageInfo | undefined>() const [thumbnailBlurhash, setCurrentThumbnailBlurhash] = useState<string | undefined>() const [selectedCollection, setSelectedCollection] = useState<HoliModalSelectOption | undefined>() @@ -60,14 +59,33 @@ const EditDigitalTool = () => { const { loading: loadingSpace, error: errorSpace, space } = useSpace(spaceIdOrName) - const { handleGraphQLError } = useFieldErrors({ - handledFieldErrors: ['url', 'title', 'description'], - }) + useEffect(() => { + if (space) { + const collaborationTools = space ? space.collaborationTools : [] + if (collaborationTools && collaborationTools.length > 0 && toolId) { + const digitalTool = collaborationTools.find((tool) => tool.id === toolId) + const collectionType = COLLECTION_TYPES.filter( + (collection_type) => collection_type === digitalTool?.collectionType + )[0] + const toolCollectionType = { + id: collectionType, + selected: true, + title: t(`spaces.toolKit.linkhub.collection.${collectionType}`), + } + setUrl(digitalTool?.url ?? '') + setTitle(digitalTool?.title ?? '') + setDescription(digitalTool?.description ?? '') + setSelectedCollection(toolCollectionType ?? '') + setCurrentThumbnail(digitalTool?.thumbnail ?? '') + setCurrentThumbnailBlurhash(digitalTool?.thumbnailBlurhash) + } + } + }, [space, toolId, t]) const [updateCollaborationTool] = useMutation<UpdateCollaborationToolResponse>(updateCollaborationToolMutation, { onCompleted: () => { openToast(t('spaces.digitalTool.edit.success'), HoliToastType.SUCCESS) - navigateBack() + return navigateBack() }, onError: (error) => { if (isMaliciousUrlError(error)) { @@ -79,6 +97,10 @@ const EditDigitalTool = () => { refetchQueries: [{ query: spaceByIdQuery, variables: { idOrName: spaceIdOrName } }], }) + const { handleGraphQLError } = useFieldErrors({ + handledFieldErrors: ['url', 'title', 'description'], + }) + const onSave = () => { return updateCollaborationTool({ variables: { @@ -95,7 +117,7 @@ const EditDigitalTool = () => { } useEffect(() => { - if (!validateUrl(url)) { + if (url.length > 0 && !validateUrl(url)) { setUrlError(t('global.validation.url.invalid')) } else { setUrlError(undefined) @@ -116,39 +138,6 @@ const EditDigitalTool = () => { } }, [t, loadingSpace, setScreenOptions, colors.background20]) - useEffect(() => { - if (url.length > 0 && title.length > 0 && !!selectedCollection && inputValid) { - setSaveButtonDisabled(false) - } - }, [url, title, selectedCollection, inputValid]) - - useEffect(() => { - if (space) { - const collaborationTools = space ? space.collaborationTools : [] - if (collaborationTools && collaborationTools.length > 0 && toolId) { - const digitalTool = collaborationTools.find((tool) => tool.id === toolId) - if (!digitalTool) { - replaceRoute('/404') - return - } - const collectionType = COLLECTION_TYPES.filter( - (collection_type) => collection_type === digitalTool.collectionType - )[0] - const toolCollectionType = { - id: collectionType, - selected: true, - title: t(`spaces.toolKit.linkhub.collection.${collectionType}`), - } - setUrl(digitalTool.url) - setTitle(digitalTool.title) - setDescription(digitalTool.description) - setSelectedCollection(toolCollectionType) - setCurrentThumbnail(digitalTool.thumbnail) - setCurrentThumbnailBlurhash(digitalTool.thumbnailBlurhash) - } - } - }, [space, toolId, t, replaceRoute]) - useEffect(() => { const resultSchema = UpdateCollaborationToolSchema.safeParse({ spaceId: space?.id, @@ -174,6 +163,8 @@ const EditDigitalTool = () => { return <></> } + const saveButtonDisabled = !(url.length > 0 && title.length > 0 && !!selectedCollection && inputValid) + return ( <PermissionsGuard permissionType={PermissionsType.SPACES} -- GitLab