@q2devel/q2-core 1.0.5 → 1.0.6

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.
Files changed (40) hide show
  1. package/dist/auth/auth/auth.config.d.ts +14 -0
  2. package/dist/auth/auth/auth.config.d.ts.map +1 -0
  3. package/dist/auth/auth/auth.d.ts +36 -0
  4. package/dist/auth/auth/auth.d.ts.map +1 -0
  5. package/dist/auth/auth/auth.js +111 -0
  6. package/dist/auth/auth/auth.types.d.ts +38 -0
  7. package/dist/auth/auth/auth.types.d.ts.map +1 -0
  8. package/dist/auth/context/AuthContext.d.ts +4 -0
  9. package/dist/auth/context/AuthContext.d.ts.map +1 -0
  10. package/dist/auth/context/AuthContext.js +158 -0
  11. package/dist/auth/hooks/useCurrentUser.d.ts +11 -0
  12. package/dist/auth/hooks/useCurrentUser.d.ts.map +1 -0
  13. package/dist/auth/hooks/useCurrentUser.js +15 -0
  14. package/dist/auth/hooks/useSignIn.d.ts +7 -0
  15. package/dist/auth/hooks/useSignIn.d.ts.map +1 -0
  16. package/dist/auth/hooks/useSignIn.js +33 -0
  17. package/dist/auth/hooks/useSignOut.d.ts +5 -0
  18. package/dist/auth/hooks/useSignOut.d.ts.map +1 -0
  19. package/dist/auth/hooks/useSignOut.js +27 -0
  20. package/dist/auth/services/user.service.d.ts +11 -0
  21. package/dist/auth/services/user.service.d.ts.map +1 -0
  22. package/dist/auth/services/user.service.js +24 -0
  23. package/dist/auth/services/userService.types.d.ts +42 -0
  24. package/dist/auth/services/userService.types.d.ts.map +1 -0
  25. package/dist/auth/services/userService.types.js +1 -0
  26. package/dist/hooks/user/useGetUser.d.ts +1 -1
  27. package/dist/hooks/user/useGetUser.d.ts.map +1 -1
  28. package/dist/index.d.ts +11 -6
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +13 -7
  31. package/package.json +5 -1
  32. package/dist/api/user/getUserCart.d.ts +0 -1
  33. package/dist/api/user/getUserCart.d.ts.map +0 -1
  34. package/dist/api/user/getUserCart.js +0 -1
  35. package/dist/types/ResetPassword.d.ts +0 -8
  36. package/dist/types/ResetPassword.d.ts.map +0 -1
  37. package/dist/types/content/ResetPassword.d.ts +0 -8
  38. package/dist/types/content/ResetPassword.d.ts.map +0 -1
  39. /package/dist/{types/ResetPassword.js → auth/auth/auth.config.js} +0 -0
  40. /package/dist/{types/content/ResetPassword.js → auth/auth/auth.types.js} +0 -0
