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
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

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

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

{!isLoading && !isLoadingMore && entries.length === 0 && (
<div className="py-12 text-center">
Expand Down
39 changes: 39 additions & 0 deletions app/fund/activity/FundActivityPageContent.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
'use client';

import { useInView } from 'react-intersection-observer';
import { ActivityCardFull } from '@/components/Activity/ActivityCardFull';
import { ActivityCardSkeleton } from '@/components/Activity/ActivityCardSkeleton';
import { useActivityFeed } from '@/hooks/useActivityFeed';

export function FundActivityPageContent() {
const { entries, isLoading, isLoadingMore, hasMore, loadMore } = useActivityFeed({});

const { ref: sentinelRef } = useInView({
threshold: 0,
rootMargin: '200px',
onChange: (inView) => {
if (inView && hasMore && !isLoading && !isLoadingMore) {
loadMore();
}
},
});

return (
<div>
{entries.map((entry) => (
<ActivityCardFull key={entry.id} entry={entry} />
))}

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

Check warning on line 28 in app/fund/activity/FundActivityPageContent.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-5t7uSP1NBD9GnfoL2&open=AZ-5t7uSP1NBD9GnfoL2&pullRequest=905

Check warning on line 28 in app/fund/activity/FundActivityPageContent.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-5t7uSP1NBD9GnfoL1&open=AZ-5t7uSP1NBD9GnfoL1&pullRequest=905

{!isLoading && !isLoadingMore && entries.length === 0 && (
<div className="py-12 text-center">
<p className="text-gray-500">No activity found</p>
</div>
)}

{!isLoading && !isLoadingMore && hasMore && <div ref={sentinelRef} className="h-10" />}
</div>
);
}
16 changes: 16 additions & 0 deletions app/fund/activity/loading.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { PageLayout } from '@/app/layouts/PageLayout';
import { FundingBannerSkeleton } from '@/components/Funding/FundingBannerSkeleton';
import { ActivityCardSkeleton } from '@/components/Activity/ActivityCardSkeleton';
import { FundSidebar } from '@/components/Funding/FundSidebar';

export default function FundActivityLoading() {
return (
<PageLayout topBanner={<FundingBannerSkeleton showTabs />} rightSidebar={<FundSidebar />}>
<div>
{[...Array(6)].map((_, i) => (

Check warning on line 10 in app/fund/activity/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-5t7uaP1NBD9GnfoL3&open=AZ-5t7uaP1NBD9GnfoL3&pullRequest=905
<ActivityCardSkeleton key={i} />

Check warning on line 11 in app/fund/activity/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-5t7uaP1NBD9GnfoL4&open=AZ-5t7uaP1NBD9GnfoL4&pullRequest=905
))}
</div>
</PageLayout>
);
}
39 changes: 39 additions & 0 deletions app/fund/activity/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { Metadata } from 'next';
import { buildOpenGraphMetadata } from '@/lib/metadata';
import { PageLayout } from '@/app/layouts/PageLayout';
import { HeroHeader } from '@/components/ui/HeroHeader';
import { MarketplaceCards } from '@/components/Funding/MarketplaceCards';
import { FundingHeroPanel } from '@/components/Funding/FundingHeroPanel';
import { OpenFundingOpportunityCTA } from '../OpenFundingOpportunityCTA';
import { FundActivityPageContent } from './FundActivityPageContent';
import { FundSidebar } from '@/components/Funding/FundSidebar';

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

export default async function FundActivityPage() {
return (
<PageLayout
topBanner={
<HeroHeader
title="Activity"
subtitle={
<p className="text-sm sm:text-base text-gray-500">
Recent activity across funding opportunities and proposals.
</p>
}
cta={<FundingHeroPanel primaryCta={<OpenFundingOpportunityCTA />} />}
alignTop
>
<MarketplaceCards selected="activity" />
</HeroHeader>
}
rightSidebar={<FundSidebar />}
>
<FundActivityPageContent />
</PageLayout>
);
}
8 changes: 2 additions & 6 deletions app/fund/loading.tsx
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
import { PageLayout } from '@/app/layouts/PageLayout';
import { ActivitySidebarSkeleton } from '@/components/Funding/ActivitySidebarSkeleton';
import { FundingBannerSkeleton } from '@/components/Funding/FundingBannerSkeleton';
import { FeedItemSkeleton } from '@/components/Feed/FeedItemSkeleton';
import { FundSidebar } from '@/components/Funding/FundSidebar';

export default function FundLoading() {
return (
<PageLayout
topBanner={<FundingBannerSkeleton showTabs />}
rightSidebar={<ActivitySidebarSkeleton />}
>
<PageLayout topBanner={<FundingBannerSkeleton showTabs />} rightSidebar={<FundSidebar />}>
<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>

{/* Feed skeletons */}
<div className="mt-4 space-y-8">
{Array.from({ length: 3 }, (_, i) => (
<FeedItemSkeleton key={i} variant="grant" />
Expand Down
14 changes: 4 additions & 10 deletions app/fund/page.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
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 { FundSidebar } from '@/components/Funding/FundSidebar';

export const metadata: Metadata = buildOpenGraphMetadata({
title: 'Funding Opportunities',
title: 'Request for Proposals',
description: 'Apply for funding opportunities via proposals.',
url: '/fund',
});
Expand All @@ -21,7 +19,7 @@ export default async function FundPage() {
<PageLayout
topBanner={
<HeroHeader
title="Funding Opportunities"
title="Request for Proposals"
subtitle={
<p className="text-sm sm:text-base text-gray-500">
Apply for funding opportunities via proposals.
Expand All @@ -33,11 +31,7 @@ export default async function FundPage() {
<MarketplaceCards selected="grants" />
</HeroHeader>
}
rightSidebar={
<Suspense fallback={<ActivitySidebarSkeleton />}>
<FundingSidebarServer />
</Suspense>
}
rightSidebar={<FundSidebar />}
>
<section className="sr-only">
<p>
Expand Down
7 changes: 2 additions & 5 deletions app/fund/proposals/loading.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
import { PageLayout } from '@/app/layouts/PageLayout';
import { ActivitySidebarSkeleton } from '@/components/Funding/ActivitySidebarSkeleton';
import { FundingBannerSkeleton } from '@/components/Funding/FundingBannerSkeleton';
import { FeedItemSkeleton } from '@/components/Feed/FeedItemSkeleton';
import { FundSidebar } from '@/components/Funding/FundSidebar';

export default function FundProposalsLoading() {
return (
<PageLayout
topBanner={<FundingBannerSkeleton showTabs />}
rightSidebar={<ActivitySidebarSkeleton />}
>
<PageLayout topBanner={<FundingBannerSkeleton showTabs />} rightSidebar={<FundSidebar />}>
<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" />
Expand Down
10 changes: 2 additions & 8 deletions app/fund/proposals/page.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,16 @@
import { Suspense } from 'react';
import { Metadata } from 'next';
import Link from 'next/link';
import { ArrowUpFromLine } from 'lucide-react';
import { buildOpenGraphMetadata } from '@/lib/metadata';
import { PageLayout } from '@/app/layouts/PageLayout';
import { ProposalFeed } from '@/components/Funding/ProposalFeed';
import { ProposalSortAndFilters } from '@/components/Funding/ProposalSortAndFilters';
import { FundingSidebarServer } from '@/components/Funding/FundingSidebarServer';
import { ActivitySidebarSkeleton } from '@/components/Funding/ActivitySidebarSkeleton';
import { HeroHeader } from '@/components/ui/HeroHeader';
import { Button } from '@/components/ui/Button';
import { SubmitProposalTooltip } from '@/components/tooltips/SubmitProposalTooltip';
import { MarketplaceCards } from '@/components/Funding/MarketplaceCards';
import { FundingHeroPanel } from '@/components/Funding/FundingHeroPanel';
import { FundSidebar } from '@/components/Funding/FundSidebar';

export const metadata: Metadata = buildOpenGraphMetadata({
title: 'Proposals',
Expand Down Expand Up @@ -54,11 +52,7 @@ export default async function FundProposalsPage() {
<MarketplaceCards selected="proposals" />
</HeroHeader>
}
rightSidebar={
<Suspense fallback={<ActivitySidebarSkeleton />}>
<FundingSidebarServer />
</Suspense>
}
rightSidebar={<FundSidebar />}
>
<div>
<ProposalSortAndFilters />
Expand Down
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
1 change: 1 addition & 0 deletions app/layouts/topbar/pageRoutes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ export const ROOT_NAVIGATION_PATHS = new Set([
'/earn',
'/fund',
'/fund/proposals',
'/fund/activity',
'/journal',
'/notebook',
'/browse',
Expand Down
1 change: 1 addition & 0 deletions app/sitemap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ const STATIC_ROUTES: MetadataRoute.Sitemap = [
{ url: `${SITE_URL}/latest`, changeFrequency: 'hourly', priority: 0.8 },
{ url: `${SITE_URL}/fund`, changeFrequency: 'daily', priority: 0.8 },
{ url: `${SITE_URL}/fund/proposals`, changeFrequency: 'daily', priority: 0.7 },
{ url: `${SITE_URL}/fund/activity`, changeFrequency: 'hourly', priority: 0.7 },
{ url: `${SITE_URL}/earn`, changeFrequency: 'daily', priority: 0.8 },
{ url: `${SITE_URL}/grants`, changeFrequency: 'daily', priority: 0.7 },
{ url: `${SITE_URL}/journal`, changeFrequency: 'daily', priority: 0.7 },
Expand Down
Loading