React-dnd: Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ пСрСтаскивания Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ отобраТаСтся

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 15 сСнт. 2018  Β·  15ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: react-dnd/react-dnd

ΠžΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ
ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΡƒΠΊΡ€Π°ΡˆΠ΅Π½Π½Ρ‹ΠΉ DragSource Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ отобраТаСтся (функция Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° Π½Π΅ вызываСтся)

Π’ΠΎΡΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ
ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚:

import * as React from "react";
import styled from "styled-components";
import {
  DragSource,
  DragSourceConnector,
  DragSourceMonitor,
  ConnectDragSource
} from "react-dnd";

const ImageHolder = styled.div`
  margin: 10px;
  max-width: 200px;
  width: 200px;
  min-height: 100px;
  position: relative;
  background-color: rgba(0, 0, 0, 0.5);
  display: flex;
  align-items: center;
`;

const ImageNameHolder = styled.div`
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  padding: 10px;
  background-color: rgba(0, 0, 0, 0.5);
  font-size: 13px;
`;

interface Props {
  imagePath: string;
  connectDragSource?: ConnectDragSource;
  isDragging?: boolean;
}

@DragSource<Props>(
  "image",
  {
    beginDrag: (props: Props) => props.imagePath
  },
  (connect: DragSourceConnector, monitor: DragSourceMonitor) => ({
    connectDragSource: connect.dragSource(),
    isDragging: monitor.isDragging()
  })
)
export class PhotosBrowserPhoto extends React.Component<Props> {
  render() {
    const { imagePath, connectDragSource } = this.props;
    console.log({ connectDragSource });
    return connectDragSource(
      <div>drag me</div>
    );
  }
}

ОТидаСмоС повСдСниС
ΠŸΠ΅Ρ€Π΅Ρ‚Π°ΡΠΊΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ с Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½Π½Ρ‹ΠΌ Π² консоли drag me text, connectDragSource

ЀактичСскоС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
Π’ΠΎΠΎΠ±Ρ‰Π΅ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ отобраТаСтся, консоль пуста

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

МнС ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ поставщика, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

import HTML5Backend from 'react-dnd-html5-backend'
import { DragDropContextProvider } from "react-dnd";

<DragDropContextProvider backend={HTML5Backend}>
 <App/>
</DragDropContextProvider>

ВсС 15 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’ΠΎ ΠΆΠ΅ самоС происходит ΠΈ со ΠΌΠ½ΠΎΠΉ, хотя я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ синтаксис ES6:

import React, { Component } from "react";
import { DragSource } from "react-dnd";
import PropTypes from "prop-types";

import "./Dictionary.css";

const propTypes = {
  entry: PropTypes.object.isRequired,

  // Injected by React DnD:
  isDragging: PropTypes.bool.isRequired,
  connectDragSource: PropTypes.func.isRequired
};

const TYPES = {
  ROW: "row"
};

/**
 * Implements the drag source contract.
 */
const rowSource = {
  beginDrag(props) {
    console.log(props);
    return {
      entry: props.entry
    };
  }
};

/**
 * Specifies the props to inject into your component.
 */
function collect(connect, monitor) {
  return {
    connectDragSource: connect.dragSource(),
    isDragging: monitor.isDragging()
  };
}

class Row extends Component {
  constructor(props) {
    console.log("here");
    super(props);
    this.state = {
      entry: props.entry
    };
  }

  static getDerivedStateFromProps = (props, state) => {
    return {
      entry: props.entry
    };
  };

  render() {
    const { isDragging, connectDragSource } = this.props;
    const { entry } = this.state;

    console.log("dragging:", isDragging);
    return connectDragSource(
      <div style={{ opacity: isDragging ? 0.5 : 1 }} className="row">
        <div>{entry.string}</div>
        <div>{entry.kMandarin}</div>
        <div>{entry.kDefinition}</div>
      </div>
    );
  }
}

Row.propTypes = propTypes;

