ui/lib/shared/addon/cookies/service.js

109 lines
2.2 KiB
JavaScript

import Service, { inject as service } from '@ember/service';
function parseValue(value) {
if ( value.charAt(0) === '"' ) {
value = value.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\').replace(/\+/g, ' ');
}
return decodeURIComponent(value);
}
function getAll() {
let cookies = document.cookie.split(/;\s*/);
let ret = {};
cookies.forEach((cookie) => {
if ( !cookie ) {
return;
}
let idx = cookie.indexOf('=');
if ( idx === -1 ) {
idx = cookie.length;
}
try {
let name = decodeURIComponent(cookie.substr(0, idx));
let val = parseValue(cookie.substr(idx + 1));
ret[ name ] = val;
} catch (e) {
}
});
return ret;
}
export default Service.extend({
app: service(),
unknownProperty(key) {
let all = getAll();
return all[key] || null;
},
setUnknownProperty(key, value) {
if (key !== 'app') {
this.setWithOptions(key, value);
}
return value;
},
// Opt: expire: date or number of days, path, domain, secure
setWithOptions(name, value, opt) {
opt = opt || {};
opt.path = (typeof opt.path === 'undefined' ? '/' : opt.path);
if ( typeof opt.secure === 'undefined' || opt.secure === 'auto' ) {
opt.secure = window.location.protocol === 'https:';
} else {
opt.secure = !!opt.secure;
}
let str = `${ encodeURIComponent(name) }=${ encodeURIComponent(value) }`;
if ( opt.expire ) {
let date;
if ( typeof (opt.expire) === 'object' ) {
date = opt.expire;
} else {
date = new Date( (new Date()).getTime() + (86400000 * opt.expire));
}
str += `;expires=${ date.toGMTString() }`;
}
if ( opt.path ) {
str += `;path=${ opt.path }`;
}
if ( opt.domain ) {
str += `;domain=${ opt.domain }`;
}
if ( opt.secure ) {
str += ';secure';
}
try {
document.cookie = str;
} catch ( e ) {
return false;
}
this.notifyPropertyChange(name);
return true;
},
remove(name, opt) {
opt = opt || {};
opt.expire = new Date('Wed, 24 Feb 1982 18:42:00 UTC');
return this.setWithOptions(name, 'removed', opt);
},
});