Skip to content

feat: init stats page refresh (WIP/ON HOLD) #547

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 60 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 28 commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
87e33ed
feat: init stats page refresh!
Logannford Mar 24, 2025
b3727f0
feat: work on stats page hero component
Logannford Mar 24, 2025
7f54d04
feat: stats hero chart tooltip work.
Logannford Mar 24, 2025
72a8e78
feat: stats page layout issues, minor changes to hero chart
Logannford Mar 24, 2025
77962e6
trying to fix chart svg height
Logannford Mar 24, 2025
0fa1973
feat: some minor progress
Logannford Mar 25, 2025
16c7dbc
feat: adds difficulty radial chart story
Logannford Mar 25, 2025
90667a4
feat: work getting RSC's working with storybook
Logannford Mar 25, 2025
d188bc4
feat: correctly rendering rsc's in storybook
Logannford Mar 25, 2025
15f3171
feat: function abstraction, stories created.
Logannford Mar 25, 2025
b22308d
feat: messing around with different styling for question history block
Logannford Mar 25, 2025
9413370
minor work
Logannford Mar 25, 2025
917a3aa
feat: styling work with question history component
Logannford Mar 26, 2025
8b433da
progress with question history block
Logannford Mar 26, 2025
e1143c5
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Mar 26, 2025
31f17be
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Mar 26, 2025
7ca3910
feat: adds new DifficultyRadialChart to homepage
Logannford Mar 26, 2025
c09a40e
minor changes to story and revert to rsc
Logannford Mar 26, 2025
17aee2d
chore: adds tremor area chart & new directory for charts
Logannford Mar 26, 2025
515b949
feat: adds story for total-question-chart
Logannford Mar 26, 2025
cb97c95
chore: minor cleanup
Logannford Mar 26, 2025
a866d8a
feat: some story work, adds new color to chart utils & custom tooltip
Logannford Mar 27, 2025
e8a52d0
progress with stories.
Logannford Mar 27, 2025
55240df
minor style changes
Logannford Mar 27, 2025
d4354f4
feat: adding spark charts (will be used elsewhere in the app)
Logannford Mar 27, 2025
29ba732
feat: tooltip style changes & total question chart style changes
Logannford Mar 27, 2025
72f1eb4
more work with total questions chart.
Logannford Mar 27, 2025
c5401c5
style amends
Logannford Mar 27, 2025
6f9f46f
feat: adds bar-list and story added.
Logannford Mar 27, 2025
b542d5d
feat: adding separators to stats charts
Logannford Mar 27, 2025
66f430f
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Mar 27, 2025
b797a80
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Mar 28, 2025
6042d90
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Mar 28, 2025
7394872
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Mar 29, 2025
bf8819a
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Mar 29, 2025
1fc6ce7
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Mar 30, 2025
436b3ad
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Mar 30, 2025
eec0ca1
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Mar 30, 2025
e2df550
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Mar 31, 2025
961178a
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Mar 31, 2025
9b5b931
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Apr 1, 2025
2fae587
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Apr 2, 2025
b7fccbb
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Apr 2, 2025
cfbf9d5
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Apr 3, 2025
f796cce
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Apr 4, 2025
be7a4fd
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Apr 5, 2025
2732d94
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Apr 5, 2025
2a330eb
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Apr 6, 2025
c203d41
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Apr 8, 2025
b381f69
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Apr 9, 2025
5275e0d
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Apr 9, 2025
441abb2
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Apr 9, 2025
e59086e
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Apr 10, 2025
2ec35bc
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Apr 12, 2025
09dd2f2
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Apr 18, 2025
74941d1
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Apr 19, 2025
c16c723
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Apr 20, 2025
3ec1695
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Apr 20, 2025
7019c72
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Apr 22, 2025
f7604d7
Merge branch 'main' into improvement/stats-page-ui-improvements
Logannford Apr 23, 2025
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
19 changes: 19 additions & 0 deletions .storybook/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Server Components with Storybook

This document provides guidance on how to use server components with Storybook in our Next.js App Router application.

## The Challenge

Storybook does not natively support React Server Components (RSC). When trying to use server components directly in Storybook, you'll encounter errors because:

