useSelectableResource hook replace useSelectableGroups

This commit is contained in:
NikolaBorislavovHristov 2019-12-09 10:01:29 +02:00
parent 5ad4f085fe
commit 5f1c776a23
2 changed files with 88 additions and 95 deletions

View file

@ -1,95 +0,0 @@
const React = require('react');
const isEqual = require('lodash.isequal');
const readyGroupForReq = (groups, req) => {
return groups.find((group) => {
return isEqual(group.req, req) && group.content.type === 'Ready';
});
};
const reducer = (state, action) => {
switch (action.type) {
case 'groups-changed': {
if (state.selected.group === null ||
!state.selected.byUser ||
!readyGroupForReq(action.groups, state.selected.group.req)) {
const firstReadyGroup = action.groups.find((group) => group.content.type === 'Ready');
const selectedGroup = firstReadyGroup ? firstReadyGroup : null;
return {
...state,
resourceRef: action.resourceRef,
groups: action.groups,
selected: {
group: selectedGroup,
byUser: false
}
};
}
return {
...state,
resourceRef: action.resourceRef,
groups: action.groups
};
}
case 'group-selected': {
const selectedGroup = readyGroupForReq(state.groups, action.req);
if (!selectedGroup) {
return state;
}
return {
...state,
selected: {
group: selectedGroup,
byUser: true
}
};
}
default: {
return state;
}
}
};
const initializer = ([resourceRef, groups]) => {
const initialState = {
resourceRef: null,
groups: [],
selected: {
group: null,
byUser: false
}
};
const initAction = {
type: 'groups-changed',
resourceRef,
groups
};
return reducer(initialState, initAction);
};
const useSelectableGroups = (resourceRef, groups) => {
const [state, dispatch] = React.useReducer(
reducer,
[resourceRef, groups],
initializer
);
const selectGroup = React.useCallback((req) => {
dispatch({
type: 'group-selected',
req
});
}, []);
React.useEffect(() => {
dispatch({
type: 'groups-changed',
resourceRef,
groups
});
}, [groups]);
return [state.resourceRef, state.groups, state.selected.group, selectGroup];
};
module.exports = useSelectableGroups;

View file

@ -0,0 +1,88 @@
const React = require('react');
const isEqual = require('lodash.isequal');
const readyResourceForRequest = (resources, request) => {
return resources.find((resource) => {
return isEqual(resource.request, request) && resource.content.type === 'Ready';
});
};
const reducer = (state, action) => {
switch (action.type) {
case 'resources-changed': {
if (state.selected.resource === null ||
!state.selected.byUser ||
!readyResourceForRequest(action.resources, state.selected.resource.request)) {
const firstReadyResource = action.resources.find((resource) => resource.content.type === 'Ready');
const selectedResource = firstReadyResource ? firstReadyResource : null;
return {
...state,
resourceRef: action.resourceRef,
resources: action.resources,
selected: {
resource: selectedResource,
byUser: false
}
};
}
return {
...state,
resourceRef: action.resourceRef,
resources: action.resources
};
}
case 'resource-selected': {
const selectedResource = readyResourceForRequest(state.resources, action.request);
if (!selectedResource) {
return state;
}
return {
...state,
selected: {
resource: selectedResource,
byUser: true
}
};
}
default: {
return state;
}
}
};
const initializer = ([resourceRef, resources]) => {
const initialState = {
resourceRef: null,
resources: [],
selected: {
resource: null,
byUser: false
}
};
const initAction = {
type: 'resources-changed',
resourceRef,
resources
};
return reducer(initialState, initAction);
};
const useSelectableResource = (resourceRef, resources) => {
const [state, dispatch] = React.useReducer(
reducer,
[resourceRef, resources],
initializer
);
const selectResource = React.useCallback((request) => {
dispatch({ type: 'resource-selected', request });
}, []);
React.useEffect(() => {
dispatch({ type: 'resources-changed', resourceRef, resources });
}, [resources]);
return [state.resourceRef, state.resources, state.selected.resource, selectResource];
};
module.exports = useSelectableResource;