import * as icons from './icons' export type FooterItem = { label: string url?: string Icon?: React.ElementType } export type FooterConfig = { copyright: FooterItem[] main: FooterItem[] legal: FooterItem[] } export const config: FooterConfig = { copyright: [{ label: `© ${new Date().getFullYear()} Chainlink Foundation` }], legal: [ { label: 'Privacy Policy', url: 'https://chain.link/privacy-policy' }, { label: 'Terms of Service', url: 'https://chain.link/terms' }, ], main: [ { label: 'Developers', url: 'https://dev.chain.link' }, { label: 'Use Cases', url: 'https://chain.link/use-cases' }, { label: 'Community', url: 'https://chain.link/community' }, ], } export type ExpandedFooterConfig = Record export const expandedConfig: ExpandedFooterConfig = { Developers: [ { label: 'Docs', url: 'https://docs.chain.link/' }, { label: 'Faucets', url: 'https://faucets.chain.link/' }, { label: 'Developer Hub', url: 'https://dev.chain.link/' }, { label: 'Chainlink Hackathon', url: 'https://chain.link/hackathon' }, { label: 'Bootcamp', url: 'https://chain.link/bootcamp' }, { label: 'Use Cross-Chain (CCIP)', url: 'https://docs.chain.link/ccip' }, { label: 'Use Data Feeds', url: 'https://docs.chain.link/data-feeds/price-feeds', }, { label: 'Use Randomness (VRF)', url: 'https://docs.chain.link/vrf/v2/introduction', }, { label: 'Use Automation', url: 'https://docs.chain.link/chainlink-automation/introduction', }, { label: 'Use Functions', url: 'https://docs.chain.link/chainlink-functions', }, { label: 'Node Operators', url: 'https://docs.chain.link/chainlink-nodes', }, ], Products: [ { label: 'Cross-Chain', url: 'https://chain.link/cross-chain' }, { label: 'Data Streams', url: 'https://chain.link/data-streams' }, { label: 'Market and Data Feeds', url: 'https://chain.link/data-feeds' }, { label: 'Functions', url: 'https://chain.link/functions' }, { label: 'VRF', url: 'https://chain.link/vrf' }, { label: 'Automation', url: 'https://chain.link/automation' }, { label: 'Proof of Reserve', url: 'https://chain.link/proof-of-reserve' }, ], 'Use Cases': [ { label: 'Overview', url: 'https://chain.link/use-cases' }, { label: 'Asset Tokenization', url: 'https://chain.link/use-cases/asset-tokenization', }, { label: 'Financial Services', url: 'https://chain.link/use-cases/financial-services', }, { label: 'DeFi', url: 'https://chain.link/use-cases/defi' }, { label: 'Gaming', url: 'https://chain.link/use-cases/gaming' }, { label: 'NFT Collectibles', url: 'https://chain.link/use-cases/nft-collectibles', }, { label: 'Climate Markets', url: 'https://chain.link/use-cases/climate-markets', }, { label: 'Enterprise', url: 'https://chain.link/use-cases/enterprise' }, { label: 'Insurance', url: 'https://chain.link/use-cases/insurance' }, ], Community: [ { label: 'Community Overview', url: 'https://chain.link/community' }, { label: 'Grant Program', url: 'https://chain.link/community/grants' }, { label: 'Events', url: 'https://chain.link/community/events' }, { label: 'Become an Advocate', url: 'https://chain.link/advocates', }, { label: 'Code of Conduct', url: 'https://chain.link/code-of-conduct' }, ], Resources: [ { label: 'Whitepaper', url: 'https://chain.link/whitepaper' }, { label: 'Case Studies', url: 'https://chain.link/case-studies' }, { label: 'Tech Talks', url: 'https://chain.link/techtalks' }, { label: 'Blog', url: 'https://blog.chain.link' }, { label: 'Economics', url: 'https://chain.link/economics' }, { label: 'Staking', url: 'https://chain.link/economics/staking' }, { label: 'Rewards', url: 'https://rewards.chain.link' }, { label: 'FAQs', url: 'https://chain.link/faqs' }, { label: 'Education Hub', url: 'https://chain.link/education' }, { label: 'What Is DeFi?', url: 'https://chain.link/education/defi' }, { label: 'What Is an Oracle?', url: 'https://chain.link/education/blockchain-oracles', }, { label: 'What Is a Smart Contract?', url: 'https://chain.link/education/smart-contracts', }, { label: 'What Is an NFT?', url: 'https://chain.link/education/nfts' }, { label: 'What Is Web3?', url: 'https://chain.link/education/web3' }, { label: 'What is Asset Tokenization?', url: 'https://chain.link/education/asset-tokenization', }, ], Chainlink: [ { label: 'Ecosystem', url: 'https://chain.link/ecosystem' }, { label: 'Data Providers', url: 'https://chain.link/ecosystem/data-providers', }, { label: 'Press', url: 'https://chain.link/press' }, { label: 'Team', url: 'https://chain.link/team' }, { label: 'Circulating Supply', url: 'https://chain.link/circulating-supply', }, { label: 'Careers', url: 'https://chainlinklabs.com/careers' }, { label: 'Brand Assets', url: 'https://chain.link/brand-assets' }, { label: 'Chainlink Badging', url: 'https://chain.link/badge' }, ], Contact: [ { label: 'Security', url: 'https://chain.link/security' }, { label: 'Support', url: 'https://chain.link/support' }, { label: 'Custom Chainlinks', url: 'mailto:custom@chain.link' }, { label: 'Press Inquiries', url: 'mailto:press@chain.link' }, { label: 'Legal Support', url: 'https://chain.link/legal' }, { label: 'Legal', url: 'mailto:legal@chain.link' }, ], Social: [ { label: 'X', url: 'https://x.com/chainlink', Icon: icons['X'], }, { label: 'LinkedIn', url: 'https://www.linkedin.com/company/chainlink-labs', Icon: icons['LinkedIn'], }, { label: 'YouTube', url: 'https://www.youtube.com/chainlinkofficial', Icon: icons['YouTube'], }, { label: 'Instagram', url: 'https://www.instagram.com/chainlinklabs', Icon: icons['Instagram'], }, { label: 'TikTok', url: ' https://www.tiktok.com/@chainlink.official', Icon: icons['TikTok'], }, { label: 'Discord', url: 'https://discord.gg/aSK4zew', Icon: icons['Discord'], }, { label: 'Telegram', url: 'https://t.me/chainlinkofficial', Icon: icons['Telegram'], }, { label: 'Reddit', url: 'https://www.reddit.com/r/Chainlink/', Icon: icons['Reddit'], }, { label: 'Facebook', url: 'https://www.facebook.com/chainlink.smartcontract/', Icon: icons['Facebook'], }, { label: 'WeChat', url: 'https://blog.chain.link/chainlink-chinese-communities/', Icon: icons['WeChat'], }, ], } export function extendFooter( extraFooterConfig?: Partial, ): FooterConfig { const newConfig = { ...config } for (const key in extraFooterConfig) { const configKey = key as keyof FooterConfig if (!extraFooterConfig[configKey]) { continue } // config = { copyright: [] }, if (!Array.isArray(newConfig[configKey])) { newConfig[configKey] = [] } newConfig[configKey] = [...newConfig[configKey]] extraFooterConfig[configKey].forEach((item) => { // if there's an existing item with the same label, overwrite it const existingConfig = newConfig[configKey].find( (i) => i.label === item.label, ) if (existingConfig) { existingConfig.url = item.url existingConfig.Icon = item.Icon return } // otherwise, add it newConfig[configKey].push(item) }) } return newConfig } export function extendExpandedFooter( extraExpandedFooterConfig?: ExpandedFooterConfig, ): ExpandedFooterConfig { const newConfig = { ...expandedConfig } for (const key in extraExpandedFooterConfig) { // newConfig = { Developers: [] } newConfig[key] = [...(newConfig[key] ?? [])] // newConfig = { Developers: [...] } newConfig[key].push(...(extraExpandedFooterConfig[key] ?? [])) } return newConfig }