Skip to content

Instantly share code, notes, and snippets.

@ivankisyov
Created March 20, 2024 13:37
Show Gist options
  • Save ivankisyov/bbc1143812011efd766c3e536ba667a5 to your computer and use it in GitHub Desktop.
Save ivankisyov/bbc1143812011efd766c3e536ba667a5 to your computer and use it in GitHub Desktop.
State management: Thought process
1. Identify feature: "Messages"
2. Define state: { messages: Message[], selectedMessage: Message }
3. Define actions: LoadMessages, LoadMessagesSuccess, LoadMessagesError, SelectMessage
4. Define reducers:
function messagesReducer(state, action) {
switch(action.type) {
case LoadMessagesSuccess: return { ...state, messages: action.payload };
case SelectMessage: return { ...state, selectedMessage: action.payload };
default: return state;
}
}
5. Define selectors:
function selectMessages(state) { return state.messages; }
function selectSelectedMessage(state) { return state.selectedMessage; }
6. Implement effects:
class MessagesEffects {
loadMessages$ = createEffect(() => this.actions$.pipe(
ofType(LoadMessages),
switchMap(() => this.messagesService.findAll().pipe(
map(messages => LoadMessagesSuccess({ payload: messages })),
catchError(() => of(LoadMessagesError()))
))
));
}
7. Update component:
class MessagesComponent {
messages$ = this.store.select(selectMessages);
selectedMessage$ = this.store.select(selectSelectedMessage);
constructor(private store: Store) {}
ngOnInit() { this.store.dispatch(LoadMessages()); }
selectMessage(message) { this.store.dispatch(SelectMessage({ payload: message })); }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment