refactor: Simplify API calls

API calls can now make with a simple wrapper function.

Additionally, the error code "200" now means success for all API calls.
This commit is contained in:
Alexander Polynomdivision
2018-10-17 18:28:29 +02:00
parent 7de3cedb15
commit 3b7e55d957
14 changed files with 410 additions and 234 deletions

View File

@@ -17,6 +17,7 @@ import VocabPage from "../containers/VocabPage";
import Drawer from "../containers/Drawer";
import { trackAction } from "../api/tracker";
import { makeAPICall } from "../api/call";
import { BACKEND_URL } from "../config.in";
@@ -60,76 +61,26 @@ export default class Application extends React.Component<IProps> {
// Track the end of a review
trackAction(TrackerEvent.LOG_IN);
return new Promise((res, rej) => {
fetch(`${BACKEND_URL}/api/user/me`, {
headers: new Headers({
"Content-Type": "application/json",
"Token": token,
}),
}).then(resp => resp.json(), err => rej(err))
.then(data => {
if (data.error === "0") {
res(data.data);
} else {
rej(data);
}
});
});
return makeAPICall("/api/user/me", {
token: this.props.user.sessionToken,
method: "get",
})
}
getVocab = (): Promise<IVocab[]> => {
return new Promise((res, rej) => {
fetch(`${BACKEND_URL}/api/user/vocab`, {
headers: new Headers({
"Content-Type": "application/json",
"Token": this.props.user.sessionToken,
}),
}).then(resp => resp.json(), err => rej(err))
.then(data => {
if (data.error === "200") {
res(data.data);
} else {
rej(data);
}
});
});
}
getVocab = () => makeAPICall("/api/user/vocab", {
token: this.props.user.sessionToken,
method: "get",
})
getLevels = (): Promise<ILevel[]> => {
return new Promise((res, rej) => {
fetch(`${BACKEND_URL}/api/levels`, {
headers: new Headers({
"Content-Type": "application/json",
"Token": this.props.user.sessionToken,
}),
}).then(resp => resp.json(), err => rej(err))
.then(data => {
if (data.error === "0") {
res(data.data.levels);
} else {
rej(data);
}
});
});
}
getLevels = () => makeAPICall("/api/levels", {
token: this.props.user.sessionToken,
method: "get",
});
getLastReview = (): Promise<IReviewMetadata> => {
return new Promise((res, rej) => {
fetch(`${BACKEND_URL}/api/user/lastReview`, {
headers: new Headers({
"Content-Type": "application/json",
"Token": this.props.user.sessionToken,
}),
}).then(resp => resp.json(), err => rej(err))
.then(data => {
if (data.error === "0") {
res(data.data);
} else {
rej(data);
}
});
});
}
getLastReview = () => makeAPICall("/api/user/lastReview", {
token: this.props.user.sessionToken,
method: "get",
});
// TODO: Type?
setLastReview = (meta: IReviewMetadata, sm2: any, delta: number) => {
@@ -138,149 +89,55 @@ export default class Application extends React.Component<IProps> {
this.props.setUserScoreDelta(delta);
// Tell the server about the last review
fetch(`${BACKEND_URL}/api/user/lastReview`, {
headers: new Headers({
"Content-Type": "application/json",
"Token": this.props.user.sessionToken,
}),
method: "POST",
body: JSON.stringify({
makeAPICall("/api/user/lastReview", {
token: this.props.user.sessionToken,
body: {
meta,
sm2,
delta,
}),
}).then(resp => resp.json(), err => {
console.log("Application::setLastReview: POSTing last results failed");
},
method: "post",
});
// Track the end of a review
trackAction(TrackerEvent.FINISH_LEARNING);
}
getReviewQueue = (): Promise<IVocab[]> => {
return new Promise((res, rej) => {
fetch(`${BACKEND_URL}/api/user/queue`, {
headers: new Headers({
"Content-Type": "application/json",
"Token": this.props.user.sessionToken,
}),
}).then(resp => resp.json(), err => rej(err))
.then(data => {
if (data.error === "0") {
res(data.data.queue);
} else {
rej(data);
}
});
});
}
getReviewQueue = () => makeAPICall("/api/user/queue", {
token: this.props.user.sessionToken,
method: "get",
});
getTopTenLearners = (): Promise<TopTen[]> => {
// TODO: Deprecate?
const id = this.props.user.classId;
return new Promise((res, rej) => {
fetch(`${BACKEND_URL}/api/class/${id}/topTen`, {
headers: new Headers({
"Content-Type": "application/json",
"Token": this.props.user.sessionToken,
}),
}).then(resp => resp.json(),
err => rej(err))
.then(data => {
if (data.error === "0") {
res(data.data.topTen);
} else {
rej(data);
}
});
});
}
getNextLevel = () => makeAPICall("/api/user/nextLevel", {
token: this.props.user.sessionToken,
method: "get",
});
getNextLevel = (): Promise<ILevel> => {
return new Promise((res, rej) => {
fetch(`${BACKEND_URL}/api/user/nextLevel`, {
headers: new Headers({
"Content-Type": "application/json",
"Token": this.props.user.sessionToken,
}),
}).then(resp => resp.json(),
err => rej(err))
.then(data => {
if (data.error === "0") {
res(data.data);
} else {
rej(data);
}
});
});
}
getLevelVocab = (id: number) => makeAPICall(`/api/level/${id}/vocab`, {
token: this.props.user.sessionToken,
method: "get",
});
getLevelVocab = (id: number): Promise<IVocab[]> => {
return new Promise((res, rej) => {
fetch(`${BACKEND_URL}/api/level/${id}/vocab`, {
method: "GET",
headers: new Headers({
"Content-Type": "application/json",
"Token": this.props.user.sessionToken,
}),
}).then(data => data.json(), err => {
rej(err);
}).then((resp: IResponse) => {
if (resp.error === "0") {
res(resp.data.vocab);
} else {
rej(resp);
}
});
});
}
// NOTE: This is not a promise, as we do not care about any response
// being sent, since we don't need to update any client-side
// state.
introDontShowAgain = () => makeAPICall("/api/user/showWelcome", {
token: this.props.user.sessionToken,
body: {
state: false,
},
method: "post",
});
introDontShowAgain = (): void => {
// NOTE: This is not a promise, as we do not care about any response
// being sent, since we don't need to update any client-side
// state.
fetch(`${BACKEND_URL}/api/user/showWelcome`, {
headers: new Headers({
"Content-Type": "application/json",
"Token": this.props.user.sessionToken,
}),
method: "POST",
body: JSON.stringify({
state: false,
}),
});
}
getDashboard = () => makeAPICall("/api/user/dashboard", {
token: this.props.user.sessionToken,
method: "get",
});
// TODO: Type?
getDashboard = (): Promise<any> => {
return new Promise((res, rej) => {
fetch(`${BACKEND_URL}/api/user/dashboard`, {
headers: new Headers({
"Content-Type": "application/json",
"Token": this.props.user.sessionToken,
}),
})
.then(resp => resp.json(), err => rej(err))
.then(data => {
if (data.error === "200") {
res(data.data);
} else {
console.log("Application::getDashboard: Failed to get dashboard");
rej(data);
}
});
});
}
updateDoneLevels = (id: string): void => {
fetch(`${BACKEND_URL}/api/user/level/${id}`, {
headers: new Headers({
"Content-Type": "application/json",
"Token": this.props.user.sessionToken,
}),
method: "POST",
});
}
updateDoneLevels = (id: string) => makeAPICall(`/api/user/level/${id}`, {
token: this.props.user.sessionToken,
method: "post",
});
login = (username: string, password: string): Promise<IUser | IResponse> => {
// Track the login
@@ -302,7 +159,7 @@ export default class Application extends React.Component<IProps> {
// The fetch failed
rej(err);
}).then((resp: IResponse) => {
if (resp.error === "0") {
if (resp.error === "200") {
// Successful login
this.props.setUser(resp.data);
this.props.setDidLogin(true);