Files
freeCodeCamp/common/app/redux/index.js

274 lines
6.8 KiB
JavaScript
Raw Normal View History

Feat(Challenges): no js preview (#16149) * fix(files): Decouple files from challenges * feat(server/react): Remove action logger use redux remote devtools instead! * feat(Challenges): Disable js on edit, enable on execute * feat(Challenge/Preview): Show message when js is disabled * refactor(frameEpic): Reduce code by using lodash * feat(frameEpic): Disable js in preview by state * feat(frameEpic): Colocate epic in Challenges/redux * refactor(ExecuteChallengeEpic): CoLocated with Challenges * refactor(executeChallengesEpic): Separate tests from main logic * feat(Challenge/Preview): Update main on edit * feat(frameEpuc): Replace frame on edit/execute This allows for sandbox to work properly * fix(Challenges/Utils): Require utisl * revert(frameEpic): Hoist function to mount code in frame * fix(frameEpic): Ensure new frame is given classname * feat(executeChallenge): Update main on code unlocked * fix(frameEpic): Filter out empty test message * fix(Challenge/Preview): Remove unnessary quote in classname * feat(codeStorageEpic): Separate localstorage from solutions loading * fix(fetchUser): Merge user actions into one prefer many effects from one action over one action to one effect * fix(themes): Centralize theme utils and defs * fix(entities.user): Fix user reducer namespacing * feat(frame): Refactor frameEpic to util * feat(Challenges.redux): Should not attempt to update main from storage * fix(loadPreviousChallengeEpic): Refactor for RFR * fix(Challenges.Modern): Show preview plane
2017-12-07 16:13:19 -08:00
import _ from 'lodash';
feat(app): new layout (#14707) * feat(app): Restructure app to be more flexible and redux idiomatic BREAKING CHANGE: Lots of breaking changes * refactor(challenges): Redux to started file structure * fix(app): lint issues due to refactor * fix(settings): Refactor settings to use folder structure * refactor(challenges): Move step redux stuff into step folder * fix(challenges): Remove fetchchallenges actions * refactor(challenges): Move project redux logic into project view subdirectory * refactor(app): %s/sagas/epics/g * refactor(redux): Use new redux-epic with combineEpic and ofType * refactor(app): Move challenge selector to app level * fix(app): Move loading challenge info into challenge route This moves a lot of the logic needed to load challenge info into the challenge app. This decouples the main app from the challenge route * refactor(map): Map is now decoupled from challenges * refactor(challenges): Use selectors everywhere instead of guessing state shape * refactor(client): refactor client epics to use selectors * refactor(app): Refactor userSelector to return user object instead of object.user * refactor(entities): Move entities logic into it's own file * fix(redux): combineTypes should be combineActions * fix(app): reducer namespacing and import * fix(Map): Fix undefined type and update redux-action * fix(redux): Refactor fetchUser to be more declarative Use rxjs methods instead of imperative if/else. Also prevent non-actions from being emitted * fix(redux): toString multi phase action types * fix(redux): typecast multiphase type, fix typo in reducer toString multiphase types in fetch challenge epic. Add epic to epics lists. Fix type in fetch challenge complete handler * fix(redux): updateCurrentChallengelogic should be centerlized Move route changes to one location. * fix(Nav): Prevent event object from hanging around closeDropDown/openDropDown where handing on to the event object. This was causing issues with react since event objects are recycled in React. * fix(Map.Challenge): decouple map selector * fix(Map): Decouple panel selectors from props Panel Selectors no longer need to know the shape of a components props. Refactored component selectors to decouple them entities state shape * fix(Map.redux): Add select challenge epic and connect map epics * fix(redux.analytics): Fix meta creator and nav/map events * fix(redux): Update current challenge ajax * fix(challenges): ssr fetch challenge should update challenge ui Was using an epic to update challenge ui on fetch complete, but this was not working on ssr due to the way ssr disables epics to wait for completion. This commit fixes this by causing the complete to directly update state in the challenge ui * fix(challenges): wrong import of types, refactor epic name * fix(redux): Prevent fetch challenge epic from emitting null to dispatch * fix(redux): prevent executechallenge from emitting null * fix(challenges.redux): testsSelector returns just tests * fix(challenges.redux): Prevent completion challenge from emitting null * refactor(Challenges.Step): Refactor step challenge to release event object * fix(redux): wrap reducers in factories reducers exported from features need to be factories this helps avoid cyclic requires messing up reducer creation We end up with exports from files being undefined as node tries to resolve cyclic dependencies. This prevents that by wrapping the `handleActions` call so that the ref to types imported from parent features are closures and can be resolved by node before we need them. * fix(Map): createUi not working correctly map utils should receive just map ui state, createMapUi needs to add title to challenge * feat(Challenges): Adds Panes and panes backend challenge * fix: Create child container to wrap children Create a ChildContainer comp' to wrap all children that represent the view for the current route. This let's the child route define if they want a full width view or if they want the standard max-width view. * feat(Panes): panes now render dividers * feat(Panes): Get divider to move currectly * fix(Nav): Add top margin to contained childs Move margin-bottom from nav to child container as margin top. This let's the jsbin style views fit snug with navbar * fix(Panes): Should be contained within their borders * feat(Panes): Update navbar height of pane on app mount * feat(Panes): Toggle map on map nav btn click * fix(gulpfile): Ensure nodemon exits on restart On process exit, wait for nodemon to shutdown before process.exit * feat(Panes): Make Panes redux first * fix(Panes): Fix divider positioning * fix(Panes): Update divider moved handler dividerMoved action now uses new panesByName structure * feat(Panes): Pane nav button will hide panes * chore(package-lock): Update package lock * feat(Panes.redux): Recaculate dividers on pane toggle * fix(Challenges): Update challenge on dashedName change This fixes backwards navigation not updating the redux state current challenge * feat(Panes.redux): Clear panes on unmount Clearing panes on unmount will clear bin buttons in nav * refactor(Map): Colocate styles * feat(Map): New map layout * fix(Map): No longer has it's own page * fix: FetchChallenges on appMounted * feat: Normalize fetchChallenge(s) results This allows superblocks to be sent with both fetchChallenge and fetchChallenges so the map is always populated on first load * feat(Map): Show blocks on first load * fix(less): Remove old css * feat(Nav): Reduce nav height * fix(Nav): Render nav after content Render nav after content and use css to reverse again on screen. We do this so the panes can render first and update redux panes state which will then update the nav ui state before nav has a chance to render * fix(Panes): Add container This adds a Panes Container that will allow it to udpate redux state so Panes Component will have redux state ready to actually render panes * feat(Challenges.Classic): Add panes * fix(Challenge.Classic): Editor onchange should not need to know about file * fix(Panes): Index on panes hide should account for hidden pane * fix(Challanges.Classic): Fix panes types * fix(Challenges): Add completion modal to all challenges Change classic modal to completion modal * fix(Panes): Dividers live on top of planes * fix(Challenges): Remove codemirror theme Remove codemirror theme and remove borders from preview frame * fix(Challenges.Classic): Remove old component * feat(Challenges.Step): Add panes to step challenge * feat(Challenges.Project): Add panes to projects * fix(Challenges.Projects): Remove row * fix(Modals): Move modal text color to challenge less This text color is dependent on the actual header color * fix(Map): Use Superblock title for ui * fix(Map): Reduce panel header height * fix(app): Capitalize Toasts folder Feature folders should be campitalized * chore(Map): Remove unused epic file * fix(Step): Fix tests * test(Map): Update createMapUi tests input
2017-07-31 20:04:01 -07:00
import { Observable } from 'rx';
feat: prep for modern challenges (#15781) * feat(seed): Add modern challenge * chore(react): Use prop-types package * feat: Initial refactor to redux-first-router BREAKING CHANGE: Everything is different! * feat: First rendering * feat(routes): Challenges view render but failing * fix(Challenges): Remove contain HOC * fix(RFR): Add params selector * fix(RFR): :en should be :lang * fix: Update berks utils for redux * fix(Map): Challenge link to arg * fix(Map): Add trailing slash to map page * fix(RFR): Use FCC Link Use fcc Link to get around issue of lang being undefined * fix(Router): Link to is required * fix(app): Rely on RFR state for app lang * chore(RFR): Remove unused RFR Link * fix(RFR): Hydrate initial challenge using RFR and RO * fix: Casing issue * fix(RFR): Undefined links * fix(RFR): Use onRoute<name> convention for route types * feat(server/react): Add helpful redux logging/throwing * fix(server/react): Strip out nonjson from state This prevents thunks in routesMap from breaking serialization * fix(RFR/Link): Should accept any renderable * fix(RFR): Get redirects working * fix(RFR): Redirects and not found's * fix(Map): Move challenge onClick handler * fix(Map): Allow Router.link to handle clicks after onClick * fix(routes): Remove react-router-redux * feat(Router): Add lang to all route actions by default * fix(entities): Only fetch challenge if not already loaded * fix(Files): Move files to own feature * chore(Challenges): Remove vestigial hints logic * fix(RFR): Update challenges on route challenges * fix(code-storage): Should use events instead of commands * fix(Map): ClickOnMap should not hold on to event * chore(lint): Use eslint-config-freecodecamp Closes #15938 * feat(Panes): Update panes on route instead of render * fix(Panes): Store panesmap and update on fetchchallenges * fix(Panes): Normalize panesmaps * fix(Panes): Remove filter from createpanemap * fix(Panes): Middleware on location meta object * feat(Panes): Filter preview on nonhtml challenges * build(babel): Add lodash babel plugin * chore(lint): Lint js files * fix(server/user-stats): Remove use of lodash chain this interferes with babel-plugin-lodash * feat(dev): Add remote redux devtools for ssr * fix(Panes): Dispatch mount action this is needed to trigger window/divider epics * fix(Panes): Getpane to use new panesmap format * fix(Panes): Always update panes after state this lets the panes logic be affected by changes in state
2017-11-09 17:10:30 -08:00
import {
combineActions,
createAction,
createAsyncTypes,
createTypes,
handleActions
} from 'berkeleys-redux-utils';
feat(app): new layout (#14707) * feat(app): Restructure app to be more flexible and redux idiomatic BREAKING CHANGE: Lots of breaking changes * refactor(challenges): Redux to started file structure * fix(app): lint issues due to refactor * fix(settings): Refactor settings to use folder structure * refactor(challenges): Move step redux stuff into step folder * fix(challenges): Remove fetchchallenges actions * refactor(challenges): Move project redux logic into project view subdirectory * refactor(app): %s/sagas/epics/g * refactor(redux): Use new redux-epic with combineEpic and ofType * refactor(app): Move challenge selector to app level * fix(app): Move loading challenge info into challenge route This moves a lot of the logic needed to load challenge info into the challenge app. This decouples the main app from the challenge route * refactor(map): Map is now decoupled from challenges * refactor(challenges): Use selectors everywhere instead of guessing state shape * refactor(client): refactor client epics to use selectors * refactor(app): Refactor userSelector to return user object instead of object.user * refactor(entities): Move entities logic into it's own file * fix(redux): combineTypes should be combineActions * fix(app): reducer namespacing and import * fix(Map): Fix undefined type and update redux-action * fix(redux): Refactor fetchUser to be more declarative Use rxjs methods instead of imperative if/else. Also prevent non-actions from being emitted * fix(redux): toString multi phase action types * fix(redux): typecast multiphase type, fix typo in reducer toString multiphase types in fetch challenge epic. Add epic to epics lists. Fix type in fetch challenge complete handler * fix(redux): updateCurrentChallengelogic should be centerlized Move route changes to one location. * fix(Nav): Prevent event object from hanging around closeDropDown/openDropDown where handing on to the event object. This was causing issues with react since event objects are recycled in React. * fix(Map.Challenge): decouple map selector * fix(Map): Decouple panel selectors from props Panel Selectors no longer need to know the shape of a components props. Refactored component selectors to decouple them entities state shape * fix(Map.redux): Add select challenge epic and connect map epics * fix(redux.analytics): Fix meta creator and nav/map events * fix(redux): Update current challenge ajax * fix(challenges): ssr fetch challenge should update challenge ui Was using an epic to update challenge ui on fetch complete, but this was not working on ssr due to the way ssr disables epics to wait for completion. This commit fixes this by causing the complete to directly update state in the challenge ui * fix(challenges): wrong import of types, refactor epic name * fix(redux): Prevent fetch challenge epic from emitting null to dispatch * fix(redux): prevent executechallenge from emitting null * fix(challenges.redux): testsSelector returns just tests * fix(challenges.redux): Prevent completion challenge from emitting null * refactor(Challenges.Step): Refactor step challenge to release event object * fix(redux): wrap reducers in factories reducers exported from features need to be factories this helps avoid cyclic requires messing up reducer creation We end up with exports from files being undefined as node tries to resolve cyclic dependencies. This prevents that by wrapping the `handleActions` call so that the ref to types imported from parent features are closures and can be resolved by node before we need them. * fix(Map): createUi not working correctly map utils should receive just map ui state, createMapUi needs to add title to challenge * feat(Challenges): Adds Panes and panes backend challenge * fix: Create child container to wrap children Create a ChildContainer comp' to wrap all children that represent the view for the current route. This let's the child route define if they want a full width view or if they want the standard max-width view. * feat(Panes): panes now render dividers * feat(Panes): Get divider to move currectly * fix(Nav): Add top margin to contained childs Move margin-bottom from nav to child container as margin top. This let's the jsbin style views fit snug with navbar * fix(Panes): Should be contained within their borders * feat(Panes): Update navbar height of pane on app mount * feat(Panes): Toggle map on map nav btn click * fix(gulpfile): Ensure nodemon exits on restart On process exit, wait for nodemon to shutdown before process.exit * feat(Panes): Make Panes redux first * fix(Panes): Fix divider positioning * fix(Panes): Update divider moved handler dividerMoved action now uses new panesByName structure * feat(Panes): Pane nav button will hide panes * chore(package-lock): Update package lock * feat(Panes.redux): Recaculate dividers on pane toggle * fix(Challenges): Update challenge on dashedName change This fixes backwards navigation not updating the redux state current challenge * feat(Panes.redux): Clear panes on unmount Clearing panes on unmount will clear bin buttons in nav * refactor(Map): Colocate styles * feat(Map): New map layout * fix(Map): No longer has it's own page * fix: FetchChallenges on appMounted * feat: Normalize fetchChallenge(s) results This allows superblocks to be sent with both fetchChallenge and fetchChallenges so the map is always populated on first load * feat(Map): Show blocks on first load * fix(less): Remove old css * feat(Nav): Reduce nav height * fix(Nav): Render nav after content Render nav after content and use css to reverse again on screen. We do this so the panes can render first and update redux panes state which will then update the nav ui state before nav has a chance to render * fix(Panes): Add container This adds a Panes Container that will allow it to udpate redux state so Panes Component will have redux state ready to actually render panes * feat(Challenges.Classic): Add panes * fix(Challenge.Classic): Editor onchange should not need to know about file * fix(Panes): Index on panes hide should account for hidden pane * fix(Challanges.Classic): Fix panes types * fix(Challenges): Add completion modal to all challenges Change classic modal to completion modal * fix(Panes): Dividers live on top of planes * fix(Challenges): Remove codemirror theme Remove codemirror theme and remove borders from preview frame * fix(Challenges.Classic): Remove old component * feat(Challenges.Step): Add panes to step challenge * feat(Challenges.Project): Add panes to projects * fix(Challenges.Projects): Remove row * fix(Modals): Move modal text color to challenge less This text color is dependent on the actual header color * fix(Map): Use Superblock title for ui * fix(Map): Reduce panel header height * fix(app): Capitalize Toasts folder Feature folders should be campitalized * chore(Map): Remove unused epic file * fix(Step): Fix tests * test(Map): Update createMapUi tests input
2017-07-31 20:04:01 -07:00
import { createSelector } from 'reselect';
import fetchUserEpic from './fetch-user-epic.js';
import updateMyCurrentChallengeEpic from './update-my-challenge-epic.js';
import fetchChallengesEpic from './fetch-challenges-epic.js';
Feat(Challenges): no js preview (#16149) * fix(files): Decouple files from challenges * feat(server/react): Remove action logger use redux remote devtools instead! * feat(Challenges): Disable js on edit, enable on execute * feat(Challenge/Preview): Show message when js is disabled * refactor(frameEpic): Reduce code by using lodash * feat(frameEpic): Disable js in preview by state * feat(frameEpic): Colocate epic in Challenges/redux * refactor(ExecuteChallengeEpic): CoLocated with Challenges * refactor(executeChallengesEpic): Separate tests from main logic * feat(Challenge/Preview): Update main on edit * feat(frameEpuc): Replace frame on edit/execute This allows for sandbox to work properly * fix(Challenges/Utils): Require utisl * revert(frameEpic): Hoist function to mount code in frame * fix(frameEpic): Ensure new frame is given classname * feat(executeChallenge): Update main on code unlocked * fix(frameEpic): Filter out empty test message * fix(Challenge/Preview): Remove unnessary quote in classname * feat(codeStorageEpic): Separate localstorage from solutions loading * fix(fetchUser): Merge user actions into one prefer many effects from one action over one action to one effect * fix(themes): Centralize theme utils and defs * fix(entities.user): Fix user reducer namespacing * feat(frame): Refactor frameEpic to util * feat(Challenges.redux): Should not attempt to update main from storage * fix(loadPreviousChallengeEpic): Refactor for RFR * fix(Challenges.Modern): Show preview plane
2017-12-07 16:13:19 -08:00
import { createFilesMetaCreator } from '../files';
import { updateThemeMetacreator, entitiesSelector } from '../entities';
feat: prep for modern challenges (#15781) * feat(seed): Add modern challenge * chore(react): Use prop-types package * feat: Initial refactor to redux-first-router BREAKING CHANGE: Everything is different! * feat: First rendering * feat(routes): Challenges view render but failing * fix(Challenges): Remove contain HOC * fix(RFR): Add params selector * fix(RFR): :en should be :lang * fix: Update berks utils for redux * fix(Map): Challenge link to arg * fix(Map): Add trailing slash to map page * fix(RFR): Use FCC Link Use fcc Link to get around issue of lang being undefined * fix(Router): Link to is required * fix(app): Rely on RFR state for app lang * chore(RFR): Remove unused RFR Link * fix(RFR): Hydrate initial challenge using RFR and RO * fix: Casing issue * fix(RFR): Undefined links * fix(RFR): Use onRoute<name> convention for route types * feat(server/react): Add helpful redux logging/throwing * fix(server/react): Strip out nonjson from state This prevents thunks in routesMap from breaking serialization * fix(RFR/Link): Should accept any renderable * fix(RFR): Get redirects working * fix(RFR): Redirects and not found's * fix(Map): Move challenge onClick handler * fix(Map): Allow Router.link to handle clicks after onClick * fix(routes): Remove react-router-redux * feat(Router): Add lang to all route actions by default * fix(entities): Only fetch challenge if not already loaded * fix(Files): Move files to own feature * chore(Challenges): Remove vestigial hints logic * fix(RFR): Update challenges on route challenges * fix(code-storage): Should use events instead of commands * fix(Map): ClickOnMap should not hold on to event * chore(lint): Use eslint-config-freecodecamp Closes #15938 * feat(Panes): Update panes on route instead of render * fix(Panes): Store panesmap and update on fetchchallenges * fix(Panes): Normalize panesmaps * fix(Panes): Remove filter from createpanemap * fix(Panes): Middleware on location meta object * feat(Panes): Filter preview on nonhtml challenges * build(babel): Add lodash babel plugin * chore(lint): Lint js files * fix(server/user-stats): Remove use of lodash chain this interferes with babel-plugin-lodash * feat(dev): Add remote redux devtools for ssr * fix(Panes): Dispatch mount action this is needed to trigger window/divider epics * fix(Panes): Getpane to use new panesmap format * fix(Panes): Always update panes after state this lets the panes logic be affected by changes in state
2017-11-09 17:10:30 -08:00
import { types as challenges } from '../routes/Challenges/redux';
Feat(Challenges): no js preview (#16149) * fix(files): Decouple files from challenges * feat(server/react): Remove action logger use redux remote devtools instead! * feat(Challenges): Disable js on edit, enable on execute * feat(Challenge/Preview): Show message when js is disabled * refactor(frameEpic): Reduce code by using lodash * feat(frameEpic): Disable js in preview by state * feat(frameEpic): Colocate epic in Challenges/redux * refactor(ExecuteChallengeEpic): CoLocated with Challenges * refactor(executeChallengesEpic): Separate tests from main logic * feat(Challenge/Preview): Update main on edit * feat(frameEpuc): Replace frame on edit/execute This allows for sandbox to work properly * fix(Challenges/Utils): Require utisl * revert(frameEpic): Hoist function to mount code in frame * fix(frameEpic): Ensure new frame is given classname * feat(executeChallenge): Update main on code unlocked * fix(frameEpic): Filter out empty test message * fix(Challenge/Preview): Remove unnessary quote in classname * feat(codeStorageEpic): Separate localstorage from solutions loading * fix(fetchUser): Merge user actions into one prefer many effects from one action over one action to one effect * fix(themes): Centralize theme utils and defs * fix(entities.user): Fix user reducer namespacing * feat(frame): Refactor frameEpic to util * feat(Challenges.redux): Should not attempt to update main from storage * fix(loadPreviousChallengeEpic): Refactor for RFR * fix(Challenges.Modern): Show preview plane
2017-12-07 16:13:19 -08:00
import { challengeToFiles } from '../routes/Challenges/utils';
feat(app): new layout (#14707) * feat(app): Restructure app to be more flexible and redux idiomatic BREAKING CHANGE: Lots of breaking changes * refactor(challenges): Redux to started file structure * fix(app): lint issues due to refactor * fix(settings): Refactor settings to use folder structure * refactor(challenges): Move step redux stuff into step folder * fix(challenges): Remove fetchchallenges actions * refactor(challenges): Move project redux logic into project view subdirectory * refactor(app): %s/sagas/epics/g * refactor(redux): Use new redux-epic with combineEpic and ofType * refactor(app): Move challenge selector to app level * fix(app): Move loading challenge info into challenge route This moves a lot of the logic needed to load challenge info into the challenge app. This decouples the main app from the challenge route * refactor(map): Map is now decoupled from challenges * refactor(challenges): Use selectors everywhere instead of guessing state shape * refactor(client): refactor client epics to use selectors * refactor(app): Refactor userSelector to return user object instead of object.user * refactor(entities): Move entities logic into it's own file * fix(redux): combineTypes should be combineActions * fix(app): reducer namespacing and import * fix(Map): Fix undefined type and update redux-action * fix(redux): Refactor fetchUser to be more declarative Use rxjs methods instead of imperative if/else. Also prevent non-actions from being emitted * fix(redux): toString multi phase action types * fix(redux): typecast multiphase type, fix typo in reducer toString multiphase types in fetch challenge epic. Add epic to epics lists. Fix type in fetch challenge complete handler * fix(redux): updateCurrentChallengelogic should be centerlized Move route changes to one location. * fix(Nav): Prevent event object from hanging around closeDropDown/openDropDown where handing on to the event object. This was causing issues with react since event objects are recycled in React. * fix(Map.Challenge): decouple map selector * fix(Map): Decouple panel selectors from props Panel Selectors no longer need to know the shape of a components props. Refactored component selectors to decouple them entities state shape * fix(Map.redux): Add select challenge epic and connect map epics * fix(redux.analytics): Fix meta creator and nav/map events * fix(redux): Update current challenge ajax * fix(challenges): ssr fetch challenge should update challenge ui Was using an epic to update challenge ui on fetch complete, but this was not working on ssr due to the way ssr disables epics to wait for completion. This commit fixes this by causing the complete to directly update state in the challenge ui * fix(challenges): wrong import of types, refactor epic name * fix(redux): Prevent fetch challenge epic from emitting null to dispatch * fix(redux): prevent executechallenge from emitting null * fix(challenges.redux): testsSelector returns just tests * fix(challenges.redux): Prevent completion challenge from emitting null * refactor(Challenges.Step): Refactor step challenge to release event object * fix(redux): wrap reducers in factories reducers exported from features need to be factories this helps avoid cyclic requires messing up reducer creation We end up with exports from files being undefined as node tries to resolve cyclic dependencies. This prevents that by wrapping the `handleActions` call so that the ref to types imported from parent features are closures and can be resolved by node before we need them. * fix(Map): createUi not working correctly map utils should receive just map ui state, createMapUi needs to add title to challenge * feat(Challenges): Adds Panes and panes backend challenge * fix: Create child container to wrap children Create a ChildContainer comp' to wrap all children that represent the view for the current route. This let's the child route define if they want a full width view or if they want the standard max-width view. * feat(Panes): panes now render dividers * feat(Panes): Get divider to move currectly * fix(Nav): Add top margin to contained childs Move margin-bottom from nav to child container as margin top. This let's the jsbin style views fit snug with navbar * fix(Panes): Should be contained within their borders * feat(Panes): Update navbar height of pane on app mount * feat(Panes): Toggle map on map nav btn click * fix(gulpfile): Ensure nodemon exits on restart On process exit, wait for nodemon to shutdown before process.exit * feat(Panes): Make Panes redux first * fix(Panes): Fix divider positioning * fix(Panes): Update divider moved handler dividerMoved action now uses new panesByName structure * feat(Panes): Pane nav button will hide panes * chore(package-lock): Update package lock * feat(Panes.redux): Recaculate dividers on pane toggle * fix(Challenges): Update challenge on dashedName change This fixes backwards navigation not updating the redux state current challenge * feat(Panes.redux): Clear panes on unmount Clearing panes on unmount will clear bin buttons in nav * refactor(Map): Colocate styles * feat(Map): New map layout * fix(Map): No longer has it's own page * fix: FetchChallenges on appMounted * feat: Normalize fetchChallenge(s) results This allows superblocks to be sent with both fetchChallenge and fetchChallenges so the map is always populated on first load * feat(Map): Show blocks on first load * fix(less): Remove old css * feat(Nav): Reduce nav height * fix(Nav): Render nav after content Render nav after content and use css to reverse again on screen. We do this so the panes can render first and update redux panes state which will then update the nav ui state before nav has a chance to render * fix(Panes): Add container This adds a Panes Container that will allow it to udpate redux state so Panes Component will have redux state ready to actually render panes * feat(Challenges.Classic): Add panes * fix(Challenge.Classic): Editor onchange should not need to know about file * fix(Panes): Index on panes hide should account for hidden pane * fix(Challanges.Classic): Fix panes types * fix(Challenges): Add completion modal to all challenges Change classic modal to completion modal * fix(Panes): Dividers live on top of planes * fix(Challenges): Remove codemirror theme Remove codemirror theme and remove borders from preview frame * fix(Challenges.Classic): Remove old component * feat(Challenges.Step): Add panes to step challenge * feat(Challenges.Project): Add panes to projects * fix(Challenges.Projects): Remove row * fix(Modals): Move modal text color to challenge less This text color is dependent on the actual header color * fix(Map): Use Superblock title for ui * fix(Map): Reduce panel header height * fix(app): Capitalize Toasts folder Feature folders should be campitalized * chore(Map): Remove unused epic file * fix(Step): Fix tests * test(Map): Update createMapUi tests input
2017-07-31 20:04:01 -07:00
import ns from '../ns.json';
Feat(Challenges): no js preview (#16149) * fix(files): Decouple files from challenges * feat(server/react): Remove action logger use redux remote devtools instead! * feat(Challenges): Disable js on edit, enable on execute * feat(Challenge/Preview): Show message when js is disabled * refactor(frameEpic): Reduce code by using lodash * feat(frameEpic): Disable js in preview by state * feat(frameEpic): Colocate epic in Challenges/redux * refactor(ExecuteChallengeEpic): CoLocated with Challenges * refactor(executeChallengesEpic): Separate tests from main logic * feat(Challenge/Preview): Update main on edit * feat(frameEpuc): Replace frame on edit/execute This allows for sandbox to work properly * fix(Challenges/Utils): Require utisl * revert(frameEpic): Hoist function to mount code in frame * fix(frameEpic): Ensure new frame is given classname * feat(executeChallenge): Update main on code unlocked * fix(frameEpic): Filter out empty test message * fix(Challenge/Preview): Remove unnessary quote in classname * feat(codeStorageEpic): Separate localstorage from solutions loading * fix(fetchUser): Merge user actions into one prefer many effects from one action over one action to one effect * fix(themes): Centralize theme utils and defs * fix(entities.user): Fix user reducer namespacing * feat(frame): Refactor frameEpic to util * feat(Challenges.redux): Should not attempt to update main from storage * fix(loadPreviousChallengeEpic): Refactor for RFR * fix(Challenges.Modern): Show preview plane
2017-12-07 16:13:19 -08:00
import { themes, invertTheme } from '../../utils/themes.js';
feat(app): new layout (#14707) * feat(app): Restructure app to be more flexible and redux idiomatic BREAKING CHANGE: Lots of breaking changes * refactor(challenges): Redux to started file structure * fix(app): lint issues due to refactor * fix(settings): Refactor settings to use folder structure * refactor(challenges): Move step redux stuff into step folder * fix(challenges): Remove fetchchallenges actions * refactor(challenges): Move project redux logic into project view subdirectory * refactor(app): %s/sagas/epics/g * refactor(redux): Use new redux-epic with combineEpic and ofType * refactor(app): Move challenge selector to app level * fix(app): Move loading challenge info into challenge route This moves a lot of the logic needed to load challenge info into the challenge app. This decouples the main app from the challenge route * refactor(map): Map is now decoupled from challenges * refactor(challenges): Use selectors everywhere instead of guessing state shape * refactor(client): refactor client epics to use selectors * refactor(app): Refactor userSelector to return user object instead of object.user * refactor(entities): Move entities logic into it's own file * fix(redux): combineTypes should be combineActions * fix(app): reducer namespacing and import * fix(Map): Fix undefined type and update redux-action * fix(redux): Refactor fetchUser to be more declarative Use rxjs methods instead of imperative if/else. Also prevent non-actions from being emitted * fix(redux): toString multi phase action types * fix(redux): typecast multiphase type, fix typo in reducer toString multiphase types in fetch challenge epic. Add epic to epics lists. Fix type in fetch challenge complete handler * fix(redux): updateCurrentChallengelogic should be centerlized Move route changes to one location. * fix(Nav): Prevent event object from hanging around closeDropDown/openDropDown where handing on to the event object. This was causing issues with react since event objects are recycled in React. * fix(Map.Challenge): decouple map selector * fix(Map): Decouple panel selectors from props Panel Selectors no longer need to know the shape of a components props. Refactored component selectors to decouple them entities state shape * fix(Map.redux): Add select challenge epic and connect map epics * fix(redux.analytics): Fix meta creator and nav/map events * fix(redux): Update current challenge ajax * fix(challenges): ssr fetch challenge should update challenge ui Was using an epic to update challenge ui on fetch complete, but this was not working on ssr due to the way ssr disables epics to wait for completion. This commit fixes this by causing the complete to directly update state in the challenge ui * fix(challenges): wrong import of types, refactor epic name * fix(redux): Prevent fetch challenge epic from emitting null to dispatch * fix(redux): prevent executechallenge from emitting null * fix(challenges.redux): testsSelector returns just tests * fix(challenges.redux): Prevent completion challenge from emitting null * refactor(Challenges.Step): Refactor step challenge to release event object * fix(redux): wrap reducers in factories reducers exported from features need to be factories this helps avoid cyclic requires messing up reducer creation We end up with exports from files being undefined as node tries to resolve cyclic dependencies. This prevents that by wrapping the `handleActions` call so that the ref to types imported from parent features are closures and can be resolved by node before we need them. * fix(Map): createUi not working correctly map utils should receive just map ui state, createMapUi needs to add title to challenge * feat(Challenges): Adds Panes and panes backend challenge * fix: Create child container to wrap children Create a ChildContainer comp' to wrap all children that represent the view for the current route. This let's the child route define if they want a full width view or if they want the standard max-width view. * feat(Panes): panes now render dividers * feat(Panes): Get divider to move currectly * fix(Nav): Add top margin to contained childs Move margin-bottom from nav to child container as margin top. This let's the jsbin style views fit snug with navbar * fix(Panes): Should be contained within their borders * feat(Panes): Update navbar height of pane on app mount * feat(Panes): Toggle map on map nav btn click * fix(gulpfile): Ensure nodemon exits on restart On process exit, wait for nodemon to shutdown before process.exit * feat(Panes): Make Panes redux first * fix(Panes): Fix divider positioning * fix(Panes): Update divider moved handler dividerMoved action now uses new panesByName structure * feat(Panes): Pane nav button will hide panes * chore(package-lock): Update package lock * feat(Panes.redux): Recaculate dividers on pane toggle * fix(Challenges): Update challenge on dashedName change This fixes backwards navigation not updating the redux state current challenge * feat(Panes.redux): Clear panes on unmount Clearing panes on unmount will clear bin buttons in nav * refactor(Map): Colocate styles * feat(Map): New map layout * fix(Map): No longer has it's own page * fix: FetchChallenges on appMounted * feat: Normalize fetchChallenge(s) results This allows superblocks to be sent with both fetchChallenge and fetchChallenges so the map is always populated on first load * feat(Map): Show blocks on first load * fix(less): Remove old css * feat(Nav): Reduce nav height * fix(Nav): Render nav after content Render nav after content and use css to reverse again on screen. We do this so the panes can render first and update redux panes state which will then update the nav ui state before nav has a chance to render * fix(Panes): Add container This adds a Panes Container that will allow it to udpate redux state so Panes Component will have redux state ready to actually render panes * feat(Challenges.Classic): Add panes * fix(Challenge.Classic): Editor onchange should not need to know about file * fix(Panes): Index on panes hide should account for hidden pane * fix(Challanges.Classic): Fix panes types * fix(Challenges): Add completion modal to all challenges Change classic modal to completion modal * fix(Panes): Dividers live on top of planes * fix(Challenges): Remove codemirror theme Remove codemirror theme and remove borders from preview frame * fix(Challenges.Classic): Remove old component * feat(Challenges.Step): Add panes to step challenge * feat(Challenges.Project): Add panes to projects * fix(Challenges.Projects): Remove row * fix(Modals): Move modal text color to challenge less This text color is dependent on the actual header color * fix(Map): Use Superblock title for ui * fix(Map): Reduce panel header height * fix(app): Capitalize Toasts folder Feature folders should be campitalized * chore(Map): Remove unused epic file * fix(Step): Fix tests * test(Map): Update createMapUi tests input
2017-07-31 20:04:01 -07:00
export const epics = [
fetchUserEpic,
fetchChallengesEpic,
updateMyCurrentChallengeEpic
];
feat(app): new layout (#14707) * feat(app): Restructure app to be more flexible and redux idiomatic BREAKING CHANGE: Lots of breaking changes * refactor(challenges): Redux to started file structure * fix(app): lint issues due to refactor * fix(settings): Refactor settings to use folder structure * refactor(challenges): Move step redux stuff into step folder * fix(challenges): Remove fetchchallenges actions * refactor(challenges): Move project redux logic into project view subdirectory * refactor(app): %s/sagas/epics/g * refactor(redux): Use new redux-epic with combineEpic and ofType * refactor(app): Move challenge selector to app level * fix(app): Move loading challenge info into challenge route This moves a lot of the logic needed to load challenge info into the challenge app. This decouples the main app from the challenge route * refactor(map): Map is now decoupled from challenges * refactor(challenges): Use selectors everywhere instead of guessing state shape * refactor(client): refactor client epics to use selectors * refactor(app): Refactor userSelector to return user object instead of object.user * refactor(entities): Move entities logic into it's own file * fix(redux): combineTypes should be combineActions * fix(app): reducer namespacing and import * fix(Map): Fix undefined type and update redux-action * fix(redux): Refactor fetchUser to be more declarative Use rxjs methods instead of imperative if/else. Also prevent non-actions from being emitted * fix(redux): toString multi phase action types * fix(redux): typecast multiphase type, fix typo in reducer toString multiphase types in fetch challenge epic. Add epic to epics lists. Fix type in fetch challenge complete handler * fix(redux): updateCurrentChallengelogic should be centerlized Move route changes to one location. * fix(Nav): Prevent event object from hanging around closeDropDown/openDropDown where handing on to the event object. This was causing issues with react since event objects are recycled in React. * fix(Map.Challenge): decouple map selector * fix(Map): Decouple panel selectors from props Panel Selectors no longer need to know the shape of a components props. Refactored component selectors to decouple them entities state shape * fix(Map.redux): Add select challenge epic and connect map epics * fix(redux.analytics): Fix meta creator and nav/map events * fix(redux): Update current challenge ajax * fix(challenges): ssr fetch challenge should update challenge ui Was using an epic to update challenge ui on fetch complete, but this was not working on ssr due to the way ssr disables epics to wait for completion. This commit fixes this by causing the complete to directly update state in the challenge ui * fix(challenges): wrong import of types, refactor epic name * fix(redux): Prevent fetch challenge epic from emitting null to dispatch * fix(redux): prevent executechallenge from emitting null * fix(challenges.redux): testsSelector returns just tests * fix(challenges.redux): Prevent completion challenge from emitting null * refactor(Challenges.Step): Refactor step challenge to release event object * fix(redux): wrap reducers in factories reducers exported from features need to be factories this helps avoid cyclic requires messing up reducer creation We end up with exports from files being undefined as node tries to resolve cyclic dependencies. This prevents that by wrapping the `handleActions` call so that the ref to types imported from parent features are closures and can be resolved by node before we need them. * fix(Map): createUi not working correctly map utils should receive just map ui state, createMapUi needs to add title to challenge * feat(Challenges): Adds Panes and panes backend challenge * fix: Create child container to wrap children Create a ChildContainer comp' to wrap all children that represent the view for the current route. This let's the child route define if they want a full width view or if they want the standard max-width view. * feat(Panes): panes now render dividers * feat(Panes): Get divider to move currectly * fix(Nav): Add top margin to contained childs Move margin-bottom from nav to child container as margin top. This let's the jsbin style views fit snug with navbar * fix(Panes): Should be contained within their borders * feat(Panes): Update navbar height of pane on app mount * feat(Panes): Toggle map on map nav btn click * fix(gulpfile): Ensure nodemon exits on restart On process exit, wait for nodemon to shutdown before process.exit * feat(Panes): Make Panes redux first * fix(Panes): Fix divider positioning * fix(Panes): Update divider moved handler dividerMoved action now uses new panesByName structure * feat(Panes): Pane nav button will hide panes * chore(package-lock): Update package lock * feat(Panes.redux): Recaculate dividers on pane toggle * fix(Challenges): Update challenge on dashedName change This fixes backwards navigation not updating the redux state current challenge * feat(Panes.redux): Clear panes on unmount Clearing panes on unmount will clear bin buttons in nav * refactor(Map): Colocate styles * feat(Map): New map layout * fix(Map): No longer has it's own page * fix: FetchChallenges on appMounted * feat: Normalize fetchChallenge(s) results This allows superblocks to be sent with both fetchChallenge and fetchChallenges so the map is always populated on first load * feat(Map): Show blocks on first load * fix(less): Remove old css * feat(Nav): Reduce nav height * fix(Nav): Render nav after content Render nav after content and use css to reverse again on screen. We do this so the panes can render first and update redux panes state which will then update the nav ui state before nav has a chance to render * fix(Panes): Add container This adds a Panes Container that will allow it to udpate redux state so Panes Component will have redux state ready to actually render panes * feat(Challenges.Classic): Add panes * fix(Challenge.Classic): Editor onchange should not need to know about file * fix(Panes): Index on panes hide should account for hidden pane * fix(Challanges.Classic): Fix panes types * fix(Challenges): Add completion modal to all challenges Change classic modal to completion modal * fix(Panes): Dividers live on top of planes * fix(Challenges): Remove codemirror theme Remove codemirror theme and remove borders from preview frame * fix(Challenges.Classic): Remove old component * feat(Challenges.Step): Add panes to step challenge * feat(Challenges.Project): Add panes to projects * fix(Challenges.Projects): Remove row * fix(Modals): Move modal text color to challenge less This text color is dependent on the actual header color * fix(Map): Use Superblock title for ui * fix(Map): Reduce panel header height * fix(app): Capitalize Toasts folder Feature folders should be campitalized * chore(Map): Remove unused epic file * fix(Step): Fix tests * test(Map): Update createMapUi tests input
2017-07-31 20:04:01 -07:00
export const types = createTypes([
feat: prep for modern challenges (#15781) * feat(seed): Add modern challenge * chore(react): Use prop-types package * feat: Initial refactor to redux-first-router BREAKING CHANGE: Everything is different! * feat: First rendering * feat(routes): Challenges view render but failing * fix(Challenges): Remove contain HOC * fix(RFR): Add params selector * fix(RFR): :en should be :lang * fix: Update berks utils for redux * fix(Map): Challenge link to arg * fix(Map): Add trailing slash to map page * fix(RFR): Use FCC Link Use fcc Link to get around issue of lang being undefined * fix(Router): Link to is required * fix(app): Rely on RFR state for app lang * chore(RFR): Remove unused RFR Link * fix(RFR): Hydrate initial challenge using RFR and RO * fix: Casing issue * fix(RFR): Undefined links * fix(RFR): Use onRoute<name> convention for route types * feat(server/react): Add helpful redux logging/throwing * fix(server/react): Strip out nonjson from state This prevents thunks in routesMap from breaking serialization * fix(RFR/Link): Should accept any renderable * fix(RFR): Get redirects working * fix(RFR): Redirects and not found's * fix(Map): Move challenge onClick handler * fix(Map): Allow Router.link to handle clicks after onClick * fix(routes): Remove react-router-redux * feat(Router): Add lang to all route actions by default * fix(entities): Only fetch challenge if not already loaded * fix(Files): Move files to own feature * chore(Challenges): Remove vestigial hints logic * fix(RFR): Update challenges on route challenges * fix(code-storage): Should use events instead of commands * fix(Map): ClickOnMap should not hold on to event * chore(lint): Use eslint-config-freecodecamp Closes #15938 * feat(Panes): Update panes on route instead of render * fix(Panes): Store panesmap and update on fetchchallenges * fix(Panes): Normalize panesmaps * fix(Panes): Remove filter from createpanemap * fix(Panes): Middleware on location meta object * feat(Panes): Filter preview on nonhtml challenges * build(babel): Add lodash babel plugin * chore(lint): Lint js files * fix(server/user-stats): Remove use of lodash chain this interferes with babel-plugin-lodash * feat(dev): Add remote redux devtools for ssr * fix(Panes): Dispatch mount action this is needed to trigger window/divider epics * fix(Panes): Getpane to use new panesmap format * fix(Panes): Always update panes after state this lets the panes logic be affected by changes in state
2017-11-09 17:10:30 -08:00
'onRouteHome',
feat(app): new layout (#14707) * feat(app): Restructure app to be more flexible and redux idiomatic BREAKING CHANGE: Lots of breaking changes * refactor(challenges): Redux to started file structure * fix(app): lint issues due to refactor * fix(settings): Refactor settings to use folder structure * refactor(challenges): Move step redux stuff into step folder * fix(challenges): Remove fetchchallenges actions * refactor(challenges): Move project redux logic into project view subdirectory * refactor(app): %s/sagas/epics/g * refactor(redux): Use new redux-epic with combineEpic and ofType * refactor(app): Move challenge selector to app level * fix(app): Move loading challenge info into challenge route This moves a lot of the logic needed to load challenge info into the challenge app. This decouples the main app from the challenge route * refactor(map): Map is now decoupled from challenges * refactor(challenges): Use selectors everywhere instead of guessing state shape * refactor(client): refactor client epics to use selectors * refactor(app): Refactor userSelector to return user object instead of object.user * refactor(entities): Move entities logic into it's own file * fix(redux): combineTypes should be combineActions * fix(app): reducer namespacing and import * fix(Map): Fix undefined type and update redux-action * fix(redux): Refactor fetchUser to be more declarative Use rxjs methods instead of imperative if/else. Also prevent non-actions from being emitted * fix(redux): toString multi phase action types * fix(redux): typecast multiphase type, fix typo in reducer toString multiphase types in fetch challenge epic. Add epic to epics lists. Fix type in fetch challenge complete handler * fix(redux): updateCurrentChallengelogic should be centerlized Move route changes to one location. * fix(Nav): Prevent event object from hanging around closeDropDown/openDropDown where handing on to the event object. This was causing issues with react since event objects are recycled in React. * fix(Map.Challenge): decouple map selector * fix(Map): Decouple panel selectors from props Panel Selectors no longer need to know the shape of a components props. Refactored component selectors to decouple them entities state shape * fix(Map.redux): Add select challenge epic and connect map epics * fix(redux.analytics): Fix meta creator and nav/map events * fix(redux): Update current challenge ajax * fix(challenges): ssr fetch challenge should update challenge ui Was using an epic to update challenge ui on fetch complete, but this was not working on ssr due to the way ssr disables epics to wait for completion. This commit fixes this by causing the complete to directly update state in the challenge ui * fix(challenges): wrong import of types, refactor epic name * fix(redux): Prevent fetch challenge epic from emitting null to dispatch * fix(redux): prevent executechallenge from emitting null * fix(challenges.redux): testsSelector returns just tests * fix(challenges.redux): Prevent completion challenge from emitting null * refactor(Challenges.Step): Refactor step challenge to release event object * fix(redux): wrap reducers in factories reducers exported from features need to be factories this helps avoid cyclic requires messing up reducer creation We end up with exports from files being undefined as node tries to resolve cyclic dependencies. This prevents that by wrapping the `handleActions` call so that the ref to types imported from parent features are closures and can be resolved by node before we need them. * fix(Map): createUi not working correctly map utils should receive just map ui state, createMapUi needs to add title to challenge * feat(Challenges): Adds Panes and panes backend challenge * fix: Create child container to wrap children Create a ChildContainer comp' to wrap all children that represent the view for the current route. This let's the child route define if they want a full width view or if they want the standard max-width view. * feat(Panes): panes now render dividers * feat(Panes): Get divider to move currectly * fix(Nav): Add top margin to contained childs Move margin-bottom from nav to child container as margin top. This let's the jsbin style views fit snug with navbar * fix(Panes): Should be contained within their borders * feat(Panes): Update navbar height of pane on app mount * feat(Panes): Toggle map on map nav btn click * fix(gulpfile): Ensure nodemon exits on restart On process exit, wait for nodemon to shutdown before process.exit * feat(Panes): Make Panes redux first * fix(Panes): Fix divider positioning * fix(Panes): Update divider moved handler dividerMoved action now uses new panesByName structure * feat(Panes): Pane nav button will hide panes * chore(package-lock): Update package lock * feat(Panes.redux): Recaculate dividers on pane toggle * fix(Challenges): Update challenge on dashedName change This fixes backwards navigation not updating the redux state current challenge * feat(Panes.redux): Clear panes on unmount Clearing panes on unmount will clear bin buttons in nav * refactor(Map): Colocate styles * feat(Map): New map layout * fix(Map): No longer has it's own page * fix: FetchChallenges on appMounted * feat: Normalize fetchChallenge(s) results This allows superblocks to be sent with both fetchChallenge and fetchChallenges so the map is always populated on first load * feat(Map): Show blocks on first load * fix(less): Remove old css * feat(Nav): Reduce nav height * fix(Nav): Render nav after content Render nav after content and use css to reverse again on screen. We do this so the panes can render first and update redux panes state which will then update the nav ui state before nav has a chance to render * fix(Panes): Add container This adds a Panes Container that will allow it to udpate redux state so Panes Component will have redux state ready to actually render panes * feat(Challenges.Classic): Add panes * fix(Challenge.Classic): Editor onchange should not need to know about file * fix(Panes): Index on panes hide should account for hidden pane * fix(Challanges.Classic): Fix panes types * fix(Challenges): Add completion modal to all challenges Change classic modal to completion modal * fix(Panes): Dividers live on top of planes * fix(Challenges): Remove codemirror theme Remove codemirror theme and remove borders from preview frame * fix(Challenges.Classic): Remove old component * feat(Challenges.Step): Add panes to step challenge * feat(Challenges.Project): Add panes to projects * fix(Challenges.Projects): Remove row * fix(Modals): Move modal text color to challenge less This text color is dependent on the actual header color * fix(Map): Use Superblock title for ui * fix(Map): Reduce panel header height * fix(app): Capitalize Toasts folder Feature folders should be campitalized * chore(Map): Remove unused epic file * fix(Step): Fix tests * test(Map): Update createMapUi tests input
2017-07-31 20:04:01 -07:00
'appMounted',
'analytics',
'updateTitle',
createAsyncTypes('fetchChallenge'),
createAsyncTypes('fetchChallenges'),
Feat(Challenges): no js preview (#16149) * fix(files): Decouple files from challenges * feat(server/react): Remove action logger use redux remote devtools instead! * feat(Challenges): Disable js on edit, enable on execute * feat(Challenge/Preview): Show message when js is disabled * refactor(frameEpic): Reduce code by using lodash * feat(frameEpic): Disable js in preview by state * feat(frameEpic): Colocate epic in Challenges/redux * refactor(ExecuteChallengeEpic): CoLocated with Challenges * refactor(executeChallengesEpic): Separate tests from main logic * feat(Challenge/Preview): Update main on edit * feat(frameEpuc): Replace frame on edit/execute This allows for sandbox to work properly * fix(Challenges/Utils): Require utisl * revert(frameEpic): Hoist function to mount code in frame * fix(frameEpic): Ensure new frame is given classname * feat(executeChallenge): Update main on code unlocked * fix(frameEpic): Filter out empty test message * fix(Challenge/Preview): Remove unnessary quote in classname * feat(codeStorageEpic): Separate localstorage from solutions loading * fix(fetchUser): Merge user actions into one prefer many effects from one action over one action to one effect * fix(themes): Centralize theme utils and defs * fix(entities.user): Fix user reducer namespacing * feat(frame): Refactor frameEpic to util * feat(Challenges.redux): Should not attempt to update main from storage * fix(loadPreviousChallengeEpic): Refactor for RFR * fix(Challenges.Modern): Show preview plane
2017-12-07 16:13:19 -08:00
createAsyncTypes('fetchUser'),
feat(app): new layout (#14707) * feat(app): Restructure app to be more flexible and redux idiomatic BREAKING CHANGE: Lots of breaking changes * refactor(challenges): Redux to started file structure * fix(app): lint issues due to refactor * fix(settings): Refactor settings to use folder structure * refactor(challenges): Move step redux stuff into step folder * fix(challenges): Remove fetchchallenges actions * refactor(challenges): Move project redux logic into project view subdirectory * refactor(app): %s/sagas/epics/g * refactor(redux): Use new redux-epic with combineEpic and ofType * refactor(app): Move challenge selector to app level * fix(app): Move loading challenge info into challenge route This moves a lot of the logic needed to load challenge info into the challenge app. This decouples the main app from the challenge route * refactor(map): Map is now decoupled from challenges * refactor(challenges): Use selectors everywhere instead of guessing state shape * refactor(client): refactor client epics to use selectors * refactor(app): Refactor userSelector to return user object instead of object.user * refactor(entities): Move entities logic into it's own file * fix(redux): combineTypes should be combineActions * fix(app): reducer namespacing and import * fix(Map): Fix undefined type and update redux-action * fix(redux): Refactor fetchUser to be more declarative Use rxjs methods instead of imperative if/else. Also prevent non-actions from being emitted * fix(redux): toString multi phase action types * fix(redux): typecast multiphase type, fix typo in reducer toString multiphase types in fetch challenge epic. Add epic to epics lists. Fix type in fetch challenge complete handler * fix(redux): updateCurrentChallengelogic should be centerlized Move route changes to one location. * fix(Nav): Prevent event object from hanging around closeDropDown/openDropDown where handing on to the event object. This was causing issues with react since event objects are recycled in React. * fix(Map.Challenge): decouple map selector * fix(Map): Decouple panel selectors from props Panel Selectors no longer need to know the shape of a components props. Refactored component selectors to decouple them entities state shape * fix(Map.redux): Add select challenge epic and connect map epics * fix(redux.analytics): Fix meta creator and nav/map events * fix(redux): Update current challenge ajax * fix(challenges): ssr fetch challenge should update challenge ui Was using an epic to update challenge ui on fetch complete, but this was not working on ssr due to the way ssr disables epics to wait for completion. This commit fixes this by causing the complete to directly update state in the challenge ui * fix(challenges): wrong import of types, refactor epic name * fix(redux): Prevent fetch challenge epic from emitting null to dispatch * fix(redux): prevent executechallenge from emitting null * fix(challenges.redux): testsSelector returns just tests * fix(challenges.redux): Prevent completion challenge from emitting null * refactor(Challenges.Step): Refactor step challenge to release event object * fix(redux): wrap reducers in factories reducers exported from features need to be factories this helps avoid cyclic requires messing up reducer creation We end up with exports from files being undefined as node tries to resolve cyclic dependencies. This prevents that by wrapping the `handleActions` call so that the ref to types imported from parent features are closures and can be resolved by node before we need them. * fix(Map): createUi not working correctly map utils should receive just map ui state, createMapUi needs to add title to challenge * feat(Challenges): Adds Panes and panes backend challenge * fix: Create child container to wrap children Create a ChildContainer comp' to wrap all children that represent the view for the current route. This let's the child route define if they want a full width view or if they want the standard max-width view. * feat(Panes): panes now render dividers * feat(Panes): Get divider to move currectly * fix(Nav): Add top margin to contained childs Move margin-bottom from nav to child container as margin top. This let's the jsbin style views fit snug with navbar * fix(Panes): Should be contained within their borders * feat(Panes): Update navbar height of pane on app mount * feat(Panes): Toggle map on map nav btn click * fix(gulpfile): Ensure nodemon exits on restart On process exit, wait for nodemon to shutdown before process.exit * feat(Panes): Make Panes redux first * fix(Panes): Fix divider positioning * fix(Panes): Update divider moved handler dividerMoved action now uses new panesByName structure * feat(Panes): Pane nav button will hide panes * chore(package-lock): Update package lock * feat(Panes.redux): Recaculate dividers on pane toggle * fix(Challenges): Update challenge on dashedName change This fixes backwards navigation not updating the redux state current challenge * feat(Panes.redux): Clear panes on unmount Clearing panes on unmount will clear bin buttons in nav * refactor(Map): Colocate styles * feat(Map): New map layout * fix(Map): No longer has it's own page * fix: FetchChallenges on appMounted * feat: Normalize fetchChallenge(s) results This allows superblocks to be sent with both fetchChallenge and fetchChallenges so the map is always populated on first load * feat(Map): Show blocks on first load * fix(less): Remove old css * feat(Nav): Reduce nav height * fix(Nav): Render nav after content Render nav after content and use css to reverse again on screen. We do this so the panes can render first and update redux panes state which will then update the nav ui state before nav has a chance to render * fix(Panes): Add container This adds a Panes Container that will allow it to udpate redux state so Panes Component will have redux state ready to actually render panes * feat(Challenges.Classic): Add panes * fix(Challenge.Classic): Editor onchange should not need to know about file * fix(Panes): Index on panes hide should account for hidden pane * fix(Challanges.Classic): Fix panes types * fix(Challenges): Add completion modal to all challenges Change classic modal to completion modal * fix(Panes): Dividers live on top of planes * fix(Challenges): Remove codemirror theme Remove codemirror theme and remove borders from preview frame * fix(Challenges.Classic): Remove old component * feat(Challenges.Step): Add panes to step challenge * feat(Challenges.Project): Add panes to projects * fix(Challenges.Projects): Remove row * fix(Modals): Move modal text color to challenge less This text color is dependent on the actual header color * fix(Map): Use Superblock title for ui * fix(Map): Reduce panel header height * fix(app): Capitalize Toasts folder Feature folders should be campitalized * chore(Map): Remove unused epic file * fix(Step): Fix tests * test(Map): Update createMapUi tests input
2017-07-31 20:04:01 -07:00
'showSignIn',
'handleError',
// used to hit the server
'hardGoTo',
'delayedRedirect',
// night mode
'toggleNightMode',
Feat(Challenges): no js preview (#16149) * fix(files): Decouple files from challenges * feat(server/react): Remove action logger use redux remote devtools instead! * feat(Challenges): Disable js on edit, enable on execute * feat(Challenge/Preview): Show message when js is disabled * refactor(frameEpic): Reduce code by using lodash * feat(frameEpic): Disable js in preview by state * feat(frameEpic): Colocate epic in Challenges/redux * refactor(ExecuteChallengeEpic): CoLocated with Challenges * refactor(executeChallengesEpic): Separate tests from main logic * feat(Challenge/Preview): Update main on edit * feat(frameEpuc): Replace frame on edit/execute This allows for sandbox to work properly * fix(Challenges/Utils): Require utisl * revert(frameEpic): Hoist function to mount code in frame * fix(frameEpic): Ensure new frame is given classname * feat(executeChallenge): Update main on code unlocked * fix(frameEpic): Filter out empty test message * fix(Challenge/Preview): Remove unnessary quote in classname * feat(codeStorageEpic): Separate localstorage from solutions loading * fix(fetchUser): Merge user actions into one prefer many effects from one action over one action to one effect * fix(themes): Centralize theme utils and defs * fix(entities.user): Fix user reducer namespacing * feat(frame): Refactor frameEpic to util * feat(Challenges.redux): Should not attempt to update main from storage * fix(loadPreviousChallengeEpic): Refactor for RFR * fix(Challenges.Modern): Show preview plane
2017-12-07 16:13:19 -08:00
'postThemeComplete'
feat(app): new layout (#14707) * feat(app): Restructure app to be more flexible and redux idiomatic BREAKING CHANGE: Lots of breaking changes * refactor(challenges): Redux to started file structure * fix(app): lint issues due to refactor * fix(settings): Refactor settings to use folder structure * refactor(challenges): Move step redux stuff into step folder * fix(challenges): Remove fetchchallenges actions * refactor(challenges): Move project redux logic into project view subdirectory * refactor(app): %s/sagas/epics/g * refactor(redux): Use new redux-epic with combineEpic and ofType * refactor(app): Move challenge selector to app level * fix(app): Move loading challenge info into challenge route This moves a lot of the logic needed to load challenge info into the challenge app. This decouples the main app from the challenge route * refactor(map): Map is now decoupled from challenges * refactor(challenges): Use selectors everywhere instead of guessing state shape * refactor(client): refactor client epics to use selectors * refactor(app): Refactor userSelector to return user object instead of object.user * refactor(entities): Move entities logic into it's own file * fix(redux): combineTypes should be combineActions * fix(app): reducer namespacing and import * fix(Map): Fix undefined type and update redux-action * fix(redux): Refactor fetchUser to be more declarative Use rxjs methods instead of imperative if/else. Also prevent non-actions from being emitted * fix(redux): toString multi phase action types * fix(redux): typecast multiphase type, fix typo in reducer toString multiphase types in fetch challenge epic. Add epic to epics lists. Fix type in fetch challenge complete handler * fix(redux): updateCurrentChallengelogic should be centerlized Move route changes to one location. * fix(Nav): Prevent event object from hanging around closeDropDown/openDropDown where handing on to the event object. This was causing issues with react since event objects are recycled in React. * fix(Map.Challenge): decouple map selector * fix(Map): Decouple panel selectors from props Panel Selectors no longer need to know the shape of a components props. Refactored component selectors to decouple them entities state shape * fix(Map.redux): Add select challenge epic and connect map epics * fix(redux.analytics): Fix meta creator and nav/map events * fix(redux): Update current challenge ajax * fix(challenges): ssr fetch challenge should update challenge ui Was using an epic to update challenge ui on fetch complete, but this was not working on ssr due to the way ssr disables epics to wait for completion. This commit fixes this by causing the complete to directly update state in the challenge ui * fix(challenges): wrong import of types, refactor epic name * fix(redux): Prevent fetch challenge epic from emitting null to dispatch * fix(redux): prevent executechallenge from emitting null * fix(challenges.redux): testsSelector returns just tests * fix(challenges.redux): Prevent completion challenge from emitting null * refactor(Challenges.Step): Refactor step challenge to release event object * fix(redux): wrap reducers in factories reducers exported from features need to be factories this helps avoid cyclic requires messing up reducer creation We end up with exports from files being undefined as node tries to resolve cyclic dependencies. This prevents that by wrapping the `handleActions` call so that the ref to types imported from parent features are closures and can be resolved by node before we need them. * fix(Map): createUi not working correctly map utils should receive just map ui state, createMapUi needs to add title to challenge * feat(Challenges): Adds Panes and panes backend challenge * fix: Create child container to wrap children Create a ChildContainer comp' to wrap all children that represent the view for the current route. This let's the child route define if they want a full width view or if they want the standard max-width view. * feat(Panes): panes now render dividers * feat(Panes): Get divider to move currectly * fix(Nav): Add top margin to contained childs Move margin-bottom from nav to child container as margin top. This let's the jsbin style views fit snug with navbar * fix(Panes): Should be contained within their borders * feat(Panes): Update navbar height of pane on app mount * feat(Panes): Toggle map on map nav btn click * fix(gulpfile): Ensure nodemon exits on restart On process exit, wait for nodemon to shutdown before process.exit * feat(Panes): Make Panes redux first * fix(Panes): Fix divider positioning * fix(Panes): Update divider moved handler dividerMoved action now uses new panesByName structure * feat(Panes): Pane nav button will hide panes * chore(package-lock): Update package lock * feat(Panes.redux): Recaculate dividers on pane toggle * fix(Challenges): Update challenge on dashedName change This fixes backwards navigation not updating the redux state current challenge * feat(Panes.redux): Clear panes on unmount Clearing panes on unmount will clear bin buttons in nav * refactor(Map): Colocate styles * feat(Map): New map layout * fix(Map): No longer has it's own page * fix: FetchChallenges on appMounted * feat: Normalize fetchChallenge(s) results This allows superblocks to be sent with both fetchChallenge and fetchChallenges so the map is always populated on first load * feat(Map): Show blocks on first load * fix(less): Remove old css * feat(Nav): Reduce nav height * fix(Nav): Render nav after content Render nav after content and use css to reverse again on screen. We do this so the panes can render first and update redux panes state which will then update the nav ui state before nav has a chance to render * fix(Panes): Add container This adds a Panes Container that will allow it to udpate redux state so Panes Component will have redux state ready to actually render panes * feat(Challenges.Classic): Add panes * fix(Challenge.Classic): Editor onchange should not need to know about file * fix(Panes): Index on panes hide should account for hidden pane * fix(Challanges.Classic): Fix panes types * fix(Challenges): Add completion modal to all challenges Change classic modal to completion modal * fix(Panes): Dividers live on top of planes * fix(Challenges): Remove codemirror theme Remove codemirror theme and remove borders from preview frame * fix(Challenges.Classic): Remove old component * feat(Challenges.Step): Add panes to step challenge * feat(Challenges.Project): Add panes to projects * fix(Challenges.Projects): Remove row * fix(Modals): Move modal text color to challenge less This text color is dependent on the actual header color * fix(Map): Use Superblock title for ui * fix(Map): Reduce panel header height * fix(app): Capitalize Toasts folder Feature folders should be campitalized * chore(Map): Remove unused epic file * fix(Step): Fix tests * test(Map): Update createMapUi tests input
2017-07-31 20:04:01 -07:00
], ns);
const throwIfUndefined = () => {
throw new TypeError('Argument must not be of type `undefined`');
};
// createEventMetaCreator({
// category: String,
// action: String,
// label?: String,
// value?: Number
// }) => () => Object
export const createEventMetaCreator = ({
// categories are features or namespaces of the app (capitalized):
// Map, Nav, Challenges, and so on
category = throwIfUndefined,
// can be a one word the event
// click, play, toggle.
// This is not a hard and fast rule
action = throwIfUndefined,
// any additional information
// when in doubt use redux action type
// or a short sentence describing the action
label,
// used to tack some specific value for a GA event
value
} = throwIfUndefined) => () => ({
analytics: {
type: 'event',
category,
action,
label,
value
}
});
feat: prep for modern challenges (#15781) * feat(seed): Add modern challenge * chore(react): Use prop-types package * feat: Initial refactor to redux-first-router BREAKING CHANGE: Everything is different! * feat: First rendering * feat(routes): Challenges view render but failing * fix(Challenges): Remove contain HOC * fix(RFR): Add params selector * fix(RFR): :en should be :lang * fix: Update berks utils for redux * fix(Map): Challenge link to arg * fix(Map): Add trailing slash to map page * fix(RFR): Use FCC Link Use fcc Link to get around issue of lang being undefined * fix(Router): Link to is required * fix(app): Rely on RFR state for app lang * chore(RFR): Remove unused RFR Link * fix(RFR): Hydrate initial challenge using RFR and RO * fix: Casing issue * fix(RFR): Undefined links * fix(RFR): Use onRoute<name> convention for route types * feat(server/react): Add helpful redux logging/throwing * fix(server/react): Strip out nonjson from state This prevents thunks in routesMap from breaking serialization * fix(RFR/Link): Should accept any renderable * fix(RFR): Get redirects working * fix(RFR): Redirects and not found's * fix(Map): Move challenge onClick handler * fix(Map): Allow Router.link to handle clicks after onClick * fix(routes): Remove react-router-redux * feat(Router): Add lang to all route actions by default * fix(entities): Only fetch challenge if not already loaded * fix(Files): Move files to own feature * chore(Challenges): Remove vestigial hints logic * fix(RFR): Update challenges on route challenges * fix(code-storage): Should use events instead of commands * fix(Map): ClickOnMap should not hold on to event * chore(lint): Use eslint-config-freecodecamp Closes #15938 * feat(Panes): Update panes on route instead of render * fix(Panes): Store panesmap and update on fetchchallenges * fix(Panes): Normalize panesmaps * fix(Panes): Remove filter from createpanemap * fix(Panes): Middleware on location meta object * feat(Panes): Filter preview on nonhtml challenges * build(babel): Add lodash babel plugin * chore(lint): Lint js files * fix(server/user-stats): Remove use of lodash chain this interferes with babel-plugin-lodash * feat(dev): Add remote redux devtools for ssr * fix(Panes): Dispatch mount action this is needed to trigger window/divider epics * fix(Panes): Getpane to use new panesmap format * fix(Panes): Always update panes after state this lets the panes logic be affected by changes in state
2017-11-09 17:10:30 -08:00
export const onRouteHome = createAction(types.onRouteHome);
feat(app): new layout (#14707) * feat(app): Restructure app to be more flexible and redux idiomatic BREAKING CHANGE: Lots of breaking changes * refactor(challenges): Redux to started file structure * fix(app): lint issues due to refactor * fix(settings): Refactor settings to use folder structure * refactor(challenges): Move step redux stuff into step folder * fix(challenges): Remove fetchchallenges actions * refactor(challenges): Move project redux logic into project view subdirectory * refactor(app): %s/sagas/epics/g * refactor(redux): Use new redux-epic with combineEpic and ofType * refactor(app): Move challenge selector to app level * fix(app): Move loading challenge info into challenge route This moves a lot of the logic needed to load challenge info into the challenge app. This decouples the main app from the challenge route * refactor(map): Map is now decoupled from challenges * refactor(challenges): Use selectors everywhere instead of guessing state shape * refactor(client): refactor client epics to use selectors * refactor(app): Refactor userSelector to return user object instead of object.user * refactor(entities): Move entities logic into it's own file * fix(redux): combineTypes should be combineActions * fix(app): reducer namespacing and import * fix(Map): Fix undefined type and update redux-action * fix(redux): Refactor fetchUser to be more declarative Use rxjs methods instead of imperative if/else. Also prevent non-actions from being emitted * fix(redux): toString multi phase action types * fix(redux): typecast multiphase type, fix typo in reducer toString multiphase types in fetch challenge epic. Add epic to epics lists. Fix type in fetch challenge complete handler * fix(redux): updateCurrentChallengelogic should be centerlized Move route changes to one location. * fix(Nav): Prevent event object from hanging around closeDropDown/openDropDown where handing on to the event object. This was causing issues with react since event objects are recycled in React. * fix(Map.Challenge): decouple map selector * fix(Map): Decouple panel selectors from props Panel Selectors no longer need to know the shape of a components props. Refactored component selectors to decouple them entities state shape * fix(Map.redux): Add select challenge epic and connect map epics * fix(redux.analytics): Fix meta creator and nav/map events * fix(redux): Update current challenge ajax * fix(challenges): ssr fetch challenge should update challenge ui Was using an epic to update challenge ui on fetch complete, but this was not working on ssr due to the way ssr disables epics to wait for completion. This commit fixes this by causing the complete to directly update state in the challenge ui * fix(challenges): wrong import of types, refactor epic name * fix(redux): Prevent fetch challenge epic from emitting null to dispatch * fix(redux): prevent executechallenge from emitting null * fix(challenges.redux): testsSelector returns just tests * fix(challenges.redux): Prevent completion challenge from emitting null * refactor(Challenges.Step): Refactor step challenge to release event object * fix(redux): wrap reducers in factories reducers exported from features need to be factories this helps avoid cyclic requires messing up reducer creation We end up with exports from files being undefined as node tries to resolve cyclic dependencies. This prevents that by wrapping the `handleActions` call so that the ref to types imported from parent features are closures and can be resolved by node before we need them. * fix(Map): createUi not working correctly map utils should receive just map ui state, createMapUi needs to add title to challenge * feat(Challenges): Adds Panes and panes backend challenge * fix: Create child container to wrap children Create a ChildContainer comp' to wrap all children that represent the view for the current route. This let's the child route define if they want a full width view or if they want the standard max-width view. * feat(Panes): panes now render dividers * feat(Panes): Get divider to move currectly * fix(Nav): Add top margin to contained childs Move margin-bottom from nav to child container as margin top. This let's the jsbin style views fit snug with navbar * fix(Panes): Should be contained within their borders * feat(Panes): Update navbar height of pane on app mount * feat(Panes): Toggle map on map nav btn click * fix(gulpfile): Ensure nodemon exits on restart On process exit, wait for nodemon to shutdown before process.exit * feat(Panes): Make Panes redux first * fix(Panes): Fix divider positioning * fix(Panes): Update divider moved handler dividerMoved action now uses new panesByName structure * feat(Panes): Pane nav button will hide panes * chore(package-lock): Update package lock * feat(Panes.redux): Recaculate dividers on pane toggle * fix(Challenges): Update challenge on dashedName change This fixes backwards navigation not updating the redux state current challenge * feat(Panes.redux): Clear panes on unmount Clearing panes on unmount will clear bin buttons in nav * refactor(Map): Colocate styles * feat(Map): New map layout * fix(Map): No longer has it's own page * fix: FetchChallenges on appMounted * feat: Normalize fetchChallenge(s) results This allows superblocks to be sent with both fetchChallenge and fetchChallenges so the map is always populated on first load * feat(Map): Show blocks on first load * fix(less): Remove old css * feat(Nav): Reduce nav height * fix(Nav): Render nav after content Render nav after content and use css to reverse again on screen. We do this so the panes can render first and update redux panes state which will then update the nav ui state before nav has a chance to render * fix(Panes): Add container This adds a Panes Container that will allow it to udpate redux state so Panes Component will have redux state ready to actually render panes * feat(Challenges.Classic): Add panes * fix(Challenge.Classic): Editor onchange should not need to know about file * fix(Panes): Index on panes hide should account for hidden pane * fix(Challanges.Classic): Fix panes types * fix(Challenges): Add completion modal to all challenges Change classic modal to completion modal * fix(Panes): Dividers live on top of planes * fix(Challenges): Remove codemirror theme Remove codemirror theme and remove borders from preview frame * fix(Challenges.Classic): Remove old component * feat(Challenges.Step): Add panes to step challenge * feat(Challenges.Project): Add panes to projects * fix(Challenges.Projects): Remove row * fix(Modals): Move modal text color to challenge less This text color is dependent on the actual header color * fix(Map): Use Superblock title for ui * fix(Map): Reduce panel header height * fix(app): Capitalize Toasts folder Feature folders should be campitalized * chore(Map): Remove unused epic file * fix(Step): Fix tests * test(Map): Update createMapUi tests input
2017-07-31 20:04:01 -07:00
export const appMounted = createAction(types.appMounted);
export const fetchChallenge = createAction(
'' + types.fetchChallenge,
(dashedName, block) => ({ dashedName, block })
);
export const fetchChallengeCompleted = createAction(
types.fetchChallenge.complete,
null,
Feat(Challenges): no js preview (#16149) * fix(files): Decouple files from challenges * feat(server/react): Remove action logger use redux remote devtools instead! * feat(Challenges): Disable js on edit, enable on execute * feat(Challenge/Preview): Show message when js is disabled * refactor(frameEpic): Reduce code by using lodash * feat(frameEpic): Disable js in preview by state * feat(frameEpic): Colocate epic in Challenges/redux * refactor(ExecuteChallengeEpic): CoLocated with Challenges * refactor(executeChallengesEpic): Separate tests from main logic * feat(Challenge/Preview): Update main on edit * feat(frameEpuc): Replace frame on edit/execute This allows for sandbox to work properly * fix(Challenges/Utils): Require utisl * revert(frameEpic): Hoist function to mount code in frame * fix(frameEpic): Ensure new frame is given classname * feat(executeChallenge): Update main on code unlocked * fix(frameEpic): Filter out empty test message * fix(Challenge/Preview): Remove unnessary quote in classname * feat(codeStorageEpic): Separate localstorage from solutions loading * fix(fetchUser): Merge user actions into one prefer many effects from one action over one action to one effect * fix(themes): Centralize theme utils and defs * fix(entities.user): Fix user reducer namespacing * feat(frame): Refactor frameEpic to util * feat(Challenges.redux): Should not attempt to update main from storage * fix(loadPreviousChallengeEpic): Refactor for RFR * fix(Challenges.Modern): Show preview plane
2017-12-07 16:13:19 -08:00
meta => ({
...meta,
..._.flow(challengeToFiles, createFilesMetaCreator)(meta.challenge)
})
feat(app): new layout (#14707) * feat(app): Restructure app to be more flexible and redux idiomatic BREAKING CHANGE: Lots of breaking changes * refactor(challenges): Redux to started file structure * fix(app): lint issues due to refactor * fix(settings): Refactor settings to use folder structure * refactor(challenges): Move step redux stuff into step folder * fix(challenges): Remove fetchchallenges actions * refactor(challenges): Move project redux logic into project view subdirectory * refactor(app): %s/sagas/epics/g * refactor(redux): Use new redux-epic with combineEpic and ofType * refactor(app): Move challenge selector to app level * fix(app): Move loading challenge info into challenge route This moves a lot of the logic needed to load challenge info into the challenge app. This decouples the main app from the challenge route * refactor(map): Map is now decoupled from challenges * refactor(challenges): Use selectors everywhere instead of guessing state shape * refactor(client): refactor client epics to use selectors * refactor(app): Refactor userSelector to return user object instead of object.user * refactor(entities): Move entities logic into it's own file * fix(redux): combineTypes should be combineActions * fix(app): reducer namespacing and import * fix(Map): Fix undefined type and update redux-action * fix(redux): Refactor fetchUser to be more declarative Use rxjs methods instead of imperative if/else. Also prevent non-actions from being emitted * fix(redux): toString multi phase action types * fix(redux): typecast multiphase type, fix typo in reducer toString multiphase types in fetch challenge epic. Add epic to epics lists. Fix type in fetch challenge complete handler * fix(redux): updateCurrentChallengelogic should be centerlized Move route changes to one location. * fix(Nav): Prevent event object from hanging around closeDropDown/openDropDown where handing on to the event object. This was causing issues with react since event objects are recycled in React. * fix(Map.Challenge): decouple map selector * fix(Map): Decouple panel selectors from props Panel Selectors no longer need to know the shape of a components props. Refactored component selectors to decouple them entities state shape * fix(Map.redux): Add select challenge epic and connect map epics * fix(redux.analytics): Fix meta creator and nav/map events * fix(redux): Update current challenge ajax * fix(challenges): ssr fetch challenge should update challenge ui Was using an epic to update challenge ui on fetch complete, but this was not working on ssr due to the way ssr disables epics to wait for completion. This commit fixes this by causing the complete to directly update state in the challenge ui * fix(challenges): wrong import of types, refactor epic name * fix(redux): Prevent fetch challenge epic from emitting null to dispatch * fix(redux): prevent executechallenge from emitting null * fix(challenges.redux): testsSelector returns just tests * fix(challenges.redux): Prevent completion challenge from emitting null * refactor(Challenges.Step): Refactor step challenge to release event object * fix(redux): wrap reducers in factories reducers exported from features need to be factories this helps avoid cyclic requires messing up reducer creation We end up with exports from files being undefined as node tries to resolve cyclic dependencies. This prevents that by wrapping the `handleActions` call so that the ref to types imported from parent features are closures and can be resolved by node before we need them. * fix(Map): createUi not working correctly map utils should receive just map ui state, createMapUi needs to add title to challenge * feat(Challenges): Adds Panes and panes backend challenge * fix: Create child container to wrap children Create a ChildContainer comp' to wrap all children that represent the view for the current route. This let's the child route define if they want a full width view or if they want the standard max-width view. * feat(Panes): panes now render dividers * feat(Panes): Get divider to move currectly * fix(Nav): Add top margin to contained childs Move margin-bottom from nav to child container as margin top. This let's the jsbin style views fit snug with navbar * fix(Panes): Should be contained within their borders * feat(Panes): Update navbar height of pane on app mount * feat(Panes): Toggle map on map nav btn click * fix(gulpfile): Ensure nodemon exits on restart On process exit, wait for nodemon to shutdown before process.exit * feat(Panes): Make Panes redux first * fix(Panes): Fix divider positioning * fix(Panes): Update divider moved handler dividerMoved action now uses new panesByName structure * feat(Panes): Pane nav button will hide panes * chore(package-lock): Update package lock * feat(Panes.redux): Recaculate dividers on pane toggle * fix(Challenges): Update challenge on dashedName change This fixes backwards navigation not updating the redux state current challenge * feat(Panes.redux): Clear panes on unmount Clearing panes on unmount will clear bin buttons in nav * refactor(Map): Colocate styles * feat(Map): New map layout * fix(Map): No longer has it's own page * fix: FetchChallenges on appMounted * feat: Normalize fetchChallenge(s) results This allows superblocks to be sent with both fetchChallenge and fetchChallenges so the map is always populated on first load * feat(Map): Show blocks on first load * fix(less): Remove old css * feat(Nav): Reduce nav height * fix(Nav): Render nav after content Render nav after content and use css to reverse again on screen. We do this so the panes can render first and update redux panes state which will then update the nav ui state before nav has a chance to render * fix(Panes): Add container This adds a Panes Container that will allow it to udpate redux state so Panes Component will have redux state ready to actually render panes * feat(Challenges.Classic): Add panes * fix(Challenge.Classic): Editor onchange should not need to know about file * fix(Panes): Index on panes hide should account for hidden pane * fix(Challanges.Classic): Fix panes types * fix(Challenges): Add completion modal to all challenges Change classic modal to completion modal * fix(Panes): Dividers live on top of planes * fix(Challenges): Remove codemirror theme Remove codemirror theme and remove borders from preview frame * fix(Challenges.Classic): Remove old component * feat(Challenges.Step): Add panes to step challenge * feat(Challenges.Project): Add panes to projects * fix(Challenges.Projects): Remove row * fix(Modals): Move modal text color to challenge less This text color is dependent on the actual header color * fix(Map): Use Superblock title for ui * fix(Map): Reduce panel header height * fix(app): Capitalize Toasts folder Feature folders should be campitalized * chore(Map): Remove unused epic file * fix(Step): Fix tests * test(Map): Update createMapUi tests input
2017-07-31 20:04:01 -07:00
);
export const fetchChallenges = createAction('' + types.fetchChallenges);
export const fetchChallengesCompleted = createAction(
types.fetchChallenges.complete,
(entities, result) => ({ entities, result }),
entities => ({ entities })
);
// updateTitle(title: String) => Action
export const updateTitle = createAction(types.updateTitle);
// fetchUser() => Action
// used in combination with fetch-user-epic
export const fetchUser = createAction(types.fetchUser);
Feat(Challenges): no js preview (#16149) * fix(files): Decouple files from challenges * feat(server/react): Remove action logger use redux remote devtools instead! * feat(Challenges): Disable js on edit, enable on execute * feat(Challenge/Preview): Show message when js is disabled * refactor(frameEpic): Reduce code by using lodash * feat(frameEpic): Disable js in preview by state * feat(frameEpic): Colocate epic in Challenges/redux * refactor(ExecuteChallengeEpic): CoLocated with Challenges * refactor(executeChallengesEpic): Separate tests from main logic * feat(Challenge/Preview): Update main on edit * feat(frameEpuc): Replace frame on edit/execute This allows for sandbox to work properly * fix(Challenges/Utils): Require utisl * revert(frameEpic): Hoist function to mount code in frame * fix(frameEpic): Ensure new frame is given classname * feat(executeChallenge): Update main on code unlocked * fix(frameEpic): Filter out empty test message * fix(Challenge/Preview): Remove unnessary quote in classname * feat(codeStorageEpic): Separate localstorage from solutions loading * fix(fetchUser): Merge user actions into one prefer many effects from one action over one action to one effect * fix(themes): Centralize theme utils and defs * fix(entities.user): Fix user reducer namespacing * feat(frame): Refactor frameEpic to util * feat(Challenges.redux): Should not attempt to update main from storage * fix(loadPreviousChallengeEpic): Refactor for RFR * fix(Challenges.Modern): Show preview plane
2017-12-07 16:13:19 -08:00
export const fetchUserComplete = createAction(
types.fetchUser.complete,
({ result }) => result,
_.identity
feat(app): new layout (#14707) * feat(app): Restructure app to be more flexible and redux idiomatic BREAKING CHANGE: Lots of breaking changes * refactor(challenges): Redux to started file structure * fix(app): lint issues due to refactor * fix(settings): Refactor settings to use folder structure * refactor(challenges): Move step redux stuff into step folder * fix(challenges): Remove fetchchallenges actions * refactor(challenges): Move project redux logic into project view subdirectory * refactor(app): %s/sagas/epics/g * refactor(redux): Use new redux-epic with combineEpic and ofType * refactor(app): Move challenge selector to app level * fix(app): Move loading challenge info into challenge route This moves a lot of the logic needed to load challenge info into the challenge app. This decouples the main app from the challenge route * refactor(map): Map is now decoupled from challenges * refactor(challenges): Use selectors everywhere instead of guessing state shape * refactor(client): refactor client epics to use selectors * refactor(app): Refactor userSelector to return user object instead of object.user * refactor(entities): Move entities logic into it's own file * fix(redux): combineTypes should be combineActions * fix(app): reducer namespacing and import * fix(Map): Fix undefined type and update redux-action * fix(redux): Refactor fetchUser to be more declarative Use rxjs methods instead of imperative if/else. Also prevent non-actions from being emitted * fix(redux): toString multi phase action types * fix(redux): typecast multiphase type, fix typo in reducer toString multiphase types in fetch challenge epic. Add epic to epics lists. Fix type in fetch challenge complete handler * fix(redux): updateCurrentChallengelogic should be centerlized Move route changes to one location. * fix(Nav): Prevent event object from hanging around closeDropDown/openDropDown where handing on to the event object. This was causing issues with react since event objects are recycled in React. * fix(Map.Challenge): decouple map selector * fix(Map): Decouple panel selectors from props Panel Selectors no longer need to know the shape of a components props. Refactored component selectors to decouple them entities state shape * fix(Map.redux): Add select challenge epic and connect map epics * fix(redux.analytics): Fix meta creator and nav/map events * fix(redux): Update current challenge ajax * fix(challenges): ssr fetch challenge should update challenge ui Was using an epic to update challenge ui on fetch complete, but this was not working on ssr due to the way ssr disables epics to wait for completion. This commit fixes this by causing the complete to directly update state in the challenge ui * fix(challenges): wrong import of types, refactor epic name * fix(redux): Prevent fetch challenge epic from emitting null to dispatch * fix(redux): prevent executechallenge from emitting null * fix(challenges.redux): testsSelector returns just tests * fix(challenges.redux): Prevent completion challenge from emitting null * refactor(Challenges.Step): Refactor step challenge to release event object * fix(redux): wrap reducers in factories reducers exported from features need to be factories this helps avoid cyclic requires messing up reducer creation We end up with exports from files being undefined as node tries to resolve cyclic dependencies. This prevents that by wrapping the `handleActions` call so that the ref to types imported from parent features are closures and can be resolved by node before we need them. * fix(Map): createUi not working correctly map utils should receive just map ui state, createMapUi needs to add title to challenge * feat(Challenges): Adds Panes and panes backend challenge * fix: Create child container to wrap children Create a ChildContainer comp' to wrap all children that represent the view for the current route. This let's the child route define if they want a full width view or if they want the standard max-width view. * feat(Panes): panes now render dividers * feat(Panes): Get divider to move currectly * fix(Nav): Add top margin to contained childs Move margin-bottom from nav to child container as margin top. This let's the jsbin style views fit snug with navbar * fix(Panes): Should be contained within their borders * feat(Panes): Update navbar height of pane on app mount * feat(Panes): Toggle map on map nav btn click * fix(gulpfile): Ensure nodemon exits on restart On process exit, wait for nodemon to shutdown before process.exit * feat(Panes): Make Panes redux first * fix(Panes): Fix divider positioning * fix(Panes): Update divider moved handler dividerMoved action now uses new panesByName structure * feat(Panes): Pane nav button will hide panes * chore(package-lock): Update package lock * feat(Panes.redux): Recaculate dividers on pane toggle * fix(Challenges): Update challenge on dashedName change This fixes backwards navigation not updating the redux state current challenge * feat(Panes.redux): Clear panes on unmount Clearing panes on unmount will clear bin buttons in nav * refactor(Map): Colocate styles * feat(Map): New map layout * fix(Map): No longer has it's own page * fix: FetchChallenges on appMounted * feat: Normalize fetchChallenge(s) results This allows superblocks to be sent with both fetchChallenge and fetchChallenges so the map is always populated on first load * feat(Map): Show blocks on first load * fix(less): Remove old css * feat(Nav): Reduce nav height * fix(Nav): Render nav after content Render nav after content and use css to reverse again on screen. We do this so the panes can render first and update redux panes state which will then update the nav ui state before nav has a chance to render * fix(Panes): Add container This adds a Panes Container that will allow it to udpate redux state so Panes Component will have redux state ready to actually render panes * feat(Challenges.Classic): Add panes * fix(Challenge.Classic): Editor onchange should not need to know about file * fix(Panes): Index on panes hide should account for hidden pane * fix(Challanges.Classic): Fix panes types * fix(Challenges): Add completion modal to all challenges Change classic modal to completion modal * fix(Panes): Dividers live on top of planes * fix(Challenges): Remove codemirror theme Remove codemirror theme and remove borders from preview frame * fix(Challenges.Classic): Remove old component * feat(Challenges.Step): Add panes to step challenge * feat(Challenges.Project): Add panes to projects * fix(Challenges.Projects): Remove row * fix(Modals): Move modal text color to challenge less This text color is dependent on the actual header color * fix(Map): Use Superblock title for ui * fix(Map): Reduce panel header height * fix(app): Capitalize Toasts folder Feature folders should be campitalized * chore(Map): Remove unused epic file * fix(Step): Fix tests * test(Map): Update createMapUi tests input
2017-07-31 20:04:01 -07:00
);
Feat(Challenges): no js preview (#16149) * fix(files): Decouple files from challenges * feat(server/react): Remove action logger use redux remote devtools instead! * feat(Challenges): Disable js on edit, enable on execute * feat(Challenge/Preview): Show message when js is disabled * refactor(frameEpic): Reduce code by using lodash * feat(frameEpic): Disable js in preview by state * feat(frameEpic): Colocate epic in Challenges/redux * refactor(ExecuteChallengeEpic): CoLocated with Challenges * refactor(executeChallengesEpic): Separate tests from main logic * feat(Challenge/Preview): Update main on edit * feat(frameEpuc): Replace frame on edit/execute This allows for sandbox to work properly * fix(Challenges/Utils): Require utisl * revert(frameEpic): Hoist function to mount code in frame * fix(frameEpic): Ensure new frame is given classname * feat(executeChallenge): Update main on code unlocked * fix(frameEpic): Filter out empty test message * fix(Challenge/Preview): Remove unnessary quote in classname * feat(codeStorageEpic): Separate localstorage from solutions loading * fix(fetchUser): Merge user actions into one prefer many effects from one action over one action to one effect * fix(themes): Centralize theme utils and defs * fix(entities.user): Fix user reducer namespacing * feat(frame): Refactor frameEpic to util * feat(Challenges.redux): Should not attempt to update main from storage * fix(loadPreviousChallengeEpic): Refactor for RFR * fix(Challenges.Modern): Show preview plane
2017-12-07 16:13:19 -08:00
feat(app): new layout (#14707) * feat(app): Restructure app to be more flexible and redux idiomatic BREAKING CHANGE: Lots of breaking changes * refactor(challenges): Redux to started file structure * fix(app): lint issues due to refactor * fix(settings): Refactor settings to use folder structure * refactor(challenges): Move step redux stuff into step folder * fix(challenges): Remove fetchchallenges actions * refactor(challenges): Move project redux logic into project view subdirectory * refactor(app): %s/sagas/epics/g * refactor(redux): Use new redux-epic with combineEpic and ofType * refactor(app): Move challenge selector to app level * fix(app): Move loading challenge info into challenge route This moves a lot of the logic needed to load challenge info into the challenge app. This decouples the main app from the challenge route * refactor(map): Map is now decoupled from challenges * refactor(challenges): Use selectors everywhere instead of guessing state shape * refactor(client): refactor client epics to use selectors * refactor(app): Refactor userSelector to return user object instead of object.user * refactor(entities): Move entities logic into it's own file * fix(redux): combineTypes should be combineActions * fix(app): reducer namespacing and import * fix(Map): Fix undefined type and update redux-action * fix(redux): Refactor fetchUser to be more declarative Use rxjs methods instead of imperative if/else. Also prevent non-actions from being emitted * fix(redux): toString multi phase action types * fix(redux): typecast multiphase type, fix typo in reducer toString multiphase types in fetch challenge epic. Add epic to epics lists. Fix type in fetch challenge complete handler * fix(redux): updateCurrentChallengelogic should be centerlized Move route changes to one location. * fix(Nav): Prevent event object from hanging around closeDropDown/openDropDown where handing on to the event object. This was causing issues with react since event objects are recycled in React. * fix(Map.Challenge): decouple map selector * fix(Map): Decouple panel selectors from props Panel Selectors no longer need to know the shape of a components props. Refactored component selectors to decouple them entities state shape * fix(Map.redux): Add select challenge epic and connect map epics * fix(redux.analytics): Fix meta creator and nav/map events * fix(redux): Update current challenge ajax * fix(challenges): ssr fetch challenge should update challenge ui Was using an epic to update challenge ui on fetch complete, but this was not working on ssr due to the way ssr disables epics to wait for completion. This commit fixes this by causing the complete to directly update state in the challenge ui * fix(challenges): wrong import of types, refactor epic name * fix(redux): Prevent fetch challenge epic from emitting null to dispatch * fix(redux): prevent executechallenge from emitting null * fix(challenges.redux): testsSelector returns just tests * fix(challenges.redux): Prevent completion challenge from emitting null * refactor(Challenges.Step): Refactor step challenge to release event object * fix(redux): wrap reducers in factories reducers exported from features need to be factories this helps avoid cyclic requires messing up reducer creation We end up with exports from files being undefined as node tries to resolve cyclic dependencies. This prevents that by wrapping the `handleActions` call so that the ref to types imported from parent features are closures and can be resolved by node before we need them. * fix(Map): createUi not working correctly map utils should receive just map ui state, createMapUi needs to add title to challenge * feat(Challenges): Adds Panes and panes backend challenge * fix: Create child container to wrap children Create a ChildContainer comp' to wrap all children that represent the view for the current route. This let's the child route define if they want a full width view or if they want the standard max-width view. * feat(Panes): panes now render dividers * feat(Panes): Get divider to move currectly * fix(Nav): Add top margin to contained childs Move margin-bottom from nav to child container as margin top. This let's the jsbin style views fit snug with navbar * fix(Panes): Should be contained within their borders * feat(Panes): Update navbar height of pane on app mount * feat(Panes): Toggle map on map nav btn click * fix(gulpfile): Ensure nodemon exits on restart On process exit, wait for nodemon to shutdown before process.exit * feat(Panes): Make Panes redux first * fix(Panes): Fix divider positioning * fix(Panes): Update divider moved handler dividerMoved action now uses new panesByName structure * feat(Panes): Pane nav button will hide panes * chore(package-lock): Update package lock * feat(Panes.redux): Recaculate dividers on pane toggle * fix(Challenges): Update challenge on dashedName change This fixes backwards navigation not updating the redux state current challenge * feat(Panes.redux): Clear panes on unmount Clearing panes on unmount will clear bin buttons in nav * refactor(Map): Colocate styles * feat(Map): New map layout * fix(Map): No longer has it's own page * fix: FetchChallenges on appMounted * feat: Normalize fetchChallenge(s) results This allows superblocks to be sent with both fetchChallenge and fetchChallenges so the map is always populated on first load * feat(Map): Show blocks on first load * fix(less): Remove old css * feat(Nav): Reduce nav height * fix(Nav): Render nav after content Render nav after content and use css to reverse again on screen. We do this so the panes can render first and update redux panes state which will then update the nav ui state before nav has a chance to render * fix(Panes): Add container This adds a Panes Container that will allow it to udpate redux state so Panes Component will have redux state ready to actually render panes * feat(Challenges.Classic): Add panes * fix(Challenge.Classic): Editor onchange should not need to know about file * fix(Panes): Index on panes hide should account for hidden pane * fix(Challanges.Classic): Fix panes types * fix(Challenges): Add completion modal to all challenges Change classic modal to completion modal * fix(Panes): Dividers live on top of planes * fix(Challenges): Remove codemirror theme Remove codemirror theme and remove borders from preview frame * fix(Challenges.Classic): Remove old component * feat(Challenges.Step): Add panes to step challenge * feat(Challenges.Project): Add panes to projects * fix(Challenges.Projects): Remove row * fix(Modals): Move modal text color to challenge less This text color is dependent on the actual header color * fix(Map): Use Superblock title for ui * fix(Map): Reduce panel header height * fix(app): Capitalize Toasts folder Feature folders should be campitalized * chore(Map): Remove unused epic file * fix(Step): Fix tests * test(Map): Update createMapUi tests input
2017-07-31 20:04:01 -07:00
export const showSignIn = createAction(types.showSignIn);
// used when server needs client to redirect
export const delayedRedirect = createAction(types.delayedRedirect);
// hardGoTo(path: String) => Action
export const hardGoTo = createAction(types.hardGoTo);
export const createErrorObservable = error => Observable.just({
type: types.handleError,
error
});
// doActionOnError(
// actionCreator: (() => Action|Null)
// ) => (error: Error) => Observable[Action]
export const doActionOnError = actionCreator => error => Observable.of(
{
type: types.handleError,
error
},
actionCreator()
);
export const toggleNightMode = createAction(
types.toggleNightMode,
Feat(Challenges): no js preview (#16149) * fix(files): Decouple files from challenges * feat(server/react): Remove action logger use redux remote devtools instead! * feat(Challenges): Disable js on edit, enable on execute * feat(Challenge/Preview): Show message when js is disabled * refactor(frameEpic): Reduce code by using lodash * feat(frameEpic): Disable js in preview by state * feat(frameEpic): Colocate epic in Challenges/redux * refactor(ExecuteChallengeEpic): CoLocated with Challenges * refactor(executeChallengesEpic): Separate tests from main logic * feat(Challenge/Preview): Update main on edit * feat(frameEpuc): Replace frame on edit/execute This allows for sandbox to work properly * fix(Challenges/Utils): Require utisl * revert(frameEpic): Hoist function to mount code in frame * fix(frameEpic): Ensure new frame is given classname * feat(executeChallenge): Update main on code unlocked * fix(frameEpic): Filter out empty test message * fix(Challenge/Preview): Remove unnessary quote in classname * feat(codeStorageEpic): Separate localstorage from solutions loading * fix(fetchUser): Merge user actions into one prefer many effects from one action over one action to one effect * fix(themes): Centralize theme utils and defs * fix(entities.user): Fix user reducer namespacing * feat(frame): Refactor frameEpic to util * feat(Challenges.redux): Should not attempt to update main from storage * fix(loadPreviousChallengeEpic): Refactor for RFR * fix(Challenges.Modern): Show preview plane
2017-12-07 16:13:19 -08:00
null,
(username, theme) => updateThemeMetacreator(username, invertTheme(theme))
);
export const postThemeComplete = createAction(
types.postThemeComplete,
null,
updateThemeMetacreator
feat(app): new layout (#14707) * feat(app): Restructure app to be more flexible and redux idiomatic BREAKING CHANGE: Lots of breaking changes * refactor(challenges): Redux to started file structure * fix(app): lint issues due to refactor * fix(settings): Refactor settings to use folder structure * refactor(challenges): Move step redux stuff into step folder * fix(challenges): Remove fetchchallenges actions * refactor(challenges): Move project redux logic into project view subdirectory * refactor(app): %s/sagas/epics/g * refactor(redux): Use new redux-epic with combineEpic and ofType * refactor(app): Move challenge selector to app level * fix(app): Move loading challenge info into challenge route This moves a lot of the logic needed to load challenge info into the challenge app. This decouples the main app from the challenge route * refactor(map): Map is now decoupled from challenges * refactor(challenges): Use selectors everywhere instead of guessing state shape * refactor(client): refactor client epics to use selectors * refactor(app): Refactor userSelector to return user object instead of object.user * refactor(entities): Move entities logic into it's own file * fix(redux): combineTypes should be combineActions * fix(app): reducer namespacing and import * fix(Map): Fix undefined type and update redux-action * fix(redux): Refactor fetchUser to be more declarative Use rxjs methods instead of imperative if/else. Also prevent non-actions from being emitted * fix(redux): toString multi phase action types * fix(redux): typecast multiphase type, fix typo in reducer toString multiphase types in fetch challenge epic. Add epic to epics lists. Fix type in fetch challenge complete handler * fix(redux): updateCurrentChallengelogic should be centerlized Move route changes to one location. * fix(Nav): Prevent event object from hanging around closeDropDown/openDropDown where handing on to the event object. This was causing issues with react since event objects are recycled in React. * fix(Map.Challenge): decouple map selector * fix(Map): Decouple panel selectors from props Panel Selectors no longer need to know the shape of a components props. Refactored component selectors to decouple them entities state shape * fix(Map.redux): Add select challenge epic and connect map epics * fix(redux.analytics): Fix meta creator and nav/map events * fix(redux): Update current challenge ajax * fix(challenges): ssr fetch challenge should update challenge ui Was using an epic to update challenge ui on fetch complete, but this was not working on ssr due to the way ssr disables epics to wait for completion. This commit fixes this by causing the complete to directly update state in the challenge ui * fix(challenges): wrong import of types, refactor epic name * fix(redux): Prevent fetch challenge epic from emitting null to dispatch * fix(redux): prevent executechallenge from emitting null * fix(challenges.redux): testsSelector returns just tests * fix(challenges.redux): Prevent completion challenge from emitting null * refactor(Challenges.Step): Refactor step challenge to release event object * fix(redux): wrap reducers in factories reducers exported from features need to be factories this helps avoid cyclic requires messing up reducer creation We end up with exports from files being undefined as node tries to resolve cyclic dependencies. This prevents that by wrapping the `handleActions` call so that the ref to types imported from parent features are closures and can be resolved by node before we need them. * fix(Map): createUi not working correctly map utils should receive just map ui state, createMapUi needs to add title to challenge * feat(Challenges): Adds Panes and panes backend challenge * fix: Create child container to wrap children Create a ChildContainer comp' to wrap all children that represent the view for the current route. This let's the child route define if they want a full width view or if they want the standard max-width view. * feat(Panes): panes now render dividers * feat(Panes): Get divider to move currectly * fix(Nav): Add top margin to contained childs Move margin-bottom from nav to child container as margin top. This let's the jsbin style views fit snug with navbar * fix(Panes): Should be contained within their borders * feat(Panes): Update navbar height of pane on app mount * feat(Panes): Toggle map on map nav btn click * fix(gulpfile): Ensure nodemon exits on restart On process exit, wait for nodemon to shutdown before process.exit * feat(Panes): Make Panes redux first * fix(Panes): Fix divider positioning * fix(Panes): Update divider moved handler dividerMoved action now uses new panesByName structure * feat(Panes): Pane nav button will hide panes * chore(package-lock): Update package lock * feat(Panes.redux): Recaculate dividers on pane toggle * fix(Challenges): Update challenge on dashedName change This fixes backwards navigation not updating the redux state current challenge * feat(Panes.redux): Clear panes on unmount Clearing panes on unmount will clear bin buttons in nav * refactor(Map): Colocate styles * feat(Map): New map layout * fix(Map): No longer has it's own page * fix: FetchChallenges on appMounted * feat: Normalize fetchChallenge(s) results This allows superblocks to be sent with both fetchChallenge and fetchChallenges so the map is always populated on first load * feat(Map): Show blocks on first load * fix(less): Remove old css * feat(Nav): Reduce nav height * fix(Nav): Render nav after content Render nav after content and use css to reverse again on screen. We do this so the panes can render first and update redux panes state which will then update the nav ui state before nav has a chance to render * fix(Panes): Add container This adds a Panes Container that will allow it to udpate redux state so Panes Component will have redux state ready to actually render panes * feat(Challenges.Classic): Add panes * fix(Challenge.Classic): Editor onchange should not need to know about file * fix(Panes): Index on panes hide should account for hidden pane * fix(Challanges.Classic): Fix panes types * fix(Challenges): Add completion modal to all challenges Change classic modal to completion modal * fix(Panes): Dividers live on top of planes * fix(Challenges): Remove codemirror theme Remove codemirror theme and remove borders from preview frame * fix(Challenges.Classic): Remove old component * feat(Challenges.Step): Add panes to step challenge * feat(Challenges.Project): Add panes to projects * fix(Challenges.Projects): Remove row * fix(Modals): Move modal text color to challenge less This text color is dependent on the actual header color * fix(Map): Use Superblock title for ui * fix(Map): Reduce panel header height * fix(app): Capitalize Toasts folder Feature folders should be campitalized * chore(Map): Remove unused epic file * fix(Step): Fix tests * test(Map): Update createMapUi tests input
2017-07-31 20:04:01 -07:00
);
Feat(Challenges): no js preview (#16149) * fix(files): Decouple files from challenges * feat(server/react): Remove action logger use redux remote devtools instead! * feat(Challenges): Disable js on edit, enable on execute * feat(Challenge/Preview): Show message when js is disabled * refactor(frameEpic): Reduce code by using lodash * feat(frameEpic): Disable js in preview by state * feat(frameEpic): Colocate epic in Challenges/redux * refactor(ExecuteChallengeEpic): CoLocated with Challenges * refactor(executeChallengesEpic): Separate tests from main logic * feat(Challenge/Preview): Update main on edit * feat(frameEpuc): Replace frame on edit/execute This allows for sandbox to work properly * fix(Challenges/Utils): Require utisl * revert(frameEpic): Hoist function to mount code in frame * fix(frameEpic): Ensure new frame is given classname * feat(executeChallenge): Update main on code unlocked * fix(frameEpic): Filter out empty test message * fix(Challenge/Preview): Remove unnessary quote in classname * feat(codeStorageEpic): Separate localstorage from solutions loading * fix(fetchUser): Merge user actions into one prefer many effects from one action over one action to one effect * fix(themes): Centralize theme utils and defs * fix(entities.user): Fix user reducer namespacing * feat(frame): Refactor frameEpic to util * feat(Challenges.redux): Should not attempt to update main from storage * fix(loadPreviousChallengeEpic): Refactor for RFR * fix(Challenges.Modern): Show preview plane
2017-12-07 16:13:19 -08:00
const defaultState = {
feat(app): new layout (#14707) * feat(app): Restructure app to be more flexible and redux idiomatic BREAKING CHANGE: Lots of breaking changes * refactor(challenges): Redux to started file structure * fix(app): lint issues due to refactor * fix(settings): Refactor settings to use folder structure * refactor(challenges): Move step redux stuff into step folder * fix(challenges): Remove fetchchallenges actions * refactor(challenges): Move project redux logic into project view subdirectory * refactor(app): %s/sagas/epics/g * refactor(redux): Use new redux-epic with combineEpic and ofType * refactor(app): Move challenge selector to app level * fix(app): Move loading challenge info into challenge route This moves a lot of the logic needed to load challenge info into the challenge app. This decouples the main app from the challenge route * refactor(map): Map is now decoupled from challenges * refactor(challenges): Use selectors everywhere instead of guessing state shape * refactor(client): refactor client epics to use selectors * refactor(app): Refactor userSelector to return user object instead of object.user * refactor(entities): Move entities logic into it's own file * fix(redux): combineTypes should be combineActions * fix(app): reducer namespacing and import * fix(Map): Fix undefined type and update redux-action * fix(redux): Refactor fetchUser to be more declarative Use rxjs methods instead of imperative if/else. Also prevent non-actions from being emitted * fix(redux): toString multi phase action types * fix(redux): typecast multiphase type, fix typo in reducer toString multiphase types in fetch challenge epic. Add epic to epics lists. Fix type in fetch challenge complete handler * fix(redux): updateCurrentChallengelogic should be centerlized Move route changes to one location. * fix(Nav): Prevent event object from hanging around closeDropDown/openDropDown where handing on to the event object. This was causing issues with react since event objects are recycled in React. * fix(Map.Challenge): decouple map selector * fix(Map): Decouple panel selectors from props Panel Selectors no longer need to know the shape of a components props. Refactored component selectors to decouple them entities state shape * fix(Map.redux): Add select challenge epic and connect map epics * fix(redux.analytics): Fix meta creator and nav/map events * fix(redux): Update current challenge ajax * fix(challenges): ssr fetch challenge should update challenge ui Was using an epic to update challenge ui on fetch complete, but this was not working on ssr due to the way ssr disables epics to wait for completion. This commit fixes this by causing the complete to directly update state in the challenge ui * fix(challenges): wrong import of types, refactor epic name * fix(redux): Prevent fetch challenge epic from emitting null to dispatch * fix(redux): prevent executechallenge from emitting null * fix(challenges.redux): testsSelector returns just tests * fix(challenges.redux): Prevent completion challenge from emitting null * refactor(Challenges.Step): Refactor step challenge to release event object * fix(redux): wrap reducers in factories reducers exported from features need to be factories this helps avoid cyclic requires messing up reducer creation We end up with exports from files being undefined as node tries to resolve cyclic dependencies. This prevents that by wrapping the `handleActions` call so that the ref to types imported from parent features are closures and can be resolved by node before we need them. * fix(Map): createUi not working correctly map utils should receive just map ui state, createMapUi needs to add title to challenge * feat(Challenges): Adds Panes and panes backend challenge * fix: Create child container to wrap children Create a ChildContainer comp' to wrap all children that represent the view for the current route. This let's the child route define if they want a full width view or if they want the standard max-width view. * feat(Panes): panes now render dividers * feat(Panes): Get divider to move currectly * fix(Nav): Add top margin to contained childs Move margin-bottom from nav to child container as margin top. This let's the jsbin style views fit snug with navbar * fix(Panes): Should be contained within their borders * feat(Panes): Update navbar height of pane on app mount * feat(Panes): Toggle map on map nav btn click * fix(gulpfile): Ensure nodemon exits on restart On process exit, wait for nodemon to shutdown before process.exit * feat(Panes): Make Panes redux first * fix(Panes): Fix divider positioning * fix(Panes): Update divider moved handler dividerMoved action now uses new panesByName structure * feat(Panes): Pane nav button will hide panes * chore(package-lock): Update package lock * feat(Panes.redux): Recaculate dividers on pane toggle * fix(Challenges): Update challenge on dashedName change This fixes backwards navigation not updating the redux state current challenge * feat(Panes.redux): Clear panes on unmount Clearing panes on unmount will clear bin buttons in nav * refactor(Map): Colocate styles * feat(Map): New map layout * fix(Map): No longer has it's own page * fix: FetchChallenges on appMounted * feat: Normalize fetchChallenge(s) results This allows superblocks to be sent with both fetchChallenge and fetchChallenges so the map is always populated on first load * feat(Map): Show blocks on first load * fix(less): Remove old css * feat(Nav): Reduce nav height * fix(Nav): Render nav after content Render nav after content and use css to reverse again on screen. We do this so the panes can render first and update redux panes state which will then update the nav ui state before nav has a chance to render * fix(Panes): Add container This adds a Panes Container that will allow it to udpate redux state so Panes Component will have redux state ready to actually render panes * feat(Challenges.Classic): Add panes * fix(Challenge.Classic): Editor onchange should not need to know about file * fix(Panes): Index on panes hide should account for hidden pane * fix(Challanges.Classic): Fix panes types * fix(Challenges): Add completion modal to all challenges Change classic modal to completion modal * fix(Panes): Dividers live on top of planes * fix(Challenges): Remove codemirror theme Remove codemirror theme and remove borders from preview frame * fix(Challenges.Classic): Remove old component * feat(Challenges.Step): Add panes to step challenge * feat(Challenges.Project): Add panes to projects * fix(Challenges.Projects): Remove row * fix(Modals): Move modal text color to challenge less This text color is dependent on the actual header color * fix(Map): Use Superblock title for ui * fix(Map): Reduce panel header height * fix(app): Capitalize Toasts folder Feature folders should be campitalized * chore(Map): Remove unused epic file * fix(Step): Fix tests * test(Map): Update createMapUi tests input
2017-07-31 20:04:01 -07:00
title: 'Learn To Code | freeCodeCamp',
isSignInAttempted: false,
user: '',
csrfToken: '',
// eventually this should be only in the user object
currentChallenge: '',
superBlocks: []
};
export const getNS = state => state[ns];
export const csrfSelector = state => getNS(state).csrfToken;
export const titleSelector = state => getNS(state).title;
export const currentChallengeSelector = state => getNS(state).currentChallenge;
export const superBlocksSelector = state => getNS(state).superBlocks;
export const signInLoadingSelector = state => !getNS(state).isSignInAttempted;
Feat(Challenges): no js preview (#16149) * fix(files): Decouple files from challenges * feat(server/react): Remove action logger use redux remote devtools instead! * feat(Challenges): Disable js on edit, enable on execute * feat(Challenge/Preview): Show message when js is disabled * refactor(frameEpic): Reduce code by using lodash * feat(frameEpic): Disable js in preview by state * feat(frameEpic): Colocate epic in Challenges/redux * refactor(ExecuteChallengeEpic): CoLocated with Challenges * refactor(executeChallengesEpic): Separate tests from main logic * feat(Challenge/Preview): Update main on edit * feat(frameEpuc): Replace frame on edit/execute This allows for sandbox to work properly * fix(Challenges/Utils): Require utisl * revert(frameEpic): Hoist function to mount code in frame * fix(frameEpic): Ensure new frame is given classname * feat(executeChallenge): Update main on code unlocked * fix(frameEpic): Filter out empty test message * fix(Challenge/Preview): Remove unnessary quote in classname * feat(codeStorageEpic): Separate localstorage from solutions loading * fix(fetchUser): Merge user actions into one prefer many effects from one action over one action to one effect * fix(themes): Centralize theme utils and defs * fix(entities.user): Fix user reducer namespacing * feat(frame): Refactor frameEpic to util * feat(Challenges.redux): Should not attempt to update main from storage * fix(loadPreviousChallengeEpic): Refactor for RFR * fix(Challenges.Modern): Show preview plane
2017-12-07 16:13:19 -08:00
export const usernameSelector = state => getNS(state).user || '';
feat(app): new layout (#14707) * feat(app): Restructure app to be more flexible and redux idiomatic BREAKING CHANGE: Lots of breaking changes * refactor(challenges): Redux to started file structure * fix(app): lint issues due to refactor * fix(settings): Refactor settings to use folder structure * refactor(challenges): Move step redux stuff into step folder * fix(challenges): Remove fetchchallenges actions * refactor(challenges): Move project redux logic into project view subdirectory * refactor(app): %s/sagas/epics/g * refactor(redux): Use new redux-epic with combineEpic and ofType * refactor(app): Move challenge selector to app level * fix(app): Move loading challenge info into challenge route This moves a lot of the logic needed to load challenge info into the challenge app. This decouples the main app from the challenge route * refactor(map): Map is now decoupled from challenges * refactor(challenges): Use selectors everywhere instead of guessing state shape * refactor(client): refactor client epics to use selectors * refactor(app): Refactor userSelector to return user object instead of object.user * refactor(entities): Move entities logic into it's own file * fix(redux): combineTypes should be combineActions * fix(app): reducer namespacing and import * fix(Map): Fix undefined type and update redux-action * fix(redux): Refactor fetchUser to be more declarative Use rxjs methods instead of imperative if/else. Also prevent non-actions from being emitted * fix(redux): toString multi phase action types * fix(redux): typecast multiphase type, fix typo in reducer toString multiphase types in fetch challenge epic. Add epic to epics lists. Fix type in fetch challenge complete handler * fix(redux): updateCurrentChallengelogic should be centerlized Move route changes to one location. * fix(Nav): Prevent event object from hanging around closeDropDown/openDropDown where handing on to the event object. This was causing issues with react since event objects are recycled in React. * fix(Map.Challenge): decouple map selector * fix(Map): Decouple panel selectors from props Panel Selectors no longer need to know the shape of a components props. Refactored component selectors to decouple them entities state shape * fix(Map.redux): Add select challenge epic and connect map epics * fix(redux.analytics): Fix meta creator and nav/map events * fix(redux): Update current challenge ajax * fix(challenges): ssr fetch challenge should update challenge ui Was using an epic to update challenge ui on fetch complete, but this was not working on ssr due to the way ssr disables epics to wait for completion. This commit fixes this by causing the complete to directly update state in the challenge ui * fix(challenges): wrong import of types, refactor epic name * fix(redux): Prevent fetch challenge epic from emitting null to dispatch * fix(redux): prevent executechallenge from emitting null * fix(challenges.redux): testsSelector returns just tests * fix(challenges.redux): Prevent completion challenge from emitting null * refactor(Challenges.Step): Refactor step challenge to release event object * fix(redux): wrap reducers in factories reducers exported from features need to be factories this helps avoid cyclic requires messing up reducer creation We end up with exports from files being undefined as node tries to resolve cyclic dependencies. This prevents that by wrapping the `handleActions` call so that the ref to types imported from parent features are closures and can be resolved by node before we need them. * fix(Map): createUi not working correctly map utils should receive just map ui state, createMapUi needs to add title to challenge * feat(Challenges): Adds Panes and panes backend challenge * fix: Create child container to wrap children Create a ChildContainer comp' to wrap all children that represent the view for the current route. This let's the child route define if they want a full width view or if they want the standard max-width view. * feat(Panes): panes now render dividers * feat(Panes): Get divider to move currectly * fix(Nav): Add top margin to contained childs Move margin-bottom from nav to child container as margin top. This let's the jsbin style views fit snug with navbar * fix(Panes): Should be contained within their borders * feat(Panes): Update navbar height of pane on app mount * feat(Panes): Toggle map on map nav btn click * fix(gulpfile): Ensure nodemon exits on restart On process exit, wait for nodemon to shutdown before process.exit * feat(Panes): Make Panes redux first * fix(Panes): Fix divider positioning * fix(Panes): Update divider moved handler dividerMoved action now uses new panesByName structure * feat(Panes): Pane nav button will hide panes * chore(package-lock): Update package lock * feat(Panes.redux): Recaculate dividers on pane toggle * fix(Challenges): Update challenge on dashedName change This fixes backwards navigation not updating the redux state current challenge * feat(Panes.redux): Clear panes on unmount Clearing panes on unmount will clear bin buttons in nav * refactor(Map): Colocate styles * feat(Map): New map layout * fix(Map): No longer has it's own page * fix: FetchChallenges on appMounted * feat: Normalize fetchChallenge(s) results This allows superblocks to be sent with both fetchChallenge and fetchChallenges so the map is always populated on first load * feat(Map): Show blocks on first load * fix(less): Remove old css * feat(Nav): Reduce nav height * fix(Nav): Render nav after content Render nav after content and use css to reverse again on screen. We do this so the panes can render first and update redux panes state which will then update the nav ui state before nav has a chance to render * fix(Panes): Add container This adds a Panes Container that will allow it to udpate redux state so Panes Component will have redux state ready to actually render panes * feat(Challenges.Classic): Add panes * fix(Challenge.Classic): Editor onchange should not need to know about file * fix(Panes): Index on panes hide should account for hidden pane * fix(Challanges.Classic): Fix panes types * fix(Challenges): Add completion modal to all challenges Change classic modal to completion modal * fix(Panes): Dividers live on top of planes * fix(Challenges): Remove codemirror theme Remove codemirror theme and remove borders from preview frame * fix(Challenges.Classic): Remove old component * feat(Challenges.Step): Add panes to step challenge * feat(Challenges.Project): Add panes to projects * fix(Challenges.Projects): Remove row * fix(Modals): Move modal text color to challenge less This text color is dependent on the actual header color * fix(Map): Use Superblock title for ui * fix(Map): Reduce panel header height * fix(app): Capitalize Toasts folder Feature folders should be campitalized * chore(Map): Remove unused epic file * fix(Step): Fix tests * test(Map): Update createMapUi tests input
2017-07-31 20:04:01 -07:00
export const userSelector = createSelector(
state => getNS(state).user,
state => entitiesSelector(state).user,
(username, userMap) => userMap[username] || {}
);
Feat(Challenges): no js preview (#16149) * fix(files): Decouple files from challenges * feat(server/react): Remove action logger use redux remote devtools instead! * feat(Challenges): Disable js on edit, enable on execute * feat(Challenge/Preview): Show message when js is disabled * refactor(frameEpic): Reduce code by using lodash * feat(frameEpic): Disable js in preview by state * feat(frameEpic): Colocate epic in Challenges/redux * refactor(ExecuteChallengeEpic): CoLocated with Challenges * refactor(executeChallengesEpic): Separate tests from main logic * feat(Challenge/Preview): Update main on edit * feat(frameEpuc): Replace frame on edit/execute This allows for sandbox to work properly * fix(Challenges/Utils): Require utisl * revert(frameEpic): Hoist function to mount code in frame * fix(frameEpic): Ensure new frame is given classname * feat(executeChallenge): Update main on code unlocked * fix(frameEpic): Filter out empty test message * fix(Challenge/Preview): Remove unnessary quote in classname * feat(codeStorageEpic): Separate localstorage from solutions loading * fix(fetchUser): Merge user actions into one prefer many effects from one action over one action to one effect * fix(themes): Centralize theme utils and defs * fix(entities.user): Fix user reducer namespacing * feat(frame): Refactor frameEpic to util * feat(Challenges.redux): Should not attempt to update main from storage * fix(loadPreviousChallengeEpic): Refactor for RFR * fix(Challenges.Modern): Show preview plane
2017-12-07 16:13:19 -08:00
export const themeSelector = _.flow(
userSelector,
user => user.theme || themes.default
);
feat: prep for modern challenges (#15781) * feat(seed): Add modern challenge * chore(react): Use prop-types package * feat: Initial refactor to redux-first-router BREAKING CHANGE: Everything is different! * feat: First rendering * feat(routes): Challenges view render but failing * fix(Challenges): Remove contain HOC * fix(RFR): Add params selector * fix(RFR): :en should be :lang * fix: Update berks utils for redux * fix(Map): Challenge link to arg * fix(Map): Add trailing slash to map page * fix(RFR): Use FCC Link Use fcc Link to get around issue of lang being undefined * fix(Router): Link to is required * fix(app): Rely on RFR state for app lang * chore(RFR): Remove unused RFR Link * fix(RFR): Hydrate initial challenge using RFR and RO * fix: Casing issue * fix(RFR): Undefined links * fix(RFR): Use onRoute<name> convention for route types * feat(server/react): Add helpful redux logging/throwing * fix(server/react): Strip out nonjson from state This prevents thunks in routesMap from breaking serialization * fix(RFR/Link): Should accept any renderable * fix(RFR): Get redirects working * fix(RFR): Redirects and not found's * fix(Map): Move challenge onClick handler * fix(Map): Allow Router.link to handle clicks after onClick * fix(routes): Remove react-router-redux * feat(Router): Add lang to all route actions by default * fix(entities): Only fetch challenge if not already loaded * fix(Files): Move files to own feature * chore(Challenges): Remove vestigial hints logic * fix(RFR): Update challenges on route challenges * fix(code-storage): Should use events instead of commands * fix(Map): ClickOnMap should not hold on to event * chore(lint): Use eslint-config-freecodecamp Closes #15938 * feat(Panes): Update panes on route instead of render * fix(Panes): Store panesmap and update on fetchchallenges * fix(Panes): Normalize panesmaps * fix(Panes): Remove filter from createpanemap * fix(Panes): Middleware on location meta object * feat(Panes): Filter preview on nonhtml challenges * build(babel): Add lodash babel plugin * chore(lint): Lint js files * fix(server/user-stats): Remove use of lodash chain this interferes with babel-plugin-lodash * feat(dev): Add remote redux devtools for ssr * fix(Panes): Dispatch mount action this is needed to trigger window/divider epics * fix(Panes): Getpane to use new panesmap format * fix(Panes): Always update panes after state this lets the panes logic be affected by changes in state
2017-11-09 17:10:30 -08:00
export const isSignedInSelector = state => !!userSelector(state).username;
Feat(Challenges): no js preview (#16149) * fix(files): Decouple files from challenges * feat(server/react): Remove action logger use redux remote devtools instead! * feat(Challenges): Disable js on edit, enable on execute * feat(Challenge/Preview): Show message when js is disabled * refactor(frameEpic): Reduce code by using lodash * feat(frameEpic): Disable js in preview by state * feat(frameEpic): Colocate epic in Challenges/redux * refactor(ExecuteChallengeEpic): CoLocated with Challenges * refactor(executeChallengesEpic): Separate tests from main logic * feat(Challenge/Preview): Update main on edit * feat(frameEpuc): Replace frame on edit/execute This allows for sandbox to work properly * fix(Challenges/Utils): Require utisl * revert(frameEpic): Hoist function to mount code in frame * fix(frameEpic): Ensure new frame is given classname * feat(executeChallenge): Update main on code unlocked * fix(frameEpic): Filter out empty test message * fix(Challenge/Preview): Remove unnessary quote in classname * feat(codeStorageEpic): Separate localstorage from solutions loading * fix(fetchUser): Merge user actions into one prefer many effects from one action over one action to one effect * fix(themes): Centralize theme utils and defs * fix(entities.user): Fix user reducer namespacing * feat(frame): Refactor frameEpic to util * feat(Challenges.redux): Should not attempt to update main from storage * fix(loadPreviousChallengeEpic): Refactor for RFR * fix(Challenges.Modern): Show preview plane
2017-12-07 16:13:19 -08:00
export const challengeSelector = state => {
const challengeName = currentChallengeSelector(state);
const challengeMap = entitiesSelector(state).challenge || {};
return challengeMap[challengeName] || {};
};
export const previousSolutionSelector = state => {
const { id } = challengeSelector(state);
const { challengeMap = {} } = userSelector(state);
return challengeMap[id];
};
feat(app): new layout (#14707) * feat(app): Restructure app to be more flexible and redux idiomatic BREAKING CHANGE: Lots of breaking changes * refactor(challenges): Redux to started file structure * fix(app): lint issues due to refactor * fix(settings): Refactor settings to use folder structure * refactor(challenges): Move step redux stuff into step folder * fix(challenges): Remove fetchchallenges actions * refactor(challenges): Move project redux logic into project view subdirectory * refactor(app): %s/sagas/epics/g * refactor(redux): Use new redux-epic with combineEpic and ofType * refactor(app): Move challenge selector to app level * fix(app): Move loading challenge info into challenge route This moves a lot of the logic needed to load challenge info into the challenge app. This decouples the main app from the challenge route * refactor(map): Map is now decoupled from challenges * refactor(challenges): Use selectors everywhere instead of guessing state shape * refactor(client): refactor client epics to use selectors * refactor(app): Refactor userSelector to return user object instead of object.user * refactor(entities): Move entities logic into it's own file * fix(redux): combineTypes should be combineActions * fix(app): reducer namespacing and import * fix(Map): Fix undefined type and update redux-action * fix(redux): Refactor fetchUser to be more declarative Use rxjs methods instead of imperative if/else. Also prevent non-actions from being emitted * fix(redux): toString multi phase action types * fix(redux): typecast multiphase type, fix typo in reducer toString multiphase types in fetch challenge epic. Add epic to epics lists. Fix type in fetch challenge complete handler * fix(redux): updateCurrentChallengelogic should be centerlized Move route changes to one location. * fix(Nav): Prevent event object from hanging around closeDropDown/openDropDown where handing on to the event object. This was causing issues with react since event objects are recycled in React. * fix(Map.Challenge): decouple map selector * fix(Map): Decouple panel selectors from props Panel Selectors no longer need to know the shape of a components props. Refactored component selectors to decouple them entities state shape * fix(Map.redux): Add select challenge epic and connect map epics * fix(redux.analytics): Fix meta creator and nav/map events * fix(redux): Update current challenge ajax * fix(challenges): ssr fetch challenge should update challenge ui Was using an epic to update challenge ui on fetch complete, but this was not working on ssr due to the way ssr disables epics to wait for completion. This commit fixes this by causing the complete to directly update state in the challenge ui * fix(challenges): wrong import of types, refactor epic name * fix(redux): Prevent fetch challenge epic from emitting null to dispatch * fix(redux): prevent executechallenge from emitting null * fix(challenges.redux): testsSelector returns just tests * fix(challenges.redux): Prevent completion challenge from emitting null * refactor(Challenges.Step): Refactor step challenge to release event object * fix(redux): wrap reducers in factories reducers exported from features need to be factories this helps avoid cyclic requires messing up reducer creation We end up with exports from files being undefined as node tries to resolve cyclic dependencies. This prevents that by wrapping the `handleActions` call so that the ref to types imported from parent features are closures and can be resolved by node before we need them. * fix(Map): createUi not working correctly map utils should receive just map ui state, createMapUi needs to add title to challenge * feat(Challenges): Adds Panes and panes backend challenge * fix: Create child container to wrap children Create a ChildContainer comp' to wrap all children that represent the view for the current route. This let's the child route define if they want a full width view or if they want the standard max-width view. * feat(Panes): panes now render dividers * feat(Panes): Get divider to move currectly * fix(Nav): Add top margin to contained childs Move margin-bottom from nav to child container as margin top. This let's the jsbin style views fit snug with navbar * fix(Panes): Should be contained within their borders * feat(Panes): Update navbar height of pane on app mount * feat(Panes): Toggle map on map nav btn click * fix(gulpfile): Ensure nodemon exits on restart On process exit, wait for nodemon to shutdown before process.exit * feat(Panes): Make Panes redux first * fix(Panes): Fix divider positioning * fix(Panes): Update divider moved handler dividerMoved action now uses new panesByName structure * feat(Panes): Pane nav button will hide panes * chore(package-lock): Update package lock * feat(Panes.redux): Recaculate dividers on pane toggle * fix(Challenges): Update challenge on dashedName change This fixes backwards navigation not updating the redux state current challenge * feat(Panes.redux): Clear panes on unmount Clearing panes on unmount will clear bin buttons in nav * refactor(Map): Colocate styles * feat(Map): New map layout * fix(Map): No longer has it's own page * fix: FetchChallenges on appMounted * feat: Normalize fetchChallenge(s) results This allows superblocks to be sent with both fetchChallenge and fetchChallenges so the map is always populated on first load * feat(Map): Show blocks on first load * fix(less): Remove old css * feat(Nav): Reduce nav height * fix(Nav): Render nav after content Render nav after content and use css to reverse again on screen. We do this so the panes can render first and update redux panes state which will then update the nav ui state before nav has a chance to render * fix(Panes): Add container This adds a Panes Container that will allow it to udpate redux state so Panes Component will have redux state ready to actually render panes * feat(Challenges.Classic): Add panes * fix(Challenge.Classic): Editor onchange should not need to know about file * fix(Panes): Index on panes hide should account for hidden pane * fix(Challanges.Classic): Fix panes types * fix(Challenges): Add completion modal to all challenges Change classic modal to completion modal * fix(Panes): Dividers live on top of planes * fix(Challenges): Remove codemirror theme Remove codemirror theme and remove borders from preview frame * fix(Challenges.Classic): Remove old component * feat(Challenges.Step): Add panes to step challenge * feat(Challenges.Project): Add panes to projects * fix(Challenges.Projects): Remove row * fix(Modals): Move modal text color to challenge less This text color is dependent on the actual header color * fix(Map): Use Superblock title for ui * fix(Map): Reduce panel header height * fix(app): Capitalize Toasts folder Feature folders should be campitalized * chore(Map): Remove unused epic file * fix(Step): Fix tests * test(Map): Update createMapUi tests input
2017-07-31 20:04:01 -07:00
export const firstChallengeSelector = createSelector(
entitiesSelector,
superBlocksSelector,
(
{
challengeMap,
blockMap,
superBlockMap
},
superBlocks
) => {
if (
!challengeMap ||
!blockMap ||
!superBlockMap ||
!superBlocks
) {
return {};
}
try {
return challengeMap[
blockMap[
superBlockMap[
superBlocks[0]
].blocks[0]
].challenges[0]
];
} catch (err) {
console.error(err);
return {};
}
}
);
feat: prep for modern challenges (#15781) * feat(seed): Add modern challenge * chore(react): Use prop-types package * feat: Initial refactor to redux-first-router BREAKING CHANGE: Everything is different! * feat: First rendering * feat(routes): Challenges view render but failing * fix(Challenges): Remove contain HOC * fix(RFR): Add params selector * fix(RFR): :en should be :lang * fix: Update berks utils for redux * fix(Map): Challenge link to arg * fix(Map): Add trailing slash to map page * fix(RFR): Use FCC Link Use fcc Link to get around issue of lang being undefined * fix(Router): Link to is required * fix(app): Rely on RFR state for app lang * chore(RFR): Remove unused RFR Link * fix(RFR): Hydrate initial challenge using RFR and RO * fix: Casing issue * fix(RFR): Undefined links * fix(RFR): Use onRoute<name> convention for route types * feat(server/react): Add helpful redux logging/throwing * fix(server/react): Strip out nonjson from state This prevents thunks in routesMap from breaking serialization * fix(RFR/Link): Should accept any renderable * fix(RFR): Get redirects working * fix(RFR): Redirects and not found's * fix(Map): Move challenge onClick handler * fix(Map): Allow Router.link to handle clicks after onClick * fix(routes): Remove react-router-redux * feat(Router): Add lang to all route actions by default * fix(entities): Only fetch challenge if not already loaded * fix(Files): Move files to own feature * chore(Challenges): Remove vestigial hints logic * fix(RFR): Update challenges on route challenges * fix(code-storage): Should use events instead of commands * fix(Map): ClickOnMap should not hold on to event * chore(lint): Use eslint-config-freecodecamp Closes #15938 * feat(Panes): Update panes on route instead of render * fix(Panes): Store panesmap and update on fetchchallenges * fix(Panes): Normalize panesmaps * fix(Panes): Remove filter from createpanemap * fix(Panes): Middleware on location meta object * feat(Panes): Filter preview on nonhtml challenges * build(babel): Add lodash babel plugin * chore(lint): Lint js files * fix(server/user-stats): Remove use of lodash chain this interferes with babel-plugin-lodash * feat(dev): Add remote redux devtools for ssr * fix(Panes): Dispatch mount action this is needed to trigger window/divider epics * fix(Panes): Getpane to use new panesmap format * fix(Panes): Always update panes after state this lets the panes logic be affected by changes in state
2017-11-09 17:10:30 -08:00
export default handleActions(
() => ({
[types.updateTitle]: (state, { payload = 'Learn To Code' }) => ({
...state,
title: payload + ' | freeCodeCamp'
}),
feat(app): new layout (#14707) * feat(app): Restructure app to be more flexible and redux idiomatic BREAKING CHANGE: Lots of breaking changes * refactor(challenges): Redux to started file structure * fix(app): lint issues due to refactor * fix(settings): Refactor settings to use folder structure * refactor(challenges): Move step redux stuff into step folder * fix(challenges): Remove fetchchallenges actions * refactor(challenges): Move project redux logic into project view subdirectory * refactor(app): %s/sagas/epics/g * refactor(redux): Use new redux-epic with combineEpic and ofType * refactor(app): Move challenge selector to app level * fix(app): Move loading challenge info into challenge route This moves a lot of the logic needed to load challenge info into the challenge app. This decouples the main app from the challenge route * refactor(map): Map is now decoupled from challenges * refactor(challenges): Use selectors everywhere instead of guessing state shape * refactor(client): refactor client epics to use selectors * refactor(app): Refactor userSelector to return user object instead of object.user * refactor(entities): Move entities logic into it's own file * fix(redux): combineTypes should be combineActions * fix(app): reducer namespacing and import * fix(Map): Fix undefined type and update redux-action * fix(redux): Refactor fetchUser to be more declarative Use rxjs methods instead of imperative if/else. Also prevent non-actions from being emitted * fix(redux): toString multi phase action types * fix(redux): typecast multiphase type, fix typo in reducer toString multiphase types in fetch challenge epic. Add epic to epics lists. Fix type in fetch challenge complete handler * fix(redux): updateCurrentChallengelogic should be centerlized Move route changes to one location. * fix(Nav): Prevent event object from hanging around closeDropDown/openDropDown where handing on to the event object. This was causing issues with react since event objects are recycled in React. * fix(Map.Challenge): decouple map selector * fix(Map): Decouple panel selectors from props Panel Selectors no longer need to know the shape of a components props. Refactored component selectors to decouple them entities state shape * fix(Map.redux): Add select challenge epic and connect map epics * fix(redux.analytics): Fix meta creator and nav/map events * fix(redux): Update current challenge ajax * fix(challenges): ssr fetch challenge should update challenge ui Was using an epic to update challenge ui on fetch complete, but this was not working on ssr due to the way ssr disables epics to wait for completion. This commit fixes this by causing the complete to directly update state in the challenge ui * fix(challenges): wrong import of types, refactor epic name * fix(redux): Prevent fetch challenge epic from emitting null to dispatch * fix(redux): prevent executechallenge from emitting null * fix(challenges.redux): testsSelector returns just tests * fix(challenges.redux): Prevent completion challenge from emitting null * refactor(Challenges.Step): Refactor step challenge to release event object * fix(redux): wrap reducers in factories reducers exported from features need to be factories this helps avoid cyclic requires messing up reducer creation We end up with exports from files being undefined as node tries to resolve cyclic dependencies. This prevents that by wrapping the `handleActions` call so that the ref to types imported from parent features are closures and can be resolved by node before we need them. * fix(Map): createUi not working correctly map utils should receive just map ui state, createMapUi needs to add title to challenge * feat(Challenges): Adds Panes and panes backend challenge * fix: Create child container to wrap children Create a ChildContainer comp' to wrap all children that represent the view for the current route. This let's the child route define if they want a full width view or if they want the standard max-width view. * feat(Panes): panes now render dividers * feat(Panes): Get divider to move currectly * fix(Nav): Add top margin to contained childs Move margin-bottom from nav to child container as margin top. This let's the jsbin style views fit snug with navbar * fix(Panes): Should be contained within their borders * feat(Panes): Update navbar height of pane on app mount * feat(Panes): Toggle map on map nav btn click * fix(gulpfile): Ensure nodemon exits on restart On process exit, wait for nodemon to shutdown before process.exit * feat(Panes): Make Panes redux first * fix(Panes): Fix divider positioning * fix(Panes): Update divider moved handler dividerMoved action now uses new panesByName structure * feat(Panes): Pane nav button will hide panes * chore(package-lock): Update package lock * feat(Panes.redux): Recaculate dividers on pane toggle * fix(Challenges): Update challenge on dashedName change This fixes backwards navigation not updating the redux state current challenge * feat(Panes.redux): Clear panes on unmount Clearing panes on unmount will clear bin buttons in nav * refactor(Map): Colocate styles * feat(Map): New map layout * fix(Map): No longer has it's own page * fix: FetchChallenges on appMounted * feat: Normalize fetchChallenge(s) results This allows superblocks to be sent with both fetchChallenge and fetchChallenges so the map is always populated on first load * feat(Map): Show blocks on first load * fix(less): Remove old css * feat(Nav): Reduce nav height * fix(Nav): Render nav after content Render nav after content and use css to reverse again on screen. We do this so the panes can render first and update redux panes state which will then update the nav ui state before nav has a chance to render * fix(Panes): Add container This adds a Panes Container that will allow it to udpate redux state so Panes Component will have redux state ready to actually render panes * feat(Challenges.Classic): Add panes * fix(Challenge.Classic): Editor onchange should not need to know about file * fix(Panes): Index on panes hide should account for hidden pane * fix(Challanges.Classic): Fix panes types * fix(Challenges): Add completion modal to all challenges Change classic modal to completion modal * fix(Panes): Dividers live on top of planes * fix(Challenges): Remove codemirror theme Remove codemirror theme and remove borders from preview frame * fix(Challenges.Classic): Remove old component * feat(Challenges.Step): Add panes to step challenge * feat(Challenges.Project): Add panes to projects * fix(Challenges.Projects): Remove row * fix(Modals): Move modal text color to challenge less This text color is dependent on the actual header color * fix(Map): Use Superblock title for ui * fix(Map): Reduce panel header height * fix(app): Capitalize Toasts folder Feature folders should be campitalized * chore(Map): Remove unused epic file * fix(Step): Fix tests * test(Map): Update createMapUi tests input
2017-07-31 20:04:01 -07:00
Feat(Challenges): no js preview (#16149) * fix(files): Decouple files from challenges * feat(server/react): Remove action logger use redux remote devtools instead! * feat(Challenges): Disable js on edit, enable on execute * feat(Challenge/Preview): Show message when js is disabled * refactor(frameEpic): Reduce code by using lodash * feat(frameEpic): Disable js in preview by state * feat(frameEpic): Colocate epic in Challenges/redux * refactor(ExecuteChallengeEpic): CoLocated with Challenges * refactor(executeChallengesEpic): Separate tests from main logic * feat(Challenge/Preview): Update main on edit * feat(frameEpuc): Replace frame on edit/execute This allows for sandbox to work properly * fix(Challenges/Utils): Require utisl * revert(frameEpic): Hoist function to mount code in frame * fix(frameEpic): Ensure new frame is given classname * feat(executeChallenge): Update main on code unlocked * fix(frameEpic): Filter out empty test message * fix(Challenge/Preview): Remove unnessary quote in classname * feat(codeStorageEpic): Separate localstorage from solutions loading * fix(fetchUser): Merge user actions into one prefer many effects from one action over one action to one effect * fix(themes): Centralize theme utils and defs * fix(entities.user): Fix user reducer namespacing * feat(frame): Refactor frameEpic to util * feat(Challenges.redux): Should not attempt to update main from storage * fix(loadPreviousChallengeEpic): Refactor for RFR * fix(Challenges.Modern): Show preview plane
2017-12-07 16:13:19 -08:00
[types.fetchUser.complete]: (state, { payload: user }) => ({
feat: prep for modern challenges (#15781) * feat(seed): Add modern challenge * chore(react): Use prop-types package * feat: Initial refactor to redux-first-router BREAKING CHANGE: Everything is different! * feat: First rendering * feat(routes): Challenges view render but failing * fix(Challenges): Remove contain HOC * fix(RFR): Add params selector * fix(RFR): :en should be :lang * fix: Update berks utils for redux * fix(Map): Challenge link to arg * fix(Map): Add trailing slash to map page * fix(RFR): Use FCC Link Use fcc Link to get around issue of lang being undefined * fix(Router): Link to is required * fix(app): Rely on RFR state for app lang * chore(RFR): Remove unused RFR Link * fix(RFR): Hydrate initial challenge using RFR and RO * fix: Casing issue * fix(RFR): Undefined links * fix(RFR): Use onRoute<name> convention for route types * feat(server/react): Add helpful redux logging/throwing * fix(server/react): Strip out nonjson from state This prevents thunks in routesMap from breaking serialization * fix(RFR/Link): Should accept any renderable * fix(RFR): Get redirects working * fix(RFR): Redirects and not found's * fix(Map): Move challenge onClick handler * fix(Map): Allow Router.link to handle clicks after onClick * fix(routes): Remove react-router-redux * feat(Router): Add lang to all route actions by default * fix(entities): Only fetch challenge if not already loaded * fix(Files): Move files to own feature * chore(Challenges): Remove vestigial hints logic * fix(RFR): Update challenges on route challenges * fix(code-storage): Should use events instead of commands * fix(Map): ClickOnMap should not hold on to event * chore(lint): Use eslint-config-freecodecamp Closes #15938 * feat(Panes): Update panes on route instead of render * fix(Panes): Store panesmap and update on fetchchallenges * fix(Panes): Normalize panesmaps * fix(Panes): Remove filter from createpanemap * fix(Panes): Middleware on location meta object * feat(Panes): Filter preview on nonhtml challenges * build(babel): Add lodash babel plugin * chore(lint): Lint js files * fix(server/user-stats): Remove use of lodash chain this interferes with babel-plugin-lodash * feat(dev): Add remote redux devtools for ssr * fix(Panes): Dispatch mount action this is needed to trigger window/divider epics * fix(Panes): Getpane to use new panesmap format * fix(Panes): Always update panes after state this lets the panes logic be affected by changes in state
2017-11-09 17:10:30 -08:00
...state,
user
}),
[combineActions(
types.fetchChallenge.complete,
types.fetchChallenges.complete
)]: (state, { payload }) => ({
...state,
superBlocks: payload.result.superBlocks
}),
[challenges.onRouteChallenges]: (state, { payload: { dashedName } }) => ({
...state,
currentChallenge: dashedName
}),
Feat(Challenges): no js preview (#16149) * fix(files): Decouple files from challenges * feat(server/react): Remove action logger use redux remote devtools instead! * feat(Challenges): Disable js on edit, enable on execute * feat(Challenge/Preview): Show message when js is disabled * refactor(frameEpic): Reduce code by using lodash * feat(frameEpic): Disable js in preview by state * feat(frameEpic): Colocate epic in Challenges/redux * refactor(ExecuteChallengeEpic): CoLocated with Challenges * refactor(executeChallengesEpic): Separate tests from main logic * feat(Challenge/Preview): Update main on edit * feat(frameEpuc): Replace frame on edit/execute This allows for sandbox to work properly * fix(Challenges/Utils): Require utisl * revert(frameEpic): Hoist function to mount code in frame * fix(frameEpic): Ensure new frame is given classname * feat(executeChallenge): Update main on code unlocked * fix(frameEpic): Filter out empty test message * fix(Challenge/Preview): Remove unnessary quote in classname * feat(codeStorageEpic): Separate localstorage from solutions loading * fix(fetchUser): Merge user actions into one prefer many effects from one action over one action to one effect * fix(themes): Centralize theme utils and defs * fix(entities.user): Fix user reducer namespacing * feat(frame): Refactor frameEpic to util * feat(Challenges.redux): Should not attempt to update main from storage * fix(loadPreviousChallengeEpic): Refactor for RFR * fix(Challenges.Modern): Show preview plane
2017-12-07 16:13:19 -08:00
[
combineActions(types.showSignIn, types.fetchUser.complete)
]: state => ({
feat: prep for modern challenges (#15781) * feat(seed): Add modern challenge * chore(react): Use prop-types package * feat: Initial refactor to redux-first-router BREAKING CHANGE: Everything is different! * feat: First rendering * feat(routes): Challenges view render but failing * fix(Challenges): Remove contain HOC * fix(RFR): Add params selector * fix(RFR): :en should be :lang * fix: Update berks utils for redux * fix(Map): Challenge link to arg * fix(Map): Add trailing slash to map page * fix(RFR): Use FCC Link Use fcc Link to get around issue of lang being undefined * fix(Router): Link to is required * fix(app): Rely on RFR state for app lang * chore(RFR): Remove unused RFR Link * fix(RFR): Hydrate initial challenge using RFR and RO * fix: Casing issue * fix(RFR): Undefined links * fix(RFR): Use onRoute<name> convention for route types * feat(server/react): Add helpful redux logging/throwing * fix(server/react): Strip out nonjson from state This prevents thunks in routesMap from breaking serialization * fix(RFR/Link): Should accept any renderable * fix(RFR): Get redirects working * fix(RFR): Redirects and not found's * fix(Map): Move challenge onClick handler * fix(Map): Allow Router.link to handle clicks after onClick * fix(routes): Remove react-router-redux * feat(Router): Add lang to all route actions by default * fix(entities): Only fetch challenge if not already loaded * fix(Files): Move files to own feature * chore(Challenges): Remove vestigial hints logic * fix(RFR): Update challenges on route challenges * fix(code-storage): Should use events instead of commands * fix(Map): ClickOnMap should not hold on to event * chore(lint): Use eslint-config-freecodecamp Closes #15938 * feat(Panes): Update panes on route instead of render * fix(Panes): Store panesmap and update on fetchchallenges * fix(Panes): Normalize panesmaps * fix(Panes): Remove filter from createpanemap * fix(Panes): Middleware on location meta object * feat(Panes): Filter preview on nonhtml challenges * build(babel): Add lodash babel plugin * chore(lint): Lint js files * fix(server/user-stats): Remove use of lodash chain this interferes with babel-plugin-lodash * feat(dev): Add remote redux devtools for ssr * fix(Panes): Dispatch mount action this is needed to trigger window/divider epics * fix(Panes): Getpane to use new panesmap format * fix(Panes): Always update panes after state this lets the panes logic be affected by changes in state
2017-11-09 17:10:30 -08:00
...state,
isSignInAttempted: true
}),
feat(app): new layout (#14707) * feat(app): Restructure app to be more flexible and redux idiomatic BREAKING CHANGE: Lots of breaking changes * refactor(challenges): Redux to started file structure * fix(app): lint issues due to refactor * fix(settings): Refactor settings to use folder structure * refactor(challenges): Move step redux stuff into step folder * fix(challenges): Remove fetchchallenges actions * refactor(challenges): Move project redux logic into project view subdirectory * refactor(app): %s/sagas/epics/g * refactor(redux): Use new redux-epic with combineEpic and ofType * refactor(app): Move challenge selector to app level * fix(app): Move loading challenge info into challenge route This moves a lot of the logic needed to load challenge info into the challenge app. This decouples the main app from the challenge route * refactor(map): Map is now decoupled from challenges * refactor(challenges): Use selectors everywhere instead of guessing state shape * refactor(client): refactor client epics to use selectors * refactor(app): Refactor userSelector to return user object instead of object.user * refactor(entities): Move entities logic into it's own file * fix(redux): combineTypes should be combineActions * fix(app): reducer namespacing and import * fix(Map): Fix undefined type and update redux-action * fix(redux): Refactor fetchUser to be more declarative Use rxjs methods instead of imperative if/else. Also prevent non-actions from being emitted * fix(redux): toString multi phase action types * fix(redux): typecast multiphase type, fix typo in reducer toString multiphase types in fetch challenge epic. Add epic to epics lists. Fix type in fetch challenge complete handler * fix(redux): updateCurrentChallengelogic should be centerlized Move route changes to one location. * fix(Nav): Prevent event object from hanging around closeDropDown/openDropDown where handing on to the event object. This was causing issues with react since event objects are recycled in React. * fix(Map.Challenge): decouple map selector * fix(Map): Decouple panel selectors from props Panel Selectors no longer need to know the shape of a components props. Refactored component selectors to decouple them entities state shape * fix(Map.redux): Add select challenge epic and connect map epics * fix(redux.analytics): Fix meta creator and nav/map events * fix(redux): Update current challenge ajax * fix(challenges): ssr fetch challenge should update challenge ui Was using an epic to update challenge ui on fetch complete, but this was not working on ssr due to the way ssr disables epics to wait for completion. This commit fixes this by causing the complete to directly update state in the challenge ui * fix(challenges): wrong import of types, refactor epic name * fix(redux): Prevent fetch challenge epic from emitting null to dispatch * fix(redux): prevent executechallenge from emitting null * fix(challenges.redux): testsSelector returns just tests * fix(challenges.redux): Prevent completion challenge from emitting null * refactor(Challenges.Step): Refactor step challenge to release event object * fix(redux): wrap reducers in factories reducers exported from features need to be factories this helps avoid cyclic requires messing up reducer creation We end up with exports from files being undefined as node tries to resolve cyclic dependencies. This prevents that by wrapping the `handleActions` call so that the ref to types imported from parent features are closures and can be resolved by node before we need them. * fix(Map): createUi not working correctly map utils should receive just map ui state, createMapUi needs to add title to challenge * feat(Challenges): Adds Panes and panes backend challenge * fix: Create child container to wrap children Create a ChildContainer comp' to wrap all children that represent the view for the current route. This let's the child route define if they want a full width view or if they want the standard max-width view. * feat(Panes): panes now render dividers * feat(Panes): Get divider to move currectly * fix(Nav): Add top margin to contained childs Move margin-bottom from nav to child container as margin top. This let's the jsbin style views fit snug with navbar * fix(Panes): Should be contained within their borders * feat(Panes): Update navbar height of pane on app mount * feat(Panes): Toggle map on map nav btn click * fix(gulpfile): Ensure nodemon exits on restart On process exit, wait for nodemon to shutdown before process.exit * feat(Panes): Make Panes redux first * fix(Panes): Fix divider positioning * fix(Panes): Update divider moved handler dividerMoved action now uses new panesByName structure * feat(Panes): Pane nav button will hide panes * chore(package-lock): Update package lock * feat(Panes.redux): Recaculate dividers on pane toggle * fix(Challenges): Update challenge on dashedName change This fixes backwards navigation not updating the redux state current challenge * feat(Panes.redux): Clear panes on unmount Clearing panes on unmount will clear bin buttons in nav * refactor(Map): Colocate styles * feat(Map): New map layout * fix(Map): No longer has it's own page * fix: FetchChallenges on appMounted * feat: Normalize fetchChallenge(s) results This allows superblocks to be sent with both fetchChallenge and fetchChallenges so the map is always populated on first load * feat(Map): Show blocks on first load * fix(less): Remove old css * feat(Nav): Reduce nav height * fix(Nav): Render nav after content Render nav after content and use css to reverse again on screen. We do this so the panes can render first and update redux panes state which will then update the nav ui state before nav has a chance to render * fix(Panes): Add container This adds a Panes Container that will allow it to udpate redux state so Panes Component will have redux state ready to actually render panes * feat(Challenges.Classic): Add panes * fix(Challenge.Classic): Editor onchange should not need to know about file * fix(Panes): Index on panes hide should account for hidden pane * fix(Challanges.Classic): Fix panes types * fix(Challenges): Add completion modal to all challenges Change classic modal to completion modal * fix(Panes): Dividers live on top of planes * fix(Challenges): Remove codemirror theme Remove codemirror theme and remove borders from preview frame * fix(Challenges.Classic): Remove old component * feat(Challenges.Step): Add panes to step challenge * feat(Challenges.Project): Add panes to projects * fix(Challenges.Projects): Remove row * fix(Modals): Move modal text color to challenge less This text color is dependent on the actual header color * fix(Map): Use Superblock title for ui * fix(Map): Reduce panel header height * fix(app): Capitalize Toasts folder Feature folders should be campitalized * chore(Map): Remove unused epic file * fix(Step): Fix tests * test(Map): Update createMapUi tests input
2017-07-31 20:04:01 -07:00
feat: prep for modern challenges (#15781) * feat(seed): Add modern challenge * chore(react): Use prop-types package * feat: Initial refactor to redux-first-router BREAKING CHANGE: Everything is different! * feat: First rendering * feat(routes): Challenges view render but failing * fix(Challenges): Remove contain HOC * fix(RFR): Add params selector * fix(RFR): :en should be :lang * fix: Update berks utils for redux * fix(Map): Challenge link to arg * fix(Map): Add trailing slash to map page * fix(RFR): Use FCC Link Use fcc Link to get around issue of lang being undefined * fix(Router): Link to is required * fix(app): Rely on RFR state for app lang * chore(RFR): Remove unused RFR Link * fix(RFR): Hydrate initial challenge using RFR and RO * fix: Casing issue * fix(RFR): Undefined links * fix(RFR): Use onRoute<name> convention for route types * feat(server/react): Add helpful redux logging/throwing * fix(server/react): Strip out nonjson from state This prevents thunks in routesMap from breaking serialization * fix(RFR/Link): Should accept any renderable * fix(RFR): Get redirects working * fix(RFR): Redirects and not found's * fix(Map): Move challenge onClick handler * fix(Map): Allow Router.link to handle clicks after onClick * fix(routes): Remove react-router-redux * feat(Router): Add lang to all route actions by default * fix(entities): Only fetch challenge if not already loaded * fix(Files): Move files to own feature * chore(Challenges): Remove vestigial hints logic * fix(RFR): Update challenges on route challenges * fix(code-storage): Should use events instead of commands * fix(Map): ClickOnMap should not hold on to event * chore(lint): Use eslint-config-freecodecamp Closes #15938 * feat(Panes): Update panes on route instead of render * fix(Panes): Store panesmap and update on fetchchallenges * fix(Panes): Normalize panesmaps * fix(Panes): Remove filter from createpanemap * fix(Panes): Middleware on location meta object * feat(Panes): Filter preview on nonhtml challenges * build(babel): Add lodash babel plugin * chore(lint): Lint js files * fix(server/user-stats): Remove use of lodash chain this interferes with babel-plugin-lodash * feat(dev): Add remote redux devtools for ssr * fix(Panes): Dispatch mount action this is needed to trigger window/divider epics * fix(Panes): Getpane to use new panesmap format * fix(Panes): Always update panes after state this lets the panes logic be affected by changes in state
2017-11-09 17:10:30 -08:00
[types.challengeSaved]: (state, { payload: { points = 0 } }) => ({
...state,
points
}),
[types.delayedRedirect]: (state, { payload }) => ({
...state,
delayedRedirect: payload
})
}),
Feat(Challenges): no js preview (#16149) * fix(files): Decouple files from challenges * feat(server/react): Remove action logger use redux remote devtools instead! * feat(Challenges): Disable js on edit, enable on execute * feat(Challenge/Preview): Show message when js is disabled * refactor(frameEpic): Reduce code by using lodash * feat(frameEpic): Disable js in preview by state * feat(frameEpic): Colocate epic in Challenges/redux * refactor(ExecuteChallengeEpic): CoLocated with Challenges * refactor(executeChallengesEpic): Separate tests from main logic * feat(Challenge/Preview): Update main on edit * feat(frameEpuc): Replace frame on edit/execute This allows for sandbox to work properly * fix(Challenges/Utils): Require utisl * revert(frameEpic): Hoist function to mount code in frame * fix(frameEpic): Ensure new frame is given classname * feat(executeChallenge): Update main on code unlocked * fix(frameEpic): Filter out empty test message * fix(Challenge/Preview): Remove unnessary quote in classname * feat(codeStorageEpic): Separate localstorage from solutions loading * fix(fetchUser): Merge user actions into one prefer many effects from one action over one action to one effect * fix(themes): Centralize theme utils and defs * fix(entities.user): Fix user reducer namespacing * feat(frame): Refactor frameEpic to util * feat(Challenges.redux): Should not attempt to update main from storage * fix(loadPreviousChallengeEpic): Refactor for RFR * fix(Challenges.Modern): Show preview plane
2017-12-07 16:13:19 -08:00
defaultState,
feat: prep for modern challenges (#15781) * feat(seed): Add modern challenge * chore(react): Use prop-types package * feat: Initial refactor to redux-first-router BREAKING CHANGE: Everything is different! * feat: First rendering * feat(routes): Challenges view render but failing * fix(Challenges): Remove contain HOC * fix(RFR): Add params selector * fix(RFR): :en should be :lang * fix: Update berks utils for redux * fix(Map): Challenge link to arg * fix(Map): Add trailing slash to map page * fix(RFR): Use FCC Link Use fcc Link to get around issue of lang being undefined * fix(Router): Link to is required * fix(app): Rely on RFR state for app lang * chore(RFR): Remove unused RFR Link * fix(RFR): Hydrate initial challenge using RFR and RO * fix: Casing issue * fix(RFR): Undefined links * fix(RFR): Use onRoute<name> convention for route types * feat(server/react): Add helpful redux logging/throwing * fix(server/react): Strip out nonjson from state This prevents thunks in routesMap from breaking serialization * fix(RFR/Link): Should accept any renderable * fix(RFR): Get redirects working * fix(RFR): Redirects and not found's * fix(Map): Move challenge onClick handler * fix(Map): Allow Router.link to handle clicks after onClick * fix(routes): Remove react-router-redux * feat(Router): Add lang to all route actions by default * fix(entities): Only fetch challenge if not already loaded * fix(Files): Move files to own feature * chore(Challenges): Remove vestigial hints logic * fix(RFR): Update challenges on route challenges * fix(code-storage): Should use events instead of commands * fix(Map): ClickOnMap should not hold on to event * chore(lint): Use eslint-config-freecodecamp Closes #15938 * feat(Panes): Update panes on route instead of render * fix(Panes): Store panesmap and update on fetchchallenges * fix(Panes): Normalize panesmaps * fix(Panes): Remove filter from createpanemap * fix(Panes): Middleware on location meta object * feat(Panes): Filter preview on nonhtml challenges * build(babel): Add lodash babel plugin * chore(lint): Lint js files * fix(server/user-stats): Remove use of lodash chain this interferes with babel-plugin-lodash * feat(dev): Add remote redux devtools for ssr * fix(Panes): Dispatch mount action this is needed to trigger window/divider epics * fix(Panes): Getpane to use new panesmap format * fix(Panes): Always update panes after state this lets the panes logic be affected by changes in state
2017-11-09 17:10:30 -08:00
ns
);