Skip to content

Commit 3482c59

Browse files
authored
Modernize Next.js code (#89)
* Cleanup: Remove old code replaced by repository pattern Removed: - context/SearchProvider.tsx (replaced by ToolsProvider) - components/tools/queries/ (React Query hooks no longer needed) - components/tools/listPage/ListPageComponent/ (replaced by StaticListPageComponent) - components/homepage/queries/ (homepage uses repository pattern) - components/blog/queries/ (blog uses direct file access) - components/tools/listPage/ToolsSidebar/FilterCard/utils.ts (inlined in components) API Routes Removed: - pages/api/tools.ts - pages/api/paginated-tools.ts - pages/api/tags/[type].ts - pages/api/tool/[toolId].ts - pages/api/mostViewed.ts - pages/api/popularLanguages.ts Utils-api Removed: - cache.ts (no longer using file cache) - filters.ts (filtering in ToolsFilter class) - tools.ts (replaced by ToolsRepository) - toolsWithVotes.ts (replaced by ToolsRepository.withVotes) - tags.ts (replaced by TagsRepository) - mostViewedTools.ts (replaced by StatsRepository) - popularLanguageStats.ts (replaced by StatsRepository) - toolStats.ts (replaced by StatsRepository) - stars.ts (not used) - github.ts (not used) - urls.ts (not used) Updated: - blog.ts: Removed cache dependency, use direct file access - screenshot.ts: Removed cache dependency, use in-memory cache - query.ts: Removed SearchProvider types, proper TypeScript - pages/languages/index.tsx: Use StatsRepository - pages/tag/[slug].tsx: Remove SearchProvider wrapper - pages/tool/[slug].tsx: Remove SearchProvider wrapper * Refactor AffiliateCard links to use Link component directly * Update Next.js patterns Remove passHref from Link components and add filter types - Remove unnecessary passHref prop from all Link components - Add FilterKey, FiltersState, and OnFilterChange types for tag filters - Refactor filter state and callbacks in tag page and sidebar to use new types
1 parent 88b7a8f commit 3482c59

15 files changed

Lines changed: 54 additions & 51 deletions

File tree

components/core/Footer/Footer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ const Footer: FC = () => {
4747
return (
4848
<footer className={styles.footer}>
4949
<Wrapper className={styles.wrapper}>
50-
<Link passHref href="/" className={styles.logoLink}>
50+
<Link href="/" className={styles.logoLink}>
5151
<Image
5252
height="30"
5353
width="30"

components/core/Navbar/Navbar.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ const Navbar: FC = () => {
5959
<Wrapper className={styles.wrapper}>
6060
<div className={styles.logoWrapper}>
6161
<Link
62-
passHref
6362
href="/"
6463
className={styles.logo}
6564
aria-label="Analysis Tools Homepage">

components/elements/AutocompleteSearch/AutocompleteSearch.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ interface SearchResult {
3131

3232
const Hit = (result: SearchResult) => {
3333
return (
34-
<Link href={result.hit.fields.slug} passHref>
34+
<Link href={result.hit.fields.slug}>
3535
<Highlight attribute="name" hit={result.hit} />
3636
</Link>
3737
);

components/sponsors/SponsorCard/SponsorCard.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ const SponsorCard: FC<SponsorCardProps> = ({ sponsor }) => {
2727
</div>
2828
<div className={styles.info}>
2929
<Link
30-
passHref
3130
href={`/tool/${sponsor.tool}`}
3231
className={styles.toolLink}>
3332
<Heading level={3} className={styles.toolName}>

components/tags/TagsSidebar/FilterCard/FilterCard.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { FC } from 'react';
22
import { Input } from '@components/elements';
33
import { Card } from '@components/layout';
44
import { Heading } from '@components/typography';
5+
import { FilterKey, OnFilterChange } from '@components/tags/types';
56

67
import styles from './FilterCard.module.css';
78
import classNames from 'classnames';
@@ -14,10 +15,10 @@ export interface FilterOption {
1415

1516
export interface FilterCardProps {
1617
heading: string;
17-
filter: string;
18+
filter: FilterKey;
1819
options: FilterOption[];
1920
className?: string;
20-
onFilterChange: (filter: string, value: string, checked: boolean) => void;
21+
onFilterChange: OnFilterChange;
2122
}
2223

2324
const FilterCard: FC<FilterCardProps> = ({

components/tags/TagsSidebar/FilterCard/LanguageFilterCard.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,7 @@ const RelatedCard: FC<RelatedCardProps> = ({
4848
</li>
4949
))}
5050
<li key={'all'}>
51-
<Link
52-
passHref={true}
53-
href={`/tools`}
54-
className={styles.relatedLink}>
51+
<Link href={`/tools`} className={styles.relatedLink}>
5552
<Image
5653
src={`/assets/icons/general/back.svg`}
5754
alt={'Other Languages'}

components/tags/TagsSidebar/TagsSidebar.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { BlogPreview } from '@components/blog';
33
import { ContributionCard, Newsletter } from '@components/elements';
44
import { Sidebar } from '@components/layout';
55
import { FilterCard, RelatedCard } from './FilterCard';
6+
import { OnFilterChange } from '@components/tags/types';
67
import styles from './TagsSidebar.module.css';
78

89
import {
@@ -17,7 +18,7 @@ import { LanguageFilterOption } from './FilterCard/LanguageFilterCard';
1718
export interface TagsSidebarProps {
1819
previews: ArticlePreview[];
1920
relatedLanguages: LanguageFilterOption[];
20-
onFilterChange: (filter: string, value: string, checked: boolean) => void;
21+
onFilterChange: OnFilterChange;
2122
}
2223

2324
const TagsSidebar: FC<TagsSidebarProps> = ({

components/tags/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export * from './TagsSidebar';
2+
export * from './types';

components/tags/types.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* Valid filter keys for tool filtering
3+
*/
4+
export type FilterKey = 'categories' | 'types' | 'licenses' | 'pricing';
5+
6+
/**
7+
* State object for tool filters
8+
*/
9+
export interface FiltersState {
10+
categories: string[];
11+
types: string[];
12+
licenses: string[];
13+
pricing: string[];
14+
}
15+
16+
/**
17+
* Callback type for filter changes
18+
*/
19+
export type OnFilterChange = (
20+
filter: FilterKey,
21+
value: string,
22+
checked: boolean,
23+
) => void;

components/tools/listPage/ToolCard/ToolCard.tsx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,12 @@ const ToolCard: FC<ToolCardProps> = ({ tool }) => {
4949
<Card className={styles.toolCardWrapper}>
5050
<div className={styles.votes} ref={votesRef}>
5151
<VoteWidget toolId={tool.id} />
52-
<Link
53-
passHref={true}
54-
className={styles.clickOut}
55-
href={`/tool/${tool.id}`}>
52+
<Link className={styles.clickOut} href={`/tool/${tool.id}`}>
5653
<div className={styles.clickOut} />
5754
</Link>
5855
</div>
5956
<div className={styles.info} onClick={handleElementClick}>
60-
<Link
61-
passHref
62-
href={`/tool/${tool.id}`}
63-
className={styles.toolLink}>
57+
<Link href={`/tool/${tool.id}`} className={styles.toolLink}>
6458
<Heading level={3} className={styles.toolName}>
6559
{tool.name}
6660
</Heading>

0 commit comments

Comments
 (0)