blob: 221e55b5e497117543884edb53257890489199d7 [file] [log] [blame]
/**
* @license
* Copyright (C) 2020 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 {Observable} from 'rxjs';
import {distinctUntilChanged, map} from 'rxjs/operators';
import {Finalizable} from '../registry';
import {NumericChangeId, PatchSetNum} from '../../types/common';
import {Model} from '../../models/model';
export enum GerritView {
ADMIN = 'admin',
AGREEMENTS = 'agreements',
CHANGE = 'change',
DASHBOARD = 'dashboard',
DIFF = 'diff',
DOCUMENTATION_SEARCH = 'documentation-search',
EDIT = 'edit',
GROUP = 'group',
PLUGIN_SCREEN = 'plugin-screen',
REPO = 'repo',
ROOT = 'root',
SEARCH = 'search',
SETTINGS = 'settings',
}
export interface RouterState {
view?: GerritView;
changeNum?: NumericChangeId;
patchNum?: PatchSetNum;
}
export class RouterModel extends Model<RouterState> implements Finalizable {
readonly routerView$: Observable<GerritView | undefined>;
readonly routerChangeNum$: Observable<NumericChangeId | undefined>;
readonly routerPatchNum$: Observable<PatchSetNum | undefined>;
constructor() {
super({});
this.routerView$ = this.state$.pipe(
map(state => state.view),
distinctUntilChanged()
);
this.routerChangeNum$ = this.state$.pipe(
map(state => state.changeNum),
distinctUntilChanged()
);
this.routerPatchNum$ = this.state$.pipe(
map(state => state.patchNum),
distinctUntilChanged()
);
}
finalize() {}
// Private but used in tests
setState(state: RouterState) {
this.subject$.next(state);
}
updateState(partial: Partial<RouterState>) {
this.subject$.next({
...this.subject$.getValue(),
...partial,
});
}
}