import React, {useEffect, useState} from 'react'; import ReactGA from 'react-ga'; import { useTheme } from '@material-ui/core/styles'; import {Link} from 'react-router-dom'; import { Search as SearchIcon, CloudQueue as CloudQueueIcon, Code as CodeIcon } from '@material-ui/icons'; import algoliasearch from 'algoliasearch/lite'; import { InstantSearch, Configure, connectSearchBox, connectHits, connectHitInsights } from 'react-instantsearch-dom'; import aa from 'search-insights' import { Zoom, Grid, Paper, TextField, ButtonBase, InputAdornment, Typography, Button, Tooltip } from '@material-ui/core'; const searchClient = algoliasearch("JNSS5CFDZZ", "db08e40265e2941b9a7d8f644b6e5240") //const searchClient = algoliasearch("L55H18ZINA", "a19be455e7e75ee8f20a93d26b9fc6d6") const AppGrid = props => { const { maxRows, showName, showSuggestion, isMobile, globalUrl, parsedXs, userdata } = props const isCloud = window.location.host === "localhost:3002" || window.location.host === "shuffler.io"; const rowHandler = maxRows === undefined || maxRows === null ? 50 : maxRows const xs = parsedXs === undefined || parsedXs === null ? isMobile ? 6 : 2 : parsedXs const theme = useTheme(); //const [apps, setApps] = React.useState([]); //const [filteredApps, setFilteredApps] = React.useState([]); const [formMail, setFormMail] = React.useState(""); const [message, setMessage] = React.useState(""); const [formMessage, setFormMessage] = React.useState(""); const buttonStyle = {borderRadius: 30, height: 50, width: 220, margin: isMobile ? "15px auto 15px auto" : 20, fontSize: 18,} const innerColor = "rgba(255,255,255,0.65)" const borderRadius = 3 window.title = "Shuffle | Apps | Find and integrate any app" const submitContact = (email, message) => { const data = { "firstname": "", "lastname": "", "title": "", "companyname": "", "email": email, "phone": "", "message": message, } const errorMessage = "Something went wrong. Please contact frikky@shuffler.io directly." fetch(globalUrl+"/api/v1/contact", { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(data), }) .then(response => response.json()) .then(response => { if (response.success === true) { setFormMessage(response.reason) //alert.info("Thanks for submitting!") } else { setFormMessage(errorMessage) } setFormMail("") setMessage("") }) .catch(error => { setFormMessage(errorMessage) console.log(error) }); } const SearchBox = ({currentRefinement, refine, isSearchStalled} ) => { useEffect(() => { if (window !== undefined && window.location !== undefined && window.location.search !== undefined && window.location.search !== null) { const urlSearchParams = new URLSearchParams(window.location.search) const params = Object.fromEntries(urlSearchParams.entries()) const foundQuery = params["q"] if (foundQuery !== null && foundQuery !== undefined) { console.log("Got query: ", foundQuery) refine(foundQuery) } } }, []) return (
), }} autoComplete='off' type="search" color="primary" defaultValue={currentRefinement} placeholder="Find Apps..." id="shuffle_search_field" onChange={(event) => { refine(event.currentTarget.value) }} limit={5} /> {/*isSearchStalled ? 'My search is stalled' : ''*/} ) } var workflowDelay = -50 const Hits = ({ hits, insights }) => { const [mouseHoverIndex, setMouseHoverIndex] = useState(-1) var counted = 0 //console.log(hits) //var curhits = hits //if (hits.length > 0 && defaultApps.length === 0) { // setDefaultApps(hits) //} //const [defaultApps, setDefaultApps] = React.useState([]) //console.log(hits) //if (hits.length > 0 && hits.length !== innerHits.length) { // setInnerHits(hits) //} return ( {hits.map((data, index) => { workflowDelay += 50 const paperStyle = { backgroundColor: index === mouseHoverIndex ? "rgba(255,255,255,0.8)" : theme.palette.inputColor, color: index === mouseHoverIndex ? theme.palette.inputColor : "rgba(255,255,255,0.8)", border: `1px solid ${innerColor}`, padding: 15, cursor: "pointer", position: "relative", minHeight: 116, } if (counted === 12/xs*rowHandler) { return null } counted += 1 var parsedname = "" for (var key = 0; key < data.name.length; key++) { var character = data.name.charAt(key) if (character === character.toUpperCase()) { //console.log(data.name[key], data.name[key+1]) if (data.name.charAt(key+1) !== undefined && data.name.charAt(key+1) === data.name.charAt(key+1).toUpperCase()) { } else { parsedname += " " } } parsedname += character } parsedname = (parsedname.charAt(0).toUpperCase()+parsedname.substring(1)).replaceAll("_", " ") return ( { setMouseHoverIndex(index) /* ReactGA.event({ category: "app_grid_view", action: `search_bar_click`, label: "", }) */ }} onMouseOut={() => { setMouseHoverIndex(-1) }} onClick={() => { if (isCloud) { ReactGA.event({ category: "app_grid_view", action: `app_${parsedname}_${data.id}_click`, label: "", }) } //const searchClient = algoliasearch("L55H18ZINA", "a19be455e7e75ee8f20a93d26b9fc6d6") console.log(searchClient) aa('init', { appId: searchClient.appId, apiKey: searchClient.transporter.queryParameters["x-algolia-api-key"] }) const timestamp = new Date().getTime() aa('sendEvents', [ { eventType: 'click', eventName: 'Product Clicked', index: 'appsearch', objectIDs: [data.objectID], timestamp: timestamp, queryID: data.__queryID, positions: [data.__position], userToken: userdata === undefined || userdata === null || userdata.id === undefined ? "unauthenticated" : userdata.id, } ]) }}> {data.name}
{index === mouseHoverIndex || showName === true ? parsedname : null } {data.generated ? {data.invalid ? : } : } ) })} ) } const CustomSearchBox = connectSearchBox(SearchBox) const CustomHits = connectHits(Hits) //const CustomHits = connectHitInsights(aa)(Hits) const selectButtonStyle = { minWidth: 150, maxWidth: 150, minHeight: 50, } return (
{/*
*/}
{showSuggestion === true ?
Can't find what you're looking for?
setFormMail(e.target.value)} /> setMessage(e.target.value)} />
{formMessage}
: null } Search by Algolia logo
) } export default AppGrid;