export default DragSource(TYPES.ROW, rowSource, collect)(Row);

Б использованиСм:

    "react-dnd-html5-backend": "^5.0.1",
    "react-dom": "^16.5.1",

ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ: ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π»Ρ‹ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΈ консоли
ΠΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ: Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ отобраТаСтся; Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ рСгистрируСтся

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° поставщика Π² ΠΊΠΎΡ€Π΅Π½ΡŒ ΠΌΠΎΠ΅Π³ΠΎ прилоТСния Ρ€Π΅ΡˆΠΈΠ»ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.

Π― Π΄ΡƒΠΌΠ°ΡŽ, ΠΎΠ΄Π½Π°ΠΊΠΎ - Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠΎΠ΄Π° слСдуСт Ρ‡Π΅Ρ‚ΠΊΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½ - я Π΄ΡƒΠΌΠ°Π», Ρ‡Ρ‚ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ.

Π― Π΄ΡƒΠΌΠ°ΡŽ, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ if -запись:
https://github.com/react-dnd/react-dnd/blob/934efc81871f30c6038e2dc52be1504fe38132e7/packages/react-dnd/src/decorateHandler.tsx#L210

ΠŸΠΎΡ…ΠΎΠΆΠ΅, это ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ, которая Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Ρ‹Π΄Π°Π»Π° Π±Ρ‹ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΏΡ€ΠΈ отсутствии контСкста.

МнС ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ поставщика, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

import HTML5Backend from 'react-dnd-html5-backend'
import { DragDropContextProvider } from "react-dnd";

<DragDropContextProvider backend={HTML5Backend}>
 <App/>
</DragDropContextProvider>

ΠΊ свСдСнию: я Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ столкнулся с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΠΏΡ€ΠΈ использовании ΠΏΠΎΡ€Ρ‚Π°Π»ΠΎΠ² ΠΈ исправил Π΅Π΅, Π·Π°ΠΌΠ΅Π½ΠΈΠ² ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ ReactDOM.unstable_renderSubtreeIntoContainer API Π½Π° ReactDOM.createPortal .

ΠŸΠΎΡ‡Π΅ΠΌΡƒ я Π½Π΅ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠ» ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° устранСниС Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΎΠΊ, связанных с Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ΠΎΠΌ, нашСл ΠΎΡ‚Π²Π΅Ρ‚ здСсь, поТалуйста, ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎ ΠΎΡ‚Π½Π΅ΡΠΈΡ‚Π΅ΡΡŒ ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΎΠ±Ρ€Π°Π·Ρ†Ρƒ, спасибо

ΠšΠ°ΠΆΠ΅Ρ‚ΡΡ, присутствуСт ΠΏΡ€ΠΎΡ‚ΠΈΠ² React 16.8.1, ΠΌΠΎΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ создаСтся, Π° Context.Consumer Π²Π½ΡƒΡ‚Ρ€ΠΈ DragSource Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… элСмСнтов.

Π­Ρ‚ΠΎΠ³ΠΎ Π½Π΅Ρ‚ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ "Быстрый старт".

Π­Ρ‚ΠΎ практичСски ΠΏΠ΅Ρ€Π²ΠΎΠ΅ , Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ...

Π’Π° ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° здСсь, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… производствСнных сборках (я убСдился, Ρ‡Ρ‚ΠΎ DragDropContextProvider присутствуСт Π² ΠΌΠΎΠ΅ΠΌ Π΄Π΅Ρ€Π΅Π²Π΅). Π― Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ», Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ использовании инструмСнтов Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ DragDropContextProvider тСряСтся ΠΈ отобраТаСтся ΠΊΠ°ΠΊ Unknown Π² Π΄Π΅Ρ€Π΅Π²Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² (см. Π‘Π½ΠΈΠΌΠΎΠΊ экрана)
Screen Shot 2019-03-14 at 2 31 16 AM

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ с v7.3.2 Π½Π°

  • "react-dnd": "7.1.0",
  • "response-dnd-html5-backend": "7.1.0"

