import { getTyped } from 'composition';
import { oneRouter } from '@skava/router';
import { oneStorage } from '@skava/persistence';
import { cookies, renewCache } from '@skava/cookies';
import { isArray, isString, isObj } from 'exotic';
import { errorContainer } from 'src/state/errorView/container';
import { toastMessage, responseMessage } from 'src/state/errorView/_fixture';
import { sessionContainer } from 'state/session/container';
import { userContainer } from 'src/state/user/container';
// import { cache } from 'src/client/apolloClient'
const isExpired = (data) => isString(data.responseMessage) && data.responseMessage.includes('session expired');
function checkIsSessionExpired(data) {
if (isExpired(data) === true) {
const errorMessage = data.responseMessage ? data.responseMessage.split('-')[1] : '';
errorContainer.setError({
errorMessage,
});
clearCookies();
oneRouter.forceUpdate('/');
}
}
/**
* @todo needs to be handled better in login, unsafe setting on false logins
*/
function fromCookieWithDomainToCookieWithNoDomain(cookieLine) {
if (isString(cookieLine)) {
const replaceText = cookieLine.includes(';Domain=.skavaone.com')
? ';Domain=.skavaone.com'
: '; Domain=.skavaone.com';
const cleanCookieLine = cookieLine.replace(replaceText, '');
const addPath = cleanCookieLine.includes(';Path=/') ? '' : ';Path=/';
return `${cleanCookieLine}${addPath}`;
}
return '';
}
function mapCookiesOnResponse(response) {
if (isObj(response) === false) {
console.warn('RESPONSE WAS EMPTY!!!');
return response;
}
if (isArray(response.cookies) === false) {
console.warn('@@fixme - cookies on response');
console.warn('@@fixme - cookies on response');
console.warn('@@fixme - cookies on response');
return response;
}
else {
// @hack @fixme @scope
const setCookieOnDocumentHack = (cookieLine) => {
console.error('@skava/cookies renew cache');
document.cookie = cookieLine;
renewCache();
};
response
.cookies.map(fromCookieWithDomainToCookieWithNoDomain)
.filter(Boolean)
.forEach(setCookieOnDocumentHack || setCookieOnDocumentHack);
}
return response;
}
// window.__APOLLO_CLIENT__.
// client.
function clearApolloCache(client) {
const HORRIBLE_CACHE_ISSUES = client.cache.data.data;
// disableNetworkFetches ?
if (!HORRIBLE_CACHE_ISSUES) {
console.error('HORRIBLE_CACHE_ISSUES');
}
Object.keys(HORRIBLE_CACHE_ISSUES).forEach(data => {
const value = JSON.stringify(HORRIBLE_CACHE_ISSUES[data]);
if (value.toLowerCase().includes('cart')) {
delete HORRIBLE_CACHE_ISSUES[data];
}
});
}
function isSafeLoginResponse(response) {
return isObj(response) && isObj(response.properties.state);
}
function fromResponseToLoginToast(response) {
if (isSafeLoginResponse(response) && toStatus(response) === 'Invalid Credentials') {
return toastMessage.invalidCredentials;
}
else {
// @todo or if the response has a status?
return toastMessage.loginFailure;
}
}
function keep(obj, list) {
const kept = {};
Object.keys(obj)
.filter(key => list.includes(key))
.forEach(key => {
kept[key] = obj[key];
});
return kept;
}
function createRecentlyViewedList() {
oneStorage.set('recentlyViewedItemsList', []);
}
/**
* @todo reuse @@perf @@haircut
* @todo some responses don't map to this...
*/
function toStatus(response) {
return getTyped(response).string('properties.state.status');
}
/**
* @note - putting these out of the container out of the trycatch deopt
* is faster but will remove access to `this` if you need it
*/
const toListResponse = (listResponse) => {
// console.log(`List Response ${JSON.stringify(listResponse)}`)
return listResponse;
};
const toBagResponse = (bagResponse) => {
return bagResponse;
};
const toSyncListResponse = (response) => {
// console.log(response)
return response;
};
const toUserProfileResponse = (response) => {
return response;
};
const isEmptyListItems = (response) => response.responseCode === '204' || response.responseMessage === 'No matching data';
/**
* @todo this looks like wrong response typing.....
*/
const toSaveForLaterResponse = (response) => {
if (isEmptyListItems(response)) {
const localSaveForLater = oneStorage.get('saveForLaterItems');
if (isArray(localSaveForLater)) {
return { saveForLaterItems: localSaveForLater };
}
return { saveForLaterItems: [] };
}
return response;
};
/**
* @todo this looks like wrong response typing.....
*/
const toFavoritesResponse = (response) => {
// @TODO Get API Data working
// console.log(response)
if (isEmptyListItems(response)) {
const localFavorites = oneStorage.get('favorites');
if (isArray(localFavorites)) {
return { favorites: localFavorites };
}
return { favorites: [] };
}
return response;
};
// @todo - split these and this file
// @note "Create Or GetUser Success"
const isLoginSuccess = (response) => isObj(response) && response.properties.state.status === 'Login Successful';
const isRegisterSuccess = (response) => isObj(response) &&
(response.properties.state.status === responseMessage.accountCreationSuccess ||
response.properties.state.status === responseMessage.registerMailFailure);
// https://stackoverflow.com/questions/179355/clearing-all-cookies-with-javascript
const clearCookies = () => {
cookies.clear();
// oneStorage.clear()
document.cookie = '';
};
function coerceInconsistency(data) {
const params = Object.assign({}, data);
params.userName = params.username || params.userName;
return params;
}
/**
* Check for user session expire in myaccount scenarios
* todo can be reusable
*/
const isSessionExpiredOnMyAccount = (response) => {
return (isString(response.responseMessage) &&
response.responseMessage.toLowerCase().includes('unauthorized'));
};
function checkSessionExpiredOnMyAccount(response) {
const isSignedInUser = sessionContainer.isRegisteredUser || userContainer.username;
const isSessionExpired = isSessionExpiredOnMyAccount(response);
if (isSignedInUser && isSessionExpired) {
// @todo move out, put it here for removing thousands of lines
const errorMessage = isSessionExpired && 'session expired';
errorContainer.setError({
errorMessage,
});
clearCookies();
oneRouter.forceUpdate('/signin');
}
}
export { toStatus, coerceInconsistency, isExpired, checkIsSessionExpired, fromCookieWithDomainToCookieWithNoDomain, mapCookiesOnResponse, clearApolloCache, isSafeLoginResponse, fromResponseToLoginToast, keep, createRecentlyViewedList, toListResponse, toBagResponse, toSyncListResponse, toUserProfileResponse, isEmptyListItems, toSaveForLaterResponse, toFavoritesResponse, isLoginSuccess, isRegisterSuccess, clearCookies, checkSessionExpiredOnMyAccount, };
//# sourceMappingURL=deps.js.map