{c.username}
-- {c.rank} -
-diff --git a/.env.example b/.env.example index a96f16f..64cc0f5 100644 --- a/.env.example +++ b/.env.example @@ -16,3 +16,8 @@ VITE_FIREBASE_APP_ID=your-app-id # Customize the password reset email template in Firebase Console: # Authentication → Templates → Password reset # You can modify the email subject, body, and sender name + +# Google Gemini API Key (Optional - for AI Blog Generator) +# Get your free API key from: https://aistudio.google.com/app/apikey +# The AI Blog Generator works without this key using demo mode +VITE_GEMINI_API_KEY=your-gemini-api-key-here diff --git a/.github/workflows/duplicate-issue.yml b/.github/workflows/duplicate-issue.yml index d1e00d6..d2ac612 100644 --- a/.github/workflows/duplicate-issue.yml +++ b/.github/workflows/duplicate-issue.yml @@ -1,4 +1,4 @@ -name: 🔁 ECWoC'26 Duplicate Issue Detector +name: 🔁 Duplicate Issue Detector on: issues: @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - - name: Check for Duplicate Issues (ECWoC'26) + - name: Check for Duplicate Issues uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} @@ -43,7 +43,7 @@ jobs: (newBody && oldBody && oldBody.includes(newBody)) ) { const comment = ` - ## 🔁 Possible Duplicate Issue (ECWoC'26) + ## 🔁 Possible Duplicate Issue Hi @${newIssue.user.login} 👋, @@ -55,11 +55,10 @@ jobs: - If this is the same problem, please continue the discussion on the existing issue. - If it's different, kindly explain **how this issue is unique** so maintainers can review it. - Keeping issues clean helps everyone contribute better during **ECWoC'26** 🚀 + Keeping issues clean helps everyone contribute better and faster. Thanks for your understanding! 🙌 --- - 🤖 *Automated duplicate detection for ECWoC'26* `; await github.rest.issues.createComment({ @@ -69,13 +68,6 @@ jobs: body: comment }); - await github.rest.issues.addLabels({ - owner, - repo, - issue_number: newIssue.number, - labels: ['ECWoC26', 'possible-duplicate', 'automated'] - }); - break; } } \ No newline at end of file diff --git "a/.github/workflows/issue-create-automate-message.yml\342\200\216\342\200\216" "b/.github/workflows/issue-create-automate-message.yml\342\200\216\342\200\216" index 02200ad..4819339 100644 --- "a/.github/workflows/issue-create-automate-message.yml\342\200\216\342\200\216" +++ "b/.github/workflows/issue-create-automate-message.yml\342\200\216\342\200\216" @@ -17,8 +17,17 @@ jobs: script: | const issueNumber = context.issue.number; - const commentBody1 = `### Thank you for raising this issue!\n We'll review it as soon as possible. We truly appreciate your contributions! ✨\n\n> Meanwhile make sure you've visited the README.md, CONTRIBUTING.md, and CODE_OF_CONDUCT.md before creating a PR for this. Also, please do NOT create a PR until this issue has been assigned to you. 😊`; - + const commentBody1 = + "### Thank you for raising this issue! 🙌\n" + + "We'll review it as soon as possible. We truly appreciate your contribution! ✨\n\n" + + "> 📌 **Before moving ahead:**\n" + + "> - Please make sure you've gone through **README.md**, **CONTRIBUTING.md**, and **CODE_OF_CONDUCT.md**.\n" + + "---\n\n" + + "### 🌟 Support & Explore\n" + + "If you like this repository, don’t forget to **⭐ star it** — it really helps and motivates maintainers!\n\n" + + "- 🛠️ New project ideas\n" + + "- 📚 Learning resources\n" + + "Happy contributing! 😊"; await github.rest.issues.createComment({ owner: context.repo.owner, @@ -27,5 +36,4 @@ jobs: body: commentBody1 }); - console.log('Comment added successfully.'); - \ No newline at end of file + console.log("Comment added successfully."); \ No newline at end of file diff --git a/.github/workflows/pr-create-automate-message.yml b/.github/workflows/pr-create-automate-message.yml index 8c90343..23ea646 100644 --- a/.github/workflows/pr-create-automate-message.yml +++ b/.github/workflows/pr-create-automate-message.yml @@ -1,30 +1,47 @@ -name: Auto Comment on PR +name: Welcome PR Author on: pull_request_target: types: [opened] permissions: - issues: write pull-requests: write + issues: write jobs: - comment: + welcome-pr: runs-on: ubuntu-latest steps: - - name: Comment on PR - uses: actions/github-script@v6 + - name: Welcome new PR + uses: actions/github-script@v7 with: script: | - const prNumber = context.issue.number; + const prAuthor = context.payload.pull_request.user.login; + const prNumber = context.payload.pull_request.number; + + const welcomeMessage = + "## 🎉 Thanks for the PR, @" + prAuthor + "!\n\n" + + "We really appreciate you taking the time to contribute to **CryptoHub**! 💙\n\n" + + "---\n\n" + + "### ⭐ Love this project?\n" + + "**Please give us a star!** It helps the project grow and reach more developers! 🌟\n\n" + + "🔗 https://github.com/KaranUnique/CryptoHub" + + "---\n\n" + + "### ✅ PR Checklist\n" + + "Before we review, please ensure:\n" + + "- [ ] Your code follows the project's coding standards\n" + + "- [ ] All file changes are accurate and intentional\n" + + "- [ ] You've tested your changes locally\n" + + "- [ ] Any review comments have been addressed\n\n" + + "---\n\n" + + "We'll review your PR as soon as possible. Keep up the great work! ✨"; - const commentBody = `### Thanks for creating a PR for your Issue! ☺️\n\nWe'll review it as soon as possible.\nIn the meantime, please double-check the **file changes** and ensure that **all commits** are accurate.\n\nIf there are any **unresolved review comments**, feel free to resolve them. 🙌🏼`; await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: prNumber, - body: commentBody + body: welcomeMessage }); - console.log('Comment added successfully.'); \ No newline at end of file + console.log("✅ Welcome comment added to PR #" + prNumber); \ No newline at end of file diff --git "a/.github/workflows/unassign-inactive-contributors.yml\342\200\216" "b/.github/workflows/unassign-inactive-contributors.yml\342\200\216" index 77a2871..9f1142c 100644 --- "a/.github/workflows/unassign-inactive-contributors.yml\342\200\216" +++ "b/.github/workflows/unassign-inactive-contributors.yml\342\200\216" @@ -1,9 +1,10 @@ -name: Unassign inactive contributors +name: Unassign Inactive Contributors on: schedule: - # Runs every 1 hour + # Runs every hour - cron: "0 * * * *" + workflow_dispatch: # Allow manual trigger for testing permissions: issues: write @@ -11,23 +12,23 @@ permissions: jobs: unassign-inactive: runs-on: ubuntu-latest - steps: - - name: Check and warn inactive contributors + - name: Check and unassign inactive contributors uses: actions/github-script@v7 with: script: | const now = new Date(); + const WARNING_HOURS = 15; + const UNASSIGN_HOURS = 30; - const WARNING_AFTER_HOURS = 15; // Send warning - const UNASSIGN_AFTER_HOURS = 30; // Unassign after warning window + console.log('🔍 Checking for inactive assigned issues...'); const issues = await github.paginate( github.rest.issues.listForRepo, { owner: context.repo.owner, repo: context.repo.repo, - state: "open", + state: 'open', per_page: 100, } ); @@ -36,48 +37,49 @@ jobs: // Skip PRs if (issue.pull_request) continue; - // Skip issues with no assignees + // Skip unassigned issues if (!issue.assignees || issue.assignees.length === 0) continue; - const lastUpdated = new Date(issue.updated_at); - const diffHours = (now - lastUpdated) / (1000 * 60 * 60); + const assignedAt = new Date(issue.updated_at); + const hoursInactive = (now - assignedAt) / (1000 * 60 * 60); + + console.log(`Issue #${issue.number}: ${hoursInactive.toFixed(1)} hours inactive`); - // Fetch comments to check for existing warning - const comments = await github.rest.issues.listComments({ + // Get comments to check for warning + const { data: comments } = await github.rest.issues.listComments({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, }); - const warningComment = comments.data.find(c => - c.body.includes("⚠️ Inactivity Warning") + const hasWarning = comments.some(c => + c.body && c.body.includes('⏰ Inactivity Warning') ); - const assigneesMention = issue.assignees - .map(a => `@${a.login}`) - .join(", "); + const assigneeNames = issue.assignees.map(a => `@${a.login}`).join(', '); + const assigneeLogins = issue.assignees.map(a => a.login); - // 🔔 Send warning after 15 hours - if (diffHours >= WARNING_AFTER_HOURS && !warningComment) { + // Send warning after 15 hours (if not already warned) + if (hoursInactive >= WARNING_HOURS && hoursInactive < UNASSIGN_HOURS && !hasWarning) { await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, - body: `⚠️ **Inactivity Warning** + body: `⏰ **Inactivity Warning** -${assigneesMention}, this issue has been inactive for **15 hours**. + Hi ${assigneeNames}! 👋 -Please provide an update within the next **15 hours**, or you may be **automatically unassigned**.` - }); + This issue has been inactive for **${Math.floor(hoursInactive)} hours**. - console.log(`Warning sent for issue #${issue.number}`); - continue; - } + Please provide an update within the next **15 hours**, or you may be **automatically unassigned** to give others a chance to contribute. - // 🚫 Unassign after 30 hours (only if warning was sent) - if (diffHours >= UNASSIGN_AFTER_HOURS && warningComment) { - const assigneeLogins = issue.assignees.map(a => a.login); + 💡 *If you need more time, just leave a comment to reset the timer!*` + }); + console.log(`⚠️ Warning sent for issue #${issue.number}`); + } + // Unassign after 30 hours (only if warning was sent) + if (hoursInactive >= UNASSIGN_HOURS && hasWarning) { await github.rest.issues.removeAssignees({ owner: context.repo.owner, repo: context.repo.repo, @@ -89,12 +91,16 @@ Please provide an update within the next **15 hours**, or you may be **automatic owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, - body: `ℹ️ **Unassigned due to inactivity** + body: `🔓 **Unassigned Due to Inactivity** -You have been automatically unassigned after **30 hours of inactivity**. -Feel free to reassign yourself if you wish to continue working on this issue.` - }); + This issue has been unassigned after **30+ hours of inactivity**. + + The issue is now open for others to work on! 🙌 - console.log(`Unassigned contributors from issue #${issue.number}`); + *If you'd like to continue working on this, feel free to comment and request reassignment.*` + }); + console.log(`🚫 Unassigned issue #${issue.number}`); } - } \ No newline at end of file + } + + console.log('✅ Inactivity check complete!'); \ No newline at end of file diff --git a/CryptoHub b/CryptoHub deleted file mode 160000 index a0a03e1..0000000 --- a/CryptoHub +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a0a03e1970c064296f411d32475148256987630b diff --git a/README.md b/README.md index 4ad2fb2..a46c0b9 100644 --- a/README.md +++ b/README.md @@ -323,6 +323,14 @@ npm run dev http://localhost:5173 ``` +
| {renderInline(cell)} | + ))} +
|---|
| {renderInline(cell)} | + ))} +
+ + Powered by CoinGecko • Always free +
+{introduction}
+{point.text}
+{summary}
+Update your account password
- {/* Error Message */} {error &&+ We've sent a verification email to: +
+ +{currentUser?.email}
+ ++ Please check your inbox and click the verification link to activate + your account. Don't forget to check your spam folder if you don't see + the email. +
+ ++ Need help? Contact Support +
+ + +- No worries! Enter your email and we'll send you reset instructions. + No worries! Enter your email and we'll send you reset + instructions.
- Join CryptoHub and start tracking today + Join CryptoHub and + start tracking today
- Your portal to contextualised market analysis, and cutting edge research - for Bitcoin, Ethereum, DeFi and more. Access premium on-chain data and institutional-grade analysis. -
-{post.excerpt}
- -30 comprehensive reports and insights
-{post.excerpt}
- -+ {this.props.fallbackMessage || + "We encountered an error while loading this page. Please try again."} +
+ + {process.env.NODE_ENV === "development" && this.state.error && ( +
+ {this.state.error.toString()}
+ {this.state.errorInfo?.componentStack}
+
+ {message}
+ + {userAction && ( +{userAction}
+{developerAction}
+{code}
+ {originalError}
+ {message}
-{message}
+Oops! Page Not Found
+ Go back to Home +- Meet the talented developers who help make CryptoHub better every day. -
- -{PROJECT_ADMIN.username}
-{PROJECT_ADMIN.description}
-Loading contributor data from GitHub...
-{error}
-- Stats will show "No contributors found" - normal if repo has no merged PRs yet. -
-No contributors found.
-
- No merged pull requests in KaranUnique/CryptoHub yet.
-
Stats show 0 contributors, 0 PRs, 0 points ✅
-
- {c.rank} -
-- No merged pull requests found for this contributor. -
- )} - - {selectedContributor.prs.length > 0 && ( -Loading leaderboard...
-Loading leaderboard...
+No leaderboard data yet. Start tracking coins to climb the ranks!
++ No leaderboard data yet. Start tracking coins to climb the ranks! +
+ Transparency matters. This policy explains how we use cookies to + enhance your experience and protect your privacy. +
+ ++ Last Updated: January 2026 +
++ {section.content} +
+ )} + + {section.list && ( +Effective: January 22, 2026
++ CryptoHub ("we", "us", "our") is committed to protecting your privacy. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you visit our website or use our services related to cryptocurrency tracking, wallets, and analytics [web:3]. +
+From blockchain explorers, exchanges, or analytics providers when you link accounts [web:5].
+We use encryption for data in transit and at rest, access controls, and regular audits. Private keys and seeds are never stored by us—only public data [web:3].
+We use essential cookies for functionality and analytics cookies (opt-out available). No non-essential tracking without consent [web:1].
+Services not for under 13. We do not knowingly collect data from children [web:1].
+Data processed in the US and other locations with safeguards like Standard Contractual Clauses [web:1].
+Updates posted here with notice for material changes.
+Last updated: January 2026
+ + {[ + { + title: "1. Introduction", + content: + "Welcome to CryptoHub. By accessing or using our website and services, you agree to follow these Terms of Service. Please read them carefully.", + }, + { + title: "2. Use of Our Services", + content: ( +support@cryptohub.com
+ > + ), + }, + ].map((section, index) => ( ++ CryptoHub is a comprehensive platform designed to provide users with + real-time cryptocurrency market data, insightful analytics, and + educational resources. Our goal is to empower both beginners and + experienced traders with reliable tools to make informed decisions + in the fast-moving digital asset ecosystem. +
+ ++ Our mission is to simplify crypto market analysis by combining + real-time data, intuitive design, and powerful visualization tools. + We strive to make cryptocurrency accessible, transparent, and + user-friendly for everyone. +
+ ++ CryptoHub is proudly open-source and welcomes contributors worldwide. + We believe in collaboration, transparency, and continuous improvement. + Community contributions help us evolve the platform and build a + stronger crypto ecosystem together. +
+ ++ We envision CryptoHub as a trusted, all-in-one crypto intelligence + platform that bridges the gap between data complexity and user clarity. + Whether you're just starting your crypto journey or actively trading, + CryptoHub is built to support your growth. +
+ ++ Your portal to contextualised market analysis, and cutting edge research + for Bitcoin, Ethereum, DeFi and more. Access premium on-chain data and institutional-grade analysis. +
+{post.excerpt}
+ +Comprehensive reports and insights
+{post.excerpt}
+ ++ Have a question, feedback, or partnership idea? Drop us a message and + we will get back to you. +
+Email : support@cryptohub.com
+Location: India, Remote Team
+Support Hours: 24/7
++ {contributor.rank} +
++ Meet the talented developers who help make CryptoHub better every day. +
+ +{PROJECT_ADMIN.username}
+{PROJECT_ADMIN.description}
+Loading contributor data from GitHub...
+{error}
++ Stats will show "No contributors found" - normal if repo has no merged PRs yet. +
+No contributors found.
+
+ No merged pull requests in KaranUnique/CryptoHub yet.
+
Stats show 0 contributors, 0 PRs, 0 points ✅
+
+ No merged pull requests found for this contributor. +
+ )} + + {selectedContributor.prs.length > 0 && ( ++ CryptoHub is a comprehensive cryptocurrency tracking platform designed to help users monitor the crypto market in real time. +
+ +• Track live cryptocurrency prices and trends
+• Analyze market insights and performance data
+• Manage and monitor your personal crypto portfolio
++ It is built to provide simple and user-friendly tools for both beginners and experienced traders. +
+ > + ) + }, + { + question: "Is CryptoHub free to use?", + answer: ( + <> ++ Yes, CryptoHub offers a free plan that provides access to essential features. +
+ +• Real-time crypto price tracking
+• Market overview and insights
+• Basic portfolio management
++ Premium features may be available for users who need advanced analytics and tools. +
+ > + ) + }, + { + question: "Where does CryptoHub get its data?", + answer: ( + <> ++ CryptoHub collects data from trusted cryptocurrency market APIs and exchange platforms. +
+ +• Live price feeds
+• Market capitalization data
+• Trading volume statistics
++ The platform continuously updates its data to ensure accuracy and reliability. +
+ > + ) + }, + { + question: "Can I track my portfolio?", + answer: ( + <> ++ Yes, users can create and manage their crypto portfolio directly on CryptoHub. +
+ +• Add cryptocurrencies you own
+• Track profit and loss
+• Monitor overall portfolio performance
++ This helps users make informed investment decisions. +
+ > + ) + }, + { + question: "Is my data secure?", + answer: ( + <> ++ Yes, we follow industry-standard security practices to protect user information. +
+ +• Secure authentication systems
+• Encrypted data handling
+• Protected API integrations
++ User privacy and security are a top priority for CryptoHub. +
+ > + ) + } +]; + + + +const toogleFAQ=(idx)=>{ + setActiveIndex(activeIndex === idx ? null : idx); +} + return ( +Find quick answers about CryptoHub and how it works.
+ +