Skip to content
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

F/numberflow #902

Merged
merged 7 commits into from
Dec 5, 2024
Merged
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
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
"@mdx-js/react": "^3.1.0",
"@next/bundle-analyzer": "^14.2.15",
"@next/mdx": "^15.0.3",
"@number-flow/react": "^0.4.2",
"@react-email/components": "^0.0.28",
"@react-email/render": "^1.0.3",
"@t3-oss/env-core": "^0.11.1",
Expand Down
28 changes: 28 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion src/components/Analytics/Fathom.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ export const TrackPageView = ({ siteId }: { siteId: string }) => {
Fathom.load(siteId, {
auto: false,
});
}, []);
});

// Record a pageview when route changes
useEffect(() => {
Expand Down
5 changes: 2 additions & 3 deletions src/components/NewsletterSignup/NewsletterBannerDetailed.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
import React, { useEffect, useState } from 'react';
import useNewsletterStats from '@hooks/useNewsletterStats';
import { Code, CornerRightDown, Rocket, Zap } from 'lucide-react';
import { usePostHog } from 'posthog-js/react';

import { Avatar } from '@components/Avatar';
import { Badge } from '@components/Badge';
import { Headshot } from '@components/Headshot';
import { SubscriptionForm } from '@components/SubscriptionForm';
import SubscriberCount from './SubscriberCount';

const NewsletterBannerDetailed = () => {
const posthog = usePostHog();
const { subscriberCount } = useNewsletterStats();
const [titleIndex, setTitleIndex] = useState(0);

// calculate the number of days until the next Tuesday
Expand Down Expand Up @@ -89,7 +88,7 @@ const NewsletterBannerDetailed = () => {
<p className="mb-2 text-gray-500">
Join{' '}
<span className="font-bold text-pink-600">
{subscriberCount ?? 'thousands of'}
<SubscriberCount />
</span>{' '}
developers, founders, and product builders getting smarter every
week.
Expand Down
6 changes: 2 additions & 4 deletions src/components/NewsletterSignup/NewsletterBannerFancy.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
import useNewsletterStats from '@hooks/useNewsletterStats';

import config from '../../config';
import { Heading } from '../Heading';
import { Headshot } from '../Headshot';
import SponsorCTA from '../SponsorCTA/SponsorCTA';
import { SubscriptionForm } from '../SubscriptionForm';
import SubscriberCount from './SubscriberCount';

const NewsletterSignup: React.FC = () => {
const { subscriberCount } = useNewsletterStats();
return (
<div className="mb-4 flex flex-row text-justify">
<div className="mx-auto my-0 flex max-w-[800px] flex-col justify-center border border-solid border-gray-200 bg-white px-8 py-4">
Expand All @@ -21,7 +19,7 @@ const NewsletterSignup: React.FC = () => {
<p className="font-futura font-bold uppercase">
Subscribe and join{' '}
<span className="text-pink-600">
{subscriberCount ? `🔥 ${subscriberCount}` : ''}
🔥 <SubscriberCount />{' '}
</span>{' '}
other builders
</p>
Expand Down
5 changes: 2 additions & 3 deletions src/components/NewsletterSignup/NewsletterBannerSimple.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import React from 'react';
import useNewsletterStats from '@hooks/useNewsletterStats';

import config from '../../config';
import { SubscriptionForm } from '../SubscriptionForm';
import SubscriberCount from './SubscriberCount';

const SimpleNewsletterBanner: React.FC = () => {
const { subscriberCount } = useNewsletterStats();
return (
<div className="mx-auto max-w-screen-xl py-8">
<div className="items-center justify-between gap-16 rounded-lg bg-gray-700 p-8 text-white lg:flex lg:gap-24">
Expand All @@ -17,7 +16,7 @@ const SimpleNewsletterBanner: React.FC = () => {
<p>
Join{' '}
<span className="text-xl font-extrabold text-pink-600">
{subscriberCount ?? ''}
<SubscriberCount />
</span>{' '}
other product builders, indie hackers, and startup founders.
</p>
Expand Down
8 changes: 2 additions & 6 deletions src/components/NewsletterSignup/NewsletterHero.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
import useNewsletterStats from '@hooks/useNewsletterStats';

import { Heading } from '@components/Heading';
import { Image } from '@components/Image';
import { SubscriptionForm } from '@components/SubscriptionForm';
import SubscriberCount from './SubscriberCount';

const NewsletterHero = () => {
const { subscriberCount } = useNewsletterStats();

return (
<section
className="-ml-4 w-screen bg-gray-950 py-0"
Expand Down Expand Up @@ -51,8 +48,7 @@ const NewsletterHero = () => {
<p className="max-w-[600px] text-lg">
Join{' '}
<span className="text-pink-400">
{subscriberCount ? <span>{subscriberCount}</span> : 'the'}{' '}
other product builders
<SubscriberCount /> other product builders
</span>
{', '}
and start shipping today!
Expand Down
23 changes: 23 additions & 0 deletions src/components/NewsletterSignup/SubscriberCount.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import useNewsletterStats from '@hooks/useNewsletterStats';
import NumberFlow from '@number-flow/react';

type SubscriberCountProps = {
label?: string;
};

const SubscriberCount: React.FC<SubscriberCountProps> = ({ label }) => {
const { subscriberCount } = useNewsletterStats();
return (
<NumberFlow
value={subscriberCount}
suffix={label}
format={{
notation: 'standard', // set to 'compact' for "1.1K" style
useGrouping: false, // don't display commas
}}
className="tabular-nums"
/>
);
};

export default SubscriberCount;
6 changes: 2 additions & 4 deletions src/components/SiteAnnouncement/SiteAnnouncement.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
import Link from 'next/link';
import useNewsletterStats from '@hooks/useNewsletterStats';

import SubscriberCount from '@components/NewsletterSignup/SubscriberCount';
import clsxm from '@utils/clsxm';

type SiteAnnouncementProps = {
className?: string;
};
const SiteAnnouncement: React.FC<SiteAnnouncementProps> = ({ className }) => {
const { subscriberCount } = useNewsletterStats();

return (
<div
className={clsxm(
Expand All @@ -32,7 +30,7 @@ const SiteAnnouncement: React.FC<SiteAnnouncementProps> = ({ className }) => {
Join
<span className="font-bold text-pink-600">
{' '}
{subscriberCount ?? 'other'} builders{' '}
<SubscriberCount /> other builders{' '}
</span>
&mdash; Get tips from a YC startup founder & ex-Googler. Subscribe to
💌 Tiny Improvements
Expand Down
14 changes: 13 additions & 1 deletion src/hooks/useNewsletterStats.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,24 @@ const useNewsletterStats = () => {

const { data: subscriberCount } = subscriberCountQuery;

const randomMax = 987;
const randomMin = 931;
const COUNT_TO_SHOW_WHILE_LOADING = getRandomNumberBetween(
randomMin,
randomMax
);

return {
subscriberCount: subscriberCount?.subscribers,
subscriberCount:
subscriberCount?.subscribers ?? COUNT_TO_SHOW_WHILE_LOADING,
refreshStats: () => {
void subscriberCountQuery.refetch();
},
};
};

const getRandomNumberBetween = (min: number, max: number) => {
return Math.floor(Math.random() * (max - min + 1)) + min;
};

export default useNewsletterStats;
18 changes: 8 additions & 10 deletions src/pages/newsletter/index.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import type { GetStaticProps } from 'next';
import useNewsletterStats from '@hooks/useNewsletterStats';

import { Heading } from '@components/Heading';
import NewsletterItem from '../../components/NewsletterFeed/NewsletterItem';
import NewsletterSignup from '../../components/NewsletterSignup';
import SEO from '../../components/seo';
import SponsorCTA from '../../components/SponsorCTA/SponsorCTA';
import { SubscriptionForm } from '../../components/SubscriptionForm';
import { Subtitle } from '../../components/Subtitle';
import NewsletterItem from '@components/NewsletterFeed/NewsletterItem';
import NewsletterSignup from '@components/NewsletterSignup';
import SubscriberCount from '@components/NewsletterSignup/SubscriberCount';
import SEO from '@components/seo';
import SponsorCTA from '@components/SponsorCTA/SponsorCTA';
import { SubscriptionForm } from '@components/SubscriptionForm';
import { Subtitle } from '@components/Subtitle';
import config from '../../config';
import type { Newsletter } from '../../data/content-types';
import { getAllNewsletters } from '../../lib/newsletters';
Expand All @@ -27,8 +27,6 @@ type NewsletterPageProps = {
};

const NewsletterPage: React.FC<NewsletterPageProps> = ({ newsletters }) => {
const { subscriberCount } = useNewsletterStats();

const [latestNewsletter, ...pastNewsletters] = newsletters;

return (
Expand All @@ -54,7 +52,7 @@ const NewsletterPage: React.FC<NewsletterPageProps> = ({ newsletters }) => {
<p className="text-xl">
Join{' '}
<span style={{ fontWeight: 'bold' }}>
{subscriberCount ?? 'the'} other product builders
<SubscriberCount /> other product builders
</span>{' '}
and get it delivered straight to your inbox by filling out this happy
lil&apos; form:
Expand Down
Loading