aboutsummaryrefslogtreecommitdiff
path: root/Timeline/ClientApp/src/data
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2020-06-04 00:18:50 +0800
committercrupest <crupest@outlook.com>2020-06-04 00:18:50 +0800
commit3aa87cc26fd58836b82c067b58a47e08e30a7784 (patch)
treeba9cf1918d210896ab10bed484a8ddf7c7935e0c /Timeline/ClientApp/src/data
parent1e90a93049cd57098608de72f02bfaabfadd32b6 (diff)
downloadtimeline-3aa87cc26fd58836b82c067b58a47e08e30a7784.tar.gz
timeline-3aa87cc26fd58836b82c067b58a47e08e30a7784.tar.bz2
timeline-3aa87cc26fd58836b82c067b58a47e08e30a7784.zip
refactor(front): Make codes lint-clean!
Diffstat (limited to 'Timeline/ClientApp/src/data')
-rw-r--r--Timeline/ClientApp/src/data/common.ts9
-rw-r--r--Timeline/ClientApp/src/data/timeline.ts5
-rw-r--r--Timeline/ClientApp/src/data/user.ts59
3 files changed, 44 insertions, 29 deletions
diff --git a/Timeline/ClientApp/src/data/common.ts b/Timeline/ClientApp/src/data/common.ts
index 61db8bd2..e2882a80 100644
--- a/Timeline/ClientApp/src/data/common.ts
+++ b/Timeline/ClientApp/src/data/common.ts
@@ -9,9 +9,14 @@ export function extractStatusCode(error: AxiosError): number | null {
}
}
+export interface CommonErrorResponse {
+ code: number;
+ message: string;
+}
+
export function extractErrorCode(error: AxiosError): number | null {
- const code =
- error.response && error.response.data && error.response.data.code;
+ const { response } = error as AxiosError<CommonErrorResponse>;
+ const code = response && response.data && response.data.code;
if (typeof code === 'number') {
return code;
} else {
diff --git a/Timeline/ClientApp/src/data/timeline.ts b/Timeline/ClientApp/src/data/timeline.ts
index bc5e1658..66d9e57a 100644
--- a/Timeline/ClientApp/src/data/timeline.ts
+++ b/Timeline/ClientApp/src/data/timeline.ts
@@ -4,6 +4,7 @@ import XRegExp from 'xregexp';
import { base64 } from './base64';
import { apiBaseUrl } from '../config';
import { User, UserAuthInfo, getCurrentUser, UserWithToken } from './user';
+import { UiLogicError } from '../common';
export const kTimelineVisibilities = ['Public', 'Register', 'Private'] as const;
@@ -159,7 +160,7 @@ export class TimelineServiceTemplate<
private checkUser(): UserWithToken {
const user = getCurrentUser();
if (user == null) {
- throw new Error('You must login to perform the operation.');
+ throw new UiLogicError('You must login to perform the operation.');
}
return user;
}
@@ -204,7 +205,7 @@ export class TimelineServiceTemplate<
RawCreatePostRequestContent
>((resolve) => {
if (request.content.type === 'image') {
- base64(request.content.data).then((d) =>
+ void base64(request.content.data).then((d) =>
resolve({
...request.content,
data: d,
diff --git a/Timeline/ClientApp/src/data/user.ts b/Timeline/ClientApp/src/data/user.ts
index 755aecf6..b85f4f27 100644
--- a/Timeline/ClientApp/src/data/user.ts
+++ b/Timeline/ClientApp/src/data/user.ts
@@ -3,8 +3,10 @@ import { useState, useEffect } from 'react';
import { BehaviorSubject, Observable } from 'rxjs';
import { apiBaseUrl } from '../config';
+import { extractErrorCode } from './common';
import { pushAlert } from '../common/alert-service';
import { i18nPromise } from '../i18n';
+import { UiLogicError } from '../common';
export interface UserAuthInfo {
username: string;
@@ -63,30 +65,30 @@ const verifyTokenUrl = apiBaseUrl + kVerifyTokenUrl;
function verifyToken(token: string): Promise<User> {
return axios
.post<VerifyTokenResponse>(verifyTokenUrl, {
- token: token
+ token: token,
} as VerifyTokenRequest)
- .then(res => res.data.user);
+ .then((res) => res.data.user);
}
const TOKEN_STORAGE_KEY = 'token';
export function checkUserLoginState(): Promise<UserWithToken | null> {
if (getCurrentUser() !== undefined)
- throw new Error("Already checked user. Can't check twice.");
+ throw new UiLogicError("Already checked user. Can't check twice.");
const savedToken = window.localStorage.getItem(TOKEN_STORAGE_KEY);
if (savedToken) {
return verifyToken(savedToken)
.then(
- u => {
+ (u) => {
const user: UserWithToken = {
...u,
- token: savedToken
+ token: savedToken,
};
- i18nPromise.then(t => {
+ void i18nPromise.then((t) => {
pushAlert({
type: 'success',
- message: t('user.welcomeBack')
+ message: t('user.welcomeBack'),
});
});
return user;
@@ -94,17 +96,17 @@ export function checkUserLoginState(): Promise<UserWithToken | null> {
(e: AxiosError) => {
if (e.response != null) {
window.localStorage.removeItem(TOKEN_STORAGE_KEY);
- i18nPromise.then(t => {
+ void i18nPromise.then((t) => {
pushAlert({
type: 'danger',
- message: t('user.verifyTokenFailed')
+ message: t('user.verifyTokenFailed'),
});
});
} else {
- i18nPromise.then(t => {
+ void i18nPromise.then((t) => {
pushAlert({
type: 'danger',
- message: t('user.verifyTokenFailedNetwork')
+ message: t('user.verifyTokenFailedNetwork'),
});
});
}
@@ -112,7 +114,7 @@ export function checkUserLoginState(): Promise<UserWithToken | null> {
return null;
}
)
- .then(u => {
+ .then((u) => {
userSubject.next(u);
return u;
});
@@ -132,18 +134,17 @@ export function userLogin(
rememberMe: boolean
): Promise<UserWithToken> {
if (getCurrentUser()) {
- throw new Error('Already login.');
+ throw new UiLogicError('Already login.');
}
return axios
.post<CreateTokenResponse>(createTokenUrl, { ...credentials, expire: 30 })
- .catch(e => {
- const error = e as AxiosError;
- if (error.response?.data?.code === 11010101) {
+ .catch((e: AxiosError) => {
+ if (extractErrorCode(e) === 11010101) {
throw new BadCredentialError(e);
}
throw e;
})
- .then(res => {
+ .then((res) => {
const body = res.data;
const token = body.token;
if (rememberMe) {
@@ -151,7 +152,7 @@ export function userLogin(
}
const user = {
...body.user,
- token
+ token,
};
userSubject.next(user);
return user;
@@ -160,10 +161,10 @@ export function userLogin(
export function userLogout(): void {
if (getCurrentUser() === undefined) {
- throw new Error('Please check user first.');
+ throw new UiLogicError('Please check user first.');
}
if (getCurrentUser() === null) {
- throw new Error('No login.');
+ throw new UiLogicError('No login.');
}
window.localStorage.removeItem(TOKEN_STORAGE_KEY);
userSubject.next(null);
@@ -174,7 +175,7 @@ export function useOptionalUser(): UserWithToken | null | undefined {
userSubject.value
);
useEffect(() => {
- const sub = user$.subscribe(u => setUser(u));
+ const sub = user$.subscribe((u) => setUser(u));
return () => {
sub.unsubscribe();
};
@@ -186,16 +187,16 @@ export function useUser(): UserWithToken | null {
const [user, setUser] = useState<UserWithToken | null>(() => {
const initUser = userSubject.value;
if (initUser === undefined) {
- throw new Error(
+ throw new UiLogicError(
"This is a logic error in user module. Current user can't be undefined in useUser."
);
}
return initUser;
});
useEffect(() => {
- const sub = user$.subscribe(u => {
+ const sub = user$.subscribe((u) => {
if (u === undefined) {
- throw new Error(
+ throw new UiLogicError(
"This is a logic error in user module. User emitted can't be undefined later."
);
}
@@ -208,8 +209,16 @@ export function useUser(): UserWithToken | null {
return user;
}
+export function useUserLoggedIn(): UserWithToken {
+ const user = useUser();
+ if (user == null) {
+ throw new UiLogicError('You assert user has logged in but actually not.');
+ }
+ return user;
+}
+
export function fetchUser(username: string): Promise<User> {
return axios
.get<User>(`${apiBaseUrl}/users/${username}`)
- .then(res => res.data);
+ .then((res) => res.data);
}