Lately I've been realizing how easy it is to fall into the "abstraction trap". It's exactly your situation: I have a Thing. I need a new Thing that's slightly different, but I don't want to copy all the code! That's not DRY! It's paralyzing.
So instead of duplicating code I spend time trying to tweak Thing, passing in parameters, adding special rendering cases, and finally it works as Thing and a smaller Thing2. But it's a mess, and it's not factored well, and it'll be a nightmare when Thing3 comes along.
Check out this article from the other day: http://programmingisterrible.com/post/139222674273/write-cod...
In line with his idea of copy-pasting code, I think that's the way to go: copy all the code from Product, paste it into ProductThumbnail, and make it work. THEN refactor it, and pull out reusable bits... or compose the two somehow... etc.
I normally go even a bit further (certainly on the frontend) and leave duplication until I wrote something 3 or 4 times (or until it has stayed there for a little while). This ensures that when I do write my abstracted component I'm actually making sure it is something that can, at least within that app, be re-used.
I do re-use React components between different projects but am also using the same Bootstrap theme so this makes a lot of components really easy to re-use.
Where possible you can use composability, extracting common function into a subcomponent, but this doesn't always make for neater code.
Functions:
add(1,multiply(2,3))
HTML: <div>foo <span>bar</span> </div>
React: <Container> <Header>foo</Header> <p>content</p> </Container>Composition is a useful tool, and so is writing functions like this, but they are two different ideas.
That's trivial to fix...
But you could also extract the code logic in a product module, and reuse it in both components, which can even be pure functions.