DiscoverPlaces Raport #12 – ostatnie poprawki
Czas na ostatni raport na temat tworzenia aplikacji DiscoverPlaces w ramach konkursu Daj się poznać 2017, a w nim dodanie loadera, poprawienie API, tak by zablokować możliwość spamowania oraz ogólne poprawki.
Loader
Z racji iż ładowanie wiadomości, dodawanie komentarza oraz dodawanie wiadomości może potrwać chwilę czasu, dobrze byłoby poinformować użytkownika, że aplikacja coś w tym czasie robi, dlatego postanowiłem dodać loader. W tym celu wykorzystana została paczka react-native-progress. Powstał komponent zaprezentowany poniżej:
import React, { Component } from 'react'; import { View } from 'react-native'; import CircleProgress from 'react-native-progress/Circle'; import { COLORS, STYLES } from './../../config/style'; export default class Loader extends Component { constructor (props) { super(props); this.state = { isLoading: false, isCommentCreating: false }; } componentWillReceiveProps(nextProps) { this.setState({ isLoading: nextProps.navigationParams.hasOwnProperty('isLoading') ? nextProps.navigationParams.isLoading : false, isCommentCreating: nextProps.navigationParams.hasOwnProperty('isCommentCreating') ? nextProps.navigationParams.isCommentCreating : false, }); } render () { return ( <View style={STYLES.loader}> {(this.state.isLoading || this.state.isCommentCreating) && <CircleProgress size={20} indeterminate={true} color={COLORS.blue} /> } </View> ); } }
Jest on załączany obok loga w nagłówku aplikacji.
navigationOptions: ({navigation}) => ({ headerTitle: HEADER, headerRight: (<Loader navigationParams={navigation.state.params}/>) })
Tutaj można dodać, że przy włączonej opcji „debug js remotely” animacja loadera może troszkę się przycinać, dlatego iż pracuje ona pod większym obciążeniem.
Mniejsze poprawki aplikacji mobilnej
Mała refaktoryzacja
Delikatnie poprawiony został kod, głównie w metodach odpowiedzialnych za walidację formularzy, gdyż one były dosyć paskudne.
Wycentrowanie loga
Po dodaniu loadera, logo troszkę uciekało na lewo, także zostało to poprawione.
Dodanie ikony aplikacji
Zmieniona została domyślna ikona aplikacji.
Dodanie release config
O przygotowaniu aplikacji w React Native do wydania przeczytać można tutaj. W skrócie to tworzymy klucz, który będzie służył do podpisywania aplikacji, a następnie zmieniamy config builda, tak aby z tego klucza korzystał.
Poprawienie buga z zamykaniem modala
Poprawiony został bug, w którym przycisk modala nie pojawiał się co uniemożliwiało zamknięcie powiększonego zdjęcia lub wideo. Button co prawda miał dodany zIndex, ale to niestety nie dawało zamierzonego rezultatu. Pomogła natomiast zmiana kolejności elementów tak by przycisk wyświetlał się ostatni.
Dodanie informacji z prośbą o włączenie GPS
Tutaj niestety problem jest taki, że gdy włączymy precyzyjną lokalizację czyli korzystanie z gps i wifi to potrafi czasem cały czas szukać sygnału co skutkuje komunikatem „Request timed out”.
Zmiany w API
Dodanie blokady na 5 sekund dla danego IP
Teraz przy dodaniu wiadomości lub komentarza, zapisywany jest adres IP i blokowana jest możliwość ponownego dodania na pięć sekund. Poniżej przedstawiona została metoda sprawdzająca czy użytkownik z danym IP może dodać komentarz lub wiadomość.
public function isPossibleToAdd(ResourceInterface $resource, string $ip) { return $this->em->createQueryBuilder() ->select('COUNT(r)') ->from(get_class($resource), 'r') ->where('r.ip = :ip') ->andWhere('timestampdiff(SECOND, r.date, :today) < :timeConstraint') ->setParameters([ 'ip' => $ip, 'today' => new \DateTime(), 'timeConstraint' => $this->timeConstraintInSec ]) ->getQuery() ->getSingleScalarResult() == 0; }
Dodanie endpointu zwracającego 1000 ostatnich lokalizacji wiadomości
Endpoint ten wykorzystany będzie do stworzenia mapy ostatnich wiadomości. Tutaj pojawił się problem z adnotacjami dla FOSRestBundle. Otóż dodanie
@View(serializerGroups={"coordinates"})
nie powodowało żadnej reakcji, a cały czas używana była domyślna grupa serializacji. Rozwiązane to zostało poprzez ustawienie grupy w kodzie:
$view->setContext((new Context())->setGroups(['coordinates']));
Problemy z travisem
Do projektu API na githubie skonfigurowane mam CI z użyciem Travisa co opisywałem tutaj. Problem pojawił się taki, że nagle przy robieniu pusha na serwer git wyrzucał, że są tam już jakieś zmiany i najpierw należałoby zrobić pull. Z racji, że nie ma prawa być żadnych zmian na serwerze, a kod ma być 1:1 z tym co w repozytorium na githubie do configu travisa dodałem po prostu push -f.
Kolejnym problemem na jaki się natknąłem przy wprowadzaniu powyższych zmian to, że lokalnie przechodziły mi wszystkie testy, natomiast na travisie nie. Problem polegał na tym, że dodałem sprawdzenie adresu IP przy dodawaniu wiadomości oraz komentarza i o ile lokalnie wszystko było ok, bo wykonywały się tylko testy, to travis chwilę przed odpaleniem testów ładował fixtures, w których dodawane są trzy wiadomości z adresem IP 127.0.0.1, co powodowało nie przejście testu, gdyż czas był zbyt krótki. Rozwiązałem to po prostu zmieniając wstawiany w fixtures adres IP na 0.0.0.0.
Co dalej?
Ten raport jest ostatnim, dwudziestym wpisem konkursowym, lecz pojawi się jeszcze dodatkowo na dniach podsumowanie odnośnie konkursu ze stroną aplikacji oraz linkiem do pobrania.
Subscribe and master unit testing with my FREE eBook (+60 pages)! 🚀
In these times, the benefits of writing unit tests are huge. I think that most of the recently started projects contain unit tests. In enterprise applications with a lot of business logic, unit tests are the most important tests, because they are fast and can us instantly assure that our implementation is correct. However, I often see a problem with good tests in projects, though these tests’ benefits are only huge when you have good unit tests. So in this ebook, I share many tips on what to do to write good unit tests.
Dodaj komentarz