{
+ return Auth.federatedSignIn({
+ 'provider': provider
+ });
+ }
+
+}
\ No newline at end of file
diff --git a/src/app/auth/confirm-code/confirm-code.component.html b/src/app/auth/confirm-code/confirm-code.component.html
new file mode 100644
index 0000000..a364c27
--- /dev/null
+++ b/src/app/auth/confirm-code/confirm-code.component.html
@@ -0,0 +1,12 @@
+
diff --git a/src/app/auth/confirm-code/confirm-code.component.scss b/src/app/auth/confirm-code/confirm-code.component.scss
new file mode 100644
index 0000000..e69de29
diff --git a/src/app/auth/confirm-code/confirm-code.component.spec.ts b/src/app/auth/confirm-code/confirm-code.component.spec.ts
new file mode 100644
index 0000000..f52f788
--- /dev/null
+++ b/src/app/auth/confirm-code/confirm-code.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ConfirmCodeComponent } from './confirm-code.component';
+
+describe('ConfirmCodeComponent', () => {
+ let component: ConfirmCodeComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ ConfirmCodeComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(ConfirmCodeComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/auth/confirm-code/confirm-code.component.ts b/src/app/auth/confirm-code/confirm-code.component.ts
new file mode 100644
index 0000000..7e2da80
--- /dev/null
+++ b/src/app/auth/confirm-code/confirm-code.component.ts
@@ -0,0 +1,60 @@
+import { Component, OnInit } from '@angular/core';
+import { FormGroup, Validators, FormControl } from '@angular/forms';
+import { environment } from 'src/environments/environment';
+import { Router } from '@angular/router';
+import Auth from '@aws-amplify/auth';
+import { NotificationService } from 'src/app/services/notification.service';
+
+@Component({
+ selector: 'app-confirm-code',
+ templateUrl: './confirm-code.component.html',
+ styleUrls: ['./confirm-code.component.scss']
+})
+export class ConfirmCodeComponent implements OnInit {
+
+ email = environment.confirm.email;
+ confirmForm: FormGroup = new FormGroup({
+ email: new FormControl({value: this.email, disabled: true}),
+ code: new FormControl('', [ Validators.required, Validators.min(3) ])
+ });
+
+ get codeInput() { return this.confirmForm.get('code'); }
+
+ constructor( private _router: Router, private _notification: NotificationService ) { }
+
+ ngOnInit() {
+ if (!this.email) {
+ this._router.navigate(['auth/signup']);
+ } else {
+ Auth.resendSignUp(this.email);
+ }
+ }
+
+ sendAgain() {
+ Auth.resendSignUp(this.email)
+ .then(() => this._notification.show('A code has been emailed to you'))
+ .catch(() => this._notification.show('An error occurred'));
+ }
+
+ confirmCode() {
+ Auth.confirmSignUp(this.email, this.codeInput.value)
+ .then((data: any) => {
+ console.log(data);
+ if (data === 'SUCCESS' &&
+ environment.confirm.email &&
+ environment.confirm.password) {
+ Auth.signIn(this.email, environment.confirm.password)
+ .then(() => {
+ this._router.navigate(['']);
+ }).catch((error: any) => {
+ this._router.navigate(['auth/signin']);
+ })
+ }
+ })
+ .catch((error: any) => {
+ console.log(error);
+ this._notification.show(error.message);
+ })
+ }
+
+}
\ No newline at end of file
diff --git a/src/app/auth/country-code-select/country-code-select.component.html b/src/app/auth/country-code-select/country-code-select.component.html
new file mode 100644
index 0000000..205b36f
--- /dev/null
+++ b/src/app/auth/country-code-select/country-code-select.component.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+ {{ code.name }}
+ {{ code.dial_code }}
+
+
+
\ No newline at end of file
diff --git a/src/app/auth/country-code-select/country-code-select.component.scss b/src/app/auth/country-code-select/country-code-select.component.scss
new file mode 100644
index 0000000..be4f704
--- /dev/null
+++ b/src/app/auth/country-code-select/country-code-select.component.scss
@@ -0,0 +1,10 @@
+.country-list {
+ margin-top: 5px;
+ height: 300px;
+ overflow-y: scroll;
+}
+.country-filter {
+ position: sticky;
+ top: 0em;
+ margin-top:0.5em;
+}
diff --git a/src/app/auth/country-code-select/country-code-select.component.spec.ts b/src/app/auth/country-code-select/country-code-select.component.spec.ts
new file mode 100644
index 0000000..c9b907d
--- /dev/null
+++ b/src/app/auth/country-code-select/country-code-select.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { CountryCodeSelectComponent } from './country-code-select.component';
+
+describe('CountryCodeSelectComponent', () => {
+ let component: CountryCodeSelectComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ CountryCodeSelectComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(CountryCodeSelectComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/auth/country-code-select/country-code-select.component.ts b/src/app/auth/country-code-select/country-code-select.component.ts
new file mode 100644
index 0000000..7de0f93
--- /dev/null
+++ b/src/app/auth/country-code-select/country-code-select.component.ts
@@ -0,0 +1,21 @@
+import { Component, OnInit } from '@angular/core';
+import { CountryCode, CountryCodes } from './country-codes';
+import { MatBottomSheetRef } from '@angular/material';
+
+@Component({
+ selector: 'app-country-code-select',
+ templateUrl: './country-code-select.component.html',
+ styleUrls: ['./country-code-select.component.scss']
+})
+export class CountryCodeSelectComponent implements OnInit {
+ countryCodes: Array = CountryCodes;
+ constructor(private bottomSheetRef: MatBottomSheetRef) { }
+
+ ngOnInit() {
+ }
+
+ selectCountry(code: CountryCode) {
+ this.bottomSheetRef.dismiss(code);
+ }
+
+}
diff --git a/src/app/auth/country-code-select/country-codes.spec.ts b/src/app/auth/country-code-select/country-codes.spec.ts
new file mode 100644
index 0000000..a7a4429
--- /dev/null
+++ b/src/app/auth/country-code-select/country-codes.spec.ts
@@ -0,0 +1,7 @@
+import { CountryCodes } from './country-codes';
+
+describe('CountryCodes', () => {
+ it('should create an instance', () => {
+ expect(new CountryCodes()).toBeTruthy();
+ });
+});
diff --git a/src/app/auth/country-code-select/country-codes.ts b/src/app/auth/country-code-select/country-codes.ts
new file mode 100644
index 0000000..02a6d71
--- /dev/null
+++ b/src/app/auth/country-code-select/country-codes.ts
@@ -0,0 +1,1213 @@
+export interface CountryCode {
+ name: string;
+ dial_code: string;
+ code: string;
+}
+
+export const CountryCodes: Array = [
+{
+name: 'Afghanistan',
+dial_code: '+93',
+code: 'AF'
+},
+{
+name: 'Aland Islands',
+dial_code: '+358',
+code: 'AX'
+},
+{
+name: 'Albania',
+dial_code: '+355',
+code: 'AL'
+},
+{
+name: 'Algeria',
+dial_code: '+213',
+code: 'DZ'
+},
+{
+name: 'AmericanSamoa',
+dial_code: '+1 684',
+code: 'AS'
+},
+{
+name: 'Andorra',
+dial_code: '+376',
+code: 'AD'
+},
+{
+name: 'Angola',
+dial_code: '+244',
+code: 'AO'
+},
+{
+name: 'Anguilla',
+dial_code: '+1 264',
+code: 'AI'
+},
+{
+name: 'Antarctica',
+dial_code: '+672',
+code: 'AQ'
+},
+{
+name: 'Antigua and Barbuda',
+dial_code: '+1268',
+code: 'AG'
+},
+{
+name: 'Argentina',
+dial_code: '+54',
+code: 'AR'
+},
+{
+name: 'Armenia',
+dial_code: '+374',
+code: 'AM'
+},
+{
+name: 'Aruba',
+dial_code: '+297',
+code: 'AW'
+},
+{
+name: 'Australia',
+dial_code: '+61',
+code: 'AU'
+},
+{
+name: 'Austria',
+dial_code: '+43',
+code: 'AT'
+},
+{
+name: 'Azerbaijan',
+dial_code: '+994',
+code: 'AZ'
+},
+{
+name: 'Bahamas',
+dial_code: '+1 242',
+code: 'BS'
+},
+{
+name: 'Bahrain',
+dial_code: '+973',
+code: 'BH'
+},
+{
+name: 'Bangladesh',
+dial_code: '+880',
+code: 'BD'
+},
+{
+name: 'Barbados',
+dial_code: '+1 246',
+code: 'BB'
+},
+{
+name: 'Belarus',
+dial_code: '+375',
+code: 'BY'
+},
+{
+name: 'Belgium',
+dial_code: '+32',
+code: 'BE'
+},
+{
+name: 'Belize',
+dial_code: '+501',
+code: 'BZ'
+},
+{
+name: 'Benin',
+dial_code: '+229',
+code: 'BJ'
+},
+{
+name: 'Bermuda',
+dial_code: '+1 441',
+code: 'BM'
+},
+{
+name: 'Bhutan',
+dial_code: '+975',
+code: 'BT'
+},
+{
+name: 'Bolivia, Plurinational State of',
+dial_code: '+591',
+code: 'BO'
+},
+{
+name: 'Bosnia and Herzegovina',
+dial_code: '+387',
+code: 'BA'
+},
+{
+name: 'Botswana',
+dial_code: '+267',
+code: 'BW'
+},
+{
+name: 'Brazil',
+dial_code: '+55',
+code: 'BR'
+},
+{
+name: 'British Indian Ocean Territory',
+dial_code: '+246',
+code: 'IO'
+},
+{
+name: 'Brunei Darussalam',
+dial_code: '+673',
+code: 'BN'
+},
+{
+name: 'Bulgaria',
+dial_code: '+359',
+code: 'BG'
+},
+{
+name: 'Burkina Faso',
+dial_code: '+226',
+code: 'BF'
+},
+{
+name: 'Burundi',
+dial_code: '+257',
+code: 'BI'
+},
+{
+name: 'Cambodia',
+dial_code: '+855',
+code: 'KH'
+},
+{
+name: 'Cameroon',
+dial_code: '+237',
+code: 'CM'
+},
+{
+name: 'Canada',
+dial_code: '+1',
+code: 'CA'
+},
+{
+name: 'Cape Verde',
+dial_code: '+238',
+code: 'CV'
+},
+{
+name: 'Cayman Islands',
+dial_code: '+ 345',
+code: 'KY'
+},
+{
+name: 'Central African Republic',
+dial_code: '+236',
+code: 'CF'
+},
+{
+name: 'Chad',
+dial_code: '+235',
+code: 'TD'
+},
+{
+name: 'Chile',
+dial_code: '+56',
+code: 'CL'
+},
+{
+name: 'China',
+dial_code: '+86',
+code: 'CN'
+},
+{
+name: 'Christmas Island',
+dial_code: '+61',
+code: 'CX'
+},
+{
+name: 'Cocos (Keeling) Islands',
+dial_code: '+61',
+code: 'CC'
+},
+{
+name: 'Colombia',
+dial_code: '+57',
+code: 'CO'
+},
+{
+name: 'Comoros',
+dial_code: '+269',
+code: 'KM'
+},
+{
+name: 'Congo',
+dial_code: '+242',
+code: 'CG'
+},
+{
+name: 'Congo, The Democratic Republic of the Congo',
+dial_code: '+243',
+code: 'CD'
+},
+{
+name: 'Cook Islands',
+dial_code: '+682',
+code: 'CK'
+},
+{
+name: 'Costa Rica',
+dial_code: '+506',
+code: 'CR'
+},
+{
+name: 'Cote d\'Ivoire',
+dial_code: '+225',
+code: 'CI'
+},
+{
+name: 'Croatia',
+dial_code: '+385',
+code: 'HR'
+},
+{
+name: 'Cuba',
+dial_code: '+53',
+code: 'CU'
+},
+{
+name: 'Cyprus',
+dial_code: '+357',
+code: 'CY'
+},
+{
+name: 'Czech Republic',
+dial_code: '+420',
+code: 'CZ'
+},
+{
+name: 'Denmark',
+dial_code: '+45',
+code: 'DK'
+},
+{
+name: 'Djibouti',
+dial_code: '+253',
+code: 'DJ'
+},
+{
+name: 'Dominica',
+dial_code: '+1 767',
+code: 'DM'
+},
+{
+name: 'Dominican Republic',
+dial_code: '+1 849',
+code: 'DO'
+},
+{
+name: 'Ecuador',
+dial_code: '+593',
+code: 'EC'
+},
+{
+name: 'Egypt',
+dial_code: '+20',
+code: 'EG'
+},
+{
+name: 'El Salvador',
+dial_code: '+503',
+code: 'SV'
+},
+{
+name: 'Equatorial Guinea',
+dial_code: '+240',
+code: 'GQ'
+},
+{
+name: 'Eritrea',
+dial_code: '+291',
+code: 'ER'
+},
+{
+name: 'Estonia',
+dial_code: '+372',
+code: 'EE'
+},
+{
+name: 'Ethiopia',
+dial_code: '+251',
+code: 'ET'
+},
+{
+name: 'Falkland Islands (Malvinas)',
+dial_code: '+500',
+code: 'FK'
+},
+{
+name: 'Faroe Islands',
+dial_code: '+298',
+code: 'FO'
+},
+{
+name: 'Fiji',
+dial_code: '+679',
+code: 'FJ'
+},
+{
+name: 'Finland',
+dial_code: '+358',
+code: 'FI'
+},
+{
+name: 'France',
+dial_code: '+33',
+code: 'FR'
+},
+{
+name: 'French Guiana',
+dial_code: '+594',
+code: 'GF'
+},
+{
+name: 'French Polynesia',
+dial_code: '+689',
+code: 'PF'
+},
+{
+name: 'Gabon',
+dial_code: '+241',
+code: 'GA'
+},
+{
+name: 'Gambia',
+dial_code: '+220',
+code: 'GM'
+},
+{
+name: 'Georgia',
+dial_code: '+995',
+code: 'GE'
+},
+{
+name: 'Germany',
+dial_code: '+49',
+code: 'DE'
+},
+{
+name: 'Ghana',
+dial_code: '+233',
+code: 'GH'
+},
+{
+name: 'Gibraltar',
+dial_code: '+350',
+code: 'GI'
+},
+{
+name: 'Greece',
+dial_code: '+30',
+code: 'GR'
+},
+{
+name: 'Greenland',
+dial_code: '+299',
+code: 'GL'
+},
+{
+name: 'Grenada',
+dial_code: '+1 473',
+code: 'GD'
+},
+{
+name: 'Guadeloupe',
+dial_code: '+590',
+code: 'GP'
+},
+{
+name: 'Guam',
+dial_code: '+1 671',
+code: 'GU'
+},
+{
+name: 'Guatemala',
+dial_code: '+502',
+code: 'GT'
+},
+{
+name: 'Guernsey',
+dial_code: '+44',
+code: 'GG'
+},
+{
+name: 'Guinea',
+dial_code: '+224',
+code: 'GN'
+},
+{
+name: 'Guinea-Bissau',
+dial_code: '+245',
+code: 'GW'
+},
+{
+name: 'Guyana',
+dial_code: '+595',
+code: 'GY'
+},
+{
+name: 'Haiti',
+dial_code: '+509',
+code: 'HT'
+},
+{
+name: 'Holy See (Vatican City State)',
+dial_code: '+379',
+code: 'VA'
+},
+{
+name: 'Honduras',
+dial_code: '+504',
+code: 'HN'
+},
+{
+name: 'Hong Kong',
+dial_code: '+852',
+code: 'HK'
+},
+{
+name: 'Hungary',
+dial_code: '+36',
+code: 'HU'
+},
+{
+name: 'Iceland',
+dial_code: '+354',
+code: 'IS'
+},
+{
+name: 'India',
+dial_code: '+91',
+code: 'IN'
+},
+{
+name: 'Indonesia',
+dial_code: '+62',
+code: 'ID'
+},
+{
+name: 'Iran, Islamic Republic of Persian Gulf',
+dial_code: '+98',
+code: 'IR'
+},
+{
+name: 'Iraq',
+dial_code: '+964',
+code: 'IQ'
+},
+{
+name: 'Ireland',
+dial_code: '+353',
+code: 'IE'
+},
+{
+name: 'Isle of Man',
+dial_code: '+44',
+code: 'IM'
+},
+{
+name: 'Israel',
+dial_code: '+972',
+code: 'IL'
+},
+{
+name: 'Italy',
+dial_code: '+39',
+code: 'IT'
+},
+{
+name: 'Jamaica',
+dial_code: '+1 876',
+code: 'JM'
+},
+{
+name: 'Japan',
+dial_code: '+81',
+code: 'JP'
+},
+{
+name: 'Jersey',
+dial_code: '+44',
+code: 'JE'
+},
+{
+name: 'Jordan',
+dial_code: '+962',
+code: 'JO'
+},
+{
+name: 'Kazakhstan',
+dial_code: '+7 7',
+code: 'KZ'
+},
+{
+name: 'Kenya',
+dial_code: '+254',
+code: 'KE'
+},
+{
+name: 'Kiribati',
+dial_code: '+686',
+code: 'KI'
+},
+{
+name: 'Korea, Democratic People\'s Republic of Korea',
+dial_code: '+850',
+code: 'KP'
+},
+{
+name: 'Korea, Republic of South Korea',
+dial_code: '+82',
+code: 'KR'
+},
+{
+name: 'Kuwait',
+dial_code: '+965',
+code: 'KW'
+},
+{
+name: 'Kyrgyzstan',
+dial_code: '+996',
+code: 'KG'
+},
+{
+name: 'Laos',
+dial_code: '+856',
+code: 'LA'
+},
+{
+name: 'Latvia',
+dial_code: '+371',
+code: 'LV'
+},
+{
+name: 'Lebanon',
+dial_code: '+961',
+code: 'LB'
+},
+{
+name: 'Lesotho',
+dial_code: '+266',
+code: 'LS'
+},
+{
+name: 'Liberia',
+dial_code: '+231',
+code: 'LR'
+},
+{
+name: 'Libyan Arab Jamahiriya',
+dial_code: '+218',
+code: 'LY'
+},
+{
+name: 'Liechtenstein',
+dial_code: '+423',
+code: 'LI'
+},
+{
+name: 'Lithuania',
+dial_code: '+370',
+code: 'LT'
+},
+{
+name: 'Luxembourg',
+dial_code: '+352',
+code: 'LU'
+},
+{
+name: 'Macao',
+dial_code: '+853',
+code: 'MO'
+},
+{
+name: 'Macedonia',
+dial_code: '+389',
+code: 'MK'
+},
+{
+name: 'Madagascar',
+dial_code: '+261',
+code: 'MG'
+},
+{
+name: 'Malawi',
+dial_code: '+265',
+code: 'MW'
+},
+{
+name: 'Malaysia',
+dial_code: '+60',
+code: 'MY'
+},
+{
+name: 'Maldives',
+dial_code: '+960',
+code: 'MV'
+},
+{
+name: 'Mali',
+dial_code: '+223',
+code: 'ML'
+},
+{
+name: 'Malta',
+dial_code: '+356',
+code: 'MT'
+},
+{
+name: 'Marshall Islands',
+dial_code: '+692',
+code: 'MH'
+},
+{
+name: 'Martinique',
+dial_code: '+596',
+code: 'MQ'
+},
+{
+name: 'Mauritania',
+dial_code: '+222',
+code: 'MR'
+},
+{
+name: 'Mauritius',
+dial_code: '+230',
+code: 'MU'
+},
+{
+name: 'Mayotte',
+dial_code: '+262',
+code: 'YT'
+},
+{
+name: 'Mexico',
+dial_code: '+52',
+code: 'MX'
+},
+{
+name: 'Micronesia, Federated States of Micronesia',
+dial_code: '+691',
+code: 'FM'
+},
+{
+name: 'Moldova',
+dial_code: '+373',
+code: 'MD'
+},
+{
+name: 'Monaco',
+dial_code: '+377',
+code: 'MC'
+},
+{
+name: 'Mongolia',
+dial_code: '+976',
+code: 'MN'
+},
+{
+name: 'Montenegro',
+dial_code: '+382',
+code: 'ME'
+},
+{
+name: 'Montserrat',
+dial_code: '+1664',
+code: 'MS'
+},
+{
+name: 'Morocco',
+dial_code: '+212',
+code: 'MA'
+},
+{
+name: 'Mozambique',
+dial_code: '+258',
+code: 'MZ'
+},
+{
+name: 'Myanmar',
+dial_code: '+95',
+code: 'MM'
+},
+{
+name: 'Namibia',
+dial_code: '+264',
+code: 'NA'
+},
+{
+name: 'Nauru',
+dial_code: '+674',
+code: 'NR'
+},
+{
+name: 'Nepal',
+dial_code: '+977',
+code: 'NP'
+},
+{
+name: 'Netherlands',
+dial_code: '+31',
+code: 'NL'
+},
+{
+name: 'Netherlands Antilles',
+dial_code: '+599',
+code: 'AN'
+},
+{
+name: 'New Caledonia',
+dial_code: '+687',
+code: 'NC'
+},
+{
+name: 'New Zealand',
+dial_code: '+64',
+code: 'NZ'
+},
+{
+name: 'Nicaragua',
+dial_code: '+505',
+code: 'NI'
+},
+{
+name: 'Niger',
+dial_code: '+227',
+code: 'NE'
+},
+{
+name: 'Nigeria',
+dial_code: '+234',
+code: 'NG'
+},
+{
+name: 'Niue',
+dial_code: '+683',
+code: 'NU'
+},
+{
+name: 'Norfolk Island',
+dial_code: '+672',
+code: 'NF'
+},
+{
+name: 'Northern Mariana Islands',
+dial_code: '+1 670',
+code: 'MP'
+},
+{
+name: 'Norway',
+dial_code: '+47',
+code: 'NO'
+},
+{
+name: 'Oman',
+dial_code: '+968',
+code: 'OM'
+},
+{
+name: 'Pakistan',
+dial_code: '+92',
+code: 'PK'
+},
+{
+name: 'Palau',
+dial_code: '+680',
+code: 'PW'
+},
+{
+name: 'Palestinian Territory, Occupied',
+dial_code: '+970',
+code: 'PS'
+},
+{
+name: 'Panama',
+dial_code: '+507',
+code: 'PA'
+},
+{
+name: 'Papua New Guinea',
+dial_code: '+675',
+code: 'PG'
+},
+{
+name: 'Paraguay',
+dial_code: '+595',
+code: 'PY'
+},
+{
+name: 'Peru',
+dial_code: '+51',
+code: 'PE'
+},
+{
+name: 'Philippines',
+dial_code: '+63',
+code: 'PH'
+},
+{
+name: 'Pitcairn',
+dial_code: '+872',
+code: 'PN'
+},
+{
+name: 'Poland',
+dial_code: '+48',
+code: 'PL'
+},
+{
+name: 'Portugal',
+dial_code: '+351',
+code: 'PT'
+},
+{
+name: 'Puerto Rico',
+dial_code: '+1 939',
+code: 'PR'
+},
+{
+name: 'Qatar',
+dial_code: '+974',
+code: 'QA'
+},
+{
+name: 'Romania',
+dial_code: '+40',
+code: 'RO'
+},
+{
+name: 'Russia',
+dial_code: '+7',
+code: 'RU'
+},
+{
+name: 'Rwanda',
+dial_code: '+250',
+code: 'RW'
+},
+{
+name: 'Reunion',
+dial_code: '+262',
+code: 'RE'
+},
+{
+name: 'Saint Barthelemy',
+dial_code: '+590',
+code: 'BL'
+},
+{
+name: 'Saint Helena, Ascension and Tristan Da Cunha',
+dial_code: '+290',
+code: 'SH'
+},
+{
+name: 'Saint Kitts and Nevis',
+dial_code: '+1 869',
+code: 'KN'
+},
+{
+name: 'Saint Lucia',
+dial_code: '+1 758',
+code: 'LC'
+},
+{
+name: 'Saint Martin',
+dial_code: '+590',
+code: 'MF'
+},
+{
+name: 'Saint Pierre and Miquelon',
+dial_code: '+508',
+code: 'PM'
+},
+{
+name: 'Saint Vincent and the Grenadines',
+dial_code: '+1 784',
+code: 'VC'
+},
+{
+name: 'Samoa',
+dial_code: '+685',
+code: 'WS'
+},
+{
+name: 'San Marino',
+dial_code: '+378',
+code: 'SM'
+},
+{
+name: 'Sao Tome and Principe',
+dial_code: '+239',
+code: 'ST'
+},
+{
+name: 'Saudi Arabia',
+dial_code: '+966',
+code: 'SA'
+},
+{
+name: 'Senegal',
+dial_code: '+221',
+code: 'SN'
+},
+{
+name: 'Serbia',
+dial_code: '+381',
+code: 'RS'
+},
+{
+name: 'Seychelles',
+dial_code: '+248',
+code: 'SC'
+},
+{
+name: 'Sierra Leone',
+dial_code: '+232',
+code: 'SL'
+},
+{
+name: 'Singapore',
+dial_code: '+65',
+code: 'SG'
+},
+{
+name: 'Slovakia',
+dial_code: '+421',
+code: 'SK'
+},
+{
+name: 'Slovenia',
+dial_code: '+386',
+code: 'SI'
+},
+{
+name: 'Solomon Islands',
+dial_code: '+677',
+code: 'SB'
+},
+{
+name: 'Somalia',
+dial_code: '+252',
+code: 'SO'
+},
+{
+name: 'South Africa',
+dial_code: '+27',
+code: 'ZA'
+},
+{
+name: 'South Georgia and the South Sandwich Islands',
+dial_code: '+500',
+code: 'GS'
+},
+{
+name: 'Spain',
+dial_code: '+34',
+code: 'ES'
+},
+{
+name: 'Sri Lanka',
+dial_code: '+94',
+code: 'LK'
+},
+{
+name: 'Sudan',
+dial_code: '+249',
+code: 'SD'
+},
+{
+name: 'Suriname',
+dial_code: '+597',
+code: 'SR'
+},
+{
+name: 'Svalbard and Jan Mayen',
+dial_code: '+47',
+code: 'SJ'
+},
+{
+name: 'Swaziland',
+dial_code: '+268',
+code: 'SZ'
+},
+{
+name: 'Sweden',
+dial_code: '+46',
+code: 'SE'
+},
+{
+name: 'Switzerland',
+dial_code: '+41',
+code: 'CH'
+},
+{
+name: 'Syrian Arab Republic',
+dial_code: '+963',
+code: 'SY'
+},
+{
+name: 'Taiwan',
+dial_code: '+886',
+code: 'TW'
+},
+{
+name: 'Tajikistan',
+dial_code: '+992',
+code: 'TJ'
+},
+{
+name: 'Tanzania, United Republic of Tanzania',
+dial_code: '+255',
+code: 'TZ'
+},
+{
+name: 'Thailand',
+dial_code: '+66',
+code: 'TH'
+},
+{
+name: 'Timor-Leste',
+dial_code: '+670',
+code: 'TL'
+},
+{
+name: 'Togo',
+dial_code: '+228',
+code: 'TG'
+},
+{
+name: 'Tokelau',
+dial_code: '+690',
+code: 'TK'
+},
+{
+name: 'Tonga',
+dial_code: '+676',
+code: 'TO'
+},
+{
+name: 'Trinidad and Tobago',
+dial_code: '+1 868',
+code: 'TT'
+},
+{
+name: 'Tunisia',
+dial_code: '+216',
+code: 'TN'
+},
+{
+name: 'Turkey',
+dial_code: '+90',
+code: 'TR'
+},
+{
+name: 'Turkmenistan',
+dial_code: '+993',
+code: 'TM'
+},
+{
+name: 'Turks and Caicos Islands',
+dial_code: '+1 649',
+code: 'TC'
+},
+{
+name: 'Tuvalu',
+dial_code: '+688',
+code: 'TV'
+},
+{
+name: 'Uganda',
+dial_code: '+256',
+code: 'UG'
+},
+{
+name: 'Ukraine',
+dial_code: '+380',
+code: 'UA'
+},
+{
+name: 'United Arab Emirates',
+dial_code: '+971',
+code: 'AE'
+},
+{
+name: 'United Kingdom',
+dial_code: '+44',
+code: 'GB'
+},
+{
+name: 'United States',
+dial_code: '+1',
+code: 'US'
+},
+{
+name: 'Uruguay',
+dial_code: '+598',
+code: 'UY'
+},
+{
+name: 'Uzbekistan',
+dial_code: '+998',
+code: 'UZ'
+},
+{
+name: 'Vanuatu',
+dial_code: '+678',
+code: 'VU'
+},
+{
+name: 'Venezuela, Bolivarian Republic of Venezuela',
+dial_code: '+58',
+code: 'VE'
+},
+{
+name: 'Vietnam',
+dial_code: '+84',
+code: 'VN'
+},
+{
+name: 'Virgin Islands, British',
+dial_code: '+1 284',
+code: 'VG'
+},
+{
+name: 'Virgin Islands, U.S.',
+dial_code: '+1 340',
+code: 'VI'
+},
+{
+name: 'Wallis and Futuna',
+dial_code: '+681',
+code: 'WF'
+},
+{
+name: 'Yemen',
+dial_code: '+967',
+code: 'YE'
+},
+{
+name: 'Zambia',
+dial_code: '+260',
+code: 'ZM'
+},
+{
+name: 'Zimbabwe',
+dial_code: '+263',
+code: 'ZW'
+}
+];
diff --git a/src/app/auth/country-code-select/filter.pipe.spec.ts b/src/app/auth/country-code-select/filter.pipe.spec.ts
new file mode 100644
index 0000000..1427de3
--- /dev/null
+++ b/src/app/auth/country-code-select/filter.pipe.spec.ts
@@ -0,0 +1,8 @@
+import { FilterPipe } from './filter.pipe';
+
+describe('FilterPipe', () => {
+ it('create an instance', () => {
+ const pipe = new FilterPipe();
+ expect(pipe).toBeTruthy();
+ });
+});
diff --git a/src/app/auth/country-code-select/filter.pipe.ts b/src/app/auth/country-code-select/filter.pipe.ts
new file mode 100644
index 0000000..a74c418
--- /dev/null
+++ b/src/app/auth/country-code-select/filter.pipe.ts
@@ -0,0 +1,19 @@
+import { Pipe, PipeTransform } from '@angular/core';
+import { CountryCode } from './country-codes';
+@Pipe({
+ name: 'filter'
+})
+export class FilterPipe implements PipeTransform {
+ transform(items: CountryCode[], searchText: string): CountryCode[] {
+ if (!items) {
+ return [];
+ }
+ if (!searchText) {
+ return items;
+ }
+ searchText = searchText.toLowerCase();
+ return items.filter( code => {
+ return code.name.toLowerCase().includes(searchText);
+ });
+ }
+}
\ No newline at end of file
diff --git a/src/app/auth/profile/avatar/avatar.component.html b/src/app/auth/profile/avatar/avatar.component.html
new file mode 100644
index 0000000..72b4c4d
--- /dev/null
+++ b/src/app/auth/profile/avatar/avatar.component.html
@@ -0,0 +1,33 @@
+
+
+
+
+
+

+
+
Processing Avatar...
+
+
+
+
+
+
+
+
⚠
+
{{ errorMessage }}
+
×
+
+
+
\ No newline at end of file
diff --git a/src/app/auth/profile/avatar/avatar.component.scss b/src/app/auth/profile/avatar/avatar.component.scss
new file mode 100644
index 0000000..9ca0ec2
--- /dev/null
+++ b/src/app/auth/profile/avatar/avatar.component.scss
@@ -0,0 +1,71 @@
+.app-avatar {
+ width: 95%;
+ border-radius: 6px;
+}
+
+.avatar-remove {
+ position: relative;
+ left: -2em;
+}
+
+.app-avatar-container {
+ width: 100%;
+ margin: 0 auto;
+ padding: 1em;
+}
+
+.app-avatar-upload {
+ height: 212px;
+ border: 2px dotted #979797;
+ border-radius: 4px;
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE0AAABBCAYAAACUyynLAAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AAASASURBVHic7ZtZe7I6FEbfEMIMbe3p//+BfRyKzBk4F2pFvyJDMdiWda2bZD1JSHY2hHNeY2EQxtwN+Iks0kawSBvBIm0Ei7QRmLofyIXEerOHVOpbcahh4HUVgpl0opb1R/tI28Xpt4UBgFQKuzidoEXD0SqtLDmqSkwWr6oEypJPFq8vWqXFSf4jYnahTVpZclR8ulF2ouL6R5s2afccEbpHGxly9uRcoKg4pFSoB5xY67pGXlRj2tcb17FACOn9e0IASg04FgNjwzYRvaRVlcBun4HfYXo9AoyZeA49WFY/eZ3S0qyc7dWum+fIh+/Znb+7uablRfVnhAGHPWSfZaRVmlL1nxJ2YhenUOr2itUqLc2Lzj//RpSqkebFzd+0Sitm2Gk/Cl19b5UmhJy8MT+Frr7fXNP+KqPXtIV2tOfTvsJiJlzHgmWZYCb93NnXdQ0uJKpKIC+qu5xdxzCrNMsyEQUe7JadOCEEFjNhMROB76CsBOIkmzS9NIbZpD1HHnzPGfQf2zLxtoqQZgV2cXanlnWjXRohBK8v4cXoklIhy0sUJYeQEkrVMAwCk1I4NoPn2qD0vPz6ngPTNLHe7lEPyRxMhHZpq+fgU1hd14iTHEn672ZSqRqVEqi4QJzkCHwHUeB+rne2ZWL1HGC93WttP6D57RmFHhybATjk+N838ZfCviJJC7xv4ov7BcdmiELvLm29hTZplBoIjhmEuq6x3u7B+bANNOfynykZeJdTVwfanhaF3ufUipN8sLATnMuLTC0hRPto0yLNMAjc07SUqveUbCNJC0h5nqauzWAY/bO230WLNMc+p6KzvJwkZjMOIQSObU0Stw9apFnsfAs+VfbkOk7zGfdGizRKzx0ScprsyXWc5jPujRZppLHeTJU9uY5Dftuahkb/plqw/4mj8WCgRVrzTWdONI2u4zSfcW+0SOPinJU4nQi+y3Wc5jPujRZpzVoLz+2+V+zDdZyy0nenoWmkSfBj3p1SA4E/LCV0TeA7F0cnLuToE8YYZimAiQIXbOS+ijGKKHAvY+/15ta0SSuKCtVxCp1yakPFMUbx+hJeFLqUFdd+3ag1PbD5SKGOqR1qGHhbRb2nauA7eFtFoMa5yVIpbD/0VwFoTUJKqbDeJvhvdRgthBA8hR4CzxmUuQUO6aXNNtG61TihPXNbcYH3dYzVSwjzKIJSA2HgIrxaq9oQUmGz3X++XHQzy70nFxLv6w+kWTm4ODDNS7yvP2YTBsx4G3WqSkqyAoHnwHWs1iOWUodKyiQrHqJcYvbLYiEkdnGKXZzCNCmYSWEc347qeFn8CKKazC6tiXhAQV/RuqYNqPn9dXT1vVWazqTeo9HV91ZpjjVNNuIn0tX3VmlTZSN+Il19b5XGGB1coPIb8D2n80x8c3P7FLqtZVC/Edsy8RR2n0o6P76o6xof+xxp9r0L3kfH9xw8hW6vT4V6fxvFhUSWHQ7VUslBx59HhBCAGseEgGcP+kJ50AdlCweWQuURLNJGsEgbwSJtBIu0ESzSRrBIG8H/BsMLCwR4M6kAAAAASUVORK5CYII=') center no-repeat #FBFBFB;
+}
+
+.app-avatar-upload-dragover {
+ opacity: 0.5;
+ height: 212px;
+ border: 2px solid #333;
+ border-radius: 4px;
+ background: url('data:image/png;base64,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') center no-repeat #cccccc;
+}
+
+.app-upload-input {
+ margin-top: 0.5em;
+}
+
+.app-upload-button {
+ margin: 0.5em auto !important;
+ width: 100% !important;
+}
+
+.app-avatar-preview {
+ width: auto;
+ max-height: 200px;
+}
+
+.app-image-container {
+ display: inline;
+}
+
+.app-image {
+ width: 30%;
+ margin: 0.2em;
+ border-radius: 6px;
+ border: 2px solid white;
+ cursor: pointer;
+}
+
+@media (max-width: 600px) {
+.app-avatar {
+ width: 100%;
+}
+.app-image {
+ width: 100%;
+}
+.app-avatar-container {
+ width: auto;
+}
+.app-avatar-upload {
+ width: auto;
+}
+}
\ No newline at end of file
diff --git a/src/app/auth/profile/avatar/avatar.component.spec.ts b/src/app/auth/profile/avatar/avatar.component.spec.ts
new file mode 100644
index 0000000..562f867
--- /dev/null
+++ b/src/app/auth/profile/avatar/avatar.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AvatarComponent } from './avatar.component';
+
+describe('AvatarComponent', () => {
+ let component: AvatarComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ AvatarComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(AvatarComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/auth/profile/avatar/avatar.component.ts b/src/app/auth/profile/avatar/avatar.component.ts
new file mode 100644
index 0000000..a2d6679
--- /dev/null
+++ b/src/app/auth/profile/avatar/avatar.component.ts
@@ -0,0 +1,160 @@
+import { Component, Input, Output, EventEmitter } from '@angular/core';
+import Storage from '@aws-amplify/storage';
+import { NotificationService } from 'src/app/services/notification.service';
+import { CompressorService } from 'src/app/services/compressor.service';
+
+@Component({
+ selector: 'app-avatar',
+ templateUrl: './avatar.component.html',
+ styleUrls: ['./avatar.component.scss']
+})
+export class AvatarComponent {
+
+ photoUrl: string;
+ hasPhoto: boolean = false;
+ uploading: boolean = false;
+ s3ImageFile: any = null;
+ s3ImagePath: string = "avatar";
+ errorMessage: string;
+ previewClass = "app-avatar-upload";
+
+ private _storageOptions: any = { 'level': 'private' };
+ private _previewClassIdle = "app-avatar-upload";
+ private _previewClassOver = "app-avatar-upload-dragover"
+
+ @Input()
+ set url(url: string) {
+ this.photoUrl = url;
+ this.hasPhoto = true;
+ }
+
+ @Input()
+ set storageOptions(storageOptions: any){
+ this._storageOptions = Object.assign(this._storageOptions, storageOptions);
+ }
+
+ @Input()
+ set path(path: string){
+ this.s3ImagePath = path;
+ }
+
+ @Input()
+ set data(data: any) {
+ this.photoUrl = data.url;
+ this.s3ImagePath = data.path;
+ this._storageOptions = Object.assign(this._storageOptions, data.storageOptions);
+ this.hasPhoto = true;
+ }
+
+ @Output()
+ picked: EventEmitter = new EventEmitter();
+
+ @Output()
+ loaded: EventEmitter = new EventEmitter();
+
+ @Output()
+ uploaded: EventEmitter