Задать вопрос
Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (1)

Наибольший вклад в теги

Все теги (31)

Лучшие ответы пользователя

Все ответы (25)
  • Как сделать анимированный фавикон?

    @akyl-kb
    В head:
    <link rel="icon" href="/favicons/favicon.ico" type="image/x-icon">


    function setFavicon(url) {
        var link = document.querySelector('link[rel=icon]')
        link.setAttribute('href', url)
    }
    
    function startAnimation(icons, initial) {
        initial = initial === undefined ? 0 : initial
        setFavicon(icons[initial])
        var next = icons.length <= initial + 1 ? 0 : initial + 1
        setTimeout(function () {
            startAnimation(icons, next)
      }, 1000)
    }
    
    var icons = [
        'https://habr.com/images/favicon-32x32.png',
        'https://nextjs.org/static/favicon/favicon.ico'
    ]
    
    startAnimation(icons)
    Ответ написан
    Комментировать
  • Слайдер slick внутри слайдера, как сделать так чтобы нумерация слайда не переключалась если свайпишь внутренний слайдер?

    @akyl-kb
    И так у тебя 2-й слайд вложен в 1-й слайд оба подписаны на событие afterChange
    В JS события работают по принципу всплытия (снизу в верх), т.е когда во 2-м слайде (reviews-gallery-slider) срабатывает событие afterChange оно дальше передается в вверх 1-му слайду (reviews-slider) так как первый слайд подписан на события init reInit afterChange счетчик изменяется

    Причину выяснили, варианты решения:

    1. Вариант: во 2-м слайде запретить передачу события afterChange дальше

    $('.reviews-gallery-slider').slick(
               ...
            ).on('afterChange', function(event, slick){
                event.stopPropagation(); // <-
                ...
            });


    2-й вариант: не самый элегантный но рабочий, для 1-го слайда проверяем что у текущего слайда есть класс reviews-slider, если нет завершаем функцию

    $examplesSlider2.on('init reInit afterChange', function (event, slick, currentSlide, nextSlide) {
            // check
            if (!event.target.classList.value.includes('reviews-slider')) {
                return;
            }
            ...
        });
    Ответ написан
    7 комментариев
  • Авторизация через node.js passport-facebook + jwtwebtoken в rest api приложении?

    @akyl-kb
    Для начала нужно удобнее организовать структуру
    Пример как у меня организовано:
    - /models/User.js
    - /passports/facebook.js
    - /passports/google.js
    - /passport.js
    - /routes.js

    Содержимое passport.js
    const User = require('./models/User')
    const facebookStrategy = require('./passports/facebook')
    const googleStrategy = require('./passports/google')
    
    module.exports = function (passport) {
      passport.serializeUser(function (user, done) {
          return done(null, user.id)
      })
    
      passport.deserializeUser(async (id, done) => {
        try {
          const user = await User.findOne({ id })
          done(null, user)
        } catch (err) {
          done(err)
        }
      })
    
      passport.use(facebookStrategy())
      passport.use(googleStrategy())
    }


    Содержимое facebookStrategy.js:
    const assert = require('assert')
    const FacebookStrategy = require('passport-facebook').Strategy
    const User = require('../models/User')
    
    assert(process.env.FACEBOOK_APP_ID)
    assert(process.env.FACEBOOK_APP_SECRET)
    assert(process.env.APP_URL)
    
    module.exports = () => {
      return new FacebookStrategy({
        clientID: process.env.FACEBOOK_APP_ID,
        clientSecret: process.env.FACEBOOK_APP_SECRET,
        callbackURL: `${process.env.APP_URL}/auth/facebook/callback`
      },
      async (accessToken, refreshToken, profile, done) => {
        try {
          const user = await User.findOrCreate({ facebook_id: profile.id }, {
            facebook_id: profile.id,
            name: profile.displayName,
            provider: 'facebook'
          })
          return done(null, user.toJSON())
        } catch (err) {
          return done(err)
        }
      })
    }


    routes.js
    app.get('/auth/facebook', passport.authenticate('facebook'))
    app.get('/auth/facebook/callback', passport.authenticate('facebook', { failureRedirect: '/login' }, (req, res) => {
      const user = req.user;
      const payload = {
          id: user._id,
          email: user.email,
      };
    
      jwt.sign(payload, secret, {expiresIn: 3600}, (err, token) => {
          if (err) {
              res.status(500).send({
                  error: 'Error signing token',
                  raw: err,
              });
          }
          // Отдаем html
          res.send(`
          <script>
            localStorage.setItem('token', '${`Bearer ${token}`}');
            localtion.href = '/'
          </script>
          `);
      });
    })


    в app.js
    const passport = require('passport')
    require('./passport')(passport)
    app.use(passport.initialize())
    Ответ написан
    3 комментария
  • Как имитировать высокое разрешение, не поддерживаемое монитором для проверки вертски?

    @akyl-kb
    браузер chrome инструменты разработчика Ctrl+Shift+I
    Клик по иконке с телефоном из списка выбираеш responsive и задаеш размер
    Ответ написан
    1 комментарий
  • Как написать своё vpn-расширение для Chrome?

    @akyl-kb
    VPN для блокировки рекламы не нужен.
    Создать расширение, указать разрешения
    // Пример
    // Перехват запроса, и блокирование если есть совпадения с url
    chrome.webRequest.onBeforeRequest.addListener(
            function(details) { return {cancel: true}; },
            {urls: ["*://www.domain.com/*"]},
            ["blocking"]);


    Документация
    https://developer.chrome.com/extensions/webRequest
    Ответ написан
    Комментировать

Лучшие вопросы пользователя

Все вопросы (9)