Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/attitude/react-dual-theme
A dual theme context for React (Native) apps to support dark mode purposes.
https://github.com/attitude/react-dual-theme
context context-api dark-mode react react-hook react-native theme-context theme-provider theming usetheme
Last synced: about 6 hours ago
JSON representation
A dual theme context for React (Native) apps to support dark mode purposes.
- Host: GitHub
- URL: https://github.com/attitude/react-dual-theme
- Owner: attitude
- License: mit
- Created: 2019-10-14T07:33:07.000Z (about 5 years ago)
- Default Branch: main
- Last Pushed: 2023-01-06T02:12:37.000Z (almost 2 years ago)
- Last Synced: 2024-11-10T03:52:17.635Z (7 days ago)
- Topics: context, context-api, dark-mode, react, react-hook, react-native, theme-context, theme-provider, theming, usetheme
- Language: JavaScript
- Homepage:
- Size: 685 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# react-dual-theme
A dual theme context for React (Native) apps to support dark mode purposes.## ✨ Installation
Install package:
```
yarn add react-dual-theme
```or
```
npm install react-dual-theme
```---
## 📖 Reference
### ThemeProvider
> A component used to set theme for its children.
Prop | Type | Required
------|-------------------------------|---------
theme |`string` or `[string, string]` | yesPassing a single `string` to the `theme` prop is considered same as
passing a tuple of the same string as `[string, string]`.### useTheme(): [string, string]
> A React hook to be used in functional components to get theme
> from the nearest ThemeProvider parent.Returns tuple of strings.
\# | Type | Description
------|----------|------------------
`[0]` | `string` | First theme name
`[1]` | `string` | Second theme name---
## 🚀 Usage
1. Wrap your app in `...`:
```js
// ./App.js
// Example with Dark Mode
import { ThemeProvider } from 'react-dual-theme'
import { DarkModeProvider } from 'react-native-dark-mode'import { Text, View } from './ThemedComponents'
const App = () => {
return (
Hello themed text!
}
```2. Create component to consume the theme context:
```js
// ./ThemedComponents.js
// @flow
import * as React from 'react'
import {
StyleSheet,
View as RNView,
Text as RNText,
} from 'react-native'
import { useTheme } from 'react-dual-theme'
import { useDarkMode } from 'react-native-dark-mode'const viewStyles = StyleSheet.create({
'red-on-dark': { backgroundColor: 'black' },
'red-on-light': { backgroundColor: 'white' },
})// Type just for example purposes:
declare type Style = null | Object | (null | Object | Style)[];type Props = {
children?: React.Node,
style?: Style,
}export const View = ({ children, style, ...rest }: Props) => {
const [light, dark] = useTheme()
const isDarkMode: boolean = useDarkMode()// Add some theming logic..
const themeStyle = isDarkMode ? viewStyles[dark] : viewStyles[light]return
{children}
}const textStyles = StyleSheet.create({
'red-on-dark': { color: 'red' },
'red-on-light': { color: 'red' },
})export const Text = ({ children, style, ...rest }: Props) => {
const [light, dark] = useTheme()
const isDarkMode: boolean = useDarkMode()// Add some theming logic..
const themeStyle = isDarkMode ? textStyles[dark] : textStyles[light]return
{children}
}```
3. **Extra:** View as a _ThemeProvider_
You can simply make a `` component a theme provider in the same time:
```js
import { ThemeProvider, useTheme } from 'react-dual-theme'type Props = {
children?: React.Node,
style?: Style,
theme: string | [string, string],
}export const View = ({ children, style, theme, ...rest }: Props) => {
const Component =return theme // Provide new theme context when needed
?
:
}
```---
## 🔧 Using Flow definitions & Setting up your .flowconfig
**This package has `.js.flow` files to let Flow use type definitions. However, most projects ignore everything under `node_modules` to skip type-checking dependencies.**
To be able to use types included inside of packages, consider moving `/node_modules/.*` from `[ignore]` to `[untyped]` section. This way Flow can wak through the `node_modules` but exports as `any`.
Best part is you don't need to generate empty definitions using [flow-typed create-stub](https://github.com/flow-typed/flow-typed/wiki/CLI-Commands-and-Flags#create-stub) anymore.
### Edit your .flowconfig
1. Remove `node_modules` from the `[ignore]` section:
```ini
[ignore]
; /node_modules/.* ; <<< you should not need this
```1. Add `node_modules` to `[untyped]` section:
```ini
[untyped]
/node_modules/.* ; <<< export every module as any by default
!/node_modules/react-dual-theme/.* ; <<< exception
```1. Add `react-dual-theme` to `[declarations]` section:
```ini
[declarations]
/node_modules/react-dual-theme/.* ; <<< use types from .flow.js files
```
1. Flow should be now able to get through the package typings.
1. Profit 🎉---
## 🚧 Typescript _(needs testing)_
This package includes TypeScript definition `index.d.ts` file.
---
## Licence: MIT
[@martin_adamko](https://twitter.com/martin_adamko) 🐤