diff --git a/js-framework/src/util/nativeModules.ts b/js-framework/src/util/nativeModules.ts index 81f3851a..7b622b03 100644 --- a/js-framework/src/util/nativeModules.ts +++ b/js-framework/src/util/nativeModules.ts @@ -58,4 +58,92 @@ export function modal(context: BridgeContext) { return context.modal.prompt(arg) as Promise }, } +} +export interface IRequest { + // `url` is the server URL that will be used for the request + url?: string, + // `method` is the request method to be used when making the request + method?: "get" | "post" | "put" | "delete", + // `headers` are custom headers to be sent + headers?: { [index: string]: string } + // `params` are the URL parameters to be sent with the request + // Must be a plain object or a URLSearchParams object + params?: { [index: string]: string } + // `data` is the data to be sent as the request body + // Only applicable for request methods 'PUT', 'POST', and 'PATCH' + data?: object | string + // `timeout` specifies the number of milliseconds before the request times out. + // If the request takes longer than `timeout`, the request will be aborted. + timeout?: number, // default is `0` (no timeout) +} + +export interface IResponse { + // `data` is the response that was provided by the server + data: any, + // `status` is the HTTP status code from the server response + status: number, + // `headers` the headers that the server responded with + // All header names are lower cased + headers?: { [index: string]: string }, +} + +function transformRequest(request: IRequest) { + let url = request.url || "" + if (request.params !== undefined) { + const queryStrings = [] + for (let key in request.params) { + queryStrings.push(`${key}=${encodeURIComponent(request.params[key])}`) + } + request.url = `${request.url}${url.indexOf('?') >= 0 ? '&' : '?'}${queryStrings.join('&')}` + } + return request +} +export function network(context: BridgeContext) { + return { + request: (config: IRequest) => { + return context.network.request(transformRequest(config)) as Promise + }, + get: (url: string, config?: IRequest) => { + let finalConfig = config + if (finalConfig === undefined) { + finalConfig = {} + } + finalConfig.url = url + finalConfig.method = "get" + return context.network.request(transformRequest(finalConfig)) as Promise + }, + post: (url: string, data?: object | string, config?: IRequest) => { + let finalConfig = config + if (finalConfig === undefined) { + finalConfig = {} + } + finalConfig.url = url + finalConfig.method = "post" + if (data !== undefined) { + finalConfig.data = data + } + return context.network.request(transformRequest(finalConfig)) as Promise + }, + put: (url: string, data?: object | string, config?: IRequest) => { + let finalConfig = config + if (finalConfig === undefined) { + finalConfig = {} + } + finalConfig.url = url + finalConfig.method = "put" + if (data !== undefined) { + finalConfig.data = data + } + return context.network.request(transformRequest(finalConfig)) as Promise + }, + delete: (url: string, data?: object | string, config?: IRequest) => { + let finalConfig = config + if (finalConfig === undefined) { + finalConfig = {} + } + finalConfig.url = url + finalConfig.method = "delete" + return context.network.request(transformRequest(finalConfig)) as Promise + }, + } } \ No newline at end of file