mirror of https://github.com/BTCPrivate/copay.git
add storage provider
This commit is contained in:
parent
58de171bb7
commit
1dc8b22eaf
|
@ -14,8 +14,6 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@angular/common": "4.1.3",
|
"@angular/common": "4.1.3",
|
||||||
"@angular/compiler": "4.1.3",
|
|
||||||
"@angular/compiler-cli": "4.1.3",
|
|
||||||
"@angular/core": "4.1.3",
|
"@angular/core": "4.1.3",
|
||||||
"@angular/forms": "4.1.3",
|
"@angular/forms": "4.1.3",
|
||||||
"@angular/http": "4.1.3",
|
"@angular/http": "4.1.3",
|
||||||
|
@ -46,7 +44,7 @@
|
||||||
"@types/chrome": "0.0.47",
|
"@types/chrome": "0.0.47",
|
||||||
"@types/jasmine": "^2.5.53",
|
"@types/jasmine": "^2.5.53",
|
||||||
"@types/lodash": "^4.14.71",
|
"@types/lodash": "^4.14.71",
|
||||||
"@types/node": "^8.0.17",
|
"@types/node": "^8.0.19",
|
||||||
"codecov": "^2.2.0",
|
"codecov": "^2.2.0",
|
||||||
"ionic": "3.6.0",
|
"ionic": "3.6.0",
|
||||||
"jasmine-core": "^2.6.4",
|
"jasmine-core": "^2.6.4",
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { StatusBar } from '@ionic-native/status-bar';
|
||||||
import { SplashScreen } from '@ionic-native/splash-screen';
|
import { SplashScreen } from '@ionic-native/splash-screen';
|
||||||
|
|
||||||
import { Logger } from '@nsalaun/ng-logger';
|
import { Logger } from '@nsalaun/ng-logger';
|
||||||
import { AppProvider } from '../providers/app-provider/app-provider';
|
import { AppProvider } from '../providers/app/app';
|
||||||
|
|
||||||
import { TabsPage } from '../pages/tabs/tabs';
|
import { TabsPage } from '../pages/tabs/tabs';
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ import { TabsPage } from '../pages/tabs/tabs';
|
||||||
templateUrl: 'app.html'
|
templateUrl: 'app.html'
|
||||||
})
|
})
|
||||||
export class Copay {
|
export class Copay {
|
||||||
rootPage:any = TabsPage;
|
rootPage: any = TabsPage;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
platform: Platform,
|
platform: Platform,
|
||||||
|
|
|
@ -19,14 +19,14 @@ import { TermsOfUsePage } from '../pages/terms-of-use/terms-of-use';
|
||||||
import { StatusBar } from '@ionic-native/status-bar';
|
import { StatusBar } from '@ionic-native/status-bar';
|
||||||
import { SplashScreen } from '@ionic-native/splash-screen';
|
import { SplashScreen } from '@ionic-native/splash-screen';
|
||||||
|
|
||||||
import { WalletProvider } from '../providers/wallet-provider/wallet-provider';
|
import { WalletProvider } from '../providers/wallet/wallet';
|
||||||
import { StorageProvider } from '../providers/storage-provider/storage-provider';
|
import { StorageProvider } from '../providers/storage/storage';
|
||||||
import { AppProvider } from '../providers/app-provider/app-provider';
|
import { AppProvider } from '../providers/app/app';
|
||||||
import { PlatformProvider } from '../providers/platform/platform';
|
import { PlatformProvider } from '../providers/platform/platform';
|
||||||
|
|
||||||
// Set different log level depending on environment.
|
// Set different log level depending on environment.
|
||||||
const LOG_LEVEL = Level.LOG;
|
const LOG_LEVEL = Level.LOG;
|
||||||
if (isDevMode()){
|
if (isDevMode()) {
|
||||||
const LOG_LEVEL = Level.ERROR;
|
const LOG_LEVEL = Level.ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,11 +61,11 @@ if (isDevMode()){
|
||||||
providers: [
|
providers: [
|
||||||
StatusBar,
|
StatusBar,
|
||||||
SplashScreen,
|
SplashScreen,
|
||||||
{provide: ErrorHandler, useClass: IonicErrorHandler},
|
{ provide: ErrorHandler, useClass: IonicErrorHandler },
|
||||||
WalletProvider,
|
WalletProvider,
|
||||||
StorageProvider,
|
StorageProvider,
|
||||||
AppProvider,
|
AppProvider,
|
||||||
PlatformProvider
|
PlatformProvider
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
export class AppModule {}
|
export class AppModule { }
|
||||||
|
|
|
@ -5,7 +5,7 @@ import { Logger } from '@nsalaun/ng-logger';
|
||||||
|
|
||||||
import { TermsOfUsePage } from '../terms-of-use/terms-of-use';
|
import { TermsOfUsePage } from '../terms-of-use/terms-of-use';
|
||||||
|
|
||||||
import { AppProvider } from '../../providers/app-provider/app-provider';
|
import { AppProvider } from '../../providers/app/app';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'page-about',
|
selector: 'page-about',
|
||||||
|
@ -20,7 +20,7 @@ export class AboutPage {
|
||||||
public navParams: NavParams,
|
public navParams: NavParams,
|
||||||
private app: AppProvider,
|
private app: AppProvider,
|
||||||
private log: Logger
|
private log: Logger
|
||||||
) {}
|
) { }
|
||||||
|
|
||||||
ionViewDidLoad() {
|
ionViewDidLoad() {
|
||||||
this.log.log('ionViewDidLoad AboutPage');
|
this.log.log('ionViewDidLoad AboutPage');
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Component } from '@angular/core';
|
import { Component } from '@angular/core';
|
||||||
import { NavController, NavParams } from 'ionic-angular';
|
import { NavController, NavParams } from 'ionic-angular';
|
||||||
|
|
||||||
import { AppProvider } from '../../providers/app-provider/app-provider';
|
import { AppProvider } from '../../providers/app/app';
|
||||||
|
|
||||||
import { AboutPage } from '../about/about';
|
import { AboutPage } from '../about/about';
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
import { InjectionToken } from '@angular/core';
|
||||||
|
|
||||||
|
export interface IStorage {
|
||||||
|
get(k: string, cb: (err: Error, v: string) => void);
|
||||||
|
set(k: string, v: any, cb: (err: Error) => void);
|
||||||
|
remove(k: string, cb: (err: Error) => void);
|
||||||
|
create(k: string, v: any, cb: (err: Error) => void);
|
||||||
|
}
|
||||||
|
|
||||||
|
export let ISTORAGE = new InjectionToken<IStorage>('storage');
|
|
@ -1,11 +0,0 @@
|
||||||
import { LocalStorage } from './local-storage';
|
|
||||||
|
|
||||||
describe('Local Storage', () => {
|
|
||||||
it('should do nothing', () => {
|
|
||||||
expect(true).toBeTruthy();
|
|
||||||
});
|
|
||||||
it('should get', () => {
|
|
||||||
var storage = new LocalStorage();
|
|
||||||
expect(storage.get('myKey')).toEqual('myKey');
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,7 +1,53 @@
|
||||||
|
import { Injectable } from '@angular/core';
|
||||||
import { PlatformProvider } from '../platform/platform';
|
import { PlatformProvider } from '../platform/platform';
|
||||||
import { Logger } from '@nsalaun/ng-logger';
|
import { Logger } from '@nsalaun/ng-logger';
|
||||||
|
import * as _ from 'lodash';
|
||||||
|
|
||||||
export class LocalStorage {
|
import { IStorage } from './istorage';
|
||||||
constructor(private platform: PlatformProvider, private log: Logger) {
|
|
||||||
|
export class KeyAlreadyExistsError extends Error {
|
||||||
|
constructor() {
|
||||||
|
super('Key already exists');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class LocalStorage implements IStorage {
|
||||||
|
ls: Storage;
|
||||||
|
constructor(private platform: PlatformProvider, private log: Logger) {
|
||||||
|
this.ls = (typeof window.localStorage !== "undefined") ? window.localStorage : null;
|
||||||
|
if (!this.ls) throw new Error('localstorage not available');
|
||||||
|
}
|
||||||
|
|
||||||
|
get(k: string, cb: (err: Error, v: string) => void) {
|
||||||
|
return cb(null, this.ls.getItem(k));
|
||||||
|
}
|
||||||
|
|
||||||
|
set(k: string, v: any, cb: (err: Error) => void) {
|
||||||
|
if (_.isObject(v)) {
|
||||||
|
v = JSON.stringify(v);
|
||||||
|
}
|
||||||
|
if (v && !_.isString(v)) {
|
||||||
|
v = v.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.ls.setItem(k, v);
|
||||||
|
return cb(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
remove(k: string, cb: (err: Error) => void) {
|
||||||
|
this.ls.removeItem(k);
|
||||||
|
return cb(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
create(k: string, v: any, cb: (err: Error) => void) {
|
||||||
|
this.get(k,
|
||||||
|
function (err, data) {
|
||||||
|
if (data) {
|
||||||
|
return cb(new KeyAlreadyExistsError());
|
||||||
|
} else {
|
||||||
|
return this.set(k, v, cb);
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,52 @@
|
||||||
import { StorageProvider } from './storage-provider';
|
import { TestBed, inject } from '@angular/core/testing';
|
||||||
|
import { StorageProvider } from './storage';
|
||||||
|
import { LocalStorage, KeyAlreadyExistsError } from './local-storage';
|
||||||
|
import { IStorage, ISTORAGE } from './istorage';
|
||||||
|
|
||||||
|
class StorageMock implements IStorage {
|
||||||
|
hash = {};
|
||||||
|
|
||||||
|
get(k: string, cb: (err: Error, v: string) => void) {
|
||||||
|
return cb(null, this.hash[k]);
|
||||||
|
};
|
||||||
|
set(k: string, v: any, cb: (err: Error) => void) {
|
||||||
|
this.hash[k] = v.toString();
|
||||||
|
return cb(null);
|
||||||
|
};
|
||||||
|
remove(k: string, cb: (err: Error) => void) {
|
||||||
|
delete this.hash[k];
|
||||||
|
return cb(null);
|
||||||
|
};
|
||||||
|
create(k: string, v: any, cb: (err: Error) => void) {
|
||||||
|
this.get(k,
|
||||||
|
function (err, data) {
|
||||||
|
if (data) {
|
||||||
|
return cb(new KeyAlreadyExistsError());
|
||||||
|
} else {
|
||||||
|
this.set(k, v, cb);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
describe('Storage Service', () => {
|
describe('Storage Service', () => {
|
||||||
it('should do nothing', () => {
|
let storage: IStorage = new StorageMock();
|
||||||
expect(true).toBeTruthy();
|
beforeEach(() => {
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
providers: [
|
||||||
|
StorageProvider,
|
||||||
|
{ provide: ISTORAGE, useValue: storage },
|
||||||
|
]
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should do nothing', inject([StorageProvider], (service: StorageProvider) => {
|
||||||
|
storage.set('profile', { name: 'john doe' }, (err) => {
|
||||||
|
service.getProfile((err, profile) => {
|
||||||
|
expect(err).toBeNull;
|
||||||
|
console.log(JSON.stringify(profile));
|
||||||
|
expect(profile.name).toEqual('john doe');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}));
|
||||||
});
|
});
|
|
@ -1,10 +1,32 @@
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { Platform } from 'ionic-angular';
|
import { InjectionToken, Inject } from '@angular/core';
|
||||||
|
import { IStorage, ISTORAGE } from './istorage';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class StorageProvider {
|
export class StorageProvider {
|
||||||
storage:
|
constructor( @Inject(ISTORAGE) private storage: IStorage) {
|
||||||
constructor(public platform: Platform) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
storeNewProfile(profile, cb) {
|
||||||
|
this.storage.create('profile', profile.toObj(), cb);
|
||||||
|
};
|
||||||
|
|
||||||
|
storeProfile(profile, cb) {
|
||||||
|
this.storage.set('profile', profile.toObj(), cb);
|
||||||
|
};
|
||||||
|
|
||||||
|
getProfile(cb) {
|
||||||
|
this.storage.get('profile', cb);
|
||||||
|
// decryptOnMobile(str, function (err, str) {
|
||||||
|
// if (err) return cb(err);
|
||||||
|
// var p, err;
|
||||||
|
// try {
|
||||||
|
// p = Profile.fromString(str);
|
||||||
|
// } catch (e) {
|
||||||
|
// $log.debug('Could not read profile:', e);
|
||||||
|
// err = new Error('Could not read profile:' + p);
|
||||||
|
// }
|
||||||
|
// return cb(err, p);
|
||||||
|
// });
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,5 +26,6 @@
|
||||||
"types": [
|
"types": [
|
||||||
"chrome",
|
"chrome",
|
||||||
"lodash"
|
"lodash"
|
||||||
|
"node"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue