Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
  <head>
    <meta name="description" content="Get Conversation by a filter (e.g. label)">
    <title>Circuit JS SDK</title>
    <script src="https://unpkg.com/circuit-sdk@beta"></script>
    <script src="https://rawgit.com/circuit/js-sdk/master/jsbin-template.js"></script>
    <link rel="stylesheet" href="https://rawgit.com/circuit/js-sdk/master/jsbin-template.css">
    <style>
      select { width: 200px; }
      #itemList option { color: black; }
    </style>
  </head>
  <body>
    <div id="template"></div>
    <section id="main" style="display:none">
      <select id="labelList" size="10" onchange="selectLabel(this)" style="width:200px"></select>
      <select id="convList" size="10" style="width:200px"></select>
    </section>
</body>
</html>
 
/*jshint esnext: true */
// Create client instance
const client = new Circuit.Client({
  domain: jsBinTpl.domain,       // read domain from url
  client_id: jsBinTpl.client_id, // get client_id for domain
  scope: 'ALL'
});
// Template for Circuit JSBin examples. Builds generic part of page incl. login button.
const {logonButton, logoutButton, print} = jsBinTpl.init(client, template, {
  title: 'Circuit JS SDK: Get Conversation by a filter (e.g. label)',
  description: 'Retrieves the labels and upon selecting a label retrieves the converations using that label',
  apiMethods: ['getConversationsByFilter', 'getAllLabels'],
  prerequisites: ['None']
});
// Local variables
var _conversations;
logonButton.addEventListener('click', () => {
  clearLists();
  client.logon()
  .then(user => print(`Successfully authenticated as ${user.displayName}`))
  .then(client.getAllLabels)
  .then(showLabels)
  .catch(print);
});
logoutButton.addEventListener('click', () => {
  client.logout()
  .catch(print);
});
function clearLists(skipConvList) {
  labelList.innerHTML = '';
  convList.innerHTML = '';
}
function showLabels(labels) {
  labels.forEach(c => {
    let opt = document.createElement('option');
    opt.value = c.labelId;
    opt.innerHTML = c.value;
    labelList.appendChild(opt);
  })
}
function showConversations(conversations) {
  convList.innerHTML = '';
  conversations.reverse().forEach(c => {
    let opt = document.createElement('option');
    opt.value = c.convId;
    opt.innerHTML = c.title;
    convList.appendChild(opt);
  })
}
function selectLabel(label) {
  client.getArchivedConversations({number: 25})
  //client.getConversationsByLabel(label.value, {number: 25})
  /* Alternative code
  client.getConversationsByFilter({
    filterConnector: {
      conditions: [{
         filterTarget: 'LABEL_ID',
         expectedValue: [label.value]
      }]
    },
    retrieveAction: Circuit.Enums.RetrieveAction.CONVERSATIONS,
    number: 25
  })
  */
  .then(showConversations)
  .catch(print);
}
client.addEventListener('connectionStateChanged', function (evt) {
    console.log('Received connectionStateChanged event. state: ', evt.state)
});
// Setup conversation injector (async) so all conversations returned in any API
// will contain a title attribute which is either the diplayName of a
// direct conversation peer, the topic of a group conversation (if given),
// or a list of the first 5 members firstnames
Circuit.Injectors.conversationInjector = conv => {
  return new Promise((resolve, reject) => {
    if (conv.topic) {
      conv.title = conv.topic;
      resolve(conv);
      return;
    }
    let userIds = conv.participants.slice(0, 5).filter(p => {
      return p !== client.loggedOnUser.userId;
    });
    client.getUsersById(userIds)
    .then(users => {
      if (conv.type === Circuit.Enums.ConversationType.DIRECT) {
        conv.title = users[0].displayName;
      } else {
        conv.title = users.map(u => {
          return u.firstName;
        }).join(', ');
      }
      resolve(conv);
    })
    .catch(reject);
  });
}
Output 300px

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
rogerupro
0viewers