/** * Type Definitions * =============================================================================== */ /** * @typedef {object} GoogleIdentityPromptNotification * @property {function(): string} getMomentType - Notification moment type * @property {function(): string} getDismissedReason - Notification get Dismissed Reason * @property {function(): string} getNotDisplayedReason - Notification get Not Displayed Reason * @property {function(): string} getSkippedReason - Notification get Skipped Reason * @property {function(): boolean} isDismissedMoment - Notification is Dismissed Moment * @property {function(): boolean} isDisplayMoment - Notification is Display Moment * @property {function(): boolean} isDisplayed - Notification is Displayed * @property {function(): boolean} isNotDisplayed - Notification is Not Displayed * @property {function(): boolean} isSkippedMoment - Notification is Skipped Moment */ ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// /** * Login with Google Function * =============================================================================== * @description This function uses google identity api to login a user with datasquirel * * @async * * @param {object} params - Single object passed * @param {string} params.clientId - Google app client ID: {@link https://datasquirel.com/docs} * @param {HTMLElement} params.element - HTML Element to display google login button * @param {boolean} params.triggerPrompt - Whether to trigger Google signing popup or not: {@link https://datasquirel.com/docs} * @param {function(): void} [params.readyStateDispatch] - React setState Function: sets whether the google login button is ready or not * * @returns {Promise} - Return */ module.exports = async function getAccessToken({ clientId, element, triggerPrompt, readyStateDispatch }) { /** * == Initialize * * @description Initialize */ const googleScript = document.createElement("script"); googleScript.src = "https://accounts.google.com/gsi/client"; googleScript.className = "social-script-tag"; document.body.appendChild(googleScript); const response = await new Promise((resolve, reject) => { googleScript.onload = function (e) { if (google) { if (readyStateDispatch) readyStateDispatch(true); //////////////////////////////////////// //////////////////////////////////////// //////////////////////////////////////// if (element) { /** * Handle google credentials response * ======================================================== * @param {object} response - Google response with credentials * @param {string} response.credential - Google access token */ function handleCredentialResponse(response) { resolve(response.credential); } google.accounts.id.initialize({ client_id: clientId, callback: handleCredentialResponse, }); google.accounts.id.renderButton(element, { theme: "outline", size: "large", logo_alignment: "center", }); } //////////////////////////////////////// //////////////////////////////////////// //////////////////////////////////////// if (triggerPrompt) { google.accounts.id.prompt( /** * Google prompt notification callback * ======================================================== * @param {GoogleIdentityPromptNotification} notification - Notification object */ (notification) => { notification.isDisplayed(); } ); } } }; }); ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// return response; };