@tantainnovative/ndpr-toolkit 1.0.5 → 1.0.6
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/README.md +447 -84
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +35 -0
- package/package.json +52 -70
- package/CHANGELOG.md +0 -16
- package/CNAME +0 -1
- package/CONTRIBUTING.md +0 -87
- package/RELEASE-NOTES-v1.0.0.md +0 -140
- package/RELEASE-NOTES-v1.0.1.md +0 -69
- package/SECURITY.md +0 -21
- package/components.json +0 -21
- package/eslint.config.mjs +0 -16
- package/next-env.d.ts +0 -5
- package/next.config.js +0 -15
- package/next.config.ts +0 -62
- package/packages/ndpr-toolkit/README.md +0 -467
- package/packages/ndpr-toolkit/dist/index.esm.js +0 -2
- package/packages/ndpr-toolkit/dist/index.esm.js.map +0 -1
- package/packages/ndpr-toolkit/dist/index.js +0 -2
- package/packages/ndpr-toolkit/dist/index.js.map +0 -1
- package/packages/ndpr-toolkit/package-lock.json +0 -8197
- package/packages/ndpr-toolkit/package.json +0 -71
- package/packages/ndpr-toolkit/rollup.config.js +0 -34
- package/packages/ndpr-toolkit/src/components/breach/BreachNotificationManager.tsx +0 -701
- package/packages/ndpr-toolkit/src/components/breach/BreachReportForm.tsx +0 -631
- package/packages/ndpr-toolkit/src/components/breach/BreachRiskAssessment.tsx +0 -569
- package/packages/ndpr-toolkit/src/components/breach/RegulatoryReportGenerator.tsx +0 -496
- package/packages/ndpr-toolkit/src/components/consent/ConsentBanner.tsx +0 -270
- package/packages/ndpr-toolkit/src/components/consent/ConsentManager.tsx +0 -217
- package/packages/ndpr-toolkit/src/components/consent/ConsentStorage.tsx +0 -206
- package/packages/ndpr-toolkit/src/components/dpia/DPIAQuestionnaire.tsx +0 -342
- package/packages/ndpr-toolkit/src/components/dpia/DPIAReport.tsx +0 -373
- package/packages/ndpr-toolkit/src/components/dpia/StepIndicator.tsx +0 -174
- package/packages/ndpr-toolkit/src/components/dsr/DSRDashboard.tsx +0 -717
- package/packages/ndpr-toolkit/src/components/dsr/DSRRequestForm.tsx +0 -476
- package/packages/ndpr-toolkit/src/components/dsr/DSRTracker.tsx +0 -620
- package/packages/ndpr-toolkit/src/components/policy/PolicyExporter.tsx +0 -541
- package/packages/ndpr-toolkit/src/components/policy/PolicyGenerator.tsx +0 -454
- package/packages/ndpr-toolkit/src/components/policy/PolicyPreview.tsx +0 -333
- package/packages/ndpr-toolkit/src/hooks/useBreach.ts +0 -409
- package/packages/ndpr-toolkit/src/hooks/useConsent.ts +0 -263
- package/packages/ndpr-toolkit/src/hooks/useDPIA.ts +0 -457
- package/packages/ndpr-toolkit/src/hooks/useDSR.ts +0 -236
- package/packages/ndpr-toolkit/src/hooks/usePrivacyPolicy.ts +0 -428
- package/packages/ndpr-toolkit/src/index.ts +0 -44
- package/packages/ndpr-toolkit/src/setupTests.ts +0 -5
- package/packages/ndpr-toolkit/src/types/breach.ts +0 -283
- package/packages/ndpr-toolkit/src/types/consent.ts +0 -111
- package/packages/ndpr-toolkit/src/types/dpia.ts +0 -236
- package/packages/ndpr-toolkit/src/types/dsr.ts +0 -192
- package/packages/ndpr-toolkit/src/types/index.ts +0 -42
- package/packages/ndpr-toolkit/src/types/privacy.ts +0 -246
- package/packages/ndpr-toolkit/src/utils/breach.ts +0 -122
- package/packages/ndpr-toolkit/src/utils/consent.ts +0 -51
- package/packages/ndpr-toolkit/src/utils/dpia.ts +0 -104
- package/packages/ndpr-toolkit/src/utils/dsr.ts +0 -77
- package/packages/ndpr-toolkit/src/utils/privacy.ts +0 -100
- package/packages/ndpr-toolkit/tsconfig.json +0 -23
- package/postcss.config.mjs +0 -5
- package/public/NDPR TOOLKIT.svg +0 -1
- package/public/favicon/android-chrome-192x192.png +0 -0
- package/public/favicon/android-chrome-512x512.png +0 -0
- package/public/favicon/apple-touch-icon.png +0 -0
- package/public/favicon/favicon-16x16.png +0 -0
- package/public/favicon/favicon-32x32.png +0 -0
- package/public/favicon/site.webmanifest +0 -1
- package/public/file.svg +0 -1
- package/public/globe.svg +0 -1
- package/public/ndpr-toolkit-logo.svg +0 -108
- package/public/next.svg +0 -1
- package/public/vercel.svg +0 -1
- package/public/window.svg +0 -1
- package/src/app/accessibility.css +0 -70
- package/src/app/favicon.ico +0 -0
- package/src/app/globals.css +0 -123
- package/src/app/layout.tsx +0 -37
- package/src/app/ndpr-demos/breach/page.tsx +0 -354
- package/src/app/ndpr-demos/consent/page.tsx +0 -366
- package/src/app/ndpr-demos/dpia/page.tsx +0 -495
- package/src/app/ndpr-demos/dsr/page.tsx +0 -280
- package/src/app/ndpr-demos/page.tsx +0 -73
- package/src/app/ndpr-demos/policy/page.tsx +0 -771
- package/src/app/page.tsx +0 -452
- package/src/components/ErrorBoundary.tsx +0 -90
- package/src/components/breach-notification/BreachNotificationForm.tsx +0 -479
- package/src/components/consent/ConsentBanner.tsx +0 -193
- package/src/components/data-subject-rights/DataSubjectRequestForm.tsx +0 -530
- package/src/components/dpia/DPIAQuestionnaire.tsx +0 -523
- package/src/components/privacy-policy/PolicyGenerator.tsx +0 -1062
- package/src/components/privacy-policy/data.ts +0 -98
- package/src/components/privacy-policy/shared/CheckboxField.tsx +0 -38
- package/src/components/privacy-policy/shared/CheckboxGroup.tsx +0 -85
- package/src/components/privacy-policy/shared/FormField.tsx +0 -79
- package/src/components/privacy-policy/shared/StepIndicator.tsx +0 -86
- package/src/components/privacy-policy/steps/CustomSectionsStep.tsx +0 -361
- package/src/components/privacy-policy/steps/DataCollectionStep.tsx +0 -231
- package/src/components/privacy-policy/steps/DataSharingStep.tsx +0 -418
- package/src/components/privacy-policy/steps/OrganizationInfoStep.tsx +0 -202
- package/src/components/privacy-policy/steps/PolicyPreviewStep.tsx +0 -226
- package/src/components/ui/Badge.tsx +0 -46
- package/src/components/ui/Button.tsx +0 -59
- package/src/components/ui/Card.tsx +0 -92
- package/src/components/ui/Checkbox.tsx +0 -57
- package/src/components/ui/FormField.tsx +0 -50
- package/src/components/ui/Input.tsx +0 -38
- package/src/components/ui/Loading.tsx +0 -201
- package/src/components/ui/Select.tsx +0 -42
- package/src/components/ui/TextArea.tsx +0 -38
- package/src/components/ui/label.tsx +0 -24
- package/src/components/ui/switch.tsx +0 -31
- package/src/components/ui/tabs.tsx +0 -66
- package/src/hooks/useConsent.ts +0 -70
- package/src/hooks/useLoadingState.ts +0 -85
- package/src/lib/consentService.ts +0 -144
- package/src/lib/dpiaQuestions.ts +0 -188
- package/src/lib/requestService.ts +0 -79
- package/src/lib/sanitize.ts +0 -108
- package/src/lib/storage.ts +0 -222
- package/src/lib/utils.ts +0 -6
- package/src/types/html-to-docx.d.ts +0 -30
- package/src/types/index.ts +0 -77
- package/tailwind.config.ts +0 -65
- package/tsconfig.json +0 -41
- /package/{packages/ndpr-toolkit/dist → dist}/components/breach/BreachNotificationManager.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/components/breach/BreachReportForm.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/components/breach/BreachRiskAssessment.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/components/breach/RegulatoryReportGenerator.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/components/consent/ConsentBanner.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/components/consent/ConsentManager.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/components/consent/ConsentStorage.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/components/dpia/DPIAQuestionnaire.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/components/dpia/DPIAReport.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/components/dpia/StepIndicator.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/components/dsr/DSRDashboard.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/components/dsr/DSRRequestForm.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/components/dsr/DSRTracker.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/components/policy/PolicyExporter.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/components/policy/PolicyGenerator.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/components/policy/PolicyPreview.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/hooks/useBreach.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/hooks/useConsent.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/hooks/useDPIA.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/hooks/useDSR.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/hooks/usePrivacyPolicy.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/index.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/setupTests.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/types/breach.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/types/consent.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/types/dpia.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/types/dsr.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/types/privacy.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/utils/breach.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/utils/consent.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/utils/dpia.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/utils/dsr.d.ts +0 -0
- /package/{packages/ndpr-toolkit/dist → dist}/utils/privacy.d.ts +0 -0
|
@@ -1,428 +0,0 @@
|
|
|
1
|
-
import { useState, useEffect } from 'react';
|
|
2
|
-
import { PolicySection, PolicyTemplate, OrganizationInfo, PrivacyPolicy } from '../types/privacy';
|
|
3
|
-
import { generatePolicyText } from '../utils/privacy';
|
|
4
|
-
|
|
5
|
-
interface UsePrivacyPolicyOptions {
|
|
6
|
-
/**
|
|
7
|
-
* Available policy templates
|
|
8
|
-
*/
|
|
9
|
-
templates: PolicyTemplate[];
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Initial policy data (if editing an existing policy)
|
|
13
|
-
*/
|
|
14
|
-
initialPolicy?: PrivacyPolicy;
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Storage key for policy data
|
|
18
|
-
* @default "ndpr_privacy_policy"
|
|
19
|
-
*/
|
|
20
|
-
storageKey?: string;
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Whether to use local storage to persist policy data
|
|
24
|
-
* @default true
|
|
25
|
-
*/
|
|
26
|
-
useLocalStorage?: boolean;
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Callback function called when a policy is generated
|
|
30
|
-
*/
|
|
31
|
-
onGenerate?: (policy: PrivacyPolicy) => void;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
interface UsePrivacyPolicyReturn {
|
|
35
|
-
/**
|
|
36
|
-
* Current policy data
|
|
37
|
-
*/
|
|
38
|
-
policy: PrivacyPolicy | null;
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Selected template
|
|
42
|
-
*/
|
|
43
|
-
selectedTemplate: PolicyTemplate | null;
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Organization information
|
|
47
|
-
*/
|
|
48
|
-
organizationInfo: OrganizationInfo;
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Select a template
|
|
52
|
-
*/
|
|
53
|
-
selectTemplate: (templateId: string) => boolean;
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Update organization information
|
|
57
|
-
*/
|
|
58
|
-
updateOrganizationInfo: (updates: Partial<OrganizationInfo>) => void;
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Toggle whether a section is included in the policy
|
|
62
|
-
*/
|
|
63
|
-
toggleSection: (sectionId: string, included: boolean) => void;
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Update section content
|
|
67
|
-
*/
|
|
68
|
-
updateSectionContent: (sectionId: string, content: string) => void;
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Update variable values
|
|
72
|
-
*/
|
|
73
|
-
updateVariableValue: (variable: string, value: string) => void;
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Generate the policy
|
|
77
|
-
*/
|
|
78
|
-
generatePolicy: () => PrivacyPolicy;
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Get the generated policy text
|
|
82
|
-
*/
|
|
83
|
-
getPolicyText: () => {
|
|
84
|
-
fullText: string;
|
|
85
|
-
sectionTexts: Record<string, string>;
|
|
86
|
-
missingVariables: string[];
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Reset the policy
|
|
91
|
-
*/
|
|
92
|
-
resetPolicy: () => void;
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Check if the policy is valid
|
|
96
|
-
*/
|
|
97
|
-
isValid: () => {
|
|
98
|
-
valid: boolean;
|
|
99
|
-
errors: string[];
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Hook for generating NDPR-compliant privacy policies
|
|
105
|
-
*/
|
|
106
|
-
export function usePrivacyPolicy({
|
|
107
|
-
templates,
|
|
108
|
-
initialPolicy,
|
|
109
|
-
storageKey = "ndpr_privacy_policy",
|
|
110
|
-
useLocalStorage = true,
|
|
111
|
-
onGenerate
|
|
112
|
-
}: UsePrivacyPolicyOptions): UsePrivacyPolicyReturn {
|
|
113
|
-
const [policy, setPolicy] = useState<PrivacyPolicy | null>(initialPolicy || null);
|
|
114
|
-
const [selectedTemplate, setSelectedTemplate] = useState<PolicyTemplate | null>(null);
|
|
115
|
-
const [organizationInfo, setOrganizationInfo] = useState<OrganizationInfo>({
|
|
116
|
-
name: '',
|
|
117
|
-
website: '',
|
|
118
|
-
privacyEmail: '',
|
|
119
|
-
address: '',
|
|
120
|
-
privacyPhone: '',
|
|
121
|
-
dpoName: '',
|
|
122
|
-
dpoEmail: '',
|
|
123
|
-
industry: ''
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
// Load policy data from storage on mount
|
|
127
|
-
useEffect(() => {
|
|
128
|
-
if (useLocalStorage && typeof window !== 'undefined' && !initialPolicy) {
|
|
129
|
-
try {
|
|
130
|
-
const savedData = localStorage.getItem(storageKey);
|
|
131
|
-
if (savedData) {
|
|
132
|
-
const { policy, template, organizationInfo } = JSON.parse(savedData);
|
|
133
|
-
|
|
134
|
-
if (policy) {
|
|
135
|
-
setPolicy(policy);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
if (template) {
|
|
139
|
-
const foundTemplate = templates.find(t => t.id === template.id);
|
|
140
|
-
if (foundTemplate) {
|
|
141
|
-
setSelectedTemplate(foundTemplate);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
if (organizationInfo) {
|
|
146
|
-
setOrganizationInfo(organizationInfo);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
} catch (error) {
|
|
150
|
-
console.error('Error loading privacy policy data:', error);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}, [storageKey, useLocalStorage, initialPolicy, templates]);
|
|
154
|
-
|
|
155
|
-
// Save policy data to storage when it changes
|
|
156
|
-
useEffect(() => {
|
|
157
|
-
if (useLocalStorage && typeof window !== 'undefined') {
|
|
158
|
-
try {
|
|
159
|
-
localStorage.setItem(storageKey, JSON.stringify({
|
|
160
|
-
policy,
|
|
161
|
-
template: selectedTemplate,
|
|
162
|
-
organizationInfo
|
|
163
|
-
}));
|
|
164
|
-
} catch (error) {
|
|
165
|
-
console.error('Error saving privacy policy data:', error);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}, [policy, selectedTemplate, organizationInfo, storageKey, useLocalStorage]);
|
|
169
|
-
|
|
170
|
-
// Select a template
|
|
171
|
-
const selectTemplate = (templateId: string): boolean => {
|
|
172
|
-
const template = templates.find(t => t.id === templateId);
|
|
173
|
-
|
|
174
|
-
if (!template) {
|
|
175
|
-
return false;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
setSelectedTemplate(template);
|
|
179
|
-
|
|
180
|
-
// Initialize sections from the template
|
|
181
|
-
const sections = template.sections.map(section => ({
|
|
182
|
-
...section,
|
|
183
|
-
customContent: undefined
|
|
184
|
-
}));
|
|
185
|
-
|
|
186
|
-
// Initialize variable values
|
|
187
|
-
const variableValues: Record<string, string> = {};
|
|
188
|
-
Object.keys(template.variables).forEach(variable => {
|
|
189
|
-
variableValues[variable] = template.variables[variable].defaultValue || '';
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
return true;
|
|
193
|
-
};
|
|
194
|
-
|
|
195
|
-
// Update organization information
|
|
196
|
-
const updateOrganizationInfo = (updates: Partial<OrganizationInfo>) => {
|
|
197
|
-
setOrganizationInfo(prev => ({
|
|
198
|
-
...prev,
|
|
199
|
-
...updates
|
|
200
|
-
}));
|
|
201
|
-
};
|
|
202
|
-
|
|
203
|
-
// Toggle whether a section is included in the policy
|
|
204
|
-
const toggleSection = (sectionId: string, included: boolean) => {
|
|
205
|
-
if (!selectedTemplate) {
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
if (policy) {
|
|
210
|
-
setPolicy(prev => {
|
|
211
|
-
if (!prev) return prev;
|
|
212
|
-
|
|
213
|
-
return {
|
|
214
|
-
...prev,
|
|
215
|
-
sections: prev.sections.map(section =>
|
|
216
|
-
section.id === sectionId ? { ...section, included } : section
|
|
217
|
-
)
|
|
218
|
-
};
|
|
219
|
-
});
|
|
220
|
-
} else {
|
|
221
|
-
// If no policy exists yet, update the template sections
|
|
222
|
-
setSelectedTemplate(prev => {
|
|
223
|
-
if (!prev) return prev;
|
|
224
|
-
|
|
225
|
-
return {
|
|
226
|
-
...prev,
|
|
227
|
-
sections: prev.sections.map(section =>
|
|
228
|
-
section.id === sectionId ? { ...section, included } : section
|
|
229
|
-
)
|
|
230
|
-
};
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
};
|
|
234
|
-
|
|
235
|
-
// Update section content
|
|
236
|
-
const updateSectionContent = (sectionId: string, content: string) => {
|
|
237
|
-
if (!selectedTemplate) {
|
|
238
|
-
return;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
if (policy) {
|
|
242
|
-
setPolicy(prev => {
|
|
243
|
-
if (!prev) return prev;
|
|
244
|
-
|
|
245
|
-
return {
|
|
246
|
-
...prev,
|
|
247
|
-
sections: prev.sections.map(section =>
|
|
248
|
-
section.id === sectionId ? { ...section, customContent: content } : section
|
|
249
|
-
)
|
|
250
|
-
};
|
|
251
|
-
});
|
|
252
|
-
} else {
|
|
253
|
-
// If no policy exists yet, update the template sections
|
|
254
|
-
setSelectedTemplate(prev => {
|
|
255
|
-
if (!prev) return prev;
|
|
256
|
-
|
|
257
|
-
return {
|
|
258
|
-
...prev,
|
|
259
|
-
sections: prev.sections.map(section =>
|
|
260
|
-
section.id === sectionId ? { ...section, customContent: content } : section
|
|
261
|
-
)
|
|
262
|
-
};
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
};
|
|
266
|
-
|
|
267
|
-
// Update variable values
|
|
268
|
-
const updateVariableValue = (variable: string, value: string) => {
|
|
269
|
-
if (!policy) {
|
|
270
|
-
return;
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
setPolicy(prev => {
|
|
274
|
-
if (!prev) return prev;
|
|
275
|
-
|
|
276
|
-
return {
|
|
277
|
-
...prev,
|
|
278
|
-
variableValues: {
|
|
279
|
-
...prev.variableValues,
|
|
280
|
-
[variable]: value
|
|
281
|
-
}
|
|
282
|
-
};
|
|
283
|
-
});
|
|
284
|
-
};
|
|
285
|
-
|
|
286
|
-
// Generate a unique ID
|
|
287
|
-
const generateId = (): string => {
|
|
288
|
-
return 'policy_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
|
|
289
|
-
};
|
|
290
|
-
|
|
291
|
-
// Generate the policy
|
|
292
|
-
const generatePolicy = (): PrivacyPolicy => {
|
|
293
|
-
if (!selectedTemplate) {
|
|
294
|
-
throw new Error('No template selected');
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
const now = Date.now();
|
|
298
|
-
|
|
299
|
-
const newPolicy: PrivacyPolicy = {
|
|
300
|
-
id: policy?.id || generateId(),
|
|
301
|
-
title: `Privacy Policy for ${organizationInfo.name}`,
|
|
302
|
-
templateId: selectedTemplate.id,
|
|
303
|
-
organizationInfo,
|
|
304
|
-
sections: selectedTemplate.sections.map(section => ({
|
|
305
|
-
...section,
|
|
306
|
-
customContent: policy?.sections.find(s => s.id === section.id)?.customContent
|
|
307
|
-
})),
|
|
308
|
-
variableValues: policy?.variableValues || {},
|
|
309
|
-
effectiveDate: now,
|
|
310
|
-
lastUpdated: now,
|
|
311
|
-
version: '1.0'
|
|
312
|
-
};
|
|
313
|
-
|
|
314
|
-
setPolicy(newPolicy);
|
|
315
|
-
|
|
316
|
-
if (onGenerate) {
|
|
317
|
-
onGenerate(newPolicy);
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
return newPolicy;
|
|
321
|
-
};
|
|
322
|
-
|
|
323
|
-
// Get the generated policy text
|
|
324
|
-
const getPolicyText = () => {
|
|
325
|
-
if (!policy) {
|
|
326
|
-
return {
|
|
327
|
-
fullText: '',
|
|
328
|
-
sectionTexts: {},
|
|
329
|
-
missingVariables: []
|
|
330
|
-
};
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
const result = generatePolicyText(policy.sections, policy.organizationInfo);
|
|
334
|
-
|
|
335
|
-
// Handle both string and object return types from generatePolicyText
|
|
336
|
-
if (typeof result === 'string') {
|
|
337
|
-
return {
|
|
338
|
-
fullText: result,
|
|
339
|
-
sectionTexts: { 'full': result },
|
|
340
|
-
missingVariables: []
|
|
341
|
-
};
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
return result;
|
|
345
|
-
};
|
|
346
|
-
|
|
347
|
-
// Reset the policy
|
|
348
|
-
const resetPolicy = () => {
|
|
349
|
-
setPolicy(null);
|
|
350
|
-
setSelectedTemplate(null);
|
|
351
|
-
setOrganizationInfo({
|
|
352
|
-
name: '',
|
|
353
|
-
website: '',
|
|
354
|
-
privacyEmail: '',
|
|
355
|
-
address: '',
|
|
356
|
-
privacyPhone: '',
|
|
357
|
-
dpoName: '',
|
|
358
|
-
dpoEmail: '',
|
|
359
|
-
industry: ''
|
|
360
|
-
});
|
|
361
|
-
|
|
362
|
-
if (useLocalStorage && typeof window !== 'undefined') {
|
|
363
|
-
localStorage.removeItem(storageKey);
|
|
364
|
-
}
|
|
365
|
-
};
|
|
366
|
-
|
|
367
|
-
// Check if the policy is valid
|
|
368
|
-
const isValid = () => {
|
|
369
|
-
const errors: string[] = [];
|
|
370
|
-
|
|
371
|
-
if (!selectedTemplate) {
|
|
372
|
-
errors.push('No template selected');
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
if (!organizationInfo.name) {
|
|
376
|
-
errors.push('Organization name is required');
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
if (!organizationInfo.website) {
|
|
380
|
-
errors.push('Organization website is required');
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
if (!organizationInfo.privacyEmail) {
|
|
384
|
-
errors.push('Privacy contact email is required');
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
// Check if all required sections are included
|
|
388
|
-
if (selectedTemplate) {
|
|
389
|
-
const requiredSections = selectedTemplate.sections.filter(section => section.required);
|
|
390
|
-
const includedSections = policy?.sections.filter(section => section.included) || [];
|
|
391
|
-
|
|
392
|
-
requiredSections.forEach(section => {
|
|
393
|
-
if (!includedSections.some(s => s.id === section.id)) {
|
|
394
|
-
errors.push(`Required section "${section.title}" must be included`);
|
|
395
|
-
}
|
|
396
|
-
});
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
// Check if all required variables have values
|
|
400
|
-
if (selectedTemplate && policy) {
|
|
401
|
-
Object.entries(selectedTemplate.variables).forEach(([variable, info]) => {
|
|
402
|
-
if (info.required && !policy.variableValues[variable]) {
|
|
403
|
-
errors.push(`Required variable "${info.name}" must have a value`);
|
|
404
|
-
}
|
|
405
|
-
});
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
return {
|
|
409
|
-
valid: errors.length === 0,
|
|
410
|
-
errors
|
|
411
|
-
};
|
|
412
|
-
};
|
|
413
|
-
|
|
414
|
-
return {
|
|
415
|
-
policy,
|
|
416
|
-
selectedTemplate,
|
|
417
|
-
organizationInfo,
|
|
418
|
-
selectTemplate,
|
|
419
|
-
updateOrganizationInfo,
|
|
420
|
-
toggleSection,
|
|
421
|
-
updateSectionContent,
|
|
422
|
-
updateVariableValue,
|
|
423
|
-
generatePolicy,
|
|
424
|
-
getPolicyText,
|
|
425
|
-
resetPolicy,
|
|
426
|
-
isValid
|
|
427
|
-
};
|
|
428
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
// Consent Management Components
|
|
2
|
-
export { ConsentBanner } from './components/consent/ConsentBanner';
|
|
3
|
-
export { ConsentManager } from './components/consent/ConsentManager';
|
|
4
|
-
export { ConsentStorage } from './components/consent/ConsentStorage';
|
|
5
|
-
export type { ConsentOption, ConsentSettings, ConsentStorageOptions } from './types/consent';
|
|
6
|
-
|
|
7
|
-
// Data Subject Rights Components
|
|
8
|
-
export { DSRRequestForm } from './components/dsr/DSRRequestForm';
|
|
9
|
-
export { DSRDashboard } from './components/dsr/DSRDashboard';
|
|
10
|
-
export { DSRTracker } from './components/dsr/DSRTracker';
|
|
11
|
-
export type { DSRRequest, RequestType, DSRStatus, DSRType, RequestStatus } from './types/dsr';
|
|
12
|
-
|
|
13
|
-
// DPIA Components
|
|
14
|
-
export { DPIAQuestionnaire } from './components/dpia/DPIAQuestionnaire';
|
|
15
|
-
export { DPIAReport } from './components/dpia/DPIAReport';
|
|
16
|
-
export { StepIndicator } from './components/dpia/StepIndicator';
|
|
17
|
-
export type { DPIAQuestion, DPIASection, DPIAResult } from './types/dpia';
|
|
18
|
-
|
|
19
|
-
// Breach Notification Components
|
|
20
|
-
export { BreachReportForm } from './components/breach/BreachReportForm';
|
|
21
|
-
export { BreachRiskAssessment } from './components/breach/BreachRiskAssessment';
|
|
22
|
-
export { BreachNotificationManager } from './components/breach/BreachNotificationManager';
|
|
23
|
-
export { RegulatoryReportGenerator } from './components/breach/RegulatoryReportGenerator';
|
|
24
|
-
export type { BreachReport, RiskAssessment, NotificationRequirement, RegulatoryNotification } from './types/breach';
|
|
25
|
-
|
|
26
|
-
// Privacy Policy Generator Components
|
|
27
|
-
export { PolicyGenerator } from './components/policy/PolicyGenerator';
|
|
28
|
-
export { PolicyPreview } from './components/policy/PolicyPreview';
|
|
29
|
-
export { PolicyExporter } from './components/policy/PolicyExporter';
|
|
30
|
-
export type { PolicySection, PolicyTemplate, PolicyVariable, OrganizationInfo, PrivacyPolicy } from './types/privacy';
|
|
31
|
-
|
|
32
|
-
// Utility Functions
|
|
33
|
-
export { validateConsent } from './utils/consent';
|
|
34
|
-
export { formatDSRRequest } from './utils/dsr';
|
|
35
|
-
export { assessDPIARisk } from './utils/dpia';
|
|
36
|
-
export { calculateBreachSeverity } from './utils/breach';
|
|
37
|
-
export { generatePolicyText } from './utils/privacy';
|
|
38
|
-
|
|
39
|
-
// Hooks
|
|
40
|
-
export { useConsent } from './hooks/useConsent';
|
|
41
|
-
export { useDSR } from './hooks/useDSR';
|
|
42
|
-
export { useDPIA } from './hooks/useDPIA';
|
|
43
|
-
export { useBreach } from './hooks/useBreach';
|
|
44
|
-
export { usePrivacyPolicy } from './hooks/usePrivacyPolicy';
|