The below code has search bar and searched tech cards and searched drop down in same file. How to form three separate files , one for search UI and functionality (doesn't return anything) and second only displaying searched tech cards and third displaying drop down after searching. Remember the props in given code should be retained but idk how to use them while displaying cards and drop-down in different components.
import React, { useState, useEffect } from "react";
import { Form } from "react-bootstrap";
import { authPost, authGet } from "../../api/api";
import { inputFieldsLength } from "../../globals/applicationConstants";
import TechnologyCard from "../../components/cards/TechnologyCard";
import {
BasePath,
GetAllGigWorkersPA,
GetRolesByType,
} from "../../globals/serviceURLs";
import { log } from "../../globals/log";
import { getAccessToken } from "../../globals/localStorage";
const SearchTechnology = ({
filter,
setFilter,
label,
data,
handleClick,
selected,
techCardNeeded,
role,
setRole,
setRoleList,
setRoles,
setTechError,
technologyTyped,
setTechnologyTyped,
}) => {
const [technologySuggestions, setTechnologySuggestions] = useState([]);
const [techTyped, setTechTyped] = useState("");
const token = getAccessToken();
useEffect(() => {
getRoles(filter.technology);
}, []);
const autosuggest = () => {
return (
<div className="suggestion-tech">
{technologySuggestions.map((item, index) => (
<div
className={techCardNeeded == "true" ? "" : "suggestion-tech-item"}
key={index}
onClick={() => handleTechnologySelected(item)}>
{techCardNeeded == "true" ? null : item.nme}
</div>
))}
</div>
);
};
const handleTechnologySelected = (technology) => {
filter.technology = technology;
setFilter(filter);
setTechError("");
setTechnologySuggestions([]);
setTechnologyTyped
? setTechnologyTyped(filter.technology.nme)
: setTechTyped(filter.technology.nme);
getRoles(filter.technology);
};
const handleTechnologyChange = (technologyStringTyped) => {
setTechnologyTyped
? setTechnologyTyped(technologyStringTyped)
: setTechTyped(technologyStringTyped);
technologyStringTyped = technologyStringTyped.trim();
if (technologyStringTyped.length >= 3) {
const path = `/tech/srch`;
const config = {
cont: technologyStringTyped,
count: inputFieldsLength.SearchResultsCount,
};
authGet(BasePath, path, config, token)
.then((res) => {
if (res.length === 0) {
setTechnologySuggestions([]);
} else if (res.length > 0) {
setTechnologySuggestions(res);
}
})
.catch(() => {});
} else if (
technologyStringTyped.length < inputFieldsLength.SearchStringMinLength
) {
setTechnologySuggestions([]);
}
};
const getRoles = (primaryTech) => {
let roleTypeArray = [];
roleTypeArray = [
...roleTypeArray,
filter.technology ? filter.technology.rtyp : undefined,
];
roleTypeArray = roleTypeArray.filter(function (el) {
return el != null;
});
const typ = new Set(roleTypeArray);
const config = {
caid: 2,
typ: Array.from(typ),
psz: 100,
pno: 0,
};
authGet(BasePath, GetRolesByType, config, token)
.then((res) => {
setRoles(res.lst);
setRolesByType(primaryTech ? primaryTech.rtyp : undefined, res.lst);
})
.catch((err) => {
console.log(err);
});
};
const setRolesByType = (roleType, roles) => {
let newRoles = roles.filter((i) => i.typ === roleType);
if (newRoles.length === 0) {
newRoles = roles;
}
setRoleList(newRoles);
if (roleType && role) {
for (let i in roles) {
if (roles[i].rid === role.rid) {
setRole(role);
break;
}
}
}
};
const form = () => {
return (
<Form.Group controlId="technology">
{label !== "" ? (
<Form.Label>
<b>Technology</b>
</Form.Label>
) : (
""
)}
<Form.Control
onChange={(e) => handleTechnologyChange(e.target.value)}
value={technologyTyped ? technologyTyped : techTyped}
type="text"
placeholder="Search for any technology"
className="technology-input"
/>
{autosuggest()}
</Form.Group>
);
};
return (
<>
{techCardNeeded === "true" ? (
technologyTyped === "" || techTyped === "" ? (
<>
{form()}
<div className="jb-list">
{data.map((item) => {
return (
<TechnologyCard
technology={item}
selected={selected(item)}
onClick={handleClick}
/>
);
})}
</div>
</>
) : (
<>
{form()}
<div className="jb-list">
{technologySuggestions.map((item) => {
return (
<TechnologyCard
technology={item}
selected={selected(item)}
onClick={handleClick}
/>
);
})}
</div>
</>
)
) : (
<>{form()}</>
)}
</>
);
};
export default SearchTechnology;