add storage provider

This commit is contained in:
Ivan Socolsky 2017-08-07 14:29:34 -03:00
parent 58de171bb7
commit 1dc8b22eaf
No known key found for this signature in database
GPG Key ID: FAECE6A05FAA4F56
11 changed files with 147 additions and 36 deletions

View File

@ -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",

View File

@ -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,

View File

@ -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 { }

View File

@ -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');

View File

@ -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';

View File

@ -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');

View File

@ -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');
});
});

View File

@ -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);
}
})
}
}

View File

@ -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');
});
});
}));
});

View File

@ -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);
// });
};
}

View File

@ -26,5 +26,6 @@
"types": [
"chrome",
"lodash"
"node"
]
}