As mentioned in the title, I put together a process to load data into a component, as well as upload new images to Firebase and return the updated data. I’m wondering if my process is effective / good practice. Any feedback is welcome, thank you.
My component which displays images
import { Component } from '@angular/core';
import { NavController, NavParams, Slides } from 'ionic-angular';
import { CameraService } from '../../providers/camera-service';
import { FirebaseService, SingleImage } from '../../providers/firebase-service';
@Component({
selector: 'page-image-page',
templateUrl: 'image-page.html',
})
export class ImagePage {
publicImages: SingleImage[];
constructor(private firebaseService: FirebaseService, private cameraService: CameraService, public navCtrl: NavController, public navParams: NavParams) {
}
ionViewDidLoad() {
this.publicImages = this.firebaseService.returnedPublicImages();
}
uploadNewImage() {
this.cameraService.getCamera();
this.publicImages = this.firebaseService.returnedPublicImages();
}
}
My two services, One to get the image from phone’s photo library, another to interact with Firebase.
- Uploading from photo library
import { Injectable } from '@angular/core';
import 'rxjs/add/operator/map';
import { Camera, CameraOptions } from '@ionic-native/camera';
import { FirebaseService } from '../providers/firebase-service';
@Injectable()
export class CameraService {
constructor(private firebaseService: FirebaseService, private camera: Camera ) {
}
getCamera() {
let options = {
sourceType: this.camera.PictureSourceType.PHOTOLIBRARY,
destinationType: this.camera.DestinationType.DATA_URL,
encodingType: this.camera.EncodingType.JPEG,
targetHeight: 1000,
targetWidth: 1000
}
this.camera.getPicture(options).then((imageData) => {
this.firebaseService.uploadImage(imageData)
})
}
}
- Service to interact with Firebase
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import 'rxjs/add/operator/map';
import * as firebase from 'firebase'
import { AngularFireDatabase, FirebaseListObservable } from 'angularfire2/database';
export interface SingleImage {
title: string,
value: string
}
@Injectable()
export class FirebaseService {
images: FirebaseListObservable<SingleImage[]>;
publicImages: SingleImage[];
constructor(private af: AngularFireDatabase, public http: Http) {
}
uploadImage(imageData) {
let fbStorage = firebase.storage();
let fbDatabase = firebase.database();
let imagesList = fbStorage.ref('Images/');
let imagesData = fbDatabase.ref('Images');
let pic = {
title: "",
value: imageData
}
let pushed = imagesData.push();
let keyAndName = pushed.key;
let storageChild = imagesList.child(keyAndName);
storageChild.putString(imageData, 'base64', {contentType: 'image/jpeg'}).then((savedPicture) => {
let urlVal = savedPicture.downloadURL;
let picTitle = pic.title;
pushed.set({
title: picTitle,
value: urlVal
})
}).catch(err => alert('after putstring: ' + err))
}
returnedPublicImages() {
this.publicImages = [];
let returnMe = firebase.database().ref('Images');
returnMe.orderByKey().on("child_added", (snapshot) => {
this.publicImages.push(snapshot.val());
})
return this.publicImages
}
}