| 
									
										
										
										
											2018-01-26 14:37:40 -08:00
										 |  |  | import _ from 'lodash'; | 
					
						
							|  |  |  | import { Observable } from 'rx'; | 
					
						
							|  |  |  | import { ofType } from 'redux-epic'; | 
					
						
							|  |  |  | import store from 'store'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import { themes } from '../../utils/themes.js'; | 
					
						
							|  |  |  | import { postJSON$ } from '../../utils/ajax-stream.js'; | 
					
						
							|  |  |  | import { | 
					
						
							| 
									
										
										
										
											2018-01-29 11:26:24 -08:00
										 |  |  |   csrfSelector, | 
					
						
							| 
									
										
										
										
											2018-01-26 14:37:40 -08:00
										 |  |  |   postThemeComplete, | 
					
						
							| 
									
										
										
										
											2018-01-29 11:26:24 -08:00
										 |  |  |   postThemeError, | 
					
						
							| 
									
										
										
										
											2018-01-26 14:37:40 -08:00
										 |  |  |   themeSelector, | 
					
						
							| 
									
										
										
										
											2018-01-29 11:26:24 -08:00
										 |  |  |   types, | 
					
						
							|  |  |  |   usernameSelector | 
					
						
							| 
									
										
										
										
											2018-01-26 14:37:40 -08:00
										 |  |  | } from './index.js'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function persistTheme(theme) { | 
					
						
							|  |  |  |   store.set('fcc-theme', theme); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default function nightModeEpic( | 
					
						
							|  |  |  |   actions, | 
					
						
							|  |  |  |   { getState }, | 
					
						
							|  |  |  |   { document } | 
					
						
							|  |  |  | ) { | 
					
						
							|  |  |  |   return Observable.of(document) | 
					
						
							|  |  |  |     // if document is undefined we do nothing (ssr trap)
 | 
					
						
							|  |  |  |     .filter(Boolean) | 
					
						
							|  |  |  |     .flatMap(({ body }) => { | 
					
						
							|  |  |  |       const toggleBodyClass = actions | 
					
						
							|  |  |  |         ::ofType( | 
					
						
							|  |  |  |           types.fetchUser.complete, | 
					
						
							|  |  |  |           types.toggleNightMode, | 
					
						
							| 
									
										
										
										
											2018-01-29 11:26:24 -08:00
										 |  |  |           types.postTheme.complete, | 
					
						
							|  |  |  |           types.postTheme.error | 
					
						
							| 
									
										
										
										
											2018-01-26 14:37:40 -08:00
										 |  |  |         ) | 
					
						
							|  |  |  |         .map(_.flow(getState, themeSelector)) | 
					
						
							|  |  |  |         // catch existing night mode users
 | 
					
						
							|  |  |  |         .do(persistTheme) | 
					
						
							|  |  |  |         .do(theme => { | 
					
						
							|  |  |  |           if (theme === themes.night) { | 
					
						
							|  |  |  |             body.classList.add(themes.night); | 
					
						
							|  |  |  |           } else { | 
					
						
							|  |  |  |             body.classList.remove(themes.night); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         .ignoreElements(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const postThemeEpic = actions::ofType(types.toggleNightMode) | 
					
						
							|  |  |  |         .debounce(250) | 
					
						
							|  |  |  |         .flatMapLatest(() => { | 
					
						
							|  |  |  |           const _csrf = csrfSelector(getState()); | 
					
						
							|  |  |  |           const theme = themeSelector(getState()); | 
					
						
							|  |  |  |           const username = usernameSelector(getState()); | 
					
						
							|  |  |  |           return postJSON$('/update-my-theme', { _csrf, theme }) | 
					
						
							| 
									
										
										
										
											2018-01-29 11:26:24 -08:00
										 |  |  |             .map(postThemeComplete) | 
					
						
							|  |  |  |             .catch(err => { | 
					
						
							|  |  |  |               return Observable.of(postThemeError(username, theme, err)); | 
					
						
							|  |  |  |             }); | 
					
						
							| 
									
										
										
										
											2018-01-26 14:37:40 -08:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       return Observable.merge(toggleBodyClass, postThemeEpic); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | } |