xstyled icon indicating copy to clipboard operation
xstyled copied to clipboard

feat: support react-native

Open igorwessel opened this issue 2 years ago • 19 comments

Summary

Hello guys! basically I'm trying to finalize a PR that was adding support for react-native. Can find out a little more about it here: https://github.com/gregberge/xstyled/pull/273, thanks @diegotsi

My idea is basically the same as this PR except that I'll be adding the default use without utility props and the x function with utility props.

Test plan

const WithoutUtilityProps = styled.View`
  background-color: cool-gray-500;
  padding: 2;
`;

const WithConfig = styled.View.withConfig({})`
  background-color: rose-900;
  padding: 2;
`;

const StyledSomeComponent = styled(View)`
  background-color: teal-900;
  padding: 2;
`;

const WithUtilityProps = styled.ViewBox``;

const UsingAS = styled.View``;

const Test = () => {
  return (
    <ThemeProvider theme={defaultTheme}>
      <x.View p={2} bg="blue-gray-900">
        <x.Text color="blue-gray-500">Text X elements</x.Text>
      </x.View>
      <UsingAS as={x.Text} p={2} bg="emerald-500">
        Now is a x.Text with all props from Text (RN) + utility props from
        xstyled
      </UsingAS>
      <WithUtilityProps p={2}>
        <x.Text>With Utility Props</x.Text>
      </WithUtilityProps>
      <WithConfig>
        <x.Text color="white">With Config</x.Text>
      </WithConfig>
      {/*@ts-expect-error */}
      <WithoutUtilityProps bg="black">
        <x.Text>Without Utility Props</x.Text>
      </WithoutUtilityProps>
      <StyledSomeComponent>
        <x.Text color="white">Styled(SomeComponent)</x.Text>
      </StyledSomeComponent>
    </ThemeProvider>
  );
};

Working with the latest react-native template:

Captura de Tela 2022-08-21 às 08 32 37

types

working

igorwessel avatar Aug 21 '22 10:08 igorwessel

Thanks for this @igorwessel 🚀

This will help us a lot

JulioCVaz avatar Aug 22 '22 12:08 JulioCVaz

Nice @igorwessel! 😄

felipefialho avatar Aug 22 '22 13:08 felipefialho

I prefer @xstyled/styled-components/native over @xstyled/styled-components-native due to all the duplication.

Maybe there is a way to trim this down and get rid of the dependency for react-native itself?

jguddas avatar Aug 22 '22 13:08 jguddas

I prefer @xstyled/styled-components/native over @xstyled/styled-components-native due to all the duplication.

We can maybe install as a dependency in @xstyled/styled-components and export all this guy

Maybe there is a way to trim this down and get rid of the dependency for react-native itself?

The react-native package is in the development dependencies, without it there is no way to perform the tests

igorwessel avatar Aug 22 '22 13:08 igorwessel

I realized that a lot of the code is duplication that is not worth it to move in new package. I made some changes in the functions that create the styled, xstyled, css to receive as parameters the dependencies of the styled, css function that will be used. We were able to have these functions with greater flexibility, which allows us to reuse them both for native/web.

I have separated the responsibilities of defining an interface into new functions so that we can use the functions that create styled,xstyled without an interface and then define from those returned values. e.g:

const { scStyled, styled, xstyled } = createStyled(scStyled, css, generator)

Object.keys(scStyled).forEach(key => styled[key] = styled(key))

Which allows us to reuse them both for native/web.

Finally I created a package inside styled-components so we can use @xstyled/styled-components/native

Captura de Tela 2022-08-24 às 06 48 40

We can still have them as a separate package, and just put it as a styled-components dependency. With separate package allow people to just install the native package.

igorwessel avatar Aug 24 '22 09:08 igorwessel

🚀

rbalves avatar Aug 30 '22 18:08 rbalves

@gregberge When you have time, can you take a look?

igorwessel avatar Sep 20 '22 11:09 igorwessel

@igorwessel CI fails, could you try to fix it?

gregberge avatar Sep 21 '22 07:09 gregberge

@gregberge I needed to update the react-simple-editor dependency to @0.11.3 as it doesn't exactly include react@^16 peer-deps. So the NPM can resolve the dependencies without needing to set the flag --legacy-peer-deps. I'll be sure to find some time this weekend to write something in the docs about react-native.

igorwessel avatar Sep 22 '22 09:09 igorwessel

@igorwessel after the doc, I could merge it.

gregberge avatar Oct 05 '22 06:10 gregberge

Thanks @igorwessel can you rebase please?

gregberge avatar Oct 06 '22 20:10 gregberge

@gregberge Sorry for the delay, I had some problems but the rebase is done. 👍

igorwessel avatar Nov 03 '22 12:11 igorwessel

@gregberge Hey Greg, how you doing?

Have a any expectation to includes this support to the RN? It's will be help us a lot.

JulioCVaz avatar Feb 03 '23 18:02 JulioCVaz

@igorwessel can you rebase it again? It's a nice feature and an awesome improvement for this library.

sciotta avatar May 02 '23 21:05 sciotta

@thiagog3 done! 😄

igorwessel avatar May 04 '23 08:05 igorwessel

@probablyup @gregberge Is it ok for merge?

igorwessel avatar Jun 13 '23 13:06 igorwessel

@gregberge 🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏

D1no avatar Jun 15 '23 20:06 D1no

Will review this weekend :)

quantizor avatar Jun 23 '23 00:06 quantizor

Any progress here? 👀 Is there something similar to xstyled out there (that is not tailwind) that supports also React Native?

D1no avatar Apr 23 '24 08:04 D1no