Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 75 additions & 0 deletions .coderabbit.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# CodeRabbit Configuration
language: en-US # Language for reviews

# Review settings
reviews:
profile: chill # Options: chill, assertive
high_level_summary: true
high_level_summary_placeholder: '@coderabbitai summary'
auto_title_placeholder: '@coderabbitai'
changed_files_summary: true
sequence_diagrams: true
assess_linked_issues: true
related_issues: true
related_prs: true
suggested_labels: true
suggested_reviewers: true
poem: true

Comment thread
coderabbitai[bot] marked this conversation as resolved.
# Path filters and instructions
path_filters: [] # Add glob patterns to include/exclude files
path_instructions: [] # Add path-specific review instructions

# Auto review settings
auto_review:
enabled: true
auto_incremental_review: true
drafts: false
base_branches:
- main
- help-center-base



# Tool integrations
tools:
# Common tools (all enabled by default)
ast-grep:
essential_rules: true
shellcheck:
enabled: true
ruff:
enabled: true
markdownlint:
enabled: true
biome:
enabled: true
eslint:
enabled: true
gitleaks:
enabled: true

# Chat settings
chat:
auto_reply: true
create_issues: true
Comment on lines +54 to +55
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Remove unsupported create_issues key – it breaks the config.

chat only allows auto_reply and integrations. Adding extra keys violates the schema, causing the entire .coderabbit.yaml to be rejected.

 chat:
   auto_reply: true
-  create_issues: true
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
auto_reply: true
create_issues: true
chat:
auto_reply: true
🤖 Prompt for AI Agents
In the .coderabbit.yaml file at lines 49 to 50, the key `create_issues` is not
supported and causes the configuration to break. Remove the `create_issues:
true` line entirely, leaving only supported keys such as `auto_reply` and
`integrations` in this section to comply with the schema and prevent rejection
of the config file.


# Knowledge base settings
knowledge_base:
web_search:
enabled: true
learnings:
scope: auto
issues:
scope: auto
pull_requests:
scope: auto

# Code generation settings
code_generation:
docstrings:
path_instructions:
- path: "**/*.js"
instructions: |
End all docstrings with a notice that says "Auto-generated by CodeRabbit.".
Do not omit the closing tags; the docstring must be valid.
8 changes: 0 additions & 8 deletions bin/help-center.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,14 +69,6 @@ program
console.log(' Deploys the help center to your specified domain.');
});

program
.command('build')
.description('Build the help center for production')
.action(() => {
console.log(chalk.blue('Building help center...'));
execSync('next build', { stdio: 'inherit' });
});

program
.command('start')
.description('Start the development server')
Expand Down
35 changes: 35 additions & 0 deletions context/ThemeContext.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import React, { createContext, useState, useEffect, useContext } from 'react';

const ThemeContext = createContext();

export const useTheme = () => useContext(ThemeContext);

export const ThemeProvider = ({ children }) => {
const [theme, setTheme] = useState('light'); // Default theme

useEffect(() => {
const storedTheme = localStorage.getItem('theme');
if (storedTheme) {
setTheme(storedTheme);
}
}, []);

useEffect(() => {
if (theme === 'dark') {
document.body.classList.add('dark-mode');
} else {
document.body.classList.remove('dark-mode');
}
localStorage.setItem('theme', theme);
}, [theme]);
Comment on lines +17 to +24
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Add error handling for localStorage operations.

localStorage operations can fail (e.g., in private browsing mode) and should be wrapped in try-catch blocks.

  useEffect(() => {
    if (theme === 'dark') {
      document.body.classList.add('dark-mode');
    } else {
      document.body.classList.remove('dark-mode');
    }
-   localStorage.setItem('theme', theme);
+   try {
+     localStorage.setItem('theme', theme);
+   } catch (error) {
+     console.warn('Failed to save theme preference:', error);
+   }
  }, [theme]);
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
useEffect(() => {
if (theme === 'dark') {
document.body.classList.add('dark-mode');
} else {
document.body.classList.remove('dark-mode');
}
localStorage.setItem('theme', theme);
}, [theme]);
useEffect(() => {
if (theme === 'dark') {
document.body.classList.add('dark-mode');
} else {
document.body.classList.remove('dark-mode');
}
try {
localStorage.setItem('theme', theme);
} catch (error) {
console.warn('Failed to save theme preference:', error);
}
}, [theme]);
🤖 Prompt for AI Agents
In context/ThemeContext.js around lines 17 to 24, the localStorage.setItem call
is not wrapped in error handling, which can cause issues in environments like
private browsing. Wrap the localStorage.setItem('theme', theme) call inside a
try-catch block to safely handle any exceptions and prevent the app from
crashing.


const toggleTheme = () => {
setTheme((prevTheme) => (prevTheme === 'light' ? 'dark' : 'light'));
};

return (
<ThemeContext.Provider value={{ theme, toggleTheme }}>
{children}
</ThemeContext.Provider>
);
};
7 changes: 6 additions & 1 deletion pages/_app.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
import '../styles/globals.css';
import { config } from '@fortawesome/fontawesome-svg-core';
import '@fortawesome/fontawesome-svg-core/styles.css';
import { ThemeProvider } from '../context/ThemeContext';

