Skip to content

Commit

Permalink
Merge pull request #77 from ginoemiliozzi/disconnect-useSchema
Browse files Browse the repository at this point in the history
Add disconnect function exported in useSchema hook - #31
  • Loading branch information
antonioru authored Nov 26, 2020
2 parents 549740d + 483b6e0 commit bf8d282
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 5 deletions.
4 changes: 3 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,10 +135,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- First implementation of draggable canvas
- First implementation of zoomable canvas

## [0.6.0] - 2020-11-24
## [0.6.0] - 2020-11-25

### Added

- Canvas Component for panning and zooming
- useCanvas hook
- CanvasControl component
- Added `disconnect` function exported in `useSchema` hook

1 change: 1 addition & 0 deletions src/hooks/useSchema/actionTypes.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ export const ON_CHANGE = 'bi-diagram/useSchema/change';
export const ON_NODE_ADD = 'bi-diagram/useSchema/node/add';
export const ON_NODE_REMOVE = 'bi-diagram/useSchema/node/remove';
export const ON_CONNECT = 'bi-diagram/useSchema/connect';
export const ON_DISCONNECT = 'bi-diagram/useSchema/disconnect';
8 changes: 7 additions & 1 deletion src/hooks/useSchema/schemaReducer.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import findIndex from 'lodash.findindex';
import { ON_CHANGE, ON_CONNECT, ON_NODE_ADD, ON_NODE_REMOVE } from './actionTypes';
import isEqual from 'lodash.isequal';
import { ON_CHANGE, ON_CONNECT, ON_DISCONNECT, ON_NODE_ADD, ON_NODE_REMOVE } from './actionTypes';
import getNodePortsId from '../../shared/functions/getNodePortsId';

/**
Expand Down Expand Up @@ -45,6 +46,11 @@ const schemaReducer = (state, action) => {
nodes: state.nodes || [],
links: state.links || [],
});
case ON_DISCONNECT:
return ({
nodes: state.nodes || [],
links: state.links.filter((link) => !isEqual(link, action.payload.link)) || [],
});
default:
return state;
}
Expand Down
5 changes: 3 additions & 2 deletions src/hooks/useSchema/useSchema.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { useReducer, useCallback } from 'react';
import ensureNodeId from '../../shared/functions/ensureNodeId';
import schemaReducer from './schemaReducer';
import { ON_CHANGE, ON_CONNECT, ON_NODE_ADD, ON_NODE_REMOVE } from './actionTypes';
import { ON_CHANGE, ON_CONNECT, ON_NODE_ADD, ON_NODE_REMOVE, ON_DISCONNECT } from './actionTypes';

const initialState = { nodes: [], links: [] };

Expand All @@ -17,8 +17,9 @@ const useSchema = (initialSchema = initialState) => {
const addNode = useCallback((node) => dispatch({ type: ON_NODE_ADD, payload: { node: ensureNodeId(node) } }), []);
const removeNode = useCallback((node) => dispatch({ type: ON_NODE_REMOVE, payload: { nodeId: node.id } }), []);
const connect = useCallback((input, output) => dispatch({ type: ON_CONNECT, payload: { link: { input, output } } }), []);
const disconnect = useCallback((input, output) => dispatch({ type: ON_DISCONNECT, payload: { link: { input, output } } }), []);

return [schema, Object.freeze({ onChange, addNode, removeNode, connect })];
return [schema, Object.freeze({ onChange, addNode, removeNode, connect, disconnect })];
};
/* eslint-enable max-len */

Expand Down
36 changes: 35 additions & 1 deletion tests/useSchema.spec.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import useSchema from '../dist/hooks/useSchema';
import schemaReducer from '../dist/hooks/useSchema/schemaReducer';
import createSchema from '../dist/shared/functions/createSchema';
import { ON_CHANGE, ON_CONNECT, ON_NODE_ADD, ON_NODE_REMOVE } from '../dist/hooks/useSchema/actionTypes';
import { ON_CHANGE, ON_CONNECT, ON_NODE_ADD, ON_NODE_REMOVE, ON_DISCONNECT } from '../dist/hooks/useSchema/actionTypes';

describe('useSchema reducer', () => {
it('should return the same state if the action is invalid', () => {
Expand Down Expand Up @@ -96,6 +96,40 @@ describe('useSchema reducer', () => {
expect(nextSchema.nodes).to.deep.equal([]);
expect(nextSchema.links).to.deep.equal([link]);
});

it('should remove the link between two nodes ON_DISCONNECT action', () => {
const schema = createSchema({
nodes: [
{
id: 'node-1',
content: 'Node 1',
coordinates: [1, 0],
outputs: [{ id: 'port-1' }],
},
{
id: 'node-2',
content: 'Node 2',
coordinates: [2, 0],
inputs: [{ id: 'port-2' }],
},
{
id: 'node-3',
content: 'Node 3',
coordinates: [3, 0],
inputs: [{ id: 'port-3' }],
},
],
links: [{ input: 'port-2', output: 'port-1' }, { input: 'port-3', output: 'port-1' }],
});
const link = { input: 'port-3', output: 'port-1' };

const nextSchema = schemaReducer(schema, { type: ON_DISCONNECT, payload: { link } });

expect(nextSchema).to.have.property('nodes');
expect(nextSchema).to.have.property('links');
expect(nextSchema.nodes).to.deep.equal(schema.nodes);
expect(nextSchema.links).to.deep.equal([{ input: 'port-2', output: 'port-1' }]);
});
});

// TODO: test this hook
Expand Down

0 comments on commit bf8d282

Please sign in to comment.