@q2devel/q2-core 1.0.85 → 1.0.89
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/api/user/updateUser/updateUserProfile.service.d.ts +5 -0
- package/dist/api/user/updateUser/updateUserProfile.service.d.ts.map +1 -0
- package/dist/api/user/updateUser/updateUserProfile.service.js +11 -0
- package/dist/api/user/updateUser/updateUserProfileService.types.d.ts +11 -0
- package/dist/api/user/updateUser/updateUserProfileService.types.d.ts.map +1 -0
- package/dist/api/user/updateUser/updateUserProfileService.types.js +1 -0
- package/dist/auth/auth/auth.config.d.ts +0 -1
- package/dist/auth/auth/auth.config.d.ts.map +1 -1
- package/dist/auth/auth/auth.d.ts.map +1 -1
- package/dist/auth/auth/auth.js +0 -3
- package/dist/auth/auth/auth.types.d.ts +1 -0
- package/dist/auth/auth/auth.types.d.ts.map +1 -1
- package/dist/auth/context/AuthContext.d.ts.map +1 -1
- package/dist/auth/context/AuthContext.js +60 -37
- package/dist/auth/utils/axiosAuthInterceptor.d.ts +24 -0
- package/dist/auth/utils/axiosAuthInterceptor.d.ts.map +1 -0
- package/dist/auth/utils/axiosAuthInterceptor.js +102 -0
- package/dist/hooks/user/useUpdateUserProfile.d.ts +10 -0
- package/dist/hooks/user/useUpdateUserProfile.d.ts.map +1 -0
- package/dist/hooks/user/useUpdateUserProfile.js +7 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/package.json +1 -1
|
@@ -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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -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;
|
|
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;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,
|
|
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,CAmCvC,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"}
|
package/dist/auth/auth/auth.js
CHANGED
|
@@ -8,9 +8,6 @@ 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
|
-
}
|
|
14
11
|
const response = await fetch(`${config.drupalBaseUrl}/oauth/token`, {
|
|
15
12
|
method: 'POST',
|
|
16
13
|
body: formData,
|
|
@@ -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;
|
|
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;
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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');
|
|
74
|
-
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
//
|
|
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);
|
|
137
|
+
}, 20000);
|
|
116
138
|
return () => clearInterval(interval);
|
|
117
|
-
}, [refreshTokenIfNeeded, expiresAt]);
|
|
118
|
-
//
|
|
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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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';
|