-
-
Notifications
You must be signed in to change notification settings - Fork 810
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Update redux example by follow official examples
- Loading branch information
Showing
9 changed files
with
242 additions
and
156 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
import { configureStore } from '@reduxjs/toolkit'; | ||
import counterReducer from '../features/counter/counterSlice'; | ||
|
||
export const store = configureStore({ | ||
reducer: { | ||
counter: counterReducer, | ||
}, | ||
}); |
This file was deleted.
Oops, something went wrong.
70 changes: 0 additions & 70 deletions
70
examples/test-old-bridge/examples/redux/containers/Counter.js
This file was deleted.
Oops, something went wrong.
56 changes: 56 additions & 0 deletions
56
examples/test-old-bridge/examples/redux/features/counter/Counter.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
import React from 'react'; | ||
import { StyleSheet, View, Text, TouchableHighlight } from 'react-native'; | ||
import { useSelector, useDispatch } from 'react-redux'; | ||
import { | ||
decrement, | ||
increment, | ||
incrementAsync, | ||
incrementIfOdd, | ||
selectCount, | ||
} from './counterSlice'; | ||
|
||
const styles = StyleSheet.create({ | ||
container: { | ||
flex: 1, | ||
justifyContent: 'center', | ||
alignItems: 'center', | ||
backgroundColor: '#F5FCFF', | ||
}, | ||
title: { | ||
marginBottom: 20, | ||
fontSize: 25, | ||
textAlign: 'center', | ||
fontWeight: 'bold', | ||
}, | ||
text: { | ||
fontSize: 20, | ||
textAlign: 'center', | ||
margin: 10, | ||
}, | ||
}); | ||
|
||
|
||
export function Counter() { | ||
const count = useSelector(selectCount); | ||
const dispatch = useDispatch(); | ||
return ( | ||
<View style={styles.container}> | ||
<Text style={styles.title}>Redux example</Text> | ||
<Text style={styles.text}>Clicked: {count} times</Text> | ||
<TouchableHighlight onPress={() => dispatch(increment())}> | ||
<Text style={styles.text}>+</Text> | ||
</TouchableHighlight> | ||
<TouchableHighlight onPress={() => dispatch(decrement())}> | ||
<Text style={styles.text}>-</Text> | ||
</TouchableHighlight> | ||
<TouchableHighlight onPress={() => dispatch(incrementIfOdd(count))}> | ||
<Text style={styles.text}>Increment if odd</Text> | ||
</TouchableHighlight> | ||
<TouchableHighlight onPress={() => dispatch(incrementAsync())}> | ||
<Text style={styles.text}>Increment async</Text> | ||
</TouchableHighlight> | ||
</View> | ||
); | ||
} | ||
|
||
export default Counter; |
6 changes: 6 additions & 0 deletions
6
examples/test-old-bridge/examples/redux/features/counter/counterAPI.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
// A mock function to mimic making an async request for data | ||
export function fetchCount(amount = 1) { | ||
return new Promise((resolve) => | ||
setTimeout(() => resolve({ data: amount }), 500) | ||
); | ||
} |
73 changes: 73 additions & 0 deletions
73
examples/test-old-bridge/examples/redux/features/counter/counterSlice.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'; | ||
import { fetchCount } from './counterAPI'; | ||
|
||
const initialState = { | ||
value: 0, | ||
status: 'idle', | ||
}; | ||
|
||
// The function below is called a thunk and allows us to perform async logic. It | ||
// can be dispatched like a regular action: `dispatch(incrementAsync(10))`. This | ||
// will call the thunk with the `dispatch` function as the first argument. Async | ||
// code can then be executed and other actions can be dispatched. Thunks are | ||
// typically used to make async requests. | ||
export const incrementAsync = createAsyncThunk( | ||
'counter/fetchCount', | ||
async (amount) => { | ||
const response = await fetchCount(amount); | ||
// The value we return becomes the `fulfilled` action payload | ||
return response.data; | ||
} | ||
); | ||
|
||
export const counterSlice = createSlice({ | ||
name: 'counter', | ||
initialState, | ||
// The `reducers` field lets us define reducers and generate associated actions | ||
reducers: { | ||
increment: (state) => { | ||
// Redux Toolkit allows us to write "mutating" logic in reducers. It | ||
// doesn't actually mutate the state because it uses the Immer library, | ||
// which detects changes to a "draft state" and produces a brand new | ||
// immutable state based off those changes | ||
state.value += 1; | ||
}, | ||
decrement: (state) => { | ||
state.value -= 1; | ||
}, | ||
// Use the PayloadAction type to declare the contents of `action.payload` | ||
incrementByAmount: (state, action) => { | ||
state.value += action.payload; | ||
}, | ||
}, | ||
// The `extraReducers` field lets the slice handle actions defined elsewhere, | ||
// including actions generated by createAsyncThunk or in other slices. | ||
extraReducers: (builder) => { | ||
builder | ||
.addCase(incrementAsync.pending, (state) => { | ||
state.status = 'loading'; | ||
}) | ||
.addCase(incrementAsync.fulfilled, (state, action) => { | ||
state.status = 'idle'; | ||
state.value += action.payload; | ||
}); | ||
}, | ||
}); | ||
|
||
export const { increment, decrement, incrementByAmount } = counterSlice.actions; | ||
|
||
// The function below is called a selector and allows us to select a value from | ||
// the state. Selectors can also be defined inline where they're used instead of | ||
// in the slice file. For example: `useSelector((state: RootState) => state.counter.value)` | ||
export const selectCount = (state) => state.counter.value; | ||
|
||
// We can also write thunks by hand, which may contain both sync and async logic. | ||
// Here's an example of conditionally dispatching actions based on current state. | ||
export const incrementIfOdd = (amount) => (dispatch, getState) => { | ||
const currentValue = selectCount(getState()); | ||
if (currentValue % 2 === 1) { | ||
dispatch(incrementByAmount(amount)); | ||
} | ||
}; | ||
|
||
export default counterSlice.reducer; |
Oops, something went wrong.