@@ -0,0 +1,14 @@
1
+ export interface AuthConfig {
2
+ drupalBaseUrl: string;
3
+ clientId: string;
4
+ clientSecret: string;
5
+ cookieOptions?: {
6
+ secure?: boolean;
7
+ sameSite?: 'strict' | 'lax' | 'none';
8
+ expires?: number;
9
+ };
10
+ }
11
+ export interface AuthContext {
12
+ config: AuthConfig;
13
+ }
14
+ //# sourceMappingURL=auth.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.config.d.ts","sourceRoot":"","sources":["../../../auth/auth/auth.config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE;QACZ,MAAM,CAAC,EAAE,OAAO,CAAA;QAChB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAA;QACpC,OAAO,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;CACJ;AAED,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,UAAU,CAAA;CACrB"}
@@ -0,0 +1,36 @@
1
+ import { AuthConfig } from './auth.config';
2
+ import { MakeUserWithAccessToken, User } from './auth.types';
3
+ export type DefaultSignInRequestData = {
4
+ username: string;
5
+ password: string;
6
+ };
7
+ export type DefaultUpdateCurrentUserRequestData = {
8
+ name?: string;
9
+ email?: string;
10
+ };
11
+ export type DefaultUpdateCurrentUserPasswordRequestData = {
12
+ oldPassword: string;
13
+ newPassword: string;
14
+ };
15
+ export type DefaultSignUpRequestData = {
16
+ username: string;
17
+ password: string;
18
+ email: string;
19
+ };
20
+ export type DefaultForgotPasswordRequestData = {
21
+ email: string;
22
+ };
23
+ export type DefaultResetPasswordRequestData = {
24
+ token: string;
25
+ password: string;
26
+ };
27
+ export declare const signInService: (data: DefaultSignInRequestData, config: AuthConfig) => Promise<MakeUserWithAccessToken<User>>;
28
+ export declare const refreshTokenService: (refreshToken: string, config: AuthConfig) => Promise<MakeUserWithAccessToken<User>>;
29
+ export declare const fetchUserInfo: (accessToken: string, config: AuthConfig) => Promise<User>;
30
+ export declare const signOutService: () => Promise<void>;
31
+ export declare const isTokenValid: (expiresAt: string | null) => boolean;
32
+ export declare const hasAuthCookies: (cookies: {
33
+ accessToken?: string;
34
+ user?: string;
35
+ }) => boolean;
36
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../auth/auth/auth.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAE5D,MAAM,MAAM,wBAAwB,GAAG;IACnC,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,mCAAmC,GAAG;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CAEjB,CAAA;AAED,MAAM,MAAM,2CAA2C,GAAG;IACtD,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACnC,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;CAEhB,CAAA;AAED,MAAM,MAAM,gCAAgC,GAAG;IAC3C,KAAK,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,+BAA+B,GAAG;IAC1C,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,aAAa,GACtB,MAAM,wBAAwB,EAC9B,QAAQ,UAAU,KACnB,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,CA+BvC,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC5B,cAAc,MAAM,EACpB,QAAQ,UAAU,KACnB,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,CA6BvC,CAAA;AAGD,eAAO,MAAM,aAAa,GAAU,aAAa,MAAM,EAAE,QAAQ,UAAU,KAAG,OAAO,CAAC,IAAI,CAkCzF,CAAA;AAED,eAAO,MAAM,cAAc,QAAa,OAAO,CAAC,IAAI,CAKnD,CAAA;AAGD,eAAO,MAAM,YAAY,GAAI,WAAW,MAAM,GAAG,IAAI,KAAG,OAQvD,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,SAAS;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,KAAG,OAEjF,CAAA"}
@@ -0,0 +1,111 @@
1
+ import axios from 'axios';
2
+ import { jwtDecode } from 'jwt-decode';
3
+ import { getUser } from '../services/user.service';
4
+ export const signInService = async (data, config) => {
5
+ const formData = new URLSearchParams();
6
+ formData.append('grant_type', 'password');
7
+ formData.append('client_id', config.clientId);
8
+ formData.append('client_secret', config.clientSecret);
9
+ formData.append('username', data.username);
10
+ formData.append('password', data.password);
11
+ const response = await fetch(`${config.drupalBaseUrl}/oauth/token`, {
12
+ method: 'POST',
13
+ body: formData,
14
+ headers: {
15
+ 'Content-Type': 'application/x-www-form-urlencoded',
16
+ },
17
+ });
18
+ if (!response.ok) {
19
+ throw new Error('Invalid credentials');
20
+ }
21
+ const tokenData = await response.json();
22
+ // Extrahujeme informace o uživateli z tokenu
23
+ const userInfo = await fetchUserInfo(tokenData.access_token, config);
24
+ return {
25
+ ...userInfo,
26
+ token: tokenData.access_token,
27
+ refreshToken: tokenData.refresh_token,
28
+ expiresAt: Date.now() + tokenData.expires_in * 1000,
29
+ };
30
+ };
31
+ export const refreshTokenService = async (refreshToken, config) => {
32
+ const formData = new URLSearchParams();
33
+ formData.append('grant_type', 'refresh_token');
34
+ formData.append('client_id', config.clientId);
35
+ formData.append('client_secret', config.clientSecret);
36
+ formData.append('refresh_token', refreshToken);
37
+ const response = await fetch(`${config.drupalBaseUrl}/oauth/token`, {
38
+ method: 'POST',
39
+ body: formData,
40
+ headers: {
41
+ 'Content-Type': 'application/x-www-form-urlencoded',
42
+ },
43
+ });
44
+ if (!response.ok) {
45
+ throw new Error('Failed to refresh token');
46
+ }
47
+ const tokenData = await response.json();
48
+ const userInfo = await fetchUserInfo(tokenData.access_token, config);
49
+ return {
50
+ ...userInfo,
51
+ token: tokenData.access_token,
52
+ refreshToken: tokenData.refresh_token || refreshToken,
53
+ expiresAt: Date.now() + tokenData.expires_in * 1000,
54
+ };
55
+ };
56
+ // Pomocná funkce pro získání informací o uživateli z tokenu nebo z API
57
+ export const fetchUserInfo = async (accessToken, config) => {
58
+ try {
59
+ // Dekódovat token a získat základní informace
60
+ const decoded = jwtDecode(accessToken);
61
+ // Vytvořit instanci Axiosu pro použití s getUser
62
+ const axiosInstance = axios.create({
63
+ baseURL: config.drupalBaseUrl,
64
+ });
65
+ // Použít existující getUser službu
66
+ const userData = await getUser({
67
+ axiosInstance,
68
+ userId: decoded.sub,
69
+ token: accessToken,
70
+ });
71
+ // Vrátit data v požadovaném formáte pre AuthContext
72
+ return {
73
+ id: decoded.sub ?? '',
74
+ name: userData.name,
75
+ email: userData.email,
76
+ username: userData.email,
77
+ address: userData.address,
78
+ };
79
+ }
80
+ catch (error) {
81
+ console.error('Error fetching user info:', error);
82
+ try {
83
+ const decoded = jwtDecode(accessToken);
84
+ return { id: decoded.sub ?? '' };
85
+ }
86
+ catch {
87
+ return { id: '' };
88
+ }
89
+ }
90
+ };
91
+ export const signOutService = async () => {
92
+ // Zde můžeš implementovat volání API pro odhlášení, pokud je potřeba
93
+ // V jednoduchém případě stačí vymazat tokeny z lokálního úložiště
94
+ localStorage.removeItem('auth');
95
+ return Promise.resolve();
96
+ };
97
+ // Utility funkcie pre middleware - môžu sa použiť v akýchkoľvek frameworkoch
98
+ export const isTokenValid = (expiresAt) => {
99
+ if (!expiresAt)
100
+ return false;
101
+ try {
102
+ const expires = parseInt(expiresAt);
103
+ return Date.now() < expires;
104
+ }
105
+ catch {
106
+ return false;
107
+ }
108
+ };
109
+ export const hasAuthCookies = (cookies) => {
110
+ return !!(cookies.accessToken && cookies.user);
111
+ };
@@ -0,0 +1,38 @@
1
+ import { ReactNode } from 'react';
2
+ import { UserAddress } from '../services/userService.types';
3
+ import { AuthConfig } from './auth.config';
4
+ export type AccessToken = string;
5
+ export type User = {
6
+ id: string;
7
+ name?: string | null;
8
+ email?: string | null;
9
+ username?: string | null;
10
+ address?: UserAddress;
11
+ };
12
+ export type MakeUserWithAccessToken<U> = U & {
13
+ token: AccessToken;
14
+ refreshToken: string;
15
+ expiresAt: number;
16
+ };
17
+ export interface AuthProviderProps {
18
+ children: ReactNode;
19
+ config: AuthConfig;
20
+ initialAccessToken?: AccessToken;
21
+ initialCurrentUser?: User;
22
+ }
23
+ export interface AuthContextValue {
24
+ isLogged: boolean;
25
+ isReady: boolean;
26
+ user: User | undefined;
27
+ accessToken: AccessToken | undefined;
28
+ refreshToken: string | undefined;
29
+ expiresAt: number | undefined;
30
+ config: AuthConfig;
31
+ setUser: (value?: User) => void;
32
+ setAccessToken: (value?: AccessToken) => void;
33
+ setRefreshToken: (value?: string) => void;
34
+ setExpiresAt: (value?: number) => void;
35
+ refetchCurrentUser: () => Promise<User | undefined>;
36
+ isLoading: boolean;
37
+ }
38
+ //# sourceMappingURL=auth.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.types.d.ts","sourceRoot":"","sources":["../../../auth/auth/auth.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,MAAM,MAAM,WAAW,GAAG,MAAM,CAAA;AAEhC,MAAM,MAAM,IAAI,GAAG;IACf,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,OAAO,CAAC,EAAE,WAAW,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,uBAAuB,CAAC,CAAC,IAAI,CAAC,GAAG;IACzC,KAAK,EAAE,WAAW,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,EAAE,SAAS,CAAA;IACnB,MAAM,EAAE,UAAU,CAAA;IAClB,kBAAkB,CAAC,EAAE,WAAW,CAAA;IAChC,kBAAkB,CAAC,EAAE,IAAI,CAAA;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,IAAI,GAAG,SAAS,CAAA;IACtB,WAAW,EAAE,WAAW,GAAG,SAAS,CAAA;IACpC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,MAAM,EAAE,UAAU,CAAA;IAClB,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,IAAI,CAAA;IAC/B,cAAc,EAAE,CAAC,KAAK,CAAC,EAAE,WAAW,KAAK,IAAI,CAAA;IAC7C,eAAe,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,YAAY,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACtC,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAAA;IACnD,SAAS,EAAE,OAAO,CAAA;CACrB"}
@@ -0,0 +1,4 @@
1
+ import { AuthContextValue, AuthProviderProps } from '../auth/auth.types';
2
+ export declare const AuthContextProvider: ({ children, config, initialAccessToken, initialCurrentUser, }: AuthProviderProps) => import("react/jsx-runtime").JSX.Element;
3
+ export declare const useAuth: () => AuthContextValue;
4
+ //# sourceMappingURL=AuthContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthContext.d.ts","sourceRoot":"","sources":["../../../auth/context/AuthContext.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAe,gBAAgB,EAAE,iBAAiB,EAAQ,MAAM,oBAAoB,CAAA;AAK3F,eAAO,MAAM,mBAAmB,GAAI,+DAKjC,iBAAiB,4CA+JnB,CAAA;AAED,eAAO,MAAM,OAAO,QAAO,gBAM1B,CAAA"}
@@ -0,0 +1,158 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import Cookies from 'js-cookie';
4
+ import { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react';
5
+ import { fetchUserInfo, refreshTokenService } from '../auth/auth';
6
+ const AuthContext = createContext(undefined);
7
+ export const AuthContextProvider = ({ children, config, initialAccessToken, initialCurrentUser, }) => {
8
+ const [user, setUser] = useState(initialCurrentUser);
9
+ const [accessToken, setAccessToken] = useState(initialAccessToken);
10
+ const [refreshToken, setRefreshToken] = useState();
11
+ const [expiresAt, setExpiresAt] = useState();
12
+ const [isLoading, setIsLoading] = useState(false);
13
+ const [isReady, setIsReady] = useState(false);
14
+ const refreshingRef = useRef(false);
15
+ const COOKIE_OPTIONS = {
16
+ secure: config.cookieOptions?.secure ?? false,
17
+ sameSite: config.cookieOptions?.sameSite ?? 'strict',
18
+ expires: config.cookieOptions?.expires ?? 7,
19
+ };
20
+ useEffect(() => {
21
+ const savedToken = Cookies.get('accessToken');
22
+ const savedRefreshToken = Cookies.get('refreshToken');
23
+ const savedExpiresAt = Cookies.get('expiresAt');
24
+ const savedUser = Cookies.get('user');
25
+ if (savedToken) {
26
+ setAccessToken(savedToken);
27
+ }
28
+ if (savedRefreshToken) {
29
+ setRefreshToken(savedRefreshToken);
30
+ }
31
+ if (savedExpiresAt) {
32
+ setExpiresAt(parseInt(savedExpiresAt));
33
+ }
34
+ if (savedUser) {
35
+ try {
36
+ setUser(JSON.parse(savedUser));
37
+ }
38
+ catch (e) {
39
+ console.error('Failed to parse user from cookie');
40
+ }
41
+ }
42
+ setIsReady(true);
43
+ }, []);
44
+ useEffect(() => {
45
+ if (accessToken && user) {
46
+ Cookies.set('accessToken', accessToken, COOKIE_OPTIONS);
47
+ if (refreshToken) {
48
+ Cookies.set('refreshToken', refreshToken, COOKIE_OPTIONS);
49
+ }
50
+ if (expiresAt) {
51
+ Cookies.set('expiresAt', expiresAt.toString(), COOKIE_OPTIONS);
52
+ }
53
+ Cookies.set('user', JSON.stringify(user), COOKIE_OPTIONS);
54
+ }
55
+ else {
56
+ // Pokud nemáme token nebo uživatele, vymažeme cookies
57
+ Cookies.remove('accessToken');
58
+ Cookies.remove('refreshToken');
59
+ Cookies.remove('expiresAt');
60
+ Cookies.remove('user');
61
+ }
62
+ }, [accessToken, refreshToken, expiresAt, user, COOKIE_OPTIONS]);
63
+ const refreshTokenIfNeeded = useCallback(async () => {
64
+ if (refreshingRef.current || !refreshToken)
65
+ return;
66
+ if (expiresAt && Date.now() < expiresAt - 10000)
67
+ return;
68
+ try {
69
+ refreshingRef.current = true;
70
+ setIsLoading(true);
71
+ const refreshed = await refreshTokenService(refreshToken, config);
72
+ setAccessToken(refreshed.token);
73
+ setRefreshToken(refreshed.refreshToken);
74
+ setExpiresAt(refreshed.expiresAt);
75
+ setUser({
76
+ id: refreshed.id,
77
+ name: refreshed.name,
78
+ email: refreshed.email,
79
+ username: refreshed.username,
80
+ address: refreshed.address,
81
+ });
82
+ }
83
+ catch (error) {
84
+ console.error('Failed to refresh token:', error);
85
+ // Pokud refresh token selhal, můžeme vymazat autentifikační data
86
+ if (error instanceof Error && error.message === 'Failed to refresh token') {
87
+ // Odstranění cookies
88
+ Cookies.remove('accessToken');
89
+ Cookies.remove('refreshToken');
90
+ Cookies.remove('expiresAt');
91
+ Cookies.remove('user');
92
+ setAccessToken(undefined);
93
+ setRefreshToken(undefined);
94
+ setExpiresAt(undefined);
95
+ setUser(undefined);
96
+ }
97
+ }
98
+ finally {
99
+ setIsLoading(false);
100
+ refreshingRef.current = false;
101
+ }
102
+ }, [refreshToken, expiresAt, config]);
103
+ // Pravidelný refresh tokenu
104
+ useEffect(() => {
105
+ if (!refreshToken || !expiresAt)
106
+ return;
107
+ // Pokud token vyprší za méně než 30 sekund, spustíme refresh hned
108
+ if (Date.now() > expiresAt - 30000) {
109
+ refreshTokenIfNeeded();
110
+ }
111
+ // Nastavíme interval pro pravidelnou kontrolu
112
+ const interval = setInterval(() => {
113
+ refreshTokenIfNeeded();
114
+ }, 20000); // Kontrolujeme každých 20 sekund
115
+ return () => clearInterval(interval);
116
+ }, [refreshToken, expiresAt, refreshTokenIfNeeded]);
117
+ // Funkce pro získání aktuálních dat o uživateli z API
118
+ const refetchCurrentUser = useCallback(async () => {
119
+ if (!accessToken)
120
+ return undefined;
121
+ try {
122
+ setIsLoading(true);
123
+ const userData = await fetchUserInfo(accessToken, config);
124
+ setUser(userData);
125
+ return userData;
126
+ }
127
+ catch (error) {
128
+ console.error('Failed to fetch user data:', error);
129
+ return undefined;
130
+ }
131
+ finally {
132
+ setIsLoading(false);
133
+ }
134
+ }, [accessToken, config]);
135
+ const value = {
136
+ isLogged: !!accessToken && !!user,
137
+ isReady,
138
+ user,
139
+ accessToken,
140
+ refreshToken,
141
+ expiresAt,
142
+ config,
143
+ setUser,
144
+ setAccessToken,
145
+ setRefreshToken,
146
+ setExpiresAt,
147
+ refetchCurrentUser,
148
+ isLoading,
149
+ };
150
+ return _jsx(AuthContext.Provider, { value: value, children: children });
151
+ };
152
+ export const useAuth = () => {
153
+ const context = useContext(AuthContext);
154
+ if (context === undefined) {
155
+ throw new Error('useAuth must be used within an AuthContextProvider');
156
+ }
157
+ return context;
158
+ };
@@ -0,0 +1,11 @@
1
+ export declare const useCurrentUser: () => {
2
+ user: import("../..").User | undefined;
3
+ isLogged: boolean;
4
+ isReady: boolean;
5
+ refetchCurrentUser: () => Promise<import("../..").User | undefined>;
6
+ setUser: (value?: import("../..").User) => void;
7
+ setAccessToken: (value?: import("../..").AccessToken) => void;
8
+ isLoading: boolean;
9
+ accessToken: string | undefined;
10
+ };
11
+ //# sourceMappingURL=useCurrentUser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCurrentUser.d.ts","sourceRoot":"","sources":["../../../auth/hooks/useCurrentUser.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,cAAc;;;;;;;;;CAa1B,CAAA"}
@@ -0,0 +1,15 @@
1
+ 'use client';
2
+ import { useAuth } from "../context/AuthContext";
3
+ export const useCurrentUser = () => {
4
+ const { user, isLogged, isReady, accessToken, refetchCurrentUser, setUser, setAccessToken, isLoading } = useAuth();
5
+ return {
6
+ user,
7
+ isLogged,
8
+ isReady,
9
+ refetchCurrentUser,
10
+ setUser,
11
+ setAccessToken,
12
+ isLoading,
13
+ accessToken,
14
+ };
15
+ };
@@ -0,0 +1,7 @@
1
+ import { DefaultSignInRequestData } from '../auth/auth';
2
+ import { MakeUserWithAccessToken, User } from '../auth/auth.types';
3
+ export declare const useSignIn: <SignInRequestData = DefaultSignInRequestData>() => {
4
+ signIn: (data: SignInRequestData) => Promise<MakeUserWithAccessToken<User> | undefined>;
5
+ isLoading: boolean;
6
+ };
7
+ //# sourceMappingURL=useSignIn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSignIn.d.ts","sourceRoot":"","sources":["../../../auth/hooks/useSignIn.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAiB,MAAM,cAAc,CAAA;AACtE,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAIlE,eAAO,MAAM,SAAS,GAAI,iBAAiB,GAAG,wBAAwB;mBAKjD,iBAAiB;;CAiCrC,CAAA"}
@@ -0,0 +1,33 @@
1
+ 'use client';
2
+ import { signInService } from '../auth/auth';
3
+ import { useAuth } from '../context/AuthContext';
4
+ import { useCallback, useState } from 'react';
5
+ export const useSignIn = () => {
6
+ const [isLoading, setIsLoading] = useState(false);
7
+ const { setAccessToken, setRefreshToken, setExpiresAt, setUser, config } = useAuth();
8
+ const signIn = useCallback(async (data) => {
9
+ try {
10
+ setIsLoading(true);
11
+ const result = await signInService(data, config);
12
+ setAccessToken(result.token);
13
+ setRefreshToken(result.refreshToken);
14
+ setExpiresAt(result.expiresAt);
15
+ const userData = {
16
+ id: result.id,
17
+ name: result.name,
18
+ email: result.email,
19
+ username: result.username,
20
+ };
21
+ setUser(userData);
22
+ return result;
23
+ }
24
+ catch (error) {
25
+ console.error('Sign in failed:', error);
26
+ return undefined;
27
+ }
28
+ finally {
29
+ setIsLoading(false);
30
+ }
31
+ }, [setAccessToken, setRefreshToken, setExpiresAt, setUser, config]);
32
+ return { signIn, isLoading };
33
+ };
@@ -0,0 +1,5 @@
1
+ export declare const useSignOut: () => {
2
+ signOut: () => Promise<boolean>;
3
+ isLoading: boolean;
4
+ };
5
+ //# sourceMappingURL=useSignOut.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSignOut.d.ts","sourceRoot":"","sources":["../../../auth/hooks/useSignOut.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,UAAU;;;CAwBtB,CAAA"}
@@ -0,0 +1,27 @@
1
+ 'use client';
2
+ import { useAuth } from '../context/AuthContext';
3
+ import { signOutService } from '../auth/auth';
4
+ import { useCallback, useState } from 'react';
5
+ export const useSignOut = () => {
6
+ const [isLoading, setIsLoading] = useState(false);
7
+ const { setAccessToken, setRefreshToken, setExpiresAt, setUser } = useAuth();
8
+ const signOut = useCallback(async () => {
9
+ try {
10
+ setIsLoading(true);
11
+ await signOutService();
12
+ setAccessToken(undefined);
13
+ setRefreshToken(undefined);
14
+ setExpiresAt(undefined);
15
+ setUser(undefined);
16
+ return true;
17
+ }
18
+ catch (error) {
19
+ console.error('Sign out failed:', error);
20
+ return false;
21
+ }
22
+ finally {
23
+ setIsLoading(false);
24
+ }
25
+ }, [setAccessToken, setRefreshToken, setExpiresAt, setUser]);
26
+ return { signOut, isLoading };
27
+ };
@@ -0,0 +1,11 @@
1
+ import { AxiosInstance, AxiosRequestConfig } from 'axios';
2
+ import { User } from './userService.types';
3
+ type GetUserParams = {
4
+ axiosInstance: AxiosInstance;
5
+ config?: AxiosRequestConfig;
6
+ userId?: string;
7
+ token?: string;
8
+ };
9
+ export declare const getUser: ({ axiosInstance, config, userId, token, }: GetUserParams) => Promise<User>;
10
+ export {};
11
+ //# sourceMappingURL=user.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.service.d.ts","sourceRoot":"","sources":["../../../auth/services/user.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAA;AAEzD,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAE1C,KAAK,aAAa,GAAG;IACjB,aAAa,EAAE,aAAa,CAAA;IAC5B,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,OAAO,GAAU,2CAK3B,aAAa,KAAG,OAAO,CAAC,IAAI,CAiC9B,CAAA"}
@@ -0,0 +1,24 @@
1
+ import { DrupalJsonApiParams } from 'drupal-jsonapi-params';
2
+ export const getUser = async ({ axiosInstance, config = {}, userId, token, }) => {
3
+ const params = new DrupalJsonApiParams();
4
+ userId && params.addFilter('drupal_internal__uid', userId, 'IN');
5
+ const queryString = params.getQueryString();
6
+ const headers = token ? { ...config.headers, Authorization: `Bearer ${token}` } : config.headers;
7
+ const { data } = await axiosInstance.get(`/jsonapi/user/user?${queryString}`, {
8
+ ...config,
9
+ headers,
10
+ });
11
+ const firstItem = data.data?.[0];
12
+ const customerId = firstItem?.relationships?.customer_profiles?.data?.[0]?.id;
13
+ let mappedUser = {
14
+ name: firstItem?.attributes?.name ?? '',
15
+ email: firstItem?.attributes?.mail ?? '',
16
+ };
17
+ if (customerId) {
18
+ const { data: customerData } = await axiosInstance.get(`/jsonapi/profile/customer/${customerId}`, {
19
+ ...config,
20
+ });
21
+ mappedUser.address = customerData.data.attributes.address;
22
+ }
23
+ return mappedUser;
24
+ };
@@ -0,0 +1,42 @@
1
+ export type JsonApiResponse<T> = {
2
+ [x: string]: any;
3
+ jsonapi: {
4
+ version: string;
5
+ meta: {
6
+ links: {
7
+ self: {
8
+ href: string;
9
+ };
10
+ };
11
+ };
12
+ };
13
+ data: T[];
14
+ included: any;
15
+ links: {
16
+ self: {
17
+ href: string;
18
+ };
19
+ };
20
+ };
21
+ export type UserAddress = {
22
+ additional_name: string | null;
23
+ address_line1: string;
24
+ address_line2: string;
25
+ administrative_area: string | null;
26
+ country_code: string;
27
+ dependent_locality: string | null;
28
+ family_name: string;
29
+ given_name: string;
30
+ langcode: string;
31
+ locality: string;
32
+ organization: string;
33
+ postal_code: string;
34
+ sorting_code: string | null;
35
+ };
36
+ export type User = {
37
+ name: string;
38
+ email: string;
39
+ field_name?: string;
40
+ address?: UserAddress;
41
+ };
42
+ //# sourceMappingURL=userService.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userService.types.d.ts","sourceRoot":"","sources":["../../../auth/services/userService.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAC7B,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;IAChB,OAAO,EAAE;QACL,OAAO,EAAE,MAAM,CAAA;QACf,IAAI,EAAE;YACF,KAAK,EAAE;gBACH,IAAI,EAAE;oBACF,IAAI,EAAE,MAAM,CAAA;iBACf,CAAA;aACJ,CAAA;SACJ,CAAA;KACJ,CAAA;IACD,IAAI,EAAE,CAAC,EAAE,CAAA;IACT,QAAQ,EAAE,GAAG,CAAA;IACb,KAAK,EAAE;QACH,IAAI,EAAE;YACF,IAAI,EAAE,MAAM,CAAA;SACf,CAAA;KACJ,CAAA;CACJ,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACtB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,YAAY,EAAE,MAAM,CAAA;IACpB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,IAAI,GAAG;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,WAAW,CAAA;CACxB,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -1,3 +1,3 @@
1
1
  import { CoreContext } from '../../context';
2
- export declare const useGetUser: (ctx: CoreContext) => import("@tanstack/react-query").UseQueryResult<import("../..").User | null, Error>;
2
+ export declare const useGetUser: (ctx: CoreContext) => import("@tanstack/react-query").UseQueryResult<import("../../api/user/getUser/userService.types").User | null, Error>;
3
3
  //# sourceMappingURL=useGetUser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useGetUser.d.ts","sourceRoot":"","sources":["../../../hooks/user/useGetUser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,eAAO,MAAM,UAAU,GAAI,KAAK,WAAW,uFAQ1C,CAAC"}
1
+ {"version":3,"file":"useGetUser.d.ts","sourceRoot":"","sources":["../../../hooks/user/useGetUser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,eAAO,MAAM,UAAU,GAAI,KAAK,WAAW,0HAQ1C,CAAC"}
package/dist/index.d.ts CHANGED
@@ -6,24 +6,29 @@ export * from './api/getTerms';
6
6
  export * from './types/Term';
7
7
  export * from './api/products/getProducts';
8
8
  export * from './types/products/Product';
9
- export * from './api/pages/page/pageService.types';
10
9
  export * from './api/pages/page/page.service';
11
- export * from './api/pages/faq/faqService.types';
10
+ export * from './api/pages/page/pageService.types';
12
11
  export * from './api/pages/faq/faq.service';
13
- export * from './api/pages/branch/branchService.types';
12
+ export * from './api/pages/faq/faqService.types';
14
13
  export * from './api/pages/branch/branch.service';
14
+ export * from './api/pages/branch/branchService.types';
15
15
  export * from './api/user/register/Register.service';
16
16
  export * from './api/user/resetPassword/resetPassword.service';
17
- export * from './api/user/getUser/user.service';
18
- export * from './api/user/getUser/userService.types';
19
17
  export * from './hooks/user/useGetUser';
18
+ export * from './auth/auth/auth';
19
+ export * from './auth/auth/auth.config';
20
+ export * from './auth/auth/auth.types';
21
+ export * from './auth/context/AuthContext';
22
+ export * from './auth/hooks/useCurrentUser';
23
+ export * from './auth/hooks/useSignIn';
24
+ export * from './auth/hooks/useSignOut';
20
25
  export * from './api/checkout/Checkout.service';
21
26
  export * from './api/checkout/CheckoutService.types';
22
27
  export * from './hooks/cart/api/useGetOrderHistory';
23
28
  export * from './hooks/wishlist/useWishlist';
24
29
  export * from './context';
25
30
  export * from './context/cart/BasketContext';
26
- export * from './api/cart/CartService.types';
27
31
  export * from './api/cart/Cart.service';
32
+ export * from './api/cart/CartService.types';
28
33
  export * from './utils/mapProducts';
29
34
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AAEtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAG7B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AAGzC,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAE9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAE5C,cAAc,wCAAwC,CAAC;AACvD,cAAc,mCAAmC,CAAC;AAGlD,cAAc,sCAAsC,CAAA;AACpD,cAAc,gDAAgD,CAAC;AAE/D,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AACrD,cAAc,yBAAyB,CAAC;AAGxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AAErD,cAAc,qCAAqC,CAAC;AACpD,cAAc,8BAA8B,CAAC;AAE7C,cAAc,WAAW,CAAC;AAC1B,cAAc,8BAA8B,CAAC;AAE7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AAGxC,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AAErC,cAAc,yBAAyB,CAAA;AACvC,cAAc,sBAAsB,CAAA;AAGpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAG5B,cAAc,4BAA4B,CAAA;AAC1C,cAAc,0BAA0B,CAAA;AAGxC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,oCAAoC,CAAA;AAElD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,kCAAkC,CAAA;AAEhD,cAAc,mCAAmC,CAAA;AACjD,cAAc,wCAAwC,CAAA;AAGtD,cAAc,sCAAsC,CAAA;AACpD,cAAc,gDAAgD,CAAA;AAC9D,cAAc,yBAAyB,CAAA;AAGvC,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,wBAAwB,CAAA;AACtC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,6BAA6B,CAAA;AAC3C,cAAc,wBAAwB,CAAA;AACtC,cAAc,yBAAyB,CAAA;AAEvC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,sCAAsC,CAAA;AAEpD,cAAc,qCAAqC,CAAA;AACnD,cAAc,8BAA8B,CAAA;AAE5C,cAAc,WAAW,CAAA;AACzB,cAAc,8BAA8B,CAAA;AAE5C,cAAc,yBAAyB,CAAA;AACvC,cAAc,8BAA8B,CAAA;AAE5C,cAAc,qBAAqB,CAAA"}
package/dist/index.js CHANGED
@@ -10,24 +10,30 @@ export * from './types/Term';
10
10
  export * from './api/products/getProducts';
11
11
  export * from './types/products/Product';
12
12
  // pages
13
- export * from './api/pages/page/pageService.types';
14
13
  export * from './api/pages/page/page.service';
15
- export * from './api/pages/faq/faqService.types';
14
+ export * from './api/pages/page/pageService.types';
16
15
  export * from './api/pages/faq/faq.service';
17
- export * from './api/pages/branch/branchService.types';
16
+ export * from './api/pages/faq/faqService.types';
18
17
  export * from './api/pages/branch/branch.service';
19
- //uesr
18
+ export * from './api/pages/branch/branchService.types';
19
+ //user api (len register a reset password)
20
20
  export * from './api/user/register/Register.service';
21
21
  export * from './api/user/resetPassword/resetPassword.service';
22
- export * from './api/user/getUser/user.service';
23
- export * from './api/user/getUser/userService.types';
24
22
  export * from './hooks/user/useGetUser';
23
+ // auth - hlavné auth funkcionality
24
+ export * from './auth/auth/auth';
25
+ export * from './auth/auth/auth.config';
26
+ export * from './auth/auth/auth.types';
27
+ export * from './auth/context/AuthContext';
28
+ export * from './auth/hooks/useCurrentUser';
29
+ export * from './auth/hooks/useSignIn';
30
+ export * from './auth/hooks/useSignOut';
25
31
  export * from './api/checkout/Checkout.service';
26
32
  export * from './api/checkout/CheckoutService.types';
27
33
  export * from './hooks/cart/api/useGetOrderHistory';
28
34
  export * from './hooks/wishlist/useWishlist';
29
35
  export * from './context';
30
36
  export * from './context/cart/BasketContext';
31
- export * from './api/cart/CartService.types';
32
37
  export * from './api/cart/Cart.service';
38
+ export * from './api/cart/CartService.types';
33
39
  export * from './utils/mapProducts';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@q2devel/q2-core",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "exports": {
@@ -18,6 +18,8 @@
18
18
  ],
19
19
  "license": "MIT",
20
20
  "devDependencies": {
21
+ "@types/js-cookie": "^3.0.6",
22
+ "@types/jwt-decode": "^2.2.1",
21
23
  "@types/react": "^19.1.7",
22
24
  "@types/react-dom": "^19.1.6",
23
25
  "typescript": "^5.8.3"
@@ -26,6 +28,8 @@
26
28
  "@tanstack/react-query": "^5.80.6",
27
29
  "axios": "^1.9.0",
28
30
  "drupal-jsonapi-params": "^2.3.2",
31
+ "js-cookie": "^3.0.5",
32
+ "jwt-decode": "^4.0.0",
29
33
  "react": "^19.1.0"
30
34
  }
31
35
  }
@@ -1 +0,0 @@
1
- //# sourceMappingURL=getUserCart.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getUserCart.d.ts","sourceRoot":"","sources":["../../../api/user/getUserCart.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- "use strict";
@@ -1,8 +0,0 @@
1
- export type ResetPasswordResponse = {
2
- data: {
3
- id: string;
4
- email: string;
5
- };
6
- status: number;
7
- };
8
- //# sourceMappingURL=ResetPassword.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ResetPassword.d.ts","sourceRoot":"","sources":["../../types/ResetPassword.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC"}
@@ -1,8 +0,0 @@
1
- export type ResetPasswordResponse = {
2
- data: {
3
- id: string;
4
- email: string;
5
- };
6
- status: number;
7
- };
8
- //# sourceMappingURL=ResetPassword.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ResetPassword.d.ts","sourceRoot":"","sources":["../../../types/content/ResetPassword.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC"}