'use client';
import React, {
createContext,
FC,
useCallback,
useMemo,
useState,
ReactNode,
} from 'react';
import clsx from 'clsx';
import useCookie from 'react-use-cookie';
import useSWR from 'swr';
import { orderBy } from 'lodash';
import { SVGLine } from '@gitroom/frontend/components/launches/launches.component';
import ImageWithFallback from '@gitroom/react/helpers/image.with.fallback';
import SafeImage from '@gitroom/react/helpers/safe.image';
import { useFetch } from '@gitroom/helpers/utils/custom.fetch';
import { useWaitForClass } from '@gitroom/helpers/utils/use.wait.for.class';
import { MultiMediaComponent } from '@gitroom/frontend/components/media/media.component';
import { Integration } from '@prisma/client';
import Link from 'next/link';
import { useParams, usePathname, useRouter } from 'next/navigation';
import { useT } from '@gitroom/react/translation/get.transation.service.client';
export const MediaPortal: FC<{
media: { path: string; id: string }[];
value: string;
setMedia: (event: {
target: {
name: string;
value?: {
id: string;
path: string;
alt?: string;
thumbnail?: string;
thumbnailTimestamp?: number;
}[];
};
}) => void;
}> = ({ media, setMedia, value }) => {
const waitForClass = useWaitForClass('copilotKitMessages');
const t = useT();
if (!waitForClass) return null;
return (
{}}
onClose={() => {}}
/>
);
};
export const AgentList: FC<{ onChange: (arr: any[]) => void }> = ({
onChange,
}) => {
const fetch = useFetch();
const t = useT();
const [selected, setSelected] = useState([]);
const load = useCallback(async () => {
return (await (await fetch('/integrations/list')).json()).integrations;
}, []);
const [collapseMenu, setCollapseMenu] = useCookie('collapseMenu', '0');
const { data } = useSWR('integrations', load, {
revalidateOnFocus: false,
revalidateOnReconnect: false,
revalidateIfStale: false,
revalidateOnMount: true,
refreshWhenHidden: false,
refreshWhenOffline: false,
fallbackData: [],
});
const setIntegration = useCallback(
(integration: Integration) => () => {
if (selected.some((p) => p.id === integration.id)) {
onChange(selected.filter((p) => p.id !== integration.id));
setSelected(selected.filter((p) => p.id !== integration.id));
} else {
onChange([...selected, integration]);
setSelected([...selected, integration]);
}
},
[selected]
);
const sortedIntegrations = useMemo(() => {
return orderBy(
data || [],
['type', 'disabled', 'identifier'],
['desc', 'asc', 'asc']
);
}, [data]);
return (
{t('select_channels', 'Select Channels')}
setCollapseMenu(collapseMenu === '1' ? '0' : '1')}
className="-mt-3 group-[.sidebar]:rotate-[180deg] group-[.sidebar]:mx-auto text-btnText bg-btnSimple rounded-[6px] w-[24px] h-[24px] flex items-center justify-center cursor-pointer select-none"
>
{sortedIntegrations.map((integration, index) => (
p.id === integration.id) && 'opacity-20'
)}
>
{(integration.inBetweenSteps || integration.refreshNeeded) && (
)}
{integration.name}
))}
);
};
export const PropertiesContext = createContext({ properties: [] });
export const Agent: FC<{ children: ReactNode }> = ({ children }) => {
const [properties, setProperties] = useState([]);
return (
{children}
);
};
const Threads: FC = () => {
const fetch = useFetch();
const router = useRouter();
const pathname = usePathname();
const t = useT();
const threads = useCallback(async () => {
return (await fetch('/copilot/list')).json();
}, []);
const { id } = useParams<{ id: string }>();
const { data } = useSWR('threads', threads);
return (
{t('start_a_new_chat', 'Start a new chat')}
{data?.threads?.map((p: any) => (
{p.title}
))}
);
};