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
16 changes: 16 additions & 0 deletions app/(home)/fund/loading.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { FeedItemSkeleton } from '@/components/Feed/FeedItemSkeleton';

export default function FundLoading() {
return (
<div>
<div className="flex items-center justify-end mt-2 sm:mt-4 mb-2">
<div className="h-5 w-24 rounded bg-gray-200 animate-pulse" />
</div>
<div className="mt-4 space-y-8">
{Array.from({ length: 3 }, (_, i) => (
<FeedItemSkeleton key={i} variant="grant" />
))}
</div>
</div>
);
}
38 changes: 5 additions & 33 deletions app/fund/page.tsx → app/(home)/fund/page.tsx
Original file line number Diff line number Diff line change
@@ -1,44 +1,16 @@
import { Suspense } from 'react';
import { Metadata } from 'next';
import { buildOpenGraphMetadata } from '@/lib/metadata';
import { PageLayout } from '@/app/layouts/PageLayout';
import { FundingSidebarServer } from '@/components/Funding/FundingSidebarServer';
import { ActivitySidebarSkeleton } from '@/components/Funding/ActivitySidebarSkeleton';
import { HeroHeader } from '@/components/ui/HeroHeader';
import { FundGrantsPageContent } from './FundGrantsPageContent';
import { MarketplaceCards } from '@/components/Funding/MarketplaceCards';
import { FundingHeroPanel } from '@/components/Funding/FundingHeroPanel';
import { OpenFundingOpportunityCTA } from './OpenFundingOpportunityCTA';
import { FundGrantsPageContent } from '@/app/fund/FundGrantsPageContent';

export const metadata: Metadata = buildOpenGraphMetadata({
title: 'Funding Opportunities',
title: 'Fund',
description: 'Apply for funding opportunities via proposals.',
url: '/fund',
});

export default async function FundPage() {
export default function FundPage() {
return (
<PageLayout
topBanner={
<HeroHeader
title="Funding Opportunities"
subtitle={
<p className="text-sm sm:text-base text-gray-500">
Apply for funding opportunities via proposals.
</p>
}
cta={<FundingHeroPanel primaryCta={<OpenFundingOpportunityCTA />} />}
alignTop
>
<MarketplaceCards selected="grants" />
</HeroHeader>
}
rightSidebar={
<Suspense fallback={<ActivitySidebarSkeleton />}>
<FundingSidebarServer />
</Suspense>
}
>
<>
<section className="sr-only">
<p>
ResearchHub provides direct funding pathways for scientific research. Browse open funding
Expand Down Expand Up @@ -75,6 +47,6 @@ export default async function FundPage() {
</p>
</section>
<FundGrantsPageContent />
</PageLayout>
</>
);
}
16 changes: 16 additions & 0 deletions app/(home)/fund/proposals/loading.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { FeedItemSkeleton } from '@/components/Feed/FeedItemSkeleton';

export default function FundProposalsLoading() {
return (
<div>
<div className="flex items-center justify-end mt-2 sm:mt-4 mb-2">
<div className="h-4 w-24 rounded bg-gray-200 animate-pulse" />
</div>
<div className="mt-4 space-y-8">
{Array.from({ length: 3 }, (_, i) => (
<FeedItemSkeleton key={i} variant="fundraise" />
))}
</div>
</div>
);
}
19 changes: 19 additions & 0 deletions app/(home)/fund/proposals/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { Metadata } from 'next';
import { buildOpenGraphMetadata } from '@/lib/metadata';
import { ProposalFeed } from '@/components/Funding/ProposalFeed';
import { ProposalSortAndFilters } from '@/components/Funding/ProposalSortAndFilters';

export const metadata: Metadata = buildOpenGraphMetadata({
title: 'Proposals',
description: 'Propose research, get reviewed, receive funding.',
url: '/fund/proposals',
});

export default function FundProposalsPage() {
return (
<div>
<ProposalSortAndFilters />
<ProposalFeed />
</div>
);
}
19 changes: 19 additions & 0 deletions app/(home)/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { ReactNode } from 'react';
import { PageLayout } from '@/app/layouts/PageLayout';
import { FundSidebar } from '@/components/Funding/FundSidebar';
import { HomeTabs } from '@/components/Funding/HomeTabs';

/**
* Shared shell for homepage hub tabs (Activity / Fund / Proposals).
* Keeps PageLayout, HomeTabs, and FundSidebar mounted while only the feed slot swaps.
*
* `/fund/dashboard` lives outside this group and keeps its own layout.
*/
export default function HomeLayout({ children }: { children: ReactNode }) {

Check warning on line 12 in app/(home)/layout.tsx

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Mark the props of the component as read-only.

See more on https://sonarcloud.io/project/issues?id=ResearchHub_web&issues=AZ-9SB-x_sm3M2mrhZhM&open=AZ-9SB-x_sm3M2mrhZhM&pullRequest=905
return (
<PageLayout rightSidebar={<FundSidebar />}>
<HomeTabs />
{children}
</PageLayout>
);
}
11 changes: 11 additions & 0 deletions app/(home)/loading.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { ActivityCardSkeleton } from '@/components/Activity/ActivityCardSkeleton';

export default function HomeLoading() {
return (
<div>
{[...Array(6)].map((_, i) => (

Check warning on line 6 in app/(home)/loading.tsx

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Use `new Array()` instead of `Array()`.

See more on https://sonarcloud.io/project/issues?id=ResearchHub_web&issues=AZ-9SCEm_sm3M2mrhZhN&open=AZ-9SCEm_sm3M2mrhZhN&pullRequest=905
<ActivityCardSkeleton key={i} />

Check warning on line 7 in app/(home)/loading.tsx

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Do not use Array index in keys

See more on https://sonarcloud.io/project/issues?id=ResearchHub_web&issues=AZ-9SCEm_sm3M2mrhZhO&open=AZ-9SCEm_sm3M2mrhZhO&pullRequest=905
))}
</div>
);
}
13 changes: 13 additions & 0 deletions app/(home)/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { Metadata } from 'next';
import { buildOpenGraphMetadata } from '@/lib/metadata';
import { FundActivityPageContent } from '@/components/Funding/FundActivityPageContent';

export const metadata: Metadata = buildOpenGraphMetadata({
title: 'Activity',
description: 'Recent activity across funding opportunities and proposals.',
url: '/',
});

export default function HomeActivityPage() {
return <FundActivityPageContent />;
}
2 changes: 1 addition & 1 deletion app/about/components/CTASection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ export const CTASection = () => {
{
kind: 'action',
label: 'Join ResearchHub',
onAction: () => showAuthModal(() => router.push('/popular')),
onAction: () => showAuthModal(() => router.push('/')),
},
{ kind: 'link', href: '/fund', label: 'Fund science', external: true },
];
Expand Down
5 changes: 3 additions & 2 deletions app/activity/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import { HeroHeader } from '@/components/ui/HeroHeader';
import { PillTabs } from '@/components/ui/PillTabs';
import { ActivityCardFull } from '@/components/Activity/ActivityCardFull';
import { ActivityCardSkeletonList } from '@/components/Activity/ActivityCardSkeleton';
import { ActivityCardSkeleton } from '@/components/Activity/ActivityCardSkeleton';
import { useActivityFeed, ActivityTab } from '@/hooks/useActivityFeed';
import { ActivityScope } from '@/services/activity.service';
import { GrantService } from '@/services/grant.service';
Expand Down Expand Up @@ -106,7 +106,8 @@
<ActivityCardFull key={entry.id} entry={entry} />
))}

