From cba06aa242eb4e7836d9555af2d1edc542a50350 Mon Sep 17 00:00:00 2001 From: Deepraj Date: Tue, 10 Dec 2024 16:51:30 +0530 Subject: [PATCH 1/2] feat: update ErrorPage, enhance user fetching logic, and improve post retrieval error handling --- .../Directory/UserDirectoryContent.tsx | 4 +- client/src/components/Posts/ShowPosts.tsx | 37 +++- client/src/components/Sidebar/Sidebar.tsx | 37 ++-- client/src/pages/ErrorPage.tsx | 5 - client/src/pages/Privacypolicy.tsx | 185 ++++++++++-------- client/src/pages/Profile.tsx | 36 ++-- server/api/handlers/posts/posts.py | 28 ++- 7 files changed, 194 insertions(+), 138 deletions(-) diff --git a/client/src/components/Directory/UserDirectoryContent.tsx b/client/src/components/Directory/UserDirectoryContent.tsx index a4069a5..7cb69aa 100644 --- a/client/src/components/Directory/UserDirectoryContent.tsx +++ b/client/src/components/Directory/UserDirectoryContent.tsx @@ -5,8 +5,10 @@ import { ScrollArea } from "@/components/ui/scroll-area" import { Card, CardContent } from "@/components/ui/card" import { groupUsersByFirstLetter, User } from './directoryUtils' +const backendUrl = import.meta.env.VITE_BACKEND_URL || 'http://localhost:5000'; + async function getUsers() { - const res = await fetch('http://127.0.0.1:5000/directory') + const res = await fetch(`${backendUrl}/directory`) if (!res.ok) { throw new Error('Failed to fetch users') } diff --git a/client/src/components/Posts/ShowPosts.tsx b/client/src/components/Posts/ShowPosts.tsx index d3d5ca3..959a72a 100644 --- a/client/src/components/Posts/ShowPosts.tsx +++ b/client/src/components/Posts/ShowPosts.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from 'react'; import axios from 'axios'; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; -import { ChevronUp, ChevronDown, MessageCircle, Send } from "lucide-react"; +import { ChevronUp, ChevronDown, MessageCircle, Send, Share } from "lucide-react"; import { AlertDialog, AlertDialogCancel, @@ -11,7 +11,7 @@ import { AlertDialogTrigger, } from "@/components/ui/alert-dialog"; import { Cross1Icon } from "@radix-ui/react-icons"; -import {toast} from 'sonner'; +import { toast } from 'sonner'; import { PostContext } from '../Sidebar/Sidebar'; const backendUrl = import.meta.env.VITE_BACKEND_URL || 'http://localhost:5000'; @@ -66,14 +66,14 @@ export default function ShowPosts() { ); if (response.status === 200) { - setPosts(prevPosts => - prevPosts.map(post => - post._id === postId + setPosts(prevPosts => + prevPosts.map(post => + post._id === postId ? { ...post, upvotes: voteType === 'upvote' ? post.upvotes + 1 : post.upvotes, downvotes: voteType === 'downvote' ? post.downvotes + 1 : post.downvotes - } + } : post ) ); @@ -120,6 +120,19 @@ export default function ShowPosts() { }); }; + const handleCopyUrl = (postId: string) => { + const url = `https://devhub.page/post/${postId}`; + navigator.clipboard + .writeText(url) + .then(() => { + toast.success('URL copied to clipboard'); + }) + .catch(err => { + console.error('Failed to copy URL:', err); + toast.error('Failed to copy URL'); + }); + }; + useEffect(() => { }, [posts, selectedPost]); // This will re-run whenever `posts` or `selectedPost` changes @@ -128,7 +141,7 @@ export default function ShowPosts() {
{posts.map((post) => (
-
+
@@ -138,12 +151,18 @@ export default function ShowPosts() { Posted {new Date(post.created_at).toLocaleDateString()}

+
+
+ +
{post.image_link && ( Post image )}
@@ -243,6 +262,6 @@ export default function ShowPosts() { ))}
- + ); } diff --git a/client/src/components/Sidebar/Sidebar.tsx b/client/src/components/Sidebar/Sidebar.tsx index 23a8066..d946b3d 100644 --- a/client/src/components/Sidebar/Sidebar.tsx +++ b/client/src/components/Sidebar/Sidebar.tsx @@ -108,6 +108,12 @@ export function SidebarLeft({ ...props }: React.ComponentProps) } }; + const handleSettingsClick = () => { + if (!username) { + toast.error('Please login to access settings'); + } + }; + return ( @@ -276,9 +282,9 @@ export function SidebarLeft({ ...props }: React.ComponentProps) - - - + + +
Settings @@ -286,20 +292,21 @@ export function SidebarLeft({ ...props }: React.ComponentProps) - -
- - Settings - -
- - - -
- -
+ {username && ( + +
+ Settings +
+ + + +
+ +
+ )} + diff --git a/client/src/pages/ErrorPage.tsx b/client/src/pages/ErrorPage.tsx index b717535..c53fc08 100644 --- a/client/src/pages/ErrorPage.tsx +++ b/client/src/pages/ErrorPage.tsx @@ -18,11 +18,6 @@ const ErrorPage = () => { Go back home -
diff --git a/client/src/pages/Privacypolicy.tsx b/client/src/pages/Privacypolicy.tsx index c2fd99c..67e594c 100644 --- a/client/src/pages/Privacypolicy.tsx +++ b/client/src/pages/Privacypolicy.tsx @@ -1,97 +1,114 @@ -import { ScrollArea } from "@/components/ui/scroll-area" - -export default function PrivacyPolicy() { - const lastUpdated = "October 24, 2024" +import { + SidebarInset, + SidebarProvider, + SidebarTrigger, +} from "@/components/ui/sidebar" +import { SidebarLeft } from '@/components/Sidebar/Sidebar' +const PrivacyPolicy = () => { return ( -
-
-

Devhub Privacy Policy

-

Last updated: {lastUpdated}

- - -
-
-

Introduction

-

Welcome to Devhub. We value your privacy and are committed to protecting the personal information you share with us. This Privacy Policy explains how we collect, use, and safeguard your data when you visit our website or interact with our services.

-
+ + + +
+
+ +
+
+
+
+
+
+

Devhub Privacy Policy

+

Last updated: 10-Dec-2024

+
+
+

Introduction

+

Welcome to Devhub. We value your privacy and are committed to protecting the personal information you share with us. This Privacy Policy explains how we collect, use, and safeguard your data when you visit our website or interact with our services.

+
-
-

Information We Collect

-

Personal Data

-

When you visit our site, we may collect personal information such as:

-
    -
  • Name
  • -
  • Email address
  • -
  • Contact information
  • -
  • Any other information you voluntarily provide via contact forms or user profiles
  • -
-

Usage Data

-

We may also collect non-personal information automatically when you interact with our website, such as:

-
    -
  • IP address
  • -
  • Browser type and version
  • -
  • Pages visited
  • -
  • Time and date of your visit
  • -
  • Referring websites
  • -
-
+
+

Information We Collect

+

Personal Data

+

When you visit our site, we may collect personal information such as:

+
    +
  • Name
  • +
  • Email address
  • +
  • Contact information
  • +
  • Any other information you voluntarily provide via contact forms or user profiles
  • +
+

Usage Data

+

We may also collect non-personal information automatically when you interact with our website, such as:

+
    +
  • IP address
  • +
  • Browser type and version
  • +
  • Pages visited
  • +
  • Time and date of your visit
  • +
  • Referring websites
  • +
+
-
-

How We Use Your Information

-

We may use the information collected in the following ways:

-
    -
  • To provide, operate, and maintain our website
  • -
  • To improve and personalize user experience
  • -
  • To understand and analyze how users interact with our site
  • -
  • To communicate with you, either directly or through one of our partners, including for customer service and updates
  • -
  • To comply with legal obligations or protect your rights
  • -
-
+
+

How We Use Your Information

+

We may use the information collected in the following ways:

+
    +
  • To provide, operate, and maintain our website
  • +
  • To improve and personalize user experience
  • +
  • To understand and analyze how users interact with our site
  • +
  • To communicate with you, either directly or through one of our partners, including for customer service and updates
  • +
  • To comply with legal obligations or protect your rights
  • +
+
-
-

Cookies and Tracking Technologies

-

We use cookies and similar tracking technologies to enhance your experience on our website, track user preferences, and gather analytical data. You can choose to disable cookies through your browser settings, but doing so may affect the functionality of our site.

-
+
+

Cookies and Tracking Technologies

+

We use cookies and similar tracking technologies to enhance your experience on our website, track user preferences, and gather analytical data. You can choose to disable cookies through your browser settings, but doing so may affect the functionality of our site.

+
-
-

Third-Party Services

-

We may use third-party services for analytics, marketing, or payment processing. These third parties may collect information in accordance with their own privacy policies. We are not responsible for the privacy practices of these third parties.

-
+
+

Third-Party Services

+

We may use third-party services for analytics, marketing, or payment processing. These third parties may collect information in accordance with their own privacy policies. We are not responsible for the privacy practices of these third parties.

+
-
-

Data Security

-

We implement reasonable security measures to protect the personal information you provide us from unauthorized access, disclosure, or loss. However, no method of transmission over the internet or method of electronic storage is entirely secure.

-
+
+

Data Security

+

We implement reasonable security measures to protect the personal information you provide us from unauthorized access, disclosure, or loss. However, no method of transmission over the internet or method of electronic storage is entirely secure.

+
-
-

Your Data Rights

-

You have the following rights regarding your personal information:

-
    -
  • Access, update, or delete your personal data
  • -
  • Opt-out of marketing communications
  • -
  • Request restrictions on how we process your data
  • -
-

To exercise any of these rights, please contact us at deepraj21.bera@gmail.com

-
+
+

Your Data Rights

+

You have the following rights regarding your personal information:

+
    +
  • Access, update, or delete your personal data
  • +
  • Opt-out of marketing communications
  • +
  • Request restrictions on how we process your data
  • +
+

To exercise any of these rights, please contact us at deepraj21.bera@gmail.com

+
-
-

International Data Transfers

-

Your information may be transferred to and processed in countries other than your country of residence. These countries may have data protection laws that are different from the laws of your country. We take appropriate measures to ensure that your personal data remains protected in accordance with this Privacy Policy.

-
+
+

International Data Transfers

+

Your information may be transferred to and processed in countries other than your country of residence. These countries may have data protection laws that are different from the laws of your country. We take appropriate measures to ensure that your personal data remains protected in accordance with this Privacy Policy.

+
-
-

Changes to This Privacy Policy

-

We may update this Privacy Policy from time to time to reflect changes in our practices. We encourage you to review this page periodically for the latest information on our privacy practices.

-
+
+

Changes to This Privacy Policy

+

We may update this Privacy Policy from time to time to reflect changes in our practices. We encourage you to review this page periodically for the latest information on our privacy practices.

+
-
-

Contact Us

-

If you have any questions about this Privacy Policy, please contact us here.

-
+
+

Contact Us

+

If you have any questions about this Privacy Policy, please contact us here.

+
+
+ +
+
- -
-
+ + + ) -} \ No newline at end of file +} + +export default PrivacyPolicy \ No newline at end of file diff --git a/client/src/pages/Profile.tsx b/client/src/pages/Profile.tsx index f80c1b0..283ac37 100644 --- a/client/src/pages/Profile.tsx +++ b/client/src/pages/Profile.tsx @@ -10,22 +10,23 @@ import { SidebarProvider, SidebarTrigger, } from "@/components/ui/sidebar" -import { - AlertDialog, - AlertDialogCancel, - AlertDialogContent, - AlertDialogDescription, - AlertDialogHeader, - AlertDialogTrigger, -} from "@/components/ui/alert-dialog"; -import { Cross1Icon } from "@radix-ui/react-icons"; +// import { +// AlertDialog, +// AlertDialogCancel, +// AlertDialogContent, +// AlertDialogDescription, +// AlertDialogHeader, +// AlertDialogTrigger, +// } from "@/components/ui/alert-dialog"; +// import { Cross1Icon } from "@radix-ui/react-icons"; import { SidebarLeft } from '@/components/Sidebar/Sidebar' import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" import { Button } from "@/components/ui/button" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Badge } from "@/components/ui/badge" -import { MapPin, Copy, Check,Github, Code, Mail, Eye, MessageSquare, PenLine, Plus, Search, Verified } from 'lucide-react' -import BannerUpdate from '@/components/Settings/BannerUpdate'; +import { MapPin, Copy, Check,Github, Code, Mail, Eye, MessageSquare, Search, } from 'lucide-react' +// import { PenLine, Plus, Verified } from 'lucide-react' +// import BannerUpdate from '@/components/Settings/BannerUpdate'; import { FaExternalLinkAlt, FaStar, FaCodeBranch } from 'react-icons/fa'; const backendUrl = import.meta.env.VITE_BACKEND_URL || 'http://localhost:5000'; @@ -258,12 +259,12 @@ const Dashboard = () => { {profileData?.username} )} - + */}
- + {/* + */}
{!isOwnProfile && ( diff --git a/server/api/handlers/posts/posts.py b/server/api/handlers/posts/posts.py index 9d00310..5f7ce6d 100644 --- a/server/api/handlers/posts/posts.py +++ b/server/api/handlers/posts/posts.py @@ -26,18 +26,34 @@ def get_posts(): def get_post_by_id(post_id): try: + # Check ObjectId validity if ObjectId.is_valid(post_id): post_id = ObjectId(post_id) else: - return {"error": "Invalid post_id format"} - + return jsonify({"error": "Invalid post_id format"}), 400 + + # Query the database + print(f"Querying for post_id: {post_id}") # Debugging post = posts_collection.find_one({"_id": post_id}) + + # Post found if post: - return post - else: - return {"error": "Post not found"} + post['_id'] = str(post['_id']) + if 'comments' in post: + for comment in post['comments']: + comment['_id'] = str(comment['_id']) + comment['post_id'] = str(comment['post_id']) + comment['user_username'] = str(comment['user_username']) + return jsonify(post), 200 + + # Post not found + return jsonify({"error": "Post not found"}), 404 + except Exception as e: - return {"error": str(e)} + # General exception handling + print(f"Error: {str(e)}") # Debugging + return jsonify({"error": str(e)}), 500 + def get_posts_by_author(author_username): try: From 60c5cf6c5761ca59747be23ff6a4b14c39b6c501 Mon Sep 17 00:00:00 2001 From: Deepraj Date: Thu, 12 Dec 2024 11:01:23 +0530 Subject: [PATCH 2/2] feat: enhance Home and Landing pages, update Navbar links, and expand tag options in TagInput component --- client/src/components/Footer/Footer.tsx | 5 +- .../src/components/MultiSelect/TagInput.jsx | 54 +++++ client/src/components/Navbar/Navbar.tsx | 3 +- client/src/components/Products/Products.tsx | 70 ++++-- client/src/pages/Home.tsx | 5 +- client/src/pages/Landing.tsx | 4 +- client/src/pages/TermsAndConditions.tsx | 220 ++++++++++-------- 7 files changed, 228 insertions(+), 133 deletions(-) diff --git a/client/src/components/Footer/Footer.tsx b/client/src/components/Footer/Footer.tsx index 6db7eab..5153857 100644 --- a/client/src/components/Footer/Footer.tsx +++ b/client/src/components/Footer/Footer.tsx @@ -56,7 +56,7 @@ const Footer = () => {
  • DevBots
  • -
  • DevMap
  • +
  • Universal-Box
  • @@ -64,6 +64,7 @@ const Footer = () => {
    • GitHub
    • Linkedin
    • +
    • Discord
    @@ -76,7 +77,7 @@ const Footer = () => {
    - © 2024 DevHub + Copyright © 2024 DevHub
    diff --git a/client/src/components/MultiSelect/TagInput.jsx b/client/src/components/MultiSelect/TagInput.jsx index 0a2f245..8614dc6 100644 --- a/client/src/components/MultiSelect/TagInput.jsx +++ b/client/src/components/MultiSelect/TagInput.jsx @@ -20,6 +20,60 @@ const TAGS = [ { value: "ai", label: "AI" }, { value: "ml", label: "Machine Learning" }, { value: "fintech", label: "Fintech" }, + { value: "typescript", label: "TypeScript" }, + { value: "graphql", label: "GraphQL" }, + { value: "next.js", label: "Next.js" }, + { value: "vue", label: "Vue" }, + { value: "angular", label: "Angular" }, + { value: "svelte", label: "Svelte" }, + { value: "html", label: "HTML" }, + { value: "css", label: "CSS" }, + { value: "sass", label: "SASS" }, + { value: "bootstrap", label: "Bootstrap" }, + { value: "tailwind", label: "Tailwind CSS" }, + { value: "aws", label: "AWS" }, + { value: "azure", label: "Azure" }, + { value: "gcp", label: "Google Cloud Platform" }, + { value: "docker", label: "Docker" }, + { value: "kubernetes", label: "Kubernetes" }, + { value: "ci/cd", label: "CI/CD" }, + { value: "devops", label: "DevOps" }, + { value: "database", label: "Database" }, + { value: "mongodb", label: "MongoDB" }, + { value: "postgresql", label: "PostgreSQL" }, + { value: "mysql", label: "MySQL" }, + { value: "redis", label: "Redis" }, + { value: "graphql", label: "GraphQL" }, + { value: "rest-api", label: "REST API" }, + { value: "microservices", label: "Microservices" }, + { value: "serverless", label: "Serverless" }, + { value: "blockchain", label: "Blockchain" }, + { value: "web3", label: "Web3" }, + { value: "cybersecurity", label: "Cybersecurity" }, + { value: "game-development", label: "Game Development" }, + { value: "data-science", label: "Data Science" }, + { value: "data-analytics", label: "Data Analytics" }, + { value: "big-data", label: "Big Data" }, + { value: "nlp", label: "Natural Language Processing" }, + { value: "computer-vision", label: "Computer Vision" }, + { value: "cloud-computing", label: "Cloud Computing" }, + { value: "iot", label: "Internet of Things (IoT)" }, + { value: "ar-vr", label: "AR/VR" }, + { value: "startup", label: "Startup" }, + { value: "design", label: "Design" }, + { value: "ui-ux", label: "UI/UX" }, + { value: "opensource", label: "Open Source" }, + { value: "software-engineering", label: "Software Engineering" }, + { value: "product-management", label: "Product Management" }, + { value: "project-management", label: "Project Management" }, + { value: "testing", label: "Testing" }, + { value: "agile", label: "Agile" }, + { value: "scrum", label: "Scrum" }, + { value: "ecommerce", label: "E-Commerce" }, + { value: "saas", label: "SaaS" }, + { value: "automation", label: "Automation" }, + { value: "robotics", label: "Robotics" } + ]; export default function TagInput({ selectedTags, onTagsChange }) { diff --git a/client/src/components/Navbar/Navbar.tsx b/client/src/components/Navbar/Navbar.tsx index 8260a9a..c23de1f 100644 --- a/client/src/components/Navbar/Navbar.tsx +++ b/client/src/components/Navbar/Navbar.tsx @@ -59,7 +59,8 @@ export function Navbar() {
    - dh|DevHub + dh + DevHub
    diff --git a/client/src/components/Products/Products.tsx b/client/src/components/Products/Products.tsx index f14fa1b..98a80ab 100644 --- a/client/src/components/Products/Products.tsx +++ b/client/src/components/Products/Products.tsx @@ -1,20 +1,40 @@ +import { BookCheck, PencilRuler, Terminal, Bot, SquarePlus, ChartArea } from 'lucide-react'; + const Products = () => { - const features = [ + const DevBots = [ + { + name: 'Customized Chatbots.', + description: + 'Easily create customized chatbot with just filling forms.', + icon: Bot, + }, + { + name: 'Easy Integration.', + description: 'Get Free API keys and integrate with your website in minutes.', + icon: SquarePlus, + }, { - name: 'Push to deploy.', + name: 'Analytics Dashboard.', + description: 'Get detailed analytics of your chatbot queries, timestamps, IPs and much more.', + icon: ChartArea, + }, + ] + const UniversalBox = [ + { + name: 'Prebuilt Templates.', description: - 'Lorem ipsum, dolor sit amet consectetur adipisicing elit. Maiores impedit perferendis suscipit eaque, iste dolor cupiditate blanditiis ratione.', - // icon: CloudArrowUpIcon, + 'Explore our extensive library of 50+ project templates designed for various applications.', + icon: BookCheck, }, { - name: 'SSL certificates.', - description: 'Anim aute id magna aliqua ad ad non deserunt sunt. Qui irure qui lorem cupidatat commodo.', - // icon: LockClosedIcon, + name: 'One click setup.', + description: 'npm package helps users to install the package and Scaffolding in one click.', + icon: PencilRuler, }, { - name: 'Database backups.', - description: 'Ac tincidunt sapien vehicula erat auctor pellentesque rhoncus. Et magna sit morbi lobortis.', - // icon: ServerIcon, + name: 'More optional commands.', + description: 'Explore more optional commands to clone, customize and deploy your projects.', + icon: Terminal, }, ] return ( @@ -22,15 +42,18 @@ const Products = () => {
    -

    +

    DevBots

    - {features.map((feature) => ( + {DevBots.map((feature) => (
    -
    - {feature.name} -
    +
    + {feature.icon && } +
    + {feature.name} +
    +
    {feature.description}
    ))} @@ -51,22 +74,25 @@ const Products = () => {
    Product screenshot
    -

    - DevMap +

    + Universal-Box

    - {features.map((feature) => ( + {UniversalBox.map((feature) => (
    -
    - {feature.name} -
    +
    + {feature.icon && } +
    + {feature.name} +
    +
    {feature.description}
    ))} diff --git a/client/src/pages/Home.tsx b/client/src/pages/Home.tsx index 1ee18e2..8ea6bc3 100644 --- a/client/src/pages/Home.tsx +++ b/client/src/pages/Home.tsx @@ -9,14 +9,13 @@ import { SidebarLeft } from '@/components/Sidebar/Sidebar' const Home = () => { const navigate = useNavigate(); + const username = localStorage.getItem('devhub_username'); useEffect(() => { - const username = localStorage.getItem('devhub_username'); - if (!username) { navigate('/login'); } - }, [navigate]); + }, [navigate, username]); return ( diff --git a/client/src/pages/Landing.tsx b/client/src/pages/Landing.tsx index 8ffde1e..b70b065 100644 --- a/client/src/pages/Landing.tsx +++ b/client/src/pages/Landing.tsx @@ -17,7 +17,7 @@ const Landing: React.FC = () => { return ( <> -
    +
    @@ -43,7 +43,7 @@ const Landing: React.FC = () => { Build amazing connections

    - The platform offers intelligent matchmaking and personalized recommendations to form effective teams and engage in meaningful collaborations. + Intelligent matchmaking and personalized recommendations

    diff --git a/client/src/pages/TermsAndConditions.tsx b/client/src/pages/TermsAndConditions.tsx index 531ac37..69e162f 100644 --- a/client/src/pages/TermsAndConditions.tsx +++ b/client/src/pages/TermsAndConditions.tsx @@ -1,122 +1,136 @@ -import { ScrollArea } from "@/components/ui/scroll-area" +import { + SidebarInset, + SidebarProvider, + SidebarTrigger, +} from "@/components/ui/sidebar" +import { SidebarLeft } from '@/components/Sidebar/Sidebar' import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@/components/ui/accordion" export default function TermsAndConditions() { const lastUpdated = "October 25, 2024" - return ( -
    -
    -

    DevHub Terms and Conditions

    -

    Last updated: {lastUpdated}

    - - -
    -
    -

    Introduction

    -

    Welcome to DevHub. These Terms and Conditions govern your use of our website. By accessing or using our website, you agree to comply with and be bound by these Terms. If you do not agree to these Terms, please refrain from using our website.

    -
    + + + +
    +
    + +
    +
    +
    +
    +
    +

    DevHub Terms and Conditions

    +

    Last updated: {lastUpdated}

    +
    +
    +

    Introduction

    +

    Welcome to DevHub. These Terms and Conditions govern your use of our website. By accessing or using our website, you agree to comply with and be bound by these Terms. If you do not agree to these Terms, please refrain from using our website.

    +
    - - - 1. Acceptance of Terms - -

    By accessing or using DevHub, you acknowledge that you have read, understood, and agreed to these Terms. We may modify these Terms at any time without prior notice, and it is your responsibility to check for updates periodically. Continued use of the website following changes signifies your acceptance of the revised Terms.

    -
    -
    + + + 1. Acceptance of Terms + +

    By accessing or using DevHub, you acknowledge that you have read, understood, and agreed to these Terms. We may modify these Terms at any time without prior notice, and it is your responsibility to check for updates periodically. Continued use of the website following changes signifies your acceptance of the revised Terms.

    +
    +
    - - 2. Use of the Website - -

    You agree to use DevHub for lawful purposes only and in a manner that does not infringe on the rights of, restrict, or inhibit others' use and enjoyment of the site. Prohibited actions include but are not limited to:

    -
      -
    • Engaging in any illegal activities.
    • -
    • Distributing viruses or any harmful software.
    • -
    • Breaching any intellectual property rights.
    • -
    • Uploading misleading, defamatory, or abusive content.
    • -
    -
    -
    + + 2. Use of the Website + +

    You agree to use DevHub for lawful purposes only and in a manner that does not infringe on the rights of, restrict, or inhibit others' use and enjoyment of the site. Prohibited actions include but are not limited to:

    +
      +
    • Engaging in any illegal activities.
    • +
    • Distributing viruses or any harmful software.
    • +
    • Breaching any intellectual property rights.
    • +
    • Uploading misleading, defamatory, or abusive content.
    • +
    +
    +
    - - 3. Intellectual Property Rights - -

    All content, including text, graphics, logos, and software available on DevHub, is the property of the website owner or its licensors and is protected by applicable intellectual property laws in India. You may not reproduce, distribute, or otherwise use any content without obtaining permission from the copyright owner.

    -
    -
    + + 3. Intellectual Property Rights + +

    All content, including text, graphics, logos, and software available on DevHub, is the property of the website owner or its licensors and is protected by applicable intellectual property laws in India. You may not reproduce, distribute, or otherwise use any content without obtaining permission from the copyright owner.

    +
    +
    - - 4. User-Generated Content - -

    Any content you upload, post, or share on DevHub (e.g., comments, feedback, suggestions) will remain your property, but by submitting such content, you grant us a non-exclusive, royalty-free, and worldwide license to use, distribute, and display the content. You are solely responsible for the content you share and must ensure that it does not violate any laws or third-party rights.

    -
    -
    + + 4. User-Generated Content + +

    Any content you upload, post, or share on DevHub (e.g., comments, feedback, suggestions) will remain your property, but by submitting such content, you grant us a non-exclusive, royalty-free, and worldwide license to use, distribute, and display the content. You are solely responsible for the content you share and must ensure that it does not violate any laws or third-party rights.

    +
    +
    - - 5. Limitation of Liability - -

    DevHub, its owners, employees, or partners shall not be held liable for any direct, indirect, incidental, or consequential damages arising from your use of the website, including but not limited to:

    -
      -
    • Loss of data.
    • -
    • Technical issues or disruptions.
    • -
    • Third-party content accessed through links on the website.
    • -
    -

    We do not guarantee that the site will be error-free, uninterrupted, or free from viruses or harmful components.

    -
    -
    + + 5. Limitation of Liability + +

    DevHub, its owners, employees, or partners shall not be held liable for any direct, indirect, incidental, or consequential damages arising from your use of the website, including but not limited to:

    +
      +
    • Loss of data.
    • +
    • Technical issues or disruptions.
    • +
    • Third-party content accessed through links on the website.
    • +
    +

    We do not guarantee that the site will be error-free, uninterrupted, or free from viruses or harmful components.

    +
    +
    - - 6. Links to Third-Party Websites - -

    DevHub may contain links to third-party websites or services, which are not owned or controlled by us. We have no responsibility for the content, privacy policies, or practices of third-party websites. You access any linked website at your own risk.

    -
    -
    + + 6. Links to Third-Party Websites + +

    DevHub may contain links to third-party websites or services, which are not owned or controlled by us. We have no responsibility for the content, privacy policies, or practices of third-party websites. You access any linked website at your own risk.

    +
    +
    - - 7. Privacy Policy - -

    Your use of the website is also governed by our Privacy Policy, which can be found here. By using DevHub, you agree to the collection and use of your personal data as outlined in our Privacy Policy.

    -
    -
    + + 7. Privacy Policy + +

    Your use of the website is also governed by our Privacy Policy, which can be found here. By using DevHub, you agree to the collection and use of your personal data as outlined in our Privacy Policy.

    +
    +
    - - 8. Termination of Access - -

    We reserve the right to suspend or terminate your access to DevHub without prior notice if you violate these Terms or engage in any conduct that we consider harmful to the site or its users.

    -
    -
    + + 8. Termination of Access + +

    We reserve the right to suspend or terminate your access to DevHub without prior notice if you violate these Terms or engage in any conduct that we consider harmful to the site or its users.

    +
    +
    - - 9. Governing Law and Jurisdiction - -

    These Terms and Conditions are governed by and construed in accordance with the laws of India. Any disputes arising out of or in connection with these Terms shall be subject to the exclusive jurisdiction of the courts of Mumbai, India.

    -
    -
    + + 9. Governing Law and Jurisdiction + +

    These Terms and Conditions are governed by and construed in accordance with the laws of India. Any disputes arising out of or in connection with these Terms shall be subject to the exclusive jurisdiction of the courts of Mumbai, India.

    +
    +
    - - 10. Indemnification - -

    You agree to indemnify, defend, and hold harmless DevHub, its owners, employees, and partners from and against any claims, liabilities, damages, losses, and expenses, including legal fees, arising from your use of the website or violation of these Terms.

    -
    -
    + + 10. Indemnification + +

    You agree to indemnify, defend, and hold harmless DevHub, its owners, employees, and partners from and against any claims, liabilities, damages, losses, and expenses, including legal fees, arising from your use of the website or violation of these Terms.

    +
    +
    - - 11. Changes to Terms - -

    We may update these Terms and Conditions at any time. We encourage you to review this page periodically for any changes. Continued use of the website following any updates constitutes your acceptance of the revised Terms.

    -
    -
    -
    + + 11. Changes to Terms + +

    We may update these Terms and Conditions at any time. We encourage you to review this page periodically for any changes. Continued use of the website following any updates constitutes your acceptance of the revised Terms.

    +
    +
    +
    -
    -

    Contact Us

    -

    If you have any questions or concerns about these Terms and Conditions, please contact us at:

    -

    DevHub

    -

    Email: deepraj21.bera@gmail.com

    -
    +
    +

    Contact Us

    +

    If you have any questions or concerns about these Terms and Conditions, please contact us at:

    +

    DevHub

    +

    Email: deepraj21.bera@gmail.com

    +
    +
    +
    - -
    -
    + + + ) -} \ No newline at end of file +} +