From 2dc46ff44d488fa562dea56925a2779729f7cda8 Mon Sep 17 00:00:00 2001 From: sairajzero Date: Sun, 8 Sep 2019 14:19:14 +0530 Subject: [PATCH] Added Search Contact/Group Feature Users can now search contacts or groups using name or floID use @floID to search contact with floID use #floID to search group with floID use to search contact or group with --- app/app.js | 35 ++++++++++++++++++++++++++++++----- app/index.html | 13 +++---------- app/init.js | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 15 deletions(-) diff --git a/app/app.js b/app/app.js index d35f9d1..75704de 100644 --- a/app/app.js +++ b/app/app.js @@ -6,8 +6,8 @@ if (!window.indexedDB) { window.alert("Your browser doesn't support a stable version of IndexedDB.") } -var contacts = [], - groups = []; +var contacts, groups; +var searchIndex = new FlexSearch(); var receiverID, selfID, recStat, modSuperNode, msgType; var selfwebsocket, receiverWebSocket, receiverSuperNodeWS; var privKey; @@ -321,6 +321,7 @@ function userDataStartUp() { sendMsg(); } }); + document.getElementById("searchContact").addEventListener("input", searchContact, true); getDatafromAPI().then(result => { console.log(result); @@ -586,6 +587,7 @@ function getContactsfromIDB() { var result = {} event.target.result.forEach(c => { result[c.floID] = c; + searchIndex.add(c.floID, c.name+' @'+ c.floID); }); resolve(result); } @@ -610,12 +612,14 @@ function getGroupsfromIDB() { getReq.onsuccess = (event) => { var result = {} event.target.result.forEach(g => { - result[g.groupID] = JSON.parse(g.groupInfo); + var gInfo = JSON.parse(g.groupInfo); + result[g.groupID] = gInfo; + searchIndex.add(g.groupID, gInfo.name+' #'+ gInfo.floID); }); resolve(result); } getReq.onerror = (event) => { - reject('Unable to read contacts!') + reject('Unable to read groups!') } db.close(); }; @@ -874,6 +878,8 @@ function processIncomingData(data) { var groupInfoStr = floOpt.decryptData(data.newGroup.groupInfo.secret, data.newGroup.groupInfo.pubVal, privKey) var groupInfo = JSON.parse(groupInfoStr); if (floOpt.verifyData(groupInfoStr, data.newGroup.sign, contacts[groupInfo.creator].pubKey)) { + groups[groupInfo.floID] = groupInfo; + searchIndex.add(groupInfo.floID, groupInfo.name+' #'+ groupInfo.floID); storeGroup(groupInfoStr, groupInfo.floID); createGroupDisplay(groupInfo); } @@ -882,6 +888,7 @@ function processIncomingData(data) { return if (floOpt.verifyData('deleteGroup:' + data.deleteGroup.group, data.deleteGroup.sign, contacts[data.from].pubKey)) { delete groups[data.deleteGroup.group]; + searchIndex.remove(data.deleteGroup.group); deleteGroupFromIDB(data.deleteGroup.group); } } else if (data.addGroupMembers !== undefined && data.addGroupMembers.group in groups) { @@ -1231,7 +1238,6 @@ function sendDataToSuperNode(floID, data) { } function createGroupDisplay(groupInfo) { - groups[groupInfo.floID] = groupInfo; var createLi = document.createElement('div'); createLi.setAttribute("name", groupInfo.floID); createLi.setAttribute("onClick", 'changeReceiver(this)'); @@ -1434,3 +1440,22 @@ function rmGroupAdmins() { var grpInfoStr = JSON.stringify(groups[receiverID]); storeGroup(grpInfoStr, receiverID); } + +function searchContact() { + try { + var searchKey = this.value; + if (!searchKey) + var searchResults = Array.from(contacts.keys()).concat(Array.from(groups.keys())); + else + var searchResults = searchIndex.search(searchKey); + var dispContacts = document.getElementById('contact-display'); + dispContacts.children.forEach(child => { + if (searchResults.includes(child.getAttribute("name"))) + child.style.display = 'block'; + else + child.style.display = 'none'; + }) + } catch (e) { + console.log(e); + } +} \ No newline at end of file diff --git a/app/index.html b/app/index.html index 95a871e..7ee0c31 100644 --- a/app/index.html +++ b/app/index.html @@ -31,7 +31,7 @@ -->
- +

