Skip to content

Commit f1cd677

Browse files
Fix: Removing type failure and Restructring ambassadors page (#1173)
* fix:restructring ambassadors page * Ambassador type fix * reverting the changes related to imports * fix: amabassadors import statement fixed * route fix
1 parent 6f36321 commit f1cd677

File tree

6 files changed

+65
-46
lines changed

6 files changed

+65
-46
lines changed
File renamed without changes.

pages/ambassadors/components/AmbassadorCard.tsx renamed to components/AmbassadorsCard.tsx

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
import React, { useState } from 'react';
22
import Image from 'next/image';
3-
// import { Github, Twitter, Linkedin } from 'lucide-react';
43

5-
// Define the types for the `ambassador` prop
64
interface Contribution {
75
title: string;
8-
date?: { month: string; year: number };
6+
date?: {
7+
month: string;
8+
year: number;
9+
};
910
link: string;
1011
type: string;
1112
}
1213

13-
interface Ambassador {
14+
export interface Ambassador {
1415
img?: string;
1516
name?: string;
1617
title?: string;
@@ -24,29 +25,23 @@ interface Ambassador {
2425
contributions?: Contribution[];
2526
}
2627

27-
interface AmbassadorCardProps {
28-
ambassador: Ambassador;
29-
}
30-
31-
type SocialPlatform = 'github' | 'twitter' | 'mastodon' | 'linkedin';
28+
type SocialIcons = 'github' | 'twitter' | 'mastodon' | 'linkedin';
3229

33-
// Utility function to generate full URLs for social media
3430
const getSocialMediaUrl = (
35-
platform: SocialPlatform,
31+
platform: SocialIcons,
3632
username: string | undefined,
3733
) => {
38-
const baseUrls: Record<SocialPlatform, string> = {
34+
const baseUrls: Record<SocialIcons, string> = {
3935
github: 'https://github.com/',
4036
twitter: 'https://twitter.com/',
41-
mastodon: 'https://mastodon.social/',
37+
mastodon: 'https://fosstodon.org/',
4238
linkedin: 'https://www.linkedin.com/in/',
4339
};
4440
return username ? baseUrls[platform] + username : undefined;
4541
};
4642

47-
// Social media icon component with proper typing
48-
const SocialIcon: React.FC<{ platform: SocialPlatform }> = ({ platform }) => {
49-
const icons: Record<SocialPlatform, JSX.Element> = {
43+
const SocialIcon = ({ platform }: { platform: SocialIcons }) => {
44+
const icons: Record<SocialIcons, JSX.Element> = {
5045
github: (
5146
<svg
5247
className='w-7 h-7 text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100'
@@ -70,11 +65,24 @@ const SocialIcon: React.FC<{ platform: SocialPlatform }> = ({ platform }) => {
7065
linkedin: (
7166
<svg
7267
className='w-7 h-7 text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100'
73-
viewBox='0 0 24 24'
68+
viewBox='0 0 310 310'
7469
fill='currentColor'
7570
xmlns='http://www.w3.org/2000/svg'
7671
>
77-
<path d='M22.225 0H1.771C.792 0 0 .775 0 1.729V22.27c0 .955.793 1.729 1.771 1.729h20.451c.978 0 1.778-.775 1.778-1.729V1.729C24 .774 23.203 0 22.225 0zM7.113 20.452H3.56V8.997h3.552v11.455zm-1.78-13.044a2.073 2.073 0 1 1 0-4.145 2.073 2.073 0 0 1 0 4.145zm15.34 13.044h-3.552v-5.697c0-1.357-.027-3.1-1.892-3.1-1.892 0-2.182 1.48-2.182 3.003v5.794H10.84V8.997h3.412v1.568h.049c.474-.896 1.637-1.84 3.37-1.84 3.604 0 4.268 2.371 4.268 5.451v6.276h-.002z' />
72+
<path
73+
d='M72.16,99.73H9.927c-2.762,0-5,2.239-5,5v199.928c0,2.762,2.238,5,5,5H72.16c2.762,0,5-2.238,5-5V104.73
74+
C77.16,101.969,74.922,99.73,72.16,99.73z'
75+
/>
76+
<path
77+
d='M41.066,0.341C18.422,0.341,0,18.743,0,41.362C0,63.991,18.422,82.4,41.066,82.4
78+
c22.626,0,41.033-18.41,41.033-41.038C82.1,18.743,63.692,0.341,41.066,0.341z'
79+
/>
80+
<path
81+
d='M230.454,94.761c-24.995,0-43.472,10.745-54.679,22.954V104.73c0-2.761-2.238-5-5-5h-59.599
82+
c-2.762,0-5,2.239-5,5v199.928c0,2.762,2.238,5,5,5h62.097c2.762,0,5-2.238,5-5v-98.918c0-33.333,9.054-46.319,32.29-46.319
83+
c25.306,0,27.317,20.818,27.317,48.034v97.204c0,2.762,2.238,5,5,5H305c2.762,0,5-2.238,5-5V194.995
84+
C310,145.43,300.549,94.761,230.454,94.761z'
85+
/>
7886
</svg>
7987
),
8088
mastodon: (
@@ -91,7 +99,7 @@ const SocialIcon: React.FC<{ platform: SocialPlatform }> = ({ platform }) => {
9199
return icons[platform];
92100
};
93101

94-
const AmbassadorCard: React.FC<AmbassadorCardProps> = ({ ambassador }) => {
102+
const AmbassadorCard = ({ ambassador }: { ambassador: Ambassador }) => {
95103
const [showContributions, setShowContributions] = useState(false);
96104
const [imgSrc, setImgSrc] = useState(
97105
ambassador.img || '/api/placeholder/400/320',
@@ -106,8 +114,7 @@ const AmbassadorCard: React.FC<AmbassadorCardProps> = ({ ambassador }) => {
106114
contributions = [],
107115
} = ambassador;
108116

109-
// Available social platforms with proper typing
110-
const socialPlatforms: SocialPlatform[] = [
117+
const SocialIconss: SocialIcons[] = [
111118
'github',
112119
'twitter',
113120
'mastodon',
@@ -116,7 +123,6 @@ const AmbassadorCard: React.FC<AmbassadorCardProps> = ({ ambassador }) => {
116123

117124
return (
118125
<div className='relative max-w-sm md:max-w-md lg:max-w-lg mx-auto bg-white dark:bg-gray-800 shadow-lg rounded-lg overflow-hidden my-4 transition-all duration-300 h-fit'>
119-
{/* Black Borders */}
120126
<div className='absolute top-0 right-0 w-1 h-20 bg-black dark:bg-gray-400'></div>
121127
<div className='absolute bottom-100 right-0 w-20 h-1 bg-black dark:bg-gray-400'></div>
122128
<div className='absolute bottom-0 left-0 w-1 h-20 bg-black dark:bg-gray-400'></div>
@@ -151,9 +157,8 @@ const AmbassadorCard: React.FC<AmbassadorCardProps> = ({ ambassador }) => {
151157
</p>
152158
)}
153159

154-
{/* Social Media Links */}
155160
<div className='flex justify-center mb-4'>
156-
{socialPlatforms.map((platform) => {
161+
{SocialIconss.map((platform) => {
157162
const username = ambassador[platform];
158163
return username ? (
159164
<a
@@ -170,7 +175,6 @@ const AmbassadorCard: React.FC<AmbassadorCardProps> = ({ ambassador }) => {
170175
})}
171176
</div>
172177

173-
{/* Button to Show/Hide Contributions */}
174178
{contributions.length > 0 && (
175179
<button
176180
onClick={() => setShowContributions(!showContributions)}
@@ -182,7 +186,6 @@ const AmbassadorCard: React.FC<AmbassadorCardProps> = ({ ambassador }) => {
182186
</button>
183187
)}
184188

185-
{/* Contributions Section (Toggled) */}
186189
{showContributions && contributions.length > 0 && (
187190
<div className='mt-4'>
188191
<h4 className='text-lg font-semibold mb-2 text-gray-900 dark:text-white'>

pages/ambassadors/components/AmbassadorList.tsx renamed to components/AmbassadorsList.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
import React from 'react';
22

3-
interface AmbassadorLink {
3+
interface AmbassadorsLink {
44
title: string;
55
icon: string;
66
details: string;
77
}
88

9-
interface AmbassadorListProps {
9+
interface AmbassadorsListProps {
1010
ambassadorList: {
11-
contents: AmbassadorLink[];
11+
contents: AmbassadorsLink[];
1212
};
1313
}
1414

15-
const AmbassadorList: React.FC<AmbassadorListProps> = ({ ambassadorList }) => {
15+
const AmbassadorList = ({ ambassadorList }: AmbassadorsListProps) => {
1616
return (
1717
<ul className='mt-10 grid grid-cols-1 gap-8 px-5 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-3'>
1818
{ambassadorList.contents.map((link) => (

context.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export const SectionContext = React.createContext<
2020
| 'getting-started'
2121
| 'reference'
2222
| 'roadmap'
23+
| 'ambassador'
2324
>(null);
2425
export const BlockContext = React.createContext<BlockContextValue | null>(null);
2526
export const FullMarkdownContext = React.createContext<string | null>(null);
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
},
1313
{
1414
"title": "Give talks",
15-
"details": "Speak at meetups and conferences; well help with slides, abstract submissions, and travel budget.",
15+
"details": "Speak at meetups and conferences; we'll help with slides, abstract submissions, and travel budget.",
1616
"icon": "/img/ambassadors/illustrations/speaker.png"
1717
},
1818
{

pages/ambassadors/index.page.tsx

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,34 @@ import React from 'react';
22
import { getLayout } from '~/components/SiteLayout';
33
import { SectionContext } from '~/context';
44

5-
import ambassadorsBanner from '../../public/img/community/ambassadors.png';
6-
import AmbassadorBanner from './components/AmbassadorBanner';
7-
import ambassadorData from '../../data/ambassadors.json';
8-
import AmbassadorCard from './components/AmbassadorCard';
9-
import ambassadorList from '../../data/ambassador_lists.json';
5+
import ambassadorList from '~/data/ambassadors-contributions.json';
6+
import ambassadorsBanner from '~/public/img/community/ambassadors.png';
107

118
import Image from 'next/image';
129

13-
import AmbassadorList from './components/AmbassadorList';
10+
import fs from 'fs';
1411

15-
export default function communityPages() {
12+
import AmbassadorBanner from '~/components/AmbassadorsBanner';
13+
import AmbassadorCard, { type Ambassador } from '~/components/AmbassadorsCard';
14+
import AmbassadorList from '~/components/AmbassadorsList';
15+
16+
export async function getStaticProps() {
17+
const ambassadorData = fs.readFileSync('data/ambassadors.json', 'utf-8');
18+
19+
return {
20+
props: {
21+
ambassadorData,
22+
},
23+
};
24+
}
25+
26+
export default function ambassadorPages({
27+
ambassadorData,
28+
}: {
29+
ambassadorData: any;
30+
}) {
1631
return (
17-
<SectionContext.Provider value='community'>
32+
<SectionContext.Provider value='ambassador'>
1833
<div
1934
className='max-w-screen-xl block px-4 sm:px-6 lg:px-8 mx-auto w-full'
2035
data-testid='Container-main'
@@ -23,7 +38,6 @@ export default function communityPages() {
2338
className='flex flex-col items-center justify-between lg:flex-row mt-20'
2439
data-testid='Ambassadors-main'
2540
>
26-
{/* Left Section with Title, Description, and Button */}
2741
<div
2842
className='w-full text-center lg:w-[45%] lg:text-left'
2943
data-testid='Ambassadors-content'
@@ -34,7 +48,7 @@ export default function communityPages() {
3448
>
3549
Become a JSON Schema Ambassador
3650
</h1>
37-
<p className='mt-5 text-slate-500 text-lg text-gray-700 dark:text-slate-100'>
51+
<p className='mt-5 text-slate-700 text-lg dark:text-slate-100'>
3852
The JSON Schema Ambassadors Program recognizes the people who
3953
drive adoption, innovation, and knowledge sharing in the JSON
4054
Schema community.
@@ -51,7 +65,6 @@ export default function communityPages() {
5165
</div>
5266
</div>
5367

54-
{/* Right Section with Image */}
5568
<div className='hidden w-1/2 lg:block'>
5669
<Image
5770
src={ambassadorsBanner}
@@ -89,9 +102,11 @@ export default function communityPages() {
89102
</section>
90103
<div className=' flex justify-center container m-auto p-auto'>
91104
<div className='grid md:grid-cols-2 lg:grid-cols-3 gap-6'>
92-
{ambassadorData.map((ambassador, index) => (
93-
<AmbassadorCard key={index} ambassador={ambassador} />
94-
))}
105+
{JSON.parse(ambassadorData).map(
106+
(ambassador: Ambassador, index: number) => (
107+
<AmbassadorCard key={index} ambassador={ambassador} />
108+
),
109+
)}
95110
</div>
96111
</div>
97112
<div className='flex justify-center p-auto'>
@@ -102,4 +117,4 @@ export default function communityPages() {
102117
);
103118
}
104119

105-
communityPages.getLayout = getLayout;
120+
ambassadorPages.getLayout = getLayout;

0 commit comments

Comments
 (0)