@redacto.io/consent-sdk-react 4.0.0 → 5.0.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 (160) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/LICENSE +176 -0
  3. package/dist/index.js +231 -96
  4. package/dist/index.mjs +231 -96
  5. package/dist/privacy-center.d.mts +649 -0
  6. package/dist/privacy-center.d.ts +649 -0
  7. package/dist/privacy-center.js +20824 -0
  8. package/dist/privacy-center.mjs +20789 -0
  9. package/package.json +47 -3
  10. package/src/RedactoNoticeConsent/RedactoNoticeConsent.tsx +6 -4
  11. package/src/RedactoNoticeConsent/api/index.ts +2 -0
  12. package/src/RedactoNoticeConsent/api/types.ts +2 -0
  13. package/src/RedactoNoticeConsent/components/DigiLockerCallback.tsx +128 -62
  14. package/src/RedactoNoticeConsent/language-codes.ts +97 -0
  15. package/src/RedactoNoticeConsentInline/RedactoNoticeConsentInline.tsx +0 -3
  16. package/src/RedactoNoticeConsentInline/api/index.ts +0 -1
  17. package/src/RedactoPrivacyCenter/PrivacyCenterActivityPage.tsx +19 -0
  18. package/src/RedactoPrivacyCenter/PrivacyCenterCaseDetailsPage.tsx +154 -0
  19. package/src/RedactoPrivacyCenter/PrivacyCenterConsentManagerPage.tsx +17 -0
  20. package/src/RedactoPrivacyCenter/PrivacyCenterFormPage.tsx +79 -0
  21. package/src/RedactoPrivacyCenter/PrivacyCenterHomePage.tsx +30 -0
  22. package/src/RedactoPrivacyCenter/PrivacyCenterLayout.tsx +173 -0
  23. package/src/RedactoPrivacyCenter/RedactoPrivacyCenter.tsx +55 -0
  24. package/src/RedactoPrivacyCenter/api/actions.ts +476 -0
  25. package/src/RedactoPrivacyCenter/api/client.ts +524 -0
  26. package/src/RedactoPrivacyCenter/api/config.ts +33 -0
  27. package/src/RedactoPrivacyCenter/api/fetcher.ts +181 -0
  28. package/src/RedactoPrivacyCenter/api/upload.ts +93 -0
  29. package/src/RedactoPrivacyCenter/assets/character.svg +31 -0
  30. package/src/RedactoPrivacyCenter/assets/fileAttach.svg +9 -0
  31. package/src/RedactoPrivacyCenter/assets/greenTick.svg +4 -0
  32. package/src/RedactoPrivacyCenter/assets/mail.svg +3 -0
  33. package/src/RedactoPrivacyCenter/assets/poweredByRedacto.svg +9 -0
  34. package/src/RedactoPrivacyCenter/assets/sentImg.svg +9 -0
  35. package/src/RedactoPrivacyCenter/assets/uploadFileIcon.svg +9 -0
  36. package/src/RedactoPrivacyCenter/components/ActivitiesList.tsx +272 -0
  37. package/src/RedactoPrivacyCenter/components/CaseDetails/AttachmentCard.tsx +38 -0
  38. package/src/RedactoPrivacyCenter/components/CaseDetails/ChatBubble.tsx +31 -0
  39. package/src/RedactoPrivacyCenter/components/CaseDetails/DocumentRequestCard.tsx +73 -0
  40. package/src/RedactoPrivacyCenter/components/CaseDetails/MessageComposer.tsx +87 -0
  41. package/src/RedactoPrivacyCenter/components/CaseDetails/MessageItem.tsx +95 -0
  42. package/src/RedactoPrivacyCenter/components/CaseDetails/MessagesTab.tsx +147 -0
  43. package/src/RedactoPrivacyCenter/components/CaseDetails/RequestDetailsTab.tsx +171 -0
  44. package/src/RedactoPrivacyCenter/components/CaseDetails/StatusEvent.tsx +23 -0
  45. package/src/RedactoPrivacyCenter/components/CaseDetails/useFileUpload.ts +116 -0
  46. package/src/RedactoPrivacyCenter/components/CaseDetails/useMessagePolling.ts +36 -0
  47. package/src/RedactoPrivacyCenter/components/CaseDetails/utils.ts +56 -0
  48. package/src/RedactoPrivacyCenter/components/CaseDetailsModal.tsx +469 -0
  49. package/src/RedactoPrivacyCenter/components/CaseHistory.tsx +426 -0
  50. package/src/RedactoPrivacyCenter/components/ConsentManager.tsx +732 -0
  51. package/src/RedactoPrivacyCenter/components/ConsentManagerColumns.tsx +238 -0
  52. package/src/RedactoPrivacyCenter/components/ConsentManagerConstants.ts +7 -0
  53. package/src/RedactoPrivacyCenter/components/ConsentManagerTableSkeleton.tsx +155 -0
  54. package/src/RedactoPrivacyCenter/components/DataRequest/CorrectionDataSection.tsx +189 -0
  55. package/src/RedactoPrivacyCenter/components/DataRequest/GrievanceDataSection.tsx +118 -0
  56. package/src/RedactoPrivacyCenter/components/DataRequest/NominationDataSection.tsx +66 -0
  57. package/src/RedactoPrivacyCenter/components/DataRequest/PurposeSelectionSection.tsx +304 -0
  58. package/src/RedactoPrivacyCenter/components/Form.tsx +1596 -0
  59. package/src/RedactoPrivacyCenter/components/GrievanceTable.tsx +174 -0
  60. package/src/RedactoPrivacyCenter/components/GrievanceTablePagination.tsx +337 -0
  61. package/src/RedactoPrivacyCenter/components/ModifyConsentModal.tsx +330 -0
  62. package/src/RedactoPrivacyCenter/components/Pagination.tsx +140 -0
  63. package/src/RedactoPrivacyCenter/components/PrivacyCenterLayout.tsx +304 -0
  64. package/src/RedactoPrivacyCenter/components/RequestSubmit.tsx +232 -0
  65. package/src/RedactoPrivacyCenter/components/SideMenuBarPC/SideBarPC.tsx +475 -0
  66. package/src/RedactoPrivacyCenter/components/SideMenuBarPC/SideMenuPC.tsx +408 -0
  67. package/src/RedactoPrivacyCenter/components/SideMenuBarPC/constants.tsx +42 -0
  68. package/src/RedactoPrivacyCenter/components/SideMenuBarPC/menuItemsPC.tsx +1 -0
  69. package/src/RedactoPrivacyCenter/components/SideMenuBarPC/types.ts +40 -0
  70. package/src/RedactoPrivacyCenter/components/SideMenuBarPC/utils.ts +38 -0
  71. package/src/RedactoPrivacyCenter/components/ThemeTransitionOverlay.tsx +85 -0
  72. package/src/RedactoPrivacyCenter/components/activitiesColumns.tsx +141 -0
  73. package/src/RedactoPrivacyCenter/components/caseHistoryColumns.tsx +159 -0
  74. package/src/RedactoPrivacyCenter/components/constant.ts +16 -0
  75. package/src/RedactoPrivacyCenter/components/types.ts +76 -0
  76. package/src/RedactoPrivacyCenter/components/utils.tsx +10 -0
  77. package/src/RedactoPrivacyCenter/config/routes.ts +9 -0
  78. package/src/RedactoPrivacyCenter/config/table.ts +25 -0
  79. package/src/RedactoPrivacyCenter/context/AuthContext.tsx +137 -0
  80. package/src/RedactoPrivacyCenter/context/BaseUrlContext.tsx +41 -0
  81. package/src/RedactoPrivacyCenter/context/LocaleContext.tsx +11 -0
  82. package/src/RedactoPrivacyCenter/context/NavigationContext.tsx +96 -0
  83. package/src/RedactoPrivacyCenter/context/OrganizationContext.tsx +30 -0
  84. package/src/RedactoPrivacyCenter/context/PageChromeContext.tsx +60 -0
  85. package/src/RedactoPrivacyCenter/context/theme.tsx +127 -0
  86. package/src/RedactoPrivacyCenter/context/types.ts +14 -0
  87. package/src/RedactoPrivacyCenter/lib/api.ts +566 -0
  88. package/src/RedactoPrivacyCenter/lib/consent-manager/utils.tsx +63 -0
  89. package/src/RedactoPrivacyCenter/lib/constants.ts +161 -0
  90. package/src/RedactoPrivacyCenter/lib/i18n.ts +81 -0
  91. package/src/RedactoPrivacyCenter/lib/locales.ts +105 -0
  92. package/src/RedactoPrivacyCenter/lib/queries.ts +134 -0
  93. package/src/RedactoPrivacyCenter/lib/types.ts +531 -0
  94. package/src/RedactoPrivacyCenter/lib/useCurrentLanguage.ts +37 -0
  95. package/src/RedactoPrivacyCenter/lib/utils.ts +626 -0
  96. package/src/RedactoPrivacyCenter/locales/as/translation.json +280 -0
  97. package/src/RedactoPrivacyCenter/locales/bho/translation.json +280 -0
  98. package/src/RedactoPrivacyCenter/locales/bn/translation.json +280 -0
  99. package/src/RedactoPrivacyCenter/locales/brx/translation.json +280 -0
  100. package/src/RedactoPrivacyCenter/locales/doi/translation.json +280 -0
  101. package/src/RedactoPrivacyCenter/locales/en/translation.json +255 -0
  102. package/src/RedactoPrivacyCenter/locales/gom/translation.json +280 -0
  103. package/src/RedactoPrivacyCenter/locales/gu/translation.json +280 -0
  104. package/src/RedactoPrivacyCenter/locales/hi/translation.json +280 -0
  105. package/src/RedactoPrivacyCenter/locales/kn/translation.json +280 -0
  106. package/src/RedactoPrivacyCenter/locales/ks/translation.json +280 -0
  107. package/src/RedactoPrivacyCenter/locales/mai/translation.json +280 -0
  108. package/src/RedactoPrivacyCenter/locales/ml/translation.json +280 -0
  109. package/src/RedactoPrivacyCenter/locales/mni-Mtei/translation.json +280 -0
  110. package/src/RedactoPrivacyCenter/locales/mr/translation.json +280 -0
  111. package/src/RedactoPrivacyCenter/locales/ne/translation.json +280 -0
  112. package/src/RedactoPrivacyCenter/locales/or/translation.json +280 -0
  113. package/src/RedactoPrivacyCenter/locales/pa/translation.json +280 -0
  114. package/src/RedactoPrivacyCenter/locales/sa/translation.json +280 -0
  115. package/src/RedactoPrivacyCenter/locales/sat/translation.json +280 -0
  116. package/src/RedactoPrivacyCenter/locales/sd/translation.json +280 -0
  117. package/src/RedactoPrivacyCenter/locales/ta/translation.json +280 -0
  118. package/src/RedactoPrivacyCenter/locales/te/translation.json +280 -0
  119. package/src/RedactoPrivacyCenter/locales/ur/translation.json +280 -0
  120. package/src/RedactoPrivacyCenter/styles/base.css +117 -0
  121. package/src/RedactoPrivacyCenter/styles/injectStyles.ts +1725 -0
  122. package/src/RedactoPrivacyCenter/styles/pcStyles.ts +813 -0
  123. package/src/RedactoPrivacyCenter/styles/responsive.ts +138 -0
  124. package/src/RedactoPrivacyCenter/styles/variables.css +133 -0
  125. package/src/RedactoPrivacyCenter/table/AdvancedTable.tsx +367 -0
  126. package/src/RedactoPrivacyCenter/table/AdvancedTablePagination.tsx +476 -0
  127. package/src/RedactoPrivacyCenter/table/index.ts +2 -0
  128. package/src/RedactoPrivacyCenter/types/images.d.ts +29 -0
  129. package/src/RedactoPrivacyCenter/ui/Footer.tsx +75 -0
  130. package/src/RedactoPrivacyCenter/ui/FormBlockWrapper.tsx +54 -0
  131. package/src/RedactoPrivacyCenter/ui/PCAccordion.tsx +93 -0
  132. package/src/RedactoPrivacyCenter/ui/PCActionIcon.tsx +47 -0
  133. package/src/RedactoPrivacyCenter/ui/PCAvatar.tsx +69 -0
  134. package/src/RedactoPrivacyCenter/ui/PCBadge.tsx +48 -0
  135. package/src/RedactoPrivacyCenter/ui/PCButton.tsx +77 -0
  136. package/src/RedactoPrivacyCenter/ui/PCCheckbox.tsx +55 -0
  137. package/src/RedactoPrivacyCenter/ui/PCCollapse.tsx +107 -0
  138. package/src/RedactoPrivacyCenter/ui/PCEmpty.tsx +35 -0
  139. package/src/RedactoPrivacyCenter/ui/PCInput.tsx +132 -0
  140. package/src/RedactoPrivacyCenter/ui/PCLoader.tsx +31 -0
  141. package/src/RedactoPrivacyCenter/ui/PCModal.tsx +106 -0
  142. package/src/RedactoPrivacyCenter/ui/PCPopover.tsx +173 -0
  143. package/src/RedactoPrivacyCenter/ui/PCSelect.tsx +387 -0
  144. package/src/RedactoPrivacyCenter/ui/PCTable.tsx +149 -0
  145. package/src/RedactoPrivacyCenter/ui/PCText.tsx +41 -0
  146. package/src/RedactoPrivacyCenter/ui/PCTextarea.tsx +43 -0
  147. package/src/RedactoPrivacyCenter/ui/PCTitle.tsx +37 -0
  148. package/src/RedactoPrivacyCenter/ui/PCTooltip.tsx +119 -0
  149. package/src/RedactoPrivacyCenter/ui/SimpleBar.tsx +25 -0
  150. package/src/RedactoPrivacyCenter/ui/StatusBadge.tsx +53 -0
  151. package/src/RedactoPrivacyCenter/ui/ThemeToggle.tsx +72 -0
  152. package/src/RedactoPrivacyCenter/ui/index.ts +18 -0
  153. package/src/RedactoPrivacyCenter/utils/cn.ts +28 -0
  154. package/src/RedactoPrivacyCenter/utils/date.ts +48 -0
  155. package/src/RedactoPrivacyCenter/utils/status.ts +111 -0
  156. package/src/RedactoPrivacyCenter/utils/toast.ts +130 -0
  157. package/src/privacy-center.ts +108 -0
  158. package/tsconfig.json +2 -0
  159. package/tsup.config.ts +16 -1
  160. package/.turbo/turbo-build.log +0 -21
