'use client' import Link from 'next/link' import { useEffect, useState } from 'react' import { Button } from './button' import { Container } from './container' import { Heading, Lead, Subheading } from './text' function Person({ name, description, img, contributions, }: { name: string description: string img: string contributions: number }) { return (
  • {name}

    {description}

    {contributions} contribution(s)

  • ) } type TeamObject = { login: string avatar_url: string contributions: number type: 'User' } const descriptionOverride: { [key: string]: string } = { DecDuck: 'Lead Maintainer', quexeky: 'Maintainer', } export function Team() { const [team, setTeam] = useState | null>(null) useEffect(() => { ;(async () => { const cached = window.localStorage.getItem('team') if (cached) { const cachedData = JSON.parse(cached) if (cachedData.created + 1000 * 60 * 60 * 24 * 1 > Date.now()) { setTeam(cachedData.team) return } } const dropTeam: Array = await ( await fetch('https://api.github.com/repos/Drop-OSS/drop/contributors') ).json() const dropAppTeam: Array = await ( await fetch( 'https://api.github.com/repos/Drop-OSS/drop-app/contributors', ) ).json() const teamObj: { [key: string]: TeamObject } = {} for (const user of [...dropTeam, ...dropAppTeam]) { if (user.login === 'weblate' || user.type !== 'User') continue if (teamObj[user.login]) { teamObj[user.login].contributions += user.contributions } else { teamObj[user.login] = user } } const team = Object.values(teamObj).sort( (a, b) => b.contributions - a.contributions, ) window.localStorage.setItem( 'team', JSON.stringify({ team, created: Date.now() }), ) setTeam(team) })() }, []) return ( Meet the developers Who's behind Drop? Drop OSS was started by privacy and FOSS advocates who know a little code.

    Drop OSS was started, mostly on a whim, in response to frustrations with the controlled nature of DRM games, and the missing comforts of DRM-free games. Since then, we've put together a small circle of dedicated maintainers and contributors to develop Drop and all its amazing features.

    If you know a little code, you can help out! We heavily encourage contributions, especially if you're passionate about the project and enjoy writing code. We use a variety of stacks across the various projects we maintain, but we predominantly use Vue, Rust, and Typescript.

    The team
      {team && team.map((member) => ( ))}
    ) }