// Prevent Font Awesome from adding its CSS since we did it manually above
config.autoAddCss = false;

function MyApp({ Component, pageProps }) {
return <Component {...pageProps} />;
return (
<ThemeProvider>
<Component {...pageProps} />
</ThemeProvider>
);
}

export default MyApp;
16 changes: 15 additions & 1 deletion pages/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,14 @@ import {
faBook,
faCreditCard,
faCode,
faUser
faUser,
faSun,
faMoon
} from '@fortawesome/free-solid-svg-icons';
import { faTwitter, faLinkedin } from '@fortawesome/free-brands-svg-icons';
import { categories, articles } from '../data';
import styles from '../styles/Home.module.css';
import { useTheme } from '../context/ThemeContext'; // Import useTheme

const iconMap = {
'rocket': faRocket,
Expand All @@ -22,6 +25,7 @@ const iconMap = {

export default function Home() {
const [query, setQuery] = useState('');
const { theme, toggleTheme } = useTheme(); // Use theme context
const filteredArticles = articles.filter(article =>
article.title.toLowerCase().includes(query.toLowerCase())
);
Expand All @@ -30,21 +34,31 @@ export default function Home() {
<div className={styles.container}>
<header className={styles.header}>
<Link href="/" className={styles.logo}>Acme Corp</Link>
<button onClick={toggleTheme} className={styles.themeToggle}>
<FontAwesomeIcon icon={theme === 'light' ? faMoon : faSun} />
</button>
</header>
<main className={styles.main}>
<div className={styles.searchContainer}>
<h1>Advice and answers from the Acme Corp Team</h1>
<div className={styles.searchWrapper}>
<label htmlFor="search-input" className={styles.visuallyHidden}>
Search help articles
</label>
<FontAwesomeIcon
icon={faSearch}
className={styles.searchIcon}
aria-hidden="true"
/>
<input
id="search-input"
type="text"
placeholder="Search for articles..."
className={styles.search}
value={query}
onChange={(e) => setQuery(e.target.value)}
aria-label="Search help articles"
role="searchbox"
/>
</div>
</div>
Expand Down
80 changes: 80 additions & 0 deletions styles/Home.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
background-color: #0f172a;
padding: 1.5rem 2rem;
color: white;
display: flex; /* Enable flexbox for alignment */
justify-content: space-between; /* Space between logo and toggle */
align-items: center; /* Vertically align items */
}

.logo {
Expand Down Expand Up @@ -175,4 +178,81 @@
.socialIcon svg {
width: 1.25rem !important;
height: 1.25rem;
}

.themeToggle {
background: none;
border: none;
color: white;
cursor: pointer;
font-size: 1.25rem; /* Adjust icon size as needed */
}

.themeToggle:hover {
color: #cbd5e0; /* Lighter color on hover */
}

/* Dark Mode adjustments for Home.module.css */
/* You might need to add specific dark mode overrides for components in this file */
/* For example, if a card has a light background, you\'ll want to change it for dark mode */

body.dark-mode .search {
background-color: #2d3748; /* Darker search input background */
border-color: #4a5568; /* Darker border */
color: #e2e8f0; /* Light text for input */
}

body.dark-mode .search::placeholder {
color: #a0aec0; /* Lighter placeholder text */
}

body.dark-mode .search:focus {
border-color: #63b3ed; /* Lighter blue for focus */
background-color: #1a202c;
}

body.dark-mode .categoryCard {
background: #2d3748; /* Darker card background */
border-color: #4a5568;
}

body.dark-mode .categoryCard:hover {
border-color: #63b3ed;
}

body.dark-mode .categoryCard h2 {
color: #e2e8f0;
}

body.dark-mode .categoryCard p,
body.dark-mode .articleCount {
color: #a0aec0;
}

body.dark-mode .searchResults {
background: #2d3748;
box-shadow: 0 1px 3px rgba(0,0,0,0.3); /* Adjust shadow for dark mode */
}

body.dark-mode .searchResults li a {
color: #e2e8f0;
}

body.dark-mode .searchResults li a:hover {
color: #63b3ed;
}

body.dark-mode .footer {
border-top-color: #4a5568;
}

body.dark-mode .footerLogo,
body.dark-mode .footerLink,
body.dark-mode .socialIcon {
color: #a0aec0;
}

body.dark-mode .footerLink:hover,
body.dark-mode .socialIcon:hover {
color: #e2e8f0;
}
15 changes: 15 additions & 0 deletions styles/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,21 @@ html, body {
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
background: #ffffff;
color: #111827;
transition: background-color 0.3s ease, color 0.3s ease;
}

/* Dark Mode Styles */
body.dark-mode {
background-color: #1a202c; /* Dark background */
color: #e2e8f0; /* Light text */
}

body.dark-mode a {
color: #63b3ed; /* Lighter blue for links in dark mode */
}

body.dark-mode a:hover {
color: #4299e1;
}

* {
Expand Down