const initialState: State = {
user: {
id: '',
nickname: '',
photoURL: '',
statusMessage: '',
},
deleteMode: false,
// ref를 주입받을 modal state입니다.
modal: undefined,
};
// showModal action입니다.
const showModal = (dispatch: React.Dispatch<Action>) => ({
user,
deleteMode,
onDeleteFriend,
onAddFriend,
}: ShowModalParams): void => {
dispatch({
type: ActionType.ShowModal,
payload: {
user,
deleteMode,
onDeleteFriend,
onAddFriend,
},
});
};
// 액션을 처리할 Reducer입니다.
const reducer: Reducer = (state = initialState, action) => {
const { type, payload } = action;
const { modal } = state;
switch (type) {
case ActionType.ShowModal:
if (modal && modal.current) {
modal.current.setUser(payload.user);
modal.current.showAddBtn(!payload.deleteMode);
modal.current.open();
}
return {
...state,
user: payload.user,
deleteMode: !payload.deleteMode,
};
default:
return state;
}
};
// provider로 하위 컴포넌트에 showModal 액션을 전달해 줍니다.
function ProfileModalProvider(props: Props): React.ReactElement {
const [state, dispatch] = useReducer<Reducer>(reducer, initialState);
const actions = {
showModal: showModal(dispatch),
};
return <Provider value={{ state, ...actions }}>{props.children}</Provider>;
}
Created
April 18, 2021 05:52
-
-
Save qkreltms/250effbe30d3df0d2d6d4309b7e59252 to your computer and use it in GitHub Desktop.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment