Axios: рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдкрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╢реАрд░реНрд╖рд▓реЗрдЦ рдЕрджреНрдпрддрди рдХрд░ рд░рд╣рд╛ рд╣реИ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 25 рдлрд╝рд░ре░ 2018  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: axios/axios

рд╣реИрд▓реЛ рджреЛрд╕реНрддреЛрдВ,

рдореИрдВрдиреЗ рдЕрдХреНрд╖реЛрдВ рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рдПрдкреАрдЖрдИ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдСрде рд╣реЗрдбрд░ рд╕рдВрд▓рдЧреНрди рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рдХрдВрд╕реЛрд▓ рдкрд░ рдЬрд╛рддрд╛ рд╣реВрдВ рдФрд░ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рд╕реЗ рдЯреЛрдХреЗрдо рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ, рддреЛ рдЕрдХреНрд╖ рдЕрднреА рднреА рдЗрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬ рд░рд╣рд╛ рд╣реИ рдЕрджреНрдпрддрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдХреНрдпрд╛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЗрд╕рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдореЗрд░реЗ рд▓реЗрдЦ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рдЯреЛрдХрди рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдзрдиреНрдпрд╡рд╛рдж!

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╣реИред рдЕрдЧрд░ рдЕрдиреБрд░реЛрдз рдХрд╛ рдореВрд▓ рдпреВрдЖрд░рдПрд▓ рдореЗрд░реЗ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рд╣реИ рддреЛ рдореИрдВ рдСрде рд╣реЗрдбрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ (рддреГрддреАрдп рдкрдХреНрд╖реЛрдВ рдХреЛ рдкреНрд░рдорд╛рдг-рдкрддреНрд░ рднреЗрдЬрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП)ред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдкрд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЯреЛрдХрди рдмрджрд▓рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди рд░реАрдлреНрд░реЗрд╢ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк) рддреЛ рдЕрдЧрд▓рд╛ рдЕрдиреБрд░реЛрдз рдирдпрд╛ рдЯреЛрдХрди рдЙрдард╛рддрд╛ рд╣реИред рдореИрдВ рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХреЙрд▓ рд╕рд╛рдЗрдЯ рд╕реЗ рд╣реЗрдбрд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдореИрдВ рдореМрдЬреВрджрд╛ рдореВрд▓реНрдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реВрдВ, рдпрджрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛред

axios.interceptors.request.use(
  config => {
    if (config.baseURL === baseApiAddress && !config.headers.Authorization) {
      const token = getToken();

      if (token) {
        config.headers.Authorization = `Bearer ${token}`;
      }
    }

    return config;
  },
  error => Promise.reject(error)
);

