如何在Vue3应用程序中使用Google Calendar API

问题描述 投票:0回答:1

最近,我正在构建vue应用程序,需要集成谷歌日历。 我在谷歌云上创建了项目并获取 API 密钥和客户端 ID。 但我担心,如何在 vue 应用程序中使用这个 api 密钥。 我找到了两个解决方案gapi和vue-gapi。 但我找不到如何在 vue3 和 vue-gapi 中使用gapi。

请让我知道如何将谷歌日历集成到我的 vue3 项目中。 预先感谢。

vue.js vuejs3 google-calendar-api
1个回答
0
投票

我设法让它作为单个组件工作,而不使用外部库。

我使用了 Google 快速入门指南 (https://developers.google.com/calendar/api/quickstart/js) 中的代码以及已弃用的 vue-gapi (https://www.npmjs) 中的一些代码。 com/package/vue-gapi)。

<template>
<div @click="handleAuthClick">Click here</div>
</template>

<script setup>
import { onMounted } from 'vue';

const CLIENT_ID = 'xxxxx';
const API_KEY = 'xxxxx';
const DISCOVERY_DOC = 'https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest';
const SCOPES = 'https://www.googleapis.com/auth/calendar.readonly';

let tokenClient;
let gapiInited = false;
let gisInited = false;

function gapiLoaded() {
    window.gapi.load('client', initializeGapiClient);
}

async function initializeGapiClient() {
    await window.gapi.client.init({
        apiKey: API_KEY,
        discoveryDocs: [DISCOVERY_DOC],
    });
    gapiInited = true;
    maybeEnableButtons();
}

function gisLoaded() {
    console.log('gisLoaded')
    tokenClient = window.google.accounts.oauth2.initTokenClient({
        client_id: CLIENT_ID,
        scope: SCOPES,
        callback: '',
    });
    gisInited = true;
    maybeEnableButtons();
}

function maybeEnableButtons() {
    if (gapiInited && gisInited) {
        console.log('GAPI initialised')
    }
}

function handleAuthClick() {
    if (gapiInited && gisInited) {
      tokenClient.callback = async (resp) => {
          if (resp.error !== undefined) {
          throw (resp);
          }
          await listUpcomingEvents();
      };

      if (window.gapi.client.getToken() === null) {
          tokenClient.requestAccessToken({prompt: 'consent'});
      } else {
          tokenClient.requestAccessToken({prompt: ''});
      }
    }
}

function handleSignoutClick() {
    const token = window.gapi.client.getToken();
    if (token !== null) {
        window.google.accounts.oauth2.revoke(token.access_token);
        window.gapi.client.setToken('');
    }
}

async function listUpcomingEvents() {
  let response;
  try {
      const request = {
      'calendarId': 'primary',
      'timeMin': (new Date()).toISOString(),
      'showDeleted': false,
      'singleEvents': true,
      'maxResults': 10,
      'orderBy': 'startTime',
      };
      response = await window.gapi.client.calendar.events.list(request);
  } catch (err) {
      console.log('GAPI error:' + err.message)
      return;
  }

  const events = response.result.items;
    if (!events || events.length == 0) {
        console.log('GAPI: No events found.')
        return;
    }
    const output = events.reduce(
        (str, event) => `${str}${event.summary} (${event.start.dateTime || event.start.date})\n`,
        'Events:\n');
    console.log('GAPI: ' + output)
}

onMounted(()=>{
  let gapiScript = document.createElement('script')
  gapiScript.defer = true
  gapiScript.async = true
  gapiScript.onreadystatechange = gapiScript.onload = function () {
    const interval = setInterval(function () {
      if (!gapiScript.readyState || /loaded|complete/.test(gapiScript.readyState)) {
        clearInterval(interval)
        if (window.gapi) {
          gapiLoaded()
        } else {
          console.log('Failed to load gapi')
        }
      }
    }, 100)
  }
  gapiScript.src = 'https://apis.google.com/js/api.js'
  document.head.appendChild(gapiScript)

  let gisScript = document.createElement('script')
  gisScript.defer = true
  gisScript.async = true
  gisScript.onreadystatechange = gisScript.onload = function () {
    const interval = setInterval(function () {
      if (!gisScript.readyState || /loaded|complete/.test(gisScript.readyState)) {
        clearInterval(interval)
        if (window.google && window.google.accounts) {
          gisLoaded()
        } else {
          console.log('Failed to load gis')
        }
      }
    }, 100)
  }
  gisScript.src = 'https://accounts.google.com/gsi/client'
  document.head.appendChild(gisScript)
})

</script>

<style></style>
© www.soinside.com 2019 - 2024. All rights reserved.