{(isLoading || isLoadingMore) && <ActivityCardSkeletonList />}
{(isLoading || isLoadingMore) &&
[...Array(6)].map((_, i) => <ActivityCardSkeleton key={i} />)}

Check warning on line 110 in app/activity/page.tsx

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Use `new Array()` instead of `Array()`.

See more on https://sonarcloud.io/project/issues?id=ResearchHub_web&issues=AZ9cZN_bmgmoNAKmU2pQ&open=AZ9cZN_bmgmoNAKmU2pQ&pullRequest=905

Check warning on line 110 in app/activity/page.tsx

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Do not use Array index in keys

See more on https://sonarcloud.io/project/issues?id=ResearchHub_web&issues=AZ7MwV9dUM3U-UaN9XDy&open=AZ7MwV9dUM3U-UaN9XDy&pullRequest=905

{!isLoading && !isLoadingMore && entries.length === 0 && (
<div className="py-12 text-center">
Expand Down
2 changes: 1 addition & 1 deletion app/expert-finder/ExpertFinderClientLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export default function ExpertFinderClientLayout({ children }: ExpertFinderClien

useEffect(() => {
if (!isLoading && !canAccessExpertFinder) {
router.push('/popular');
router.push('/');
}
}, [isLoading, canAccessExpertFinder, router]);

Expand Down
26 changes: 0 additions & 26 deletions app/fund/loading.tsx

This file was deleted.

25 changes: 0 additions & 25 deletions app/fund/proposals/loading.tsx

This file was deleted.

69 changes: 0 additions & 69 deletions app/fund/proposals/page.tsx

This file was deleted.

7 changes: 1 addition & 6 deletions app/grant/[id]/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,10 @@
const work = await getGrant(id);

const grant = work.note?.post?.grant;
const grantId = grant?.id ?? undefined;

Check warning on line 41 in app/grant/[id]/[slug]/page.tsx

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Remove this useless assignment to variable "grantId".

See more on https://sonarcloud.io/project/issues?id=ResearchHub_web&issues=AZ9cZOCWmgmoNAKmU2pR&open=AZ9cZOCWmgmoNAKmU2pR&pullRequest=905

return (
<GrantContentSwitcher
content={work.previewContent}
imageUrl={work.image}
hasDescription={!!grant?.description}
grantId={grantId}
>
<GrantContentSwitcher content={work.previewContent} imageUrl={work.image}>
{grant?.description && <ProposalSortAndFilters />}
<ProposalFeed />
</GrantContentSwitcher>
Expand Down
Loading