diff --git a/src/components/oslist.tsx b/src/components/oslist.tsx index eac8d44..b85cda7 100644 --- a/src/components/oslist.tsx +++ b/src/components/oslist.tsx @@ -1,12 +1,11 @@ "use client"; import Link from "next/link"; -import { useEffect, useState } from "react"; +import { useEffect, useState, useMemo } from "react"; import { Group, OS } from "@/lib/types"; import { addBasePath } from "@/lib/env"; import { Skeleton } from "./ui/skeleton"; -import { Checkbox } from "./ui/checkbox"; function responseOK(r: Response) { if (!r.ok) { @@ -29,6 +28,30 @@ function compareVersion(a: string, b: string) { return 0; } +interface MajorGroup { + major: string; + versions: OS[]; +} + +function groupByMajor(list: OS[]): MajorGroup[] { + const bucket = new Map(); + + for (const os of list) { + const major = os.version.split(".")[0]; + if (!bucket.has(major)) { + bucket.set(major, []); + } + bucket.get(major)!.push(os); + } + + return Array.from(bucket.entries()) + .map(([major, versions]) => { + versions.sort((a, b) => compareVersion(b.version, a.version)); + return { major, versions }; + }) + .sort((a, b) => Number(b.major) - Number(a.major)); +} + export default function OSList() { const [showLess, setShowLess] = useState(true); const [loading, setLoading] = useState(true); @@ -123,7 +146,7 @@ export default function OSList() { )} {!loading && ( -
+
+
)} - {groups.map((group) => ( -
-

{group.name}

-
    - {group.list - .filter((os) => !showLess || highlights.has(os.build)) - .map((os, index) => ( -
  • - -
    -

    {os.name}

    -
    - {os.build} -
    -
    - -
  • - ))} -
-
- ))} + {groups.map((group) => { + const majorGroups = groupByMajor(group.list); + + return ( +
+

{group.name}

+ + {showLess ? ( +
    + {group.list + .filter((os) => highlights.has(os.build)) + .map((os, index) => ( +
  • + +
    +

    {os.name}

    +
    + {os.build} +
    +
    + +
  • + ))} +
+ ) : ( +
+ {majorGroups.map((majorGroup) => ( +
+

+ {group.name === "iOS" ? "iOS" : group.name === "mac" ? "macOS" : "OS X"} {majorGroup.major} +

+
    + {majorGroup.versions.map((os, index) => ( +
  • + +
    +

    {os.name}

    +
    + {os.build} +
    +
    + +
  • + ))} +
+
+ ))} +
+ )} +
+ ); + })} ); }