【问题标题】:Infinite Scrolling of Gmail messeges in my current Gmail API project在我当前的 Gmail API 项目中无限滚动 Gmail 消息
【发布时间】:2020-10-29 11:42:14
【问题描述】:

好的,所以我将共享仅硬编码为 20 封电子邮件的代码。我想获取电子邮件列表,直到它结束而不仅仅是 20。所以当我滚动时,我将能够看到 nextPage。我知道 gmail API 有一个名为 pagetoken 的属性,但我无法实现它。

我正在使用 React-hooks 来更新消息。我能够成功地看到 20 封电子邮件,但我想看到它们直到结束。下面是前端代码

   {isEmpty(messages) ? (
        <Box mt={6} display='flex' align='center' justifyContent='center'>
          <Spinner
            thickness='4px'
            speed='0.65s'
            emptyColor='gray.200'
            color='blue.500'
            size='xl'
          />
        </Box>
      ) : (
        <Box overflowY='auto'>
          {messages.map((message) => {
            const name = removeQuote(
              getHeader(message.payload.headers, "From").split("<")[0]
            );
            const subject = getHeader(message.payload.headers, "Subject");
            const msg = decodeHtml(message.snippet.substr(0, 75));
            const backgroundColor =
              message.labelIds.indexOf("UNREAD") > -1 ? "#fff" : "#E2E8F0";

            return (
              <Flex
                key={message.id}
                id={message.id}
                onClick={handleMessageClick}
                wrap='no-wrap'
                justify='space-around'
                py={2}
                bg={backgroundColor}
                borderTop='1px'
                borderBottom='1px'
                borderColor='gray.300'
                cursor='pointer'
              >
                <Avatar name={name} src='' />
                <Box w='80%'>
                  <Text fontSize='sm' color='gray.700' isTruncated>
                    {name}
                  </Text>
                  <Text
                    fontSize='md'
                    fontWeight='bold'
                    color='#3182ce'
                    isTruncated
                  >
                    {subject}
                  </Text>
                  <Text fontSize='xs' color='gray.500'>
                    {msg}
                  </Text>
                </Box>
              </Flex>
            );
          })}
        </Box>
      )}
    </Flex>
 const [message, setMessage] = useState({});
const getMessages = (labelIds = "INBOX") => {
    // Get List of 20 message's Id
    const request = window.gapi.client.gmail.users.messages.list({
      userId: "me",
      labelIds: labelIds,
      maxResults: 20,
    });

    setMessages([]);

    // Send Id list to getMessagesData to get Message Data foreach Id
    request.execute(getMessagesData);
  };

  const getMessagesData = (response) => {
    const messages = response.result.messages ? response.result.messages : [];

    messages.forEach((message) => {
      window.gapi.client.gmail.users.messages
        .get({
          userId: "me",
          id: message.id,
        })
        .then(
          (response) => {
           
            setMessages((messages) => [...messages, response.result]);
          },
          (err) => {
            console.error("getMessagesData error", err);
          }
        );
    });
  };

【问题讨论】:

    标签: javascript node.js reactjs gmail-api


    【解决方案1】:

    根据文档,nextPageToken 包含在响应中。

    https://developers.google.com/gmail/api/v1/reference/users/messages/list#response

    你可以这样做:

    let nextPageToken; // add me
    
    const getMessages = (labelIds = "INBOX") => {
        // Get List of 20 message's Id
        const request = window.gapi.client.gmail.users.messages.list({
          userId: "me",
          labelIds: labelIds,
          maxResults: 20,
          pageToken: nextPageToken,  // changed
        });
    ...rest of function
    };
    
    const getMessagesData = (response) => {
      nextPageToken = response.nextPageToken;  // add me
      
      const messages = response.result.messages ? response.result.messages : [];
      
      messages.forEach((message) => {
    ...rest of function
    }
    

    发件人:

    function listMessages(userId, query, callback) {
      var getPageOfMessages = function(request, result) {
        request.execute(function(resp) {
          result = result.concat(resp.messages);
          var nextPageToken = resp.nextPageToken;
          if (nextPageToken) {
            request = gapi.client.gmail.users.messages.list({
              'userId': userId,
              'pageToken': nextPageToken,
              'q': query
            });
            getPageOfMessages(request, result);
          } else {
            callback(result);
          }
        });
      };
      var initialRequest = gapi.client.gmail.users.messages.list({
        'userId': userId,
        'q': query
      });
      getPageOfMessages(initialRequest, []);
    }
    

    【讨论】:

    • 现在应该可以工作了,我在请求对象上有错误的属性。更改为 {pageToken: nextPageToken ...}
    • 嘿,我按照您的建议更改了代码,但是当我向下滚动到最后时它没有加载新消息。
    • 即使我能够获得下一页令牌,我如何才能使用此令牌重新请求。以及我必须在前端做些什么改变。感谢您的帮助。
    • 每次调用getMessages 函数时,您都应该获得下一页,只要在收到响应并更新nextPageToken 后调用它。在第一次 getMessages 调用时,它是未定义的,因此您会收到第一页,但它将为所有后续调用定义,并带有下一页的令牌。
    • 至于“无限”部分,您将要使用滚动事件。这应该会有所帮助:stackoverflow.com/questions/5059526/…
    猜你喜欢
    • 2014-09-08
    • 1970-01-01
    • 2014-11-03
    • 2014-09-03
    • 2015-04-16
    • 2016-03-28
    • 2015-12-23
    • 2016-03-18
    • 1970-01-01
    相关资源
    最近更新 更多