mirror of
https://github.com/Stremio/stremio-web.git
synced 2026-04-20 14:52:13 +00:00
useSelectableResource hook replace useSelectableGroups
This commit is contained in:
parent
5ad4f085fe
commit
5f1c776a23
2 changed files with 88 additions and 95 deletions
|
|
@ -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;
|
||||
88
src/routes/MetaDetails/useSelectableResource.js
Normal file
88
src/routes/MetaDetails/useSelectableResource.js
Normal 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;
|
||||
Loading…
Reference in a new issue