I'd like to apply SOLID principles with a react component that's handling too many 'use cases'. As an example let's say I have a component that's main responsibility is to render a table like so:
return (
<Table dataSource="" name={tableName} />
)
This is a very simplistic representation of that table. But the main point of complexity is the prop dataSource. Inside this <Table> component, I actually have a lot of logic/if-else condition that's catering for the dataSource flag littered within the component because the dataSource can take in many different shapes / object structure. Some are very similar that they can be abstracted, while some are quite specific (and may even just differ by one key).
For example:
const tableName = `${
dataSource === 'dataSourceA'
? dataSourceName
: dataSourceName.name
}`;
This is just one example. Imagine some dataSource has its name property nested 3 levels deep. Then other dataSource will even have different names for the keys (although the resulting data that I need to render are actually the same). Not only that, depending on the dataSource, I may need to call a different endpoints to execute some functionalities (again, the function is doing the same purpose, just the endpoint can be different). Hence within the same component I'll have a function like:
const exportTable = () => {
if(dataSource === 'dataSourceA') {
// use endpoint A
} else if (dataSource=== 'dataSourceB') {
// use endpoint B
} else {
// use endpoint C
}
}
What is the best way to refactor this kind of component and make it easier to maintain? Later on, we can have 10 types of dataSources and I can't be doing if-else conditions within the component to cater for their differences.