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
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
@reference "../../../../styles/index.css";

.partnerIcon {
.big {
@apply flex
h-28
max-h-28
Expand All @@ -17,3 +17,15 @@
!w-auto;
}
}

.small {
@apply h-9
w-auto
min-w-9
p-2;
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
p-2;

This padding isn't needed in this new layout. In fact, it actually makes the icons not padded enough


svg {
@apply !h-4
!w-auto;
}
}
26 changes: 26 additions & 0 deletions apps/site/components/Common/Partners/PartnerButton/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import Button from '#site/components/Common/Button';

import type { AnchorHTMLAttributes, FC } from 'react';

import style from './index.module.css';

type PartnerProps = AnchorHTMLAttributes<HTMLAnchorElement> & {
size?: 'big' | 'small';
};

const PartnerButton: FC<PartnerProps> = ({
href,
size = 'small',
...props
}) => (
<Button
kind="secondary"
href={`${href}/?utm_source=nodejs-website&utm_medium=Link`}
rel="sponsored noopener"
target="_blank"
className={style[size]}
{...props}
/>
);

export default PartnerButton;

This file was deleted.

37 changes: 0 additions & 37 deletions apps/site/components/Common/Partners/PartnerIcon/index.tsx

This file was deleted.

30 changes: 0 additions & 30 deletions apps/site/components/Common/Partners/PartnerLogo/index.tsx

This file was deleted.

This file was deleted.

41 changes: 0 additions & 41 deletions apps/site/components/Common/Partners/PartnersIconList/index.tsx

This file was deleted.

This file was deleted.

44 changes: 0 additions & 44 deletions apps/site/components/Common/Partners/PartnersLogoList/index.tsx

This file was deleted.

22 changes: 22 additions & 0 deletions apps/site/components/Common/Partners/index.module.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
@reference "../../../styles/index.css";

.small {
@apply flex
flex-row
flex-wrap
items-center
gap-2;
}

.big {
@apply grid
w-full
grid-cols-[repeat(auto-fill,minmax(240px,1fr))]
gap-4;
}

.tooltip {
@apply p-2
text-neutral-900
dark:text-neutral-200;
}
92 changes: 92 additions & 0 deletions apps/site/components/Common/Partners/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
'use server';

import Tooltip from '@node-core/ui-components/Common/Tooltip';
import * as PartnerLogos from '@node-core/ui-components/Icons/PartnerLogos';

import { providePartners } from '#site/next-data/providers/partners';
import { partners as allPartners } from '#site/next.json.mjs';
Comment on lines +6 to +7
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
import { providePartners } from '#site/next-data/providers/partners';
import { partners as allPartners } from '#site/next.json.mjs';
import providePartners from '#site/next-data/providers/partners';
import { partners } from '#site/next.json.mjs';


import type { Partner, PartnerCategory } from '#site/types';
import type { FC } from 'react';

import PartnerButton from './PartnerButton';

import style from './index.module.css';

type PartnersListProps = {
size?: 'big' | 'small';
category?: PartnerCategory;
sort?: 'name' | 'weight';
length?: number;
};

const getPartners = async (
length?: number,
category?: PartnerCategory,
sort?: 'name' | 'weight'
) => {
let result: Array<Partner>;

if (sort === 'name') {
// For name sorting, just filter and sort directly - no need for weighted shuffling
const filtered = category
? allPartners.filter(p => p.categories.includes(category))
: allPartners;
result = filtered.toSorted((a, b) => a.name.localeCompare(b.name));
} else {
// For weight sorting, use cached weighted partners
const minutes = 300; // Change every 5 minutes
const seed = Math.floor(Date.now() / (minutes * 1000));
result = await providePartners(seed, category);
}

return length ? result.slice(0, length) : result;
};
Comment on lines +23 to +44
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO providePartners should take no arguments. Each time the cache expires (every few minutes), it'll re-run, calculating the seed each time.

Suggested change
const getPartners = async (
length?: number,
category?: PartnerCategory,
sort?: 'name' | 'weight'
) => {
let result: Array<Partner>;
if (sort === 'name') {
// For name sorting, just filter and sort directly - no need for weighted shuffling
const filtered = category
? allPartners.filter(p => p.categories.includes(category))
: allPartners;
result = filtered.toSorted((a, b) => a.name.localeCompare(b.name));
} else {
// For weight sorting, use cached weighted partners
const minutes = 300; // Change every 5 minutes
const seed = Math.floor(Date.now() / (minutes * 1000));
result = await providePartners(seed, category);
}
return length ? result.slice(0, length) : result;
};
const getPartners = async (
length?: number,
category?: PartnerCategory,
sort?: 'name' | 'weight'
) => {
let result = sort === 'name' ? partners : await providePartners();
result = category
? result.filter(p => p.categories.includes(category))
: result;
return length ? result.slice(0, length) : result;
};


const renderSmallPartner = (partner: Partner) => {
const Logo = PartnerLogos[partner.id as keyof typeof PartnerLogos];

return (
<Tooltip
key={partner.id}
content={<div className={style.tooltip}>{partner.name}</div>}
>
<PartnerButton size="small" href={partner.href}>
<Logo.Favicon />
</PartnerButton>
</Tooltip>
);
};

const renderBigPartner = (partner: Partner) => {
const Logo = PartnerLogos[partner.id as keyof typeof PartnerLogos];

return (
<PartnerButton key={partner.id} size="big" href={partner.href}>
<Logo.Logo />
</PartnerButton>
);
};

const PartnersList: FC<PartnersListProps> = async ({
size = 'small',
category,
sort = 'name',
length,
}) => {
const isSmall = size === 'small';

const partners = await getPartners(
length ?? (isSmall ? 6 : undefined),
category,
sort
);

return (
<div className={style[size]}>
{partners.map(isSmall ? renderSmallPartner : renderBigPartner)}
</div>
);
};

export default PartnersList;
24 changes: 0 additions & 24 deletions apps/site/components/Common/Partners/utils.ts

This file was deleted.

4 changes: 2 additions & 2 deletions apps/site/components/Common/Supporters/index.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import Avatar from '@node-core/ui-components/Common/AvatarGroup/Avatar';

import type { Supporters } from '#site/types';
import type { Supporter } from '#site/types';
import type { FC } from 'react';

type SupportersListProps = {
supporters: Array<Supporters>;
supporters: Array<Supporter<'opencollective'>>;
};

const SupportersList: FC<SupportersListProps> = ({ supporters }) => (
Expand Down
Loading
Loading