diff --git a/src/service/index.ts b/src/service/index.ts index 24ab353..8ad9f44 100644 --- a/src/service/index.ts +++ b/src/service/index.ts @@ -1,5 +1,8 @@ import process from 'process'; +/** + * @deprecated use `ServiceState` instead + */ export class RequestState { loading: boolean; success: boolean; @@ -9,6 +12,62 @@ export class RequestState { } } +/** + * Service state machine + * + * @example + * let former = that.state.service; + * that.setState({ + * service: former.trans(true), + * }) + * + */ +export class ServiceState { + private state: 'loading' | 'success' | 'failed'; + + constructor() { + this.state = 'loading'; + } + + /** + * Transist from `loading` to `success` or `failed` + * @param success request succeeded or not + */ + trans(success: boolean) { + if (this.state == 'loading') { + if (success) { + this.state = 'success'; + } else { + this.state = 'failed'; + } + } + } + + /** + * Check if state is `loading`. + * @returns in `loading` state or not. + */ + isLoading(): boolean { + return this.state == 'loading'; + } + + /** + * Check if state is `success`. + * @returns in `success state or not. + */ + isSuccess(): boolean { + return this.state == 'success'; + } + + /** + * Check if state is `failed`. + * @returns in `failed` state or not. + */ + isFailed(): boolean { + return this.state == 'failed'; + } +} + /** * Get URL of backend * @param path Relative path to base url, begins with `/`