@c-rex/contexts 0.1.15 → 0.1.17
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 +27 -116
package/package.json
CHANGED
package/src/config-provider.tsx
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { UI_LANG_KEY, CONTENT_LANG_KEY, AVAILABLE_CONTENT_LANG_KEY, CREX_TOKEN_HEADER_KEY } from '@c-rex/constants'
|
|
4
4
|
import { CookiesConfigs, LanguageAndCountries, AvailableVersionsInterface } from '@c-rex/interfaces'
|
|
5
5
|
import { call } from '@c-rex/utils'
|
|
6
|
+
import { setCookie } from '@c-rex/utils/cookies'
|
|
6
7
|
import React, { createContext, useContext, useEffect, useState } from 'react'
|
|
7
8
|
import { useLanguageStore } from '@c-rex/components/language-store'
|
|
8
9
|
|
|
9
10
|
type AppConfigContextType = {
|
|
10
11
|
error: Error | null
|
|
11
12
|
configs: CookiesConfigs
|
|
12
|
-
loading: boolean
|
|
13
13
|
packageID: string | null
|
|
14
14
|
articleLang: string | null
|
|
15
15
|
availableVersions: AvailableVersionsInterface[] | null
|
|
@@ -19,48 +19,27 @@ type AppConfigContextType = {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
const AppConfigContext = createContext<AppConfigContextType | undefined>(undefined)
|
|
22
|
+
type AppConfigProviderProps = {
|
|
23
|
+
children: React.ReactNode
|
|
24
|
+
uiLang: string
|
|
25
|
+
contentLang: string
|
|
26
|
+
availableLanguages: LanguageAndCountries[]
|
|
27
|
+
initialConfig: CookiesConfigs
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const AppConfigProvider = ({
|
|
31
|
+
children,
|
|
32
|
+
uiLang,
|
|
33
|
+
contentLang,
|
|
34
|
+
availableLanguages,
|
|
35
|
+
initialConfig
|
|
36
|
+
}: AppConfigProviderProps) => {
|
|
22
37
|
|
|
23
|
-
export const AppConfigProvider = ({ children }: { children: React.ReactNode }) => {
|
|
24
38
|
const [error, setError] = useState<Error | null>(null)
|
|
25
|
-
const [configs, setConfigs] = useState<CookiesConfigs | null>(null)
|
|
26
|
-
const [loading, setLoading] = useState(true)
|
|
27
39
|
const [packageID, setPackageID] = useState<string | null>(null)
|
|
28
40
|
const [articleLang, setArticleLang] = useState<string | null>(null)
|
|
29
41
|
const [availableVersions, setAvailableVersions] = useState<AvailableVersionsInterface[] | null>(null)
|
|
30
42
|
|
|
31
|
-
const manageUILanguage = (configs: CookiesConfigs): void => {
|
|
32
|
-
const uiLang = useLanguageStore.getState().uiLang;
|
|
33
|
-
|
|
34
|
-
if (uiLang.length === 0) {
|
|
35
|
-
const setUiLang = useLanguageStore.getState().setUiLang;
|
|
36
|
-
const browserLang = navigator.language;
|
|
37
|
-
|
|
38
|
-
const locale = UI_LANG_OPTIONS.includes(browserLang.toLowerCase())
|
|
39
|
-
? browserLang
|
|
40
|
-
: configs.languageSwitcher.default;
|
|
41
|
-
|
|
42
|
-
setUiLang(locale)
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const manageContentLanguage = (configs: CookiesConfigs): void => {
|
|
47
|
-
const contentLang = useLanguageStore.getState().contentLang;
|
|
48
|
-
|
|
49
|
-
if (contentLang.length === 0) {
|
|
50
|
-
const setContentLang = useLanguageStore.getState().setContentLang;
|
|
51
|
-
const availableLanguages = useLanguageStore.getState().availableLanguages;
|
|
52
|
-
|
|
53
|
-
const browserLang = navigator.language;
|
|
54
|
-
const hasLang = availableLanguages.some((item) => item.value === browserLang);
|
|
55
|
-
|
|
56
|
-
const locale = hasLang
|
|
57
|
-
? browserLang
|
|
58
|
-
: configs.languageSwitcher.default;
|
|
59
|
-
|
|
60
|
-
setContentLang(locale)
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
43
|
const manageToken = async (): Promise<void> => {
|
|
65
44
|
try {
|
|
66
45
|
const res = await fetch(`/api/cookies?key=${CREX_TOKEN_HEADER_KEY}`);
|
|
@@ -85,14 +64,10 @@ export const AppConfigProvider = ({ children }: { children: React.ReactNode }) =
|
|
|
85
64
|
|
|
86
65
|
const requestToken = async (): Promise<void> => {
|
|
87
66
|
try {
|
|
88
|
-
|
|
67
|
+
await fetch('/api/oidc/token', {
|
|
89
68
|
method: 'POST',
|
|
90
69
|
credentials: 'include',
|
|
91
70
|
});
|
|
92
|
-
|
|
93
|
-
const { token } = await response.json();
|
|
94
|
-
|
|
95
|
-
return token;
|
|
96
71
|
} catch (error) {
|
|
97
72
|
call("CrexLogger.log", {
|
|
98
73
|
level: "error",
|
|
@@ -101,99 +76,35 @@ export const AppConfigProvider = ({ children }: { children: React.ReactNode }) =
|
|
|
101
76
|
}
|
|
102
77
|
}
|
|
103
78
|
|
|
104
|
-
const updateIssuerMetadata = async (): Promise<void> => {
|
|
105
|
-
try {
|
|
106
|
-
await fetch('/api/oidc/issuer', {
|
|
107
|
-
method: 'POST',
|
|
108
|
-
credentials: 'include',
|
|
109
|
-
});
|
|
110
|
-
} catch (error) {
|
|
111
|
-
call("CrexLogger.log", {
|
|
112
|
-
level: "error",
|
|
113
|
-
message: `config-provider.updateIssuerMetadata error: ${error}`
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
const interval = async (delayMs: number) => {
|
|
119
|
-
while (true) {
|
|
120
|
-
await new Promise(resolve => setTimeout(resolve, delayMs));
|
|
121
|
-
await manageToken();
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
const updateLanguages = async () => {
|
|
126
|
-
const availableLanguages = useLanguageStore.getState().availableLanguages;
|
|
127
|
-
|
|
128
|
-
if (availableLanguages.length === 0) {
|
|
129
|
-
const setAvailableLanguages = useLanguageStore.getState().setAvailableLanguages;
|
|
130
|
-
|
|
131
|
-
const langs = await call<LanguageAndCountries[]>("LanguageService.getLanguagesAndCountries")
|
|
132
|
-
setAvailableLanguages(langs)
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
const getClientConfig = async (): Promise<CookiesConfigs> => {
|
|
137
|
-
const res = await fetch(`/api/cookies?key=${SDK_CONFIG_KEY}`);
|
|
138
|
-
|
|
139
|
-
if (!res.ok) {
|
|
140
|
-
throw new Error('Failed to fetch token from cookies API');
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const jsonConfig = await res.json();
|
|
144
|
-
|
|
145
|
-
if (jsonConfig.value === null) {
|
|
146
|
-
throw new Error('Client config not found in cookies');
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
const configs: CookiesConfigs = JSON.parse(jsonConfig.value);
|
|
150
|
-
|
|
151
|
-
return configs;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
79
|
useEffect(() => {
|
|
155
|
-
useLanguageStore.getState().
|
|
80
|
+
useLanguageStore.getState().setUiLang(uiLang)
|
|
81
|
+
useLanguageStore.getState().setContentLang(contentLang)
|
|
82
|
+
useLanguageStore.getState().setAvailableLanguages(availableLanguages)
|
|
83
|
+
|
|
84
|
+
setCookie(UI_LANG_KEY, uiLang);
|
|
85
|
+
setCookie(CONTENT_LANG_KEY, contentLang);
|
|
86
|
+
setCookie(AVAILABLE_CONTENT_LANG_KEY, JSON.stringify(availableLanguages));
|
|
156
87
|
|
|
157
88
|
const load = async () => {
|
|
158
89
|
try {
|
|
159
|
-
setLoading(true)
|
|
160
|
-
|
|
161
|
-
const configsResult = await getClientConfig()
|
|
162
|
-
|
|
163
90
|
await manageToken()
|
|
164
|
-
|
|
165
|
-
manageUILanguage(configsResult)
|
|
166
|
-
manageContentLanguage(configsResult)
|
|
167
|
-
updateLanguages()
|
|
168
|
-
updateIssuerMetadata()
|
|
169
91
|
setError(null)
|
|
170
|
-
setConfigs(configsResult)
|
|
171
|
-
interval(1000 * 60 * 9);
|
|
172
92
|
} catch (err) {
|
|
173
93
|
call("CrexLogger.log", {
|
|
174
94
|
level: "error",
|
|
175
95
|
message: `config-provider.load error: ${err}`
|
|
176
96
|
});
|
|
177
97
|
setError(err as Error)
|
|
178
|
-
} finally {
|
|
179
|
-
setLoading(false)
|
|
180
98
|
}
|
|
181
99
|
}
|
|
182
100
|
|
|
183
101
|
load()
|
|
184
102
|
}, [])
|
|
185
103
|
|
|
186
|
-
const loadingComp = (
|
|
187
|
-
<div className="flex items-center justify-center min-h-screen bg-white">
|
|
188
|
-
<div className="animate-spin rounded-full h-12 w-12 border-2 border-gray-300 border-t-gray-950" />
|
|
189
|
-
</div>
|
|
190
|
-
)
|
|
191
|
-
|
|
192
104
|
return (
|
|
193
105
|
<AppConfigContext.Provider
|
|
194
106
|
value={{
|
|
195
|
-
configs:
|
|
196
|
-
loading,
|
|
107
|
+
configs: initialConfig,
|
|
197
108
|
error,
|
|
198
109
|
availableVersions,
|
|
199
110
|
packageID,
|
|
@@ -203,7 +114,7 @@ export const AppConfigProvider = ({ children }: { children: React.ReactNode }) =
|
|
|
203
114
|
setPackageID
|
|
204
115
|
}}
|
|
205
116
|
>
|
|
206
|
-
{
|
|
117
|
+
{children}
|
|
207
118
|
</AppConfigContext.Provider>
|
|
208
119
|
)
|
|
209
120
|
}
|