Source: auth/login.mjs

import { API_BASE, API_AUTH, API_LOGIN } from "../settings.mjs";
import { save } from "../shared/storage.mjs";
import { ErrorHandler } from "../shared/errorHandler.mjs";
import { displaySpinner } from "../shared/displaySpinner.mjs";
import { displayError } from "../shared/displayErrorMsg.mjs";

/** @typedef {object} LoginResponse
 * @property {object} data
 * @property {string} data.name
 * @property {string} data.email
 * @property {null} data.bio
 * @property {object} data.avatar
 * @property {string} data.avatar.url
 * @property {string} data.avatar.alt
 * @property {object} data.banner
 * @property {string} data.banner.url
 * @property {string} data.banner.alt
 * @property {string} data.accessToken
 */

/**
 * @description Send a request to login the user
 * @async
 * @function login
 * @param {string} email User email
 * @param {string} password User password
 * @returns {Promise<LoginResponse|null|undefined>} If response is ok, return the user info. If response is not ok, return null. Returns undefined for unexpected errors.
 */
export async function login(email, password) {
  try {
    displaySpinner(true, "#spinnerLogin");
    displayError(false, "#error");

    const url = API_BASE + API_AUTH + API_LOGIN;
    const request = {
      email: email,
      password: password,
    };

    const response = await fetch(url, {
      headers: {
        "Content-Type": "application/json",
      },
      method: "POST",
      body: JSON.stringify(request),
    });

    if (response.ok) {
      /** @type {LoginResponse} */
      const userInfo = await response.json();

      const { accessToken, ...profile } = userInfo.data;
      save("token", accessToken);
      save("profile", profile);
      return userInfo;
    }

    const eh = new ErrorHandler(response);
    const msg = await eh.getErrorMessage();

    displayError(true, "#error", msg);
    return null;
  } catch (ev) {
    displayError(true, "#error", "Could not login! Please retry later.");
  } finally {
    displaySpinner(false, "#spinnerLogin");
  }
}