* 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
80 lines
1.6 KiB
JavaScript
80 lines
1.6 KiB
JavaScript
import _ from 'lodash';
|
|
import { decodeFcc } from '../../../../utils/encode-decode';
|
|
|
|
const queryRegex = /^(\?|#\?)/;
|
|
export function legacyIsInQuery(query, decode) {
|
|
let decoded;
|
|
try {
|
|
decoded = decode(query);
|
|
} catch (err) {
|
|
return false;
|
|
}
|
|
if (!decoded || typeof decoded.split !== 'function') {
|
|
return false;
|
|
}
|
|
return decoded
|
|
.replace(queryRegex, '')
|
|
.split('&')
|
|
.reduce(function(found, param) {
|
|
var key = param.split('=')[0];
|
|
if (key === 'solution') {
|
|
return true;
|
|
}
|
|
return found;
|
|
}, false);
|
|
}
|
|
|
|
export function getKeyInQuery(query, keyToFind = '') {
|
|
return query
|
|
.split('&')
|
|
.reduce((oldValue, param) => {
|
|
const key = param.split('=')[0];
|
|
const value = param
|
|
.split('=')
|
|
.slice(1)
|
|
.join('=');
|
|
|
|
if (key === keyToFind) {
|
|
return value;
|
|
}
|
|
return oldValue;
|
|
}, null);
|
|
}
|
|
|
|
export function getLegacySolutionFromQuery(query = '', decode) {
|
|
return _.flow(
|
|
getKeyInQuery,
|
|
decode,
|
|
decodeFcc
|
|
)(query, 'solution');
|
|
}
|
|
|
|
export function getCodeUri(location, decodeURIComponent) {
|
|
let query;
|
|
if (
|
|
location.search &&
|
|
legacyIsInQuery(location.search, decodeURIComponent)
|
|
) {
|
|
query = location.search.replace(/^\?/, '');
|
|
} else {
|
|
return null;
|
|
}
|
|
|
|
return getLegacySolutionFromQuery(query, decodeURIComponent);
|
|
}
|
|
|
|
export function removeCodeUri(location, history) {
|
|
if (
|
|
typeof location.href.split !== 'function' ||
|
|
typeof history.replaceState !== 'function'
|
|
) {
|
|
return false;
|
|
}
|
|
history.replaceState(
|
|
history.state,
|
|
null,
|
|
location.href.split('?')[0]
|
|
);
|
|
return true;
|
|
}
|