created by Ranchimall @@ -40,25 +40,18 @@ - - - + diff --git a/app/init.js b/app/init.js index b888b72..7d6d3ac 100755 --- a/app/init.js +++ b/app/init.js @@ -6077,3 +6077,47 @@ Bitcoin.Util = { } })("secp256k1"); + +/* + FlexSearch v0.6.22 + Copyright 2019 Nextapps GmbH + Author: Thomas Wilkerling + Released under the Apache 2.0 Licence + https://github.com/nextapps-de/flexsearch + */ + //FlexSearch min mode + DEBUG = true; + 'use strict';(function(I,R,v){let K;(K=v.define)&&K.amd?K([],function(){return R}):(K=v.modules)?K[I.toLowerCase()]=R:"object"===typeof exports?module.exports=R:v[I]=R})("FlexSearch",function ma(I){function v(a,b){const c=b?b.id:a&&a.id;this.id=c||0===c?c:na++;this.init(a,b);fa(this,"index",function(){return this.a?Object.keys(this.a.index[this.a.keys[0]].c):Object.keys(this.c)});fa(this,"length",function(){return this.index.length})}function K(a,b,c,d){this.u!==this.g&&(this.o=this.o.concat(c),this.u++, + d&&this.o.length>=d&&(this.u=this.g),this.u===this.g&&(this.cache&&this.l.set(b,this.o),this.F&&this.F(this.o)));return this}function S(a){const b=B();for(const c in a)if(a.hasOwnProperty(c)){const d=a[c];b[c]=E(d)?d.slice(0):J(d)?S(d):d}return b}function W(a,b){const c=a.length,d=O(b),e=[];for(let f=0,g=0;f=g&&(a=a[h-(e+.5>>0)],a=a[c]||(a[c]=[]),a[a.length]= + d);return e}function ba(a,b){if(a){const c=Object.keys(a);for(let d=0,e=c.length;da?1:a?-1:0}function pa(a,b){a=a[L];b=b[L];return ab?1:0}function oa(a,b){const c=L.length;for(let d=0;db?1:0}function T(a,b,c){return a?{page:a,next:b?""+b:null,result:c}:c}function ha(a,b,c,d,e,f,g){let h,l=[];if(!0===c){c="0";var m=""}else m=c&&c.split(":");const n=a.length;if(1g&&(m=0),m=m||0,h=m+b,h=this.m.length&&(this.C=0),this.m[this.C].postMessage({add:!0,id:a,content:b}),this.c[f]=""+this.C,c&&c(),this;if(!e){if(this.async&&"function"!==typeof importScripts){let r=this;f=new Promise(function(w){setTimeout(function(){r.add(a, + b,null,d,!0);r=null;w()})});if(c)f.then(c);else return f;return this}if(c)return this.add(a,b,null,d,!0),c(),this}b=this.encode(b);if(!b.length)return this;c=this.f;e=O(c)?c(b):b.split(this.split);this.filter&&(e=W(e,this.filter));const p=B();p._ctx=B();const k=e.length,u=this.threshold,t=this.depth,A=this.b,z=this.j,y=this.D;for(let r=0;rn;x--)m=g.substring(n,x),V(z,p,m,a,w,l,u,A-1)}break;default:if(h=V(z,p,g,a,1,l,u,A-1),t&&1=u)for(h=p._ctx[g]||(p._ctx[g]=B()),g=this.i[g]||(this.i[g]=ia(A-(u||0))),l=r-t,m=r+t+1,0>l&&(l=0),m>k&&(m=k);lg;d--)e=h[d-1],h[d]=e,f[e]=d;h[g]=b;f[b]=g}}}return c};return a}();return v}(function(){const I={},R="undefined"!==typeof Blob&&"undefined"!==typeof URL&&URL.createObjectURL;return function(v,K,S,W,P){S=R?URL.createObjectURL(new Blob(["("+ + S.toString()+")()"],{type:"text/javascript"})):v+".min.js";v+="-"+K;I[v]||(I[v]=[]);I[v][P]=new Worker(S);I[v][P].onmessage=W;return I[v][P]}}()),this);