55 * LICENSE file in the root directory of this source tree.
66 */
77
8- import React , { useEffect , useState } from 'react' ;
8+ import { type PropsWithChildren , useEffect , useState } from 'react' ;
9+
910import useBaseUrl from '@docusaurus/useBaseUrl' ;
1011import useDocusaurusContext from '@docusaurus/useDocusaurusContext' ;
11- import Layout from '@theme/Layout' ;
12- import type users from '../../showcase.json' ;
13- import IconExternalLink from '../theme/Icon/ExternalLink' ;
12+ import { ShowcaseApp , ShowcaseData } from '@site/src/types' ;
1413import ThemedImage from '@theme/ThemedImage' ;
14+ import Layout from '@theme/Layout' ;
1515
16- type UserAppType = ( typeof users ) [ keyof typeof users ] [ number ] ;
17-
18- const renderApp = ( app : UserAppType , i : number ) => (
19- < AppBox app = { app } key = { `app-${ app . name } -${ i } ` } />
20- ) ;
16+ import IconExternalLink from '../theme/Icon/ExternalLink' ;
2117
2218function Section ( {
2319 children,
2420 background = 'light' ,
25- } : React . PropsWithChildren < { background ?: 'light' | 'dark' } > ) {
21+ } : PropsWithChildren < { background ?: 'light' | 'dark' } > ) {
2622 return < section className = { `Section ${ background } ` } > { children } </ section > ;
2723}
2824
29- const AppBox = ( { app} : { app : UserAppType } ) => {
25+ const AppBox = ( { app} : { app : ShowcaseApp } ) => {
3026 const imgSource = useBaseUrl (
3127 app . icon . startsWith ( 'http' ) ? app . icon : 'img/showcase/' + app . icon
3228 ) ;
@@ -57,7 +53,7 @@ const AppBox = ({app}: {app: UserAppType}) => {
5753 ) ;
5854} ;
5955
60- const renderLinks = ( app : UserAppType ) => {
56+ const renderLinks = ( app : ShowcaseApp ) => {
6157 const links = [
6258 app . linkAppStore ? (
6359 < a key = "ios" href = { app . linkAppStore } target = "_blank" >
@@ -92,15 +88,17 @@ const renderLinks = (app: UserAppType) => {
9288 return < p className = "showcaseLinks" > { links } </ p > ;
9389} ;
9490
95- const randomizeApps = apps =>
91+ const randomizeApps = ( apps : ShowcaseApp [ ] ) =>
9692 [ ...apps ] . filter ( app => ! app . group ) . sort ( ( ) => 0.5 - Math . random ( ) ) ;
9793
9894const Showcase = ( ) => {
9995 const { siteConfig} = useDocusaurusContext ( ) ;
10096 const { meta, microsoft, shopify, wix, amazon, others} = siteConfig
101- . customFields . users as typeof users ;
102- const [ pinnedRandomizedApps , setPinnedRandomizedApps ] = useState ( [ ] ) ;
103- const [ randomizedApps , setRandomizedApps ] = useState ( [ ] ) ;
97+ . customFields . users as ShowcaseData ;
98+ const [ pinnedRandomizedApps , setPinnedRandomizedApps ] = useState <
99+ ShowcaseApp [ ]
100+ > ( [ ] ) ;
101+ const [ randomizedApps , setRandomizedApps ] = useState < ShowcaseApp [ ] > ( [ ] ) ;
104102
105103 useEffect ( ( ) => {
106104 setRandomizedApps ( randomizeApps ( others . filter ( app => ! app . pinned ) ) ) ;
@@ -140,7 +138,11 @@ const Showcase = () => {
140138 Meta’s product ecosystem, from Facebook Marketplace, Messenger
141139 Desktop, Ads Manager to the Meta Quest app and many more.
142140 </ p >
143- < div className = "logos" > { meta . map ( renderApp ) } </ div >
141+ < div className = "logos" >
142+ { meta . map ( ( app , i ) => (
143+ < AppBox app = { app } key = { `app-${ app . name } -${ i } ` } />
144+ ) ) }
145+ </ div >
144146 </ div >
145147 < div className = "showcaseSection" >
146148 < h2 className = "withLogo" >
@@ -166,7 +168,11 @@ const Showcase = () => {
166168 </ a > { ' ' }
167169 for React Native Windows and macOS.
168170 </ p >
169- < div className = "logos" > { microsoft . map ( renderApp ) } </ div >
171+ < div className = "logos" >
172+ { microsoft . map ( ( app , i ) => (
173+ < AppBox app = { app } key = { `app-${ app . name } -${ i } ` } />
174+ ) ) }
175+ </ div >
170176 </ div >
171177 < div className = "showcaseSection" >
172178 < h2 className = "withLogo" >
@@ -185,7 +191,11 @@ const Showcase = () => {
185191 2016. Amazon also uses React Native to support customer-favorite
186192 devices such as the Kindle E-readers.
187193 </ p >
188- < div className = "logos" > { amazon . map ( renderApp ) } </ div >
194+ < div className = "logos" >
195+ { amazon . map ( ( app , i ) => (
196+ < AppBox app = { app } key = { `app-${ app . name } -${ i } ` } />
197+ ) ) }
198+ </ div >
189199 </ div >
190200 < div className = "showcaseSection" >
191201 < h2 className = "withLogo" >
@@ -206,7 +216,11 @@ const Showcase = () => {
206216 </ a >
207217 .
208218 </ p >
209- < div className = "logos" > { shopify . map ( renderApp ) } </ div >
219+ < div className = "logos" >
220+ { shopify . map ( ( app , i ) => (
221+ < AppBox app = { app } key = { `app-${ app . name } -${ i } ` } />
222+ ) ) }
223+ </ div >
210224 </ div >
211225 < div className = "showcaseSection" >
212226 < h2 className = "withLogo" >
@@ -225,13 +239,21 @@ const Showcase = () => {
225239 variety of open source projects. Wix is an early adopter of React
226240 Native and uses it for its entire suite of applications.
227241 </ p >
228- < div className = "logos" > { wix . map ( renderApp ) } </ div >
242+ < div className = "logos" >
243+ { wix . map ( ( app , i ) => (
244+ < AppBox app = { app } key = { `app-${ app . name } -${ i } ` } />
245+ ) ) }
246+ </ div >
229247 </ div >
230248 < div className = "showcaseSection showcaseCustomers" >
231249 < h2 > Users Showcase</ h2 >
232250 < div className = "logos" >
233- { pinnedRandomizedApps . map ( renderApp ) }
234- { randomizedApps . map ( renderApp ) }
251+ { pinnedRandomizedApps . map ( ( app , i ) => (
252+ < AppBox app = { app } key = { `app-${ app . name } -${ i } ` } />
253+ ) ) }
254+ { randomizedApps . map ( ( app , i ) => (
255+ < AppBox app = { app } key = { `app-${ app . name } -${ i } ` } />
256+ ) ) }
235257 </ div >
236258 </ div >
237259 </ Section >
0 commit comments