@c-rex/contexts 0.1.15 → 0.1.16
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 +26 -103
package/package.json
CHANGED
package/src/config-provider.tsx
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
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
|
|
|
@@ -19,48 +20,28 @@ type AppConfigContextType = {
|
|
|
19
20
|
}
|
|
20
21
|
|
|
21
22
|
const AppConfigContext = createContext<AppConfigContextType | undefined>(undefined)
|
|
23
|
+
type AppConfigProviderProps = {
|
|
24
|
+
children: React.ReactNode
|
|
25
|
+
uiLang: string
|
|
26
|
+
contentLang: string
|
|
27
|
+
availableLanguages: LanguageAndCountries[]
|
|
28
|
+
initialConfig: CookiesConfigs
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const AppConfigProvider = ({
|
|
32
|
+
children,
|
|
33
|
+
uiLang,
|
|
34
|
+
contentLang,
|
|
35
|
+
availableLanguages,
|
|
36
|
+
initialConfig
|
|
37
|
+
}: AppConfigProviderProps) => {
|
|
22
38
|
|
|
23
|
-
export const AppConfigProvider = ({ children }: { children: React.ReactNode }) => {
|
|
24
39
|
const [error, setError] = useState<Error | null>(null)
|
|
25
|
-
const [configs, setConfigs] = useState<CookiesConfigs | null>(null)
|
|
26
40
|
const [loading, setLoading] = useState(true)
|
|
27
41
|
const [packageID, setPackageID] = useState<string | null>(null)
|
|
28
42
|
const [articleLang, setArticleLang] = useState<string | null>(null)
|
|
29
43
|
const [availableVersions, setAvailableVersions] = useState<AvailableVersionsInterface[] | null>(null)
|
|
30
44
|
|
|
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
45
|
const manageToken = async (): Promise<void> => {
|
|
65
46
|
try {
|
|
66
47
|
const res = await fetch(`/api/cookies?key=${CREX_TOKEN_HEADER_KEY}`);
|
|
@@ -85,14 +66,10 @@ export const AppConfigProvider = ({ children }: { children: React.ReactNode }) =
|
|
|
85
66
|
|
|
86
67
|
const requestToken = async (): Promise<void> => {
|
|
87
68
|
try {
|
|
88
|
-
|
|
69
|
+
await fetch('/api/oidc/token', {
|
|
89
70
|
method: 'POST',
|
|
90
71
|
credentials: 'include',
|
|
91
72
|
});
|
|
92
|
-
|
|
93
|
-
const { token } = await response.json();
|
|
94
|
-
|
|
95
|
-
return token;
|
|
96
73
|
} catch (error) {
|
|
97
74
|
call("CrexLogger.log", {
|
|
98
75
|
level: "error",
|
|
@@ -101,74 +78,20 @@ export const AppConfigProvider = ({ children }: { children: React.ReactNode }) =
|
|
|
101
78
|
}
|
|
102
79
|
}
|
|
103
80
|
|
|
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
81
|
useEffect(() => {
|
|
155
|
-
useLanguageStore.getState().
|
|
82
|
+
useLanguageStore.getState().setUiLang(uiLang)
|
|
83
|
+
useLanguageStore.getState().setContentLang(contentLang)
|
|
84
|
+
useLanguageStore.getState().setAvailableLanguages(availableLanguages)
|
|
85
|
+
|
|
86
|
+
setCookie(UI_LANG_KEY, uiLang);
|
|
87
|
+
setCookie(CONTENT_LANG_KEY, contentLang);
|
|
88
|
+
setCookie(AVAILABLE_CONTENT_LANG_KEY, JSON.stringify(availableLanguages));
|
|
156
89
|
|
|
157
90
|
const load = async () => {
|
|
158
91
|
try {
|
|
159
92
|
setLoading(true)
|
|
160
|
-
|
|
161
|
-
const configsResult = await getClientConfig()
|
|
162
|
-
|
|
163
93
|
await manageToken()
|
|
164
|
-
|
|
165
|
-
manageUILanguage(configsResult)
|
|
166
|
-
manageContentLanguage(configsResult)
|
|
167
|
-
updateLanguages()
|
|
168
|
-
updateIssuerMetadata()
|
|
169
94
|
setError(null)
|
|
170
|
-
setConfigs(configsResult)
|
|
171
|
-
interval(1000 * 60 * 9);
|
|
172
95
|
} catch (err) {
|
|
173
96
|
call("CrexLogger.log", {
|
|
174
97
|
level: "error",
|
|
@@ -192,7 +115,7 @@ export const AppConfigProvider = ({ children }: { children: React.ReactNode }) =
|
|
|
192
115
|
return (
|
|
193
116
|
<AppConfigContext.Provider
|
|
194
117
|
value={{
|
|
195
|
-
configs:
|
|
118
|
+
configs: initialConfig,
|
|
196
119
|
loading,
|
|
197
120
|
error,
|
|
198
121
|
availableVersions,
|