Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions src/createFetchWrapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ export default function createFetchWrapper(apiKey: string, type: AllowedTypes) {
headers: {
Accept: "application/json",
"Content-Type": "application/json",
"User-Agent": "Pexels/JavaScript",
Authorization: apiKey,
},
};
Expand All @@ -24,12 +23,19 @@ export default function createFetchWrapper(apiKey: string, type: AllowedTypes) {

return <T extends Params>(path: string, params?: T) =>
fetch(`${baseUrl}${path}?${stringifyParams(params || {})}`, options).then(
(response) => {
async (response) => {
if (!response.ok) {
throw new Error(response.statusText);
}

return response.json();
const json = await response.json();

Object.defineProperty(json, "headers", {
value: response.headers,
enumerable: false,
});

return json;
}
);
}
Expand Down
26 changes: 19 additions & 7 deletions src/generateCollectionEndpoints.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,38 @@
import createFetchWrapper from "./createFetchWrapper";
import { Collection, PaginationParams, ErrorResponse, Medium } from "./types";
import {
Collection,
PaginationParams,
ErrorResponse,
Medium,
WithHeaders,
} from "./types";

type AllReturn =
type AllReturn = (
| {
page: number;
per_page: number;
collections: Collection[];
}
| ErrorResponse;
| ErrorResponse
) &
WithHeaders;

type MediaReturn =
type MediaReturn = (
| {
page: number;
per_page: number;
total_results: number;
media: (Medium & { type: "Video" | "Photo" })[];
}
| ErrorResponse;
| ErrorResponse
) &
WithHeaders;

type FeaturedReturn =
type FeaturedReturn = (
| { page: number; per_page: number; collections: Collection[] }
| ErrorResponse;
| ErrorResponse
) &
WithHeaders;

export default function generateCollectionEndpoints(apiKey: string) {
const fetchWrapper = createFetchWrapper(apiKey, "collections");
Expand Down
23 changes: 16 additions & 7 deletions src/generatePhotoEndpoints.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,25 @@ import createFetchWrapper from "./createFetchWrapper";
import {
Photo,
PaginationParams,
PhotoFilterParams,
ErrorResponse,
Photos,
PhotosWithTotalResults,
WithHeaders,
} from "./types";
import { isPhotos } from "./typeCheckers";

type SearchReturn = PhotosWithTotalResults | ErrorResponse;
type CuratedReturn = Photos | ErrorResponse;
type ShowReturn = Photo | ErrorResponse;
type RandomReturn = Photo | ErrorResponse;
type SearchReturn = (PhotosWithTotalResults | ErrorResponse) & WithHeaders;
type CuratedReturn = (Photos | ErrorResponse) & WithHeaders;
type ShowReturn = (Photo | ErrorResponse) & WithHeaders;
type RandomReturn = (Photo | ErrorResponse) & WithHeaders;

export default function generatePhotoEndpoints(apiKey: string) {
const fetchWrapper = createFetchWrapper(apiKey, "photo");

return {
search(
params: PaginationParams & { query: string }
params: PaginationParams & PhotoFilterParams & { query: string }
): Promise<SearchReturn> {
return fetchWrapper(`/search`, params);
},
Expand All @@ -33,10 +35,17 @@ export default function generatePhotoEndpoints(apiKey: string) {
const response = await this.curated({ page: randomPage, per_page: 1 });

if (isPhotos(response)) {
return response.photos[0] as RandomReturn;
const photo = response.photos[0];

Object.defineProperty(photo, "headers", {
value: response.headers,
enumerable: false,
});

return photo as RandomReturn;
}

return response as ErrorResponse;
return response as RandomReturn;
},
};
}
7 changes: 4 additions & 3 deletions src/generateVideoEndpoints.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@ import {
Video,
Videos,
VideoFilterParams,
WithHeaders,
} from "./types";

type SearchReturn = Videos | ErrorResponse;
type PopularReturn = Videos | ErrorResponse;
type ShowReturn = Video;
type SearchReturn = (Videos | ErrorResponse) & WithHeaders;
type PopularReturn = (Videos | ErrorResponse) & WithHeaders;
type ShowReturn = Video & WithHeaders;

export default function generatePhotoEndpoints(apiKey: string) {
const fetchWrapper = createFetchWrapper(apiKey, "video");
Expand Down
13 changes: 12 additions & 1 deletion src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ export interface ErrorResponse {
error: string;
}

export interface WithHeaders {
headers: Headers;
}

export interface Params {
[key: string]: string | number | undefined;
}
Expand All @@ -11,14 +15,21 @@ export interface PaginationParams extends Params {
page?: number;
}

export interface PhotoFilterParams extends Params {
orientation?: "landscape" | "portrait" | "square";
size?: "large" | "medium" | "small";
color?: string;
locale?: string;
}

export interface VideoFilterParams extends Params {
min_width?: number;
max_width?: number;
min_duration?: number;
max_duration?: number;
}

interface PaginationObject {
export interface PaginationObject {
url?: string;
page: number;
per_page: number;
Expand Down