@c-rex/contexts 0.1.11 → 0.1.13
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/package.json +1 -1
- package/src/config-provider.tsx +63 -44
- package/src/search.tsx +1 -1
package/package.json
CHANGED
package/src/config-provider.tsx
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
|
|
3
|
-
import { CREX_TOKEN_HEADER_KEY, UI_LANG_OPTIONS } from '@c-rex/constants'
|
|
4
|
-
import {
|
|
3
|
+
import { API, CREX_TOKEN_HEADER_KEY, SDK_CONFIG_KEY, UI_LANG_OPTIONS } from '@c-rex/constants'
|
|
4
|
+
import { CookiesConfigs, LanguageAndCountries, AvailableVersionsInterface } from '@c-rex/interfaces'
|
|
5
5
|
import { call } from '@c-rex/utils'
|
|
6
|
-
import { getConfigs } from '@c-rex/utils/next-cookies'
|
|
7
6
|
import React, { createContext, useContext, useEffect, useState } from 'react'
|
|
8
7
|
import { useLanguageStore } from '@c-rex/components/language-store'
|
|
9
8
|
|
|
10
9
|
type AppConfigContextType = {
|
|
11
10
|
error: Error | null
|
|
12
|
-
configs:
|
|
11
|
+
configs: CookiesConfigs
|
|
13
12
|
loading: boolean
|
|
14
13
|
packageID: string | null
|
|
15
14
|
articleLang: string | null
|
|
@@ -23,60 +22,58 @@ const AppConfigContext = createContext<AppConfigContextType | undefined>(undefin
|
|
|
23
22
|
|
|
24
23
|
export const AppConfigProvider = ({ children }: { children: React.ReactNode }) => {
|
|
25
24
|
const [error, setError] = useState<Error | null>(null)
|
|
26
|
-
const [configs, setConfigs] = useState<
|
|
25
|
+
const [configs, setConfigs] = useState<CookiesConfigs | null>(null)
|
|
27
26
|
const [loading, setLoading] = useState(true)
|
|
28
27
|
const [packageID, setPackageID] = useState<string | null>(null)
|
|
29
28
|
const [articleLang, setArticleLang] = useState<string | null>(null)
|
|
30
29
|
const [availableVersions, setAvailableVersions] = useState<AvailableVersionsInterface[] | null>(null)
|
|
31
30
|
|
|
32
|
-
|
|
33
|
-
const manageUILanguage = async (configs: ConfigInterface): Promise<void> => {
|
|
31
|
+
const manageUILanguage = (configs: CookiesConfigs): void => {
|
|
34
32
|
const uiLang = useLanguageStore.getState().uiLang;
|
|
35
|
-
const setUiLang = useLanguageStore.getState().setUiLang;
|
|
36
|
-
let locale = uiLang
|
|
37
33
|
|
|
38
|
-
if (
|
|
34
|
+
if (uiLang.length === 0) {
|
|
35
|
+
const setUiLang = useLanguageStore.getState().setUiLang;
|
|
39
36
|
const browserLang = navigator.language;
|
|
40
37
|
|
|
41
|
-
locale = UI_LANG_OPTIONS.includes(browserLang.toLowerCase())
|
|
38
|
+
const locale = UI_LANG_OPTIONS.includes(browserLang.toLowerCase())
|
|
42
39
|
? browserLang
|
|
43
40
|
: configs.languageSwitcher.default;
|
|
41
|
+
|
|
42
|
+
setUiLang(locale)
|
|
44
43
|
}
|
|
45
|
-
setUiLang(locale)
|
|
46
44
|
}
|
|
47
45
|
|
|
48
|
-
const manageContentLanguage =
|
|
46
|
+
const manageContentLanguage = (configs: CookiesConfigs): void => {
|
|
49
47
|
const contentLang = useLanguageStore.getState().contentLang;
|
|
50
|
-
const setContentLang = useLanguageStore.getState().setContentLang;
|
|
51
|
-
const availableLanguages = useLanguageStore.getState().availableLanguages;
|
|
52
48
|
|
|
53
|
-
|
|
54
|
-
|
|
49
|
+
if (contentLang.length === 0) {
|
|
50
|
+
const setContentLang = useLanguageStore.getState().setContentLang;
|
|
51
|
+
const availableLanguages = useLanguageStore.getState().availableLanguages;
|
|
52
|
+
|
|
55
53
|
const browserLang = navigator.language;
|
|
56
54
|
const hasLang = availableLanguages.some((item) => item.value === browserLang);
|
|
57
55
|
|
|
58
|
-
locale = hasLang
|
|
56
|
+
const locale = hasLang
|
|
59
57
|
? browserLang
|
|
60
58
|
: configs.languageSwitcher.default;
|
|
61
|
-
}
|
|
62
59
|
|
|
63
|
-
|
|
60
|
+
setContentLang(locale)
|
|
61
|
+
}
|
|
64
62
|
}
|
|
65
63
|
|
|
66
|
-
const manageToken = async (
|
|
64
|
+
const manageToken = async (): Promise<void> => {
|
|
67
65
|
try {
|
|
68
|
-
const
|
|
69
|
-
const res = await fetch(`${url}/api/cookies?key=${CREX_TOKEN_HEADER_KEY}`);
|
|
66
|
+
const res = await fetch(`/api/cookies?key=${CREX_TOKEN_HEADER_KEY}`);
|
|
70
67
|
|
|
71
68
|
if (!res.ok) {
|
|
72
|
-
await requestToken(
|
|
69
|
+
await requestToken();
|
|
73
70
|
return
|
|
74
71
|
}
|
|
75
72
|
|
|
76
73
|
const hasToken = await res.json();
|
|
77
74
|
|
|
78
75
|
if (hasToken.value === null) {
|
|
79
|
-
await requestToken(
|
|
76
|
+
await requestToken();
|
|
80
77
|
}
|
|
81
78
|
} catch (error) {
|
|
82
79
|
call("CrexLogger.log", {
|
|
@@ -86,32 +83,60 @@ export const AppConfigProvider = ({ children }: { children: React.ReactNode }) =
|
|
|
86
83
|
}
|
|
87
84
|
}
|
|
88
85
|
|
|
89
|
-
const requestToken = async (
|
|
86
|
+
const requestToken = async (): Promise<void> => {
|
|
90
87
|
try {
|
|
91
|
-
await fetch(
|
|
88
|
+
const response = await fetch(`/api/token`, {
|
|
92
89
|
method: 'POST',
|
|
93
90
|
credentials: 'include',
|
|
94
91
|
});
|
|
92
|
+
|
|
93
|
+
const { token } = await response.json();
|
|
94
|
+
|
|
95
|
+
return token;
|
|
95
96
|
} catch (error) {
|
|
96
97
|
call("CrexLogger.log", {
|
|
97
98
|
level: "error",
|
|
98
99
|
message: `config-provider.requestToken error: ${error}`
|
|
99
100
|
});
|
|
101
|
+
|
|
102
|
+
await new Promise(resolve => setTimeout(resolve, API.RETRY_DELAY));
|
|
100
103
|
}
|
|
101
104
|
}
|
|
102
105
|
|
|
103
|
-
const interval = async (delayMs: number
|
|
106
|
+
const interval = async (delayMs: number) => {
|
|
104
107
|
while (true) {
|
|
105
108
|
await new Promise(resolve => setTimeout(resolve, delayMs));
|
|
106
|
-
await manageToken(
|
|
109
|
+
await manageToken();
|
|
107
110
|
}
|
|
108
111
|
}
|
|
109
112
|
|
|
110
113
|
const updateLanguages = async () => {
|
|
111
|
-
const
|
|
114
|
+
const availableLanguages = useLanguageStore.getState().availableLanguages;
|
|
115
|
+
|
|
116
|
+
if (availableLanguages.length === 0) {
|
|
117
|
+
const setAvailableLanguages = useLanguageStore.getState().setAvailableLanguages;
|
|
112
118
|
|
|
113
|
-
|
|
114
|
-
|
|
119
|
+
const langs = await call<LanguageAndCountries[]>("LanguageService.getLanguagesAndCountries")
|
|
120
|
+
setAvailableLanguages(langs)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const getClientConfig = async (): Promise<CookiesConfigs> => {
|
|
125
|
+
const res = await fetch(`/api/cookies?key=${SDK_CONFIG_KEY}`);
|
|
126
|
+
|
|
127
|
+
if (!res.ok) {
|
|
128
|
+
throw new Error('Failed to fetch token from cookies API');
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const jsonConfig = await res.json();
|
|
132
|
+
|
|
133
|
+
if (jsonConfig.value === null) {
|
|
134
|
+
throw new Error('Client config not found in cookies');
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const configs: CookiesConfigs = JSON.parse(jsonConfig.value);
|
|
138
|
+
|
|
139
|
+
return configs;
|
|
115
140
|
}
|
|
116
141
|
|
|
117
142
|
useEffect(() => {
|
|
@@ -121,22 +146,16 @@ export const AppConfigProvider = ({ children }: { children: React.ReactNode }) =
|
|
|
121
146
|
try {
|
|
122
147
|
setLoading(true)
|
|
123
148
|
|
|
124
|
-
const configsResult = await
|
|
125
|
-
if (!configsResult) {
|
|
126
|
-
throw new Error("Config cookie not available");
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
await manageToken(configsResult)
|
|
149
|
+
const configsResult = await getClientConfig()
|
|
130
150
|
|
|
131
|
-
await
|
|
132
|
-
manageUILanguage(configsResult),
|
|
133
|
-
manageContentLanguage(configsResult),
|
|
134
|
-
updateLanguages()
|
|
135
|
-
])
|
|
151
|
+
await manageToken()
|
|
136
152
|
|
|
153
|
+
manageUILanguage(configsResult)
|
|
154
|
+
manageContentLanguage(configsResult)
|
|
155
|
+
updateLanguages()
|
|
137
156
|
setError(null)
|
|
138
157
|
setConfigs(configsResult)
|
|
139
|
-
interval(1000 * 60 * 9
|
|
158
|
+
interval(1000 * 60 * 9);
|
|
140
159
|
} catch (err) {
|
|
141
160
|
call("CrexLogger.log", {
|
|
142
161
|
level: "error",
|
package/src/search.tsx
CHANGED