исправляСт это для мСня.

Π― Ρ‚ΠΎΠΆΠ΅ столкнулся с Ρ‚ΠΎΠΉ ΠΆΠ΅ ошибкой.
ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ΡΡ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅, Π½ΠΎ Π½Π΅ Π² производствС.

Π­Ρ‚ΠΎ ΠΌΠΎΠ΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅.

  • "react-dnd" : "7.1.0" 、
  • "react-dnd-html5-backend" : "7.1.0"
const render = () => {
  ReactDOM.render(
    <DragDropContextProvider backend={HTML5Backend}>
      <Provider store={store}>
        <ConnectedRouter history={history}>
          <AppContainer>
            <App />
          </AppContainer>
        </ConnectedRouter>
      </Provider>
    </DragDropContextProvider>,
    document.getElementById('app')
  );
};

γ‚Ήγ‚―γƒͺγƒΌγƒ³γ‚·γƒ§γƒƒγƒˆ 2019-03-22 17 13 46

DragDropContextProvider нСизвСстСн

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π±Ρ‹Π»Π° автоматичСски ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π° ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ°Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² послСднСС врСмя Π½Π΅ Π±Ρ‹Π»ΠΎ активности. Он Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚, Ссли большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ активности. Бпасибо Π·Π° ваш Π²ΠΊΠ»Π°Π΄.

ΠšΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π·Π½Π°Π΅Ρ‚, Π±Ρ‹Π»ΠΎ Π»ΠΈ это Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ автоматичСски Π·Π°ΠΊΡ€Ρ‹Π»ΠΎΡΡŒ?

Как я Ρ€Π΅ΡˆΠΈΠ»
Π’ ΠΌΠΎΠ΅ΠΌ случаС всС Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Π² dev, Π½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ломалось Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΈΠ·-Π·Π° ΠΏΡƒΡ‚ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°

НС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΠΌΠΏΠΎΡ€Ρ‚
import {useDrag} from "react-dnd/lib/index";

Π Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΈΠΌΠΏΠΎΡ€Ρ‚
import {useDrag} from "react-dnd";

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, я Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ знаю, ΠΊΠ°ΠΊ Π²ΠΎΠ·Π½ΠΈΠΊ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠΌΠΏΠΎΡ€Ρ‚.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, я ΠΌΠΎΠ³Ρƒ с ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ DndProvider Π² ΠΊΠΎΡ€Π΅Π½ΡŒ прилоТСния . Π― Π΄Π΅Π»Π°Π» это Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΈΠ·-Π·Π° ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°, Π½ΠΎ послС «исправлСния» ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° я восстановил DndProvider Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² вмСсто ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° прилоТСния (для Π±ΠΎΠ»Π΅Π΅ чистого ΠΊΠΎΠ΄Π°), ΠΈ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ.

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚:

  • "Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ": "^ 16.8.3",
  • "response-dnd": "^ 9.0.1",
  • "response-dnd-html5-backend": "^ 9.0.0",

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π±Ρ‹Π»Π° автоматичСски ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π° ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ°Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² послСднСС врСмя Π½Π΅ Π±Ρ‹Π»ΠΎ активности. Он Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚, Ссли большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ активности. Бпасибо Π·Π° ваш Π²ΠΊΠ»Π°Π΄.

ΠΊΠ°ΠΊΠΎΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅? Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΈΠ· ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π² этой Ρ‚Π΅ΠΌΠ΅ Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ.

"react-dnd": "^ 11.1.3",
"response-dnd-html5-backend": "^ 11.1.3",

всС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° я измСняю ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ состояния, я Π½Π΅ Π²ΠΈΠΆΡƒ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π°, Π½ΠΎ Π²ΠΈΠΆΡƒ измСнСния Π² ΠΆΡƒΡ€Π½Π°Π»Π°Ρ… консоли.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