@tolgee/web 4.9.3-rc.128edeb.0

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.
Files changed (206) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +31 -0
  3. package/dist/tolgee-backend-fetch.cjs.min.js +2 -0
  4. package/dist/tolgee-backend-fetch.cjs.min.js.map +1 -0
  5. package/dist/tolgee-backend-fetch.esm.min.mjs +2 -0
  6. package/dist/tolgee-backend-fetch.esm.min.mjs.map +1 -0
  7. package/dist/tolgee-backend-fetch.umd.min.js +2 -0
  8. package/dist/tolgee-backend-fetch.umd.min.js.map +1 -0
  9. package/dist/tolgee-context-ui.cjs.min.js +143 -0
  10. package/dist/tolgee-context-ui.cjs.min.js.map +1 -0
  11. package/dist/tolgee-context-ui.esm.min.mjs +143 -0
  12. package/dist/tolgee-context-ui.esm.min.mjs.map +1 -0
  13. package/dist/tolgee-context-ui.umd.min.js +143 -0
  14. package/dist/tolgee-context-ui.umd.min.js.map +1 -0
  15. package/dist/tolgee-in-context-tools.cjs.min.js +143 -0
  16. package/dist/tolgee-in-context-tools.cjs.min.js.map +1 -0
  17. package/dist/tolgee-in-context-tools.esm.min.mjs +143 -0
  18. package/dist/tolgee-in-context-tools.esm.min.mjs.map +1 -0
  19. package/dist/tolgee-in-context-tools.umd.min.js +143 -0
  20. package/dist/tolgee-in-context-tools.umd.min.js.map +1 -0
  21. package/dist/tolgee-invisible-observer.cjs.min.js +2 -0
  22. package/dist/tolgee-invisible-observer.cjs.min.js.map +1 -0
  23. package/dist/tolgee-invisible-observer.esm.min.mjs +2 -0
  24. package/dist/tolgee-invisible-observer.esm.min.mjs.map +1 -0
  25. package/dist/tolgee-invisible-observer.umd.min.js +2 -0
  26. package/dist/tolgee-invisible-observer.umd.min.js.map +1 -0
  27. package/dist/tolgee-language-detector.cjs.min.js +2 -0
  28. package/dist/tolgee-language-detector.cjs.min.js.map +1 -0
  29. package/dist/tolgee-language-detector.esm.min.mjs +2 -0
  30. package/dist/tolgee-language-detector.esm.min.mjs.map +1 -0
  31. package/dist/tolgee-language-detector.umd.min.js +2 -0
  32. package/dist/tolgee-language-detector.umd.min.js.map +1 -0
  33. package/dist/tolgee-language-storage.cjs.min.js +2 -0
  34. package/dist/tolgee-language-storage.cjs.min.js.map +1 -0
  35. package/dist/tolgee-language-storage.esm.min.mjs +2 -0
  36. package/dist/tolgee-language-storage.esm.min.mjs.map +1 -0
  37. package/dist/tolgee-language-storage.umd.min.js +2 -0
  38. package/dist/tolgee-language-storage.umd.min.js.map +1 -0
  39. package/dist/tolgee-text-observer.cjs.min.js +2 -0
  40. package/dist/tolgee-text-observer.cjs.min.js.map +1 -0
  41. package/dist/tolgee-text-observer.esm.min.mjs +2 -0
  42. package/dist/tolgee-text-observer.esm.min.mjs.map +1 -0
  43. package/dist/tolgee-text-observer.umd.min.js +2 -0
  44. package/dist/tolgee-text-observer.umd.min.js.map +1 -0
  45. package/dist/tolgee-web-tolgee.cjs.min.js +2 -0
  46. package/dist/tolgee-web-tolgee.cjs.min.js.map +1 -0
  47. package/dist/tolgee-web-tolgee.esm.min.mjs +2 -0
  48. package/dist/tolgee-web-tolgee.esm.min.mjs.map +1 -0
  49. package/dist/tolgee-web-tolgee.umd.min.js +2 -0
  50. package/dist/tolgee-web-tolgee.umd.min.js.map +1 -0
  51. package/dist/tolgee-web.cjs.js +27076 -0
  52. package/dist/tolgee-web.cjs.js.map +1 -0
  53. package/dist/tolgee-web.cjs.min.js +143 -0
  54. package/dist/tolgee-web.cjs.min.js.map +1 -0
  55. package/dist/tolgee-web.esm.js +27052 -0
  56. package/dist/tolgee-web.esm.js.map +1 -0
  57. package/dist/tolgee-web.esm.min.mjs +143 -0
  58. package/dist/tolgee-web.esm.min.mjs.map +1 -0
  59. package/dist/tolgee-web.umd.js +27082 -0
  60. package/dist/tolgee-web.umd.js.map +1 -0
  61. package/dist/tolgee-web.umd.min.js +143 -0
  62. package/dist/tolgee-web.umd.min.js.map +1 -0
  63. package/lib/BackendFetch.d.ts +4 -0
  64. package/lib/BrowserExtensionPlugin/BrowserExtensionPlugin.d.ts +8 -0
  65. package/lib/BrowserExtensionPlugin/constants.d.ts +3 -0
  66. package/lib/BrowserExtensionPlugin/loadInContextLib.d.ts +1 -0
  67. package/lib/ContextUi.d.ts +2 -0
  68. package/lib/DevBackend.d.ts +2 -0
  69. package/lib/DevTools.d.ts +3 -0
  70. package/lib/InContextTools.d.ts +2 -0
  71. package/lib/InvisibleObserver.d.ts +2 -0
  72. package/lib/LanguageDetector.d.ts +3 -0
  73. package/lib/LanguageStorage.d.ts +3 -0
  74. package/lib/TextObserver.d.ts +2 -0
  75. package/lib/WebTolgee.d.ts +3 -0
  76. package/lib/constants.d.ts +5 -0
  77. package/lib/index.d.ts +5 -0
  78. package/lib/observers/general/DomHelper.d.ts +4 -0
  79. package/lib/observers/general/ElementHighlighter.d.ts +10 -0
  80. package/lib/observers/general/ElementMeta.d.ts +3 -0
  81. package/lib/observers/general/ElementRegistry.d.ts +11 -0
  82. package/lib/observers/general/ElementStore.d.ts +10 -0
  83. package/lib/observers/general/GeneralObserver.d.ts +12 -0
  84. package/lib/observers/general/MouseEventHandler.d.ts +13 -0
  85. package/lib/observers/general/NodeHandler.d.ts +6 -0
  86. package/lib/observers/general/helpers.d.ts +7 -0
  87. package/lib/observers/invisible/InvisibleWrapper.d.ts +2 -0
  88. package/lib/observers/invisible/ValueMemory.d.ts +5 -0
  89. package/lib/observers/invisible/encoderPolyfill.d.ts +8 -0
  90. package/lib/observers/invisible/secret.d.ts +6 -0
  91. package/lib/observers/text/TextWrapper.d.ts +8 -0
  92. package/lib/observers/text/helpers.d.ts +3 -0
  93. package/lib/tools/decodeApiKey.d.ts +1 -0
  94. package/lib/tools/extension.d.ts +28 -0
  95. package/lib/typedIndex.d.ts +11 -0
  96. package/lib/types.d.ts +28 -0
  97. package/lib/ui/KeyContextMenu/KeyContextMenu.d.ts +19 -0
  98. package/lib/ui/KeyDialog/KeyDialog.d.ts +23 -0
  99. package/lib/ui/KeyDialog/KeyForm.d.ts +2 -0
  100. package/lib/ui/KeyDialog/LanguageSelect.d.ts +2 -0
  101. package/lib/ui/KeyDialog/NewWindow.d.ts +2 -0
  102. package/lib/ui/KeyDialog/NsSelect.d.ts +9 -0
  103. package/lib/ui/KeyDialog/ScreenshotGallery/ExtensionPrompt.d.ts +6 -0
  104. package/lib/ui/KeyDialog/ScreenshotGallery/ScreenshotDetail.d.ts +8 -0
  105. package/lib/ui/KeyDialog/ScreenshotGallery/ScreenshotDropzone.d.ts +6 -0
  106. package/lib/ui/KeyDialog/ScreenshotGallery/ScreenshotGallery.d.ts +2 -0
  107. package/lib/ui/KeyDialog/ScreenshotGallery/ScreenshotThumbnail.d.ts +8 -0
  108. package/lib/ui/KeyDialog/ScreenshotGallery/utils.d.ts +3 -0
  109. package/lib/ui/KeyDialog/TranslationDialog.d.ts +2 -0
  110. package/lib/ui/KeyDialog/TranslationDialogContextProvider.d.ts +128 -0
  111. package/lib/ui/KeyDialog/TranslationDialogWrapper.d.ts +2 -0
  112. package/lib/ui/KeyDialog/TranslationFields.d.ts +2 -0
  113. package/lib/ui/KeyDialog/languageHelpers.d.ts +12 -0
  114. package/lib/ui/KeyDialog/tools.d.ts +3 -0
  115. package/lib/ui/ThemeProvider.d.ts +2 -0
  116. package/lib/ui/client/QueryProvider.d.ts +12 -0
  117. package/lib/ui/client/apiSchema.generated.d.ts +3283 -0
  118. package/lib/ui/client/client.d.ts +5 -0
  119. package/lib/ui/client/types.d.ts +58 -0
  120. package/lib/ui/client/useQueryApi.d.ts +84 -0
  121. package/lib/ui/common/BodyEnd.d.ts +13 -0
  122. package/lib/ui/common/FieldTitle.d.ts +2 -0
  123. package/lib/ui/common/LoadingButton.d.ts +7 -0
  124. package/lib/ui/index.d.ts +13 -0
  125. package/lib/ui/tools/createProvider.d.ts +5 -0
  126. package/lib/ui/tools/isLanguagePermitted.d.ts +1 -0
  127. package/lib/ui/tools/sleep.d.ts +1 -0
  128. package/package.json +91 -0
  129. package/src/BackendFetch.ts +64 -0
  130. package/src/BrowserExtensionPlugin/BrowserExtensionPlugin.ts +98 -0
  131. package/src/BrowserExtensionPlugin/constants.ts +3 -0
  132. package/src/BrowserExtensionPlugin/loadInContextLib.ts +32 -0
  133. package/src/ContextUi.ts +7 -0
  134. package/src/DevBackend.ts +30 -0
  135. package/src/DevTools.ts +9 -0
  136. package/src/InContextTools.ts +20 -0
  137. package/src/InvisibleObserver.ts +16 -0
  138. package/src/LanguageDetector.test.ts +19 -0
  139. package/src/LanguageDetector.ts +32 -0
  140. package/src/LanguageStorage.ts +23 -0
  141. package/src/TextObserver.ts +45 -0
  142. package/src/WebTolgee.ts +8 -0
  143. package/src/__test__/browser.extension.test.ts +70 -0
  144. package/src/__test__/observer.test.ts +13 -0
  145. package/src/__test__/testObserver.ts +106 -0
  146. package/src/__test__/testRetranslate.ts +47 -0
  147. package/src/constants.ts +12 -0
  148. package/src/index.ts +8 -0
  149. package/src/observers/general/DomHelper.ts +46 -0
  150. package/src/observers/general/ElementHighlighter.ts +72 -0
  151. package/src/observers/general/ElementMeta.ts +17 -0
  152. package/src/observers/general/ElementRegistry.ts +159 -0
  153. package/src/observers/general/ElementStore.ts +34 -0
  154. package/src/observers/general/GeneralObserver.ts +133 -0
  155. package/src/observers/general/MouseEventHandler.ts +199 -0
  156. package/src/observers/general/NodeHandler.ts +39 -0
  157. package/src/observers/general/helpers.ts +65 -0
  158. package/src/observers/invisible/InvisibleWrapper.test.ts +17 -0
  159. package/src/observers/invisible/InvisibleWrapper.ts +96 -0
  160. package/src/observers/invisible/ValueMemory.test.ts +25 -0
  161. package/src/observers/invisible/ValueMemory.ts +20 -0
  162. package/src/observers/invisible/encoderPolyfill.ts +96 -0
  163. package/src/observers/invisible/secret.test.ts +61 -0
  164. package/src/observers/invisible/secret.ts +68 -0
  165. package/src/observers/text/TextWrapper.ts +258 -0
  166. package/src/observers/text/helpers.ts +56 -0
  167. package/src/tools/decodeApiKey.test.ts +14 -0
  168. package/src/tools/decodeApiKey.ts +74 -0
  169. package/src/tools/extension.test.ts +159 -0
  170. package/src/tools/extension.ts +119 -0
  171. package/src/typedIndex.ts +13 -0
  172. package/src/types.ts +33 -0
  173. package/src/ui/KeyContextMenu/KeyContextMenu.test.ts +51 -0
  174. package/src/ui/KeyContextMenu/KeyContextMenu.tsx +108 -0
  175. package/src/ui/KeyDialog/KeyDialog.tsx +67 -0
  176. package/src/ui/KeyDialog/KeyForm.tsx +208 -0
  177. package/src/ui/KeyDialog/LanguageSelect.tsx +78 -0
  178. package/src/ui/KeyDialog/NewWindow.tsx +106 -0
  179. package/src/ui/KeyDialog/NsSelect.tsx +67 -0
  180. package/src/ui/KeyDialog/ScreenshotGallery/ExtensionPrompt.tsx +97 -0
  181. package/src/ui/KeyDialog/ScreenshotGallery/ScreenshotDetail.tsx +33 -0
  182. package/src/ui/KeyDialog/ScreenshotGallery/ScreenshotDropzone.tsx +138 -0
  183. package/src/ui/KeyDialog/ScreenshotGallery/ScreenshotGallery.tsx +240 -0
  184. package/src/ui/KeyDialog/ScreenshotGallery/ScreenshotThumbnail.tsx +113 -0
  185. package/src/ui/KeyDialog/ScreenshotGallery/utils.ts +17 -0
  186. package/src/ui/KeyDialog/TranslationDialog.tsx +14 -0
  187. package/src/ui/KeyDialog/TranslationDialogContextProvider.tsx +464 -0
  188. package/src/ui/KeyDialog/TranslationDialogWrapper.tsx +44 -0
  189. package/src/ui/KeyDialog/TranslationFields.tsx +113 -0
  190. package/src/ui/KeyDialog/languageHelpers.ts +18 -0
  191. package/src/ui/KeyDialog/tools.ts +30 -0
  192. package/src/ui/ThemeProvider.tsx +71 -0
  193. package/src/ui/client/QueryProvider.tsx +38 -0
  194. package/src/ui/client/apiSchema.generated.ts +3281 -0
  195. package/src/ui/client/client.ts +155 -0
  196. package/src/ui/client/types.ts +113 -0
  197. package/src/ui/client/useQueryApi.ts +121 -0
  198. package/src/ui/common/BodyEnd.tsx +44 -0
  199. package/src/ui/common/FieldTitle.tsx +9 -0
  200. package/src/ui/common/LoadingButton.tsx +45 -0
  201. package/src/ui/index.ts +88 -0
  202. package/src/ui/screenshots/ScreenshotPreview.tsx +18 -0
  203. package/src/ui/tools/createProvider.tsx +54 -0
  204. package/src/ui/tools/isLanguagePermitted.ts +14 -0
  205. package/src/ui/tools/sleep.ts +2 -0
  206. package/types/index.d.ts +9 -0
