Skip to content

Commit 70dde74

Browse files
committed
Splits home overview state by active and inactive branches
1 parent b881fcd commit 70dde74

File tree

6 files changed

+331
-261
lines changed

6 files changed

+331
-261
lines changed

src/webviews/apps/home/home.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@ import { customElement, query } from 'lit/decorators.js';
66
import { when } from 'lit/directives/when.js';
77
import type { State } from '../../home/protocol';
88
import { DidFocusAccount } from '../../home/protocol';
9-
import { OverviewState, overviewStateContext } from '../plus/home/components/overviewState';
9+
import {
10+
ActiveOverviewState,
11+
activeOverviewStateContext,
12+
InactiveOverviewState,
13+
inactiveOverviewStateContext,
14+
} from '../plus/home/components/overviewState';
1015
import type { GLHomeHeader } from '../plus/shared/components/home-header';
1116
import { GlApp } from '../shared/app';
1217
import { scrollableBase } from '../shared/components/styles/lit/base.css';
@@ -27,16 +32,20 @@ import './components/repo-alerts';
2732
export class GlHomeApp extends GlApp<State> {
2833
static override styles = [homeBaseStyles, scrollableBase, homeStyles];
2934

30-
@provide({ context: overviewStateContext })
31-
private _overviewState!: OverviewState;
35+
@provide({ context: activeOverviewStateContext })
36+
private _activeOverviewState!: ActiveOverviewState;
37+
38+
@provide({ context: inactiveOverviewStateContext })
39+
private _inactiveOverviewState!: InactiveOverviewState;
3240

3341
@query('gl-home-header')
3442
private _header!: GLHomeHeader;
3543

3644
private badgeSource = { source: 'home', detail: 'badge' };
3745

3846
protected override createStateProvider(state: State, ipc: HostIpc): HomeStateProvider {
39-
this.disposables.push((this._overviewState = new OverviewState(ipc)));
47+
this.disposables.push((this._activeOverviewState = new ActiveOverviewState(ipc)));
48+
this.disposables.push((this._inactiveOverviewState = new InactiveOverviewState(ipc)));
4049

4150
return new HomeStateProvider(this, state, ipc);
4251
}

src/webviews/apps/plus/home/components/active-work.ts

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ import { ifDefined } from 'lit/directives/if-defined.js';
77
import { when } from 'lit/directives/when.js';
88
import { createCommandLink } from '../../../../../system/commands';
99
import { createWebviewCommandLink } from '../../../../../system/webview';
10-
import type { GetOverviewBranch, OpenInGraphParams, State } from '../../../../home/protocol';
10+
import type { GetActiveOverviewResponse, GetOverviewBranch, OpenInGraphParams, State } from '../../../../home/protocol';
1111
import { stateContext } from '../../../home/context';
1212
import { linkStyles } from '../../shared/components/vscode.css';
1313
import { branchCardStyles, GlBranchCardBase } from './branch-card';
14-
import type { Overview, OverviewState } from './overviewState';
15-
import { overviewStateContext } from './overviewState';
14+
import type { ActiveOverviewState } from './overviewState';
15+
import { activeOverviewStateContext } from './overviewState';
1616
import '../../../shared/components/button';
1717
import '../../../shared/components/code-icon';
1818
import '../../../shared/components/skeleton-loader';
@@ -62,14 +62,14 @@ export class GlActiveWork extends SignalWatcher(LitElement) {
6262
@state()
6363
private _homeState!: State;
6464

65-
@consume({ context: overviewStateContext })
66-
private _overviewState!: OverviewState;
65+
@consume({ context: activeOverviewStateContext })
66+
private _activeOverviewState!: ActiveOverviewState;
6767

6868
override connectedCallback(): void {
6969
super.connectedCallback();
7070

7171
if (this._homeState.repositories.openCount > 0) {
72-
this._overviewState.run();
72+
this._activeOverviewState.run();
7373
}
7474
}
7575

@@ -82,7 +82,7 @@ export class GlActiveWork extends SignalWatcher(LitElement) {
8282
return nothing;
8383
}
8484

85-
return this._overviewState.render({
85+
return this._activeOverviewState.render({
8686
pending: () => this.renderPending(),
8787
complete: overview => this.renderComplete(overview),
8888
error: () => html`<span>Error</span>`,
@@ -99,16 +99,16 @@ export class GlActiveWork extends SignalWatcher(LitElement) {
9999
}
100100

101101
private renderPending() {
102-
if (this._overviewState.state == null) {
102+
if (this._activeOverviewState.state == null) {
103103
return this.renderLoader();
104104
}
105-
return this.renderComplete(this._overviewState.state, true);
105+
return this.renderComplete(this._activeOverviewState.state, true);
106106
}
107107

108-
private renderComplete(overview: Overview, isFetching = false) {
108+
private renderComplete(overview: GetActiveOverviewResponse, isFetching = false) {
109109
const repo = overview?.repository;
110-
const activeBranches = repo?.branches?.active;
111-
if (!activeBranches) return html`<span>None</span>`;
110+
const activeBranch = overview?.active;
111+
if (!repo || !activeBranch) return html`<span>None</span>`;
112112

113113
return html`
114114
<gl-section ?loading=${isFetching}>
@@ -138,7 +138,7 @@ export class GlActiveWork extends SignalWatcher(LitElement) {
138138
tooltip="Open in Commit Graph"
139139
href=${createCommandLink('gitlens.home.openInGraph', {
140140
type: 'repo',
141-
repoPath: this._overviewState.state!.repository.path,
141+
repoPath: this._activeOverviewState.state!.repository.path,
142142
} satisfies OpenInGraphParams)}
143143
><code-icon icon="gl-graph"></code-icon
144144
></gl-button>
@@ -152,9 +152,7 @@ export class GlActiveWork extends SignalWatcher(LitElement) {
152152
><code-icon icon="repo-fetch"></code-icon
153153
></gl-button>
154154
</span>
155-
${activeBranches.map(branch => {
156-
return this.renderRepoBranchCard(branch, repo.path, isFetching);
157-
})}
155+
${this.renderRepoBranchCard(activeBranch, repo.path, isFetching)}
158156
</gl-section>
159157
`;
160158
}
@@ -191,7 +189,7 @@ export class GlActiveWork extends SignalWatcher(LitElement) {
191189
}
192190

193191
private onChange(_e: MouseEvent) {
194-
void this._overviewState.changeRepository();
192+
void this._activeOverviewState.changeRepository();
195193
}
196194
}
197195

src/webviews/apps/plus/home/components/overview.ts

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,17 @@ import { SignalWatcher } from '@lit-labs/signals';
33
import { css, html, LitElement, nothing } from 'lit';
44
import { customElement, state } from 'lit/decorators.js';
55
import { when } from 'lit/directives/when.js';
6-
import type { GetOverviewResponse, OverviewRecentThreshold, State } from '../../../../home/protocol';
6+
import type { GetInactiveOverviewResponse, OverviewRecentThreshold, State } from '../../../../home/protocol';
77
import { SetOverviewFilter } from '../../../../home/protocol';
88
import { stateContext } from '../../../home/context';
99
import { ipcContext } from '../../../shared/context';
1010
import type { HostIpc } from '../../../shared/ipc';
1111
import { linkStyles } from '../../shared/components/vscode.css';
12-
import type { OverviewState } from './overviewState';
13-
import { overviewStateContext } from './overviewState';
12+
import type { InactiveOverviewState } from './overviewState';
13+
import { inactiveOverviewStateContext } from './overviewState';
1414
import '../../../shared/components/skeleton-loader';
1515
import './branch-threshold-filter';
1616

17-
type Overview = GetOverviewResponse;
18-
1917
export const overviewTagName = 'gl-overview';
2018

2119
@customElement(overviewTagName)
@@ -35,14 +33,14 @@ export class GlOverview extends SignalWatcher(LitElement) {
3533
@state()
3634
private _homeState!: State;
3735

38-
@consume({ context: overviewStateContext })
39-
private _overviewState!: OverviewState;
36+
@consume({ context: inactiveOverviewStateContext })
37+
private _inactiveOverviewState!: InactiveOverviewState;
4038

4139
override connectedCallback(): void {
4240
super.connectedCallback();
4341

4442
if (this._homeState.repositories.openCount > 0) {
45-
this._overviewState.run();
43+
this._inactiveOverviewState.run();
4644
}
4745
}
4846

@@ -55,7 +53,7 @@ export class GlOverview extends SignalWatcher(LitElement) {
5553
return nothing;
5654
}
5755

58-
return this._overviewState.render({
56+
return this._inactiveOverviewState.render({
5957
pending: () => this.renderPending(),
6058
complete: summary => this.renderComplete(summary),
6159
error: () => html`<span>Error</span>`,
@@ -72,34 +70,34 @@ export class GlOverview extends SignalWatcher(LitElement) {
7270
}
7371

7472
private renderPending() {
75-
if (this._overviewState.state == null) {
73+
if (this._inactiveOverviewState.state == null) {
7674
return this.renderLoader();
7775
}
78-
return this.renderComplete(this._overviewState.state, true);
76+
return this.renderComplete(this._inactiveOverviewState.state, true);
7977
}
8078

8179
@consume({ context: ipcContext })
8280
private readonly _ipc!: HostIpc;
8381

8482
private onChangeRecentThresholdFilter(e: CustomEvent<{ threshold: OverviewRecentThreshold }>) {
85-
if (!this._overviewState.filter.stale || !this._overviewState.filter.recent) {
83+
if (!this._inactiveOverviewState.filter.stale || !this._inactiveOverviewState.filter.recent) {
8684
return;
8785
}
8886
this._ipc.sendCommand(SetOverviewFilter, {
89-
stale: this._overviewState.filter.stale,
90-
recent: { ...this._overviewState.filter.recent, threshold: e.detail.threshold },
87+
stale: this._inactiveOverviewState.filter.stale,
88+
recent: { ...this._inactiveOverviewState.filter.recent, threshold: e.detail.threshold },
9189
});
9290
}
9391

94-
private renderComplete(overview: Overview, isFetching = false) {
92+
private renderComplete(overview: GetInactiveOverviewResponse, isFetching = false) {
9593
if (overview == null) return nothing;
9694
const { repository } = overview;
9795
return html`
9896
<gl-branch-section
9997
label="recent"
10098
.isFetching=${isFetching}
10199
.repo=${repository.path}
102-
.branches=${repository.branches.recent}
100+
.branches=${overview.recent}
103101
>
104102
<gl-branch-threshold-filter
105103
slot="heading-actions"
@@ -113,16 +111,16 @@ export class GlOverview extends SignalWatcher(LitElement) {
113111
label: string;
114112
}[]}
115113
.disabled=${isFetching}
116-
.value=${this._overviewState.filter.recent?.threshold}
114+
.value=${this._inactiveOverviewState.filter.recent?.threshold}
117115
></gl-branch-threshold-filter>
118116
</gl-branch-section>
119117
${when(
120-
this._overviewState.filter.stale?.show === true,
118+
this._inactiveOverviewState.filter.stale?.show === true && overview.stale,
121119
() => html`
122120
<gl-branch-section
123121
label="stale"
124122
.repo=${repository.path}
125-
.branches=${repository.branches.stale}
123+
.branches=${overview.stale!}
126124
></gl-branch-section>
127125
`,
128126
)}
Lines changed: 49 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,38 @@
11
import { createContext } from '@lit/context';
22
import { signalObject } from 'signal-utils/object';
3-
import type { GetOverviewResponse, OverviewFilters } from '../../../../home/protocol';
3+
import type {
4+
GetActiveOverviewResponse,
5+
GetInactiveOverviewResponse,
6+
OverviewFilters,
7+
} from '../../../../home/protocol';
48
import {
59
ChangeOverviewRepository,
610
DidChangeOverviewFilter,
711
DidChangeRepositories,
812
DidChangeRepositoryWip,
9-
GetOverview,
13+
GetActiveOverview,
14+
GetInactiveOverview,
1015
GetOverviewFilterState,
1116
} from '../../../../home/protocol';
1217
import { AsyncComputedState } from '../../../shared/components/signal-utils';
1318
import type { Disposable } from '../../../shared/events';
1419
import type { HostIpc } from '../../../shared/ipc';
1520

16-
export type Overview = GetOverviewResponse;
21+
export type ActiveOverview = GetActiveOverviewResponse;
22+
export type InactiveOverview = GetInactiveOverviewResponse;
1723

18-
export class OverviewState extends AsyncComputedState<Overview> {
24+
export class ActiveOverviewState extends AsyncComputedState<ActiveOverview> {
1925
private readonly _disposable: Disposable | undefined;
2026

2127
constructor(
2228
private readonly _ipc: HostIpc,
2329
options?: {
2430
runImmediately?: boolean;
25-
initial?: Overview;
31+
initial?: ActiveOverview;
2632
},
2733
) {
2834
super(async _abortSignal => {
29-
const rsp: Overview = await this._ipc.sendRequest(GetOverview, {});
30-
35+
const rsp: ActiveOverview = await this._ipc.sendRequest(GetActiveOverview, {});
3136
return rsp;
3237
}, options);
3338

@@ -39,6 +44,41 @@ export class OverviewState extends AsyncComputedState<Overview> {
3944
case DidChangeRepositoryWip.is(msg):
4045
this.run(true);
4146
break;
47+
}
48+
});
49+
}
50+
51+
dispose() {
52+
this._disposable?.dispose();
53+
}
54+
55+
async changeRepository(): Promise<void> {
56+
await this._ipc.sendRequest(ChangeOverviewRepository, undefined);
57+
this.run(true);
58+
}
59+
}
60+
61+
export class InactiveOverviewState extends AsyncComputedState<InactiveOverview> {
62+
private readonly _disposable: Disposable | undefined;
63+
filter = signalObject<Partial<OverviewFilters>>({});
64+
65+
constructor(
66+
private readonly _ipc: HostIpc,
67+
options?: {
68+
runImmediately?: boolean;
69+
initial?: InactiveOverview;
70+
},
71+
) {
72+
super(async _abortSignal => {
73+
const rsp: InactiveOverview = await this._ipc.sendRequest(GetInactiveOverview, {});
74+
return rsp;
75+
}, options);
76+
77+
this._disposable = this._ipc.onReceiveMessage(msg => {
78+
switch (true) {
79+
case DidChangeRepositories.is(msg):
80+
this.run(true);
81+
break;
4282
case DidChangeOverviewFilter.is(msg):
4383
this.filter.recent = msg.params.filter.recent;
4484
this.filter.stale = msg.params.filter.stale;
@@ -55,13 +95,7 @@ export class OverviewState extends AsyncComputedState<Overview> {
5595
dispose(): void {
5696
this._disposable?.dispose();
5797
}
58-
59-
filter = signalObject<Partial<OverviewFilters>>({});
60-
61-
async changeRepository(): Promise<void> {
62-
await this._ipc.sendRequest(ChangeOverviewRepository, undefined);
63-
this.run(true);
64-
}
6598
}
6699

67-
export const overviewStateContext = createContext<Overview>('overviewState');
100+
export const activeOverviewStateContext = createContext<ActiveOverview>('activeOverviewState');
101+
export const inactiveOverviewStateContext = createContext<InactiveOverview>('inactiveOverviewState');

0 commit comments

Comments
 (0)