diff --git a/app/.docker/docker-insight.dockerfile b/app/.docker/docker-insight.dockerfile new file mode 100644 index 000000000..59d475f79 --- /dev/null +++ b/app/.docker/docker-insight.dockerfile @@ -0,0 +1,10 @@ +FROM node:8.11.1 +MAINTAINER SonicWizard +COPY . /var/www +#WORKDIR /var/www + +COPY ./.docker/scripts /scripts +RUN chmod +rx /scripts/replace.sh + +EXPOSE 8100 +ENTRYPOINT ["/scripts/replace.sh"] diff --git a/app/.docker/env/btc.production.env-example b/app/.docker/env/btc.production.env-example new file mode 100644 index 000000000..32a22c6dc --- /dev/null +++ b/app/.docker/env/btc.production.env-example @@ -0,0 +1,5 @@ +RUN_DIR=/var/www +DEFAULT_CURRENCY=BTC +API_PREFIX=/api +IONIC_PATH=/api +IONIC_PROXY_URL=https://insight.bitpay.com/api diff --git a/app/.docker/scripts/replace.sh b/app/.docker/scripts/replace.sh new file mode 100755 index 000000000..f6b69c65d --- /dev/null +++ b/app/.docker/scripts/replace.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +echo "current directory is $PWD" +echo "run directory is ${RUN_DIR}" +echo "running in..." +cd ${RUN_DIR} +pwd +echo "copying ionic.config.json template..." +cp .docker/templates/ionic.config.json . +npm install +npm rebuild node-sass +npm install -g replace +replace '%DEFAULT_CURRENCY%' ${DEFAULT_CURRENCY} src/providers/currency/currency.ts +replace '%API_PREFIX%' ${API_PREFIX} src/providers/api/api.ts +replace '%IONIC_PATH%' ${IONIC_PATH} ionic.config.json +replace '%IONIC_PROXY_URL%' ${IONIC_PROXY_URL} ionic.config.json +npm start diff --git a/app/.docker/templates/ionic.config.json b/app/.docker/templates/ionic.config.json new file mode 100644 index 000000000..72e75e29d --- /dev/null +++ b/app/.docker/templates/ionic.config.json @@ -0,0 +1,14 @@ +{ + "name": "insight", + "app_id": "", + "type": "ionic-angular", + "integrations": { + "cordova": {} + }, + "proxies": [ + { + "path": "%IONIC_PATH%", + "proxyUrl": "%IONIC_PROXY_URL%" + } + ] +} diff --git a/app/.gitignore b/app/.gitignore index 7e2a5fe2a..67d0f9620 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -38,3 +38,6 @@ $RECYCLE.BIN/ .DS_Store Thumbs.db UserInterfaceState.xcuserstate + +# .docker env +.docker/env/*.env diff --git a/app/docker-compose.yml b/app/docker-compose.yml new file mode 100644 index 000000000..5dc9caa07 --- /dev/null +++ b/app/docker-compose.yml @@ -0,0 +1,30 @@ +version: '2' + +services: + insight-ui-btc: + container_name: insight-ui-btc-${ENV} + build: + context: . + dockerfile: .docker/docker-insight.dockerfile + ports: + - "4447:8100" + env_file: + - ./.docker/env/btc.${ENV}.env + networks: + - insight-network + + insight-ui-bch: + container_name: insight-ui-bch-${ENV} + build: + context: . + dockerfile: .docker/docker-insight.dockerfile + ports: + - "4448:8100" + env_file: + - ./.docker/env/bch.${ENV}.env + networks: + - insight-network + +networks: + insight-network: + driver: bridge diff --git a/app/ionic.config.json b/app/ionic.config.json index b8b1ec48d..7c3895ef6 100644 --- a/app/ionic.config.json +++ b/app/ionic.config.json @@ -8,7 +8,7 @@ "proxies": [ { "path": "/api", - "proxyUrl": "https://bch-insight.bitpay.com/api" + "proxyUrl": "https://insight.bitpay.com/api" } ] } diff --git a/app/package-lock.json b/app/package-lock.json index 6e1876176..c15cef79c 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -12315,7 +12315,7 @@ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "debug": { @@ -12333,9 +12333,9 @@ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "dev": true, "requires": { - "asynckit": "0.4.0", + "asynckit": "^0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.16" + "mime-types": "^2.1.12" } }, "isarray": { diff --git a/app/src/app/app.component.ts b/app/src/app/app.component.ts index 8fae2869e..23e2f2408 100644 --- a/app/src/app/app.component.ts +++ b/app/src/app/app.component.ts @@ -2,6 +2,7 @@ import { Component, ViewChild } from '@angular/core'; import { Platform, MenuController, Nav } from 'ionic-angular'; import { StatusBar } from '@ionic-native/status-bar'; import { SplashScreen } from '@ionic-native/splash-screen'; +import { CurrencyProvider } from '../providers/currency/currency'; import { HomePage } from '../pages'; @@ -24,6 +25,7 @@ export class InsightApp { platform: Platform, menu: MenuController, splash: SplashScreen, + public currency: CurrencyProvider, status: StatusBar ) { this.menu = menu; @@ -39,8 +41,6 @@ export class InsightApp { { title: 'Home', component: HomePage }, { title: 'Blocks', component: 'blocks' }, { title: 'Broadcast Transaction', component: 'BroadcastTxPage' } - // { title: 'Verify Signed Message', component: VerifyMessagePage }, - // { title: 'Node Status', component: NodeStatusPage } ]; } @@ -57,6 +57,8 @@ export class InsightApp { // close the menu when clicking a link from the menu this.menu.close(); // navigate to the new page if it is not the current page - this.nav.setRoot(page.component); + this.nav.setRoot(page.component, { + 'selectedCurrency': this.currency.selectedCurrency + }); } } diff --git a/app/src/app/app.module.ts b/app/src/app/app.module.ts index f3b205084..7191e7725 100644 --- a/app/src/app/app.module.ts +++ b/app/src/app/app.module.ts @@ -5,11 +5,12 @@ import { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular'; import { StatusBar } from '@ionic-native/status-bar'; import { SplashScreen } from '@ionic-native/splash-screen'; import { InsightApp } from './app.component'; -import { PagesModule, HomePage, BlocksPage, NodeStatusPage, VerifyMessagePage } from '../pages'; +import { PagesModule, HomePage, BlocksPage } from '../pages'; import { BlocksService, StorageService } from '../services'; import { ApiProvider } from '../providers/api/api'; import { CurrencyProvider } from '../providers/currency/currency'; import { BlocksProvider } from '../providers/blocks/blocks'; +import { DefaultProvider } from '../providers/default/default'; @NgModule({ declarations: [ @@ -25,9 +26,7 @@ import { BlocksProvider } from '../providers/blocks/blocks'; entryComponents: [ InsightApp, HomePage, - BlocksPage, - NodeStatusPage, - VerifyMessagePage + BlocksPage ], providers: [ StatusBar, @@ -37,7 +36,8 @@ import { BlocksProvider } from '../providers/blocks/blocks'; {provide: ErrorHandler, useClass: IonicErrorHandler}, ApiProvider, CurrencyProvider, - BlocksProvider + BlocksProvider, + DefaultProvider ] }) diff --git a/app/src/app/app.spec.ts b/app/src/app/app.spec.ts index e7b865dab..eadde1be2 100644 --- a/app/src/app/app.spec.ts +++ b/app/src/app/app.spec.ts @@ -5,6 +5,10 @@ import { NavMock } from '../mocks'; import { PopoverController, MenuController } from 'ionic-angular'; import { StatusBar } from '@ionic-native/status-bar'; import { SplashScreen } from '@ionic-native/splash-screen'; +import { ApiProvider } from '../providers/api/api'; +import { CurrencyProvider } from '../providers/currency/currency'; +import { DefaultProvider } from '../providers/default/default'; +import { HttpModule } from '@angular/http'; describe('InsightApp', () => { let injector: TestBed; @@ -12,13 +16,19 @@ describe('InsightApp', () => { beforeEach(() => { TestBed.configureTestingModule({ + imports: [ + HttpModule + ], providers: [ PopoverController, InsightApp, Platform, MenuController, SplashScreen, - StatusBar + StatusBar, + ApiProvider, + CurrencyProvider, + DefaultProvider ] }); injector = getTestBed(); diff --git a/app/src/components/head-nav/head-nav.ts b/app/src/components/head-nav/head-nav.ts index dfdf99804..b41315bea 100644 --- a/app/src/components/head-nav/head-nav.ts +++ b/app/src/components/head-nav/head-nav.ts @@ -6,6 +6,7 @@ import { ApiProvider } from '../../providers/api/api'; import { CurrencyProvider } from '../../providers/currency/currency'; import { ActionSheetController } from 'ionic-angular'; import { PopoverController } from 'ionic-angular'; +import { ToastController } from 'ionic-angular'; import { DenominationComponent } from '../denomination/denomination'; /** @@ -24,7 +25,6 @@ export class HeadNavComponent { public loading: boolean; @Input() public title: string; public q: string; - public badQuery: boolean = false; constructor( private navCtrl: NavController, @@ -32,7 +32,8 @@ export class HeadNavComponent { private api: ApiProvider, public currency: CurrencyProvider, public actionSheetCtrl: ActionSheetController, - public popoverCtrl: PopoverController + public popoverCtrl: PopoverController, + public toastCtrl: ToastController ) { } @@ -46,6 +47,7 @@ export class HeadNavComponent { console.log('block', data); let parsedData: any = JSON.parse(data._body); this.navCtrl.push('block-detail', { + 'selectedCurrency': this.currency.selectedCurrency, 'blockHash': parsedData.hash }); }.bind(this), @@ -56,6 +58,7 @@ export class HeadNavComponent { console.log('tx', data); let parsedData: any = JSON.parse(data._body); this.navCtrl.push('transaction', { + 'selectedCurrency': this.currency.selectedCurrency, 'txId': parsedData.txid }); }.bind(this), @@ -66,6 +69,7 @@ export class HeadNavComponent { console.log('addr', data); let parsedData: any = JSON.parse(data._body); this.navCtrl.push('address', { + 'selectedCurrency': this.currency.selectedCurrency, 'addrStr': parsedData.addrStr }); }.bind(this), @@ -73,8 +77,10 @@ export class HeadNavComponent { this.http.get(apiPrefix + 'block-index/' + this.q).subscribe( function (data: any): void { this.resetSearch(); + console.log('height', data); let parsedData: any = JSON.parse(data._body); this.navCtrl.push('block-detail', { + 'selectedCurrency': this.currency.selectedCurrency, 'blockHash': parsedData.blockHash }); }.bind(this), @@ -93,17 +99,17 @@ export class HeadNavComponent { /* tslint:disable:no-unused-variable */ private reportBadQuery(): void { - this.badQuery = true; - console.log('badQuery', this.badQuery); + this.presentToast(); + } - setTimeout( - function (): void { - this.badQuery = false; - console.log('badQuery', this.badQuery); - }.bind(this), - 2000 - ); - }; + private presentToast(): void { + const toast: any = this.toastCtrl.create({ + message: 'No matching records found!', + duration: 3000, + position: 'top' + }); + toast.present(); + } private resetSearch(): void { this.q = ''; diff --git a/app/src/components/latest-blocks/latest-blocks.ts b/app/src/components/latest-blocks/latest-blocks.ts index c38720e18..324ffc3bc 100644 --- a/app/src/components/latest-blocks/latest-blocks.ts +++ b/app/src/components/latest-blocks/latest-blocks.ts @@ -1,6 +1,7 @@ import { Component, NgZone, Input } from '@angular/core'; import { BlocksProvider } from '../../providers/blocks/blocks'; import { NavController } from 'ionic-angular'; +import { CurrencyProvider } from '../../providers/currency/currency'; /** * Generated class for the LatestBlocksComponent component. @@ -21,7 +22,7 @@ export class LatestBlocksComponent { @Input() public showTimeAs: string; private reloadInterval: any; - constructor(private blocksProvider: BlocksProvider, private navCtrl: NavController, ngZone: NgZone) { + constructor(private blocksProvider: BlocksProvider, private navCtrl: NavController, ngZone: NgZone, public currency: CurrencyProvider) { this.loadBlocks(); const seconds: number = 15; ngZone.runOutsideAngular(() => { @@ -51,6 +52,7 @@ export class LatestBlocksComponent { public goToBlock(blockHash: string): void { this.navCtrl.push('block-detail', { + 'selectedCurrency': this.currency.selectedCurrency, 'blockHash': blockHash }); } @@ -62,7 +64,9 @@ export class LatestBlocksComponent { } public goToBlocks(): void { - this.navCtrl.push('blocks'); + this.navCtrl.push('blocks', { + 'selectedCurrency': this.currency.selectedCurrency + }); } private ngOnDestroy(): void { diff --git a/app/src/components/latest-transactions/latest-transactions.ts b/app/src/components/latest-transactions/latest-transactions.ts index 5facbe46e..d93d27496 100644 --- a/app/src/components/latest-transactions/latest-transactions.ts +++ b/app/src/components/latest-transactions/latest-transactions.ts @@ -59,6 +59,7 @@ export class LatestTransactionsComponent { public goToTx(txId: string): void { this.navCtrl.push('transaction', { + 'selectedCurrency': this.currency.selectedCurrency, 'txId': txId }); } diff --git a/app/src/components/transaction/transaction.html b/app/src/components/transaction/transaction.html index 7a678c099..48f38a7dd 100644 --- a/app/src/components/transaction/transaction.html +++ b/app/src/components/transaction/transaction.html @@ -47,10 +47,8 @@

