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": {
|
||||
"@angular/common": "4.1.3",
|
||||
"@angular/compiler": "4.1.3",
|
||||
"@angular/compiler-cli": "4.1.3",
|
||||
"@angular/core": "4.1.3",
|
||||
"@angular/forms": "4.1.3",
|
||||
"@angular/http": "4.1.3",
|
||||
|
@ -46,7 +44,7 @@
|
|||
"@types/chrome": "0.0.47",
|
||||
"@types/jasmine": "^2.5.53",
|
||||
"@types/lodash": "^4.14.71",
|
||||
"@types/node": "^8.0.17",
|
||||
"@types/node": "^8.0.19",
|
||||
"codecov": "^2.2.0",
|
||||
"ionic": "3.6.0",
|
||||
"jasmine-core": "^2.6.4",
|
||||
|
|
|
@ -4,7 +4,7 @@ import { StatusBar } from '@ionic-native/status-bar';
|
|||
import { SplashScreen } from '@ionic-native/splash-screen';
|
||||
|
||||
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';
|
||||
|
||||
|
@ -12,7 +12,7 @@ import { TabsPage } from '../pages/tabs/tabs';
|
|||
templateUrl: 'app.html'
|
||||
})
|
||||
export class Copay {
|
||||
rootPage:any = TabsPage;
|
||||
rootPage: any = TabsPage;
|
||||
|
||||
constructor(
|
||||
platform: Platform,
|
||||
|
|
|
@ -19,15 +19,15 @@ import { TermsOfUsePage } from '../pages/terms-of-use/terms-of-use';
|
|||
import { StatusBar } from '@ionic-native/status-bar';
|
||||
import { SplashScreen } from '@ionic-native/splash-screen';
|
||||
|
||||
import { WalletProvider } from '../providers/wallet-provider/wallet-provider';
|
||||
import { StorageProvider } from '../providers/storage-provider/storage-provider';
|
||||
import { AppProvider } from '../providers/app-provider/app-provider';
|
||||
import { WalletProvider } from '../providers/wallet/wallet';
|
||||
import { StorageProvider } from '../providers/storage/storage';
|
||||
import { AppProvider } from '../providers/app/app';
|
||||
import { PlatformProvider } from '../providers/platform/platform';
|
||||
|
||||
// Set different log level depending on environment.
|
||||
const LOG_LEVEL = Level.LOG;
|
||||
if (isDevMode()){
|
||||
const LOG_LEVEL = Level.ERROR;
|
||||
if (isDevMode()) {
|
||||
const LOG_LEVEL = Level.ERROR;
|
||||
}
|
||||
|
||||
@NgModule({
|
||||
|
@ -61,11 +61,11 @@ if (isDevMode()){
|
|||
providers: [
|
||||
StatusBar,
|
||||
SplashScreen,
|
||||
{provide: ErrorHandler, useClass: IonicErrorHandler},
|
||||
{ provide: ErrorHandler, useClass: IonicErrorHandler },
|
||||
WalletProvider,
|
||||
StorageProvider,
|
||||
AppProvider,
|
||||
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 { AppProvider } from '../../providers/app-provider/app-provider';
|
||||
import { AppProvider } from '../../providers/app/app';
|
||||
|
||||
@Component({
|
||||
selector: 'page-about',
|
||||
|
@ -20,7 +20,7 @@ export class AboutPage {
|
|||
public navParams: NavParams,
|
||||
private app: AppProvider,
|
||||
private log: Logger
|
||||
) {}
|
||||
) { }
|
||||
|
||||
ionViewDidLoad() {
|
||||
this.log.log('ionViewDidLoad AboutPage');
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { Component } from '@angular/core';
|
||||
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';
|
||||
|
||||
|
|
|
@ -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 { Logger } from '@nsalaun/ng-logger';
|
||||
import * as _ from 'lodash';
|
||||
|
||||
export class LocalStorage {
|
||||
constructor(private platform: PlatformProvider, private log: Logger) {
|
||||
import { IStorage } from './istorage';
|
||||
|
||||
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', () => {
|
||||
it('should do nothing', () => {
|
||||
expect(true).toBeTruthy();
|
||||
let storage: IStorage = new StorageMock();
|
||||
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 { Platform } from 'ionic-angular';
|
||||
|
||||
import { InjectionToken, Inject } from '@angular/core';
|
||||
import { IStorage, ISTORAGE } from './istorage';
|
||||
|
||||
@Injectable()
|
||||
export class StorageProvider {
|
||||
storage:
|
||||
constructor(public platform: Platform) {
|
||||
constructor( @Inject(ISTORAGE) private storage: IStorage) {
|
||||
}
|
||||
|
||||
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": [
|
||||
"chrome",
|
||||
"lodash"
|
||||
"node"
|
||||
]
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue