- // ==UserScript==
- // @name FollowOver
- // @namespace https://www.ekkooff.com/
- // @version 1.3.1
- // @description Rollover for user info and follow button.
- // @author Kevin Roberts (@echo)
- // @match https://gab.ai/*
- // @include https://gab.ai/*
- // @grant none
- // ==/UserScript==
-
- (function() {
- 'use strict';
-
- var styles, userInfoPopup, loadingPopup;
-
- var addToBody = function() {
- $('body').append(styles).append(userInfoPopup).append(loadingPopup);
- if($('body').css('background-color')!=='rgba(0, 0, 0, 0)'&&$('body').css('background-color')!=='transparent') {
- var bgcolor = $('body').css('background-color');
- userInfoPopup.css('background-color',bgcolor);
- loadingPopup.css('background-color',bgcolor);
- $('#followpopup-followback').css('background-color',bgcolor);
- }
-
- $('#followpopup-follow').click(function() {
- var id = $(this).data('id');
- var d = {};
- if($(this).text()==='Unfollow'||$(this).text()==='Pending') {
- d._method = 'delete';
- }
- var priv = $(this).hasClass('private');
- $.ajax({
- method: 'POST',
- url: '/users/'+id+'/follow',
- data: d
- }).done(function(data) {
- if(data.state==='success') {
- if(d._method) {
- $('#followpopup-follow').text('Follow').removeClass().addClass('follow');
- if($('#followpopup-followback i').hasClass('ion-arrow-swap')) {
- $('#followpopup-followback i').removeClass().addClass('ion-arrow-left-c');
- }
- } else if(!priv) {
- $('#followpopup-follow').text('Unfollow').removeClass().addClass('unfollow');
- if($('#followpopup-followback i').hasClass('ion-arrow-left-c')) {
- $('#followpopup-followback i').removeClass().addClass('ion-arrow-swap');
- }
- } else {
- $('#followpopup-follow').text('Pending').removeClass().addClass('pending');
- }
-
- if(priv) {
- $('#followpopup-follow').addClass('private');
- }
- }
- });
- return false;
- });
-
- };
-
- var init = function() {
- if(!window.hasOwnProperty('$')) {
- setTimeout(init,100);
- return;
- }
- var timeout=null;
- var timeout2=null;
- var id=null;
-
- //addToBody();
-
- styles = $('<style type="text/css">\n\
- #followpopup {\n\
- font-family: freight-sans-pro!important;\n\
- background-color:white;\n\
- position:absolute;\n\
- z-index:10000;\n\
- display:none;\n\
- height:140px;\n\
- width:500px;\n\
- padding:4px;\n\
- border:1px solid #666;\n\
- border-radius:5px;\n\
- }\n\
- #followpopup-loading {\n\
- position: absolute;\n\
- z-index: 9999;\n\
- }\n\
- #followpopup-loading .spinning {\n\
- display: inline-block;\n\
- animation-name: spin;\n\
- animation-duration: 1500ms;\n\
- animation-iteration-count: infinite;\n\
- animation-timing-function: linear;\n\
- }\n\
- \n\
- #followpopup-head {\n\
- text-align: center;\n\
- margin-bottom:3px;\n\
- }\n\
- #followpopup-head span {\n\
- padding-right:5px;\n\
- }\n\
- \n\
- #followpopup-bio {\n\
- height: 82px;\n\
- overflow: hidden;\n\
- word-wrap: break-word;\n\
- -ms-word-break: break-all;\n\
- overflow-wrap: break-word;\n\
- word-break: break-word;\n\
- text-overflow: ellipsis;\n\
- margin-bottom:5px;\n\
- }\n\
- \n\
- #followpopup-info {\n\
- border: 1px solid #edeeee;\n\
- overflow:hidden;\n\
- white-space: nowrap;\n\
- text-overflow: ellipsis;\n\
- border-radius:4px;\n\
- display:block;\n\
- width:100%;\n\
- height: 28px;\n\
- position:relative;\n\
- }\n\
- \n\
- #followpopup-follow {\n\
- right:0;\n\
- position:absolute;\n\
- width:55px;\n\
- color: white;\n\
- text-decoration: none;\n\
- padding: 5px 10px;\n\
- display: inline-block;\n\
- }\n\
- \n\
- #followpopup-info span {\n\
- border-right: 1px solid #edeeee;\n\
- padding: 3px;\n\
- display: inline-block;\n\
- }\n\
- \n\
- #followpopup #followpopup-followback {\n\
- background-color: white;\n\
- right:75px;\n\
- position:absolute;\n\
- padding-right: 6px;\n\
- height: 100%;\n\
- }\n\
- \n\
- #followpopup .follow {\n\
- background: #34cf7f;\n\
- }\n\
- \n\
- #followpopup .unfollow {\n\
- background: red;\n\
- }\n\
- \n\
- #followpopup .pending {\n\
- background: #edeeee;\n\
- color: #000;\n\
- }\n\
- \n\
- #followpopup .empty {\n\
- background: transparent;\n\
- }\n\
- #followpopup .ion-checkmark-circled.verified-badge {\n\
- background:transparent;\n\
- color:#33f!important;\n\
- }\n\
- \n\
- </style>');
-
-
- userInfoPopup = $('<div id="followpopup">\
- <div id="followpopup-head">\
- <strong><span id="followpopup-name"></span></strong>\
- <span id="followpopup-username"></span>\
- </div>\
- <div id="followpopup-bio"></div>\
- <div id="followpopup-info">\
- ?<span id="followpopup-score"></span>\
- <span id="followpopup-posts"></span>\
- <span id="followpopup-followers"></span>\
- <span id="followpopup-following"></span>\
- <span id="followpopup-followback"></span>\
- <a href="#" id="followpopup-follow"></a>\
- </div>\
- </div>');
-
- loadingPopup = $('<div id="followpopup-loading"><i class="ion-load-c spinning"> </i></div>');
-
- var targets = 'a.post__meta__name__full, a.post__meta__name__username, .notification-list .notification-list__item__message div:first-child span a:first-child, .notification-list__item__users a, a.notification-list__item__mention__name, a.notification-list__item__mention__username, a.inner-post-mention, a.profile-badge__name, a.profile-badge__username';
- var nameTarget = 'span.mini-user-list__item__name';
- var usernameTarget = 'span.mini-user-list__item__username';
- var allTargets = targets+', '+nameTarget+', '+usernameTarget;
-
- var populatePopup = function(data,css) {
- id = data.id;
- if(!$('#followpopup').length) addToBody();
- $('#followpopup-name').html(data.name+(data.verified?' <i class="ion-checkmark-circled verified-badge"></i>':''));
- $('#followpopup-username').text('@'+data.username);
- $('#followpopup-bio').text(data.bio);
- $('#followpopup-score').text(data.score);
- $('#followpopup-posts').text(data.post_count+' posts');
- $('#followpopup-followers').text(data.follower_count+' followers');
- $('#followpopup-following').text(data.following_count+' following');
- if(data.followed) {
- if(data.following) {
- $('#followpopup-followback').html('<i class="ion-arrow-swap"></i>');
- } else {
- $('#followpopup-followback').html('<i class="ion-arrow-left-c"></i>'+(data.is_accessible?'':'?'));
- }
- } else {
- $('#followpopup-followback').html((data.is_accessible?'':'?'));
- }
- $('#followpopup-follow').data('id',id);
- if(authUser.username!=data.username) {
- if(data.follow_pending) {
- $('#followpopup-follow').text('Pending').removeClass().addClass('pending');
- } else if(!data.following) {
- $('#followpopup-follow').text('Follow').removeClass().addClass('follow');
- } else {
- $('#followpopup-follow').text('Unfollow').removeClass().addClass('unfollow');
- }
- } else {
- $('#followpopup-follow').text('').removeClass().addClass('empty');
- }
- if(data.is_private) {
- $('#followpopup-follow').addClass('private');
- }
- userInfoPopup.css(css).show();
- };
-
- var getUserInfo = function(name,e) {
- clearTimeout(timeout);
- var offset = $(e.currentTarget).offset();
- var offset2 = $(e.currentTarget.parentElement).offset();
- var height = $(window).height();
- var width = $(window).width();
- var css = {
- top:((e.clientY<(height/2))?offset.top+25:offset.top-160)+'px',
- left:(((width-515)>offset2.left)?offset2.left:width-515)+'px'
- };
- var loadingCss = {
- top: ((e.clientY<(height/2))?offset.top+25:offset.top-25)+'px',
- left: offset.left
- };
- loadingPopup.css(loadingCss).show();
- $.ajax({
- method: 'GET',
- url: '/users/'+name,
- headers: {
- 'Authorization': 'Bearer '+window.storage.id_token
- }
- }).done(function(data) {
- loadingPopup.hide();
- populatePopup(data,css);
- }).error(function(data) {
- loadingPopup.hide();
- });
- };
-
- $('body').on('mouseenter',targets ,function(e){
- clearTimeout(timeout);
- clearTimeout(timeout2);
- var name = e.currentTarget.href.substr(e.currentTarget.href.lastIndexOf('/')+1);
- timeout2 = setTimeout(function() {
- getUserInfo(name,e);
- },500);
- }).on('mouseenter',nameTarget,function(e) {
- clearTimeout(timeout);
- clearTimeout(timeout2);
- var name = $(e.currentTarget).next().text().substring(1);
- timeout2 = setTimeout(function() {
- getUserInfo(name,e);
- },500);
- }).on('mouseenter',usernameTarget,function(e) {
- clearTimeout(timeout);
- clearTimeout(timeout2);
- var name = $(e.currentTarget).text().substring(1);
- timeout2 = setTimeout(function() {
- getUserInfo(name,e);
- },500);
- }).on('click',allTargets,function(e){
- clearTimeout(timeout);
- clearTimeout(timeout2);
- userInfoPopup.hide();
- }).on('mouseleave',allTargets,function(){
- clearTimeout(timeout2);
- timeout = setTimeout(function(){
- loadingPopup.hide();
- userInfoPopup.hide();
- }, 650);
- });
-
- (function(history){
- var pushState = history.pushState;
- history.pushState = function(state) {
- if (typeof history.onpushstate == "function") {
- history.onpushstate({state: state});
- }
- clearTimeout(timeout);
- clearTimeout(timeout2);
- userInfoPopup.hide();
- return pushState.apply(history, arguments);
- };
- })(window.history);
-
- userInfoPopup.mouseenter(function() {
- clearTimeout(timeout);
- clearTimeout(timeout2);
- loadingPopup.hide();
- }).mouseleave(function() {
- clearTimeout(timeout2);
- timeout = setTimeout(function() {
- loadingPopup.hide();
- userInfoPopup.hide();
- }, 650);
- });
- };
-
- window.addEventListener('load',init,false);
- })();