diff options
Diffstat (limited to 'polygerrit-ui/app/models/config/config-model.ts')
-rw-r--r-- | polygerrit-ui/app/models/config/config-model.ts | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/polygerrit-ui/app/models/config/config-model.ts b/polygerrit-ui/app/models/config/config-model.ts new file mode 100644 index 0000000000..2fd8a410d9 --- /dev/null +++ b/polygerrit-ui/app/models/config/config-model.ts @@ -0,0 +1,89 @@ +/** + * @license + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import {ConfigInfo, RepoName, ServerInfo} from '../../types/common'; +import {from, of, Subscription} from 'rxjs'; +import {switchMap} from 'rxjs/operators'; +import {Finalizable} from '../../services/registry'; +import {RestApiService} from '../../services/gr-rest-api/gr-rest-api'; +import {ChangeModel} from '../change/change-model'; +import {select} from '../../utils/observable-util'; +import {Model} from '../model'; +import {define} from '../dependency'; + +export interface ConfigState { + repoConfig?: ConfigInfo; + serverConfig?: ServerInfo; +} + +export const configModelToken = define<ConfigModel>('config-model'); +export class ConfigModel extends Model<ConfigState> implements Finalizable { + public repoConfig$ = select( + this.state$, + configState => configState.repoConfig + ); + + public repoCommentLinks$ = select( + this.repoConfig$, + repoConfig => repoConfig?.commentlinks ?? {} + ); + + public serverConfig$ = select( + this.state$, + configState => configState.serverConfig + ); + + private subscriptions: Subscription[]; + + constructor( + readonly changeModel: ChangeModel, + readonly restApiService: RestApiService + ) { + super({}); + this.subscriptions = [ + from(this.restApiService.getConfig()).subscribe((config?: ServerInfo) => { + this.updateServerConfig(config); + }), + this.changeModel.repo$ + .pipe( + switchMap((repo?: RepoName) => { + if (repo === undefined) return of(undefined); + return from(this.restApiService.getProjectConfig(repo)); + }) + ) + .subscribe((repoConfig?: ConfigInfo) => { + this.updateRepoConfig(repoConfig); + }), + ]; + } + + updateRepoConfig(repoConfig?: ConfigInfo) { + const current = this.subject$.getValue(); + this.subject$.next({...current, repoConfig}); + } + + updateServerConfig(serverConfig?: ServerInfo) { + const current = this.subject$.getValue(); + this.subject$.next({...current, serverConfig}); + } + + finalize() { + for (const s of this.subscriptions) { + s.unsubscribe(); + } + this.subscriptions = []; + } +} |