@@ -0,0 +1,304 @@
1
+ import { Suspense, useState, useEffect, useCallback } from 'react';
2
+ import SideBarPC from './SideMenuBarPC/SideBarPC';
3
+ import Footer from '../ui/Footer';
4
+ import ThemeToggle from '../ui/ThemeToggle';
5
+ import ThemeTransitionOverlay from './ThemeTransitionOverlay';
6
+ import { PCSelect } from '../ui';
7
+ import { useTranslation } from 'react-i18next';
8
+ import { PAGE_CHROME_BY_PAGE, languageOptions } from '../lib/constants';
9
+ import { LocaleContext } from '../context/LocaleContext';
10
+ import { useInternalNavigation } from '../context/NavigationContext';
11
+ import { usePageChrome } from '../context/PageChromeContext';
12
+ import i18n from '../lib/i18n';
13
+ import { pcStyles } from '../styles/pcStyles';
14
+ import type { PrivacyCenterLayoutProps } from './types';
15
+
16
+ const getVar = (varName: string): string => `var(${varName})`;
17
+
18
+ export default function PrivacyCenterLayout({
19
+ children,
20
+ sidebarClassName,
21
+ contentClassName,
22
+ onBack,
23
+ }: PrivacyCenterLayoutProps) {
24
+ const { t } = useTranslation();
25
+ const { currentPage } = useInternalNavigation();
26
+ const { pageChromeOverride } = usePageChrome();
27
+ const [locale, setLocale] = useState(i18n.language);
28
+ const pageChrome = pageChromeOverride ?? PAGE_CHROME_BY_PAGE[currentPage];
29
+
30
+ const handleLanguageChange = useCallback((value: unknown) => {
31
+ const langValue = value as { value: string; label: string };
32
+ i18n.changeLanguage(langValue.value);
33
+ }, []);
34
+
35
+ useEffect(() => {
36
+ const handleLanguageChanged = () => setLocale(i18n.language);
37
+ i18n.on('languageChanged', handleLanguageChanged);
38
+ return () => i18n.off('languageChanged', handleLanguageChanged);
39
+ }, []);
40
+
41
+ return (
42
+ <LocaleContext.Provider value={{ locale, setLocale }}>
43
+ <Suspense fallback={<div style={{ ...pcStyles.flex, ...pcStyles.itemsCenter, ...pcStyles.justifyCenter, minHeight: '100vh' }}>{t('loadingEllipsis')}</div>}>
44
+ <ThemeTransitionOverlay />
45
+ <main
46
+ className="pc-root"
47
+ style={{
48
+ ...pcStyles.flex,
49
+ minHeight: '100vh',
50
+ flexGrow: 1,
51
+ position: 'relative',
52
+ backgroundColor: getVar('--pc-bg-shell'),
53
+ }}
54
+ >
55
+ <SideBarPC className={sidebarClassName} onBack={onBack} />
56
+ <div style={{
57
+ ...pcStyles.flex,
58
+ ...pcStyles.flexCol,
59
+ flex: 1,
60
+ minWidth: 0,
61
+ backgroundColor: getVar('--pc-bg-shell'),
62
+ }} className="pc-content-wrapper">
63
+ {/* Top Navbar with Theme Toggle */}
64
+ <nav style={{
65
+ position: 'fixed',
66
+ top: 0,
67
+ zIndex: 50,
68
+ ...pcStyles.flex,
69
+ ...pcStyles.itemsCenter,
70
+ ...pcStyles.justifyBetween,
71
+ gap: '0.75rem',
72
+ backgroundColor: getVar('--pc-bg-shell'),
73
+ paddingLeft: 'var(--pc-navbar-padding-left, 0.75rem)',
74
+ paddingRight: 'var(--pc-navbar-padding-right, 0.75rem)',
75
+ paddingTop: 'var(--pc-navbar-padding-top, 0.625rem)',
76
+ paddingBottom: 'var(--pc-navbar-padding-bottom, 0.625rem)',
77
+ transition: 'background-color 0.3s ease, border-color 0.3s ease, width 0.3s ease, left 0.3s ease',
78
+ willChange: 'background-color, border-color, width, left',
79
+ }} className="pc-navbar">
80
+ <div
81
+ className="pc-navbar-page-meta"
82
+ style={{
83
+ display: 'flex',
84
+ flexDirection: 'column',
85
+ justifyContent: 'center',
86
+ minWidth: 0,
87
+ flex: 1,
88
+ gap: '0.125rem',
89
+ }}
90
+ >
91
+ <p
92
+ className="pc-navbar-title"
93
+ style={{
94
+ margin: 0,
95
+ color: getVar('--pc-text-primary'),
96
+ fontSize: '1rem',
97
+ fontWeight: 600,
98
+ lineHeight: 1.3,
99
+ whiteSpace: 'nowrap',
100
+ overflow: 'hidden',
101
+ textOverflow: 'ellipsis',
102
+ }}
103
+ >
104
+ {t(pageChrome.titleKey)}
105
+ </p>
106
+ {pageChrome.descriptionKey && (
107
+ <p
108
+ className="pc-navbar-description"
109
+ style={{
110
+ margin: 0,
111
+ color: getVar('--pc-text-secondary'),
112
+ fontSize: '0.8125rem',
113
+ lineHeight: 1.35,
114
+ whiteSpace: 'nowrap',
115
+ overflow: 'hidden',
116
+ textOverflow: 'ellipsis',
117
+ }}
118
+ >
119
+ {t(pageChrome.descriptionKey)}
120
+ </p>
121
+ )}
122
+ </div>
123
+ <div style={{
124
+ display: 'flex',
125
+ alignItems: 'center',
126
+ gap: '0.5rem',
127
+ flexShrink: 0,
128
+ }} className="pc-navbar-actions">
129
+ <PCSelect
130
+ size="sm"
131
+ searchable
132
+ searchPlaceholder={t('searchPlaceholder')}
133
+ noOptionsMessage={t('noOptionsFound')}
134
+ style={{
135
+ width: 'auto',
136
+ minWidth: '92px',
137
+ maxWidth: '136px',
138
+ flexShrink: 0,
139
+ }}
140
+ options={languageOptions}
141
+ value={languageOptions.find((opt) => opt.value === locale) || null}
142
+ onChange={handleLanguageChange}
143
+ />
144
+ <ThemeToggle />
145
+ </div>
146
+ </nav>
147
+ <div style={{
148
+ ...pcStyles.flex,
149
+ ...pcStyles.flexCol,
150
+ flexGrow: 1,
151
+ paddingLeft: 'var(--pc-content-padding-left, 0.75rem)',
152
+ paddingRight: 'var(--pc-content-padding-right, 0.75rem)',
153
+ paddingTop: 'var(--pc-content-padding-top, 4rem)',
154
+ minWidth: 0,
155
+ backgroundColor: getVar('--pc-bg-shell'),
156
+ }} className="pc-content-container">
157
+ <div style={{
158
+ minHeight: '100vh',
159
+ width: '100%',
160
+ }}>
161
+ <div style={{
162
+ ...pcStyles.flex,
163
+ ...pcStyles.flexCol,
164
+ height: '100%',
165
+ minHeight: '100vh',
166
+ ...pcStyles.justifyBetween,
167
+ ...pcStyles.gapMd,
168
+ paddingLeft: '0.5rem',
169
+ paddingRight: '0.5rem',
170
+ paddingTop: '1rem',
171
+ paddingBottom: '1rem',
172
+ }}>
173
+ <div className={contentClassName} style={{ width: '100%' }}>{children}</div>
174
+ <div style={{
175
+ ...pcStyles.flex,
176
+ width: '100%',
177
+ ...pcStyles.itemsCenter,
178
+ ...pcStyles.justifyCenter,
179
+ }}>
180
+ <Footer />
181
+ </div>
182
+ </div>
183
+ </div>
184
+ </div>
185
+ </div>
186
+ </main>
187
+ <style>{`
188
+ /* Layout sizing is driven by a single sidebar offset variable.
189
+ This prevents overlap when zoom changes effective breakpoints. */
190
+ .pc-content-wrapper {
191
+ --pc-sidebar-offset: 0px;
192
+ margin-left: var(--pc-sidebar-offset) !important;
193
+ width: calc(100% - var(--pc-sidebar-offset)) !important;
194
+ min-width: 0 !important;
195
+ transition: margin-left 0.3s ease, width 0.3s ease !important;
196
+ }
197
+
198
+ .pc-navbar {
199
+ --pc-navbar-padding-left: 0.75rem;
200
+ --pc-navbar-padding-right: 0.75rem;
201
+ --pc-navbar-padding-top: 0.625rem;
202
+ --pc-navbar-padding-bottom: 0.625rem;
203
+ left: var(--pc-sidebar-offset) !important;
204
+ width: calc(100% - var(--pc-sidebar-offset)) !important;
205
+ transition: left 0.3s ease, width 0.3s ease !important;
206
+ }
207
+
208
+ .pc-content-container {
209
+ --pc-content-padding-left: 0.75rem;
210
+ --pc-content-padding-right: 0.75rem;
211
+ --pc-content-padding-top: 4rem;
212
+ }
213
+
214
+ .pc-navbar-page-meta {
215
+ min-width: 0;
216
+ max-width: 100%;
217
+ padding-right: 0.5rem;
218
+ }
219
+
220
+ .pc-navbar-title,
221
+ .pc-navbar-description {
222
+ overflow: hidden;
223
+ text-overflow: ellipsis;
224
+ white-space: nowrap;
225
+ }
226
+
227
+ /* Medium screens (768px+): Sidebar visible, collapsed by default */
228
+ @media (min-width: 768px) {
229
+ .pc-sidebar ~ .pc-content-wrapper {
230
+ --pc-sidebar-offset: var(--pc-sidebar-collapsed-width, 80px);
231
+ }
232
+ .pc-sidebar:not(.pc-sidebar-collapsed) ~ .pc-content-wrapper {
233
+ --pc-sidebar-offset: var(--pc-sidebar-expanded-width, 300px);
234
+ }
235
+ }
236
+
237
+ /* 2XL screens (1536px+): Sidebar expands to 320px in injected styles */
238
+ @media (min-width: 1536px) {
239
+ .pc-sidebar:not(.pc-sidebar-collapsed) ~ .pc-content-wrapper {
240
+ --pc-sidebar-offset: var(--pc-sidebar-expanded-width-2xl, 320px);
241
+ }
242
+ }
243
+
244
+ /* Responsive padding for navbar */
245
+ @media (max-width: 767px) {
246
+ .pc-navbar {
247
+ --pc-navbar-padding-left: 3.75rem;
248
+ --pc-navbar-padding-right: 0.75rem;
249
+ --pc-navbar-padding-top: 0.625rem;
250
+ --pc-navbar-padding-bottom: 0.625rem;
251
+ }
252
+ .pc-navbar-description {
253
+ display: none;
254
+ }
255
+ .pc-navbar-page-meta {
256
+ max-width: calc(100% - 8.25rem);
257
+ padding-right: 0.25rem;
258
+ }
259
+ .pc-navbar-actions {
260
+ gap: 0.375rem;
261
+ }
262
+ .pc-content-container {
263
+ --pc-content-padding-top: 4rem;
264
+ }
265
+ }
266
+ @media (min-width: 768px) {
267
+ .pc-navbar {
268
+ --pc-navbar-padding-left: 1rem;
269
+ --pc-navbar-padding-right: 1rem;
270
+ --pc-navbar-padding-top: 0.75rem;
271
+ --pc-navbar-padding-bottom: 0.75rem;
272
+ }
273
+ .pc-navbar-description {
274
+ display: block;
275
+ }
276
+ .pc-content-container {
277
+ --pc-content-padding-top: 4.5rem;
278
+ }
279
+ }
280
+ @media (min-width: 768px) {
281
+ .pc-navbar-title {
282
+ font-size: 1.0625rem;
283
+ }
284
+ .pc-navbar-description {
285
+ font-size: 0.8125rem;
286
+ }
287
+ .pc-content-container {
288
+ --pc-content-padding-left: 1.25rem;
289
+ --pc-content-padding-right: 1.25rem;
290
+ --pc-content-padding-top: 4.5rem;
291
+ }
292
+ }
293
+ @media (min-width: 1024px) {
294
+ .pc-content-container {
295
+ --pc-content-padding-left: 1.5rem;
296
+ --pc-content-padding-right: 1.5rem;
297
+ --pc-content-padding-top: 4.75rem;
298
+ }
299
+ }
300
+ `}</style>
301
+ </Suspense>
302
+ </LocaleContext.Provider>
303
+ );
304
+ }
@@ -0,0 +1,232 @@
1
+ import character from '../assets/character.svg';
2
+ import greenTick from '../assets/greenTick.svg';
3
+ import sentImg from '../assets/sentImg.svg';
4
+ import { useTranslation } from 'react-i18next';
5
+ import { PCButton, PCText } from '../ui';
6
+ import { pcStyles } from '../styles/pcStyles';
7
+ import type { RequestSubmitProps } from './types';
8
+ import { Mail } from 'lucide-react';
9
+
10
+ const getVar = (varName: string): string => `var(${varName})`;
11
+
12
+ export default function RequestSubmit({
13
+ caseId,
14
+ contact,
15
+ onCreateRequest,
16
+ revokeConsentOnFulfilment,
17
+ revokedPurposeNames,
18
+ }: RequestSubmitProps) {
19
+ const { t } = useTranslation();
20
+ return (
21
+ <div style={{ marginTop: pcStyles.mtMd.marginTop, position: 'relative' }}>
22
+ <img
23
+ src={sentImg}
24
+ alt="sent"
25
+ className="pc-hidden-xs"
26
+ style={{
27
+ position: 'absolute',
28
+ right: '0.75rem',
29
+ top: '0.75rem',
30
+ height: '3rem',
31
+ width: '3rem',
32
+ opacity: 0.65,
33
+ filter: 'brightness(0) saturate(100%) invert(var(--pc-icon-filter, 0))',
34
+ }}
35
+ />
36
+ <div style={{
37
+ ...pcStyles.card,
38
+ borderRadius: pcStyles.borderRadiusXl,
39
+ padding: pcStyles.pLg.padding,
40
+ position: 'relative',
41
+ ...pcStyles.bgPrimary,
42
+ border: `1px solid ${pcStyles.borderColor}`,
43
+ }} className="pc-padding-responsive">
44
+ <div style={{
45
+ ...pcStyles.flex,
46
+ ...pcStyles.flexCol,
47
+ ...pcStyles.itemsStart,
48
+ ...pcStyles.gapMd,
49
+ }} className="pc-flex-responsive">
50
+ <div style={{
51
+ ...pcStyles.flex,
52
+ ...pcStyles.itemsStart,
53
+ ...pcStyles.gapMd,
54
+ width: '100%',
55
+ }}>
56
+ <div style={{
57
+ height: '2.5rem',
58
+ width: '2.5rem',
59
+ flexShrink: 0,
60
+ display: 'flex',
61
+ alignItems: 'center',
62
+ justifyContent: 'center',
63
+ borderRadius: '50%',
64
+ backgroundColor: `${getVar('--pc-success')}33`,
65
+ padding: '0.375rem',
66
+ }}>
67
+ <img
68
+ src={greenTick}
69
+ alt="success"
70
+ style={{
71
+ height: '1.5rem',
72
+ width: '1.5rem',
73
+ }}
74
+ />
75
+ </div>
76
+ <div style={{ minWidth: 0, flex: 1 }}>
77
+ <PCText
78
+ size="base"
79
+ weight="semibold"
80
+ style={{
81
+ marginBottom: pcStyles.mbXs.marginBottom,
82
+ }}
83
+ className="pc-text-responsive"
84
+ >
85
+ {t('requestSubmittedSuccessfully')}
86
+ </PCText>
87
+ <PCText
88
+ size="sm"
89
+ weight="medium"
90
+ color="secondary"
91
+ style={{
92
+ marginBottom: pcStyles.mbMd.marginBottom,
93
+ }}
94
+ >
95
+ {t('thankYouForSubmittingYourRequest')}.
96
+ </PCText>
97
+ <div style={{
98
+ marginTop: pcStyles.mtMd.marginTop,
99
+ padding: pcStyles.pSm.padding,
100
+ ...pcStyles.bgSecondary,
101
+ borderRadius: pcStyles.borderRadiusMd,
102
+ border: `1px solid ${pcStyles.borderColor}`,
103
+ }}>
104
+ <PCText
105
+ size="base"
106
+ weight="bold"
107
+ style={{
108
+ color: pcStyles.primary,
109
+ wordBreak: 'break-word',
110
+ marginBottom: pcStyles.mbXs.marginBottom,
111
+ }}
112
+ className="pc-text-responsive"
113
+ >
114
+ {t('caseID')}: {caseId}
115
+ </PCText>
116
+ <PCText
117
+ size="xs"
118
+ weight="medium"
119
+ color="secondary"
120
+ >
121
+ {t('saveThisID')}.
122
+ </PCText>
123
+ </div>
124
+ <div style={{
125
+ ...pcStyles.flex,
126
+ ...pcStyles.itemsStart,
127
+ ...pcStyles.gapSm,
128
+ marginTop: pcStyles.mtMd.marginTop,
129
+ padding: '0.5rem 0.625rem',
130
+ ...pcStyles.bgSecondary,
131
+ borderRadius: pcStyles.borderRadiusMd,
132
+ }}>
133
+ <Mail
134
+ size={16}
135
+ style={{
136
+ flexShrink: 0,
137
+ color: getVar('--pc-text-secondary'),
138
+ marginTop: '2px',
139
+ }}
140
+ />
141
+ <PCText
142
+ size="xs"
143
+ weight="medium"
144
+ color="secondary"
145
+ style={{
146
+ wordBreak: 'break-word',
147
+ }}
148
+ >
149
+ {t('confirmationSentTo')}: {contact}
150
+ </PCText>
151
+ </div>
152
+ <PCText
153
+ size="xs"
154
+ weight="medium"
155
+ color="secondary"
156
+ style={{
157
+ marginTop: pcStyles.mtMd.marginTop,
158
+ }}
159
+ >
160
+ {t('processRequest')}.
161
+ </PCText>
162
+ {revokeConsentOnFulfilment && (
163
+ <div className="pc-request-submit-revoke-notice">
164
+ <PCText
165
+ size="xs"
166
+ weight="medium"
167
+ className="pc-request-submit-revoke-notice-text"
168
+ >
169
+ {t('erasureConsentRevokeNotice', {
170
+ purposes: revokedPurposeNames,
171
+ })}
172
+ </PCText>
173
+ </div>
174
+ )}
175
+ </div>
176
+ </div>
177
+ <div className="pc-hidden-xs pc-block-md" style={{ width: '100%' }}>
178
+ <img
179
+ src={character}
180
+ alt="character"
181
+ style={{
182
+ margin: '0 auto',
183
+ height: '6rem',
184
+ width: '6rem',
185
+ display: 'block',
186
+ filter: 'brightness(0) saturate(100%) invert(var(--pc-icon-filter, 0))',
187
+ opacity: 0.9,
188
+ }}
189
+ />
190
+ <div style={{
191
+ marginTop: pcStyles.mtMd.marginTop,
192
+ ...pcStyles.flex,
193
+ ...pcStyles.justifyCenter
194
+ }}>
195
+ <PCButton
196
+ variant="primary"
197
+ size="sm"
198
+ onClick={onCreateRequest}
199
+ className="pc-w-full-mobile"
200
+ >
201
+ {t('backToHome')}
202
+ </PCButton>
203
+ </div>
204
+ </div>
205
+ </div>
206
+ <div className="pc-block-xs pc-hidden-md" style={{ marginTop: pcStyles.mtMd.marginTop }}>
207
+ <div style={{ ...pcStyles.flex, ...pcStyles.justifyCenter }}>
208
+ <PCButton
209
+ variant="primary"
210
+ size="sm"
211
+ onClick={onCreateRequest}
212
+ style={{ width: '100%' }}
213
+ >
214
+ {t('backToHome')}
215
+ </PCButton>
216
+ </div>
217
+ </div>
218
+ </div>
219
+ <PCText
220
+ size="xs"
221
+ weight="medium"
222
+ color="tertiary"
223
+ style={{
224
+ marginTop: pcStyles.mtLg.marginTop,
225
+ textAlign: 'center',
226
+ }}
227
+ >
228
+ {t('yourDataIsSafeWithUs')}.
229
+ </PCText>
230
+ </div>
231
+ );
232
+ }