nopaque.requests = {};

nopaque.requests.JSONfetch = (input, init={}) => {
  return new Promise((resolve, reject) => {
    let fixedInit = {};
    fixedInit.headers = {};
    fixedInit.headers['Accept'] = 'application/json';
    if (init.hasOwnProperty('body')) {
      fixedInit.headers['Content-Type'] = 'application/json';
    }
    fetch(input, nopaque.Utils.mergeObjectsDeep(init, fixedInit))
      .then(
        (response) => {
          if (response.ok) {
            resolve(response.clone());
          } else {
            reject(response);
          }
          if (response.status === 204) {
            return;
          } 
          response.json()
            .then(
              (json) => {
                let message = json.message;
                let category = json.category || 'message';
                if (message) {
                  app.flash(message, category);
                }
              },
              (error) => {
                app.flash(`[${response.status}]: ${response.statusText}`, 'error');
              }
            );
        },
        (response) => {
          app.flash('Something went wrong', 'error');
          reject(response);
        }
      );
  });
};