@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@c-rex/contexts",
3
- "version": "0.1.15",
3
+ "version": "0.1.17",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "src"
@@ -1,15 +1,15 @@
1
1
  "use client"
2
2
 
3
- import { API, CREX_TOKEN_HEADER_KEY, SDK_CONFIG_KEY, UI_LANG_OPTIONS } from '@c-rex/constants'
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
- const response = await fetch('/api/oidc/token', {
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().hydrate();
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: 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
- {loading ? loadingComp : children}
117
+ {children}
207
118
  </AppConfigContext.Provider>
208
119
  )
209
120
  }