@@ -0,0 +1,113 @@
1
+ import React from 'react';
2
+ import { FunctionComponent } from 'react';
3
+ import {
4
+ useDialogContext,
5
+ useDialogDispatch,
6
+ } from './TranslationDialogContextProvider';
7
+ import TextField from '@mui/material/TextField';
8
+ import { styled } from '@mui/material/styles';
9
+ import { keyframes } from '@mui/styled-engine';
10
+ import { ScFieldTitle } from '../common/FieldTitle';
11
+ import { isLanguagePermitted } from '../tools/isLanguagePermitted';
12
+ import { getPreferredLanguages } from './tools';
13
+
14
+ const inputLoading = keyframes`
15
+ 0% { background-position: 0%; }
16
+ 100% { background-position: 100%; }
17
+ `;
18
+
19
+ const ScTextField = styled(TextField)`
20
+ margin: 0px;
21
+ & .Mui-disabled {
22
+ background: ${({ theme }) => theme.palette.grey[200]};
23
+ }
24
+ `;
25
+
26
+ const LoadingTextArea = styled('div')`
27
+ margin-top: 10px;
28
+ padding: 5px;
29
+ border: 1px solid #ccc;
30
+ width: 100%;
31
+ border-radius: 5px;
32
+ font-style: inherit;
33
+ font-family: inherit;
34
+ box-sizing: border-box;
35
+ display: block;
36
+ height: 42px;
37
+ background: linear-gradient(
38
+ 90deg,
39
+ rgba(0, 0, 0, 0),
40
+ rgba(0, 0, 0, 0),
41
+ rgba(0, 0, 0, 0.1),
42
+ rgba(0, 0, 0, 0),
43
+ rgba(0, 0, 0, 0)
44
+ );
45
+ background-size: 500% 500%;
46
+ animation: ${inputLoading} 1.5s linear infinite alternate;
47
+ `;
48
+
49
+ export const TranslationFields: FunctionComponent = () => {
50
+ const dispatch = useDialogDispatch();
51
+
52
+ const selectedLanguages = useDialogContext((c) => c.selectedLanguages);
53
+ const langFields = selectedLanguages.length
54
+ ? selectedLanguages
55
+ : getPreferredLanguages();
56
+ const availableLanguages = useDialogContext((c) => c.availableLanguages);
57
+ const translationsForm = useDialogContext((c) => c.translationsForm);
58
+ const formDisabled = useDialogContext((c) => c.formDisabled);
59
+ const loading = useDialogContext((c) => c.loading);
60
+ const permittedLanguageIds = useDialogContext((c) => c.permittedLanguageIds);
61
+
62
+ const onChange = (key: string) => (e: any) => {
63
+ dispatch({
64
+ type: 'ON_INPUT_CHANGE',
65
+ payload: { key, value: e.target.value },
66
+ });
67
+ };
68
+
69
+ const Loading = () => (
70
+ <>
71
+ {langFields.map((lang) => (
72
+ <LoadingTextArea key={lang} />
73
+ ))}
74
+ </>
75
+ );
76
+
77
+ return (
78
+ <>
79
+ {loading ? (
80
+ <Loading />
81
+ ) : (
82
+ [...selectedLanguages].map((key) => {
83
+ const lang = availableLanguages?.find((l) => l.tag === key);
84
+ const languagePermitted = isLanguagePermitted(
85
+ key,
86
+ permittedLanguageIds,
87
+ availableLanguages
88
+ );
89
+
90
+ return (
91
+ <React.Fragment key={key}>
92
+ <ScFieldTitle>{lang?.name || key}</ScFieldTitle>
93
+ <ScTextField
94
+ size="small"
95
+ disabled={formDisabled || !languagePermitted}
96
+ key={key}
97
+ inputProps={{
98
+ lang: key,
99
+ }}
100
+ minRows={2}
101
+ maxRows={Infinity}
102
+ multiline
103
+ fullWidth
104
+ value={translationsForm[key] || ''}
105
+ onChange={onChange(key)}
106
+ />
107
+ </React.Fragment>
108
+ );
109
+ })
110
+ )}
111
+ </>
112
+ );
113
+ };
@@ -0,0 +1,18 @@
1
+ import { components } from '../client/apiSchema.generated';
2
+
3
+ type LanguageModel = components['schemas']['LanguageModel'];
4
+
5
+ export const putBaseLangFirst = (languages: LanguageModel[] | undefined) => {
6
+ const base = languages?.find((l) => l.base);
7
+ if (base) {
8
+ return [base, ...(languages || []).filter((val) => val !== base)];
9
+ }
10
+ return languages;
11
+ };
12
+
13
+ export const putBaseLangFirstTags = (strings: Array<string>, base?: string) => {
14
+ if (base && strings.includes(base)) {
15
+ return [base, ...strings.filter((val) => val !== base)];
16
+ }
17
+ return strings;
18
+ };
@@ -0,0 +1,30 @@
1
+ import {
2
+ MAX_LANGUAGES_SELECTED,
3
+ PREFERRED_LANGUAGES_LOCAL_STORAGE_KEY,
4
+ } from '../../constants';
5
+
6
+ export function getPreferredLanguages(): string[] {
7
+ try {
8
+ return JSON.parse(
9
+ localStorage.getItem(PREFERRED_LANGUAGES_LOCAL_STORAGE_KEY) || ''
10
+ );
11
+ } catch {
12
+ return [];
13
+ }
14
+ }
15
+
16
+ export function setPreferredLanguages(languages: string[]) {
17
+ localStorage.setItem(
18
+ PREFERRED_LANGUAGES_LOCAL_STORAGE_KEY,
19
+ JSON.stringify(languages)
20
+ );
21
+ }
22
+
23
+ export function getInitialLanguages(available: string[]) {
24
+ const preferred = getPreferredLanguages();
25
+ let langs = preferred.filter((l) => available.includes(l));
26
+ if (langs.length === 0) {
27
+ langs = available;
28
+ }
29
+ return langs.slice(0, MAX_LANGUAGES_SELECTED);
30
+ }
@@ -0,0 +1,71 @@
1
+ import React, { useRef } from 'react';
2
+ import {
3
+ createTheme,
4
+ ThemeProvider as MuiThemeProvider,
5
+ } from '@mui/material/styles';
6
+ import { DEVTOOLS_ID, DEVTOOLS_Z_INDEX } from '../constants';
7
+ import createCache from '@emotion/cache';
8
+ import { CacheProvider } from '@emotion/react';
9
+
10
+ let theme = createTheme({
11
+ typography: {
12
+ fontFamily:
13
+ '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"',
14
+ },
15
+ palette: {
16
+ primary: {
17
+ main: '#822B55',
18
+ },
19
+ secondary: {
20
+ main: '#2B5582',
21
+ },
22
+ text: {
23
+ secondary: '#808080',
24
+ },
25
+ background: {
26
+ default: 'rgb(255, 255, 255)',
27
+ },
28
+ },
29
+ zIndex: {
30
+ modal: DEVTOOLS_Z_INDEX,
31
+ },
32
+ });
33
+
34
+ theme = createTheme(theme, {
35
+ components: {
36
+ MuiButton: {
37
+ styleOverrides: {
38
+ root: {
39
+ whiteSpace: 'nowrap',
40
+ },
41
+ },
42
+ },
43
+ MuiTooltip: {
44
+ styleOverrides: {
45
+ tooltip: {
46
+ fontSize: 12,
47
+ boxShadow: '1px 1px 6px rgba(0, 0, 0, 0.25)',
48
+ borderRadius: '11px',
49
+ color: 'black',
50
+ backgroundColor: 'white',
51
+ },
52
+ },
53
+ },
54
+ },
55
+ });
56
+
57
+ export const ThemeProvider: React.FC = ({ children }) => {
58
+ const cache = useRef(
59
+ createCache({
60
+ key: 'css',
61
+ prepend: true,
62
+ container: document.getElementById(DEVTOOLS_ID)?.shadowRoot as Node,
63
+ })
64
+ );
65
+
66
+ return (
67
+ <CacheProvider value={cache.current!}>
68
+ <MuiThemeProvider theme={theme}>{children}</MuiThemeProvider>
69
+ </CacheProvider>
70
+ );
71
+ };
@@ -0,0 +1,38 @@
1
+ import React from 'react';
2
+ import { QueryClientProvider, QueryClient } from 'react-query';
3
+
4
+ export type GlobalOptions = {
5
+ apiKey: string;
6
+ apiUrl: string;
7
+ };
8
+
9
+ const queryClient = new QueryClient({
10
+ defaultOptions: {
11
+ queries: {
12
+ refetchOnWindowFocus: false,
13
+ refetchOnReconnect: false,
14
+ retry: false,
15
+ cacheTime: 0,
16
+ staleTime: 0,
17
+ },
18
+ },
19
+ });
20
+
21
+ export const QueryContext = React.createContext({} as GlobalOptions);
22
+
23
+ type Props = {
24
+ apiKey: string;
25
+ apiUrl: string;
26
+ };
27
+
28
+ export const QueryProvider: React.FC<Props> = ({
29
+ children,
30
+ apiUrl,
31
+ apiKey,
32
+ }) => {
33
+ return (
34
+ <QueryContext.Provider value={{ apiUrl, apiKey }}>
35
+ <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
36
+ </QueryContext.Provider>
37
+ );
38
+ };