1. Server components cannot be imported directly into client components
2. Server-side data fetching methods don't work in the Storybook environment
3. Async components are not supported in the current Storybook setup

## Our Solution

We use a simple pattern to render server components in Storybook:

1. Wrap the server component in a Suspense boundary
2. Import the server component directly in the story file
3. Let the experimental RSC support in Storybook handle the rendering
3 changes: 3 additions & 0 deletions .storybook/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,8 @@ const config: StorybookConfig = {
name: '@storybook/experimental-nextjs-vite',
options: {},
},
features: {
experimentalRSC: true,
},
};
export default config;
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
"@radix-ui/react-tabs": "^1.1.2",
"@radix-ui/react-tooltip": "^1.1.3",
"@react-email/components": "0.0.31",
"@remixicon/react": "4.6.0",
"@stripe/react-stripe-js": "^2.8.1",
"@stripe/stripe-js": "^4.8.0",
"@supabase/ssr": "^0.5.1",
Expand Down
22 changes: 10 additions & 12 deletions src/app/(app)/(default_layout)/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,18 @@ import UserXp from '@/components/ui/user-xp';

export default function StatisticsLayout({ children }: Readonly<{ children: React.ReactNode }>) {
return (
<div className="text-white flex flex-col gap-y-4 relative h-full">
<div className="container">
<div className="flex w-full items-center container">
<div className="flex-1">
<SidebarLayoutTrigger />
</div>
<div className="flex items-center gap-x-3">
<CurrentStreak />
<UserXp />
<UpgradeModal />
</div>
<div className="text-white flex flex-col gap-y-4 relative h-full container">
<div className="flex w-full items-center">
<div className="flex-1">
<SidebarLayoutTrigger />
</div>
<div className="flex items-center gap-x-3">
<CurrentStreak />
<UserXp />
<UpgradeModal />
</div>
</div>
<div className="container">{children}</div>
{children}
</div>
);
}
97 changes: 63 additions & 34 deletions src/app/(app)/(default_layout)/statistics/page.tsx
Original file line number Diff line number Diff line change
@@ -1,22 +1,42 @@
import StatsRangePicker from '@/components/app/statistics/range-picker';
import QuestionChart from '@/components/app/statistics/total-question-chart';
import dynamic from 'next/dynamic';

import { useUserServer } from '@/hooks/use-user-server';
import { StatsSteps } from '@/types/Stats';
import StatsRangePicker from '@/components/app/statistics/range-picker';
import QuestionChart from '@/components/charts/total-question-chart';
import QuestionHistory from '@/components/app/statistics/question-history';

import { STATISTICS } from '@/utils/constants';
const DifficultyRadialChart = dynamic(
() => import('@/components/app/statistics/difficulty-radial-chart'),
{ ssr: false }
);

import { getData } from '@/utils/data/statistics/get-stats-chart-data';
import Hero from '@/components/shared/hero';
import SuggestedQuestions from '@/components/app/statistics/suggested-questions';
import StatisticsReport from '@/components/app/statistics/statistics-report';
import StatisticsOverviewMenu from '@/components/app/statistics/statistics-overview-menu';
import StatisticsReport from '@/components/app/statistics/statistics-report';
import QuestionTracker from '@/components/app/statistics/question-tracker';

export const metadata = {
title: 'Statistics | techblitz',
description: 'View your coding statistics and progress',
};
import { useUserServer } from '@/hooks/use-user-server';
import { StatsSteps } from '@/types/Stats';

import { STATISTICS } from '@/utils/constants';
import { getData } from '@/utils/data/statistics/get-stats-chart-data';
import { createMetadata } from '@/utils/seo';
import { getUserDisplayName } from '@/utils/user';
import { getRecentUserAnswers } from '@/utils/data/answers/get-user-answer';

export async function generateMetadata() {
return createMetadata({
title: 'Statistics | TechBlitz',
description:
'Dive into your current coding journey, track your progress, and gain insight on how to improve your skills.',
image: {
text: 'Statistics | TechBlitz',
bgColor: '#000',
textColor: '#fff',
},
canonicalUrl: '/statistics',
});
}

