src/components/feed-page-modal/feed-page-modal.tsx
| tag | feed-page-modal | 
| styleUrl | feed-page-modal.css | 
| Properties | 
| Methods | 
| Async cancel | 
| cancel() | 
| 
                                Returns :      {} | 
| componentDidLoad | 
| componentDidLoad() | 
| 
                                Returns :      void | 
| dismiss | 
| dismiss() | 
| 
                                Returns :      void | 
| handleBeerNameValue | ||||
| handleBeerNameValue(event) | ||||
| 
                                    Parameters :
                                     
 
                                Returns :      void | 
| handlePostValue | ||||
| handlePostValue(event) | ||||
| 
                                    Parameters :
                                     
 
                                Returns :      void | 
| handleRatingValue | ||||
| handleRatingValue(event) | ||||
| Decorators : 
                                @Listen('ionChange') | ||||
| 
                                    Parameters :
                                     
 
                                Returns :      void | 
| render | 
| render() | 
| 
                                Returns :      any | 
| Async submit | 
| submit() | 
| 
                                Returns :      {} | 
| takePicture | 
| takePicture() | 
| 
                                Returns :      void | 
| alertCtrl | 
| alertCtrl:      | 
| Type : HTMLIonAlertControllerElement | 
| Decorators : 
                                @Prop({connect: 'ion-alert-controller'}) | 
| beerNameValue | 
| beerNameValue:      | 
| Type : string | 
| Decorators : 
                                @State() | 
| el | 
| el:      | 
| Type : Element | 
| Decorators : 
                                @Element() | 
| fileToUpload | 
| fileToUpload:      | 
| Type : File | 
| imageRef | 
| imageRef:      | 
| Type : any | 
| imageSrc | 
| imageSrc:      | 
| Type : string | 
| Decorators : 
                                @State() | 
| postValue | 
| postValue:      | 
| Type : string | 
| Decorators : 
                                @State() | 
| ratingValue | 
| ratingValue:      | 
| Type : number | 
| Default value : 0 | 
| Decorators : 
                                @State() | 
| rootRef | 
| rootRef:      | 
| Type : any | 
| storage | 
| storage:      | 
| Type : any | 
import { Component, Element, Listen, Prop, State } from '@stencil/core';
declare var firebase: any;
@Component({
  tag: 'feed-page-modal',
  styleUrl: 'feed-page-modal.css'
})
export class FeedPageModal {
  @State() postValue: string;
  @State() beerNameValue: string;
  @State() ratingValue: number = 0;
  @State() imageSrc: string;
  @Prop({ connect: 'ion-alert-controller' }) alertCtrl: HTMLIonAlertControllerElement;
  @Element() el: Element;
  storage: any;
  rootRef: any;
  imageRef: any;
  fileToUpload: File;
  componentDidLoad() {
    this.storage = firebase.storage();
    this.rootRef = this.storage.ref();
  }
  dismiss() {
    (this.el.closest('ion-modal') as any).dismiss();
  }
  handlePostValue(event) {
    this.postValue = event.target.value;
    console.log(this.postValue);
  }
  handleBeerNameValue(event) {
    this.beerNameValue = event.target.value;
  }
  @Listen('ionChange')
  handleRatingValue(event) {
    console.log('I got an event', event);
    console.log(event.target.localName);
    if (event.target.localName === 'ion-range') {
      console.log(event.detail.value);
      this.ratingValue = event.detail.value;
    }
  }
  takePicture() {
    console.log('take picture');
    const input = document.createElement('input');
    input.type = 'file';
    input.name = 'image';
    input.accept = 'image/*';
    input.setAttribute('capture', 'camera');
    input.addEventListener('change', (ev: Event) => {
      console.log('changed', ev);
      console.log((ev.target as HTMLInputElement).files);
      this.fileToUpload = (ev.target as HTMLInputElement).files[0];
      const reader = new FileReader();
      reader.onloadend = () => {
        this.imageSrc = reader.result;
        console.log(this.imageSrc);
      }
      reader.readAsDataURL(this.fileToUpload);
      this.imageRef = this.rootRef.child(`images/${this.fileToUpload.name}`);
    }, false);
    input.click();
  }
  async submit() {
    if (this.postValue && this.beerNameValue && this.ratingValue) {
      firebase.firestore().collection('feed').add({
        author: firebase.auth().currentUser.email,
        postText: this.postValue,
        title: this.beerNameValue,
        rating: this.ratingValue,
        image: this.imageRef ? this.imageRef.fullPath : null
      });
      if (this.imageRef) {
        await this.imageRef.put(this.fileToUpload);
      }
      this.dismiss();
    } else {
      const alert = await this.alertCtrl.create({
        header: 'Cant Submit',
        message: 'You must enter a post, title and rating to submit. Would you like to discard this post?',
        buttons: [
          {
            text: 'Cancel',
            role: 'cancel',
            cssClass: 'secondary',
            handler: () => {
              console.log('Confirm Cancel: blah');
            }
          }, {
            text: 'Yes',
            cssClass: 'danger',
            handler: () => {
              this.dismiss()
            }
          }
        ]
      });
      return await alert.present();
    }
  }
  async cancel() {
    const alert = await this.alertCtrl.create({
      header: 'Discard Post?',
      buttons: [
        {
          text: 'Cancel',
          role: 'cancel',
          cssClass: 'secondary',
          handler: () => {
            console.log('Confirm Cancel: blah');
          }
        }, {
          text: 'Yes',
          cssClass: 'danger',
          handler: () => {
            this.dismiss();
          }
        }
      ]
    });
    return await alert.present();
  }
  render() {
    return (
      <ion-page>
        <ion-header>
          <ion-toolbar color='dark'>
            <ion-title>New Post</ion-title>
            <ion-buttons slot="end">
              <ion-button onClick={() => this.cancel()}>Cancel</ion-button>
              <ion-button onClick={() => this.submit()}>Post</ion-button>
            </ion-buttons>
          </ion-toolbar>
        </ion-header>
        <ion-content padding class="outer-content">
          <ion-item>
            <ion-label position='floating'>Beer Name</ion-label>
            <ion-input value={this.beerNameValue} onInput={(event) => { this.handleBeerNameValue(event) }} required></ion-input>
          </ion-item>
          <ion-item>
            <ion-label position='floating'>New Post</ion-label>
            <ion-textarea value={this.postValue} onInput={(event) => { this.handlePostValue(event) }} required></ion-textarea>
          </ion-item>
          <h3>Rating</h3>
          <ion-item>
            <ion-range color='primary' min={0} max={5} snaps={true}></ion-range>
          </ion-item>
          <div id='modalButtonBlock'>
            <ion-button onClick={() => this.takePicture()} expand='block' color='primary'>Add Picture</ion-button>
          </div>
          {this.imageSrc ? <img src={this.imageSrc} alt='Image to upload'></img> : null}
        </ion-content>
      </ion-page>
    );
  }
}