DiscoverPlaces Raport #9 – podgląd zdjęć i filmów

Czas na raport numer 9 odnośnie tworzenia projektu DiscoverPlaces, a w nim tworzenie podglądu zdjęć i filmów, poprawione odświeżanie wiadomości oraz drobne zmiany w backendzie.

Zmiany w backendzie

Po stronie API została zmieniona jedynie kolejność zwracania wiadomości oraz komentarzy, tak aby najnowsze zawsze były u góry. Co zostało zmienione można znaleźć tutaj Commit #1b2a505. Dzięki skonfigurowanemu CI (Travis CI) taka zmiana trwała dosłownie kilka sekund, kwestia dopisania dwóch linijek, utworzenia commita i push do mastera, a reszta wykonała się automatycznie i można było wracać do pracy nad aplikacją mobilną.

Poprawione odświeżanie wiadomości

Wersja z poprzedniego raportu przy odświeżaniu wiadomości zamykała rozwiniętą już listę wiadomości, a to dlatego, że były one po prostu nadpisywane przy ponownym pobieraniu. Teraz dodana została poniższa metoda:

updateMessages (messages) {
    messages.forEach(message => {
      const existingMessage = this.state.messages.find(item => item.id === message.id);
      if (existingMessage) {
        message.showComments = existingMessage.showComments;
      }
    });

    this.setState({
      messages: messages
    });
  }

Ta metoda ma za zadanie sprawdzić przy aktualizacji wiadomości, czy któraś z nich miała otwarte komentarze i jeśli miała to po prostu ten stan jest ponownie ustawiany w nowej kolekcji obiektów.

Podgląd zdjęć i filmów

Zarówno wiadomość jak i komentarz może zawierać zdjęcie lubi film, dlatego też postanowiłem zrobić możliwość „podglądu”, tak aby można je było powiększyć, obejrzeć.

Component odpowiedzialny za podgląd zdjęć:

import React, { Component } from 'react';
import { Modal, View } from 'react-native';
import { Button } from 'react-native-elements';
import FitImage from 'react-native-fit-image';

export default class ImagePreviewModal extends Component
{
  constructor(props) {
    super(props);
    this.state = {
      show: props.show,
      image: props.image,
      onHide: props.onHide
    };
  }

  componentWillReceiveProps(nextProps) {
    this.setState({
      show: nextProps.show,
      image: nextProps.image,
      onHide: nextProps.onHide
    });
  }

  render () {
    return (
      <Modal
        animationType={'slide'}
        transparent={false}
        visible={this.props.show}
        onRequestClose={() => {
          console.log('Image Modal has been closed.');
        }}
      >
       <View style={{margin:0}}>
         <Button
           buttonStyle={{
             position: 'absolute',
             top: 0,
             right: 0,
             zIndex: 9999
           }}
           title="Close"
           icon={{name: 'window-close-o', type: 'font-awesome'}}
           backgroundColor="red"
           onPress={() => this.state.onHide()}
         />
         <FitImage
           resizeMode="contain"
           source={this.state.image}
         />
       </View>
      </Modal>
    );
  }
}

Component odpowiedzialny za wyświetlanie odtwarzacza wideo:

import React, { Component } from 'react';
import { Modal, View } from 'react-native';
import { Button } from 'react-native-elements';
import VideoPlayer from 'react-native-video-player';

export default class VideoPreviewModal extends Component {
  constructor(props) {
    super(props);
    this.state = {
      show: props.show,
      video: props.video,
      onHide: props.onHide
    };
  }

  componentWillReceiveProps(nextProps) {
    this.setState({
      show: nextProps.show,
      video: nextProps.video,
      onHide: nextProps.onHide
    });
  }

  render () {
    return (
      <Modal
        animationType={'slide'}
        transparent={false}
        visible={this.props.show}
        onRequestClose={() => {
          console.log('Modal has been closed.');
        }}
      >
       <View style={{margin:0}}>
         <Button
           buttonStyle={{
             position: 'absolute',
             top: 0,
             right: 0,
             zIndex: 9999
           }}
           title="Close"
           icon={{name: 'window-close-o', type: 'font-awesome'}}
           backgroundColor="red"
           onPress={() => this.state.onHide()}
         />
        <VideoPlayer
          video={this.state.video}
          resizeMode="cover"
        />
       </View>
      </Modal>
    );
  }
}

Cały kod można znaleźć na githubie.

Dodatkowe paczki jakie zostały użyte:

  • react-native-fit-image – ułatwia wstawienie responsywnego obrazka
  • react-native-video – odtwarzanie wideo
  • react-native-video-player – odtwarzacz wideo

Jak to obecnie wygląda?

 

Obecnie wszystkie elementy są wstawione po prostu z react-native-elements, bez przejmowania się jak to wygląda, jedynie ma działać. Dopiero na koniec planuję stworzyć jakiś znośny wygląd.

Podczas nagrywania zauważyłem bug, a mianowicie gdy otworze wideo i później przejdę do podglądu zdjęcia to brakuje przycisku Close.

Dalsze plany

W kolejnych dniach pracował będę nad dodawaniem nowych wiadomości. Do następnego!

 

Udostępnij: