diff options
author | crupest <crupest@outlook.com> | 2020-06-11 17:27:15 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2020-06-11 17:27:15 +0800 |
commit | cf6cfe87b46a2a3eb2913209092ab4c5639e75c3 (patch) | |
tree | eba7504d04dad89f67524b48d88a3b5eb27de6de /Timeline/ClientApp/src/app/user/api.ts | |
parent | 4b8abdd1921935ebb29d18961534db04a2e58fbb (diff) | |
download | timeline-cf6cfe87b46a2a3eb2913209092ab4c5639e75c3.tar.gz timeline-cf6cfe87b46a2a3eb2913209092ab4c5639e75c3.tar.bz2 timeline-cf6cfe87b46a2a3eb2913209092ab4c5639e75c3.zip |
feat(front): Service worker is coming!
Diffstat (limited to 'Timeline/ClientApp/src/app/user/api.ts')
-rw-r--r-- | Timeline/ClientApp/src/app/user/api.ts | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/Timeline/ClientApp/src/app/user/api.ts b/Timeline/ClientApp/src/app/user/api.ts new file mode 100644 index 00000000..a9855eb0 --- /dev/null +++ b/Timeline/ClientApp/src/app/user/api.ts @@ -0,0 +1,79 @@ +import React from 'react'; +import axios from 'axios'; +import { BehaviorSubject, Observable } from 'rxjs'; + +import { apiBaseUrl } from '../config'; +import { User } from '../data/user'; +import { updateQueryString } from '../helper'; + +export function changeNickname( + token: string, + username: string, + newNickname: string +): Promise<User> { + return axios + .patch<User>(`${apiBaseUrl}/users/${username}?token=${token}`, { + nickname: newNickname, + }) + .then((res) => res.data); +} + +const avatarVersionSubject = new BehaviorSubject<number | undefined>(undefined); + +export function changeAvatar( + token: string, + username: string, + data: Blob, + type: string +): Promise<void> { + return axios + .put(`${apiBaseUrl}/users/${username}/avatar?token=${token}`, data, { + headers: { + 'Content-Type': type, + }, + }) + .then(() => { + avatarVersionSubject.next((avatarVersionSubject.value ?? 0) + 1); + }); +} + +export const avatarVersion$: Observable< + number | undefined +> = avatarVersionSubject; + +export function useAvatarVersion(): number | undefined { + const [version, setVersion] = React.useState<number | undefined>(); + React.useEffect(() => { + const subscription = avatarVersion$.subscribe((v) => setVersion(v)); + return () => subscription.unsubscribe(); + }, []); + return version; +} + +export function useOptionalVersionedAvatarUrl( + url: string | undefined +): string | undefined { + const avatarVersion = useAvatarVersion(); + return React.useMemo( + () => + url == null + ? undefined + : updateQueryString( + 'v', + avatarVersion == null ? null : avatarVersion.toString(), + url + ), + [avatarVersion, url] + ); +} + +export function useAvatarUrlWithGivenVersion( + version: number | null | undefined, + url: string +): string { + return React.useMemo( + () => + updateQueryString('v', version == null ? null : version.toString(), url), + [version, url] + ); +} |