@orbe-agro/client-core 5.6.295 → 5.6.296
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/@ecme/auth/AuthContext.js.map +1 -1
- package/dist/@ecme/auth/AuthProvider.js +23 -4
- package/dist/@ecme/auth/AuthProvider.js.map +1 -1
- package/dist/@ecme/components/template/Footer.js +1 -1
- package/dist/@ecme/constants/auth.constant.js +21 -0
- package/dist/@ecme/constants/auth.constant.js.map +1 -0
- package/dist/@ecme/constants/index.js +4 -0
- package/dist/@ecme/constants/index.js.map +1 -1
- package/dist/@ecme/index.js +4 -0
- package/dist/@ecme/index.js.map +1 -1
- package/dist/@ecme/views/auth/SignIn/SignIn.js +0 -6
- package/dist/@ecme/views/auth/SignIn/SignIn.js.map +1 -1
- package/dist/@ecme/views/auth/SignIn/components/SignInForm.js +8 -2
- package/dist/@ecme/views/auth/SignIn/components/SignInForm.js.map +1 -1
- package/dist/@ecme/views/guide/Documentations/components/Authentication.js +28 -2
- package/dist/@ecme/views/guide/Documentations/components/Authentication.js.map +1 -1
- package/dist/@types/@ecme/auth/AuthContext.d.ts +1 -1
- package/dist/@types/@ecme/auth/AuthContext.d.ts.map +1 -1
- package/dist/@types/@ecme/auth/AuthProvider.d.ts.map +1 -1
- package/dist/@types/@ecme/auth/useAuth.d.ts +1 -1
- package/dist/@types/@ecme/auth/useAuth.d.ts.map +1 -1
- package/dist/@types/@ecme/constants/auth.constant.d.ts +4 -0
- package/dist/@types/@ecme/constants/auth.constant.d.ts.map +1 -0
- package/dist/@types/@ecme/constants/index.d.ts +1 -0
- package/dist/@types/@ecme/constants/index.d.ts.map +1 -1
- package/dist/@types/@ecme/views/auth/SignIn/SignIn.d.ts.map +1 -1
- package/dist/@types/@ecme/views/auth/SignIn/components/SignInForm.d.ts +0 -1
- package/dist/@types/@ecme/views/auth/SignIn/components/SignInForm.d.ts.map +1 -1
- package/dist/@types/@ecme/views/guide/Documentations/components/Authentication.d.ts.map +1 -1
- package/dist/@types/base/hooks/useIdleTimeout.d.ts +1 -1
- package/dist/@types/base/hooks/useIdleTimeout.d.ts.map +1 -1
- package/dist/base/hooks/useIdleTimeout.js +2 -1
- package/dist/base/hooks/useIdleTimeout.js.map +1 -1
- package/lib/@ecme/auth/AuthContext.ts +1 -1
- package/lib/@ecme/auth/AuthProvider.tsx +37 -4
- package/lib/@ecme/constants/auth.constant.ts +19 -0
- package/lib/@ecme/constants/index.ts +1 -0
- package/lib/@ecme/views/auth/SignIn/SignIn.tsx +0 -10
- package/lib/@ecme/views/auth/SignIn/components/SignInForm.tsx +8 -3
- package/lib/@ecme/views/guide/Documentations/components/Authentication.tsx +25 -2
- package/lib/base/hooks/useIdleTimeout.ts +6 -2
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthContext.js","sources":["../../../lib/@ecme/auth/AuthContext.ts"],"sourcesContent":["import { createContext } from \"react\";\nimport type {\n SignInCredential,\n SignUpCredential,\n AuthResult,\n User,\n OauthSignInCallbackPayload,\n} from \"@/@types/auth\";\n\ntype Auth = {\n authenticated: boolean;\n user: User;\n signIn: (values: SignInCredential) => AuthResult;\n signUp: (values: SignUpCredential) => AuthResult;\n signOut: () => void;\n oAuthSignIn: (\n callback: (payload: OauthSignInCallbackPayload) => void\n ) => void;\n updateUserSession: (newUserData: Partial<User>) => void;\n};\n\nconst defaultFunctionPlaceHolder = async (): AuthResult => {\n await new Promise((resolve) => setTimeout(resolve, 0));\n return {\n status: \"\",\n message: \"\",\n };\n};\n\nconst defaultOAuthSignInPlaceHolder = (\n callback: (payload: OauthSignInCallbackPayload) => void\n): void => {\n callback({\n onSignIn: () => {},\n redirect: () => {},\n });\n};\n\nconst defaultUpdateUserSessionPlaceHolder = (\n newUserData: Partial<User>\n): void => {\n newUserData;\n};\n\nconst AuthContext = createContext<Auth>({\n authenticated: false,\n user: {},\n signIn: async () => defaultFunctionPlaceHolder(),\n signUp: async () => defaultFunctionPlaceHolder(),\n signOut: () => {},\n oAuthSignIn: defaultOAuthSignInPlaceHolder,\n updateUserSession: defaultUpdateUserSessionPlaceHolder,\n});\n\nexport default AuthContext;\n"],"names":[],"mappings":";AAqBA,MAAM,6BAA6B,YAAwB;AACzD,QAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,CAAC,CAAC;AACrD,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,SAAS;AAAA,EAAA;AAEb;AAEA,MAAM,gCAAgC,CACpC,aACS;AACT,WAAS;AAAA,IACP,UAAU,MAAM;AAAA,IAAC;AAAA,IACjB,UAAU,MAAM;AAAA,IAAC;AAAA,EAAA,CAClB;AACH;AAEA,MAAM,sCAAsC,CAC1C,gBACS;AACT;AACF;AAEA,MAAM,cAAc,cAAoB;AAAA,EACtC,eAAe;AAAA,EACf,MAAM,CAAA;AAAA,EACN,QAAQ,YAAY,2BAAA;AAAA,EACpB,QAAQ,YAAY,2BAAA;AAAA,EACpB,SAAS,MAAM;AAAA,EAAC;AAAA,EAChB,aAAa;AAAA,EACb,mBAAmB;AACrB,CAAC;"}
|
|
1
|
+
{"version":3,"file":"AuthContext.js","sources":["../../../lib/@ecme/auth/AuthContext.ts"],"sourcesContent":["import { createContext } from \"react\";\nimport type {\n SignInCredential,\n SignUpCredential,\n AuthResult,\n User,\n OauthSignInCallbackPayload,\n} from \"@/@types/auth\";\n\ntype Auth = {\n authenticated: boolean;\n user: User;\n signIn: (values: SignInCredential) => AuthResult;\n signUp: (values: SignUpCredential) => AuthResult;\n signOut: (redirectUrl?: string) => void;\n oAuthSignIn: (\n callback: (payload: OauthSignInCallbackPayload) => void\n ) => void;\n updateUserSession: (newUserData: Partial<User>) => void;\n};\n\nconst defaultFunctionPlaceHolder = async (): AuthResult => {\n await new Promise((resolve) => setTimeout(resolve, 0));\n return {\n status: \"\",\n message: \"\",\n };\n};\n\nconst defaultOAuthSignInPlaceHolder = (\n callback: (payload: OauthSignInCallbackPayload) => void\n): void => {\n callback({\n onSignIn: () => {},\n redirect: () => {},\n });\n};\n\nconst defaultUpdateUserSessionPlaceHolder = (\n newUserData: Partial<User>\n): void => {\n newUserData;\n};\n\nconst AuthContext = createContext<Auth>({\n authenticated: false,\n user: {},\n signIn: async () => defaultFunctionPlaceHolder(),\n signUp: async () => defaultFunctionPlaceHolder(),\n signOut: () => {},\n oAuthSignIn: defaultOAuthSignInPlaceHolder,\n updateUserSession: defaultUpdateUserSessionPlaceHolder,\n});\n\nexport default AuthContext;\n"],"names":[],"mappings":";AAqBA,MAAM,6BAA6B,YAAwB;AACzD,QAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,CAAC,CAAC;AACrD,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,SAAS;AAAA,EAAA;AAEb;AAEA,MAAM,gCAAgC,CACpC,aACS;AACT,WAAS;AAAA,IACP,UAAU,MAAM;AAAA,IAAC;AAAA,IACjB,UAAU,MAAM;AAAA,IAAC;AAAA,EAAA,CAClB;AACH;AAEA,MAAM,sCAAsC,CAC1C,gBACS;AACT;AACF;AAEA,MAAM,cAAc,cAAoB;AAAA,EACtC,eAAe;AAAA,EACf,MAAM,CAAA;AAAA,EACN,QAAQ,YAAY,2BAAA;AAAA,EACpB,QAAQ,YAAY,2BAAA;AAAA,EACpB,SAAS,MAAM;AAAA,EAAC;AAAA,EAChB,aAAa;AAAA,EACb,mBAAmB;AACrB,CAAC;"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx, Fragment, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import appConfig from "../configs/app.config.js";
|
|
3
3
|
import { REDIRECT_URL_KEY } from "../constants/app.constant.js";
|
|
4
|
+
import { SIGN_IN_NETWORK_ERROR_MESSAGE, SIGN_IN_DEFAULT_ERROR_MESSAGE, SIGN_IN_ERROR_MESSAGES_BY_STATUS } from "../constants/auth.constant.js";
|
|
4
5
|
import { apiSignIn, apiSignUp, apiSignOut } from "../services/AuthService.js";
|
|
5
6
|
import { useSessionUser, useToken } from "../store/authStore.js";
|
|
6
7
|
import "../../base/services/index.js";
|
|
@@ -20,6 +21,13 @@ const IsolatedNavigator = ({ ref }) => {
|
|
|
20
21
|
}, [navigate]);
|
|
21
22
|
return /* @__PURE__ */ jsx(Fragment, {});
|
|
22
23
|
};
|
|
24
|
+
const getSignInErrorMessage = (error) => {
|
|
25
|
+
const response = error?.response;
|
|
26
|
+
if (!response) {
|
|
27
|
+
return error?.request ? SIGN_IN_NETWORK_ERROR_MESSAGE : SIGN_IN_DEFAULT_ERROR_MESSAGE;
|
|
28
|
+
}
|
|
29
|
+
return SIGN_IN_ERROR_MESSAGES_BY_STATUS[response.status] || response.data?.message || SIGN_IN_DEFAULT_ERROR_MESSAGE;
|
|
30
|
+
};
|
|
23
31
|
function AuthProvider({ children }) {
|
|
24
32
|
const signedIn = useSessionUser((state) => state.session.signedIn);
|
|
25
33
|
const user = useSessionUser((state) => state.user);
|
|
@@ -122,13 +130,13 @@ function AuthProvider({ children }) {
|
|
|
122
130
|
}
|
|
123
131
|
return {
|
|
124
132
|
status: "failed",
|
|
125
|
-
message:
|
|
133
|
+
message: SIGN_IN_DEFAULT_ERROR_MESSAGE
|
|
126
134
|
};
|
|
127
135
|
} catch (errors) {
|
|
128
136
|
console.error("ERRO NA CHAMADA DA API:", errors);
|
|
129
137
|
return {
|
|
130
138
|
status: "failed",
|
|
131
|
-
message: errors
|
|
139
|
+
message: getSignInErrorMessage(errors)
|
|
132
140
|
};
|
|
133
141
|
}
|
|
134
142
|
};
|
|
@@ -161,12 +169,23 @@ function AuthProvider({ children }) {
|
|
|
161
169
|
};
|
|
162
170
|
}
|
|
163
171
|
};
|
|
164
|
-
const signOut = async () => {
|
|
172
|
+
const signOut = async (redirectUrl) => {
|
|
165
173
|
try {
|
|
166
174
|
await apiSignOut();
|
|
167
175
|
} finally {
|
|
168
176
|
handleSignOut();
|
|
169
|
-
|
|
177
|
+
if (redirectUrl) {
|
|
178
|
+
const params = new URLSearchParams({
|
|
179
|
+
[REDIRECT_URL_KEY]: redirectUrl
|
|
180
|
+
});
|
|
181
|
+
navigatorRef.current?.navigate(
|
|
182
|
+
`${appConfig.unAuthenticatedEntryPath}?${params.toString()}`
|
|
183
|
+
);
|
|
184
|
+
} else {
|
|
185
|
+
navigatorRef.current?.navigate(
|
|
186
|
+
appConfig.unAuthenticatedEntryPath
|
|
187
|
+
);
|
|
188
|
+
}
|
|
170
189
|
}
|
|
171
190
|
};
|
|
172
191
|
const oAuthSignIn = (callback) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthProvider.js","sources":["../../../lib/@ecme/auth/AuthProvider.tsx"],"sourcesContent":["import type {\n AuthResult,\n OauthSignInCallbackPayload,\n SignInCredential,\n SignInResponse,\n SignUpCredential,\n Token,\n} from '@/@types/auth'\nimport appConfig from '@/configs/app.config'\nimport { REDIRECT_URL_KEY } from '@/constants/app.constant'\nimport { apiSignIn, apiSignOut, apiSignUp } from '@/services/AuthService'\nimport { useSessionUser, useToken } from '@/store/authStore'\nimport {\n apiFetchUserFuncionalidadesDetail,\n apiFetchUserVinculosUsuario,\n apiFindUserById,\n} from '@base/services'\nimport {\n TFuncionalidadeMap,\n useSessionUserDataStore,\n} from '@base/store/auth/sessionUserData'\nimport { mapFuncionalidadesByPath } from '@base/utils/modules/dm/funcionalidades'\nimport { ReactNode, Ref, useImperativeHandle, useRef } from 'react'\nimport { NavigateFunction, useNavigate } from 'react-router-dom'\nimport AuthContext from './AuthContext'\n\ntype AuthProviderProps = { children: ReactNode }\n\nexport type IsolatedNavigatorRef = {\n navigate: NavigateFunction\n}\n\nconst IsolatedNavigator = ({ ref }: { ref: Ref<IsolatedNavigatorRef> }) => {\n const navigate = useNavigate()\n\n useImperativeHandle(ref, () => {\n return {\n navigate,\n }\n }, [navigate])\n\n return <></>\n}\n\nfunction AuthProvider({ children }: AuthProviderProps) {\n const signedIn = useSessionUser((state) => state.session.signedIn)\n const user = useSessionUser((state) => state.user)\n const setUser = useSessionUser((state) => state.setUser)\n const setSessionSignedIn = useSessionUser(\n (state) => state.setSessionSignedIn,\n )\n\n const setRolesSet = useSessionUserDataStore((state) => state.setRolesSet)\n const setFuncionalidadesSet = useSessionUserDataStore(\n (state) => state.setFuncionalidadesSet,\n )\n const setFuncionalidadesNameSet = useSessionUserDataStore(\n (state) => state.setFuncionalidadesNameSet,\n )\n const setFuncionalidadesMap = useSessionUserDataStore(\n (state) => state.setFuncionalidesMap,\n )\n const setPermissoesSet = useSessionUserDataStore(\n (state) => state.setPermissoesSet,\n )\n\n const { token, setToken } = useToken()\n\n const authenticated = Boolean(token && signedIn)\n\n const navigatorRef = useRef<IsolatedNavigatorRef>(null)\n\n const redirect = (userData: { primeiroAcesso?: boolean }) => {\n if (userData.primeiroAcesso) {\n navigatorRef.current?.navigate(appConfig.firstAccessPath)\n return\n }\n const search = window.location.search\n const params = new URLSearchParams(search)\n const redirectUrl = params.get(REDIRECT_URL_KEY)\n\n navigatorRef.current?.navigate(\n redirectUrl ? redirectUrl : appConfig.authenticatedEntryPath,\n )\n }\n\n const handleSignIn = (tokens: Token) => {\n setToken(tokens.accessToken)\n setSessionSignedIn(true)\n }\n\n const handleSignOut = () => {\n setToken('')\n setUser({})\n setSessionSignedIn(false)\n }\n\n async function handlePostAuth(resp: SignInResponse) {\n const findUserByIdResp = await apiFindUserById(resp.id)\n\n const { roles } = findUserByIdResp\n \n // Extrair os nomes das roles e salvar no rolesSet\n const rolesNames = roles.map((role) => role.nome)\n const rolesSet = new Set<string>(rolesNames)\n setRolesSet(rolesSet)\n \n const funcionalidades = roles.flatMap((role) =>\n role.funcionalidades.map((func) => func.url),\n )\n\n const funcionalidadesSet = new Set<string>(funcionalidades || [])\n setFuncionalidadesSet(funcionalidadesSet)\n\n const funcionalidadesMap = funcionalidades.reduce(\n mapFuncionalidadesByPath,\n {} as TFuncionalidadeMap,\n )\n\n setFuncionalidadesMap(funcionalidadesMap)\n\n // Extrair permissoes ativas de todas as funcionalidades e salvar no permissoesSet\n const permissoes = roles.flatMap((role) =>\n role.funcionalidades.flatMap((func) =>\n (func.permissoes || [])\n .filter((p: any) => p.ativo)\n .map((p: any) => `${p.endpoint},${p.httpMethod}`),\n ),\n )\n\n const permissoesSet = new Set<string>(permissoes || [])\n setPermissoesSet(permissoesSet)\n \n }\n\n const signIn = async (values: SignInCredential): AuthResult => {\n try {\n const resp = await apiSignIn(values)\n\n if (resp) {\n handleSignIn({ accessToken: resp.jwtToken })\n const funcionalidades = await apiFetchUserFuncionalidadesDetail(\n resp.id,\n )\n const vinculosUsuario = await apiFetchUserVinculosUsuario(\n resp.id,\n )\n\n const funcionalidadesUrls = funcionalidades.map((f) => f.url)\n const funcionalidadesNames = new Set<string>(\n funcionalidades.map((f) => f.nome),\n )\n\n setFuncionalidadesNameSet(funcionalidadesNames)\n\n const newUser = {\n userId: resp.id.toString(),\n userName: resp.nome,\n email: resp.email,\n primeiroAcesso: resp.primeiroAcesso,\n authority: funcionalidadesUrls,\n vinculosUsuario: vinculosUsuario,\n }\n handlePostAuth(resp)\n setUser(newUser)\n redirect(newUser)\n return {\n status: 'success',\n message: '',\n }\n }\n return {\n status: 'failed',\n message: 'Unable to sign in',\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (errors: any) {\n console.error('ERRO NA CHAMADA DA API:', errors)\n return {\n status: 'failed',\n message: errors?.response?.data?.message || errors.toString(),\n }\n }\n }\n\n const signUp = async (values: SignUpCredential): AuthResult => {\n try {\n const resp = await apiSignUp(values)\n if (resp) {\n handleSignIn({ accessToken: resp.jwtToken })\n // Armazenar ID e nome do usuário no estado\n const newUser = {\n userId: resp.id.toString(),\n userName: resp.nome,\n email: resp.email,\n primeiroAcesso: false,\n }\n setUser(newUser)\n redirect(newUser)\n return {\n status: 'success',\n message: '',\n }\n }\n return {\n status: 'failed',\n message: 'Unable to sign up',\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (errors: any) {\n return {\n status: 'failed',\n message: errors?.response?.data?.message || errors.toString(),\n }\n }\n }\n\n const signOut = async () => {\n try {\n await apiSignOut()\n } finally {\n handleSignOut()\n navigatorRef.current?.navigate(appConfig.unAuthenticatedEntryPath)\n }\n }\n const oAuthSignIn = (\n callback: (payload: OauthSignInCallbackPayload) => void,\n ) => {\n callback({\n onSignIn: handleSignIn,\n redirect: () => redirect(user),\n })\n }\n\n const updateUserSession = (newUserData: Partial<typeof user>) => {\n setUser({ ...user, ...newUserData })\n }\n return (\n <AuthContext.Provider\n value={{\n authenticated,\n user,\n signIn,\n signUp,\n signOut,\n oAuthSignIn,\n updateUserSession,\n }}\n >\n {children}\n <IsolatedNavigator ref={navigatorRef} />\n </AuthContext.Provider>\n )\n}\n\nexport default AuthProvider\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AuthProvider.js","sources":["../../../lib/@ecme/auth/AuthProvider.tsx"],"sourcesContent":["import type {\n AuthResult,\n OauthSignInCallbackPayload,\n SignInCredential,\n SignInResponse,\n SignUpCredential,\n Token,\n} from '@/@types/auth'\nimport appConfig from '@/configs/app.config'\nimport { REDIRECT_URL_KEY } from '@/constants/app.constant'\nimport {\n SIGN_IN_DEFAULT_ERROR_MESSAGE,\n SIGN_IN_ERROR_MESSAGES_BY_STATUS,\n SIGN_IN_NETWORK_ERROR_MESSAGE,\n} from '@/constants/auth.constant'\nimport { apiSignIn, apiSignOut, apiSignUp } from '@/services/AuthService'\nimport { useSessionUser, useToken } from '@/store/authStore'\nimport {\n apiFetchUserFuncionalidadesDetail,\n apiFetchUserVinculosUsuario,\n apiFindUserById,\n} from '@base/services'\nimport {\n TFuncionalidadeMap,\n useSessionUserDataStore,\n} from '@base/store/auth/sessionUserData'\nimport { mapFuncionalidadesByPath } from '@base/utils/modules/dm/funcionalidades'\nimport { ReactNode, Ref, useImperativeHandle, useRef } from 'react'\nimport { NavigateFunction, useNavigate } from 'react-router-dom'\nimport AuthContext from './AuthContext'\n\ntype AuthProviderProps = { children: ReactNode }\n\nexport type IsolatedNavigatorRef = {\n navigate: NavigateFunction\n}\n\nconst IsolatedNavigator = ({ ref }: { ref: Ref<IsolatedNavigatorRef> }) => {\n const navigate = useNavigate()\n\n useImperativeHandle(ref, () => {\n return {\n navigate,\n }\n }, [navigate])\n\n return <></>\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst getSignInErrorMessage = (error: any): string => {\n const response = error?.response\n\n if (!response) {\n return error?.request\n ? SIGN_IN_NETWORK_ERROR_MESSAGE\n : SIGN_IN_DEFAULT_ERROR_MESSAGE\n }\n\n return (\n SIGN_IN_ERROR_MESSAGES_BY_STATUS[response.status] ||\n response.data?.message ||\n SIGN_IN_DEFAULT_ERROR_MESSAGE\n )\n}\n\nfunction AuthProvider({ children }: AuthProviderProps) {\n const signedIn = useSessionUser((state) => state.session.signedIn)\n const user = useSessionUser((state) => state.user)\n const setUser = useSessionUser((state) => state.setUser)\n const setSessionSignedIn = useSessionUser(\n (state) => state.setSessionSignedIn,\n )\n\n const setRolesSet = useSessionUserDataStore((state) => state.setRolesSet)\n const setFuncionalidadesSet = useSessionUserDataStore(\n (state) => state.setFuncionalidadesSet,\n )\n const setFuncionalidadesNameSet = useSessionUserDataStore(\n (state) => state.setFuncionalidadesNameSet,\n )\n const setFuncionalidadesMap = useSessionUserDataStore(\n (state) => state.setFuncionalidesMap,\n )\n const setPermissoesSet = useSessionUserDataStore(\n (state) => state.setPermissoesSet,\n )\n\n const { token, setToken } = useToken()\n\n const authenticated = Boolean(token && signedIn)\n\n const navigatorRef = useRef<IsolatedNavigatorRef>(null)\n\n const redirect = (userData: { primeiroAcesso?: boolean }) => {\n if (userData.primeiroAcesso) {\n navigatorRef.current?.navigate(appConfig.firstAccessPath)\n return\n }\n const search = window.location.search\n const params = new URLSearchParams(search)\n const redirectUrl = params.get(REDIRECT_URL_KEY)\n\n navigatorRef.current?.navigate(\n redirectUrl ? redirectUrl : appConfig.authenticatedEntryPath,\n )\n }\n\n const handleSignIn = (tokens: Token) => {\n setToken(tokens.accessToken)\n setSessionSignedIn(true)\n }\n\n const handleSignOut = () => {\n setToken('')\n setUser({})\n setSessionSignedIn(false)\n }\n\n async function handlePostAuth(resp: SignInResponse) {\n const findUserByIdResp = await apiFindUserById(resp.id)\n\n const { roles } = findUserByIdResp\n \n // Extrair os nomes das roles e salvar no rolesSet\n const rolesNames = roles.map((role) => role.nome)\n const rolesSet = new Set<string>(rolesNames)\n setRolesSet(rolesSet)\n \n const funcionalidades = roles.flatMap((role) =>\n role.funcionalidades.map((func) => func.url),\n )\n\n const funcionalidadesSet = new Set<string>(funcionalidades || [])\n setFuncionalidadesSet(funcionalidadesSet)\n\n const funcionalidadesMap = funcionalidades.reduce(\n mapFuncionalidadesByPath,\n {} as TFuncionalidadeMap,\n )\n\n setFuncionalidadesMap(funcionalidadesMap)\n\n // Extrair permissoes ativas de todas as funcionalidades e salvar no permissoesSet\n const permissoes = roles.flatMap((role) =>\n role.funcionalidades.flatMap((func) =>\n (func.permissoes || [])\n .filter((p: any) => p.ativo)\n .map((p: any) => `${p.endpoint},${p.httpMethod}`),\n ),\n )\n\n const permissoesSet = new Set<string>(permissoes || [])\n setPermissoesSet(permissoesSet)\n \n }\n\n const signIn = async (values: SignInCredential): AuthResult => {\n try {\n const resp = await apiSignIn(values)\n\n if (resp) {\n handleSignIn({ accessToken: resp.jwtToken })\n const funcionalidades = await apiFetchUserFuncionalidadesDetail(\n resp.id,\n )\n const vinculosUsuario = await apiFetchUserVinculosUsuario(\n resp.id,\n )\n\n const funcionalidadesUrls = funcionalidades.map((f) => f.url)\n const funcionalidadesNames = new Set<string>(\n funcionalidades.map((f) => f.nome),\n )\n\n setFuncionalidadesNameSet(funcionalidadesNames)\n\n const newUser = {\n userId: resp.id.toString(),\n userName: resp.nome,\n email: resp.email,\n primeiroAcesso: resp.primeiroAcesso,\n authority: funcionalidadesUrls,\n vinculosUsuario: vinculosUsuario,\n }\n handlePostAuth(resp)\n setUser(newUser)\n redirect(newUser)\n return {\n status: 'success',\n message: '',\n }\n }\n return {\n status: 'failed',\n message: SIGN_IN_DEFAULT_ERROR_MESSAGE,\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (errors: any) {\n console.error('ERRO NA CHAMADA DA API:', errors)\n return {\n status: 'failed',\n message: getSignInErrorMessage(errors),\n }\n }\n }\n\n const signUp = async (values: SignUpCredential): AuthResult => {\n try {\n const resp = await apiSignUp(values)\n if (resp) {\n handleSignIn({ accessToken: resp.jwtToken })\n // Armazenar ID e nome do usuário no estado\n const newUser = {\n userId: resp.id.toString(),\n userName: resp.nome,\n email: resp.email,\n primeiroAcesso: false,\n }\n setUser(newUser)\n redirect(newUser)\n return {\n status: 'success',\n message: '',\n }\n }\n return {\n status: 'failed',\n message: 'Unable to sign up',\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (errors: any) {\n return {\n status: 'failed',\n message: errors?.response?.data?.message || errors.toString(),\n }\n }\n }\n\n const signOut = async (redirectUrl?: string) => {\n try {\n await apiSignOut()\n } finally {\n handleSignOut()\n if (redirectUrl) {\n const params = new URLSearchParams({\n [REDIRECT_URL_KEY]: redirectUrl,\n })\n navigatorRef.current?.navigate(\n `${appConfig.unAuthenticatedEntryPath}?${params.toString()}`,\n )\n } else {\n navigatorRef.current?.navigate(\n appConfig.unAuthenticatedEntryPath,\n )\n }\n }\n }\n const oAuthSignIn = (\n callback: (payload: OauthSignInCallbackPayload) => void,\n ) => {\n callback({\n onSignIn: handleSignIn,\n redirect: () => redirect(user),\n })\n }\n\n const updateUserSession = (newUserData: Partial<typeof user>) => {\n setUser({ ...user, ...newUserData })\n }\n return (\n <AuthContext.Provider\n value={{\n authenticated,\n user,\n signIn,\n signUp,\n signOut,\n oAuthSignIn,\n updateUserSession,\n }}\n >\n {children}\n <IsolatedNavigator ref={navigatorRef} />\n </AuthContext.Provider>\n )\n}\n\nexport default AuthProvider\n"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import Container from "../shared/Container.js";
|
|
|
3
3
|
import classNames from "../../utils/classNames.js";
|
|
4
4
|
import { APP_NAME } from "../../constants/app.constant.js";
|
|
5
5
|
import { PAGE_CONTAINER_GUTTER_X } from "../../constants/theme.constant.js";
|
|
6
|
-
const version = true ? "5.6.
|
|
6
|
+
const version = true ? "5.6.296" : "0.0.0";
|
|
7
7
|
const FooterContent = () => {
|
|
8
8
|
return /* @__PURE__ */ jsxs("div", { className: "flex w-full flex-auto items-center justify-between", children: [
|
|
9
9
|
/* @__PURE__ */ jsxs("span", { children: [
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const SIGN_IN_DEFAULT_ERROR_MESSAGE = "Não foi possível realizar o login. Tente novamente mais tarde.";
|
|
2
|
+
const SIGN_IN_NETWORK_ERROR_MESSAGE = "Não foi possível conectar ao servidor. Verifique sua conexão e tente novamente.";
|
|
3
|
+
const SIGN_IN_ERROR_MESSAGES_BY_STATUS = {
|
|
4
|
+
400: "Dados de login inválidos. Verifique as informações e tente novamente.",
|
|
5
|
+
401: "Login ou senha incorretos.",
|
|
6
|
+
403: "Acesso negado. Seu usuário não tem permissão para acessar o sistema.",
|
|
7
|
+
404: "Usuário não encontrado.",
|
|
8
|
+
408: "O servidor demorou para responder. Tente novamente.",
|
|
9
|
+
423: "Usuário bloqueado. Entre em contato com o administrador.",
|
|
10
|
+
429: "Muitas tentativas de login. Aguarde alguns instantes e tente novamente.",
|
|
11
|
+
500: "Erro interno no servidor. Tente novamente mais tarde.",
|
|
12
|
+
502: "Serviço indisponível no momento. Tente novamente mais tarde.",
|
|
13
|
+
503: "Serviço indisponível no momento. Tente novamente mais tarde.",
|
|
14
|
+
504: "O servidor demorou para responder. Tente novamente mais tarde."
|
|
15
|
+
};
|
|
16
|
+
export {
|
|
17
|
+
SIGN_IN_DEFAULT_ERROR_MESSAGE,
|
|
18
|
+
SIGN_IN_ERROR_MESSAGES_BY_STATUS,
|
|
19
|
+
SIGN_IN_NETWORK_ERROR_MESSAGE
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=auth.constant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.constant.js","sources":["../../../lib/@ecme/constants/auth.constant.ts"],"sourcesContent":["export const SIGN_IN_DEFAULT_ERROR_MESSAGE =\n 'Não foi possível realizar o login. Tente novamente mais tarde.'\n\nexport const SIGN_IN_NETWORK_ERROR_MESSAGE =\n 'Não foi possível conectar ao servidor. Verifique sua conexão e tente novamente.'\n\nexport const SIGN_IN_ERROR_MESSAGES_BY_STATUS: Record<number, string> = {\n 400: 'Dados de login inválidos. Verifique as informações e tente novamente.',\n 401: 'Login ou senha incorretos.',\n 403: 'Acesso negado. Seu usuário não tem permissão para acessar o sistema.',\n 404: 'Usuário não encontrado.',\n 408: 'O servidor demorou para responder. Tente novamente.',\n 423: 'Usuário bloqueado. Entre em contato com o administrador.',\n 429: 'Muitas tentativas de login. Aguarde alguns instantes e tente novamente.',\n 500: 'Erro interno no servidor. Tente novamente mais tarde.',\n 502: 'Serviço indisponível no momento. Tente novamente mais tarde.',\n 503: 'Serviço indisponível no momento. Tente novamente mais tarde.',\n 504: 'O servidor demorou para responder. Tente novamente mais tarde.',\n}\n"],"names":[],"mappings":"AAAO,MAAM,gCACT;AAEG,MAAM,gCACT;AAEG,MAAM,mCAA2D;AAAA,EACpE,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACT;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { REQUEST_HEADER_AUTH_KEY, TOKEN_NAME_IN_STORAGE, TOKEN_TYPE } from "./api.constant.js";
|
|
2
2
|
import { APP_NAME, REDIRECT_URL_KEY } from "./app.constant.js";
|
|
3
|
+
import { SIGN_IN_DEFAULT_ERROR_MESSAGE, SIGN_IN_ERROR_MESSAGES_BY_STATUS, SIGN_IN_NETWORK_ERROR_MESSAGE } from "./auth.constant.js";
|
|
3
4
|
import { COLORS, COLOR_1, COLOR_10, COLOR_2, COLOR_3, COLOR_4, COLOR_5, COLOR_6, COLOR_7, COLOR_8, COLOR_9 } from "./chart.constant.js";
|
|
4
5
|
import { countryList } from "./countries.constant.js";
|
|
5
6
|
import { NAV_ITEM_TYPE_COLLAPSE, NAV_ITEM_TYPE_ITEM, NAV_ITEM_TYPE_TITLE } from "./navigation.constant.js";
|
|
@@ -48,6 +49,9 @@ export {
|
|
|
48
49
|
SIDE_NAV_COLLAPSED_WIDTH,
|
|
49
50
|
SIDE_NAV_CONTENT_GUTTER,
|
|
50
51
|
SIDE_NAV_WIDTH,
|
|
52
|
+
SIGN_IN_DEFAULT_ERROR_MESSAGE,
|
|
53
|
+
SIGN_IN_ERROR_MESSAGES_BY_STATUS,
|
|
54
|
+
SIGN_IN_NETWORK_ERROR_MESSAGE,
|
|
51
55
|
SPLITTED_SIDE_NAV_MINI_WIDTH,
|
|
52
56
|
STACKED_SIDE_NAV_SECONDARY_WIDTH,
|
|
53
57
|
THEME_ENUM,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
|
package/dist/@ecme/index.js
CHANGED
|
@@ -106,6 +106,7 @@ import { REQUEST_HEADER_AUTH_KEY, TOKEN_NAME_IN_STORAGE, TOKEN_TYPE } from "./co
|
|
|
106
106
|
import { Radio } from "./components/ui/Radio/index.js";
|
|
107
107
|
import { default as default78 } from "./components/ui/DatePicker/RangeCalendar.js";
|
|
108
108
|
import { default as default79 } from "./components/shared/RichTextEditor/RichTextEditor.js";
|
|
109
|
+
import { SIGN_IN_DEFAULT_ERROR_MESSAGE, SIGN_IN_ERROR_MESSAGES_BY_STATUS, SIGN_IN_NETWORK_ERROR_MESSAGE } from "./constants/auth.constant.js";
|
|
109
110
|
import { default as default80 } from "./components/ui/ScrollBar/ScrollBar.js";
|
|
110
111
|
import { Segment } from "./components/ui/Segment/index.js";
|
|
111
112
|
import { default as default81 } from "./components/ui/Select/Select.js";
|
|
@@ -336,6 +337,9 @@ export {
|
|
|
336
337
|
SIDE_NAV_COLLAPSED_WIDTH,
|
|
337
338
|
SIDE_NAV_CONTENT_GUTTER,
|
|
338
339
|
SIDE_NAV_WIDTH,
|
|
340
|
+
SIGN_IN_DEFAULT_ERROR_MESSAGE,
|
|
341
|
+
SIGN_IN_ERROR_MESSAGES_BY_STATUS,
|
|
342
|
+
SIGN_IN_NETWORK_ERROR_MESSAGE,
|
|
339
343
|
SPLITTED_SIDE_NAV_MINI_WIDTH,
|
|
340
344
|
STACKED_SIDE_NAV_SECONDARY_WIDTH,
|
|
341
345
|
default80 as ScrollBar,
|
package/dist/@ecme/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
2
|
import ActionLink from "../../../components/shared/ActionLink.js";
|
|
3
|
-
import "../../../components/ui/Alert/index.js";
|
|
4
|
-
import useTimeOutMessage from "../../../utils/hooks/useTimeOutMessage.js";
|
|
5
3
|
import SignInForm from "./components/SignInForm.js";
|
|
6
4
|
import Logo from "../../../components/template/Logo.js";
|
|
7
5
|
import { getLogoFilename } from "../../../../base/utils/logo.js";
|
|
8
6
|
import { useThemeStore } from "../../../store/themeStore.js";
|
|
9
|
-
import Alert from "../../../components/ui/Alert/Alert.js";
|
|
10
7
|
const SignInBase = ({
|
|
11
8
|
signUpUrl = "/sign-up",
|
|
12
9
|
forgetPasswordUrl = "/forgot-password",
|
|
13
10
|
disableSubmit
|
|
14
11
|
}) => {
|
|
15
|
-
const [message, setMessage] = useTimeOutMessage();
|
|
16
12
|
const { mode } = useThemeStore();
|
|
17
13
|
return /* @__PURE__ */ jsxs("div", { children: [
|
|
18
14
|
/* @__PURE__ */ jsxs("div", { className: "mb-12 flex flex-col items-center", children: [
|
|
@@ -26,12 +22,10 @@ const SignInBase = ({
|
|
|
26
22
|
/* @__PURE__ */ jsx("h2", { className: "mb-2 text-center", children: "Bem vindo!" }),
|
|
27
23
|
/* @__PURE__ */ jsx("p", { className: "heading-text text-center font-semibold", children: "Digite seus dados para entrar." })
|
|
28
24
|
] }),
|
|
29
|
-
message && /* @__PURE__ */ jsx(Alert, { showIcon: true, className: "mb-4", type: "danger", children: /* @__PURE__ */ jsx("span", { className: "break-all", children: message }) }),
|
|
30
25
|
/* @__PURE__ */ jsx(
|
|
31
26
|
SignInForm,
|
|
32
27
|
{
|
|
33
28
|
disableSubmit,
|
|
34
|
-
setMessage,
|
|
35
29
|
passwordHint: /* @__PURE__ */ jsx("div", { className: "mb-6 mt-2", children: /* @__PURE__ */ jsx(
|
|
36
30
|
ActionLink,
|
|
37
31
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignIn.js","sources":["../../../../../lib/@ecme/views/auth/SignIn/SignIn.tsx"],"sourcesContent":["import ActionLink from '@/components/shared/ActionLink'\nimport
|
|
1
|
+
{"version":3,"file":"SignIn.js","sources":["../../../../../lib/@ecme/views/auth/SignIn/SignIn.tsx"],"sourcesContent":["import ActionLink from '@/components/shared/ActionLink'\nimport SignInForm from './components/SignInForm'\nimport Logo from '@/components/template/Logo'\nimport { getLogoFilename } from '@base/utils/logo'\nimport { useThemeStore } from '@/store/themeStore'\n\ntype SignInProps = {\n signUpUrl?: string\n forgetPasswordUrl?: string\n disableSubmit?: boolean\n}\n\nexport const SignInBase = ({\n signUpUrl = '/sign-up',\n forgetPasswordUrl = '/forgot-password',\n disableSubmit,\n}: SignInProps) => {\n const { mode } = useThemeStore()\n\n return (\n <div>\n <div className=\"mb-12 flex flex-col items-center\">\n <Logo\n imgClass=\"mb-6 max-h-20\"\n name={getLogoFilename(true, mode)}\n />\n <h2 className=\"mb-2 text-center\">Bem vindo!</h2>\n <p className=\"heading-text text-center font-semibold\">\n Digite seus dados para entrar.\n </p>\n </div>\n <SignInForm\n disableSubmit={disableSubmit}\n passwordHint={\n <div className=\"mb-6 mt-2\">\n <ActionLink\n to={forgetPasswordUrl}\n className=\"heading-text mt-2 font-semibold text-primary\"\n themeColor={false}\n >\n Esqueceu sua senha?\n </ActionLink>\n </div>\n }\n />\n </div>\n )\n}\n\nconst SignIn = () => {\n return <SignInBase />\n}\n\nexport default SignIn\n"],"names":[],"mappings":";;;;;;AAYO,MAAM,aAAa,CAAC;AAAA,EACvB,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB;AACJ,MAAmB;AACf,QAAM,EAAE,KAAA,IAAS,cAAA;AAEjB,8BACK,OAAA,EACG,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAI,WAAU,oCACX,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,UAAS;AAAA,UACT,MAAM,gBAAgB,MAAM,IAAI;AAAA,QAAA;AAAA,MAAA;AAAA,MAEpC,oBAAC,MAAA,EAAG,WAAU,oBAAmB,UAAA,cAAU;AAAA,MAC3C,oBAAC,KAAA,EAAE,WAAU,0CAAyC,UAAA,iCAAA,CAEtD;AAAA,IAAA,GACJ;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QACG;AAAA,QACA,cACI,oBAAC,OAAA,EAAI,WAAU,aACX,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,IAAI;AAAA,YACJ,WAAU;AAAA,YACV,YAAY;AAAA,YACf,UAAA;AAAA,UAAA;AAAA,QAAA,EAED,CACJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAER,GACJ;AAER;AAEA,MAAM,SAAS,MAAM;AACjB,6BAAQ,YAAA,EAAW;AACvB;"}
|
|
@@ -2,6 +2,8 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState } from "react";
|
|
3
3
|
import "../../../../components/ui/Input/index.js";
|
|
4
4
|
import "../../../../components/ui/Button/index.js";
|
|
5
|
+
import "../../../../components/ui/Notification/index.js";
|
|
6
|
+
import "../../../../components/ui/toast/index.js";
|
|
5
7
|
import "../../../../components/ui/Form/index.js";
|
|
6
8
|
import PasswordInput from "../../../../components/shared/PasswordInput.js";
|
|
7
9
|
import classNames from "../../../../utils/classNames.js";
|
|
@@ -10,6 +12,8 @@ import { useForm, Controller } from "react-hook-form";
|
|
|
10
12
|
import { zodResolver } from "@hookform/resolvers/zod";
|
|
11
13
|
import { z } from "zod";
|
|
12
14
|
import useAuth from "../../../../auth/useAuth.js";
|
|
15
|
+
import toast from "../../../../components/ui/toast/toast.js";
|
|
16
|
+
import Notification from "../../../../components/ui/Notification/Notification.js";
|
|
13
17
|
import { Form } from "../../../../components/ui/Form/Form.js";
|
|
14
18
|
import FormItem from "../../../../components/ui/Form/FormItem.js";
|
|
15
19
|
import Input from "../../../../components/ui/Input/Input.js";
|
|
@@ -20,7 +24,7 @@ const validationSchema = z.object({
|
|
|
20
24
|
});
|
|
21
25
|
const SignInForm = (props) => {
|
|
22
26
|
const [isSubmitting, setSubmitting] = useState(false);
|
|
23
|
-
const { disableSubmit = false, className,
|
|
27
|
+
const { disableSubmit = false, className, passwordHint } = props;
|
|
24
28
|
const {
|
|
25
29
|
handleSubmit,
|
|
26
30
|
formState: { errors },
|
|
@@ -39,7 +43,9 @@ const SignInForm = (props) => {
|
|
|
39
43
|
setSubmitting(true);
|
|
40
44
|
const result = await signIn({ username, password });
|
|
41
45
|
if (result?.status === "failed") {
|
|
42
|
-
|
|
46
|
+
toast.push(
|
|
47
|
+
/* @__PURE__ */ jsx(Notification, { title: "Erro ao entrar", type: "danger", children: result.message })
|
|
48
|
+
);
|
|
43
49
|
}
|
|
44
50
|
}
|
|
45
51
|
setSubmitting(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignInForm.js","sources":["../../../../../../lib/@ecme/views/auth/SignIn/components/SignInForm.tsx"],"sourcesContent":["import { ReactNode, useState } from \"react\";\nimport Input from \"@/components/ui/Input\";\nimport Button from \"@/components/ui/Button\";\nimport { FormItem, Form } from \"@/components/ui/Form\";\nimport PasswordInput from \"@/components/shared/PasswordInput\";\nimport classNames from \"@/utils/classNames\";\nimport { useAuth } from \"@/auth\";\nimport { useForm, Controller } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { z, ZodType } from \"zod\";\nimport type { CommonProps } from \"@/@types/common\";\n\ninterface SignInFormProps extends CommonProps {\n disableSubmit?: boolean;\n passwordHint?: string | ReactNode;\n
|
|
1
|
+
{"version":3,"file":"SignInForm.js","sources":["../../../../../../lib/@ecme/views/auth/SignIn/components/SignInForm.tsx"],"sourcesContent":["import { ReactNode, useState } from \"react\";\nimport Input from \"@/components/ui/Input\";\nimport Button from \"@/components/ui/Button\";\nimport Notification from \"@/components/ui/Notification\";\nimport toast from \"@/components/ui/toast\";\nimport { FormItem, Form } from \"@/components/ui/Form\";\nimport PasswordInput from \"@/components/shared/PasswordInput\";\nimport classNames from \"@/utils/classNames\";\nimport { useAuth } from \"@/auth\";\nimport { useForm, Controller } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { z, ZodType } from \"zod\";\nimport type { CommonProps } from \"@/@types/common\";\n\ninterface SignInFormProps extends CommonProps {\n disableSubmit?: boolean;\n passwordHint?: string | ReactNode;\n}\n\ntype SignInFormSchema = {\n username: string;\n password: string;\n};\n\nconst validationSchema: ZodType<SignInFormSchema> = z.object({\n username: z\n .string({ required_error: \"Por favor digite um login.\" })\n .min(1, { message: \"Por favor digite um login válido.\" }),\n password: z\n .string({ required_error: \"Por favor digite uma senha.\" })\n .min(1, { message: \"Por favor digite uma senha válida.\" }),\n});\n\nconst SignInForm = (props: SignInFormProps) => {\n const [isSubmitting, setSubmitting] = useState<boolean>(false);\n\n const { disableSubmit = false, className, passwordHint } = props;\n\n const {\n handleSubmit,\n formState: { errors },\n control,\n } = useForm<SignInFormSchema>({\n defaultValues: {\n username: \"\",\n password: \"\",\n },\n resolver: zodResolver(validationSchema),\n });\n\n const { signIn } = useAuth();\n\n const onSignIn = async (values: SignInFormSchema) => {\n const { username, password } = values;\n\n if (!disableSubmit) {\n setSubmitting(true);\n\n const result = await signIn({ username, password });\n\n if (result?.status === \"failed\") {\n toast.push(\n <Notification title=\"Erro ao entrar\" type=\"danger\">\n {result.message}\n </Notification>\n );\n }\n }\n\n setSubmitting(false);\n };\n\n return (\n <div className={className}>\n <Form onSubmit={handleSubmit(onSignIn)}>\n <FormItem\n label=\"Login\"\n invalid={Boolean(errors.username)}\n errorMessage={errors.username?.message}\n >\n <Controller\n name=\"username\"\n control={control}\n render={({ field }) => (\n <Input\n type=\"text\"\n placeholder=\"Login\"\n autoComplete=\"off\"\n {...field}\n />\n )}\n />\n </FormItem>\n <FormItem\n label=\"Senha\"\n invalid={Boolean(errors.password)}\n errorMessage={errors.password?.message}\n className={classNames(\n passwordHint ? \"mb-0\" : \"\",\n errors.password?.message ? \"mb-8\" : \"\"\n )}\n >\n <Controller\n name=\"password\"\n control={control}\n rules={{ required: true }}\n render={({ field }) => (\n <PasswordInput\n type=\"text\"\n placeholder=\"Senha\"\n autoComplete=\"off\"\n {...field}\n />\n )}\n />\n </FormItem>\n {passwordHint}\n <Button\n block\n loading={isSubmitting}\n variant=\"solid\"\n type=\"submit\"\n className=\"mt-6\"\n >\n {isSubmitting ? \"Entrando...\" : \"Entrar\"}\n </Button>\n </Form>\n </div>\n );\n};\n\nexport default SignInForm;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAwBA,MAAM,mBAA8C,EAAE,OAAO;AAAA,EAC3D,UAAU,EACP,OAAO,EAAE,gBAAgB,6BAAA,CAA8B,EACvD,IAAI,GAAG,EAAE,SAAS,qCAAqC;AAAA,EAC1D,UAAU,EACP,OAAO,EAAE,gBAAgB,+BAA+B,EACxD,IAAI,GAAG,EAAE,SAAS,sCAAsC;AAC7D,CAAC;AAED,MAAM,aAAa,CAAC,UAA2B;AAC7C,QAAM,CAAC,cAAc,aAAa,IAAI,SAAkB,KAAK;AAE7D,QAAM,EAAE,gBAAgB,OAAO,WAAW,iBAAiB;AAE3D,QAAM;AAAA,IACJ;AAAA,IACA,WAAW,EAAE,OAAA;AAAA,IACb;AAAA,EAAA,IACE,QAA0B;AAAA,IAC5B,eAAe;AAAA,MACb,UAAU;AAAA,MACV,UAAU;AAAA,IAAA;AAAA,IAEZ,UAAU,YAAY,gBAAgB;AAAA,EAAA,CACvC;AAED,QAAM,EAAE,OAAA,IAAW,QAAA;AAEnB,QAAM,WAAW,OAAO,WAA6B;AACnD,UAAM,EAAE,UAAU,SAAA,IAAa;AAE/B,QAAI,CAAC,eAAe;AAClB,oBAAc,IAAI;AAElB,YAAM,SAAS,MAAM,OAAO,EAAE,UAAU,UAAU;AAElD,UAAI,QAAQ,WAAW,UAAU;AAC/B,cAAM;AAAA,8BACH,cAAA,EAAa,OAAM,kBAAiB,MAAK,UACvC,iBAAO,QAAA,CACV;AAAA,QAAA;AAAA,MAEJ;AAAA,IACF;AAEA,kBAAc,KAAK;AAAA,EACrB;AAEA,SACE,oBAAC,SAAI,WACH,UAAA,qBAAC,QAAK,UAAU,aAAa,QAAQ,GACnC,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAS,QAAQ,OAAO,QAAQ;AAAA,QAChC,cAAc,OAAO,UAAU;AAAA,QAE/B,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL;AAAA,YACA,QAAQ,CAAC,EAAE,MAAA,MACT;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,aAAY;AAAA,gBACZ,cAAa;AAAA,gBACZ,GAAG;AAAA,cAAA;AAAA,YAAA;AAAA,UACN;AAAA,QAAA;AAAA,MAEJ;AAAA,IAAA;AAAA,IAEF;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAS,QAAQ,OAAO,QAAQ;AAAA,QAChC,cAAc,OAAO,UAAU;AAAA,QAC/B,WAAW;AAAA,UACT,eAAe,SAAS;AAAA,UACxB,OAAO,UAAU,UAAU,SAAS;AAAA,QAAA;AAAA,QAGtC,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL;AAAA,YACA,OAAO,EAAE,UAAU,KAAA;AAAA,YACnB,QAAQ,CAAC,EAAE,MAAA,MACT;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,aAAY;AAAA,gBACZ,cAAa;AAAA,gBACZ,GAAG;AAAA,cAAA;AAAA,YAAA;AAAA,UACN;AAAA,QAAA;AAAA,MAEJ;AAAA,IAAA;AAAA,IAED;AAAA,IACD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAK;AAAA,QACL,SAAS;AAAA,QACT,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA,QAET,yBAAe,gBAAgB;AAAA,MAAA;AAAA,IAAA;AAAA,EAClC,EAAA,CACF,EAAA,CACF;AAEJ;"}
|
|
@@ -55,9 +55,9 @@ const Authentication = () => {
|
|
|
55
55
|
},
|
|
56
56
|
{
|
|
57
57
|
propName: "signOut",
|
|
58
|
-
type: `<code>() => void</code>`,
|
|
58
|
+
type: `<code>(redirectUrl?: string) => void</code>`,
|
|
59
59
|
default: `-`,
|
|
60
|
-
desc: `A method to sign out the current user
|
|
60
|
+
desc: `A method to sign out the current user. Pass a redirect URL to return there after signing in again.`
|
|
61
61
|
},
|
|
62
62
|
{
|
|
63
63
|
propName: "oAuthSignIn",
|
|
@@ -102,6 +102,32 @@ const YourComponent = () => {
|
|
|
102
102
|
</div>
|
|
103
103
|
);
|
|
104
104
|
};
|
|
105
|
+
` }),
|
|
106
|
+
/* @__PURE__ */ jsxs("p", { className: "mt-4", children: [
|
|
107
|
+
"To return to the current screen after an idle timeout, pass",
|
|
108
|
+
" ",
|
|
109
|
+
/* @__PURE__ */ jsx("code", { children: "signOut" }),
|
|
110
|
+
" directly to ",
|
|
111
|
+
/* @__PURE__ */ jsx("code", { children: "useIdleTimeout" }),
|
|
112
|
+
". The timeout hook supplies the current path, query string, and hash to the callback. Calling ",
|
|
113
|
+
/* @__PURE__ */ jsx("code", { children: "signOut()" }),
|
|
114
|
+
" ",
|
|
115
|
+
"without a destination, such as for a manual logout, keeps the existing behavior."
|
|
116
|
+
] }),
|
|
117
|
+
/* @__PURE__ */ jsx(SyntaxHighlighter, { language: "tsx", children: `import { useAuth } from '@/auth'
|
|
118
|
+
import { useIdleTimeout } from '@/base/hooks'
|
|
119
|
+
|
|
120
|
+
const SessionTimeout = () => {
|
|
121
|
+
const { signOut, authenticated } = useAuth();
|
|
122
|
+
|
|
123
|
+
useIdleTimeout({
|
|
124
|
+
timeout: 900,
|
|
125
|
+
onTimeout: signOut,
|
|
126
|
+
enabled: authenticated,
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
return null;
|
|
130
|
+
};
|
|
105
131
|
` })
|
|
106
132
|
] }),
|
|
107
133
|
/* @__PURE__ */ jsxs("div", { className: "mt-10", id: "OAuth", children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Authentication.js","sources":["../../../../../../lib/@ecme/views/guide/Documentations/components/Authentication.tsx"],"sourcesContent":["/* eslint-disable react/no-unescaped-entities */\nimport SyntaxHighlighter from '@/components/shared/SyntaxHighlighter'\nimport DemoComponentApi from '@/components/docs/DemoComponentApi'\n\nconst Authentication = () => {\n return (\n <>\n <p>\n This guide provides an overview of the authentication system\n implemented in the template\n </p>\n <div className=\"mt-10\" id=\"useAuth\">\n <h5>useAuth</h5>\n <p className=\"mt-1\">\n The authentication system is managed through the{' '}\n <code>AuthProvider</code> component, which should wrap your\n application or relevant parts of it. It manages auth states\n and provides the following methods via the{' '}\n <code>useAuth</code> hook:\n </p>\n <DemoComponentApi\n hideApiTitle\n keyText=\"properties\"\n api={[\n {\n api: [\n {\n propName: 'authenticated',\n type: `<code>boolean</code>`,\n default: `-`,\n desc: 'A boolean indicating whether the user is currently authenticated.',\n },\n {\n propName: 'user',\n type: `<code>{\n userId: string\n userName: string\n authority: string[]\n avatar: string\n email: string\n }</code>`,\n default: `-`,\n desc: `An object containing the user's details, such as <code>userName</code>, <code>email</code>, and <code>authority</code>`,\n },\n {\n propName: 'signIn',\n type: `<code>(values: {email: string, password: string}) => Promise<{status: 'success' | 'failed', message: string}></code>`,\n default: `-`,\n desc: `A method to sign in a user with their credentials </p>`,\n },\n {\n propName: 'signUp',\n type: `<code>(values: {userName: string, email: string, password: string}) => Promise<{status: 'success' | 'failed', message: string}></code>`,\n default: `-`,\n desc: `A method to register a new user`,\n },\n {\n propName: 'signOut',\n type: `<code>() => void</code>`,\n default: `-`,\n desc: `A method to sign out the current user`,\n },\n {\n propName: 'oAuthSignIn',\n type: `<code>callback: (payload: {\n onSignIn: (tokens: Token, user?: User) => void\n redirect: () => void\n}) => void</code>`,\n default: `-`,\n desc: `A method to handle OAuth sign-in callbacks for third-party authentication providers.</p>`,\n },\n ],\n },\n ]}\n />\n <p>Here's how you can use the useAuth hook in components:</p>\n <SyntaxHighlighter language=\"tsx\">{`import { useAuth } from '@/auth'\n\nconst YourComponent = () => {\n const { signIn, signOut, user, authenticated } = useAuth();\n\n const handleLogin = async () => {\n const credentials = { email: 'user@example.com', password: 'password' };\n const result = await signIn(credentials);\n if (result?.status === 'success') {\n console.log('Logged in successfully');\n }\n if (result?.status === 'failed') {\n console.error('Failed to login')\n }\n };\n\n const handleLogout = () => {\n signOut();\n };\n\n return (\n <div>\n {authenticated ? <p>Welcome, {user.userName}</p> : <p>Please log in</p>}\n <button onClick={handleLogin}>Login</button>\n <button onClick={handleLogout}>Logout</button>\n </div>\n );\n};\n`}</SyntaxHighlighter>\n </div>\n <div className=\"mt-10\" id=\"OAuth\">\n <h5>OAuth Sign-In</h5>\n <p className=\"mt-1\">\n If you're implementing OAuth with third-party providers, the{' '}\n <code>oAuthSignIn</code> method will be essential. You can\n use it within your OAuth callback to complete the sign-in\n process and manage tokens.\n </p>\n <SyntaxHighlighter language=\"tsx\">{`import { useAuth } from '@/auth'\nimport SomeOauthSdkSignInMethod from 'SomeOauthSdk'\n\nconst YourComponent = () => {\n const { oAuthSignIn } = useAuth();\n\n const handleOAuthSignIn = () => {\n\n oAuthSignIn(async ({redirect, onSignIn}) => {\n try {\n const resp = await SomeOauthSdkSignInMethod()\n if (resp) {\n /** extract token & user information for the response */ \n const { token, user } = resp\n onSignIn({accessToken: token}, user)\n redirect()\n }\n } catch (error) {\n console.error('Failed to login')\n }\n })\n }\n\n const handleLogout = () => {\n signOut();\n };\n\n return (\n <button onClick={handleOAuthSignIn}>Login with OAuth</button>\n );\n};\n`}</SyntaxHighlighter>\n </div>\n <div className=\"mt-10\" id=\"customizing-data-model\">\n <h5>Customizing the Data Models</h5>\n <p className=\"mt-1\">\n Since not all applications having the same data model, you\n can customize the data structures in{' '}\n <code>@/types/auth.ts</code> and{' '}\n <code>@/auth/AuthProvider.ts</code> to suit your needs.\n Adjust the types and interfaces defined for{' '}\n <code>User</code>, <code>Token</code>, and other\n authentication-related entities according to your\n application's requirements.\n </p>\n <SyntaxHighlighter language=\"ts\">{`// Example: Modifying the User type\nexport type User = {\n userId?: string | null\n avatar?: string | null\n userName?: string | null\n email?: string | null\n authority?: string[]\n // Add your custom fields here\n role?: string | null\n};\n`}</SyntaxHighlighter>\n <div className=\"mt-10\" id=\"useAuth\">\n <h5>Diving into AuthProvider</h5>\n <p className=\"mt-1\">\n If the default authentication implementation doesn't\n meet your needs, feel free to dive into the{' '}\n <code>AuthProvider</code> to make any necessary\n modifications. This component handles the core logic for\n authentication, including token management, session\n handling, and more. Customizing this logic can help you\n better align the authentication system with your\n application's specific requirements.\n </p>\n <SyntaxHighlighter language=\"tsx\">{`...\nimport { apiSignIn, apiSignOut, apiSignUp } from '@/services/AuthService'\n\nfunction AuthProvider({ children }: AuthProviderProps) {\n \n ...\n\n const handleSignIn = (...) => {\n ... /** Your implementation here */\n }\n\n const handleSignOut = () => {\n ... /** Your implementation here */\n }\n\n const signIn = async (values: SignInCredential): AuthResult => {\n try {\n const resp = await apiSignIn(values)\n if (resp) {\n handleSignIn(...)\n }\n } catch (errors: any) {\n return {\n status: 'failed',\n message: errors?.response?.data?.message || errors.toString(),\n }\n }\n }\n\n const signOut = async () => {\n try {\n await apiSignOut()\n } finally {\n handleSignOut()\n navigate(appConfig.unAuthenticatedEntryPath)\n }\n }\n ... \n \n return (\n <AuthContext.Provider value={{\n signIn,\n signOut,\n ...\n }}>\n {children}\n </AuthContext.Provider>\n )\n}\n`}</SyntaxHighlighter>\n </div>\n </div>\n </>\n )\n}\n\nexport default Authentication\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Authentication.js","sources":["../../../../../../lib/@ecme/views/guide/Documentations/components/Authentication.tsx"],"sourcesContent":["/* eslint-disable react/no-unescaped-entities */\nimport SyntaxHighlighter from '@/components/shared/SyntaxHighlighter'\nimport DemoComponentApi from '@/components/docs/DemoComponentApi'\n\nconst Authentication = () => {\n return (\n <>\n <p>\n This guide provides an overview of the authentication system\n implemented in the template\n </p>\n <div className=\"mt-10\" id=\"useAuth\">\n <h5>useAuth</h5>\n <p className=\"mt-1\">\n The authentication system is managed through the{' '}\n <code>AuthProvider</code> component, which should wrap your\n application or relevant parts of it. It manages auth states\n and provides the following methods via the{' '}\n <code>useAuth</code> hook:\n </p>\n <DemoComponentApi\n hideApiTitle\n keyText=\"properties\"\n api={[\n {\n api: [\n {\n propName: 'authenticated',\n type: `<code>boolean</code>`,\n default: `-`,\n desc: 'A boolean indicating whether the user is currently authenticated.',\n },\n {\n propName: 'user',\n type: `<code>{\n userId: string\n userName: string\n authority: string[]\n avatar: string\n email: string\n }</code>`,\n default: `-`,\n desc: `An object containing the user's details, such as <code>userName</code>, <code>email</code>, and <code>authority</code>`,\n },\n {\n propName: 'signIn',\n type: `<code>(values: {email: string, password: string}) => Promise<{status: 'success' | 'failed', message: string}></code>`,\n default: `-`,\n desc: `A method to sign in a user with their credentials </p>`,\n },\n {\n propName: 'signUp',\n type: `<code>(values: {userName: string, email: string, password: string}) => Promise<{status: 'success' | 'failed', message: string}></code>`,\n default: `-`,\n desc: `A method to register a new user`,\n },\n {\n propName: 'signOut',\n type: `<code>(redirectUrl?: string) => void</code>`,\n default: `-`,\n desc: `A method to sign out the current user. Pass a redirect URL to return there after signing in again.`,\n },\n {\n propName: 'oAuthSignIn',\n type: `<code>callback: (payload: {\n onSignIn: (tokens: Token, user?: User) => void\n redirect: () => void\n}) => void</code>`,\n default: `-`,\n desc: `A method to handle OAuth sign-in callbacks for third-party authentication providers.</p>`,\n },\n ],\n },\n ]}\n />\n <p>Here's how you can use the useAuth hook in components:</p>\n <SyntaxHighlighter language=\"tsx\">{`import { useAuth } from '@/auth'\n\nconst YourComponent = () => {\n const { signIn, signOut, user, authenticated } = useAuth();\n\n const handleLogin = async () => {\n const credentials = { email: 'user@example.com', password: 'password' };\n const result = await signIn(credentials);\n if (result?.status === 'success') {\n console.log('Logged in successfully');\n }\n if (result?.status === 'failed') {\n console.error('Failed to login')\n }\n };\n\n const handleLogout = () => {\n signOut();\n };\n\n return (\n <div>\n {authenticated ? <p>Welcome, {user.userName}</p> : <p>Please log in</p>}\n <button onClick={handleLogin}>Login</button>\n <button onClick={handleLogout}>Logout</button>\n </div>\n );\n};\n`}</SyntaxHighlighter>\n <p className=\"mt-4\">\n To return to the current screen after an idle timeout, pass{' '}\n <code>signOut</code> directly to <code>useIdleTimeout</code>.\n The timeout hook supplies the current path, query string,\n and hash to the callback. Calling <code>signOut()</code>{' '}\n without a destination, such as for a manual logout, keeps\n the existing behavior.\n </p>\n <SyntaxHighlighter language=\"tsx\">{`import { useAuth } from '@/auth'\nimport { useIdleTimeout } from '@/base/hooks'\n\nconst SessionTimeout = () => {\n const { signOut, authenticated } = useAuth();\n\n useIdleTimeout({\n timeout: 900,\n onTimeout: signOut,\n enabled: authenticated,\n });\n\n return null;\n};\n`}</SyntaxHighlighter>\n </div>\n <div className=\"mt-10\" id=\"OAuth\">\n <h5>OAuth Sign-In</h5>\n <p className=\"mt-1\">\n If you're implementing OAuth with third-party providers, the{' '}\n <code>oAuthSignIn</code> method will be essential. You can\n use it within your OAuth callback to complete the sign-in\n process and manage tokens.\n </p>\n <SyntaxHighlighter language=\"tsx\">{`import { useAuth } from '@/auth'\nimport SomeOauthSdkSignInMethod from 'SomeOauthSdk'\n\nconst YourComponent = () => {\n const { oAuthSignIn } = useAuth();\n\n const handleOAuthSignIn = () => {\n\n oAuthSignIn(async ({redirect, onSignIn}) => {\n try {\n const resp = await SomeOauthSdkSignInMethod()\n if (resp) {\n /** extract token & user information for the response */ \n const { token, user } = resp\n onSignIn({accessToken: token}, user)\n redirect()\n }\n } catch (error) {\n console.error('Failed to login')\n }\n })\n }\n\n const handleLogout = () => {\n signOut();\n };\n\n return (\n <button onClick={handleOAuthSignIn}>Login with OAuth</button>\n );\n};\n`}</SyntaxHighlighter>\n </div>\n <div className=\"mt-10\" id=\"customizing-data-model\">\n <h5>Customizing the Data Models</h5>\n <p className=\"mt-1\">\n Since not all applications having the same data model, you\n can customize the data structures in{' '}\n <code>@/types/auth.ts</code> and{' '}\n <code>@/auth/AuthProvider.ts</code> to suit your needs.\n Adjust the types and interfaces defined for{' '}\n <code>User</code>, <code>Token</code>, and other\n authentication-related entities according to your\n application's requirements.\n </p>\n <SyntaxHighlighter language=\"ts\">{`// Example: Modifying the User type\nexport type User = {\n userId?: string | null\n avatar?: string | null\n userName?: string | null\n email?: string | null\n authority?: string[]\n // Add your custom fields here\n role?: string | null\n};\n`}</SyntaxHighlighter>\n <div className=\"mt-10\" id=\"useAuth\">\n <h5>Diving into AuthProvider</h5>\n <p className=\"mt-1\">\n If the default authentication implementation doesn't\n meet your needs, feel free to dive into the{' '}\n <code>AuthProvider</code> to make any necessary\n modifications. This component handles the core logic for\n authentication, including token management, session\n handling, and more. Customizing this logic can help you\n better align the authentication system with your\n application's specific requirements.\n </p>\n <SyntaxHighlighter language=\"tsx\">{`...\nimport { apiSignIn, apiSignOut, apiSignUp } from '@/services/AuthService'\n\nfunction AuthProvider({ children }: AuthProviderProps) {\n \n ...\n\n const handleSignIn = (...) => {\n ... /** Your implementation here */\n }\n\n const handleSignOut = () => {\n ... /** Your implementation here */\n }\n\n const signIn = async (values: SignInCredential): AuthResult => {\n try {\n const resp = await apiSignIn(values)\n if (resp) {\n handleSignIn(...)\n }\n } catch (errors: any) {\n return {\n status: 'failed',\n message: errors?.response?.data?.message || errors.toString(),\n }\n }\n }\n\n const signOut = async () => {\n try {\n await apiSignOut()\n } finally {\n handleSignOut()\n navigate(appConfig.unAuthenticatedEntryPath)\n }\n }\n ... \n \n return (\n <AuthContext.Provider value={{\n signIn,\n signOut,\n ...\n }}>\n {children}\n </AuthContext.Provider>\n )\n}\n`}</SyntaxHighlighter>\n </div>\n </div>\n </>\n )\n}\n\nexport default Authentication\n"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ type Auth = {
|
|
|
4
4
|
user: User;
|
|
5
5
|
signIn: (values: SignInCredential) => AuthResult;
|
|
6
6
|
signUp: (values: SignUpCredential) => AuthResult;
|
|
7
|
-
signOut: () => void;
|
|
7
|
+
signOut: (redirectUrl?: string) => void;
|
|
8
8
|
oAuthSignIn: (callback: (payload: OauthSignInCallbackPayload) => void) => void;
|
|
9
9
|
updateUserSession: (newUserData: Partial<User>) => void;
|
|
10
10
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthContext.d.ts","sourceRoot":"","sources":["../../../../lib/@ecme/auth/AuthContext.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,IAAI,EACJ,0BAA0B,EAC3B,MAAM,eAAe,CAAC;AAEvB,KAAK,IAAI,GAAG;IACV,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,UAAU,CAAC;IACjD,MAAM,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,UAAU,CAAC;IACjD,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"AuthContext.d.ts","sourceRoot":"","sources":["../../../../lib/@ecme/auth/AuthContext.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,IAAI,EACJ,0BAA0B,EAC3B,MAAM,eAAe,CAAC;AAEvB,KAAK,IAAI,GAAG;IACV,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,UAAU,CAAC;IACjD,MAAM,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,UAAU,CAAC;IACjD,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,WAAW,EAAE,CACX,QAAQ,EAAE,CAAC,OAAO,EAAE,0BAA0B,KAAK,IAAI,KACpD,IAAI,CAAC;IACV,iBAAiB,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;CACzD,CAAC;AAyBF,QAAA,MAAM,WAAW,+BAQf,CAAC;AAEH,eAAe,WAAW,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../../../../lib/@ecme/auth/AuthProvider.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../../../../lib/@ecme/auth/AuthProvider.tsx"],"names":[],"mappings":"AA2BA,OAAO,EAAE,SAAS,EAAoC,MAAM,OAAO,CAAA;AACnE,OAAO,EAAE,gBAAgB,EAAe,MAAM,kBAAkB,CAAA;AAGhE,KAAK,iBAAiB,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,CAAA;AAEhD,MAAM,MAAM,oBAAoB,GAAG;IAC/B,QAAQ,EAAE,gBAAgB,CAAA;CAC7B,CAAA;AA+BD,iBAAS,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,iBAAiB,2CA4NpD;AAED,eAAe,YAAY,CAAA"}
|
|
@@ -3,7 +3,7 @@ declare const useAuth: () => {
|
|
|
3
3
|
user: import("..").User;
|
|
4
4
|
signIn: (values: import("..").SignInCredential) => import("..").AuthResult;
|
|
5
5
|
signUp: (values: import("..").SignUpCredential) => import("..").AuthResult;
|
|
6
|
-
signOut: () => void;
|
|
6
|
+
signOut: (redirectUrl?: string) => void;
|
|
7
7
|
oAuthSignIn: (callback: (payload: import("..").OauthSignInCallbackPayload) => void) => void;
|
|
8
8
|
updateUserSession: (newUserData: Partial<import("..").User>) => void;
|
|
9
9
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../../../lib/@ecme/auth/useAuth.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,OAAO
|
|
1
|
+
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../../../lib/@ecme/auth/useAuth.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,OAAO;;;;;yBAWuC,CAAC;;;CAHpD,CAAA;AAED,eAAe,OAAO,CAAA"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const SIGN_IN_DEFAULT_ERROR_MESSAGE = "N\u00E3o foi poss\u00EDvel realizar o login. Tente novamente mais tarde.";
|
|
2
|
+
export declare const SIGN_IN_NETWORK_ERROR_MESSAGE = "N\u00E3o foi poss\u00EDvel conectar ao servidor. Verifique sua conex\u00E3o e tente novamente.";
|
|
3
|
+
export declare const SIGN_IN_ERROR_MESSAGES_BY_STATUS: Record<number, string>;
|
|
4
|
+
//# sourceMappingURL=auth.constant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.constant.d.ts","sourceRoot":"","sources":["../../../../lib/@ecme/constants/auth.constant.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,6BAA6B,6EAC0B,CAAA;AAEpE,eAAO,MAAM,6BAA6B,mGAC2C,CAAA;AAErF,eAAO,MAAM,gCAAgC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAYnE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../lib/@ecme/constants/index.ts"],"names":[],"mappings":"AACA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../lib/@ecme/constants/index.ts"],"names":[],"mappings":"AACA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignIn.d.ts","sourceRoot":"","sources":["../../../../../../lib/@ecme/views/auth/SignIn/SignIn.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SignIn.d.ts","sourceRoot":"","sources":["../../../../../../lib/@ecme/views/auth/SignIn/SignIn.tsx"],"names":[],"mappings":"AAMA,KAAK,WAAW,GAAG;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,kDAIxB,WAAW,4CA+Bb,CAAA;AAED,QAAA,MAAM,MAAM,+CAEX,CAAA;AAED,eAAe,MAAM,CAAA"}
|
|
@@ -3,7 +3,6 @@ import type { CommonProps } from "@/@types/common";
|
|
|
3
3
|
interface SignInFormProps extends CommonProps {
|
|
4
4
|
disableSubmit?: boolean;
|
|
5
5
|
passwordHint?: string | ReactNode;
|
|
6
|
-
setMessage?: (message: string) => void;
|
|
7
6
|
}
|
|
8
7
|
declare const SignInForm: (props: SignInFormProps) => import("react/jsx-runtime").JSX.Element;
|
|
9
8
|
export default SignInForm;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignInForm.d.ts","sourceRoot":"","sources":["../../../../../../../lib/@ecme/views/auth/SignIn/components/SignInForm.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAY,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"SignInForm.d.ts","sourceRoot":"","sources":["../../../../../../../lib/@ecme/views/auth/SignIn/components/SignInForm.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAY,MAAM,OAAO,CAAC;AAY5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,UAAU,eAAgB,SAAQ,WAAW;IAC3C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AAgBD,QAAA,MAAM,UAAU,GAAI,OAAO,eAAe,4CAgGzC,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Authentication.d.ts","sourceRoot":"","sources":["../../../../../../../lib/@ecme/views/guide/Documentations/components/Authentication.tsx"],"names":[],"mappings":"AAIA,QAAA,MAAM,cAAc,+
|
|
1
|
+
{"version":3,"file":"Authentication.d.ts","sourceRoot":"","sources":["../../../../../../../lib/@ecme/views/guide/Documentations/components/Authentication.tsx"],"names":[],"mappings":"AAIA,QAAA,MAAM,cAAc,+CA+PnB,CAAA;AAED,eAAe,cAAc,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useIdleTimeout.d.ts","sourceRoot":"","sources":["../../../../lib/base/hooks/useIdleTimeout.ts"],"names":[],"mappings":"AAGA,UAAU,qBAAqB;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"useIdleTimeout.d.ts","sourceRoot":"","sources":["../../../../lib/base/hooks/useIdleTimeout.ts"],"names":[],"mappings":"AAGA,UAAU,qBAAqB;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,OAAO,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,wBAAgB,cAAc,CAAC,EAC3B,OAAY,EACZ,SAAS,EACT,OAAc,GACjB,EAAE,qBAAqB,QAmBvB;AAED,eAAe,cAAc,CAAA"}
|
|
@@ -7,7 +7,8 @@ function useIdleTimeout({
|
|
|
7
7
|
}) {
|
|
8
8
|
const handleIdle = useCallback(() => {
|
|
9
9
|
if (enabled) {
|
|
10
|
-
|
|
10
|
+
const redirectUrl = window.location.pathname + window.location.search + window.location.hash;
|
|
11
|
+
onTimeout(redirectUrl);
|
|
11
12
|
}
|
|
12
13
|
}, [enabled, onTimeout]);
|
|
13
14
|
useIdleTimer({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useIdleTimeout.js","sources":["../../../lib/base/hooks/useIdleTimeout.ts"],"sourcesContent":["import { useIdleTimer } from 'react-idle-timer'\nimport { useCallback } from 'react'\n\ninterface UseIdleTimeoutOptions {\n timeout?: number\n onTimeout: () => void\n enabled?: boolean\n}\n\nexport function useIdleTimeout({\n timeout = 60,\n onTimeout,\n enabled = true,\n}: UseIdleTimeoutOptions) {\n const handleIdle = useCallback(() => {\n if (enabled) {\n onTimeout()\n }\n }, [enabled, onTimeout])\n\n useIdleTimer({\n timeout: timeout * 1000,\n onIdle: handleIdle,\n disabled: !enabled,\n debounce: 500,\n crossTab: true,\n syncTimers: 200,\n })\n}\n\nexport default useIdleTimeout\n"],"names":[],"mappings":";;AASO,SAAS,eAAe;AAAA,EAC3B,UAAU;AAAA,EACV;AAAA,EACA,UAAU;AACd,GAA0B;AACtB,QAAM,aAAa,YAAY,MAAM;AACjC,QAAI,SAAS;AACT,
|
|
1
|
+
{"version":3,"file":"useIdleTimeout.js","sources":["../../../lib/base/hooks/useIdleTimeout.ts"],"sourcesContent":["import { useIdleTimer } from 'react-idle-timer'\nimport { useCallback } from 'react'\n\ninterface UseIdleTimeoutOptions {\n timeout?: number\n onTimeout: (redirectUrl: string) => void\n enabled?: boolean\n}\n\nexport function useIdleTimeout({\n timeout = 60,\n onTimeout,\n enabled = true,\n}: UseIdleTimeoutOptions) {\n const handleIdle = useCallback(() => {\n if (enabled) {\n const redirectUrl =\n window.location.pathname +\n window.location.search +\n window.location.hash\n onTimeout(redirectUrl)\n }\n }, [enabled, onTimeout])\n\n useIdleTimer({\n timeout: timeout * 1000,\n onIdle: handleIdle,\n disabled: !enabled,\n debounce: 500,\n crossTab: true,\n syncTimers: 200,\n })\n}\n\nexport default useIdleTimeout\n"],"names":[],"mappings":";;AASO,SAAS,eAAe;AAAA,EAC3B,UAAU;AAAA,EACV;AAAA,EACA,UAAU;AACd,GAA0B;AACtB,QAAM,aAAa,YAAY,MAAM;AACjC,QAAI,SAAS;AACT,YAAM,cACF,OAAO,SAAS,WAChB,OAAO,SAAS,SAChB,OAAO,SAAS;AACpB,gBAAU,WAAW;AAAA,IACzB;AAAA,EACJ,GAAG,CAAC,SAAS,SAAS,CAAC;AAEvB,eAAa;AAAA,IACT,SAAS,UAAU;AAAA,IACnB,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,IACX,UAAU;AAAA,IACV,UAAU;AAAA,IACV,YAAY;AAAA,EAAA,CACf;AACL;"}
|
|
@@ -12,7 +12,7 @@ type Auth = {
|
|
|
12
12
|
user: User;
|
|
13
13
|
signIn: (values: SignInCredential) => AuthResult;
|
|
14
14
|
signUp: (values: SignUpCredential) => AuthResult;
|
|
15
|
-
signOut: () => void;
|
|
15
|
+
signOut: (redirectUrl?: string) => void;
|
|
16
16
|
oAuthSignIn: (
|
|
17
17
|
callback: (payload: OauthSignInCallbackPayload) => void
|
|
18
18
|
) => void;
|
|
@@ -8,6 +8,11 @@ import type {
|
|
|
8
8
|
} from '@/@types/auth'
|
|
9
9
|
import appConfig from '@/configs/app.config'
|
|
10
10
|
import { REDIRECT_URL_KEY } from '@/constants/app.constant'
|
|
11
|
+
import {
|
|
12
|
+
SIGN_IN_DEFAULT_ERROR_MESSAGE,
|
|
13
|
+
SIGN_IN_ERROR_MESSAGES_BY_STATUS,
|
|
14
|
+
SIGN_IN_NETWORK_ERROR_MESSAGE,
|
|
15
|
+
} from '@/constants/auth.constant'
|
|
11
16
|
import { apiSignIn, apiSignOut, apiSignUp } from '@/services/AuthService'
|
|
12
17
|
import { useSessionUser, useToken } from '@/store/authStore'
|
|
13
18
|
import {
|
|
@@ -42,6 +47,23 @@ const IsolatedNavigator = ({ ref }: { ref: Ref<IsolatedNavigatorRef> }) => {
|
|
|
42
47
|
return <></>
|
|
43
48
|
}
|
|
44
49
|
|
|
50
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
51
|
+
const getSignInErrorMessage = (error: any): string => {
|
|
52
|
+
const response = error?.response
|
|
53
|
+
|
|
54
|
+
if (!response) {
|
|
55
|
+
return error?.request
|
|
56
|
+
? SIGN_IN_NETWORK_ERROR_MESSAGE
|
|
57
|
+
: SIGN_IN_DEFAULT_ERROR_MESSAGE
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return (
|
|
61
|
+
SIGN_IN_ERROR_MESSAGES_BY_STATUS[response.status] ||
|
|
62
|
+
response.data?.message ||
|
|
63
|
+
SIGN_IN_DEFAULT_ERROR_MESSAGE
|
|
64
|
+
)
|
|
65
|
+
}
|
|
66
|
+
|
|
45
67
|
function AuthProvider({ children }: AuthProviderProps) {
|
|
46
68
|
const signedIn = useSessionUser((state) => state.session.signedIn)
|
|
47
69
|
const user = useSessionUser((state) => state.user)
|
|
@@ -171,14 +193,14 @@ function AuthProvider({ children }: AuthProviderProps) {
|
|
|
171
193
|
}
|
|
172
194
|
return {
|
|
173
195
|
status: 'failed',
|
|
174
|
-
message:
|
|
196
|
+
message: SIGN_IN_DEFAULT_ERROR_MESSAGE,
|
|
175
197
|
}
|
|
176
198
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
177
199
|
} catch (errors: any) {
|
|
178
200
|
console.error('ERRO NA CHAMADA DA API:', errors)
|
|
179
201
|
return {
|
|
180
202
|
status: 'failed',
|
|
181
|
-
message: errors
|
|
203
|
+
message: getSignInErrorMessage(errors),
|
|
182
204
|
}
|
|
183
205
|
}
|
|
184
206
|
}
|
|
@@ -215,12 +237,23 @@ function AuthProvider({ children }: AuthProviderProps) {
|
|
|
215
237
|
}
|
|
216
238
|
}
|
|
217
239
|
|
|
218
|
-
const signOut = async () => {
|
|
240
|
+
const signOut = async (redirectUrl?: string) => {
|
|
219
241
|
try {
|
|
220
242
|
await apiSignOut()
|
|
221
243
|
} finally {
|
|
222
244
|
handleSignOut()
|
|
223
|
-
|
|
245
|
+
if (redirectUrl) {
|
|
246
|
+
const params = new URLSearchParams({
|
|
247
|
+
[REDIRECT_URL_KEY]: redirectUrl,
|
|
248
|
+
})
|
|
249
|
+
navigatorRef.current?.navigate(
|
|
250
|
+
`${appConfig.unAuthenticatedEntryPath}?${params.toString()}`,
|
|
251
|
+
)
|
|
252
|
+
} else {
|
|
253
|
+
navigatorRef.current?.navigate(
|
|
254
|
+
appConfig.unAuthenticatedEntryPath,
|
|
255
|
+
)
|
|
256
|
+
}
|
|
224
257
|
}
|
|
225
258
|
}
|
|
226
259
|
const oAuthSignIn = (
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export const SIGN_IN_DEFAULT_ERROR_MESSAGE =
|
|
2
|
+
'Não foi possível realizar o login. Tente novamente mais tarde.'
|
|
3
|
+
|
|
4
|
+
export const SIGN_IN_NETWORK_ERROR_MESSAGE =
|
|
5
|
+
'Não foi possível conectar ao servidor. Verifique sua conexão e tente novamente.'
|
|
6
|
+
|
|
7
|
+
export const SIGN_IN_ERROR_MESSAGES_BY_STATUS: Record<number, string> = {
|
|
8
|
+
400: 'Dados de login inválidos. Verifique as informações e tente novamente.',
|
|
9
|
+
401: 'Login ou senha incorretos.',
|
|
10
|
+
403: 'Acesso negado. Seu usuário não tem permissão para acessar o sistema.',
|
|
11
|
+
404: 'Usuário não encontrado.',
|
|
12
|
+
408: 'O servidor demorou para responder. Tente novamente.',
|
|
13
|
+
423: 'Usuário bloqueado. Entre em contato com o administrador.',
|
|
14
|
+
429: 'Muitas tentativas de login. Aguarde alguns instantes e tente novamente.',
|
|
15
|
+
500: 'Erro interno no servidor. Tente novamente mais tarde.',
|
|
16
|
+
502: 'Serviço indisponível no momento. Tente novamente mais tarde.',
|
|
17
|
+
503: 'Serviço indisponível no momento. Tente novamente mais tarde.',
|
|
18
|
+
504: 'O servidor demorou para responder. Tente novamente mais tarde.',
|
|
19
|
+
}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import ActionLink from '@/components/shared/ActionLink'
|
|
2
|
-
import Alert from '@/components/ui/Alert'
|
|
3
|
-
import useTimeOutMessage from '@/utils/hooks/useTimeOutMessage'
|
|
4
2
|
import SignInForm from './components/SignInForm'
|
|
5
3
|
import Logo from '@/components/template/Logo'
|
|
6
4
|
import { getLogoFilename } from '@base/utils/logo'
|
|
@@ -17,8 +15,6 @@ export const SignInBase = ({
|
|
|
17
15
|
forgetPasswordUrl = '/forgot-password',
|
|
18
16
|
disableSubmit,
|
|
19
17
|
}: SignInProps) => {
|
|
20
|
-
const [message, setMessage] = useTimeOutMessage()
|
|
21
|
-
|
|
22
18
|
const { mode } = useThemeStore()
|
|
23
19
|
|
|
24
20
|
return (
|
|
@@ -33,14 +29,8 @@ export const SignInBase = ({
|
|
|
33
29
|
Digite seus dados para entrar.
|
|
34
30
|
</p>
|
|
35
31
|
</div>
|
|
36
|
-
{message && (
|
|
37
|
-
<Alert showIcon className="mb-4" type="danger">
|
|
38
|
-
<span className="break-all">{message}</span>
|
|
39
|
-
</Alert>
|
|
40
|
-
)}
|
|
41
32
|
<SignInForm
|
|
42
33
|
disableSubmit={disableSubmit}
|
|
43
|
-
setMessage={setMessage}
|
|
44
34
|
passwordHint={
|
|
45
35
|
<div className="mb-6 mt-2">
|
|
46
36
|
<ActionLink
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { ReactNode, useState } from "react";
|
|
2
2
|
import Input from "@/components/ui/Input";
|
|
3
3
|
import Button from "@/components/ui/Button";
|
|
4
|
+
import Notification from "@/components/ui/Notification";
|
|
5
|
+
import toast from "@/components/ui/toast";
|
|
4
6
|
import { FormItem, Form } from "@/components/ui/Form";
|
|
5
7
|
import PasswordInput from "@/components/shared/PasswordInput";
|
|
6
8
|
import classNames from "@/utils/classNames";
|
|
@@ -13,7 +15,6 @@ import type { CommonProps } from "@/@types/common";
|
|
|
13
15
|
interface SignInFormProps extends CommonProps {
|
|
14
16
|
disableSubmit?: boolean;
|
|
15
17
|
passwordHint?: string | ReactNode;
|
|
16
|
-
setMessage?: (message: string) => void;
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
type SignInFormSchema = {
|
|
@@ -33,7 +34,7 @@ const validationSchema: ZodType<SignInFormSchema> = z.object({
|
|
|
33
34
|
const SignInForm = (props: SignInFormProps) => {
|
|
34
35
|
const [isSubmitting, setSubmitting] = useState<boolean>(false);
|
|
35
36
|
|
|
36
|
-
const { disableSubmit = false, className,
|
|
37
|
+
const { disableSubmit = false, className, passwordHint } = props;
|
|
37
38
|
|
|
38
39
|
const {
|
|
39
40
|
handleSubmit,
|
|
@@ -58,7 +59,11 @@ const SignInForm = (props: SignInFormProps) => {
|
|
|
58
59
|
const result = await signIn({ username, password });
|
|
59
60
|
|
|
60
61
|
if (result?.status === "failed") {
|
|
61
|
-
|
|
62
|
+
toast.push(
|
|
63
|
+
<Notification title="Erro ao entrar" type="danger">
|
|
64
|
+
{result.message}
|
|
65
|
+
</Notification>
|
|
66
|
+
);
|
|
62
67
|
}
|
|
63
68
|
}
|
|
64
69
|
|
|
@@ -56,9 +56,9 @@ const Authentication = () => {
|
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
58
|
propName: 'signOut',
|
|
59
|
-
type: `<code>() => void</code>`,
|
|
59
|
+
type: `<code>(redirectUrl?: string) => void</code>`,
|
|
60
60
|
default: `-`,
|
|
61
|
-
desc: `A method to sign out the current user
|
|
61
|
+
desc: `A method to sign out the current user. Pass a redirect URL to return there after signing in again.`,
|
|
62
62
|
},
|
|
63
63
|
{
|
|
64
64
|
propName: 'oAuthSignIn',
|
|
@@ -102,6 +102,29 @@ const YourComponent = () => {
|
|
|
102
102
|
</div>
|
|
103
103
|
);
|
|
104
104
|
};
|
|
105
|
+
`}</SyntaxHighlighter>
|
|
106
|
+
<p className="mt-4">
|
|
107
|
+
To return to the current screen after an idle timeout, pass{' '}
|
|
108
|
+
<code>signOut</code> directly to <code>useIdleTimeout</code>.
|
|
109
|
+
The timeout hook supplies the current path, query string,
|
|
110
|
+
and hash to the callback. Calling <code>signOut()</code>{' '}
|
|
111
|
+
without a destination, such as for a manual logout, keeps
|
|
112
|
+
the existing behavior.
|
|
113
|
+
</p>
|
|
114
|
+
<SyntaxHighlighter language="tsx">{`import { useAuth } from '@/auth'
|
|
115
|
+
import { useIdleTimeout } from '@/base/hooks'
|
|
116
|
+
|
|
117
|
+
const SessionTimeout = () => {
|
|
118
|
+
const { signOut, authenticated } = useAuth();
|
|
119
|
+
|
|
120
|
+
useIdleTimeout({
|
|
121
|
+
timeout: 900,
|
|
122
|
+
onTimeout: signOut,
|
|
123
|
+
enabled: authenticated,
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
return null;
|
|
127
|
+
};
|
|
105
128
|
`}</SyntaxHighlighter>
|
|
106
129
|
</div>
|
|
107
130
|
<div className="mt-10" id="OAuth">
|
|
@@ -3,7 +3,7 @@ import { useCallback } from 'react'
|
|
|
3
3
|
|
|
4
4
|
interface UseIdleTimeoutOptions {
|
|
5
5
|
timeout?: number
|
|
6
|
-
onTimeout: () => void
|
|
6
|
+
onTimeout: (redirectUrl: string) => void
|
|
7
7
|
enabled?: boolean
|
|
8
8
|
}
|
|
9
9
|
|
|
@@ -14,7 +14,11 @@ export function useIdleTimeout({
|
|
|
14
14
|
}: UseIdleTimeoutOptions) {
|
|
15
15
|
const handleIdle = useCallback(() => {
|
|
16
16
|
if (enabled) {
|
|
17
|
-
|
|
17
|
+
const redirectUrl =
|
|
18
|
+
window.location.pathname +
|
|
19
|
+
window.location.search +
|
|
20
|
+
window.location.hash
|
|
21
|
+
onTimeout(redirectUrl)
|
|
18
22
|
}
|
|
19
23
|
}, [enabled, onTimeout])
|
|
20
24
|
|
package/package.json
CHANGED