From f749ea79039b5b6fec4c8ff96df98680269e1c8f Mon Sep 17 00:00:00 2001 From: Maxim Date: Tue, 10 Dec 2024 20:25:18 +0200 Subject: [PATCH] feat: privacy policy & impressum --- CONFIG.json | 67 ++++++++++++++++++++++++++++++++++++++++- src/app/contact/page.js | 41 +++++++++++++++++++++++++ src/app/privacy/page.js | 40 ++++++++++++++++++++++++ 3 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 src/app/privacy/page.js diff --git a/CONFIG.json b/CONFIG.json index 4b702db..37c7482 100644 --- a/CONFIG.json +++ b/CONFIG.json @@ -101,6 +101,15 @@ "route":"/contact", "email":"maxim@nextfight.net", "direct_contact":"Reach Me Directly", + "legal":{ + "enabled":true, + "name":"Maxim", + "address":"Vaitape - Bora Bora", + "email":"maxim@nextfight.net", + "phone":"911", + "tax_id":"Not Applicable", + "legal_disclaimer":"This is a personal portfolio website for informational purposes." + }, "social_links":[ { "name":"GitHub", @@ -120,7 +129,7 @@ ], "contact_form":{ "enabled":true, - "send_button": "Send Message", + "send_button":"Send Message", "success_message":"Message sent successfully!", "failure_message":"Failed to send message. Please try again.", "error_message":"An error occurred. Please try again.", @@ -145,6 +154,62 @@ } ] } + }, + "privacy":{ + "enabled":true, + "header":"Privacy Policy", + "route":"/privacy", + "content":{ + "contact_title": "Contact", + "contact": "maxim@netfight.net", + "introduction":"This portfolio website is designed with minimal data collection and maximum user privacy in mind.", + "sections":[ + { + "title":"Information Collection", + "description":"We collect the following types of information:", + "details":[ + "Name, email, and message content submitted through the contact form", + "IP address for rate limiting and security purposes", + "Potential tracking of client-side interactions for website functionality" + ] + }, + { + "title":"Data Processing and Storage", + "description":"Data collection and processing details:", + "details":[ + "Contact form submissions are processed in-memory and not permanently stored", + "IP addresses are temporarily tracked for rate limiting (maximum 30 minutes)", + "No persistent user data is saved or stored long-term" + ] + }, + { + "title":"Third-Party Services", + "description":"Potential data collection by third-party services:", + "details":[ + "Image hosting services (e.g., shields.io) may collect IP address during image requests", + "Standard browser and server logs may capture additional metadata" + ] + }, + { + "title":"Data Protection", + "description":"We implement the following protection measures:", + "details":[ + "Rate limiting to prevent abuse of contact form", + "Validation of submitted form data", + "No storage of sensitive personal information" + ] + }, + { + "title":"User Rights", + "description":"Users have the right to:", + "details":[ + "Request information about data collection", + "Request deletion of any potential stored information", + "Opt-out of non-essential data collection" + ] + } + ] + } } }, "card":{ diff --git a/src/app/contact/page.js b/src/app/contact/page.js index aafc33c..ec7728c 100644 --- a/src/app/contact/page.js +++ b/src/app/contact/page.js @@ -23,6 +23,8 @@ import { FaSpotify, FaXbox, FaFacebook, + FaMapMarkerAlt, + FaPhone, } from "react-icons/fa"; const SocialIcon = ({ name }) => { @@ -180,6 +182,45 @@ export default function Contact() { )} + {config.pages.contact.legal.enabled && ( +
+

+ Legal Disclosure +

+
+ {config.pages.contact.legal.name && ( +

+ + {config.pages.contact.legal.name} +

+ )} + {config.pages.contact.legal.address && ( +

+ + {config.pages.contact.legal.address} +

+ )} + {config.pages.contact.legal.email && ( +

+ + {config.pages.contact.legal.email} +

+ )} + {config.pages.contact.legal.phone && ( +

+ + {config.pages.contact.legal.phone} +

+ )} + {config.pages.contact.legal.legal_disclaimer && ( +

+ {config.pages.contact.legal.legal_disclaimer} +

+ )} +
+
+ )} +

{config.pages.contact.direct_contact} diff --git a/src/app/privacy/page.js b/src/app/privacy/page.js new file mode 100644 index 0000000..c8a9ca4 --- /dev/null +++ b/src/app/privacy/page.js @@ -0,0 +1,40 @@ +"use client"; + +import config from "/CONFIG.json"; + +export default function Privacy() { + const privacy = config.pages.privacy; + + return ( +
+

+ {privacy.header} +

+ +
+

{privacy.content.introduction}

+ + {privacy.content.sections.map((section, index) => ( +
+

{section.title}

+

{section.description}

+ {section.details && ( +
    + {section.details.map((detail, detailIndex) => ( +
  • {detail}
  • + ))} +
+ )} +
+ ))} + +
+

+ {privacy.content.contact_title} +

+

{privacy.content.contact}

+
+
+
+ ); +}