added axios client; fixed "validate-email" -> "verify-email"

This commit is contained in:
Myzel394 2022-10-16 17:01:37 +02:00
parent 455ecf2a37
commit 5e4e491483
18 changed files with 70 additions and 74 deletions

View File

@ -17,6 +17,7 @@
"@mui/material": "^5.10.9",
"@tanstack/react-query": "^4.12.0",
"axios": "^1.1.2",
"axios-case-converter": "^0.11.1",
"crypto-js": "^4.1.1",
"date-fns": "^2.29.3",
"formik": "^2.2.9",

View File

@ -1,6 +1,6 @@
import {ReactElement, ReactNode, useCallback, useEffect, useMemo} from "react"
import {useLocalStorage} from "react-use"
import axios, {AxiosError} from "axios"
import {AxiosError} from "axios"
import {useMutation} from "@tanstack/react-query"
@ -11,6 +11,7 @@ import {
logout as logoutUser,
refreshToken,
} from "~/apis"
import {client} from "~/constants/axios-client"
import AuthContext, {AuthContextType} from "./AuthContext"
@ -59,7 +60,7 @@ export default function AuthContextProvider({
)
useEffect(() => {
const interceptor = axios.interceptors.response.use(
const interceptor = client.interceptors.response.use(
response => response,
async (error: AxiosError) => {
if (error.isAxiosError) {
@ -80,7 +81,7 @@ export default function AuthContextProvider({
},
)
return () => axios.interceptors.response.eject(interceptor)
return () => client.interceptors.response.eject(interceptor)
}, [logout, refresh])
return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>

View File

@ -1,9 +1,9 @@
import axios from "axios"
import {client} from "~/constants/axios-client"
export default async function checkIsDomainDisposable(
domain: string,
): Promise<boolean> {
const {data} = await axios.get(`https://api.mailcheck.ai/domain/${domain}`)
const {data} = await client.get(`https://api.mailcheck.ai/domain/${domain}`)
return !data.mx || data.disposable
}

View File

@ -1,12 +1,10 @@
import axios from "axios"
import {
Alias,
AliasType,
ImageProxyFormatType,
ProxyUserAgentType,
} from "~/server-types"
import parseAlias from "~/apis/helpers/parse-alias"
import {client} from "~/constants/axios-client"
interface CreateAliasDataOther {
isActive?: boolean
@ -40,10 +38,10 @@ export type CreateAliasData =
export default async function createAlias(
aliasData: CreateAliasData,
): Promise<Alias> {
const {data} = await axios.post(
const {data} = await client.post(
`${import.meta.env.VITE_SERVER_BASE_URL}/alias`,
{},
aliasData,
)
return parseAlias(data)
return data
}

View File

@ -1,12 +1,10 @@
import axios from "axios"
import {Alias} from "~/server-types"
import parseAlias from "~/apis/helpers/parse-alias"
import {client} from "~/constants/axios-client"
export default async function getAliases(): Promise<Array<Alias>> {
const {data} = await axios.get(
const {data} = await client.get(
`${import.meta.env.VITE_SERVER_BASE_URL}/alias`,
)
return data.map(parseAlias)
return data
}

View File

@ -1,8 +1,8 @@
import axios from "axios"
import {ServerSettings} from "~/server-types"
import {client} from "~/constants/axios-client"
export default async function getServerSettings(): Promise<ServerSettings> {
return (await axios.get(`${import.meta.env.VITE_SERVER_BASE_URL}/settings`))
.data
return (
await client.get(`${import.meta.env.VITE_SERVER_BASE_URL}/settings`)
).data
}

View File

@ -1,16 +0,0 @@
import {Alias} from "~/server-types"
export default function parseAlias(alias: any): Alias {
return {
id: alias.id,
domain: alias.domain,
local: alias.local,
isActive: alias.is_active,
encryptedNotes: alias.encrypted_notes,
removeTrackers: alias.remove_trackers,
createMailReport: alias.create_mail_report,
proxyImages: alias.proxy_images,
imageProxyFormat: alias.image_proxy_format,
imageProxyUserAgent: alias.image_proxy_user_agent,
}
}

View File

@ -2,19 +2,7 @@ import {User} from "~/server-types"
export default function parseUser(user: any): User {
return {
id: user.id,
createdAt: new Date(user.created_at),
email: {
address: user.email.address,
isVerified: user.email.is_verified,
},
preferences: {
aliasRemoveTrackers: user.preferences.alias_remove_trackers,
aliasCreateMailReport: user.preferences.alias_create_mail_report,
aliasProxyImages: user.preferences.alias_proxy_images,
aliasImageProxyFormat: user.preferences.alias_image_proxy_format,
aliasImageProxyUserAgent:
user.preferences.alias_image_proxy_user_agent,
},
...user,
createdAt: new Date(user.createdAt),
}
}

View File

@ -4,8 +4,8 @@ export * from "./get-server-settings"
export {default as getServerSettings} from "./get-server-settings"
export * from "./signup"
export {default as signup} from "./signup"
export * from "./validate-email"
export {default as validateEmail} from "./validate-email"
export * from "./verify-email"
export {default as verifyEmail} from "./verify-email"
export * from "./resend-email-verification-code"
export {default as resendEmailVerificationCode} from "./resend-email-verification-code"
export * from "./refresh-token"
@ -16,3 +16,5 @@ export * from "./get-aliases"
export {default as getAliases} from "./get-aliases"
export * from "./create-alias"
export {default as createAlias} from "./create-alias"
export * from "./update-account"
export {default as updateAccount} from "./update-account"

View File

@ -1,9 +1,8 @@
import axios from "axios"
import {MinimumServerResponse} from "~/server-types"
import {client} from "~/constants/axios-client"
export default async function logout(): Promise<MinimumServerResponse> {
const {data} = await axios.post(
const {data} = await client.post(
`${import.meta.env.VITE_SERVER_BASE_URL}/auth/logout`,
)

View File

@ -1,6 +1,5 @@
import axios from "axios"
import {User} from "~/server-types"
import {client} from "~/constants/axios-client"
export interface RefreshTokenResult {
user: User
@ -12,7 +11,7 @@ export const REFRESH_TOKEN_URL = `${
}/api/refresh-token`
export default async function refreshToken(): Promise<RefreshTokenResult> {
const {data} = await axios.post(REFRESH_TOKEN_URL)
const {data} = await client.post(REFRESH_TOKEN_URL)
return data
}

View File

@ -1,11 +1,10 @@
import axios from "axios"
import {MinimumServerResponse} from "~/server-types"
import {client} from "~/constants/axios-client"
export default async function resendEmailVerificationCode(
email: string,
): Promise<MinimumServerResponse> {
const {data} = await axios.post(
const {data} = await client.post(
`${import.meta.env.VITE_SERVER_BASE_URL}/auth/resend-email`,
{
email,

View File

@ -1,11 +1,11 @@
import axios from "axios"
import {client} from "~/constants/axios-client"
export interface SignupResult {
normalized_email: string
}
export default async function signup(email: string): Promise<SignupResult> {
const {data} = await axios.post(
const {data} = await client.post(
`${import.meta.env.VITE_SERVER_BASE_URL}/auth/signup`,
{
email,

View File

@ -1,4 +1,24 @@
import {Language} from "~/server-types"
import {client} from "~/constants/axios-client"
import parseUser from "~/apis/helpers/parse-user"
export interface UpdateAccountData {
password: string
publicKey: string
encryptedPrivateKey: string
language: Language
}
export default async function updateAccount(
updateData: Partial<UpdateAccountData>,
): Promise<void> {
const {data} = await client.patch(
`${import.meta.env.VITE_SERVER_BASE_URL}/account`,
updateData,
)
return {
...data,
user: parseUser(data.user),
}
}

View File

@ -1,18 +1,17 @@
import axios from "axios"
import {AuthenticationDetails} from "~/server-types"
import {client} from "~/constants/axios-client"
import parseUser from "~/apis/helpers/parse-user"
export interface ValidateEmailData {
export interface VerifyEmailData {
email: string
token: string
}
export default async function validateEmail({
export default async function verifyEmail({
email,
token,
}: ValidateEmailData): Promise<AuthenticationDetails> {
const {data} = await axios.post(
}: VerifyEmailData): Promise<AuthenticationDetails> {
const {data} = await client.post(
`${import.meta.env.VITE_SERVER_BASE_URL}/auth/verify-email`,
{
email: email,

View File

@ -0,0 +1,4 @@
import applyCaseMiddleware from "axios-case-converter"
import axios from "axios"
export const client = applyCaseMiddleware(axios.create())

View File

@ -9,7 +9,7 @@ import {Grid, Paper, Typography, useTheme} from "@mui/material"
import {useMutation} from "@tanstack/react-query"
import {AuthenticationDetails, ServerSettings} from "~/server-types"
import {ValidateEmailData, validateEmail} from "~/apis"
import {VerifyEmailData, verifyEmail} from "~/apis"
import {useQueryParams} from "~/hooks"
import AuthContext from "~/AuthContext/AuthContext"
@ -39,11 +39,11 @@ export default function VerifyEmailRoute(): ReactElement {
return token.split("").every(char => chars.includes(char))
})
const {mutateAsync: verifyEmail} = useMutation<
const {mutateAsync} = useMutation<
AuthenticationDetails,
AxiosError,
ValidateEmailData
>(validateEmail, {
VerifyEmailData
>(verifyEmail, {
onSuccess: async ({user}) => {
setEmail("")
await login(user, () => navigate("/auth/complete-account"))
@ -53,7 +53,7 @@ export default function VerifyEmailRoute(): ReactElement {
await emailSchema.validate(email)
await tokenSchema.validate(token)
await verifyEmail({
await mutateAsync({
email,
token,
})

View File

@ -18,6 +18,10 @@ export enum AliasType {
CUSTOM = "custom",
}
export enum Language {
EN_US = "en_US",
}
export interface User {
id: string
createdAt: Date