···1-import { Metadata } from "next";
23-import { PronounsResponse } from "@/typings";
4import { getCanonicalUrl } from "@/utils/urls";
56import List from "../list.component";
···1+import type { Metadata } from "next";
23+import type { PronounsResponse } from "@/typings";
4import { getCanonicalUrl } from "@/utils/urls";
56import List from "../list.component";
+3-3
app/(home)/bot/pronouns/layout.tsx
···1-import { Metadata } from "next";
2import { Montserrat, Patrick_Hand } from "next/font/google";
3import Image from "next/image";
4import Link from "next/link";
···10import ImageGrid from "@/components/image-grid";
11import { defaultFetchOptions } from "@/lib/api";
12import ArrowPic from "@/public/icons/arroww.webp";
13-import { ApiV1TopguildsGetResponse } from "@/typings";
14import { cn } from "@/utils/cn";
15import { getBaseUrl, getCanonicalUrl } from "@/utils/urls";
16···51export default async function RootLayout({
52 children
53}: {
54- children: React.ReactNode
55}) {
56 const topGuilds = await fetch(`${process.env.NEXT_PUBLIC_API}/top-guilds`, defaultFetchOptions)
57 .then((res) => res.json())
···1+import type { Metadata } from "next";
2import { Montserrat, Patrick_Hand } from "next/font/google";
3import Image from "next/image";
4import Link from "next/link";
···10import ImageGrid from "@/components/image-grid";
11import { defaultFetchOptions } from "@/lib/api";
12import ArrowPic from "@/public/icons/arroww.webp";
13+import type { ApiV1TopguildsGetResponse } from "@/typings";
14import { cn } from "@/utils/cn";
15import { getBaseUrl, getCanonicalUrl } from "@/utils/urls";
16···51export default async function RootLayout({
52 children
53}: {
54+ children: React.ReactNode;
55}) {
56 const topGuilds = await fetch(`${process.env.NEXT_PUBLIC_API}/top-guilds`, defaultFetchOptions)
57 .then((res) => res.json())
+2-3
app/(home)/bot/pronouns/list.component.tsx
···2import { HiAcademicCap } from "react-icons/hi";
34import Ad from "@/components/ad";
5-import { PronounsResponse } from "@/typings";
67interface Props {
8 res: PronounsResponse;
9 type: string;
10}
1112-export default async function List({ res, type }: Props) {
13-14 return (
15 <div>
16 <div className="w-full flex items-center justify-between mb-2">
···2import { HiAcademicCap } from "react-icons/hi";
34import Ad from "@/components/ad";
5+import type { PronounsResponse } from "@/typings";
67interface Props {
8 res: PronounsResponse;
9 type: string;
10}
1112+export default function List({ res, type }: Props) {
013 return (
14 <div>
15 <div className="w-full flex items-center justify-between mb-2">
···1-import { Metadata } from "next";
23-import { PronounsResponse } from "@/typings";
4import { getCanonicalUrl } from "@/utils/urls";
56import List from "../list.component";
···1+import type { Metadata } from "next";
23+import type { PronounsResponse } from "@/typings";
4import { getCanonicalUrl } from "@/utils/urls";
56import List from "../list.component";
+2-2
app/(home)/bot/pronouns/sexualities/page.tsx
···1-import { Metadata } from "next";
23-import { PronounsResponse } from "@/typings";
4import { getCanonicalUrl } from "@/utils/urls";
56import List from "../list.component";
···1+import type { Metadata } from "next";
23+import type { PronounsResponse } from "@/typings";
4import { getCanonicalUrl } from "@/utils/urls";
56import List from "../list.component";
+3-3
app/(home)/debug/page.tsx
···1-import { Metadata } from "next";
2import { cookies, headers } from "next/headers";
3import Link from "next/link";
4import { HiTrash } from "react-icons/hi";
···1011import Panel from "./panel.component";
1213-export const generateMetadata = async (): Promise<Metadata> => {
14 const title = "Shiggy";
15 const description = "";
16 const url = getCanonicalUrl("debug");
···44};
4546export default async function Home() {
47- const headerList: { name: string, value: string }[] = [];
48 for (const [key, value] of (await headers()).entries()) {
49 headerList.push({ name: key, value });
50 }
···1+import type { Metadata } from "next";
2import { cookies, headers } from "next/headers";
3import Link from "next/link";
4import { HiTrash } from "react-icons/hi";
···1011import Panel from "./panel.component";
1213+export const generateMetadata = (): Metadata => {
14 const title = "Shiggy";
15 const description = "";
16 const url = getCanonicalUrl("debug");
···44};
4546export default async function Home() {
47+ const headerList: { name: string; value: string; }[] = [];
48 for (const [key, value] of (await headers()).entries()) {
49 headerList.push({ name: key, value });
50 }
···22 Open Discord{"'"}s add-app flow at <LinkTag href="/login?invite=true">wamellow.com/invite</LinkTag>.
23 </li>
24 <li>
25- Select a server and click on {'"'}Continue{'"'}.
26 </li>
27 <li>
28- Do <span className="font-semibold">not uncheck</span> any permissions and click on {'"'}Authorize{'"'}.
29 </li>
30 <li>
31 <span className="font-semibold">Done!</span> 🎉 You should now find yourself on the Dashboard for your server!
···52 <LinkTag href="/login?invite=true">Invite Wamellow</LinkTag> to your Server. If you do not own it, ask the server Administrators to add Wamellow.
53 </li>
54 <li>
55- Go to the <LinkTag href="/login?invite=true">Dashboard on wamellow.com/dashboard</LinkTag>, find your server and click {'"'}manage{'"'}.
56 </li>
57 <li>
58- Select a channel to be used in the {'"'}Text to Speech{'"'} section.
59 </li>
60 <li>
61 Join any voice channel in your Server (be sure Wamellow can join it too).
···86 <div>
87 <ol className="list-decimal list-inside marker:text-neutral-500 mb-4">
88 <li>
89- In the Discord App, click on your servers' name and click {'"'}Settings{'"'}
90 </li>
91 <li>
92- Then go to the tab {'"'}Integrations{'"'} in the {'"'}Apps{'"'} category.
93 </li>
94 <li>
95- In the {'"'}Bots and Apps{'"'} list, find Wamellow and click on {'"'}Manage{'"'}.
96 </li>
97 <li>
98 You can choose to disable commands for everyone by their roles, or only in certain channels.
···22 Open Discord{"'"}s add-app flow at <LinkTag href="/login?invite=true">wamellow.com/invite</LinkTag>.
23 </li>
24 <li>
25+ Select a server and click on {"\""}Continue{"\""}.
26 </li>
27 <li>
28+ Do <span className="font-semibold">not uncheck</span> any permissions and click on {"\""}Authorize{"\""}.
29 </li>
30 <li>
31 <span className="font-semibold">Done!</span> 🎉 You should now find yourself on the Dashboard for your server!
···52 <LinkTag href="/login?invite=true">Invite Wamellow</LinkTag> to your Server. If you do not own it, ask the server Administrators to add Wamellow.
53 </li>
54 <li>
55+ Go to the <LinkTag href="/login?invite=true">Dashboard on wamellow.com/dashboard</LinkTag>, find your server and click {"\""}manage{"\""}.
56 </li>
57 <li>
58+ Select a channel to be used in the {"\""}Text to Speech{"\""} section.
59 </li>
60 <li>
61 Join any voice channel in your Server (be sure Wamellow can join it too).
···86 <div>
87 <ol className="list-decimal list-inside marker:text-neutral-500 mb-4">
88 <li>
89+ In the Discord App, click on your servers' name and click {"\""}Settings{"\""}
90 </li>
91 <li>
92+ Then go to the tab {"\""}Integrations{"\""} in the {"\""}Apps{"\""} category.
93 </li>
94 <li>
95+ In the {"\""}Bots and Apps{"\""} list, find Wamellow and click on {"\""}Manage{"\""}.
96 </li>
97 <li>
98 You can choose to disable commands for everyone by their roles, or only in certain channels.
···26import SpacePic from "@/public/space.webp";
27import WaifuPic from "@/public/waifu.webp";
28import WelcomePic from "@/public/welcome.webp";
29-import { ApiV1TopguildsGetResponse } from "@/typings";
30import { cn } from "@/utils/cn";
31import { toFixedArrayLength } from "@/utils/fixed-array-length";
32import { actor } from "@/utils/tts";
···81 </ClientButton>
82 );
8384- async function renderCount() {
85 "use server";
86 return <span>trust us!</span>;
87 }
···26import SpacePic from "@/public/space.webp";
27import WaifuPic from "@/public/waifu.webp";
28import WelcomePic from "@/public/welcome.webp";
29+import type { ApiV1TopguildsGetResponse } from "@/typings";
30import { cn } from "@/utils/cn";
31import { toFixedArrayLength } from "@/utils/fixed-array-length";
32import { actor } from "@/utils/tts";
···81 </ClientButton>
82 );
8384+ function renderCount() {
85 "use server";
86 return <span>trust us!</span>;
87 }
+2-2
app/(home)/privacy/page.tsx
···1import { readFile } from "fs/promises";
2-import { Metadata } from "next";
34import { CopyToClipboardButton } from "@/components/copy-to-clipboard";
5import BeautifyMarkdown from "@/components/markdown";
···78export const revalidate = false;
910-export const generateMetadata = async (): Promise<Metadata> => {
1112 const title = "Privacy";
13 const description = "We take your privacy seriously. Read about Wamellow's Privacy Policy to learn how.";
···1import { readFile } from "fs/promises";
2+import type { Metadata } from "next";
34import { CopyToClipboardButton } from "@/components/copy-to-clipboard";
5import BeautifyMarkdown from "@/components/markdown";
···78export const revalidate = false;
910+export const generateMetadata = (): Metadata => {
1112 const title = "Privacy";
13 const description = "We take your privacy seriously. Read about Wamellow's Privacy Policy to learn how.";
+5-5
app/(home)/pro/page.tsx
···1import { Button, Chip } from "@nextui-org/react";
2-import { Metadata } from "next";
3import { Montserrat } from "next/font/google";
4import Link from "next/link";
5import { BsQuestionLg } from "react-icons/bs";
···89import Comment from "@/components/comment";
10import ImageGrid from "@/components/image-grid";
11-import { ApiV1TopguildsGetResponse } from "@/typings";
12import { cn } from "@/utils/cn";
13import { getBaseUrl, getCanonicalUrl } from "@/utils/urls";
14···1920const fetchOptions = { headers: { Authorization: process.env.API_SECRET as string }, next: { revalidate: 60 * 60 } };
2122-export const generateMetadata = async (): Promise<Metadata> => {
2324 const title = "Professional experience";
25 const description = "Get epic Pro+ ULTRA HD features for wamellow to upgrade your servers to a whole new experience and unlock tons of premium features.";
···59 prefetch={false}
60 startContent={<HiUserAdd />}
61 >
62- Get started
63 </Button>
64 <Button
65 as={Link}
···68 href="https://lunish.nl/kofi"
69 startContent={<HiLightningBolt />}
70 >
71- Subscribe
72 </Button>
73 </>);
74
···1import { Button, Chip } from "@nextui-org/react";
2+import type { Metadata } from "next";
3import { Montserrat } from "next/font/google";
4import Link from "next/link";
5import { BsQuestionLg } from "react-icons/bs";
···89import Comment from "@/components/comment";
10import ImageGrid from "@/components/image-grid";
11+import type { ApiV1TopguildsGetResponse } from "@/typings";
12import { cn } from "@/utils/cn";
13import { getBaseUrl, getCanonicalUrl } from "@/utils/urls";
14···1920const fetchOptions = { headers: { Authorization: process.env.API_SECRET as string }, next: { revalidate: 60 * 60 } };
2122+export const generateMetadata = (): Metadata => {
2324 const title = "Professional experience";
25 const description = "Get epic Pro+ ULTRA HD features for wamellow to upgrade your servers to a whole new experience and unlock tons of premium features.";
···59 prefetch={false}
60 startContent={<HiUserAdd />}
61 >
62+ Get started
63 </Button>
64 <Button
65 as={Link}
···68 href="https://lunish.nl/kofi"
69 startContent={<HiLightningBolt />}
70 >
71+ Subscribe
72 </Button>
73 </>);
74
+1-1
app/(home)/status/api.ts
···1import { defaultFetchOptions } from "@/lib/api";
2-import { ApiError } from "@/typings";
34export interface ApiCluster {
5 id: number;
···1import { defaultFetchOptions } from "@/lib/api";
2+import type { ApiError } from "@/typings";
34export interface ApiCluster {
5 id: number;
+1-1
app/(home)/status/cluster.component.tsx
···6import { cn } from "@/utils/cn";
7import { intl } from "@/utils/numbers";
89-import { ApiCluster } from "./api";
1011export function Cluster(cluster: ApiCluster) {
12 return (
···6import { cn } from "@/utils/cn";
7import { intl } from "@/utils/numbers";
89+import type { ApiCluster } from "./api";
1011export function Cluster(cluster: ApiCluster) {
12 return (
+4-4
app/(home)/status/layout.tsx
···1-import { Metadata } from "next";
2import { Montserrat } from "next/font/google";
3-import { ReactNode } from "react";
45import { Section } from "@/components/section";
6import { cn } from "@/utils/cn";
···11const montserrat = Montserrat({ subsets: ["latin"] });
1213interface Props {
14- children: ReactNode
15}
1617-export const generateMetadata = async (): Promise<Metadata> => {
18 const title = "Status";
19 const description = "Check the status of all clusters and voice chat nodes, double check if we screwed something up - again!";
20 const url = getCanonicalUrl("status");
···1+import type { Metadata } from "next";
2import { Montserrat } from "next/font/google";
3+import type { ReactNode } from "react";
45import { Section } from "@/components/section";
6import { cn } from "@/utils/cn";
···11const montserrat = Montserrat({ subsets: ["latin"] });
1213interface Props {
14+ children: ReactNode;
15}
1617+export const generateMetadata = (): Metadata => {
18 const title = "Status";
19 const description = "Check the status of all clusters and voice chat nodes, double check if we screwed something up - again!";
20 const url = getCanonicalUrl("status");
+4-4
app/(home)/status/node.component.tsx
···1import { Chip } from "@nextui-org/react";
2import Image from "next/image";
3-import { ReactNode } from "react";
4import { FaCrown } from "react-icons/fa";
56-import { ApiNode } from "./api";
78-export function Node({ index, node }: { index: number; node: ApiNode }) {
9 return (
10 <div
11 className="p-4 bg-wamellow rounded-lg space-y-2 outline-violet-400 duration-200 h-fit"
···51 );
52}
5354-function Icon({ id }: { id: string }) {
55 return (
56 <Image
57 alt={`${id} country flag`}
···1import { Chip } from "@nextui-org/react";
2import Image from "next/image";
3+import type { ReactNode } from "react";
4import { FaCrown } from "react-icons/fa";
56+import type { ApiNode } from "./api";
78+export function Node({ index, node }: { index: number; node: ApiNode; }) {
9 return (
10 <div
11 className="p-4 bg-wamellow rounded-lg space-y-2 outline-violet-400 duration-200 h-fit"
···51 );
52}
5354+function Icon({ id }: { id: string; }) {
55 return (
56 <Image
57 alt={`${id} country flag`}
+2-2
app/(home)/status/side.component.tsx
···23import { Accordion, AccordionItem, Chip } from "@nextui-org/react";
4import { useCookies } from "next-client-cookies";
5-import { ReactNode, useEffect, useMemo, useState } from "react";
67import DumbTextInput from "@/components/inputs/dumb-text-input";
8import { intl } from "@/utils/numbers";
910-import { ApiV1StatusGetResponse } from "./api";
1112export function Side({
13 status
···23import { Accordion, AccordionItem, Chip } from "@nextui-org/react";
4import { useCookies } from "next-client-cookies";
5+import { type ReactNode, useEffect, useMemo, useState } from "react";
67import DumbTextInput from "@/components/inputs/dumb-text-input";
8import { intl } from "@/utils/numbers";
910+import type { ApiV1StatusGetResponse } from "./api";
1112export function Side({
13 status
+3-3
app/(home)/team/page.tsx
···1-import { Metadata } from "next";
2import Image from "next/image";
3import { BsDiscord, BsGithub } from "react-icons/bs";
4···1314export const revalidate = 3600;
1516-export const generateMetadata = async (): Promise<Metadata> => {
17 const title = "Team";
18 const description = "Meet the creators of Wamellow and its products. Our dedicated team, including developers and donors, drives innovation and community growth.";
19 const url = getCanonicalUrl("team");
···46 };
47};
4849-export default async function Home() {
50 return (
51 <div>
52 <h2 className="text-2xl font-medium text-neutral-200">Team 🍪</h2>
···1+import type { Metadata } from "next";
2import Image from "next/image";
3import { BsDiscord, BsGithub } from "react-icons/bs";
4···1314export const revalidate = 3600;
1516+export const generateMetadata = (): Metadata => {
17 const title = "Team";
18 const description = "Meet the creators of Wamellow and its products. Our dedicated team, including developers and donors, drives innovation and community growth.";
19 const url = getCanonicalUrl("team");
···46 };
47};
4849+export default function Home() {
50 return (
51 <div>
52 <h2 className="text-2xl font-medium text-neutral-200">Team 🍪</h2>
+1-1
app/(home)/team/person.component.tsx
···1import Image from "next/image";
2import Link from "next/link";
3-import { AnchorHTMLAttributes, DetailedHTMLProps, HTMLAttributes } from "react";
4import { HiExternalLink } from "react-icons/hi";
56import { getUser } from "@/lib/discord/user";
···1import Image from "next/image";
2import Link from "next/link";
3+import type { AnchorHTMLAttributes, DetailedHTMLProps, HTMLAttributes } from "react";
4import { HiExternalLink } from "react-icons/hi";
56import { getUser } from "@/lib/discord/user";
+2-2
app/(home)/terms/page.tsx
···1import { readFile } from "fs/promises";
2-import { Metadata } from "next";
34import { CopyToClipboardButton } from "@/components/copy-to-clipboard";
5import BeautifyMarkdown from "@/components/markdown";
···78export const revalidate = false;
910-export const generateMetadata = async (): Promise<Metadata> => {
1112 const title = "Terms of Service";
13 const description = "Read about Wamellow's Terms of Service.";
···1import { readFile } from "fs/promises";
2+import type { Metadata } from "next";
34import { CopyToClipboardButton } from "@/components/copy-to-clipboard";
5import BeautifyMarkdown from "@/components/markdown";
···78export const revalidate = false;
910+export const generateMetadata = (): Metadata => {
1112 const title = "Terms of Service";
13 const description = "Read about Wamellow's Terms of Service.";
···1-import { Metadata } from "next";
2import { Montserrat } from "next/font/google";
3import Image from "next/image";
4import Link from "next/link";
···2021export const revalidate = 3600;
2223-export const generateMetadata = async (): Promise<Metadata> => {
2425 const title = "Free /image Ai for Discord";
26 const description = "Summon the enchantment of AI generated images to your Discord server with our versatile /image command, featuring over 40+ distinct SD and 10+ SDXL models.";
···1+import type { Metadata } from "next";
2import { Montserrat } from "next/font/google";
3import Image from "next/image";
4import Link from "next/link";
···2021export const revalidate = 3600;
2223+export const generateMetadata = (): Metadata => {
2425 const title = "Free /image Ai for Discord";
26 const description = "Summon the enchantment of AI generated images to your Discord server with our versatile /image command, featuring over 40+ distinct SD and 10+ SDXL models.";
···6import { useEffect, useState } from "react";
7import { HiCloudUpload } from "react-icons/hi";
89-import { ApiV1UploadGetResponse } from "@/typings";
10import { cn } from "@/utils/cn";
1112enum State {
···6import { useEffect, useState } from "react";
7import { HiCloudUpload } from "react-icons/hi";
89+import type { ApiV1UploadGetResponse } from "@/typings";
10import { cn } from "@/utils/cn";
1112enum State {
···48 if (id) removeTag(id);
49 }}
50 >
51- Are you sure you want to delete the {'"'}{name}{'"'} tag? It will be gone forever, probably, who knows.
52 </Modal>
53 </>
54 );
···48 if (id) removeTag(id);
49 }}
50 >
51+ Are you sure you want to delete the {"\""}{name}{"\""} tag? It will be gone forever, probably, who knows.
52 </Modal>
53 </>
54 );
+1-1
app/dashboard/[guildId]/custom-commands/page.tsx
···16import { cacheOptions, getData } from "@/lib/api";
17import { Permissions } from "@/lib/discord/enum/permissions";
18import SadWumpusPic from "@/public/sad-wumpus.gif";
19-import { ApiV1GuildsModulesTagsGetResponse } from "@/typings";
2021import CreateTag, { Style } from "./create.component";
22import DeleteTag from "./delete.component";
···16import { cacheOptions, getData } from "@/lib/api";
17import { Permissions } from "@/lib/discord/enum/permissions";
18import SadWumpusPic from "@/public/sad-wumpus.gif";
19+import type { ApiV1GuildsModulesTagsGetResponse } from "@/typings";
2021import CreateTag, { Style } from "./create.component";
22import DeleteTag from "./delete.component";
···8import MultiSelectMenu from "@/components/inputs/multi-select-menu";
9import SelectMenu from "@/components/inputs/select-menu";
10import Modal from "@/components/modal";
11-import { ApiV1GuildsModulesDailypostsGetResponse, DailypostType } from "@/typings";
12import { createSelectableItems } from "@/utils/create-selectable-items";
1314import { generateHourArray, typeToName } from "./util";
···8import MultiSelectMenu from "@/components/inputs/multi-select-menu";
9import SelectMenu from "@/components/inputs/select-menu";
10import Modal from "@/components/modal";
11+import { type ApiV1GuildsModulesDailypostsGetResponse, DailypostType } from "@/typings";
12import { createSelectableItems } from "@/utils/create-selectable-items";
1314import { generateHourArray, typeToName } from "./util";
···58 if (id) remove(id);
59 }}
60 >
61- Are you sure you want to delete the {'"'}{name}{'"'} dailypost? It will be gone forever, probably, who knows.
62 </Modal>
63 </>);
64}
···58 if (id) remove(id);
59 }}
60 >
61+ Are you sure you want to delete the {"\""}{name}{"\""} dailypost? It will be gone forever, probably, who knows.
62 </Modal>
63 </>);
64}
+1-1
app/dashboard/[guildId]/dailyposts/page.tsx
···14import SelectMenu from "@/components/inputs/select-menu";
15import { ScreenMessage } from "@/components/screen-message";
16import SadWumpusPic from "@/public/sad-wumpus.gif";
17-import { ApiV1GuildsModulesDailypostsGetResponse } from "@/typings";
18import { createSelectableItems } from "@/utils/create-selectable-items";
1920import CreateNotification, { Style } from "./create.component";
···14import SelectMenu from "@/components/inputs/select-menu";
15import { ScreenMessage } from "@/components/screen-message";
16import SadWumpusPic from "@/public/sad-wumpus.gif";
17+import type { ApiV1GuildsModulesDailypostsGetResponse } from "@/typings";
18import { createSelectableItems } from "@/utils/create-selectable-items";
1920import CreateNotification, { Style } from "./create.component";
···15import SelectMenu from "@/components/inputs/select-menu";
16import Switch from "@/components/inputs/switch";
17import Notice from "@/components/notice";
18-import { ApiError,ApiV1GuildsModulesByeGetResponse } from "@/typings";
19import { createSelectableItems } from "@/utils/create-selectable-items";
2021export default function Home() {
···15import SelectMenu from "@/components/inputs/select-menu";
16import Switch from "@/components/inputs/switch";
17import Notice from "@/components/notice";
18+import type { ApiError, ApiV1GuildsModulesByeGetResponse } from "@/typings";
19import { createSelectableItems } from "@/utils/create-selectable-items";
2021export default function Home() {
···1-2"use client";
3import { Button } from "@nextui-org/react";
4import Link from "next/link";
···12import Switch from "@/components/inputs/switch";
13import Notice from "@/components/notice";
14import { OverviewLink } from "@/components/overview-link";
15-import { ApiError,ApiV1GuildsModulesPassportGetResponse } from "@/typings";
16import { createSelectableItems } from "@/utils/create-selectable-items";
17import { getCanonicalUrl } from "@/utils/urls";
18
···01"use client";
2import { Button } from "@nextui-org/react";
3import Link from "next/link";
···11import Switch from "@/components/inputs/switch";
12import Notice from "@/components/notice";
13import { OverviewLink } from "@/components/overview-link";
14+import type { ApiError, ApiV1GuildsModulesPassportGetResponse } from "@/typings";
15import { createSelectableItems } from "@/utils/create-selectable-items";
16import { getCanonicalUrl } from "@/utils/urls";
17
+1-1
app/dashboard/[guildId]/greeting/welcome/page.tsx
···17import Switch from "@/components/inputs/switch";
18import Notice from "@/components/notice";
19import { Section } from "@/components/section";
20-import { ApiError,ApiV1GuildsModulesWelcomeGetResponse } from "@/typings";
21import { createSelectableEmojiItems, createSelectableItems } from "@/utils/create-selectable-items";
2223export default function Home() {
···17import Switch from "@/components/inputs/switch";
18import Notice from "@/components/notice";
19import { Section } from "@/components/section";
20+import type { ApiError, ApiV1GuildsModulesWelcomeGetResponse } from "@/typings";
21import { createSelectableEmojiItems, createSelectableItems } from "@/utils/create-selectable-items";
2223export default function Home() {
+2-2
app/dashboard/[guildId]/layout.tsx
···18import { ScreenMessage, SupportButton } from "@/components/screen-message";
19import { cacheOptions, getData } from "@/lib/api";
20import SadWumpusPic from "@/public/sad-wumpus.gif";
21-import { ApiV1GuildsChannelsGetResponse, ApiV1GuildsEmojisGetResponse, ApiV1GuildsGetResponse, ApiV1GuildsRolesGetResponse } from "@/typings";
22import { intl } from "@/utils/numbers";
23import { getCanonicalUrl } from "@/utils/urls";
24···43export default function RootLayout({
44 children
45}: {
46- children: React.ReactNode
47}) {
48 const cookies = useCookies();
49 const params = useParams();
···18import { ScreenMessage, SupportButton } from "@/components/screen-message";
19import { cacheOptions, getData } from "@/lib/api";
20import SadWumpusPic from "@/public/sad-wumpus.gif";
21+import type { ApiV1GuildsChannelsGetResponse, ApiV1GuildsEmojisGetResponse, ApiV1GuildsGetResponse, ApiV1GuildsRolesGetResponse } from "@/typings";
22import { intl } from "@/utils/numbers";
23import { getCanonicalUrl } from "@/utils/urls";
24···43export default function RootLayout({
44 children
45}: {
46+ children: React.ReactNode;
47}) {
48 const cookies = useCookies();
49 const params = useParams();
+2-2
app/dashboard/[guildId]/leaderboards/page.tsx
···5import { HiChartBar, HiViewGridAdd } from "react-icons/hi";
6import { useQuery } from "react-query";
78-import { Guild, guildStore } from "@/common/guilds";
9import ImageUrlInput from "@/components/inputs/image-url-input";
10import MultiSelectMenu from "@/components/inputs/multi-select-menu";
11import { ScreenMessage } from "@/components/screen-message";
12import { Section, SubSection } from "@/components/section";
13import { cacheOptions, getData } from "@/lib/api";
14import SadWumpusPic from "@/public/sad-wumpus.gif";
15-import { ApiV1GuildsModulesLeaderboardGetResponse } from "@/typings";
16import { createSelectableItems } from "@/utils/create-selectable-items";
1718import { OverviewLink } from "../../../../components/overview-link";
···5import { HiChartBar, HiViewGridAdd } from "react-icons/hi";
6import { useQuery } from "react-query";
78+import { type Guild, guildStore } from "@/common/guilds";
9import ImageUrlInput from "@/components/inputs/image-url-input";
10import MultiSelectMenu from "@/components/inputs/multi-select-menu";
11import { ScreenMessage } from "@/components/screen-message";
12import { Section, SubSection } from "@/components/section";
13import { cacheOptions, getData } from "@/lib/api";
14import SadWumpusPic from "@/public/sad-wumpus.gif";
15+import type { ApiV1GuildsModulesLeaderboardGetResponse } from "@/typings";
16import { createSelectableItems } from "@/utils/create-selectable-items";
1718import { OverviewLink } from "../../../../components/overview-link";
···6import { useState } from "react";
7import { HiExternalLink, HiPencil, HiTrash } from "react-icons/hi";
89-import { Guild } from "@/common/guilds";
10import SelectInput from "@/components/inputs/select-menu";
11import Switch from "@/components/inputs/switch";
12import TextInput from "@/components/inputs/text-input";
13import Modal from "@/components/modal";
14-import { ApiV1GuildsModulesLeaderboardUpdatingPostResponse } from "@/typings";
15import { createSelectableEmojiItems, createSelectableItems } from "@/utils/create-selectable-items";
1617interface Props {
···6import { useState } from "react";
7import { HiExternalLink, HiPencil, HiTrash } from "react-icons/hi";
89+import type { Guild } from "@/common/guilds";
10import SelectInput from "@/components/inputs/select-menu";
11import Switch from "@/components/inputs/switch";
12import TextInput from "@/components/inputs/text-input";
13import Modal from "@/components/modal";
14+import type { ApiV1GuildsModulesLeaderboardUpdatingPostResponse } from "@/typings";
15import { createSelectableEmojiItems, createSelectableItems } from "@/utils/create-selectable-items";
1617interface Props {
···8import SelectMenu from "@/components/inputs/select-menu";
9import Modal from "@/components/modal";
10import TutorialPic from "@/public/docs-assets/notifications-channel-urls.webp";
11-import { ApiV1GuildsModulesNotificationsGetResponse, NotificationType } from "@/typings";
12import { createSelectableItems } from "@/utils/create-selectable-items";
1314const URL_CHANNEL_REGEX = /^https?:\/\/((www|m)\.)?twitch\.tv\/([a-zA-Z0-9_-]{1,32})$/;
···8import SelectMenu from "@/components/inputs/select-menu";
9import Modal from "@/components/modal";
10import TutorialPic from "@/public/docs-assets/notifications-channel-urls.webp";
11+import { type ApiV1GuildsModulesNotificationsGetResponse, NotificationType } from "@/typings";
12import { createSelectableItems } from "@/utils/create-selectable-items";
1314const URL_CHANNEL_REGEX = /^https?:\/\/((www|m)\.)?twitch\.tv\/([a-zA-Z0-9_-]{1,32})$/;
···8import SelectMenu from "@/components/inputs/select-menu";
9import Modal from "@/components/modal";
10import TutorialPic from "@/public/docs-assets/notifications-channel-urls.webp";
11-import { ApiV1GuildsModulesNotificationsGetResponse, NotificationType } from "@/typings";
12import { createSelectableItems } from "@/utils/create-selectable-items";
1314const URL_CHANNEL_REGEX = /^https?:\/\/((www|m)\.)?youtube\.com\/channel\/UC([a-zA-Z0-9_-]{16,32})$/;
···8import SelectMenu from "@/components/inputs/select-menu";
9import Modal from "@/components/modal";
10import TutorialPic from "@/public/docs-assets/notifications-channel-urls.webp";
11+import { type ApiV1GuildsModulesNotificationsGetResponse, NotificationType } from "@/typings";
12import { createSelectableItems } from "@/utils/create-selectable-items";
1314const URL_CHANNEL_REGEX = /^https?:\/\/((www|m)\.)?youtube\.com\/channel\/UC([a-zA-Z0-9_-]{16,32})$/;
···58 if (id) remove(id);
59 }}
60 >
61- Are you sure you want to delete the {'"'}{name}{'"'} channel from posting notifications? It will be gone forever, probably, who knows.
62 </Modal>
63 </>);
64}
···58 if (id) remove(id);
59 }}
60 >
61+ Are you sure you want to delete the {"\""}{name}{"\""} channel from posting notifications? It will be gone forever, probably, who knows.
62 </Modal>
63 </>);
64}
+2-2
app/dashboard/[guildId]/notifications/page.tsx
···16import SelectMenu from "@/components/inputs/select-menu";
17import { ScreenMessage } from "@/components/screen-message";
18import SadWumpusPic from "@/public/sad-wumpus.gif";
19-import { ApiV1GuildsModulesNotificationsGetResponse, NotificationType } from "@/typings";
20import { cn } from "@/utils/cn";
21import { createSelectableItems } from "@/utils/create-selectable-items";
22···199 className
200}: {
201 type: NotificationType;
202- className?: string;
203}) {
204 switch (type) {
205 case NotificationType.YouTube: return <BsYoutube className={cn("text-red-500", className)} />;
···16import SelectMenu from "@/components/inputs/select-menu";
17import { ScreenMessage } from "@/components/screen-message";
18import SadWumpusPic from "@/public/sad-wumpus.gif";
19+import { type ApiV1GuildsModulesNotificationsGetResponse, NotificationType } from "@/typings";
20import { cn } from "@/utils/cn";
21import { createSelectableItems } from "@/utils/create-selectable-items";
22···199 className
200}: {
201 type: NotificationType;
202+ className?: string;
203}) {
204 switch (type) {
205 case NotificationType.YouTube: return <BsYoutube className={cn("text-red-500", className)} />;
···13import { CopyToClipboardButton } from "@/components/copy-to-clipboard";
14import Modal from "@/components/modal";
15import Notice, { NoticeType } from "@/components/notice";
16-import { ApiError, ApiV1GuildsGetResponse, ApiV1GuildsModulesLeaderboardGetResponse, ApiV1GuildsTopmembersPaginationGetResponse } from "@/typings";
17import { intl } from "@/utils/numbers";
18import { getCanonicalUrl } from "@/utils/urls";
19
···13import { CopyToClipboardButton } from "@/components/copy-to-clipboard";
14import Modal from "@/components/modal";
15import Notice, { NoticeType } from "@/components/notice";
16+import type { ApiError, ApiV1GuildsGetResponse, ApiV1GuildsModulesLeaderboardGetResponse, ApiV1GuildsTopmembersPaginationGetResponse } from "@/typings";
17import { intl } from "@/utils/numbers";
18import { getCanonicalUrl } from "@/utils/urls";
19
+2-2
app/login/api.ts
···1-import { User } from "@/common/user";
2-import { ApiError } from "@/typings";
34interface UserSessionCreate extends User {
5 session: string;
···1+import type { User } from "@/common/user";
2+import type { ApiError } from "@/typings";
34interface UserSessionCreate extends User {
5 session: string;
+2-2
app/login/open-graph/page.tsx
···1-import { Metadata } from "next";
2import { headers } from "next/headers";
3import { redirect } from "next/navigation";
45import { getCanonicalUrl } from "@/utils/urls";
67-export const generateMetadata = async (): Promise<Metadata> => {
8 const title = "Login with Discord";
9 const description = "Start customising your profile and managing servers.";
10 const url = getCanonicalUrl("login");
···1+import type { Metadata } from "next";
2import { headers } from "next/headers";
3import { redirect } from "next/navigation";
45import { getCanonicalUrl } from "@/utils/urls";
67+export const generateMetadata = (): Metadata => {
8 const title = "Login with Discord";
9 const description = "Start customising your profile and managing servers.";
10 const url = getCanonicalUrl("login");
···1import { Button } from "@nextui-org/react";
2-import { ApiError } from "next/dist/server/api-utils";
3import Image from "next/image";
4-import { ChangeEvent, useRef, useState } from "react";
5import { HiUpload } from "react-icons/hi";
67-import { User, userStore } from "@/common/user";
8import Box from "@/components/box";
9import { Shiggy } from "@/components/shiggy";
10-import { ApiV1UsersMeRankEmojiDeleteResponse, ApiV1UsersMeRankEmojiPutResponse } from "@/typings";
11import { cn } from "@/utils/cn";
12import { deepMerge } from "@/utils/deepMerge";
13import sleep from "@/utils/sleep";
···171 index,
172 emojiId
173}: {
174- index: number,
175- emojiId: string | null
176}) {
177 const classNames = "rounded-xl relative size-12 aspect-square";
178 const style = {
···1import { Button } from "@nextui-org/react";
2+import type { ApiError } from "next/dist/server/api-utils";
3import Image from "next/image";
4+import { type ChangeEvent, useRef, useState } from "react";
5import { HiUpload } from "react-icons/hi";
67+import { type User, userStore } from "@/common/user";
8import Box from "@/components/box";
9import { Shiggy } from "@/components/shiggy";
10+import type { ApiV1UsersMeRankEmojiDeleteResponse, ApiV1UsersMeRankEmojiPutResponse } from "@/typings";
11import { cn } from "@/utils/cn";
12import { deepMerge } from "@/utils/deepMerge";
13import sleep from "@/utils/sleep";
···171 index,
172 emojiId
173}: {
174+ index: number;
175+ emojiId: string | null;
176}) {
177 const classNames = "rounded-xl relative size-12 aspect-square";
178 const style = {
+2-2
app/profile/rank/leaderboard-style.component.tsx
···1import { useState } from "react";
23-import { User, userStore } from "@/common/user";
4-import { ApiError,ApiV1UsersMeGetResponse } from "@/typings";
5import { cn } from "@/utils/cn";
6import { deepMerge } from "@/utils/deepMerge";
7
···1import { useState } from "react";
23+import { type User, userStore } from "@/common/user";
4+import type { ApiError, ApiV1UsersMeGetResponse } from "@/typings";
5import { cn } from "@/utils/cn";
6import { deepMerge } from "@/utils/deepMerge";
7
+1-1
app/profile/rank/page.tsx
···1"use client";
23-import { User, userStore } from "@/common/user";
4import ImageUrlInput from "@/components/inputs/image-url-input";
5import SelectInput from "@/components/inputs/select-menu";
6import TextInput from "@/components/inputs/text-input";
···1"use client";
23+import { type User, userStore } from "@/common/user";
4import ImageUrlInput from "@/components/inputs/image-url-input";
5import SelectInput from "@/components/inputs/select-menu";
6import TextInput from "@/components/inputs/text-input";
+2-2
app/profile/spotify/page.tsx
···13import { HomeButton, ScreenMessage, SupportButton } from "@/components/screen-message";
14import { cacheOptions, getData } from "@/lib/api";
15import SadWumpusPic from "@/public/sad-wumpus.gif";
16-import { ApiV1UsersMeConnectionsSpotifyGetResponse } from "@/typings";
1718interface Props {
19- searchParams: Promise<{ spotify_login_success?: string }>
20}
2122export default function Home({ searchParams }: Props) {
···13import { HomeButton, ScreenMessage, SupportButton } from "@/components/screen-message";
14import { cacheOptions, getData } from "@/lib/api";
15import SadWumpusPic from "@/public/sad-wumpus.gif";
16+import type { ApiV1UsersMeConnectionsSpotifyGetResponse } from "@/typings";
1718interface Props {
19+ searchParams: Promise<{ spotify_login_success?: string; }>;
20}
2122export default function Home({ searchParams }: Props) {
+2-2
app/profile/text-to-speech/page.tsx
···1"use client";
23-import { User, userStore } from "@/common/user";
4import SelectInput from "@/components/inputs/select-menu";
5import { deepMerge } from "@/utils/deepMerge";
6-import { actor, getVoices, voices } from "@/utils/tts";
78export default function Home() {
9 const user = userStore((s) => s);
···1"use client";
23+import { type User, userStore } from "@/common/user";
4import SelectInput from "@/components/inputs/select-menu";
5import { deepMerge } from "@/utils/deepMerge";
6+import { type actor, getVoices, voices } from "@/utils/tts";
78export default function Home() {
9 const user = userStore((s) => s);
+1-1
app/user/[userId]/api.ts
···1import { defaultFetchOptions } from "@/lib/api";
2-import { ApiError,ApiV1UsersGetResponse } from "@/typings";
34export async function getUser(userId: string): Promise<ApiV1UsersGetResponse | ApiError | undefined> {
5 const res = await fetch(
···1import { defaultFetchOptions } from "@/lib/api";
2+import type { ApiError, ApiV1UsersGetResponse } from "@/typings";
34export async function getUser(userId: string): Promise<ApiV1UsersGetResponse | ApiError | undefined> {
5 const res = await fetch(
+1-1
app/user/[userId]/layout.tsx
···7import Side from "./side.component";
89interface Props {
10- params: Promise<{ userId: string }>;
11 children: React.ReactNode;
12}
13
···7import Side from "./side.component";
89interface Props {
10+ params: Promise<{ userId: string; }>;
11 children: React.ReactNode;
12}
13
+1-1
app/user/[userId]/page.tsx
···1export const revalidate = 3600;
23-export default async function Home() {
4 return (
5 <>
6 <i>User has no bio yet</i>
···1export const revalidate = 3600;
23+export default function Home() {
4 return (
5 <>
6 <i>User has no bio yet</i>
+1-1
app/user/[userId]/side.component.tsx
···5import { HiAnnotation, HiLink, HiVolumeUp } from "react-icons/hi";
67import { ClientCountUp } from "@/components/counter";
8-import { ApiError,ApiV1UsersGetResponse } from "@/typings";
910export default function Side({
11 user
···5import { HiAnnotation, HiLink, HiVolumeUp } from "react-icons/hi";
67import { ClientCountUp } from "@/components/counter";
8+import type { ApiError, ApiV1UsersGetResponse } from "@/typings";
910export default function Side({
11 user
···1import { create } from "zustand";
23+import type { ApiV1GuildsChannelsGetResponse, ApiV1GuildsEmojisGetResponse, ApiV1GuildsGetResponse, ApiV1GuildsRolesGetResponse } from "@/typings";
45export interface Guild extends ApiV1GuildsGetResponse {
6 channels?: ApiV1GuildsChannelsGetResponse[];
+1-1
common/user.ts
···1import { create } from "zustand";
23-import { ApiV1UsersMeGetResponse } from "@/typings";
45export interface User {
6 HELLO_AND_WELCOME_TO_THE_DEV_TOOLS__PLEASE_GO_AWAY?: true;
···1import { create } from "zustand";
23+import type { ApiV1UsersMeGetResponse } from "@/typings";
45export interface User {
6 HELLO_AND_WELCOME_TO_THE_DEV_TOOLS__PLEASE_GO_AWAY?: true;
+1-1
components/ad.tsx
···3import { Button } from "@nextui-org/react";
4import { Poppins } from "next/font/google";
5import Link from "next/link";
6-import { FunctionComponent } from "react";
7import { HiArrowNarrowRight } from "react-icons/hi";
89import { cn } from "@/utils/cn";
···3import { Button } from "@nextui-org/react";
4import { Poppins } from "next/font/google";
5import Link from "next/link";
6+import type { FunctionComponent } from "react";
7import { HiArrowNarrowRight } from "react-icons/hi";
89import { cn } from "@/utils/cn";
+3-3
components/avatar.tsx
···1"use client";
23-import { AvatarIcon, AvatarProps as BaseAvatarProps, useAvatar } from "@nextui-org/react";
4import Image from "next/image";
5import { forwardRef, useMemo } from "react";
67-export type AvatarProps = BaseAvatarProps
89-export const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(({ src: source,...props }, ref) => {
10 const {
11 src,
12 icon = <AvatarIcon />,
···1"use client";
23+import { AvatarIcon, type AvatarProps as BaseAvatarProps, useAvatar } from "@nextui-org/react";
4import Image from "next/image";
5import { forwardRef, useMemo } from "react";
67+export type AvatarProps = BaseAvatarProps;
89+export const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(({ src: source, ...props }, ref) => {
10 const {
11 src,
12 icon = <AvatarIcon />,
···1-2import { Button } from "@nextui-org/react";
3import React, { useState } from "react";
4
···01import { Button } from "@nextui-org/react";
2import React, { useState } from "react";
3
+1-1
components/click-outside.tsx
···14 const handleDocumentClick = (event: MouseEvent): void => {
1516 // @ts-expect-error -- It think's closest doesn't exist, but it does
17- // eslint-disable-next-line @typescript-eslint/no-unsafe-call -- It think's closest doesn't exist, but it does
18 if (!event.target?.closest(".wamellow-modal")) {
19 onClose();
20 }
···14 const handleDocumentClick = (event: MouseEvent): void => {
1516 // @ts-expect-error -- It think's closest doesn't exist, but it does
17+18 if (!event.target?.closest(".wamellow-modal")) {
19 onClose();
20 }
+2-2
components/comment.tsx
···1import { Patrick_Hand } from "next/font/google";
2-import Image, { StaticImageData } from "next/image";
3import { HiChevronRight } from "react-icons/hi";
45import { cn } from "@/utils/cn";
···13 content: string | React.ReactNode;
14}
1516-export default async function Comment({
17 username,
18 bio,
19 avatar,
···1import { Patrick_Hand } from "next/font/google";
2+import Image, { type StaticImageData } from "next/image";
3import { HiChevronRight } from "react-icons/hi";
45import { cn } from "@/utils/cn";
···13 content: string | React.ReactNode;
14}
1516+export default function Comment({
17 username,
18 bio,
19 avatar,
···4import Link from "next/link";
5import { HiExternalLink, HiPencil } from "react-icons/hi";
67-import { Guild, guildStore } from "@/common/guilds";
8import { cn } from "@/utils/cn";
910interface TBase {
···4import Link from "next/link";
5import { HiExternalLink, HiPencil } from "react-icons/hi";
67+import { type Guild, guildStore } from "@/common/guilds";
8import { cn } from "@/utils/cn";
910interface TBase {
+1-1
components/discord/app-badge.tsx
···1-import { HTMLProps } from "react";
2import { HiCheck } from "react-icons/hi";
34import { cn } from "@/utils/cn";
···1+import type { HTMLProps } from "react";
2import { HiCheck } from "react-icons/hi";
34import { cn } from "@/utils/cn";
···2import { useEffect, useState } from "react";
3import { TailSpin } from "react-loading-icons";
45-import { ApiError } from "@/typings";
6import { cn } from "@/utils/cn";
78enum State {
···2import { useEffect, useState } from "react";
3import { TailSpin } from "react-loading-icons";
45+import type { ApiError } from "@/typings";
6import { cn } from "@/utils/cn";
78enum State {
+1-1
components/inputs/text-input.tsx
···3import { useEffect, useState } from "react";
4import { TailSpin } from "react-loading-icons";
56-import { ApiError } from "@/typings";
7import { cn } from "@/utils/cn";
89import { useStateDebounced } from "../../utils/useDebounce";
···3import { useEffect, useState } from "react";
4import { TailSpin } from "react-loading-icons";
56+import type { ApiError } from "@/typings";
7import { cn } from "@/utils/cn";
89import { useStateDebounced } from "../../utils/useDebounce";
···6import { useEffect, useState } from "react";
7import { HiX } from "react-icons/hi";
89-import { ApiError } from "@/typings";
10import { cn } from "@/utils/cn";
1112import { ClickOutside } from "./click-outside";
···2021interface Props<T> {
22 className?: string;
23- variant?:"secondary" | "default" | "destructive";
2425 title: string;
26 children: React.ReactNode;
···6import { useEffect, useState } from "react";
7import { HiX } from "react-icons/hi";
89+import type { ApiError } from "@/typings";
10import { cn } from "@/utils/cn";
1112import { ClickOutside } from "./click-outside";
···2021interface Props<T> {
22 className?: string;
23+ variant?: "secondary" | "default" | "destructive";
2425 title: string;
26 children: React.ReactNode;
+1-1
components/screen-message.tsx
···1-import { Button } from "@nextui-org/react";
2import Link from "next/link";
3import { BsDiscord } from "react-icons/bs";
4import { HiHome } from "react-icons/hi";
···1+import type { Button } from "@nextui-org/react";
2import Link from "next/link";
3import { BsDiscord } from "react-icons/bs";
4import { HiHome } from "react-icons/hi";
···1+import type { ApiError, ApiV1GuildsGetResponse } from "@/typings";
23export interface ApiRequestOptions {
4 force?: boolean;
+1-1
lib/discord/guild.ts
···1import { Collection } from "@discordjs/collection";
2-import { APIGuild, RESTError, RESTGetAPIGuildResult, Routes } from "discord-api-types/v10";
34import { rest } from "./index";
5import { fetchWidget } from "./widget";
···1import { Collection } from "@discordjs/collection";
2+import { type APIGuild, type RESTError, type RESTGetAPIGuildResult, Routes } from "discord-api-types/v10";
34import { rest } from "./index";
5import { fetchWidget } from "./widget";
+1-1
lib/discord/user.ts
···1import { Collection } from "@discordjs/collection";
2-import { APIUser, RESTError, RESTGetAPIUserResult, Routes } from "discord-api-types/v10";
34import { rest } from "./index";
5
···1import { Collection } from "@discordjs/collection";
2+import { type APIUser, type RESTError, type RESTGetAPIUserResult, Routes } from "discord-api-types/v10";
34import { rest } from "./index";
5
+1-1
lib/discord/widget.ts
···1-import { RESTError, RESTGetAPIGuildWidgetJSONResult, Routes } from "discord-api-types/v10";
23import { rest } from ".";
4
···1+import { type RESTError, type RESTGetAPIGuildWidgetJSONResult, Routes } from "discord-api-types/v10";
23import { rest } from ".";
4
+1-1
lib/github/index.ts
···1-import { Endpoints } from "@octokit/types";
23export async function getRepository(fullname: string) {
4 const res = await request<Endpoints["GET /repos/{owner}/{repo}"]["response"]["data"]>("GET", `/repos/${fullname}`);
···1+import type { Endpoints } from "@octokit/types";
23export async function getRepository(fullname: string) {
4 const res = await request<Endpoints["GET /repos/{owner}/{repo}"]["response"]["data"]>("GET", `/repos/${fullname}`);
···1-import React from "react";
23-import { User } from "@/common/user";
4-import { ApiError } from "@/typings";
56enum State {
7 Idle = 0,
···1+import type React from "react";
23+import type { User } from "@/common/user";
4+import type { ApiError } from "@/typings";
56enum State {
7 Idle = 0,
+1-1
utils/cn.ts
···1-import { ClassValue, clsx } from "clsx";
2import { twMerge } from "tailwind-merge";
34export function cn(...inputs: ClassValue[]) {
···1+import { type ClassValue, clsx } from "clsx";
2import { twMerge } from "tailwind-merge";
34export function cn(...inputs: ClassValue[]) {