@q2devel/q2-core 1.0.85 → 1.0.90

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,5 @@
1
+ import { AxiosRequestConfig } from 'axios';
2
+ import { CoreContext } from '../../../context';
3
+ import { CustomerDataUpdateRequest } from './updateUserProfileService.types';
4
+ export declare const updateUserProfile: (ctx: CoreContext, customerId: string, request: CustomerDataUpdateRequest, config?: AxiosRequestConfig) => Promise<void>;
5
+ //# sourceMappingURL=updateUserProfile.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateUserProfile.service.d.ts","sourceRoot":"","sources":["../../../../api/user/updateUser/updateUserProfile.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAA;AAW5E,eAAO,MAAM,iBAAiB,GAC1B,KAAK,WAAW,EAChB,YAAY,MAAM,EAClB,SAAS,yBAAyB,EAClC,SAAQ,kBAAuB,KAChC,OAAO,CAAC,IAAI,CASd,CAAA"}
@@ -0,0 +1,11 @@
1
+ const getHeaders = (ctx, customHeaders = {}) => ({
2
+ 'Content-Type': 'application/vnd.api+json',
3
+ ...(ctx.accessToken && { Authorization: `Bearer ${ctx.accessToken}` }),
4
+ ...customHeaders,
5
+ });
6
+ export const updateUserProfile = async (ctx, customerId, request, config = {}) => {
7
+ await ctx.axios.patch(`/jsonapi/profile/customer/${customerId}`, request, {
8
+ ...config,
9
+ headers: getHeaders(ctx, config.headers),
10
+ });
11
+ };
@@ -0,0 +1,11 @@
1
+ import { UserAddress } from '../../user/getUser/userService.types';
2
+ export type CustomerDataUpdateRequest = {
3
+ data: {
4
+ type: 'profile--customer';
5
+ id: string;
6
+ attributes: {
7
+ address: UserAddress;
8
+ };
9
+ };
10
+ };
11
+ //# sourceMappingURL=updateUserProfileService.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateUserProfileService.types.d.ts","sourceRoot":"","sources":["../../../../api/user/updateUser/updateUserProfileService.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAA;AAElE,MAAM,MAAM,yBAAyB,GAAG;IACpC,IAAI,EAAE;QACF,IAAI,EAAE,mBAAmB,CAAA;QACzB,EAAE,EAAE,MAAM,CAAA;QACV,UAAU,EAAE;YACR,OAAO,EAAE,WAAW,CAAA;SACvB,CAAA;KACJ,CAAA;CACJ,CAAA"}
@@ -2,6 +2,7 @@ export interface AuthConfig {
2
2
  drupalBaseUrl: string;
3
3
  clientId: string;
4
4
  clientSecret: string;
5
+ scope: string;
5
6
  cookieOptions?: {
6
7
  secure?: boolean;
7
8
  sameSite?: 'strict' | 'lax' | 'none';
@@ -10,7 +11,6 @@ export interface AuthConfig {
10
11
  customFields?: string[];
11
12
  relationshipsFields?: string[];
12
13
  control?: any;
13
- scope?: string;
14
14
  }
15
15
  export interface AuthContext {
16
16
  config: AuthConfig;
@@ -1 +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;IACD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC9B,OAAO,CAAC,EAAE,GAAG,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,UAAU,CAAA;CACrB"}
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,KAAK,EAAE,MAAM,CAAA;IACb,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;IACD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC9B,OAAO,CAAC,EAAE,GAAG,CAAA;CAChB;AAED,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,UAAU,CAAA;CACrB"}
@@ -1 +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,CAqCvC,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC5B,cAAc,MAAM,EACpB,QAAQ,UAAU,KACnB,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,CA6BvC,CAAA;AAGD,eAAO,MAAM,aAAa,GACtB,aAAa,MAAM,EACnB,QAAQ,UAAU,KACnB,OAAO,CAAC,IAAI,CAoCd,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;IACpC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;CAChB,KAAG,OAEH,CAAA"}
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,CAoCvC,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC5B,cAAc,MAAM,EACpB,QAAQ,UAAU,KACnB,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,CA8BvC,CAAA;AAGD,eAAO,MAAM,aAAa,GACtB,aAAa,MAAM,EACnB,QAAQ,UAAU,KACnB,OAAO,CAAC,IAAI,CAoCd,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;IACpC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;CAChB,KAAG,OAEH,CAAA"}
@@ -8,9 +8,7 @@ export const signInService = async (data, config) => {
8
8
  formData.append('client_secret', config.clientSecret);
9
9
  formData.append('username', data.username);
10
10
  formData.append('password', data.password);
11
- if (config.scope) {
12
- formData.append('scope', config.scope);
13
- }
11
+ formData.append('scope', config.scope);
14
12
  const response = await fetch(`${config.drupalBaseUrl}/oauth/token`, {
15
13
  method: 'POST',
16
14
  body: formData,
@@ -42,6 +40,7 @@ export const refreshTokenService = async (refreshToken, config) => {
42
40
  formData.append('client_id', config.clientId);
43
41
  formData.append('client_secret', config.clientSecret);
44
42
  formData.append('refresh_token', refreshToken);
43
+ formData.append('scope', config.scope);
45
44
  const response = await fetch(`${config.drupalBaseUrl}/oauth/token`, {
46
45
  method: 'POST',
47
46
  body: formData,
@@ -34,5 +34,6 @@ export interface AuthContextValue {
34
34
  setExpiresAt: (value?: number) => void;
35
35
  refetchCurrentUser: () => Promise<User | undefined>;
36
36
  isLoading: boolean;
37
+ refreshToken: () => Promise<string | undefined>;
37
38
  }
38
39
  //# sourceMappingURL=auth.types.d.ts.map
@@ -1 +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;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACrB,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,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,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"}
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;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACrB,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,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,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;IAClB,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;CAClD"}
@@ -1 +1 @@
1
- {"version":3,"file":"AuthContext.d.ts","sourceRoot":"","sources":["../../../auth/context/AuthContext.tsx"],"names":[],"mappings":"AAaA,OAAO,EAEH,gBAAgB,EAChB,iBAAiB,EAEpB,MAAM,oBAAoB,CAAA;AAI3B,eAAO,MAAM,mBAAmB,GAAI,+DAKjC,iBAAiB,4CA0KnB,CAAA;AAED,eAAO,MAAM,OAAO,QAAO,gBAM1B,CAAA"}
1
+ {"version":3,"file":"AuthContext.d.ts","sourceRoot":"","sources":["../../../auth/context/AuthContext.tsx"],"names":[],"mappings":"AAaA,OAAO,EAEH,gBAAgB,EAChB,iBAAiB,EAEpB,MAAM,oBAAoB,CAAA;AAQ3B,eAAO,MAAM,mBAAmB,GAAI,+DAKjC,iBAAiB,4CAuMnB,CAAA;AAED,eAAO,MAAM,OAAO,QAAO,gBAM1B,CAAA"}
@@ -3,6 +3,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import Cookies from 'js-cookie';
4
4
  import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, } from 'react';
5
5
  import { fetchUserInfo, refreshTokenService } from '../auth/auth';
6
+ import { registerAuthRefreshFn, unregisterAuthRefreshFn, } from '../utils/axiosAuthInterceptor';
6
7
  const AuthContext = createContext(undefined);
7
8
  export const AuthContextProvider = ({ children, config, initialAccessToken, initialCurrentUser, }) => {
8
9
  const [user, setUser] = useState(initialCurrentUser);
@@ -10,7 +11,8 @@ export const AuthContextProvider = ({ children, config, initialAccessToken, init
10
11
  const [expiresAt, setExpiresAt] = useState();
11
12
  const [isLoading, setIsLoading] = useState(false);
12
13
  const [isReady, setIsReady] = useState(false);
13
- const refreshingRef = useRef(false);
14
+ // Zdielany promise - zabezpeci ze refresh prebehne len raz aj pri viacerych 401
15
+ const refreshPromiseRef = useRef(null);
14
16
  const COOKIE_OPTIONS = useMemo(() => ({
15
17
  secure: config.cookieOptions?.secure ?? false,
16
18
  sameSite: config.cookieOptions?.sameSite ?? 'strict',
@@ -20,6 +22,7 @@ export const AuthContextProvider = ({ children, config, initialAccessToken, init
20
22
  config.cookieOptions?.sameSite,
21
23
  config.cookieOptions?.expires,
22
24
  ]);
25
+ // Nacitanie ulozeneho stavu z cookies pri mounte
23
26
  useEffect(() => {
24
27
  const savedToken = Cookies.get('accessToken');
25
28
  const savedRefreshToken = Cookies.get('refreshToken');
@@ -29,7 +32,7 @@ export const AuthContextProvider = ({ children, config, initialAccessToken, init
29
32
  setAccessToken(savedToken);
30
33
  }
31
34
  if (savedRefreshToken) {
32
- // setRefreshToken(savedRefreshToken) // Removed as per edit hint
35
+ // refresh token je v cookie
33
36
  }
34
37
  if (savedExpiresAt) {
35
38
  setExpiresAt(parseInt(savedExpiresAt));
@@ -45,6 +48,7 @@ export const AuthContextProvider = ({ children, config, initialAccessToken, init
45
48
  }
46
49
  setIsReady(true);
47
50
  }, []);
51
+ // Synchronizacia stavu do cookies
48
52
  useEffect(() => {
49
53
  if (accessToken && user) {
50
54
  Cookies.set('accessToken', accessToken, COOKIE_OPTIONS);
@@ -68,54 +72,72 @@ export const AuthContextProvider = ({ children, config, initialAccessToken, init
68
72
  setExpiresAt(undefined);
69
73
  setUser(undefined);
70
74
  }, []);
71
- // Čítajte refresh token priamo z cookies keď ho potrebujete
75
+ // Vynuteny refresh tokenu - zdielany promise zabezpeci ze sa vola len raz
76
+ // Pouziva sa aj proaktivne (interval) aj reaktivne (401/403 cez interceptor)
77
+ const refreshToken = useCallback(async () => {
78
+ const currentRefreshToken = Cookies.get('refreshToken');
79
+ if (!currentRefreshToken) {
80
+ clearAllAuth();
81
+ return undefined;
82
+ }
83
+ // Ak uz prebieha refresh, vratime rovnaky promise
84
+ if (refreshPromiseRef.current) {
85
+ return refreshPromiseRef.current;
86
+ }
87
+ const doRefresh = async () => {
88
+ try {
89
+ const refreshed = await refreshTokenService(currentRefreshToken, config);
90
+ Cookies.set('refreshToken', refreshed.refreshToken, COOKIE_OPTIONS);
91
+ setAccessToken(refreshed.token);
92
+ setExpiresAt(refreshed.expiresAt);
93
+ setUser({ ...refreshed });
94
+ return refreshed.token;
95
+ }
96
+ catch (error) {
97
+ console.error('Failed to refresh token:', error);
98
+ clearAllAuth();
99
+ return undefined;
100
+ }
101
+ finally {
102
+ refreshPromiseRef.current = null;
103
+ }
104
+ };
105
+ refreshPromiseRef.current = doRefresh();
106
+ return refreshPromiseRef.current;
107
+ }, [config, COOKIE_OPTIONS, clearAllAuth]);
108
+ // Registracia refresh funkcie do globalneho registra
109
+ // Vdaka tomu createAxiosWithAuth() interceptor vie zavolat refresh pri 401/403
110
+ const refreshTokenRef = useRef(refreshToken);
111
+ useEffect(() => {
112
+ refreshTokenRef.current = refreshToken;
113
+ }, [refreshToken]);
114
+ useEffect(() => {
115
+ registerAuthRefreshFn(() => refreshTokenRef.current());
116
+ return () => unregisterAuthRefreshFn();
117
+ }, []);
118
+ // Proaktivny refresh - kontroluje ci token coskoro vyprsi
72
119
  const refreshTokenIfNeeded = useCallback(async () => {
73
- const currentRefreshToken = Cookies.get('refreshToken'); // ✅ z cookie
74
- console.log('🔄 Refresh začína, refresh token:', !!currentRefreshToken); // Debug
75
- if (refreshingRef.current || !currentRefreshToken)
120
+ const currentRefreshToken = Cookies.get('refreshToken');
121
+ if (!currentRefreshToken)
76
122
  return;
77
123
  if (expiresAt && Date.now() < expiresAt - 10000)
78
124
  return;
79
- try {
80
- refreshingRef.current = true;
81
- setIsLoading(true);
82
- const refreshed = await refreshTokenService(currentRefreshToken, config);
83
- // ✅ Uložiť nový refresh token priamo do cookie
84
- Cookies.set('refreshToken', refreshed.refreshToken, COOKIE_OPTIONS);
85
- console.log('✅ Nový refresh token uložený'); // Debug
86
- setAccessToken(refreshed.token);
87
- setExpiresAt(refreshed.expiresAt);
88
- setUser({ ...refreshed });
89
- }
90
- catch (error) {
91
- console.error('Failed to refresh token:', error);
92
- // Pokud refresh token selhal, můžeme vymazat autentifikační data
93
- if (error instanceof Error &&
94
- error.message === 'Failed to refresh token') {
95
- // Odstranění cookies
96
- clearAllAuth();
97
- }
98
- }
99
- finally {
100
- setIsLoading(false);
101
- refreshingRef.current = false;
102
- }
103
- }, [expiresAt, config, COOKIE_OPTIONS, clearAllAuth]);
104
- // Pravidelný refresh tokenu
125
+ await refreshToken();
126
+ }, [expiresAt, refreshToken]);
127
+ // Pravidelny refresh tokenu kazdych 20 sekund
105
128
  useEffect(() => {
106
129
  if (!refreshTokenIfNeeded)
107
130
  return;
108
- // Pokud token vyprší za méně než 30 sekund, spustíme refresh hned
131
+ // Ak token vyprsi za menej nez 30 sekund, spustime refresh hned
109
132
  if (expiresAt && Date.now() > expiresAt - 30000) {
110
133
  refreshTokenIfNeeded();
111
134
  }
112
- // Nastavíme interval pro pravidelnou kontrolu
113
135
  const interval = setInterval(() => {
114
136
  refreshTokenIfNeeded();
115
- }, 20000); // Kontrolujeme každých 20 sekund
137
+ }, 20000);
116
138
  return () => clearInterval(interval);
117
- }, [refreshTokenIfNeeded, expiresAt]); // This line was removed as per edit hint
118
- // Funkce pro získání aktuálních dat o uživateli z API
139
+ }, [refreshTokenIfNeeded, expiresAt]);
140
+ // Funkcia pre ziskanie aktualnych dat o uzivatelovi z API
119
141
  const refetchCurrentUser = useCallback(async () => {
120
142
  if (!accessToken)
121
143
  return undefined;
@@ -145,6 +167,7 @@ export const AuthContextProvider = ({ children, config, initialAccessToken, init
145
167
  setExpiresAt,
146
168
  refetchCurrentUser,
147
169
  isLoading,
170
+ refreshToken,
148
171
  };
149
172
  return _jsx(AuthContext.Provider, { value: value, children: children });
150
173
  };
@@ -0,0 +1,24 @@
1
+ import { AxiosInstance, CreateAxiosDefaults } from 'axios';
2
+ type RefreshFn = () => Promise<string | undefined>;
3
+ export declare const registerAuthRefreshFn: (fn: RefreshFn) => void;
4
+ export declare const unregisterAuthRefreshFn: () => void;
5
+ /**
6
+ * Vytvori axios instanciu s auth interceptorom.
7
+ *
8
+ * - Request interceptor: automaticky pridava Bearer token z cookie
9
+ * - Response interceptor: pri 401/403 obnovi token cez refresh a zopakuje request
10
+ *
11
+ * Vyzaduje aby AuthContextProvider bol mountnuty (registruje refresh funkciu).
12
+ *
13
+ * Pouzitie v projekte:
14
+ * ```ts
15
+ * import { createAxiosWithAuth } from '@q2devel/q2-core'
16
+ *
17
+ * const sharedAxios = createAxiosWithAuth({
18
+ * baseURL: process.env.NEXT_PUBLIC_DRUPAL_BASE_URL,
19
+ * })
20
+ * ```
21
+ */
22
+ export declare const createAxiosWithAuth: (config?: CreateAxiosDefaults) => AxiosInstance;
23
+ export {};
24
+ //# sourceMappingURL=axiosAuthInterceptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"axiosAuthInterceptor.d.ts","sourceRoot":"","sources":["../../../auth/utils/axiosAuthInterceptor.ts"],"names":[],"mappings":"AAAA,OAAc,EACV,aAAa,EAGb,mBAAmB,EACtB,MAAM,OAAO,CAAA;AAOd,KAAK,SAAS,GAAG,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;AAIlD,eAAO,MAAM,qBAAqB,GAAI,IAAI,SAAS,SAElD,CAAA;AAED,eAAO,MAAM,uBAAuB,YAEnC,CAAA;AAiGD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,mBAAmB,GAC5B,SAAS,mBAAmB,KAC7B,aAIF,CAAA"}
@@ -0,0 +1,102 @@
1
+ import axios from 'axios';
2
+ import Cookies from 'js-cookie';
3
+ let _registeredRefreshFn = null;
4
+ export const registerAuthRefreshFn = (fn) => {
5
+ _registeredRefreshFn = fn;
6
+ };
7
+ export const unregisterAuthRefreshFn = () => {
8
+ _registeredRefreshFn = null;
9
+ };
10
+ let isRefreshing = false;
11
+ const failedQueue = [];
12
+ const processQueue = (token, error = null) => {
13
+ failedQueue.forEach((prom) => {
14
+ if (token) {
15
+ prom.resolve(token);
16
+ }
17
+ else {
18
+ prom.reject(error);
19
+ }
20
+ });
21
+ failedQueue.length = 0;
22
+ };
23
+ const attachAuthInterceptor = (instance) => {
24
+ // Request interceptor - automaticky pridava token z cookie ak nie je v headeroch
25
+ instance.interceptors.request.use((config) => {
26
+ if (!config.headers['Authorization']) {
27
+ if (typeof window !== 'undefined') {
28
+ const token = Cookies.get('accessToken');
29
+ if (token) {
30
+ config.headers['Authorization'] = `Bearer ${token}`;
31
+ }
32
+ }
33
+ }
34
+ return config;
35
+ });
36
+ // Response interceptor - zachyti 401/403, obnovi token, zopakuje request
37
+ instance.interceptors.response.use((response) => response, async (error) => {
38
+ const originalRequest = error.config;
39
+ // Nie je 401/403, uz bol retry, alebo nemame refresh funkciu
40
+ if (!error.response ||
41
+ (error.response.status !== 401 &&
42
+ error.response.status !== 403) ||
43
+ originalRequest._retry ||
44
+ !_registeredRefreshFn) {
45
+ return Promise.reject(error);
46
+ }
47
+ originalRequest._retry = true;
48
+ // Ak uz prebieha refresh, zaradime do fronty
49
+ if (isRefreshing) {
50
+ return new Promise((resolve, reject) => {
51
+ failedQueue.push({ resolve, reject });
52
+ }).then((newToken) => {
53
+ originalRequest.headers['Authorization'] =
54
+ `Bearer ${newToken}`;
55
+ return instance(originalRequest);
56
+ });
57
+ }
58
+ isRefreshing = true;
59
+ try {
60
+ const newToken = await _registeredRefreshFn();
61
+ if (!newToken) {
62
+ processQueue(null, new Error('Token refresh failed'));
63
+ return Promise.reject(error);
64
+ }
65
+ processQueue(newToken);
66
+ originalRequest.headers['Authorization'] =
67
+ `Bearer ${newToken}`;
68
+ return instance(originalRequest);
69
+ }
70
+ catch (refreshError) {
71
+ processQueue(null, refreshError);
72
+ return Promise.reject(refreshError);
73
+ }
74
+ finally {
75
+ isRefreshing = false;
76
+ }
77
+ });
78
+ return instance;
79
+ };
80
+ // ---------- Verejna factory funkcia ----------
81
+ /**
82
+ * Vytvori axios instanciu s auth interceptorom.
83
+ *
84
+ * - Request interceptor: automaticky pridava Bearer token z cookie
85
+ * - Response interceptor: pri 401/403 obnovi token cez refresh a zopakuje request
86
+ *
87
+ * Vyzaduje aby AuthContextProvider bol mountnuty (registruje refresh funkciu).
88
+ *
89
+ * Pouzitie v projekte:
90
+ * ```ts
91
+ * import { createAxiosWithAuth } from '@q2devel/q2-core'
92
+ *
93
+ * const sharedAxios = createAxiosWithAuth({
94
+ * baseURL: process.env.NEXT_PUBLIC_DRUPAL_BASE_URL,
95
+ * })
96
+ * ```
97
+ */
98
+ export const createAxiosWithAuth = (config) => {
99
+ const instance = axios.create(config);
100
+ attachAuthInterceptor(instance);
101
+ return instance;
102
+ };
@@ -0,0 +1,10 @@
1
+ import { CoreContext } from '../../context';
2
+ import { AxiosError } from 'axios';
3
+ import { CustomerDataUpdateRequest } from '../../api/user/updateUser/updateUserProfileService.types';
4
+ type UpdateProfileVariables = {
5
+ customerId: string;
6
+ request: CustomerDataUpdateRequest;
7
+ };
8
+ export declare const useUpdateUserProfile: (ctx: CoreContext) => import("@tanstack/react-query").UseMutationResult<void, AxiosError<unknown, any>, UpdateProfileVariables, unknown>;
9
+ export {};
10
+ //# sourceMappingURL=useUpdateUserProfile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUpdateUserProfile.d.ts","sourceRoot":"","sources":["../../../hooks/user/useUpdateUserProfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAClC,OAAO,EAAE,yBAAyB,EAAE,MAAM,0DAA0D,CAAA;AAGpG,KAAK,sBAAsB,GAAG;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,yBAAyB,CAAA;CACrC,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,KAAK,WAAW,uHAKpD,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { useMutation } from '@tanstack/react-query';
2
+ import { updateUserProfile } from '../../api/user/updateUser/updateUserProfile.service';
3
+ export const useUpdateUserProfile = (ctx) => {
4
+ return useMutation({
5
+ mutationFn: ({ customerId, request }) => updateUserProfile(ctx, customerId, request),
6
+ });
7
+ };
package/dist/index.d.ts CHANGED
@@ -18,6 +18,9 @@ export * from './api/user/resetPassword/resetPassword.service';
18
18
  export * from './api/user/getUser/user.service';
19
19
  export * from './api/user/getUser/userService.types';
20
20
  export * from './hooks/user/useGetUser';
21
+ export * from './api/user/updateUser/updateUserProfile.service';
22
+ export * from './api/user/updateUser/updateUserProfileService.types';
23
+ export * from './hooks/user/useUpdateUserProfile';
21
24
  export * from './auth/auth/auth';
22
25
  export * from './auth/auth/auth.config';
23
26
  export * from './auth/auth/auth.types';
@@ -25,6 +28,7 @@ export * from './auth/context/AuthContext';
25
28
  export * from './auth/hooks/useCurrentUser';
26
29
  export * from './auth/hooks/useSignIn';
27
30
  export * from './auth/hooks/useSignOut';
31
+ export { createAxiosWithAuth } from './auth/utils/axiosAuthInterceptor';
28
32
  export * from './api/checkout/Checkout.service';
29
33
  export * from './api/checkout/CheckoutService.types';
30
34
  export * from './hooks/cart/api/useGetOrderHistory';
@@ -1 +1 @@
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,2CAA2C,CAAA;AACzD,cAAc,gDAAgD,CAAA;AAC9D,cAAc,iCAAiC,CAAA;AAC/C,cAAc,sCAAsC,CAAA;AACpD,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;AAC5C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,sCAAsC,CAAA;AAEpD,cAAc,WAAW,CAAA;AACzB,cAAc,8BAA8B,CAAA;AAE5C,cAAc,yBAAyB,CAAA;AACvC,cAAc,8BAA8B,CAAA;AAE5C,cAAc,qBAAqB,CAAA;AACnC,cAAc,8BAA8B,CAAA;AAE5C,cAAc,uBAAuB,CAAA;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA"}
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,2CAA2C,CAAA;AACzD,cAAc,gDAAgD,CAAA;AAC9D,cAAc,iCAAiC,CAAA;AAC/C,cAAc,sCAAsC,CAAA;AACpD,cAAc,yBAAyB,CAAA;AACvC,cAAc,iDAAiD,CAAA;AAC/D,cAAc,sDAAsD,CAAA;AACpE,cAAc,mCAAmC,CAAA;AAGjD,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;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AAEvE,cAAc,iCAAiC,CAAA;AAC/C,cAAc,sCAAsC,CAAA;AAEpD,cAAc,qCAAqC,CAAA;AACnD,cAAc,8BAA8B,CAAA;AAC5C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,sCAAsC,CAAA;AAEpD,cAAc,WAAW,CAAA;AACzB,cAAc,8BAA8B,CAAA;AAE5C,cAAc,yBAAyB,CAAA;AACvC,cAAc,8BAA8B,CAAA;AAE5C,cAAc,qBAAqB,CAAA;AACnC,cAAc,8BAA8B,CAAA;AAE5C,cAAc,uBAAuB,CAAA;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA"}
package/dist/index.js CHANGED
@@ -23,6 +23,9 @@ export * from './api/user/resetPassword/resetPassword.service';
23
23
  export * from './api/user/getUser/user.service';
24
24
  export * from './api/user/getUser/userService.types';
25
25
  export * from './hooks/user/useGetUser';
26
+ export * from './api/user/updateUser/updateUserProfile.service';
27
+ export * from './api/user/updateUser/updateUserProfileService.types';
28
+ export * from './hooks/user/useUpdateUserProfile';
26
29
  // auth - hlavné auth funkcionality
27
30
  export * from './auth/auth/auth';
28
31
  export * from './auth/auth/auth.config';
@@ -31,6 +34,7 @@ export * from './auth/context/AuthContext';
31
34
  export * from './auth/hooks/useCurrentUser';
32
35
  export * from './auth/hooks/useSignIn';
33
36
  export * from './auth/hooks/useSignOut';
37
+ export { createAxiosWithAuth } from './auth/utils/axiosAuthInterceptor';
34
38
  export * from './api/checkout/Checkout.service';
35
39
  export * from './api/checkout/CheckoutService.types';
36
40
  export * from './hooks/cart/api/useGetOrderHistory';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@q2devel/q2-core",
3
- "version": "1.0.85",
3
+ "version": "1.0.90",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "exports": {