From c172a44566ae6f27710c38286b0b60ea4a7f7e0a Mon Sep 17 00:00:00 2001 From: Baptiste Arnaud Date: Thu, 2 Mar 2023 08:50:04 +0100 Subject: [PATCH] :bug: (editor) Graph connectors still displayed when switching to dynamic buttons Closes #348 --- .../buttons/components/ButtonsBlockSettings.tsx | 7 ++----- .../components/Endpoints/SourceEndpoint.tsx | 16 ++++++++++++---- .../SettingsPopoverContent.tsx | 4 ++-- .../graph/providers/EndpointsProvider.tsx | 9 +++++++++ 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/apps/builder/src/features/blocks/inputs/buttons/components/ButtonsBlockSettings.tsx b/apps/builder/src/features/blocks/inputs/buttons/components/ButtonsBlockSettings.tsx index 37abdb053..62510b6fc 100644 --- a/apps/builder/src/features/blocks/inputs/buttons/components/ButtonsBlockSettings.tsx +++ b/apps/builder/src/features/blocks/inputs/buttons/components/ButtonsBlockSettings.tsx @@ -6,15 +6,12 @@ import { FormControl, FormLabel, Stack } from '@chakra-ui/react' import { ChoiceInputOptions, Variable } from 'models' import React from 'react' -type ButtonsOptionsFormProps = { +type Props = { options?: ChoiceInputOptions onOptionsChange: (options: ChoiceInputOptions) => void } -export const ButtonsOptionsForm = ({ - options, - onOptionsChange, -}: ButtonsOptionsFormProps) => { +export const ButtonsBlockSettings = ({ options, onOptionsChange }: Props) => { const handleIsMultipleChange = (isMultipleChoice: boolean) => options && onOptionsChange({ ...options, isMultipleChoice }) const handleButtonLabelChange = (buttonLabel: string) => diff --git a/apps/builder/src/features/graph/components/Endpoints/SourceEndpoint.tsx b/apps/builder/src/features/graph/components/Endpoints/SourceEndpoint.tsx index bb9bb4565..968785ea9 100644 --- a/apps/builder/src/features/graph/components/Endpoints/SourceEndpoint.tsx +++ b/apps/builder/src/features/graph/components/Endpoints/SourceEndpoint.tsx @@ -23,11 +23,13 @@ export const SourceEndpoint = ({ }: BoxProps & { source: Source }) => { + const id = source.itemId ?? source.blockId const color = useColorModeValue('blue.200', 'blue.100') const connectedColor = useColorModeValue('blue.300', 'blue.200') const bg = useColorModeValue('gray.100', 'gray.700') const { setConnectingIds, previewingEdge, graphPosition } = useGraph() - const { setSourceEndpointYOffset: addSourceEndpoint } = useEndpoints() + const { setSourceEndpointYOffset, deleteSourceEndpointYOffset } = + useEndpoints() const { groupsCoordinates } = useGroupsCoordinates() const ref = useRef(null) const [groupHeight, setGroupHeight] = useState() @@ -75,12 +77,18 @@ export const SourceEndpoint = ({ useEffect(() => { if (!endpointY) return - const id = source.itemId ?? source.blockId - addSourceEndpoint?.({ + setSourceEndpointYOffset?.({ id, y: endpointY, }) - }, [addSourceEndpoint, endpointY, source.blockId, source.itemId]) + }, [setSourceEndpointYOffset, endpointY, id]) + + useEffect( + () => () => { + deleteSourceEndpointYOffset?.(id) + }, + [deleteSourceEndpointYOffset, id] + ) useEventListener( 'pointerdown', diff --git a/apps/builder/src/features/graph/components/Nodes/BlockNode/SettingsPopoverContent/SettingsPopoverContent.tsx b/apps/builder/src/features/graph/components/Nodes/BlockNode/SettingsPopoverContent/SettingsPopoverContent.tsx index df59ed9af..12a9d3f10 100644 --- a/apps/builder/src/features/graph/components/Nodes/BlockNode/SettingsPopoverContent/SettingsPopoverContent.tsx +++ b/apps/builder/src/features/graph/components/Nodes/BlockNode/SettingsPopoverContent/SettingsPopoverContent.tsx @@ -36,7 +36,7 @@ import { ZapierSettings } from '@/features/blocks/integrations/zapier' import { RedirectSettings } from '@/features/blocks/logic/redirect' import { SetVariableSettings } from '@/features/blocks/logic/setVariable' import { TypebotLinkForm } from '@/features/blocks/logic/typebotLink' -import { ButtonsOptionsForm } from '@/features/blocks/inputs/buttons' +import { ButtonsBlockSettings } from '@/features/blocks/inputs/buttons' import { ChatwootSettingsForm } from '@/features/blocks/integrations/chatwoot' import { MakeComSettings } from '@/features/blocks/integrations/makeCom' import { HelpDocButton } from './HelpDocButton' @@ -150,7 +150,7 @@ export const BlockSettings = ({ } case InputBlockType.CHOICE: { return ( - diff --git a/apps/builder/src/features/graph/providers/EndpointsProvider.tsx b/apps/builder/src/features/graph/providers/EndpointsProvider.tsx index 56146c308..0bafd0727 100644 --- a/apps/builder/src/features/graph/providers/EndpointsProvider.tsx +++ b/apps/builder/src/features/graph/providers/EndpointsProvider.tsx @@ -14,6 +14,7 @@ export type Endpoint = { export const endpointsContext = createContext<{ sourceEndpointYOffsets: Map setSourceEndpointYOffset?: (endpoint: Endpoint) => void + deleteSourceEndpointYOffset?: (endpointId: string) => void targetEndpointYOffsets: Map setTargetEnpointYOffset?: (endpoint: Endpoint) => void }>({ @@ -35,6 +36,13 @@ export const EndpointsProvider = ({ children }: { children: ReactNode }) => { ) }, []) + const deleteSourceEndpointYOffset = useCallback((endpointId: string) => { + setSourceEndpoints((endpoints) => { + endpoints.delete(endpointId) + return endpoints + }) + }, []) + const setTargetEnpointYOffset = useCallback((endpoint: Endpoint) => { setTargetEndpoints((endpoints) => new Map(endpoints).set(endpoint.id, endpoint) @@ -47,6 +55,7 @@ export const EndpointsProvider = ({ children }: { children: ReactNode }) => { sourceEndpointYOffsets, targetEndpointYOffsets, setSourceEndpointYOffset, + deleteSourceEndpointYOffset, setTargetEnpointYOffset, }} >