import { IconButton, Size, Type } from 'browndash-components'; import * as React from 'react'; import { FaCaretDown, FaCaretUp } from 'react-icons/fa'; import { GrClose } from 'react-icons/gr'; import { DocListCast, StrListCast } from '../../../../fields/Doc'; import { List } from '../../../../fields/List'; import { StrCast } from '../../../../fields/Types'; import { LightboxView } from '../../LightboxView'; import { Colors } from '../../global/globalEnums'; import { IBounds } from '../ExploreView/utils'; import { NewLightboxView } from '../NewLightboxView'; import { IRecommendation, Recommendation } from '../components'; import { IDocRequest, fetchKeywords, fetchRecommendations } from '../utils'; import './RecommendationList.scss'; import { IRecommendationList } from './utils'; export const RecommendationList = (props: IRecommendationList) => { const { loading, keywords } = props; const [loadingKeywords, setLoadingKeywords] = React.useState(true); const [showMore, setShowMore] = React.useState(false); const [keywordsLoc, setKeywordsLoc] = React.useState([]); const [update, setUpdate] = React.useState(true); const initialRecs: IRecommendation[] = [{ loading: true }, { loading: true }, { loading: true }, { loading: true }, { loading: true }]; const [recs, setRecs] = React.useState(initialRecs); React.useEffect(() => { const getKeywords = async () => { let text = StrCast(LightboxView.LightboxDoc?.text); console.log('[1] fetching keywords'); const response = await fetchKeywords(text, 5, true); console.log('[2] response:', response); const kw = response.keywords; console.log(kw); NewLightboxView.SetKeywords(kw); if (LightboxView.LightboxDoc) { console.log('setting keywords on doc'); LightboxView.LightboxDoc.keywords = new List(kw); setKeywordsLoc(NewLightboxView.Keywords); } setLoadingKeywords(false); }; let keywordsList = StrListCast(LightboxView.LightboxDoc!.keywords); if (!keywordsList || keywordsList.length < 2) { setLoadingKeywords(true); getKeywords(); setUpdate(!update); } else { setKeywordsLoc(keywordsList); setLoadingKeywords(false); setUpdate(!update); } }, [NewLightboxView.LightboxDoc]); // terms: vannevar bush, information spaces, React.useEffect(() => { const getRecommendations = async () => { console.log('fetching recommendations'); let query = 'undefined'; if (keywordsLoc) query = keywordsLoc.join(','); let src = StrCast(NewLightboxView.LightboxDoc?.text); let dashDocs: IDocRequest[] = []; // get linked docs let linkedDocs = DocListCast(NewLightboxView.LightboxDoc?.links); console.log('linked docs', linkedDocs); // get context docs (docs that are also in the collection) // let contextDocs: Doc[] = DocListCast(DocCast(LightboxView.LightboxDoc?.context).data) // let docId = LightboxView.LightboxDoc && LightboxView.LightboxDoc[Id] // console.log("context docs", contextDocs) // contextDocs.forEach((doc: Doc) => { // if (docId !== doc[Id]){ // dashDocs.push({ // title: StrCast(doc.title), // text: StrCast(doc.text), // id: doc[Id], // type: StrCast(doc.type) // }) // } // }) console.log('dash docs', dashDocs); if (query !== undefined) { const response = await fetchRecommendations(src, query, [], true); const num_recs = response.num_recommendations; const recs = response.recommendations; const keywords = response.keywords; const response_bounds: IBounds = { max_x: response.max_x, max_y: response.max_y, min_x: response.min_x, min_y: response.min_y, }; // if (NewLightboxView.NewLightboxDoc) { // NewLightboxView.NewLightboxDoc.keywords = new List(keywords); // setKeywordsLoc(NewLightboxView.Keywords); // } // console.log(response_bounds) NewLightboxView.SetBounds(response_bounds); const recommendations: IRecommendation[] = []; for (const key in recs) { console.log(key); const title = recs[key].title; const url = recs[key].url; const type = recs[key].type; const text = recs[key].text; const transcript = recs[key].transcript; const previewUrl = recs[key].previewUrl; const embedding = recs[key].embedding; const distance = recs[key].distance; const source = recs[key].source; const related_concepts = recs[key].related_concepts; const docId = recs[key].doc_id; related_concepts.length >= 1 && recommendations.push({ title: title, data: url, type: type, text: text, transcript: transcript, previewUrl: previewUrl, embedding: embedding, distance: Math.round(distance * 100) / 100, source: source, related_concepts: related_concepts, docId: docId, }); } recommendations.sort((a, b) => { if (a.distance && b.distance) { return a.distance - b.distance; } else return 0; }); console.log('[rec]: ', recommendations); NewLightboxView.SetRecs(recommendations); setRecs(recommendations); } }; getRecommendations(); }, [update]); return (
{ e.stopPropagation(); }}>
Recommendations
{NewLightboxView.LightboxDoc && (
The recommendations are produced based on the text in the document{' '} {StrCast(NewLightboxView.LightboxDoc.title)} . The following keywords are used to fetch the recommendations.
)}
Keywords
{loadingKeywords ? (
) : (
{keywordsLoc && keywordsLoc.map((word, ind) => { return (
{word} } onClick={() => { let kw = keywordsLoc; kw.splice(ind); NewLightboxView.SetKeywords(kw); }} />
); })}
)} {!showMore ? (
{ setShowMore(true); }}> More
) : (
{ setShowMore(false); }}> Less
Type
Sources
)}
{recs && recs.map((rec: IRecommendation) => { return ; })}
); };