export default async function StatisticsPage({
searchParams,
Expand All @@ -33,36 +53,45 @@ export default async function StatisticsPage({
const range = (searchParams.range as StatsSteps) || '7d';
const { step } = STATISTICS[range];

// Prefetch data
const { stats } = await getData({
userUid: user.uid,
from: range,
to: new Date().toISOString(),
step,
});
// Prefetch data - get both time-grouped and overall stats
const [timeGroupedStats, overallStats, recentAnswers] = await Promise.all([
getData({
userUid: user.uid,
from: range,
to: new Date().toISOString(),
step,
includeDifficultyData: true,
}),
getData({
userUid: user.uid,
from: 'all',
to: new Date().toISOString(),
includeDifficultyData: true,
}),
getRecentUserAnswers({ take: 10 }),
]);

return (
<div>
<div className="flex flex-col gap-3 md:flex-row w-full justify-between md:items-center">
<div className="space-y-6">
<div className="flex flex-col gap-3 md:flex-row w-full justify-between">
<Hero
heading="Coding Journey"
heading={`${getUserDisplayName(user)}'s Statistics`}
container={false}
subheading="An overview of your coding journey on TechBlitz."
subheading="Dive into your coding journey, track your progress, and gain insight on how to improve your skills."
gridPosition="top-right"
/>
<div className="flex gap-3">
<StatsRangePicker selectedRange={STATISTICS[range].label} />
<StatisticsOverviewMenu user={user} />
</div>
{overallStats.stats && (
<DifficultyRadialChart questionData={overallStats.stats} legend={false} />
)}
</div>

<div className="grid grid-cols-12 gap-y-4 gap-x-8 mt-8 md:mt-0">
<div className="max-h-[28rem] col-span-12 mb-4">
{stats && <QuestionChart questionData={stats} step={step} />}
<div className="grid grid-cols-12 gap-4">
{/* Question History - Recent answers */}
<div className="col-span-12 md:col-span-6 lg:col-span-4">
<QuestionHistory recentAnswers={recentAnswers} />
</div>
<div className="col-span-12 md:col-span-6 lg:col-span-8">
<QuestionChart questionData={timeGroupedStats.stats} step={step} />
</div>
{stats && <QuestionTracker className="mb-4" stats={stats} step={step} range={range} />}
{/** suggested q's and analysis blocks TODO: CHANGE SUGGESTED QUESTIONS TO STREAK DATA (I THINK) */}
<SuggestedQuestions />
<StatisticsReport />
</div>
</div>
);
Expand Down
12 changes: 10 additions & 2 deletions src/app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@

--color-secondary: #ffffff;
--color-accent: #5b61d6;

/* Add HSL format for accent color that Tailwind expects */
--accent: 237 65% 64%; /* HSL values for #5b61d6 */
--accent-foreground: 0 0% 100%; /* White text on accent */
}

/* Define explicitly for dark mode as well */
.dark {
--accent: 237 65% 64%; /* Same accent color in dark mode */
--accent-foreground: 0 0% 100%;
}

body {
Expand Down Expand Up @@ -265,8 +275,6 @@ html {
--secondary-foreground: 240 5.9% 10%;
--muted: 240 4.8% 95.9%;
--muted-foreground: 240 3.8% 46.1%;
--accent: 237 59.3% 60%;
--accent-foreground: 240 5.9% 10%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 0 0% 98%;
--border: 240 5.9% 90%;
Expand Down
2 changes: 1 addition & 1 deletion src/components/app/navigation/sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ export function AppSidebar({ user, profile, suggestion }: AppSidebarProps) {
url: '/statistics',
icon: BChart3,
tooltip: 'Statistics',
defaultOpen: false,
defaultOpen: true,
subItems: [
{
title: 'Overview',
Expand Down
2 changes: 1 addition & 1 deletion src/components/app/roadmaps/[uid]/roadmap-stats-chart.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
ChartContainer,
ChartTooltip,
ChartTooltipContent,
} from '@/components/ui/chart';
} from '@/components/charts/chart';
import { UserRoadmapsWithAnswers } from '@/types/Roadmap';

const chartConfig = {
Expand Down
Loading