analytica-frontend-lib 1.0.67 → 1.0.70

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.
@@ -0,0 +1,166 @@
1
+ // src/components/Auth/Auth.tsx
2
+ import {
3
+ createContext,
4
+ useContext,
5
+ useEffect,
6
+ useState,
7
+ useCallback,
8
+ useMemo
9
+ } from "react";
10
+ import { useLocation, Navigate } from "react-router-dom";
11
+ import { Fragment, jsx } from "react/jsx-runtime";
12
+ var AuthContext = createContext(void 0);
13
+ var AuthProvider = ({
14
+ children,
15
+ checkAuthFn,
16
+ signOutFn,
17
+ initialAuthState = {},
18
+ getUserFn,
19
+ getSessionFn,
20
+ getTokensFn
21
+ }) => {
22
+ const [authState, setAuthState] = useState({
23
+ isAuthenticated: false,
24
+ isLoading: true,
25
+ ...initialAuthState
26
+ });
27
+ const checkAuth = useCallback(async () => {
28
+ try {
29
+ setAuthState((prev) => ({ ...prev, isLoading: true }));
30
+ if (!checkAuthFn) {
31
+ setAuthState((prev) => ({
32
+ ...prev,
33
+ isAuthenticated: false,
34
+ isLoading: false
35
+ }));
36
+ return false;
37
+ }
38
+ const isAuth = await checkAuthFn();
39
+ setAuthState((prev) => ({
40
+ ...prev,
41
+ isAuthenticated: isAuth,
42
+ isLoading: false,
43
+ user: getUserFn ? getUserFn() : prev.user,
44
+ sessionInfo: getSessionFn ? getSessionFn() : prev.sessionInfo,
45
+ tokens: getTokensFn ? getTokensFn() : prev.tokens
46
+ }));
47
+ return isAuth;
48
+ } catch (error) {
49
+ console.error("Erro ao verificar autentica\xE7\xE3o:", error);
50
+ setAuthState((prev) => ({
51
+ ...prev,
52
+ isAuthenticated: false,
53
+ isLoading: false
54
+ }));
55
+ return false;
56
+ }
57
+ }, [checkAuthFn, getUserFn, getSessionFn, getTokensFn]);
58
+ const signOut = useCallback(() => {
59
+ if (signOutFn) {
60
+ signOutFn();
61
+ }
62
+ setAuthState((prev) => ({
63
+ ...prev,
64
+ isAuthenticated: false,
65
+ user: void 0,
66
+ sessionInfo: void 0,
67
+ tokens: void 0
68
+ }));
69
+ }, [signOutFn]);
70
+ useEffect(() => {
71
+ checkAuth();
72
+ }, [checkAuth]);
73
+ const contextValue = useMemo(
74
+ () => ({
75
+ ...authState,
76
+ checkAuth,
77
+ signOut
78
+ }),
79
+ [authState, checkAuth, signOut]
80
+ );
81
+ return /* @__PURE__ */ jsx(AuthContext.Provider, { value: contextValue, children });
82
+ };
83
+ var useAuth = () => {
84
+ const context = useContext(AuthContext);
85
+ if (context === void 0) {
86
+ throw new Error("useAuth deve ser usado dentro de um AuthProvider");
87
+ }
88
+ return context;
89
+ };
90
+ var ProtectedRoute = ({
91
+ children,
92
+ redirectTo = "/",
93
+ loadingComponent,
94
+ additionalCheck
95
+ }) => {
96
+ const { isAuthenticated, isLoading, ...authState } = useAuth();
97
+ const defaultLoadingComponent = /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center min-h-screen", children: /* @__PURE__ */ jsx("div", { className: "text-text-950 text-lg", children: "Carregando..." }) });
98
+ if (isLoading) {
99
+ return /* @__PURE__ */ jsx(Fragment, { children: loadingComponent || defaultLoadingComponent });
100
+ }
101
+ if (!isAuthenticated) {
102
+ return /* @__PURE__ */ jsx(Navigate, { to: redirectTo, replace: true });
103
+ }
104
+ if (additionalCheck && !additionalCheck({ isAuthenticated, isLoading, ...authState })) {
105
+ return /* @__PURE__ */ jsx(Navigate, { to: redirectTo, replace: true });
106
+ }
107
+ return /* @__PURE__ */ jsx(Fragment, { children });
108
+ };
109
+ var PublicRoute = ({
110
+ children,
111
+ redirectTo = "/painel",
112
+ redirectIfAuthenticated = false,
113
+ checkAuthBeforeRender = false
114
+ }) => {
115
+ const { isAuthenticated, isLoading } = useAuth();
116
+ if (checkAuthBeforeRender && isLoading) {
117
+ return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center min-h-screen", children: /* @__PURE__ */ jsx("div", { className: "text-text-950 text-lg", children: "Carregando..." }) });
118
+ }
119
+ if (isAuthenticated && redirectIfAuthenticated) {
120
+ return /* @__PURE__ */ jsx(Navigate, { to: redirectTo, replace: true });
121
+ }
122
+ return /* @__PURE__ */ jsx(Fragment, { children });
123
+ };
124
+ var withAuth = (Component, options = {}) => {
125
+ return (props) => /* @__PURE__ */ jsx(ProtectedRoute, { ...options, children: /* @__PURE__ */ jsx(Component, { ...props }) });
126
+ };
127
+ var useAuthGuard = (options = {}) => {
128
+ const authState = useAuth();
129
+ const { requireAuth = true, customCheck } = options;
130
+ const canAccess = !authState.isLoading && (requireAuth ? authState.isAuthenticated && (!customCheck || customCheck(authState)) : !authState.isAuthenticated || !customCheck || customCheck(authState));
131
+ return {
132
+ canAccess,
133
+ isLoading: authState.isLoading,
134
+ authState
135
+ };
136
+ };
137
+ var useRouteAuth = (fallbackPath = "/") => {
138
+ const { isAuthenticated, isLoading } = useAuth();
139
+ const location = useLocation();
140
+ const redirectToLogin = () => /* @__PURE__ */ jsx(Navigate, { to: fallbackPath, state: { from: location }, replace: true });
141
+ return {
142
+ isAuthenticated,
143
+ isLoading,
144
+ redirectToLogin
145
+ };
146
+ };
147
+ var Auth_default = {
148
+ AuthProvider,
149
+ ProtectedRoute,
150
+ PublicRoute,
151
+ withAuth,
152
+ useAuth,
153
+ useAuthGuard,
154
+ useRouteAuth
155
+ };
156
+ export {
157
+ AuthProvider,
158
+ ProtectedRoute,
159
+ PublicRoute,
160
+ Auth_default as default,
161
+ useAuth,
162
+ useAuthGuard,
163
+ useRouteAuth,
164
+ withAuth
165
+ };
166
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/Auth/Auth.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n useEffect,\n useState,\n ReactNode,\n ComponentType,\n useCallback,\n useMemo,\n} from 'react';\nimport { useLocation, Navigate } from 'react-router-dom';\n\n/**\n * Interface básica para tokens de autenticação\n */\nexport interface AuthTokens {\n token: string;\n refreshToken: string;\n [key: string]: unknown;\n}\n\n/**\n * Interface básica para usuário\n */\nexport interface AuthUser {\n id: string;\n name?: string;\n email?: string;\n [key: string]: unknown;\n}\n\n/**\n * Interface básica para informações de sessão\n */\nexport interface SessionInfo {\n institutionId?: string;\n profileId?: string;\n schoolId?: string;\n schoolYearId?: string;\n classId?: string;\n [key: string]: unknown;\n}\n\n/**\n * Interface para o estado de autenticação\n */\nexport interface AuthState {\n isAuthenticated: boolean;\n isLoading: boolean;\n user?: AuthUser | null;\n sessionInfo?: SessionInfo | null;\n tokens?: AuthTokens | null;\n}\n\n/**\n * Interface para as funções de autenticação\n */\nexport interface AuthContextType extends AuthState {\n checkAuth: () => Promise<boolean>;\n signOut: () => void;\n}\n\n/**\n * Context de autenticação\n */\nconst AuthContext = createContext<AuthContextType | undefined>(undefined);\n\n/**\n * Props do AuthProvider\n */\nexport interface AuthProviderProps {\n children: ReactNode;\n /**\n * Função para verificar se o usuário está autenticado\n * Deve retornar uma Promise<boolean>\n */\n checkAuthFn?: () => Promise<boolean> | boolean;\n /**\n * Função para fazer logout\n */\n signOutFn?: () => void;\n /**\n * Estado de autenticação inicial\n */\n initialAuthState?: Partial<AuthState>;\n /**\n * Função para obter dados do usuário (opcional)\n */\n getUserFn?: () => AuthUser | null | undefined;\n /**\n * Função para obter informações da sessão (opcional)\n */\n getSessionFn?: () => SessionInfo | null | undefined;\n /**\n * Função para obter tokens (opcional)\n */\n getTokensFn?: () => AuthTokens | null | undefined;\n}\n\n/**\n * Provider de autenticação que gerencia o estado global de auth\n * Compatível com qualquer store (Zustand, Redux, Context, etc.)\n */\nexport const AuthProvider = ({\n children,\n checkAuthFn,\n signOutFn,\n initialAuthState = {},\n getUserFn,\n getSessionFn,\n getTokensFn,\n}: AuthProviderProps) => {\n const [authState, setAuthState] = useState<AuthState>({\n isAuthenticated: false,\n isLoading: true,\n ...initialAuthState,\n });\n\n const checkAuth = useCallback(async (): Promise<boolean> => {\n try {\n setAuthState((prev) => ({ ...prev, isLoading: true }));\n\n // Se não há função de verificação, assume como não autenticado\n if (!checkAuthFn) {\n setAuthState((prev) => ({\n ...prev,\n isAuthenticated: false,\n isLoading: false,\n }));\n return false;\n }\n\n const isAuth = await checkAuthFn();\n\n setAuthState((prev) => ({\n ...prev,\n isAuthenticated: isAuth,\n isLoading: false,\n user: getUserFn ? getUserFn() : prev.user,\n sessionInfo: getSessionFn ? getSessionFn() : prev.sessionInfo,\n tokens: getTokensFn ? getTokensFn() : prev.tokens,\n }));\n\n return isAuth;\n } catch (error) {\n console.error('Erro ao verificar autenticação:', error);\n setAuthState((prev) => ({\n ...prev,\n isAuthenticated: false,\n isLoading: false,\n }));\n return false;\n }\n }, [checkAuthFn, getUserFn, getSessionFn, getTokensFn]);\n\n const signOut = useCallback(() => {\n if (signOutFn) {\n signOutFn();\n }\n setAuthState((prev) => ({\n ...prev,\n isAuthenticated: false,\n user: undefined,\n sessionInfo: undefined,\n tokens: undefined,\n }));\n }, [signOutFn]);\n\n useEffect(() => {\n checkAuth();\n }, [checkAuth]);\n\n const contextValue = useMemo(\n (): AuthContextType => ({\n ...authState,\n checkAuth,\n signOut,\n }),\n [authState, checkAuth, signOut]\n );\n\n return (\n <AuthContext.Provider value={contextValue}>{children}</AuthContext.Provider>\n );\n};\n\n/**\n * Hook para usar o contexto de autenticação\n */\nexport const useAuth = (): AuthContextType => {\n const context = useContext(AuthContext);\n if (context === undefined) {\n throw new Error('useAuth deve ser usado dentro de um AuthProvider');\n }\n return context;\n};\n\n/**\n * Props do ProtectedRoute\n */\nexport interface ProtectedRouteProps {\n children: ReactNode;\n /**\n * Path para redirecionamento quando não autenticado\n */\n redirectTo?: string;\n /**\n * Componente de loading personalizado\n */\n loadingComponent?: ReactNode;\n /**\n * Função adicional de verificação (ex: verificar permissões específicas)\n */\n additionalCheck?: (authState: AuthState) => boolean;\n}\n\n/**\n * Componente para proteger rotas que requerem autenticação\n *\n * @example\n * ```tsx\n * <ProtectedRoute redirectTo=\"/login\">\n * <PainelPage />\n * </ProtectedRoute>\n * ```\n */\nexport const ProtectedRoute = ({\n children,\n redirectTo = '/',\n loadingComponent,\n additionalCheck,\n}: ProtectedRouteProps) => {\n const { isAuthenticated, isLoading, ...authState } = useAuth();\n\n // Componente de loading padrão\n const defaultLoadingComponent = (\n <div className=\"flex items-center justify-center min-h-screen\">\n <div className=\"text-text-950 text-lg\">Carregando...</div>\n </div>\n );\n\n // Mostrar loading enquanto verifica autenticação\n if (isLoading) {\n return <>{loadingComponent || defaultLoadingComponent}</>;\n }\n\n // Verificar autenticação básica\n if (!isAuthenticated) {\n return <Navigate to={redirectTo} replace />;\n }\n\n // Verificação adicional (ex: permissões)\n if (\n additionalCheck &&\n !additionalCheck({ isAuthenticated, isLoading, ...authState })\n ) {\n return <Navigate to={redirectTo} replace />;\n }\n\n return <>{children}</>;\n};\n\n/**\n * Props do PublicRoute\n */\nexport interface PublicRouteProps {\n children: ReactNode;\n /**\n * Path para redirecionamento\n */\n redirectTo?: string;\n /**\n * Se deve redirecionar quando usuário estiver autenticado\n */\n redirectIfAuthenticated?: boolean;\n /**\n * Se deve verificar autenticação antes de renderizar\n */\n checkAuthBeforeRender?: boolean;\n}\n\n/**\n * Componente para rotas públicas (login, recuperação de senha, etc.)\n * Opcionalmente redireciona se o usuário já estiver autenticado\n *\n * @example\n * ```tsx\n * <PublicRoute redirectTo=\"/painel\" redirectIfAuthenticated={true}>\n * <LoginPage />\n * </PublicRoute>\n * ```\n */\nexport const PublicRoute = ({\n children,\n redirectTo = '/painel',\n redirectIfAuthenticated = false,\n checkAuthBeforeRender = false,\n}: PublicRouteProps) => {\n const { isAuthenticated, isLoading } = useAuth();\n\n // Se deve aguardar verificação de auth antes de renderizar\n if (checkAuthBeforeRender && isLoading) {\n return (\n <div className=\"flex items-center justify-center min-h-screen\">\n <div className=\"text-text-950 text-lg\">Carregando...</div>\n </div>\n );\n }\n\n // Redirecionar se já autenticado e configurado para isso\n if (isAuthenticated && redirectIfAuthenticated) {\n return <Navigate to={redirectTo} replace />;\n }\n\n return <>{children}</>;\n};\n\n/**\n * HOC para proteger componentes com autenticação\n *\n * @example\n * ```tsx\n * const ProtectedComponent = withAuth(MyComponent, {\n * fallback: \"/login\",\n * loadingComponent: <CustomSpinner />\n * });\n * ```\n */\nexport const withAuth = <P extends object>(\n Component: ComponentType<P>,\n options: Omit<ProtectedRouteProps, 'children'> = {}\n) => {\n return (props: P) => (\n <ProtectedRoute {...options}>\n <Component {...props} />\n </ProtectedRoute>\n );\n};\n\n/**\n * Hook para guard de autenticação com verificações customizadas\n *\n * @example\n * ```tsx\n * const { canAccess, isLoading } = useAuthGuard({\n * requireAuth: true,\n * customCheck: (user) => user?.role === 'admin'\n * });\n * ```\n */\nexport const useAuthGuard = (\n options: {\n requireAuth?: boolean;\n customCheck?: (authState: AuthState) => boolean;\n } = {}\n) => {\n const authState = useAuth();\n const { requireAuth = true, customCheck } = options;\n\n const canAccess =\n !authState.isLoading &&\n (requireAuth\n ? authState.isAuthenticated && (!customCheck || customCheck(authState))\n : !authState.isAuthenticated || !customCheck || customCheck(authState));\n\n return {\n canAccess,\n isLoading: authState.isLoading,\n authState,\n };\n};\n\n/**\n * Hook para verificar autenticação em rotas específicas\n * Útil para verificações condicionais dentro de componentes\n *\n * @example\n * ```tsx\n * const { isAuthenticated, redirectToLogin } = useRouteAuth();\n *\n * if (!isAuthenticated) {\n * return redirectToLogin();\n * }\n * ```\n */\nexport const useRouteAuth = (fallbackPath = '/') => {\n const { isAuthenticated, isLoading } = useAuth();\n const location = useLocation();\n\n const redirectToLogin = () => (\n <Navigate to={fallbackPath} state={{ from: location }} replace />\n );\n\n return {\n isAuthenticated,\n isLoading,\n redirectToLogin,\n };\n};\n\nexport default {\n AuthProvider,\n ProtectedRoute,\n PublicRoute,\n withAuth,\n useAuth,\n useAuthGuard,\n useRouteAuth,\n};\n"],"mappings":"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","names":[]}
@@ -114,5 +114,12 @@ interface CardAudioProps extends HTMLAttributes<HTMLDivElement> {
114
114
  }>;
115
115
  }
116
116
  declare const CardAudio: react.ForwardRefExoticComponent<CardAudioProps & react.RefAttributes<HTMLDivElement>>;
117
+ interface CardSimuladoProps extends HTMLAttributes<HTMLDivElement> {
118
+ title: string;
119
+ duration?: string;
120
+ info: string;
121
+ backgroundColor: 'enem' | 'prova' | 'simuladao' | 'vestibular';
122
+ }
123
+ declare const CardSimulado: react.ForwardRefExoticComponent<CardSimuladoProps & react.RefAttributes<HTMLDivElement>>;
117
124
 
118
- export { CardActivitiesResults, CardAudio, CardBase, CardForum, CardPerformance, CardProgress, CardQuestions, CardResults, CardSettings, CardStatus, CardSupport, CardTopic };
125
+ export { CardActivitiesResults, CardAudio, CardBase, CardForum, CardPerformance, CardProgress, CardQuestions, CardResults, CardSettings, CardSimulado, CardStatus, CardSupport, CardTopic };
@@ -114,5 +114,12 @@ interface CardAudioProps extends HTMLAttributes<HTMLDivElement> {
114
114
  }>;
115
115
  }
116
116
  declare const CardAudio: react.ForwardRefExoticComponent<CardAudioProps & react.RefAttributes<HTMLDivElement>>;
117
+ interface CardSimuladoProps extends HTMLAttributes<HTMLDivElement> {
118
+ title: string;
119
+ duration?: string;
120
+ info: string;
121
+ backgroundColor: 'enem' | 'prova' | 'simuladao' | 'vestibular';
122
+ }
123
+ declare const CardSimulado: react.ForwardRefExoticComponent<CardSimuladoProps & react.RefAttributes<HTMLDivElement>>;
117
124
 
118
- export { CardActivitiesResults, CardAudio, CardBase, CardForum, CardPerformance, CardProgress, CardQuestions, CardResults, CardSettings, CardStatus, CardSupport, CardTopic };
125
+ export { CardActivitiesResults, CardAudio, CardBase, CardForum, CardPerformance, CardProgress, CardQuestions, CardResults, CardSettings, CardSimulado, CardStatus, CardSupport, CardTopic };
@@ -29,6 +29,7 @@ __export(Card_exports, {
29
29
  CardQuestions: () => CardQuestions,
30
30
  CardResults: () => CardResults,
31
31
  CardSettings: () => CardSettings,
32
+ CardSimulado: () => CardSimulado,
32
33
  CardStatus: () => CardStatus,
33
34
  CardSupport: () => CardSupport,
34
35
  CardTopic: () => CardTopic
@@ -1549,6 +1550,49 @@ var CardAudio = (0, import_react.forwardRef)(
1549
1550
  );
1550
1551
  }
1551
1552
  );
1553
+ var SIMULADO_BACKGROUND_CLASSES = {
1554
+ enem: "bg-exam-1",
1555
+ prova: "bg-exam-2",
1556
+ simuladao: "bg-exam-3",
1557
+ vestibular: "bg-exam-4"
1558
+ };
1559
+ var CardSimulado = (0, import_react.forwardRef)(
1560
+ ({ title, duration, info, backgroundColor, className, ...props }, ref) => {
1561
+ const backgroundClass = SIMULADO_BACKGROUND_CLASSES[backgroundColor];
1562
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1563
+ CardBase,
1564
+ {
1565
+ ref,
1566
+ layout: "horizontal",
1567
+ padding: "medium",
1568
+ minHeight: "none",
1569
+ cursor: "pointer",
1570
+ className: `${backgroundClass} hover:shadow-soft-shadow-2 transition-shadow duration-200 ${className}`,
1571
+ ...props,
1572
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "flex justify-between items-center w-full gap-4", children: [
1573
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "flex flex-col gap-1 flex-1 min-w-0", children: [
1574
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Text_default, { size: "lg", weight: "bold", className: "text-text-950 truncate", children: title }),
1575
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "flex items-center gap-4 text-text-700", children: [
1576
+ duration && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "flex items-center gap-1", children: [
1577
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_phosphor_react2.Clock, { size: 16, className: "flex-shrink-0" }),
1578
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Text_default, { size: "sm", children: duration })
1579
+ ] }),
1580
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Text_default, { size: "sm", className: "truncate", children: info })
1581
+ ] })
1582
+ ] }),
1583
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1584
+ import_phosphor_react2.CaretRight,
1585
+ {
1586
+ size: 24,
1587
+ className: "text-text-800 flex-shrink-0",
1588
+ "data-testid": "caret-icon"
1589
+ }
1590
+ )
1591
+ ] })
1592
+ }
1593
+ );
1594
+ }
1595
+ );
1552
1596
  // Annotate the CommonJS export names for ESM import in node:
1553
1597
  0 && (module.exports = {
1554
1598
  CardActivitiesResults,
@@ -1560,6 +1604,7 @@ var CardAudio = (0, import_react.forwardRef)(
1560
1604
  CardQuestions,
1561
1605
  CardResults,
1562
1606
  CardSettings,
1607
+ CardSimulado,
1563
1608
  CardStatus,
1564
1609
  CardSupport,
1565
1610
  CardTopic