import React, { useCallback, useMemo, useState } from 'react';
import { FunctionComponent } from 'react';
import { Pressable } from 'react-native';
import { useLinkQuery, useSolidAuth } from '@ldo/solid-react';
import { SolidProfileShapeType } from '../../../.ldo/profile.shapeTypes';
import { AgentInformation } from './AgentInformation';
import { InputDropdown } from '../../ui/input-dropdown';
import { useContactFilter } from './useContactFilter';
import { Plus } from '../../../lib/icons/Plus';
interface AgentInputProps {
onAddAgent: (webId: string) => void;
existingAgents: string[];
className?: string;
}
// Component for dropdown items with profile data
const ContactDropdownItem: FunctionComponent<{
webId: string;
onSelect: (webId: string) => void;
}> = ({ webId, onSelect }) => {
return (
onSelect(webId)}
>
);
};
const friendsLinkQuery = {
knows: {
'@id': true,
fn: true,
},
} as const;
export const AgentInput: FunctionComponent = ({
onAddAgent,
existingAgents,
className,
}) => {
const { session } = useSolidAuth();
const [inputValue, setInputValue] = useState('');
// Get current user's profile to access their "knows" list
const currentUserProfile = useLinkQuery(
SolidProfileShapeType,
session.webId!,
session.webId!,
friendsLinkQuery,
);
// Filter out contacts that are already in the individual agents section
const availableContacts = useMemo(() => {
if (!currentUserProfile?.knows) return [];
return currentUserProfile.knows
.filter((contact) => !existingAgents.includes(contact['@id']))
.map((contact) => contact['@id']);
}, [currentUserProfile?.knows, existingAgents]);
// Use the custom hook for filtering
const filteredContacts = useContactFilter(
availableContacts,
inputValue,
currentUserProfile?.knows ? Array.from(currentUserProfile.knows) : [],
);
const handleInputSubmit = useCallback(() => {
if (inputValue.trim()) {
// Check if it's a valid URI
try {
const url = new URL(inputValue);
onAddAgent(url.toString());
setInputValue('');
} catch {
// Do nothing
}
}
}, [inputValue, onAddAgent]);
const handleContactSelect = useCallback(
(webId: string) => {
onAddAgent(webId);
setInputValue('');
},
[onAddAgent],
);
// Filter function for the dropdown (now just returns the filtered contacts)
const filterContacts = useCallback(
(_contacts: string[], _searchText: string) => {
return filteredContacts;
},
[filteredContacts],
);
// Render function for dropdown items
const renderContactItem = useCallback(
(webId: string, onSelect: (webId: string) => void) => (
),
[],
);
return (
,
onPress: handleInputSubmit,
variant: 'secondary',
}}
onItemSelect={handleContactSelect}
className={className}
/>
);
};