Skip to content

Commit d3354c3

Browse files
committed
refactor: remove code duplications
1 parent ee2f8d8 commit d3354c3

File tree

4 files changed

+60
-65
lines changed

4 files changed

+60
-65
lines changed

angular-ngrx-scss/src/app/file-viewer/file-explorer/file-explorer.component.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
1-
import { Component, OnDestroy } from '@angular/core';
1+
import { Component, OnDestroy, OnInit } from '@angular/core';
22
import { Store } from '@ngrx/store';
33
import { ActivatedRoute } from '@angular/router';
4-
import { RepoContents, fetchRepository, selectedRepository } from '../../state/repository';
4+
import {
5+
RepoContents,
6+
fetchRepository,
7+
selectedRepository,
8+
} from '../../state/repository';
59
import { map, takeWhile, tap } from 'rxjs';
610

711
@Component({
812
selector: 'app-file-explorer',
913
templateUrl: './file-explorer.component.html',
1014
styleUrls: ['./file-explorer.component.scss'],
1115
})
12-
export class FileExplorerComponent implements OnDestroy {
16+
export class FileExplorerComponent implements OnInit, OnDestroy {
1317
owner = '';
1418
repoName = '';
1519
path = '';
@@ -32,8 +36,7 @@ export class FileExplorerComponent implements OnDestroy {
3236
);
3337
private componentActive = true;
3438

35-
constructor(private route: ActivatedRoute, private store: Store) { }
36-
39+
constructor(private route: ActivatedRoute, private store: Store) {}
3740

3841
ngOnInit() {
3942
this.route.paramMap

angular-ngrx-scss/src/app/repository/services/repository.interfaces.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,6 @@ export interface RepositoryIssuesApiParams {
5454
page?: number;
5555
}
5656

57-
export interface RepositoryPullsApiParams {
58-
state: 'open' | 'closed' | 'all';
59-
labels?: string;
60-
sort?: Sort;
61-
page?: number;
62-
}
63-
6457
export interface PullRequest extends Issue {
6558
merged: boolean;
6659
mergeable: boolean;

angular-ngrx-scss/src/app/repository/services/repository.service.ts

Lines changed: 49 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import { HttpClient, HttpParams } from '@angular/common/http';
1+
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
22
import { Injectable } from '@angular/core';
33
import { Observable, map } from 'rxjs';
44
import {
55
FileContentsApiResponse,
66
IssueAPIResponse,
77
IssueLabel,
88
Milestone,
9+
PaginationParams,
910
PullRequestAPIResponse,
1011
ReadmeApiResponse,
1112
RepoApiResponse,
@@ -20,7 +21,6 @@ import {
2021
PullRequest,
2122
PullRequests,
2223
RepositoryIssuesApiParams,
23-
RepositoryPullsApiParams,
2424
} from './repository.interfaces';
2525

2626
@Injectable({
@@ -87,24 +87,14 @@ export class RepositoryService {
8787
getRepositoryPullRequests(
8888
repoOwner: string,
8989
repoName: string,
90-
params: RepositoryPullsApiParams,
90+
params: RepositoryIssuesApiParams,
9191
): Observable<RepoPullRequests> {
9292
const owner = encodeURIComponent(repoOwner);
9393
const name = encodeURIComponent(repoName);
9494
const state = encodeURIComponent(params.state);
9595
let url = `${environment.githubUrl}/search/issues?q=repo:${owner}/${name}+type:pr+state:${state}`;
9696

97-
if (params?.labels) {
98-
url += `+label:"${params.labels}"`;
99-
}
100-
101-
if (params?.sort) {
102-
url += `+sort:${params.sort}`;
103-
}
104-
105-
if (params?.page) {
106-
url += `&page=${params.page}`;
107-
}
97+
url = this.appendUrlParams(url, params);
10898

10999
return this.http
110100
.get(url, {
@@ -115,22 +105,16 @@ export class RepositoryService {
115105
})
116106
.pipe(
117107
map((response) => {
118-
const linkHeader = response.headers.get('Link');
119-
120-
const canNext = !!(linkHeader && linkHeader.includes('rel="next"'));
121-
const canPrev = !!(linkHeader && linkHeader.includes('rel="prev"'));
122-
123108
const data = response.body as PullRequestAPIResponse;
124109

125110
const total = data.total_count;
126111

127112
const page = params?.page || 1;
128113

129-
const paginationParams = {
130-
canNext,
131-
canPrev,
114+
const paginationParams = this.getPaginationParams(
115+
response.headers,
132116
page,
133-
};
117+
);
134118

135119
const pullRequests: PullRequest[] = data.items;
136120

@@ -255,21 +239,7 @@ export class RepositoryService {
255239
const state = encodeURIComponent(params?.state ?? defaultParams.state);
256240
let url = `${environment.githubUrl}/search/issues?q=repo:${owner}/${name}+type:issue+state:${state}`;
257241

258-
if (params?.labels) {
259-
url += `+label:"${params.labels}"`;
260-
}
261-
262-
if (params?.milestone) {
263-
url += `+milestone:"${params.milestone}"`;
264-
}
265-
266-
if (params?.sort) {
267-
url += `+sort:${params.sort}`;
268-
}
269-
270-
if (params?.page) {
271-
url += `&page=${params.page}`;
272-
}
242+
url = this.appendUrlParams(url, params);
273243

274244
return this.http
275245
.get(url, {
@@ -280,22 +250,16 @@ export class RepositoryService {
280250
})
281251
.pipe(
282252
map((response) => {
283-
const linkHeader = response.headers.get('Link');
284-
285-
const canNext = !!(linkHeader && linkHeader.includes('rel="next"'));
286-
const canPrev = !!(linkHeader && linkHeader.includes('rel="prev"'));
287-
288253
const data = response.body as IssueAPIResponse;
289254

290255
const total = data.total_count;
291256

292257
const page = params?.page || 1;
293258

294-
const paginationParams = {
295-
canNext,
296-
canPrev,
259+
const paginationParams = this.getPaginationParams(
260+
response.headers,
297261
page,
298-
};
262+
);
299263

300264
const issues: Issue[] = data.items;
301265

@@ -420,4 +384,42 @@ export class RepositoryService {
420384

421385
return page;
422386
}
387+
388+
private appendUrlParams(
389+
url: string,
390+
params?: RepositoryIssuesApiParams,
391+
): string {
392+
if (params?.labels) {
393+
url += `+label:"${params.labels}"`;
394+
}
395+
396+
if (params?.milestone) {
397+
url += `+milestone:"${params.milestone}"`;
398+
}
399+
400+
if (params?.sort) {
401+
url += `+sort:${params.sort}`;
402+
}
403+
404+
if (params?.page) {
405+
url += `&page=${params.page}`;
406+
}
407+
return url;
408+
}
409+
410+
private getPaginationParams(
411+
headers: HttpHeaders,
412+
page: number,
413+
): PaginationParams {
414+
const linkHeader = headers.get('Link');
415+
416+
const canNext = !!(linkHeader && linkHeader.includes('rel="next"'));
417+
const canPrev = !!(linkHeader && linkHeader.includes('rel="prev"'));
418+
419+
return {
420+
canNext,
421+
canPrev,
422+
page,
423+
};
424+
}
423425
}

angular-ngrx-scss/src/app/state/repository/repository.actions.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@ import {
55
RepoPullRequests,
66
RepositoryState,
77
} from './repository.state';
8-
import {
9-
RepositoryIssuesApiParams,
10-
RepositoryPullsApiParams,
11-
} from 'src/app/repository/services/repository.interfaces';
8+
import { RepositoryIssuesApiParams } from 'src/app/repository/services/repository.interfaces';
129

1310
export const fetchRepository = createAction(
1411
'[Repository API] Fetch Repository',
@@ -50,15 +47,15 @@ export const fetchPullRequests = createAction(
5047
props<{
5148
owner: string;
5249
repoName: string;
53-
params: RepositoryPullsApiParams;
50+
params: RepositoryIssuesApiParams;
5451
}>(),
5552
);
5653

5754
export const fetchPullRequestsSuccess = createAction(
5855
'[Repository API] Fetch Pull Requests Success',
5956
props<{
6057
pullRequests: RepoPullRequests;
61-
params: RepositoryPullsApiParams;
58+
params: RepositoryIssuesApiParams;
6259
}>(),
6360
);
6461

0 commit comments

Comments
 (0)