// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: MIT-0 import React, { useCallback, useEffect, useState } from "react"; import Button from "aws-northstar/components/Button"; import Modal from "aws-northstar/components/Modal"; import Multiselect from "aws-northstar/components/Multiselect"; import Form from "aws-northstar/components/Form"; import FormField from "aws-northstar/components/FormField"; import Autosuggest from "aws-northstar/components/Autosuggest"; import Badge from "aws-northstar/components/Badge"; import { useCallCompleted } from "../hooks"; import { AGENT_NAME, genLogger, LAMBDA_PREFIX, valueToOption, spacesToCamel, } from "../lib"; const name = "TaggingModal"; const { log, error } = genLogger(name); const getThemes = () => fetch( `https://${LAMBDA_PREFIX}.execute-api.us-east-1.amazonaws.com/getThemes` ).then((res) => res.json()); const sendCallTags = ({ intent, contactId, dropdownValues }) => { const appendParams = (url, obj) => { Object.keys(obj).forEach((k) => { const val = obj[k]; typeof val !== "undefined" && url.searchParams.append(k, val); }); }; const url = new URL( `https://${LAMBDA_PREFIX}.execute-api.us-east-1.amazonaws.com/updateIntentTable` ); const params = { agentName: AGENT_NAME, intent, connectID: contactId || "unknown", secondIntent: dropdownValues[0], thirdIntent: dropdownValues[1], }; appendParams(url, params); return fetch(url, { method: "post" }); }; const updateDBwithNewCallID = (id) => { log("update db", id); fetch( `https://${LAMBDA_PREFIX}.execute-api.us-east-1.amazonaws.com/newConnectID?agentName=${AGENT_NAME}&connectID=${id}`, { method: "post" } ).then((res) => res.text()); }; const TaggingModal = ({ intent }) => { const [visible, setVisible] = useState(false); const [tagOptions, setTagOptions] = useState([]); const [data, setData] = useState(null); const [selectedIntent, setSelectedIntent] = useState({}); useEffect(() => { if (typeof intent === "string") setSelectedIntent(valueToOption(intent)); }, [intent]); const onCallCompleted = useCallback((c) => { const contactId = c.getContactId(); const attr = c.getAttributes(); const intent = spacesToCamel(attr.initialIntent.value); log("new contactId, sending:", contactId); updateDBwithNewCallID(contactId); setVisible(true); setData({ contactId, intent, dropdownValues: [], }); }, []); useCallCompleted(onCallCompleted); useEffect(() => { let isCancelled = false; const asyncFunc = async () => { try { const themes = await getThemes(); if (Array.isArray(themes)) { if (!isCancelled) { setTagOptions(themes.map(({ title }) => valueToOption(title))); } } } catch (e) { if (!isCancelled) error(e); } }; asyncFunc(); return () => (isCancelled = true); }, []); const onInputChange = (v) => setSelectedIntent(v); const onMultiselectChange = (arr) => { const dropdownValues = arr.map(({ value }) => value); setData((pd) => ({ ...pd, dropdownValues })); }; const submitModal = () => { log("submit!", selectedIntent.value); closeModal(selectedIntent.value); }; const closeModal = (selectedIntent) => { if (typeof selectedIntent === "string") { if (selectedIntent.trim() !== "") data.intent = selectedIntent; } if (data !== null) { log("data to send", data); sendCallTags(data); setData(null); } else { error("data was null"); } setVisible(false); }; // Callback to re-render when there's a new selected intent // NorthStar Autosuggest only takes value on first render const MainTagSelect = useCallback( () => ( ), [selectedIntent, tagOptions] ); return (
} >
); }; export default TaggingModal;