-
-
-

{{ scriptSig }}

-
+
+

{{ item.scriptSig.asm }}

@@ -87,7 +85,7 @@ Locking Script

-

{{vout.scriptPubKey.asm}}

+

{{ vout.scriptPubKey.asm }}

@@ -128,4 +126,4 @@ - \ No newline at end of file + diff --git a/app/src/components/transaction/transaction.ts b/app/src/components/transaction/transaction.ts index 8d5cc19e2..4d1f3473e 100644 --- a/app/src/components/transaction/transaction.ts +++ b/app/src/components/transaction/transaction.ts @@ -33,12 +33,14 @@ export class TransactionComponent { public goToTx(txId: string): void { this.navCtrl.push('transaction', { + 'selectedCurrency': this.currency.selectedCurrency, 'txId': txId }); } public goToAddress(addrStr: string): void { this.navCtrl.push('address', { + 'selectedCurrency': this.currency.selectedCurrency, 'addrStr': addrStr }); } diff --git a/app/src/pages/address/address.ts b/app/src/pages/address/address.ts index 459f4de38..3d920f913 100644 --- a/app/src/pages/address/address.ts +++ b/app/src/pages/address/address.ts @@ -12,7 +12,7 @@ import { CurrencyProvider } from '../../providers/currency/currency'; */ @IonicPage({ name: 'address', - segment: 'address/:addrStr' + segment: ':selectedCurrency/address/:addrStr' }) @Component({ selector: 'page-address', diff --git a/app/src/pages/block-detail/block-detail.ts b/app/src/pages/block-detail/block-detail.ts index 95bdaf82a..af17fba34 100644 --- a/app/src/pages/block-detail/block-detail.ts +++ b/app/src/pages/block-detail/block-detail.ts @@ -12,7 +12,7 @@ import { CurrencyProvider } from '../../providers/currency/currency'; */ @IonicPage({ name: 'block-detail', - segment: 'block/:blockHash' + segment: ':selectedCurrency/block/:blockHash' }) @Component({ selector: 'page-block-detail', @@ -45,14 +45,15 @@ export class BlockDetailPage { public goToPreviousBlock(): void { this.navCtrl.push('block-detail', { + 'selectedCurrency': this.currency.selectedCurrency, 'blockHash': this.block.previousblockhash }); } public goToNextBlock(): void { this.navCtrl.push('block-detail', { + 'selectedCurrency': this.currency.selectedCurrency, 'blockHash': this.block.nextblockhash }); } - } diff --git a/app/src/pages/blocks/blocks.ts b/app/src/pages/blocks/blocks.ts index 757235ad0..8283ea113 100644 --- a/app/src/pages/blocks/blocks.ts +++ b/app/src/pages/blocks/blocks.ts @@ -10,7 +10,7 @@ import { BlocksProvider } from '../../providers/blocks/blocks'; */ @IonicPage({ name: 'blocks', - segment: 'blocks' + segment: ':selectedCurrency/blocks' }) @Component({ selector: 'page-blocks', diff --git a/app/src/pages/broadcast-tx/broadcast-tx.ts b/app/src/pages/broadcast-tx/broadcast-tx.ts index 4d6b4b5ea..4da23431a 100644 --- a/app/src/pages/broadcast-tx/broadcast-tx.ts +++ b/app/src/pages/broadcast-tx/broadcast-tx.ts @@ -5,7 +5,9 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { Http } from '@angular/http'; import { ApiProvider } from '../../providers/api/api'; -@IonicPage() +@IonicPage({ + segment: ':selectedCurrency/broadcast-tx' +}) @Component({ selector: 'page-broadcast-tx', templateUrl: 'broadcast-tx.html' diff --git a/app/src/pages/broadcastTxPage/broadcastTxPage.html b/app/src/pages/broadcastTxPage/broadcastTxPage.html deleted file mode 100644 index 4b60667b6..000000000 --- a/app/src/pages/broadcastTxPage/broadcastTxPage.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - {{title}} - - - - -
-
- - -

This form can be used to broadcast a raw transaction in hex format over the Bitcoin network.

-
- - - Raw transaction data - - - - -

Raw transaction data must be a valid hexadecimal string.

-
- - - - -
-
-
-
\ No newline at end of file diff --git a/app/src/pages/broadcastTxPage/broadcastTxPage.scss b/app/src/pages/broadcastTxPage/broadcastTxPage.scss deleted file mode 100644 index 424e9590e..000000000 --- a/app/src/pages/broadcastTxPage/broadcastTxPage.scss +++ /dev/null @@ -1,3 +0,0 @@ -.broadcastTxPage { - -} diff --git a/app/src/pages/broadcastTxPage/broadcastTxPage.spec.ts b/app/src/pages/broadcastTxPage/broadcastTxPage.spec.ts deleted file mode 100644 index cd1505518..000000000 --- a/app/src/pages/broadcastTxPage/broadcastTxPage.spec.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { ComponentFixture, async } from '@angular/core/testing'; -import { TestUtils } from '../../test'; -import { BroadcastTxPage } from './broadcastTxPage'; - -let fixture: ComponentFixture = null; -let instance: any = null; - -describe('BroadcastTxPage', () => { - - beforeEach(async(() => TestUtils.beforeEachCompiler([BroadcastTxPage]).then(compiled => { - fixture = compiled.fixture; - instance = compiled.instance; - fixture.detectChanges(); - }))); - - afterEach(() => { - fixture.destroy(); - }); - - it('initializes', () => { - expect(instance).toBeTruthy(); - }); - - it('has a send method', () => { - spyOn(instance, 'send'); - instance.send(); - expect(instance.send).toHaveBeenCalled(); - }); -}); diff --git a/app/src/pages/broadcastTxPage/broadcastTxPage.ts b/app/src/pages/broadcastTxPage/broadcastTxPage.ts deleted file mode 100644 index 40563eff5..000000000 --- a/app/src/pages/broadcastTxPage/broadcastTxPage.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Component } from '@angular/core'; -import { NavController } from 'ionic-angular'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; - -@Component({ - templateUrl: './broadcastTxPage.html' -}) - -export class BroadcastTxPage { - - public title: string; - private nav: NavController; - public transaction: string; - public txForm: FormGroup; - - constructor(nav: NavController, public formBuilder: FormBuilder) { - this.nav = nav; - this.title = 'Broadcast Transaction'; - this.txForm = formBuilder.group({ - rawData: ['', Validators.pattern(/^[0-9A-Fa-f]+$/)] - }); - } - - public send(): void { - let postData: any = { - rawtx: this.transaction - }; - - console.log('the postData is', postData); - } -} diff --git a/app/src/pages/index.ts b/app/src/pages/index.ts index d15516e7d..4bf13e4b4 100644 --- a/app/src/pages/index.ts +++ b/app/src/pages/index.ts @@ -1,5 +1,3 @@ -export * from './nodeStatusPage/nodeStatusPage'; -export * from './verifyMessagePage/verifyMessagePage'; export * from './home/home'; export * from './blocks/blocks'; export * from './broadcast-tx/broadcast-tx'; diff --git a/app/src/pages/nodeStatusPage/nodeStatusPage.html b/app/src/pages/nodeStatusPage/nodeStatusPage.html deleted file mode 100644 index 68df7da39..000000000 --- a/app/src/pages/nodeStatusPage/nodeStatusPage.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - {{title}} - - - - -
-

Node Status

-
-
\ No newline at end of file diff --git a/app/src/pages/nodeStatusPage/nodeStatusPage.scss b/app/src/pages/nodeStatusPage/nodeStatusPage.scss deleted file mode 100644 index ea2ee8a8e..000000000 --- a/app/src/pages/nodeStatusPage/nodeStatusPage.scss +++ /dev/null @@ -1,3 +0,0 @@ -.nodeStatusPage { - -} diff --git a/app/src/pages/nodeStatusPage/nodeStatusPage.spec.ts b/app/src/pages/nodeStatusPage/nodeStatusPage.spec.ts deleted file mode 100644 index 385774ad4..000000000 --- a/app/src/pages/nodeStatusPage/nodeStatusPage.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, async } from '@angular/core/testing'; -import { TestUtils } from '../../test'; -import { NodeStatusPage } from './nodeStatusPage'; - -let fixture: ComponentFixture = null; -let instance: any = null; - -describe('NodeStatusPage', () => { - - beforeEach(async(() => TestUtils.beforeEachCompiler([NodeStatusPage]).then(compiled => { - fixture = compiled.fixture; - instance = compiled.instance; - fixture.detectChanges(); - }))); - - afterEach(() => { - fixture.destroy(); - }); - - it('initializes', () => { - expect(instance).toBeTruthy(); - }); -}); diff --git a/app/src/pages/nodeStatusPage/nodeStatusPage.ts b/app/src/pages/nodeStatusPage/nodeStatusPage.ts deleted file mode 100644 index b2e971cea..000000000 --- a/app/src/pages/nodeStatusPage/nodeStatusPage.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Component } from '@angular/core'; -import { NavController } from 'ionic-angular'; - -@Component({ - templateUrl: './nodeStatusPage.html' -}) - -export class NodeStatusPage { - - public title: string; - private nav: NavController; - - constructor(nav: NavController) { - this.nav = nav; - this.title = 'Node Status'; - } -} diff --git a/app/src/pages/pages.module.ts b/app/src/pages/pages.module.ts index 25bc562c4..a01705529 100644 --- a/app/src/pages/pages.module.ts +++ b/app/src/pages/pages.module.ts @@ -7,16 +7,12 @@ import { HeadNavComponentModule } from '../components/head-nav/head-nav.module'; import { LatestTransactionsComponentModule } from '../components/latest-transactions/latest-transactions.module'; import { LatestBlocksComponentModule } from '../components/latest-blocks/latest-blocks.module'; import { - HomePage, - NodeStatusPage, - VerifyMessagePage + HomePage } from './index'; @NgModule({ declarations: [ - HomePage, - NodeStatusPage, - VerifyMessagePage + HomePage ], imports: [ IonicModule, diff --git a/app/src/pages/transaction/transaction.ts b/app/src/pages/transaction/transaction.ts index 0d3eabb94..fa1ebb90d 100644 --- a/app/src/pages/transaction/transaction.ts +++ b/app/src/pages/transaction/transaction.ts @@ -2,6 +2,7 @@ import { Component } from '@angular/core'; import { IonicPage, NavController, NavParams } from 'ionic-angular'; import { Http } from '@angular/http'; import { ApiProvider } from '../../providers/api/api'; +import { CurrencyProvider } from '../../providers/currency/currency'; /** * Generated class for the TransactionPage page. @@ -11,7 +12,7 @@ import { ApiProvider } from '../../providers/api/api'; */ @IonicPage({ name: 'transaction', - segment: 'tx/:txId' + segment: ':selectedCurrency/tx/:txId' }) @Component({ selector: 'page-transaction', @@ -23,7 +24,13 @@ export class TransactionPage { private txId: string; public tx: any = {}; - constructor(public navCtrl: NavController, public navParams: NavParams, private http: Http, private api: ApiProvider) { + constructor( + public navCtrl: NavController, + public navParams: NavParams, + private http: Http, + private api: ApiProvider, + public currency: CurrencyProvider + ) { this.txId = navParams.get('txId'); } @@ -42,6 +49,7 @@ export class TransactionPage { public goToBlock(blockHash: string): void { this.navCtrl.push('block-detail', { + 'selectedCurrency': this.currency.selectedCurrency, 'blockHash': blockHash }); } diff --git a/app/src/pages/verifyMessagePage/verifyMessagePage.html b/app/src/pages/verifyMessagePage/verifyMessagePage.html deleted file mode 100644 index e3d82a9c4..000000000 --- a/app/src/pages/verifyMessagePage/verifyMessagePage.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - {{title}} - - - - -
- - - -

Bitcoin comes with a way of signing arbitrary messages.

- -

This form can be used to verify that a message comes from a specific Bitcoin address.

-
- - - Address - - - - - Signature - - - - - Message - - - - - - -
-
-
\ No newline at end of file diff --git a/app/src/pages/verifyMessagePage/verifyMessagePage.scss b/app/src/pages/verifyMessagePage/verifyMessagePage.scss deleted file mode 100644 index 22f8efba7..000000000 --- a/app/src/pages/verifyMessagePage/verifyMessagePage.scss +++ /dev/null @@ -1,3 +0,0 @@ -.verifyMessagePage { - -} diff --git a/app/src/pages/verifyMessagePage/verifyMessagePage.spec.ts b/app/src/pages/verifyMessagePage/verifyMessagePage.spec.ts deleted file mode 100644 index 7f5fae6e3..000000000 --- a/app/src/pages/verifyMessagePage/verifyMessagePage.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, async } from '@angular/core/testing'; -import { TestUtils } from '../../test'; -import { VerifyMessagePage } from './verifyMessagePage'; - -let fixture: ComponentFixture = null; -let instance: any = null; - -describe('VerifyMessagePage', () => { - - beforeEach(async(() => TestUtils.beforeEachCompiler([VerifyMessagePage]).then(compiled => { - fixture = compiled.fixture; - instance = compiled.instance; - fixture.detectChanges(); - }))); - - afterEach(() => { - fixture.destroy(); - }); - - it('initializes', () => { - expect(instance).toBeTruthy(); - }); -}); diff --git a/app/src/pages/verifyMessagePage/verifyMessagePage.ts b/app/src/pages/verifyMessagePage/verifyMessagePage.ts deleted file mode 100644 index 4e29d90e8..000000000 --- a/app/src/pages/verifyMessagePage/verifyMessagePage.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Component } from '@angular/core'; -import { NavController } from 'ionic-angular'; - -@Component({ - templateUrl: './verifyMessagePage.html' -}) - -export class VerifyMessagePage { - - public title: string; - private nav: NavController; - - constructor(nav: NavController) { - this.nav = nav; - this.title = 'Verify Signed Message'; - } -} diff --git a/app/src/providers/api/api.spec.ts b/app/src/providers/api/api.spec.ts new file mode 100644 index 000000000..a3315df35 --- /dev/null +++ b/app/src/providers/api/api.spec.ts @@ -0,0 +1,31 @@ +/* tslint:disable:no-unused-variable */ +import { TestBed, ComponentFixture, inject } from '@angular/core/testing'; +import { HttpModule } from '@angular/http'; +import { ApiProvider } from '../api/api'; +import { DefaultProvider } from '../default/default'; + +describe('ApiProvider', () => { + let api: ApiProvider; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ + HttpModule + ], + providers: [ + ApiProvider, + DefaultProvider + ] + }); + }); + + beforeEach(inject([ApiProvider], provider => { + api = provider; + })); + + it('initialises', () => { + expect(api).not.toBeNull(); + expect(api.apiPrefix).toBe('/api/'); + }); + +}); diff --git a/app/src/providers/api/api.ts b/app/src/providers/api/api.ts index a76ccd6e7..267d24257 100644 --- a/app/src/providers/api/api.ts +++ b/app/src/providers/api/api.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; import { Http } from '@angular/http'; import 'rxjs/add/operator/map'; +import { DefaultProvider } from '../../providers/default/default'; /* Generated class for the ApiProvider provider. @@ -13,9 +14,11 @@ export class ApiProvider { public apiPrefix: string; - constructor(public http: Http) { - // TODO Make this an API call - this.apiPrefix = '/api/'; + constructor( + public http: Http, + private defaults: DefaultProvider + ) { + this.apiPrefix = defaults.getDefault('%API_PREFIX%') + '/'; } } diff --git a/app/src/providers/blocks/blocks.spec.ts b/app/src/providers/blocks/blocks.spec.ts index a39ab645d..11d8fe429 100644 --- a/app/src/providers/blocks/blocks.spec.ts +++ b/app/src/providers/blocks/blocks.spec.ts @@ -3,6 +3,7 @@ import { Http, HttpModule, BaseRequestOptions, Response, ResponseOptions } from import { MockBackend } from '@angular/http/testing'; import { BlocksProvider } from './blocks'; import { ApiProvider } from '../api/api'; +import { DefaultProvider } from '../../providers/default/default'; describe('Blocks Provider', () => { beforeEach(async(() => { @@ -12,6 +13,7 @@ describe('Blocks Provider', () => { providers: [ BlocksProvider, ApiProvider, + DefaultProvider, MockBackend, BaseRequestOptions, { diff --git a/app/src/providers/currency/currency.spec.ts b/app/src/providers/currency/currency.spec.ts index 02fa17a59..310138bd1 100644 --- a/app/src/providers/currency/currency.spec.ts +++ b/app/src/providers/currency/currency.spec.ts @@ -3,6 +3,7 @@ import { TestBed, ComponentFixture, inject } from '@angular/core/testing'; import { HttpModule } from '@angular/http'; import { CurrencyProvider } from './currency'; import { ApiProvider } from '../api/api'; +import { DefaultProvider } from '../default/default'; describe('CurrencyProvider', () => { let currency: CurrencyProvider; @@ -14,13 +15,14 @@ describe('CurrencyProvider', () => { ], providers: [ ApiProvider, - CurrencyProvider + CurrencyProvider, + DefaultProvider ] }); }); - beforeEach(inject([CurrencyProvider], _cp => { - currency = _cp; + beforeEach(inject([CurrencyProvider], provider => { + currency = provider; })); it('initialises', () => { diff --git a/app/src/providers/currency/currency.ts b/app/src/providers/currency/currency.ts index 08662767d..125d996d6 100644 --- a/app/src/providers/currency/currency.ts +++ b/app/src/providers/currency/currency.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; import { Http } from '@angular/http'; import { ApiProvider } from '../../providers/api/api'; +import { DefaultProvider } from '../../providers/default/default'; import 'rxjs/add/operator/map'; /* @@ -13,6 +14,7 @@ import 'rxjs/add/operator/map'; export class CurrencyProvider { public defaultCurrency: string; + public selectedCurrency: string; public currencySymbol: string; public factor: number = 1; private bitstamp: number; @@ -20,9 +22,13 @@ export class CurrencyProvider { private loading: boolean; public explorers: any = []; - constructor(public http: Http, private api: ApiProvider) { - // TODO Make this an API call - this.defaultCurrency = 'BTC'; + constructor( + public http: Http, + private api: ApiProvider, + private defaults: DefaultProvider + ) { + this.defaultCurrency = defaults.getDefault('%DEFAULT_CURRENCY%'); + this.selectedCurrency = this.defaultCurrency.toLowerCase(); this.currencySymbol = this.defaultCurrency; let url: string = this.api.apiPrefix + 'explorers'; diff --git a/app/src/providers/default/default.spec.ts b/app/src/providers/default/default.spec.ts new file mode 100644 index 000000000..ccc073a1f --- /dev/null +++ b/app/src/providers/default/default.spec.ts @@ -0,0 +1,29 @@ +/* tslint:disable:no-unused-variable */ +import { TestBed, ComponentFixture, inject } from '@angular/core/testing'; +import { HttpModule } from '@angular/http'; +import { DefaultProvider } from './default'; + +describe('DefaultProvider', () => { + let defaults: DefaultProvider; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ + HttpModule + ], + providers: [ + DefaultProvider + ] + }); + }); + + beforeEach(inject([DefaultProvider], provider => { + defaults = provider; + })); + + it('has defaults', () => { + expect(defaults).not.toBeNull(); + expect(defaults.getDefault('%DEFAULT_CURRENCY%')).toBe('BTC'); + expect(defaults.getDefault('%API_PREFIX%')).toBe('/api'); + }); +}); diff --git a/app/src/providers/default/default.ts b/app/src/providers/default/default.ts new file mode 100644 index 000000000..19a7dc369 --- /dev/null +++ b/app/src/providers/default/default.ts @@ -0,0 +1,27 @@ +import { Injectable } from '@angular/core'; +import { Http } from '@angular/http'; +import 'rxjs/add/operator/map'; + +/* + Generated class for the DefaultProvider provider. + + See https://angular.io/docs/ts/latest/guide/dependency-injection.html + for more info on providers and Angular DI. +*/ +@Injectable() +export class DefaultProvider { + private defaults: { + '%DEFAULT_CURRENCY%': string, + '%API_PREFIX%': string + }= { + '%DEFAULT_CURRENCY%': 'BTC', + '%API_PREFIX%': '/api' + }; + + constructor(public http: Http) { + } + + public getDefault(str: string): string { + return (this.defaults[str] !== undefined) ? this.defaults[str] : str; + } +}