import React, { useEffect, useState } from "react";
import type { LayoutProps, RepositoryCountersDTO } from "../types";
import { Env } from "../env";
export function withLayoutCounters<P extends object>(
WrappedComponent: React.FC<P & LayoutProps>,
): React.FC<P & LayoutProps> {
const ComponentWithCounters: React.FC<P & LayoutProps> = ({
orgSlug,
repoSlug,
...props
}) => {
const [layoutCounters, setLayoutCounters] = useState<
RepositoryCountersDTO | undefined
>(undefined);
useEffect(() => {
const baseUrl = `${Env.DEPLOYMENT_SCHEME}://${Env.DEPLOYMENT_DOMAIN}${Env.DEPLOYMENT_SCHEME !== "https" ? `:${Env.PORT}` : ""}`;
const endpoint = `${baseUrl}/api/repos/${orgSlug}/${repoSlug}/counters`;
console.log("hoc(layoutCounters): will fetch url:", endpoint);
fetch(endpoint, { credentials: "same-origin" })
.then((r) => (r.ok ? r.json() : {}))
.then((data) => {
if (data && Object.keys(data).length > 0) {
console.log("hoc(layoutCounters): fetched data:", data);
setLayoutCounters(data);
}
})
.catch((err) => {
const { message } = err as Error;
console.error("hoc(layoutCounters): fetch error:", message);
});
}, [orgSlug, repoSlug]);
const WrappedComponentEl = WrappedComponent as React.FC<P & LayoutProps>;
return (
<WrappedComponentEl
{...(props as unknown as P)}
{...(props as unknown as LayoutProps)}
orgSlug={orgSlug}
repoSlug={repoSlug}
layoutCounters={layoutCounters}
/>
);
};
return ComponentWithCounters;
}