Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions config/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,9 @@ import {
BrowserActionProvider,
} from '@exteranto/api'

import {
ContextMenusProvider,
} from '@/services/contextMenus'
import { ContextMenusProvider } from '@/services/contextMenus'

import { Awi } from 'awi'
import { env } from '@/helpers'

export default {
Expand Down Expand Up @@ -62,5 +61,13 @@ export default {
savePage: { id: 'save-page-to-ideablob', title: 'Save page to Ideablob' },
},

awi: {
base: () => new Awi()
// This would be so nice.
// .use(async req => req.executor = Container.resolveOptional<Executor>(AbstractExecutor))
.use(async req => req.base = 'https://server-api.com/prod/v1'),
},

},

}
35 changes: 10 additions & 25 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@
"@exteranto/core": "^2.5.0",
"@exteranto/exceptions": "^2.5.0",
"@exteranto/utils": "^2.5.0",
"awi": "^0.0.5"
"awi": "^0.0.6"
},
"devDependencies": {
"@types/chai": "^4.1.4",
"@types/chai-as-promised": "^7.1.0",
"@types/mocha": "^5.2.6",
"@types/node": "^10.12.27",
"@types/node": "^10.12.29",
"@types/sinon": "^5.0.1",
"bulma": "^0.7.4",
"chai": "^4.1.2",
Expand Down
2 changes: 2 additions & 0 deletions src/app/background/events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { Debug } from '@/helpers'
import { Handler } from '@/exceptions/Handler'

import {
SharesPage,
ClearsLocalStorage,
BootsMessageListener,
CustomizesContextMenus,
Expand All @@ -33,6 +34,7 @@ export default (touch: (event: any) => ListenerBag) => {
.addListener(new CustomizesContextMenus)

touch(SavePageMenuItemClickedEvent)
.addListener(new SharesPage)

/**
* Extension lifecycle events.
Expand Down
22 changes: 22 additions & 0 deletions src/app/background/listeners/SharesPage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { Listener } from '@exteranto/core'
import { Blob, Blobs } from '@/resources/Blobs'
import { ResourceManager } from '@/services/resourceManager'
import { Manager } from '@/services/resourceManager/annotations'
import { SavePageMenuItemClickedEvent } from '../events/SavePageMenuItemClickedEvent'

export class SharesPage implements Listener {

/**
* The context menus API service.
*/
@Manager<Blob>(Blobs)
private manager: ResourceManager<Blob>

/**
* Handle the fired event.
*/
public handle (event: SavePageMenuItemClickedEvent) : void {
this.manager.store({ url: event.page })
}

}
1 change: 1 addition & 0 deletions src/app/background/listeners/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@

export * from './SharesPage'
export * from './ClearsLocalStorage'
export * from './BootsMessageListener'
export * from './CustomizesContextMenus'
21 changes: 21 additions & 0 deletions src/resources/Blobs.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { Resource } from '@/services/resourceManager'

export interface Blob {

/**
* The blob url.
*/
url: string

}

export class Blobs extends Resource<Blob> implements Blob {

/**
* {@inheritdoc}
*/
get url () : string {
return this.data.url
}

}
1 change: 1 addition & 0 deletions src/services/contextMenus/ContextMenus.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { Class } from '@/types'
import { ContextMenuItemClickedEvent } from './events'
import { Autowired, Dispatcher } from '@exteranto/core'
import { ContextMenuItemCreatinonFailedException } from './exceptions'
Expand Down
1 change: 1 addition & 0 deletions src/services/contextMenus/types.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { Class } from '@/types'
import { ItemType } from './ItemType'
import { ContextType } from './ContextType'
import { ContextMenuItemClickedEvent } from './events'
Expand Down
41 changes: 41 additions & 0 deletions src/services/resourceManager/Paginator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { Client } from 'awi'
import { Class } from '@/types'
import { Param } from '@exteranto/core'

export class Paginator<T> {

/**
* Awi instance configurations.
*/
@Param('awi')
private awi: { [key: string]: () => Client }

/**
* The curren page for the paginator.
*/
private page: number = 0

/**
*
* @param resource The resource to paginate over
* @param perpage The count of items to show per page
*/
constructor (private resource: Class<T>, private perpage: number) {
//
}

/**
* A method to retrieve the next page of the resource.
* TODO: total etc
*
* @return The next page of the resource instances
*/
public async next () : Promise<T[]> {
return this.awi.base()
.use(async req => req.query.skip = String(this.page * this.perpage))
.use(async req => req.query.take = String(this.perpage))
.body<T[]>(this.resource.name.toLowerCase())
.then(resources => resources.map(item => new this.resource(item)))
}

}
8 changes: 8 additions & 0 deletions src/services/resourceManager/Resource.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@

export class Resource<T> {

constructor (protected data: T) {
//
}

}
63 changes: 63 additions & 0 deletions src/services/resourceManager/ResourceManager.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { Class } from '@/types'
import { Client, Response } from 'awi'
import { Paginator } from './Paginator'
import { Param } from '@exteranto/core'

export class ResourceManager<T> {

/**
* Awi instance configurations.
*/
@Param('awi')
private awi: { [key: string]: () => Client }

/**
* @param resource The resource to use for this resource manager instance
*/
constructor (private resource: Class<T>) {
//
}

/**
* List the resource.
*
* @return An array of the resource instances
*/
public async list () : Promise<T[]> {
return this.awi.base()
.body<T[]>(this.resource.name.toLowerCase())
.then(resources => resources.map(item => new this.resource(item)))
}

/**
* Store the provided resource.
*
* @param storable The resource to be stored
* @return The response from the server
*/
public async store (storable: T) : Promise<Response> {
return this.awi.base()
.post<Response>(this.resource.name.toLowerCase(), storable)
}

/**
* Retrieve the paginator for the current resource.
*
* @param perpage The count of items per page
* @return The paginator instance linked to the resource
*/
public paginator (perpage: number) : Paginator<T> {
return new Paginator<T>(this.resource, perpage)
}

/**
* Static constructor for the resource manager.
*
* @param resource The resource to use for the new resource manager instance
* @return A new resource manager instance
*/
public static for<T> (resource: Class<T>) {
return new ResourceManager<T>(resource)
}

}
26 changes: 26 additions & 0 deletions src/services/resourceManager/ResourceManagerProvider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { Provider, Script } from '@exteranto/core'

export class ResourceManagerProvider extends Provider {

/**
* {@inheritdoc}
*/
public only () : Script[] {
return [Script.BACKGROUND]
}

/**
* {@inheritdoc}
*/
public boot () : void {
//
}

/**
* {@inheritdoc}
*/
public register () : void {
//
}

}
26 changes: 26 additions & 0 deletions src/services/resourceManager/annotations.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { Class } from '@/types'
import { ResourceManager } from './ResourceManager'

/**
* The @Manager annotation that resolves the resource manager for the provided
* resource class.
*
* @param resource The resource to create the manager for.
*/
export function Manager<T> (resource: Class<T>) : (target: any, property: string) => void {
return (target: any, property: string) : void => {
const key: string = `__manager_${resource.name}`

Object.defineProperty(target, property, {
get () : ResourceManager<T> {
return target[key] === undefined
? target[key] = ResourceManager.for<T>(resource)
: target[key]
},

set (value: ResourceManager<T>) : void {
target[key] = value
},
})
}
}
14 changes: 14 additions & 0 deletions src/services/resourceManager/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@

/**
* Export package annotations.
*/

export * from './annotations'

/**
* Export package services.
*/

export { Resource } from './Resource'
export { Paginator } from './Paginator'
export { ResourceManager } from './ResourceManager'
4 changes: 2 additions & 2 deletions src/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
* Custom constructor types.
*/

declare type Abstract<T> = Function & { prototype: T }
export type Abstract<T> = Function & { prototype: T }

declare interface Class<T> extends Abstract<T> {
export interface Class<T> extends Abstract<T> {
new (...args: any[]) : T
}
Loading