рд╕рднреА 10 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рди рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдкрд╛рд░рд┐рдд рд╣реЗрдбрд░ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЖрд▓рд╕реА рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╕реЛрдЪ:
рд╣реЗрдбрд░ рд╣реИрд╢ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрддреНрд╕реБрдХрддрд╛ рд╕реЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп ( axios.create({headers: {...}}) рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣реЗрдбрд░ ( axios.create({headers: () => {...}} ) рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рддреБрдо рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реЛ?
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЗрд╕ рд╕рдордп рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдЙрд╕реА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред рдореИрдВрдиреЗ рдЕрд▓реНрдкрд╛рд╡рдзрд┐ рдореЗрдВ рдЬреЛ рдХрд┐рдпрд╛ рд╡рд╣ transformRequest рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╣реИрдХ рдФрд░ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдЙрдЪрд┐рдд рдЖрд▓рд╕реА-рд▓реЛрдбрд┐рдВрдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред

рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рджреЗрдЦреЗрдВред auth() рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЯреЛрдХрди рдореЗрдВ рд▓реЙрдЧ рдЗрди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

let HTTP = axios.create({
  baseURL: baseurl,
  transformRequest: [function (data, headers) {
    headers['Authorization'] = auth()
    return JSON.stringify(data)
  }],
  headers: {
    'Content-Type': 'application/json'
  }
})

рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╣реИред рдЕрдЧрд░ рдЕрдиреБрд░реЛрдз рдХрд╛ рдореВрд▓ рдпреВрдЖрд░рдПрд▓ рдореЗрд░реЗ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рд╣реИ рддреЛ рдореИрдВ рдСрде рд╣реЗрдбрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ (рддреГрддреАрдп рдкрдХреНрд╖реЛрдВ рдХреЛ рдкреНрд░рдорд╛рдг-рдкрддреНрд░ рднреЗрдЬрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП)ред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдкрд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЯреЛрдХрди рдмрджрд▓рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди рд░реАрдлреНрд░реЗрд╢ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк) рддреЛ рдЕрдЧрд▓рд╛ рдЕрдиреБрд░реЛрдз рдирдпрд╛ рдЯреЛрдХрди рдЙрдард╛рддрд╛ рд╣реИред рдореИрдВ рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХреЙрд▓ рд╕рд╛рдЗрдЯ рд╕реЗ рд╣реЗрдбрд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдореИрдВ рдореМрдЬреВрджрд╛ рдореВрд▓реНрдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реВрдВ, рдпрджрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛред

axios.interceptors.request.use(
  config => {
    if (config.baseURL === baseApiAddress && !config.headers.Authorization) {
      const token = getToken();

      if (token) {
        config.headers.Authorization = `Bearer ${token}`;
      }
    }

    return config;
  },
  error => Promise.reject(error)
);

@mattstrayer рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ getToken() рд╡рд┐рдзрд┐ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ рдЯреЛрдХрди рдХреЛ рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рдпрд╛ рдПрд╕рд┐рдВрдХреНрд╕рд╕реНрдЯреЛрд░реЗрдЬ (рд░рд┐рдПрдХреНрдЯ рдиреЗрдЯрд┐рд╡) рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВ? рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реБрдЖред

axios.create({
  baseURL: '<your-api>',
  headers: {
    Authorization: {
      toString () {
        return `Bearer ${localStorage.getItem('token')}`
      }
    }
  }
})

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореЗрд░реА http.js рдлрд╝рд╛рдЗрд▓:

import axios from 'axios';
import {store} from './store';

const http = axios.create ({
  baseURL: process.env.VUE_APP_ROOT_API,
  timeout: 1000,
  headers: {'Content-Type': 'application/json'},
});

http.interceptors.request.use (
  function (config) {
    const token = store.token;
    if (token) config.headers.Authorization = `Bearer ${token}`;
    return config;
  },
  function (error) {
    return Promise.reject (error);
  }
);

export default http;

рдореЗрд░рд╛ рд╕реНрдЯреЛрд░, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЧреЗрдЯ/рд╕реЗрдЯ "рдХреНрд▓рд╛рд╕"

export const store = {
    _username: '',
    _email: '',
    _token: '',

    isLogged () {
      return this.token
    },

    set username (str) {
      this._username = str
      localStorage.setItem('username',str)
    },
    get username () {
      return this._username || localStorage.getItem('username')
    },

    set email (str) {
      this._email = str
      localStorage.setItem('email',str)
    },
    get email () {
      return this._email || localStorage.getItem('email')
    },

    set token (str) {
      this._token = str
      localStorage.setItem('token',str)
    },
    get token () {
      return this._token || localStorage.getItem('token')
    }

  }

рдореЗрд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗрд╡рд╛ "рд╡рд░реНрдЧ":

import http from './http'

export const user = {
  ping: () => http.get('/users/ping'),
  save: (user) => http.post('/users', user)
}

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдореЗрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

import {user} from '@/services'

 user.ping().then( r => {
      console.log(r.data)
    })

btw, process.env.VUE_APP_ROOT_API рдФрд░ @/services Vue рдЪреАрдЬреЗрдВ рд╣реИрдВ...

рдкрд░рд┐рдгрд╛рдо:
image

@danielschmitz рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж !!

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рд╕рдордЭ рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреЛрдИ рдмрдЧ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

рдПрдкреАрдЖрдИ рдХреЙрд▓ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореЗрд░рд╛ рдЯреЛрдХрди рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЛ рдПрд╕рд┐рдВрдХ/рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рдЙрдкрдпреЛрдЧреА рдкрд╛рдпрд╛:

http.interceptors.request.use (
  async (config) => {
    const token = await getToken(); // slightly longer running function than example above
    if (token) config.headers.Authorization = `Bearer ${token}`;
    return config;
  },
  (error) => {
    return Promise.reject (error);
  }
);

рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╣реИред рдЕрдЧрд░ рдЕрдиреБрд░реЛрдз рдХрд╛ рдореВрд▓ рдпреВрдЖрд░рдПрд▓ рдореЗрд░реЗ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рд╣реИ рддреЛ рдореИрдВ рдСрде рд╣реЗрдбрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ (рддреГрддреАрдп рдкрдХреНрд╖реЛрдВ рдХреЛ рдкреНрд░рдорд╛рдг-рдкрддреНрд░ рднреЗрдЬрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП)ред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдкрд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЯреЛрдХрди рдмрджрд▓рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди рд░реАрдлреНрд░реЗрд╢ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк) рддреЛ рдЕрдЧрд▓рд╛ рдЕрдиреБрд░реЛрдз рдирдпрд╛ рдЯреЛрдХрди рдЙрдард╛рддрд╛ рд╣реИред рдореИрдВ рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХреЙрд▓ рд╕рд╛рдЗрдЯ рд╕реЗ рд╣реЗрдбрд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдореИрдВ рдореМрдЬреВрджрд╛ рдореВрд▓реНрдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реВрдВ, рдпрджрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛред

axios.interceptors.request.use(
  config => {
    if (config.baseURL === baseApiAddress && !config.headers.Authorization) {
      const token = getToken();

      if (token) {
        config.headers.Authorization = `Bearer ${token}`;
      }
    }

    return config;
  },
  error => Promise.reject(error)
);

рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд╕рдмрд╕реЗ рд╕реБрдВрджрд░ рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

ghost picture ghost  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Spartano picture Spartano  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

9tor picture 9tor  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

StefH picture StefH  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ildella picture ildella  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