@greatapps/common 1.1.277 → 1.1.279
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/modules/whitelabel/services/whitelabel.service.mjs +2 -2
- package/dist/modules/whitelabel/services/whitelabel.service.mjs.map +1 -1
- package/dist/providers/auth.provider.mjs +6 -6
- package/dist/providers/auth.provider.mjs.map +1 -1
- package/package.json +1 -1
- package/src/modules/whitelabel/schema.ts +15 -15
- package/src/modules/whitelabel/services/whitelabel.service.ts +2 -2
- package/src/providers/auth.provider.tsx +62 -61
- package/dist/modules/whitelabel/styles-schema.mjs +0 -1
- package/dist/modules/whitelabel/styles-schema.mjs.map +0 -1
- package/src/modules/whitelabel/styles-schema.ts +0 -37
|
@@ -63,7 +63,7 @@ class WhitelabelService {
|
|
|
63
63
|
return result.data[0];
|
|
64
64
|
}
|
|
65
65
|
async getTokenByDomain(hostname) {
|
|
66
|
-
hostname = normalizeHostname(process.env.WHITELABEL_DOMAIN || hostname)
|
|
66
|
+
hostname = `.${normalizeHostname(process.env.WHITELABEL_DOMAIN || hostname)}`;
|
|
67
67
|
const cache = this.createCache();
|
|
68
68
|
const cacheKey = this.getCacheKey(hostname);
|
|
69
69
|
const cachedData = await cache.select(cacheKey);
|
|
@@ -108,7 +108,7 @@ class WhitelabelService {
|
|
|
108
108
|
return result.data[0].token;
|
|
109
109
|
}
|
|
110
110
|
async revalidateByDomain(hostname) {
|
|
111
|
-
hostname = normalizeHostname(process.env.WHITELABEL_DOMAIN || hostname)
|
|
111
|
+
hostname = `.${normalizeHostname(process.env.WHITELABEL_DOMAIN || hostname)}`;
|
|
112
112
|
const cache = this.createCache();
|
|
113
113
|
const cacheKey = this.getCacheKey(hostname);
|
|
114
114
|
console.log("[WhitelabelService] Revalidating cache for domain", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/whitelabel/services/whitelabel.service.ts"],"sourcesContent":["import greatCache from \"@greatapps/cache\";\r\nimport { ApiError } from \"../../../infra/api/types\";\r\nimport { WhitelabelTokenApiResponse, WhitelabelTokenData } from \"../schema\";\r\nimport { normalizeHostname } from \"../utils/normalize-hostname\";\r\n\r\nclass WhitelabelService {\r\n private getApiUrl(): string {\r\n const apiUrl = process.env.GAPPS_R3_API_URL;\r\n if (!apiUrl) {\r\n throw new ApiError(\r\n \"GAPPS_R3_API_URL not configured\",\r\n \"CONFIG_ERROR\",\r\n 500,\r\n );\r\n }\r\n return apiUrl;\r\n }\r\n\r\n private getToken(): string {\r\n const token = process.env.WHITELABEL_TOKEN_MASTER;\r\n if (!token) {\r\n throw new ApiError(\r\n \"WHITELABEL_TOKEN_MASTER not configured\",\r\n \"CONFIG_ERROR\",\r\n 500,\r\n );\r\n }\r\n return token;\r\n }\r\n\r\n private createCache() {\r\n return new greatCache({\r\n service: \"whitelabel-service\",\r\n version: \"1.0\",\r\n domain: \"whitelabel-cache.greatapps.com.br\",\r\n ambient: process.env.NODE_ENV || \"development\",\r\n });\r\n }\r\n\r\n private getCacheKey(hostname: string): string {\r\n return `whitelabel-token-${hostname}`;\r\n }\r\n\r\n private async fetchFromApi(hostname: string): Promise<WhitelabelTokenData> {\r\n const apiUrl = this.getApiUrl();\r\n const whitelabelMasterToken = this.getToken();\r\n const url = `${apiUrl}/v1/pt-br/1/whitelabel/${hostname}/token`;\r\n\r\n console.log(\"[WhitelabelService] Fetching token for domain\", { url });\r\n\r\n const response = await fetch(url, {\r\n method: \"GET\",\r\n headers: {\r\n authorization: whitelabelMasterToken,\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n console.error(\"[WhitelabelService] Failed to fetch whitelabel token\", {\r\n response,\r\n });\r\n throw new ApiError(\r\n `Failed to fetch whitelabel token: ${response.status}`,\r\n \"FETCH_ERROR\",\r\n response.status,\r\n );\r\n }\r\n\r\n const result: WhitelabelTokenApiResponse = await response.json();\r\n\r\n if (result.status !== 1 || !result.data?.length) {\r\n throw new ApiError(\"Whitelabel token not found\", \"TOKEN_NOT_FOUND\", 404);\r\n }\r\n\r\n return result.data[0];\r\n }\r\n\r\n async getTokenByDomain(hostname: string): Promise<WhitelabelTokenData> {\r\n hostname = normalizeHostname(process.env.WHITELABEL_DOMAIN || hostname)
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/whitelabel/services/whitelabel.service.ts"],"sourcesContent":["import greatCache from \"@greatapps/cache\";\r\nimport { ApiError } from \"../../../infra/api/types\";\r\nimport { WhitelabelTokenApiResponse, WhitelabelTokenData } from \"../schema\";\r\nimport { normalizeHostname } from \"../utils/normalize-hostname\";\r\n\r\nclass WhitelabelService {\r\n private getApiUrl(): string {\r\n const apiUrl = process.env.GAPPS_R3_API_URL;\r\n if (!apiUrl) {\r\n throw new ApiError(\r\n \"GAPPS_R3_API_URL not configured\",\r\n \"CONFIG_ERROR\",\r\n 500,\r\n );\r\n }\r\n return apiUrl;\r\n }\r\n\r\n private getToken(): string {\r\n const token = process.env.WHITELABEL_TOKEN_MASTER;\r\n if (!token) {\r\n throw new ApiError(\r\n \"WHITELABEL_TOKEN_MASTER not configured\",\r\n \"CONFIG_ERROR\",\r\n 500,\r\n );\r\n }\r\n return token;\r\n }\r\n\r\n private createCache() {\r\n return new greatCache({\r\n service: \"whitelabel-service\",\r\n version: \"1.0\",\r\n domain: \"whitelabel-cache.greatapps.com.br\",\r\n ambient: process.env.NODE_ENV || \"development\",\r\n });\r\n }\r\n\r\n private getCacheKey(hostname: string): string {\r\n return `whitelabel-token-${hostname}`;\r\n }\r\n\r\n private async fetchFromApi(hostname: string): Promise<WhitelabelTokenData> {\r\n const apiUrl = this.getApiUrl();\r\n const whitelabelMasterToken = this.getToken();\r\n const url = `${apiUrl}/v1/pt-br/1/whitelabel/${hostname}/token`;\r\n\r\n console.log(\"[WhitelabelService] Fetching token for domain\", { url });\r\n\r\n const response = await fetch(url, {\r\n method: \"GET\",\r\n headers: {\r\n authorization: whitelabelMasterToken,\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n console.error(\"[WhitelabelService] Failed to fetch whitelabel token\", {\r\n response,\r\n });\r\n throw new ApiError(\r\n `Failed to fetch whitelabel token: ${response.status}`,\r\n \"FETCH_ERROR\",\r\n response.status,\r\n );\r\n }\r\n\r\n const result: WhitelabelTokenApiResponse = await response.json();\r\n\r\n if (result.status !== 1 || !result.data?.length) {\r\n throw new ApiError(\"Whitelabel token not found\", \"TOKEN_NOT_FOUND\", 404);\r\n }\r\n\r\n return result.data[0];\r\n }\r\n\r\n async getTokenByDomain(hostname: string): Promise<WhitelabelTokenData> {\r\n hostname = `.${normalizeHostname(process.env.WHITELABEL_DOMAIN || hostname)}`;\r\n\r\n const cache = this.createCache();\r\n const cacheKey = this.getCacheKey(hostname);\r\n\r\n const cachedData = await cache.select(cacheKey);\r\n\r\n if (cachedData.status == 1 && \"data\" in cachedData && cachedData.data) {\r\n console.log(\"[WhitelabelService] Cache hit for domain\", { hostname });\r\n return JSON.parse(cachedData.data) as WhitelabelTokenData;\r\n }\r\n\r\n const data = await this.fetchFromApi(hostname);\r\n\r\n await cache.insert(cacheKey, JSON.stringify(data), 604800);\r\n\r\n return data;\r\n }\r\n\r\n async getTokenByWhitelabelId(idWl: number): Promise<string> {\r\n const apiUrl = this.getApiUrl();\r\n const masterToken = this.getToken();\r\n const url = `${apiUrl}/v1/pt-br/${idWl}/tokens?limit=1&page=1&sort=id:desc`;\r\n\r\n const response = await fetch(url, {\r\n method: \"GET\",\r\n headers: { authorization: masterToken },\r\n });\r\n\r\n console.debug(\"[WhitelabelService] Fetching token by whitelabel ID\", {\r\n url,\r\n config: {\r\n method: \"GET\",\r\n headers: { authorization: masterToken },\r\n },\r\n });\r\n\r\n \r\n\r\n if (!response.ok) {\r\n throw new ApiError(\r\n `Failed to fetch whitelabel token: ${response.status}`,\r\n \"WL_TOKEN_NOT_FOUND\",\r\n response.status,\r\n );\r\n }\r\n\r\n const result: WhitelabelTokenApiResponse = await response.json();\r\n\r\n if (result.status !== 1 || !result.data?.length) {\r\n throw new ApiError(\r\n \"Token do whitelabel não encontrado\",\r\n \"WL_TOKEN_NOT_FOUND\",\r\n 404,\r\n );\r\n }\r\n\r\n return result.data[0].token;\r\n }\r\n\r\n async revalidateByDomain(hostname: string): Promise<WhitelabelTokenData> {\r\n hostname = `.${normalizeHostname(process.env.WHITELABEL_DOMAIN || hostname)}`;\r\n\r\n const cache = this.createCache();\r\n const cacheKey = this.getCacheKey(hostname);\r\n\r\n console.log(\"[WhitelabelService] Revalidating cache for domain\", {\r\n hostname,\r\n });\r\n\r\n await cache.delete(cacheKey);\r\n\r\n const data = await this.fetchFromApi(hostname);\r\n\r\n await cache.insert(cacheKey, JSON.stringify(data), 604800);\r\n\r\n console.log(\"[WhitelabelService] Cache revalidated for domain\", {\r\n hostname,\r\n });\r\n\r\n return data;\r\n }\r\n}\r\n\r\nexport const whitelabelService = new WhitelabelService();\r\n"],"mappings":"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","names":[]}
|
|
@@ -15,7 +15,10 @@ import {
|
|
|
15
15
|
import { useLogin } from "../modules/auth/hooks/login.hook";
|
|
16
16
|
import { useRegister } from "../modules/auth/hooks/register.hook";
|
|
17
17
|
import { useLogout } from "../modules/auth/hooks/logout.hook";
|
|
18
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
useCurrentAccount,
|
|
20
|
+
ACCOUNT_QUERY_KEY
|
|
21
|
+
} from "../modules/accounts/hooks/current-account.hook";
|
|
19
22
|
import { useWhitelabelUrls } from "./whitelabel.provider";
|
|
20
23
|
const AuthContext = createContext(
|
|
21
24
|
void 0
|
|
@@ -63,18 +66,15 @@ function AuthProvider({ children }) {
|
|
|
63
66
|
[queryClient, setUserData]
|
|
64
67
|
);
|
|
65
68
|
const resolveLogoutRedirect = useCallback(() => {
|
|
66
|
-
if (typeof window === "undefined") {
|
|
67
|
-
return "/login";
|
|
68
|
-
}
|
|
69
69
|
try {
|
|
70
70
|
const currentOrigin = window.location.origin;
|
|
71
71
|
const pagesOrigin = pagesUrl ? new URL(pagesUrl).origin : "";
|
|
72
72
|
if (pagesOrigin && currentOrigin === pagesOrigin) {
|
|
73
|
-
return accountsUrl
|
|
73
|
+
return `${accountsUrl}/login?redirect=${encodeURIComponent(pagesUrl)}`;
|
|
74
74
|
}
|
|
75
75
|
} catch {
|
|
76
76
|
}
|
|
77
|
-
return
|
|
77
|
+
return `${accountsUrl}/login?redirect=${encodeURIComponent(pagesUrl || "/")}`;
|
|
78
78
|
}, [accountsUrl, pagesUrl]);
|
|
79
79
|
const logout = useCallback(async () => {
|
|
80
80
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/providers/auth.provider.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport {\r\n createContext,\r\n ReactNode,\r\n useCallback,\r\n useContext,\r\n useMemo,\r\n} from \"react\";\r\nimport { useQueryClient } from \"@tanstack/react-query\";\r\nimport {\n useUserQuery,\n useSetUserData,\n useUserValidateSession,\n} from \"../modules/auth/hooks/useUserQuery\";\nimport { useLogin } from \"../modules/auth/hooks/login.hook\";\r\nimport { useRegister } from \"../modules/auth/hooks/register.hook\";\r\nimport { useLogout } from \"../modules/auth/hooks/logout.hook\";\r\nimport {\n AuthState,\n LoginRequest,\n RegisterRequest,\n} from \"../modules/auth/schema\";\n\r\nexport type LoginResult =\n | { result: \"success\" }\n | { result: \"two_factor_required\"; cookie: string }\n | { result: \"error\"; message: string };\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/providers/auth.provider.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport {\r\n createContext,\r\n ReactNode,\r\n useCallback,\r\n useContext,\r\n useMemo,\r\n} from \"react\";\r\nimport { useQueryClient } from \"@tanstack/react-query\";\r\nimport {\r\n useUserQuery,\r\n useSetUserData,\r\n useUserValidateSession,\r\n} from \"../modules/auth/hooks/useUserQuery\";\r\nimport { useLogin } from \"../modules/auth/hooks/login.hook\";\r\nimport { useRegister } from \"../modules/auth/hooks/register.hook\";\r\nimport { useLogout } from \"../modules/auth/hooks/logout.hook\";\r\nimport {\r\n AuthState,\r\n LoginRequest,\r\n RegisterRequest,\r\n} from \"../modules/auth/schema\";\r\n\r\nexport type LoginResult =\r\n | { result: \"success\" }\r\n | { result: \"two_factor_required\"; cookie: string }\r\n | { result: \"error\"; message: string };\r\nimport {\r\n useCurrentAccount,\r\n ACCOUNT_QUERY_KEY,\r\n} from \"../modules/accounts/hooks/current-account.hook\";\r\nimport { useWhitelabelUrls } from \"./whitelabel.provider\";\r\n\r\ninterface AuthContextProps extends AuthState {\r\n login: (credentials: LoginRequest) => Promise<LoginResult>;\r\n register: (data: RegisterRequest) => Promise<void>;\r\n logout: () => Promise<void>;\r\n}\r\n\r\nexport const AuthContext = createContext<AuthContextProps | undefined>(\r\n undefined,\r\n);\r\n\r\ninterface AuthProviderProps {\r\n children: ReactNode;\r\n}\r\n\r\nexport function AuthProvider({ children }: AuthProviderProps) {\r\n const { data: user, isLoading: isQueryLoading } = useUserQuery();\r\n const { data: account, isLoading: isAccountLoading } = useCurrentAccount();\r\n const { isLoading: isSessionLoading } = useUserValidateSession();\r\n\r\n const queryClient = useQueryClient();\r\n const setUserData = useSetUserData();\r\n const { accountsUrl, pagesUrl } = useWhitelabelUrls();\r\n\r\n const { mutateAsync: loginMutate, isPending: isLogging } = useLogin();\r\n const { mutateAsync: registerMutate, isPending: isRegistering } =\r\n useRegister();\r\n const { mutateAsync: logoutMutate, isPending: isLoggingOut } = useLogout();\r\n\r\n const isAuthenticated = !!user;\r\n const isLoading =\r\n isLogging ||\r\n isRegistering ||\r\n isLoggingOut ||\r\n isQueryLoading ||\r\n isAccountLoading ||\r\n isSessionLoading;\r\n\r\n const login = useCallback(\r\n async (credentials: LoginRequest): Promise<LoginResult> => {\r\n try {\r\n const data = await loginMutate(credentials);\r\n\r\n if (data.result === \"two_factor_required\") {\r\n return { result: \"two_factor_required\", cookie: data.cookie };\r\n }\r\n\r\n queryClient.clear();\r\n setUserData(data.user);\r\n queryClient.setQueryData(ACCOUNT_QUERY_KEY, data.account);\r\n\r\n return { result: \"success\" };\r\n } catch (error) {\r\n const message =\r\n error instanceof Error\r\n ? error.message\r\n : \"Ocorreu um erro ao fazer login. Tente novamente.\";\r\n return { result: \"error\", message };\r\n }\r\n },\r\n [queryClient, setUserData],\r\n );\r\n\r\n const register = useCallback(\r\n async (data: RegisterRequest): Promise<void> => {\r\n await registerMutate(data, {\r\n onSuccess: (data) => {\r\n queryClient.clear();\r\n setUserData(data.user);\r\n queryClient.setQueryData(ACCOUNT_QUERY_KEY, data.account);\r\n },\r\n });\r\n },\r\n [queryClient, setUserData],\r\n );\r\n\r\n const resolveLogoutRedirect = useCallback(() => {\r\n try {\r\n const currentOrigin = window.location.origin;\r\n const pagesOrigin = pagesUrl ? new URL(pagesUrl).origin : \"\";\r\n\r\n if (pagesOrigin && currentOrigin === pagesOrigin) {\r\n return `${accountsUrl}/login?redirect=${encodeURIComponent(pagesUrl)}`;\r\n }\r\n } catch {\r\n // fallback below\r\n }\r\n\r\n return `${accountsUrl}/login?redirect=${encodeURIComponent(pagesUrl || \"/\")}`;\r\n }, [accountsUrl, pagesUrl]);\r\n\r\n const logout = useCallback(async (): Promise<void> => {\r\n try {\r\n await logoutMutate(undefined);\r\n } catch {\r\n // cookie já removido no servidor mesmo se a API falhou\r\n } finally {\r\n queryClient.clear();\r\n window.location.assign(resolveLogoutRedirect());\r\n }\r\n }, [queryClient, logoutMutate, resolveLogoutRedirect]);\r\n\r\n const value: AuthContextProps = useMemo(\r\n () => ({\r\n user: user ?? null,\r\n account: account ?? null,\r\n isAuthenticated,\r\n isLoading,\r\n login,\r\n register,\r\n logout,\r\n }),\r\n [user, account, isAuthenticated, isLoading, login, register, logout],\r\n );\r\n\r\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\r\n}\r\n\r\nexport function useAuth(): AuthContextProps {\r\n const context = useContext(AuthContext);\r\n\r\n if (context === undefined) {\r\n throw new Error(\"useAuth deve ser usado dentro de um AuthProvider\");\r\n }\r\n\r\n return context;\r\n}\r\n"],"mappings":"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","names":["data"]}
|
package/package.json
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
export interface GeneralStyleJson {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
primary_color: string;
|
|
3
|
+
hover_color: string;
|
|
4
|
+
link_color: string;
|
|
5
5
|
}
|
|
6
6
|
|
|
7
7
|
export interface PageStyleJson {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
8
|
+
main_title: string | null;
|
|
9
|
+
main_title_color: string | null;
|
|
10
|
+
background_color: string | null;
|
|
11
|
+
image: string | null;
|
|
12
|
+
secondary_title: string | null;
|
|
13
|
+
secondary_title_color: string | null;
|
|
14
|
+
description: string | null;
|
|
15
|
+
description_color: string | null;
|
|
16
|
+
show_image: boolean;
|
|
17
|
+
show_secondary_title: boolean;
|
|
18
|
+
show_description: boolean;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
export interface DashboardStyleJson {
|
|
22
|
-
|
|
22
|
+
background_color: string | null;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
export interface WhitelabelData {
|
|
@@ -76,7 +76,7 @@ class WhitelabelService {
|
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
async getTokenByDomain(hostname: string): Promise<WhitelabelTokenData> {
|
|
79
|
-
hostname = normalizeHostname(process.env.WHITELABEL_DOMAIN || hostname)
|
|
79
|
+
hostname = `.${normalizeHostname(process.env.WHITELABEL_DOMAIN || hostname)}`;
|
|
80
80
|
|
|
81
81
|
const cache = this.createCache();
|
|
82
82
|
const cacheKey = this.getCacheKey(hostname);
|
|
@@ -137,7 +137,7 @@ class WhitelabelService {
|
|
|
137
137
|
}
|
|
138
138
|
|
|
139
139
|
async revalidateByDomain(hostname: string): Promise<WhitelabelTokenData> {
|
|
140
|
-
hostname = normalizeHostname(process.env.WHITELABEL_DOMAIN || hostname)
|
|
140
|
+
hostname = `.${normalizeHostname(process.env.WHITELABEL_DOMAIN || hostname)}`;
|
|
141
141
|
|
|
142
142
|
const cache = this.createCache();
|
|
143
143
|
const cacheKey = this.getCacheKey(hostname);
|
|
@@ -8,35 +8,38 @@ import {
|
|
|
8
8
|
useMemo,
|
|
9
9
|
} from "react";
|
|
10
10
|
import { useQueryClient } from "@tanstack/react-query";
|
|
11
|
-
import {
|
|
12
|
-
useUserQuery,
|
|
13
|
-
useSetUserData,
|
|
14
|
-
useUserValidateSession,
|
|
15
|
-
} from "../modules/auth/hooks/useUserQuery";
|
|
11
|
+
import {
|
|
12
|
+
useUserQuery,
|
|
13
|
+
useSetUserData,
|
|
14
|
+
useUserValidateSession,
|
|
15
|
+
} from "../modules/auth/hooks/useUserQuery";
|
|
16
16
|
import { useLogin } from "../modules/auth/hooks/login.hook";
|
|
17
17
|
import { useRegister } from "../modules/auth/hooks/register.hook";
|
|
18
18
|
import { useLogout } from "../modules/auth/hooks/logout.hook";
|
|
19
|
-
import {
|
|
20
|
-
AuthState,
|
|
21
|
-
LoginRequest,
|
|
22
|
-
RegisterRequest,
|
|
23
|
-
} from "../modules/auth/schema";
|
|
24
|
-
|
|
25
|
-
export type LoginResult =
|
|
26
|
-
| { result: "success" }
|
|
27
|
-
| { result: "two_factor_required"; cookie: string }
|
|
28
|
-
| { result: "error"; message: string };
|
|
29
|
-
import {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
19
|
+
import {
|
|
20
|
+
AuthState,
|
|
21
|
+
LoginRequest,
|
|
22
|
+
RegisterRequest,
|
|
23
|
+
} from "../modules/auth/schema";
|
|
24
|
+
|
|
25
|
+
export type LoginResult =
|
|
26
|
+
| { result: "success" }
|
|
27
|
+
| { result: "two_factor_required"; cookie: string }
|
|
28
|
+
| { result: "error"; message: string };
|
|
29
|
+
import {
|
|
30
|
+
useCurrentAccount,
|
|
31
|
+
ACCOUNT_QUERY_KEY,
|
|
32
|
+
} from "../modules/accounts/hooks/current-account.hook";
|
|
33
|
+
import { useWhitelabelUrls } from "./whitelabel.provider";
|
|
34
|
+
|
|
35
|
+
interface AuthContextProps extends AuthState {
|
|
36
|
+
login: (credentials: LoginRequest) => Promise<LoginResult>;
|
|
37
|
+
register: (data: RegisterRequest) => Promise<void>;
|
|
38
|
+
logout: () => Promise<void>;
|
|
39
|
+
}
|
|
37
40
|
|
|
38
41
|
export const AuthContext = createContext<AuthContextProps | undefined>(
|
|
39
|
-
undefined
|
|
42
|
+
undefined,
|
|
40
43
|
);
|
|
41
44
|
|
|
42
45
|
interface AuthProviderProps {
|
|
@@ -48,11 +51,11 @@ export function AuthProvider({ children }: AuthProviderProps) {
|
|
|
48
51
|
const { data: account, isLoading: isAccountLoading } = useCurrentAccount();
|
|
49
52
|
const { isLoading: isSessionLoading } = useUserValidateSession();
|
|
50
53
|
|
|
51
|
-
const queryClient = useQueryClient();
|
|
52
|
-
const setUserData = useSetUserData();
|
|
53
|
-
const { accountsUrl, pagesUrl } = useWhitelabelUrls();
|
|
54
|
+
const queryClient = useQueryClient();
|
|
55
|
+
const setUserData = useSetUserData();
|
|
56
|
+
const { accountsUrl, pagesUrl } = useWhitelabelUrls();
|
|
54
57
|
|
|
55
|
-
const { mutateAsync: loginMutate, isPending: isLogging } = useLogin();
|
|
58
|
+
const { mutateAsync: loginMutate, isPending: isLogging } = useLogin();
|
|
56
59
|
const { mutateAsync: registerMutate, isPending: isRegistering } =
|
|
57
60
|
useRegister();
|
|
58
61
|
const { mutateAsync: logoutMutate, isPending: isLoggingOut } = useLogout();
|
|
@@ -82,11 +85,13 @@ export function AuthProvider({ children }: AuthProviderProps) {
|
|
|
82
85
|
return { result: "success" };
|
|
83
86
|
} catch (error) {
|
|
84
87
|
const message =
|
|
85
|
-
error instanceof Error
|
|
88
|
+
error instanceof Error
|
|
89
|
+
? error.message
|
|
90
|
+
: "Ocorreu um erro ao fazer login. Tente novamente.";
|
|
86
91
|
return { result: "error", message };
|
|
87
92
|
}
|
|
88
93
|
},
|
|
89
|
-
[queryClient, setUserData]
|
|
94
|
+
[queryClient, setUserData],
|
|
90
95
|
);
|
|
91
96
|
|
|
92
97
|
const register = useCallback(
|
|
@@ -99,38 +104,34 @@ export function AuthProvider({ children }: AuthProviderProps) {
|
|
|
99
104
|
},
|
|
100
105
|
});
|
|
101
106
|
},
|
|
102
|
-
[queryClient, setUserData]
|
|
107
|
+
[queryClient, setUserData],
|
|
103
108
|
);
|
|
104
109
|
|
|
105
|
-
const resolveLogoutRedirect = useCallback(() => {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
queryClient.clear();
|
|
131
|
-
window.location.assign(resolveLogoutRedirect());
|
|
132
|
-
}
|
|
133
|
-
}, [queryClient, logoutMutate, resolveLogoutRedirect]);
|
|
110
|
+
const resolveLogoutRedirect = useCallback(() => {
|
|
111
|
+
try {
|
|
112
|
+
const currentOrigin = window.location.origin;
|
|
113
|
+
const pagesOrigin = pagesUrl ? new URL(pagesUrl).origin : "";
|
|
114
|
+
|
|
115
|
+
if (pagesOrigin && currentOrigin === pagesOrigin) {
|
|
116
|
+
return `${accountsUrl}/login?redirect=${encodeURIComponent(pagesUrl)}`;
|
|
117
|
+
}
|
|
118
|
+
} catch {
|
|
119
|
+
// fallback below
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return `${accountsUrl}/login?redirect=${encodeURIComponent(pagesUrl || "/")}`;
|
|
123
|
+
}, [accountsUrl, pagesUrl]);
|
|
124
|
+
|
|
125
|
+
const logout = useCallback(async (): Promise<void> => {
|
|
126
|
+
try {
|
|
127
|
+
await logoutMutate(undefined);
|
|
128
|
+
} catch {
|
|
129
|
+
// cookie já removido no servidor mesmo se a API falhou
|
|
130
|
+
} finally {
|
|
131
|
+
queryClient.clear();
|
|
132
|
+
window.location.assign(resolveLogoutRedirect());
|
|
133
|
+
}
|
|
134
|
+
}, [queryClient, logoutMutate, resolveLogoutRedirect]);
|
|
134
135
|
|
|
135
136
|
const value: AuthContextProps = useMemo(
|
|
136
137
|
() => ({
|
|
@@ -142,7 +143,7 @@ export function AuthProvider({ children }: AuthProviderProps) {
|
|
|
142
143
|
register,
|
|
143
144
|
logout,
|
|
144
145
|
}),
|
|
145
|
-
[user, account, isAuthenticated, isLoading, login, register, logout]
|
|
146
|
+
[user, account, isAuthenticated, isLoading, login, register, logout],
|
|
146
147
|
);
|
|
147
148
|
|
|
148
149
|
return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
//# sourceMappingURL=styles-schema.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
// Espelha gapps-r3-admin/src/modules/styles/types.ts (WhitelabelStylesRow)
|
|
2
|
-
|
|
3
|
-
export interface GeneralStyleJson {
|
|
4
|
-
nome_empresa: string;
|
|
5
|
-
favicon: string | null;
|
|
6
|
-
logo: string | null;
|
|
7
|
-
cor_principal: string;
|
|
8
|
-
cor_hover: string;
|
|
9
|
-
cor_link: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export interface PageStyleJson {
|
|
13
|
-
titulo_principal: string | null;
|
|
14
|
-
cor_titulo_principal: string | null;
|
|
15
|
-
cor_fundo: string | null;
|
|
16
|
-
imagem: string | null;
|
|
17
|
-
titulo_secundario: string | null;
|
|
18
|
-
cor_titulo_secundario: string | null;
|
|
19
|
-
descricao: string | null;
|
|
20
|
-
cor_descricao: string | null;
|
|
21
|
-
toggle_imagem: boolean;
|
|
22
|
-
toggle_titulo_secundario: boolean;
|
|
23
|
-
toggle_descricao: boolean;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface DashboardStyleJson {
|
|
27
|
-
cor_fundo: string | null;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface WhitelabelStylesData {
|
|
31
|
-
id: number;
|
|
32
|
-
id_wl: number;
|
|
33
|
-
general: GeneralStyleJson | null;
|
|
34
|
-
signin_page: PageStyleJson | null;
|
|
35
|
-
signup_page: PageStyleJson | null;
|
|
36
|
-
dashboard: DashboardStyleJson | null;
|
|
37
|
-
}
|