'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} ))}
); };