const renderItem = ({ item }: {item : siteDataCard}) => {
return (
<SiteCard key={item.key} siteName = {item.siteName} status={item.status} alarmCount ={item.alarmCount} siteCapacity ={item.siteCapacity}
performanceRatio = {item.performanceRatio} dailyEnergy = {item.energyToday} outputActivePower = {item.outputActivePower}
></SiteCard>
)
};
const AccountScreen = ({sites, ...props} : {sites :Array<site>}) => {
let [skip, setSkip] = useState(true);
let [dataLoaded, setDataLoaded] = useState(false);
let [page, setPage] = useState(1);
let [siteDataList, setSiteDataList] = useState<Array<siteDataCard>>([]);
let [visible, setVisible] = useState(false);
let [errors, setErrors] = useState('');
let [dailyEnergy, setDailyEnergy] = useState({});
let [siteKeys,setSiteKeys] = useState<Array<string>>([]);
let [search, setSearch] = useState('');
let {data : sitesData, isSuccess : sitesQuerySuccess} = useLoggedInUserSitesQuery({per : 10, page : page, search : search});
let [trigger, result] = useLazySiteAlarmCountDataQuery();
let [sitesTrigger, {data : sitesResult, isSuccess : isLazySiteQuerySuccess}] = useLazyLoggedInUserSitesQuery();
let [siteLevelDataTrigger, {data : siteLevelResult, isSuccess : isLazySiteLevelQuerySuccess}] = useLazySiteLevelDataForSiteQuery();
let [latestDataTrigger, {data : latestDataResult}] = useLazyLatestEventDataQuery();
const onChange = (search : string) => {
setSearch(search);
setSiteDataList([]);
}
if(sites && sites.length > 0 && dataLoaded === false) {
let siteKeys: Array<string> = [];
sites.forEach(site => {
siteKeys.push(site.site_key);
})
trigger({siteKeys});
let siteLevelDataPayloadForEnergyAndPR : siteDataQuery = {
startTime : moment().startOf('day').valueOf(),
endTime : moment().endOf('day').valueOf(),
timeGrouping : 'DAY',
cumulate : false,
provideBufferData : false,
bufferInterval : null,
suppressErrors : true,
limit : null,
siteParameterAggregationType : {}
}
if(siteKeys.length > 0) {
let paramAggregation : {[key : string] : any} = siteLevelDataPayloadForEnergyAndPR.siteParameterAggregationType;
siteKeys.forEach(siteKey => {
let option : Array<ParameterDataQueryOption> = [{ parameterName: "Daily Energy", dataQueryOperation: null }, { parameterName: "Total Energy", dataQueryOperation: null },
{parameterName : 'Performance Ratio', dataQueryOperation : null}];
let currentSiteKey : string = siteKey;
paramAggregation[currentSiteKey] = option;
})
siteLevelDataPayloadForEnergyAndPR.siteParameterAggregationType = paramAggregation
}
siteLevelDataTrigger(siteLevelDataPayloadForEnergyAndPR);
let latestDataPayload : siteLatestDataRequest = {
startTime : moment().startOf('day').valueOf(),
endTime : moment().endOf('day').valueOf(),
validateParameterPresence : true,
suppressErrors : true,
siteParameterList : {}
}
if(siteKeys.length > 0) {
let siteParameterList : {[key : string] : any} = latestDataPayload.siteParameterList;
siteKeys.forEach(siteKey => {
let option : Array<string> = ['Output Active Power'];
let currentSiteKey : string = siteKey;
siteParameterList[currentSiteKey] = option;
})
latestDataPayload.siteParameterList = siteParameterList;
}
latestDataTrigger(latestDataPayload);
setDataLoaded(true)
}
return (
<AccountContainer>
<Header ></Header>
<ScrollView style = {accountStyles.accountBar}>
<AccountBar></AccountBar>
</ScrollView>
{sitesData ? sitesData.elements.map(site => {
let alarmData = result ? result.data ? result.data : null : null;
let totalAlarmCount = 0;
let prValue : number | string = '-';
let dailyEnergyValue : number | string = '-';
let oapValue : number | string = '-';
let allDataLoaded = false;
if(alarmData !== null) {
alarmData.forEach(alarm => {
if(alarm.siteKey === site.site_key) {
totalAlarmCount += alarm.noDataInverterAlarmCount;
totalAlarmCount += alarm.noDataRuleEvaluationLogsCount;
totalAlarmCount += alarm.openCommunicationLogsCount;
totalAlarmCount += alarm.openInverterAlarmCount;
totalAlarmCount += alarm.openRuleEvaluationLogsCount;
}
})
}
if(siteLevelResult) {
let originalResult = siteLevelResult.result;
originalResult.forEach(siteResult => {
if(siteResult.site_key === site.site_key) {
let valueData = siteResult.data;
valueData.forEach(siteData => {
console.log(siteData)
if(siteData.parameter_name === "Daily Energy") {
dailyEnergyValue = siteData.value;
}
if(siteData.parameter_name === 'Performance Ratio') {
prValue = siteData.value;
}
})
}
})
}
if(latestDataResult) {
let originalResult = latestDataResult.result;
originalResult.forEach(siteResult => {
if(siteResult.site_key === site.site_key) {
let valueData = siteResult.data;
valueData.forEach(siteData => {
console.log(siteData)
if(siteData.parameter_name === "Output Active Power") {
oapValue = siteData.value;
}
})
}
})
allDataLoaded = true;
}
if(allDataLoaded) {
let sitePresent : boolean = false;
siteDataList.forEach(siteCard => {
if(siteCard.key === site.site_key) {
sitePresent = true;
}
});
if(!sitePresent)
siteDataList.push({key : site.site_key, siteName : site.name, status : site.status, alarmCount : totalAlarmCount, siteCapacity : site.site_capacity, performanceRatio : prValue, energyToday : dailyEnergyValue, outputActivePower : oapValue});
}
})
: null}
<View style={accountStyles.searchBar}>
<SearchTextBar
label="Search"
value={search}
onChangeText={text => onChange(text)}
autoCapitalize="none"
></SearchTextBar>
</View>
<View style = {accountStyles.flatListView}>
<FlatList data = {siteDataList} renderItem = {renderItem} />
</View>
<View style = {accountStyles.actionButtons}>
<Button mode="contained" style = {{backgroundColor : 'white'}} disabled = {page === 1? true : false} onPress={() => {
setPage(page - 1);
setSiteDataList([]);
let siteKeys: Array<string> = [];
sites.forEach(site => {
siteKeys.push(site.site_key);
})
trigger({siteKeys});
let siteLevelDataPayloadForEnergyAndPR : siteDataQuery = {
startTime : moment().startOf('day').valueOf(),
endTime : moment().endOf('day').valueOf(),
timeGrouping : 'DAY',
cumulate : false,
provideBufferData : false,
bufferInterval : null,
suppressErrors : true,
limit : null,
siteParameterAggregationType : {}
}
if(siteKeys.length > 0) {
let paramAggregation : {[key : string] : any} = siteLevelDataPayloadForEnergyAndPR.siteParameterAggregationType;
siteKeys.forEach(siteKey => {
let option : Array<ParameterDataQueryOption> = [{ parameterName: "Daily Energy", dataQueryOperation: null }, { parameterName: "Total Energy", dataQueryOperation: null },
{parameterName : 'Performance Ratio', dataQueryOperation : null}];
let currentSiteKey : string = siteKey;
paramAggregation[currentSiteKey] = option;
})
siteLevelDataPayloadForEnergyAndPR.siteParameterAggregationType = paramAggregation
}
siteLevelDataTrigger(siteLevelDataPayloadForEnergyAndPR);
let latestDataPayload : siteLatestDataRequest = {
startTime : moment().startOf('day').valueOf(),
endTime : moment().endOf('day').valueOf(),
validateParameterPresence : true,
suppressErrors : true,
siteParameterList : {}
}
if(siteKeys.length > 0) {
let siteParameterList : {[key : string] : any} = latestDataPayload.siteParameterList;
siteKeys.forEach(siteKey => {
let option : Array<string> = ['Output Active Power'];
let currentSiteKey : string = siteKey;
siteParameterList[currentSiteKey] = option;
})
latestDataPayload.siteParameterList = siteParameterList;
}
latestDataTrigger(latestDataPayload);
sitesData ? sitesData.elements.map(site => {
let alarmData = result ? result.data ? result.data : null : null;
let totalAlarmCount = 0;
let prValue : number | string = '-';
let dailyEnergyValue : number | string = '-';
let oapValue : number | string = '-';
let allDataLoaded = false;
if(alarmData !== null) {
alarmData.forEach(alarm => {
if(alarm.siteKey === site.site_key) {
totalAlarmCount += alarm.noDataInverterAlarmCount;
totalAlarmCount += alarm.noDataRuleEvaluationLogsCount;
totalAlarmCount += alarm.openCommunicationLogsCount;
totalAlarmCount += alarm.openInverterAlarmCount;
totalAlarmCount += alarm.openRuleEvaluationLogsCount;
}
})
}
if(siteLevelResult) {
let originalResult = siteLevelResult.result;
originalResult.forEach(siteResult => {
if(siteResult.site_key === site.site_key) {
let valueData = siteResult.data;
valueData.forEach(siteData => {
console.log(siteData)
if(siteData.parameter_name === "Daily Energy") {
dailyEnergyValue = siteData.value;
}
if(siteData.parameter_name === 'Performance Ratio') {
prValue = siteData.value;
}
})
}
})
}
if(latestDataResult) {
let originalResult = latestDataResult.result;
originalResult.forEach(siteResult => {
if(siteResult.site_key === site.site_key) {
let valueData = siteResult.data;
valueData.forEach(siteData => {
console.log(siteData)
if(siteData.parameter_name === "Output Active Power") {
oapValue = siteData.value;
}
})
}
})
allDataLoaded = true;
}
if(allDataLoaded) {
let sitePresent : boolean = false;
siteDataList.forEach(siteCard => {
if(siteCard.key === site.site_key) {
sitePresent = true;
}
});
if(!sitePresent)
siteDataList.push({key : site.site_key, siteName : site.name, status : site.status, alarmCount : totalAlarmCount, siteCapacity : site.site_capacity, performanceRatio : prValue, energyToday : dailyEnergyValue, outputActivePower : oapValue});
}
}): null
}}>
<Text style = {{color : 'black'}}>Back</Text>
</Button>
<Button mode="contained" style = {{backgroundColor : 'white'}} onPress={() => {
setPage(page +1);
setSiteDataList([]);
let siteKeys: Array<string> = [];
sites.forEach(site => {
siteKeys.push(site.site_key);
})
trigger({siteKeys});
let siteLevelDataPayloadForEnergyAndPR : siteDataQuery = {
startTime : moment().startOf('day').valueOf(),
endTime : moment().endOf('day').valueOf(),
timeGrouping : 'DAY',
cumulate : false,
provideBufferData : false,
bufferInterval : null,
suppressErrors : true,
limit : null,
siteParameterAggregationType : {}
}
if(siteKeys.length > 0) {
let paramAggregation : {[key : string] : any} = siteLevelDataPayloadForEnergyAndPR.siteParameterAggregationType;
siteKeys.forEach(siteKey => {
let option : Array<ParameterDataQueryOption> = [{ parameterName: "Daily Energy", dataQueryOperation: null }, { parameterName: "Total Energy", dataQueryOperation: null },
{parameterName : 'Performance Ratio', dataQueryOperation : null}];
let currentSiteKey : string = siteKey;
paramAggregation[currentSiteKey] = option;
})
siteLevelDataPayloadForEnergyAndPR.siteParameterAggregationType = paramAggregation
}
siteLevelDataTrigger(siteLevelDataPayloadForEnergyAndPR);
let latestDataPayload : siteLatestDataRequest = {
startTime : moment().startOf('day').valueOf(),
endTime : moment().endOf('day').valueOf(),
validateParameterPresence : true,
suppressErrors : true,
siteParameterList : {}
}
if(siteKeys.length > 0) {
let siteParameterList : {[key : string] : any} = latestDataPayload.siteParameterList;
siteKeys.forEach(siteKey => {
let option : Array<string> = ['Output Active Power'];
let currentSiteKey : string = siteKey;
siteParameterList[currentSiteKey] = option;
})
latestDataPayload.siteParameterList = siteParameterList;
}
latestDataTrigger(latestDataPayload);
sitesData ? sitesData.elements.map(site => {
let alarmData = result ? result.data ? result.data : null : null;
let totalAlarmCount = 0;
let prValue : number | string = '-';
let dailyEnergyValue : number | string = '-';
let oapValue : number | string = '-';
let allDataLoaded = false;
if(alarmData !== null) {
alarmData.forEach(alarm => {
if(alarm.siteKey === site.site_key) {
totalAlarmCount += alarm.noDataInverterAlarmCount;
totalAlarmCount += alarm.noDataRuleEvaluationLogsCount;
totalAlarmCount += alarm.openCommunicationLogsCount;
totalAlarmCount += alarm.openInverterAlarmCount;
totalAlarmCount += alarm.openRuleEvaluationLogsCount;
}
})
}
if(siteLevelResult) {
let originalResult = siteLevelResult.result;
originalResult.forEach(siteResult => {
if(siteResult.site_key === site.site_key) {
let valueData = siteResult.data;
valueData.forEach(siteData => {
console.log(siteData)
if(siteData.parameter_name === "Daily Energy") {
dailyEnergyValue = siteData.value;
}
if(siteData.parameter_name === 'Performance Ratio') {
prValue = siteData.value;
}
})
}
})
}
if(latestDataResult) {
let originalResult = latestDataResult.result;
originalResult.forEach(siteResult => {
if(siteResult.site_key === site.site_key) {
let valueData = siteResult.data;
valueData.forEach(siteData => {
console.log(siteData)
if(siteData.parameter_name === "Output Active Power") {
oapValue = siteData.value;
}
})
}
})
allDataLoaded = true;
}
if(allDataLoaded) {
let sitePresent : boolean = false;
siteDataList.forEach(siteCard => {
if(siteCard.key === site.site_key) {
sitePresent = true;
}
});
if(!sitePresent)
siteDataList.push({key : site.site_key, siteName : site.name, status : site.status, alarmCount : totalAlarmCount, siteCapacity : site.site_capacity, performanceRatio : prValue, energyToday : dailyEnergyValue, outputActivePower : oapValue});
}
}): null;
setSiteDataList(siteDataList);
}}>
<Text style = {{color : 'black'}}>Next</Text>
</Button>
</View>
</AccountContainer>
)
}
const accountStyles = StyleSheet.create({
accountBar : {
width : '100%',
backgroundColor : '#313644',
paddingLeft : 20,
paddingRight : 20,
paddingTop : 30,
flex : 1
},
pageView : {
width : '100%',
},
searchBar : {
alignItems : 'center',
padding : 10,
},
flatListView : {
flex : 3,
},
actionButtons : {
display : 'flex',
flexDirection : 'row',
marginVertical : 10,
alignItems : 'center',
justifyContent : 'space-around'
}
})
function mapStateToProps(state : RootState) {
return {
sites : state.sitesSlice.sites
};
}
export default connect(mapStateToProps)(AccountScreen)
I am using Stack RTK Query, React Native for Mobile App Development. I am absolute beginner to using these 2 stacks. I am looking into using a flatlist and adding pagination to it using a back and a next button provided just at the end of the list. Now the data for the list is fetched using 4 different queries, First problem is I am looking at a way to combine these queries and execute them parallely, Second I am looking at how to use the query trigger manually, I am using a lazy use query hook but where should I trigger the same, should I change the state and the hook should trigger automatically or should I compute all the data on press of next/back and then rerender the component?
This is how I would approach it
In your createApi
getUsers: builder.query({
query: (page) => `users?page=${page}&perPage=25`,
}),
In your component
const [noMoreResults, setNoMoreResults] = useState(false);
const [page, setPage] = useState(1)
const [users, setUsers] = useState([]);
const { data = [] } = useGetUsersQuery(page, {
skip: noMoreResults
});
useEffect(() => {
if(data.length) {
setUsers([...users, ...data]);
} else if(page > 1) {
setNoMoreResults(true);
}
}, [data]);
return (
<>
{users.map((user) => (
<>
User: {user.id} <br />
<>
))}
<input type="button" onClick={() => setPage(page+1)}>Next page</input>
</>
)
This should work.
"message is not defined" my code is really bad plz dont judge :(
client.on('message', msg => {
if (message.content.startsWith === 'd?ban') {
if (!message.member.hasPermission("BAN_MEMBERS")) return message.channel.send("Invalid Permissions")
let User = message.guild.member(message.mentions.users.first()) || message.guild.members.get(args[0])
if (!User) return message.channel.send("Invalid User")
if (User.hasPermission("BAN_MEMBERS")) return message.reply("Invalid Permissions")
let banReason = args.join(" ").slice(22);
if (!banReason) {
banReason = "None"
}}})
Make sure to check your variable names for consistency. You named the message object in the function as msg but you tried accessing it later as message.
Try this:
client.on('message', message => {
if (message.content.startsWith === 'd?ban') {
if (!message.member.hasPermission("BAN_MEMBERS")) return message.channel.send("Invalid Permissions")
let User = message.guild.member(message.mentions.users.first()) || message.guild.members.get(args[0])
if (!User) return message.channel.send("Invalid User")
if (User.hasPermission("BAN_MEMBERS")) return message.reply("Invalid Permissions")
let banReason = args.join(" ").slice(22);
if (!banReason) {
banReason = "None"
}}})
I made 3 API calls in the same function. I call this function with the click method. But when I call the function, I cannot make the 2nd API call because the state is not updated. I can access the state outside the function but I need to access it inside. I've read some articles but still don't know exactly how to fix the problem.
Function:
const setInfos = async (e) => {
document.querySelector(".buyer-infos").classList.remove("dropdown-active");
await http
.get(`api/common/clients/getClients?kelime=${userValue}`, {
headers: {
Authorization: token,
},
})
.then((res) => {
if (res.status === 200 || res.statusText === "OK") {
// res.data.value.map((val) => console.log(val.Id));
// console.log("target =====", parseInt(e.target.id));
const companyId = parseInt(e.target.id);
res.data.value
.filter((fval) => fval.Id === companyId)
.map((val) => val.TCKN_VN !== null && setTckn(val.TCKN_VN));
console.log('2',tckn);
}
setUserValue(e.target.innerText);
})
.catch((err) => console.log(err));
await http
.get(`api/invoice/einvoice/checkCustomerTaxId/${tckn}`, {
headers: {
Authorization: token,
},
})
.then((res) => {
console.log("E-fatura kullanıcısı? =>", res);
setInvoiceUser(res.data.HttpStatusCode);
if (
res.data.value === "E-Fatura Kullanıcısı Değil" ||
res.data.message === "E-Fatura Kullanıcısı Değil"
) {
// res.data.value.map(val => console.log('http',val));
alert("E-Fatura Kullanıcısı Değil");
setTckn("");
document.querySelector(".tck-vergi-no").focus();
document.querySelector(".tck-vergi-no").style.border =
"1px solid #FF0000";
document.querySelector(".tck-vergi-no").style.outline = "none";
}
})
.catch((err) => console.log(err));
if (invoiceUser === 400) {
alert("E-Fatura Kullanıcısı Değil");
} else {
await http
.get(`api/common/clients/getClients?kelime=${userValue}`, {
headers: {
Authorization: token,
},
})
.then((res) => {
if (res.status === 200 || res.statusText === "OK") {
console.log("kelime", res.data.value);
res.data.value.forEach((val) => {
// console.log("INFOS", val.Id);
// console.log("infoos target", parseInt(e.target.id));
if (val.Id === parseInt(e.target.id)) {
// console.log('IF', val);
val.Title !== null ? setTitle(val.Title) : setTitle("");
val.TaxOffice !== null && setTaxOffice(val.TaxOffice || "");
val.Phone !== null && setTel(val.Phone || "");
val.Email !== null && setEmail(val.Email || "");
val.Fax !== null && setFax(val.Fax || "");
val.Country !== null && setCountry(val.Country || "");
val.City !== null && setCity(val.City || "");
val.Town !== null && setTown(val.Town || "");
val.Address !== null && setStreet(val.Address || "");
val.BuildingName !== null &&
setBuildingName(val.BuildingName || "");
val.BuildingNumber !== null &&
setBuildingNo(val.BuildingNumber || "");
val.DoorNumber !== null && setDoorNo(val.DoorNumber || "");
val.PostCode !== null && setPostCode(val.PostCode || "");
val.WebAdress !== null && setWeb(val.WebAdress || "");
}
});
setUserValue(e.target.innerText);
}
})
.catch((err) => console.log(err));
} };
State: const [tckn, setTckn] = useState("");
I want to trigger my WaitAnswerIntentHandler only if RandomLetterIntentHandler was triggered before.
Currently my second intent can be triggered with {animal}{country}{color}{food} utterances (not all required and can be in any order) but it need the first intent for make the logic I want.
const RandomLetterIntentHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'RandomLetterIntent';
},
handle(handlerInput) {
// **get a letter from the user**
const requestAttributes = handlerInput.attributesManager.getRequestAttributes();
const randomLetter = randomLetterGenerator.getOneRandomLetter();
const speechText = requestAttributes.t('RANDOM_LETTER_ASK', randomLetter);
timerUtils.startTimer();
puntuacion = 0;
letter= randomLetter;
return handlerInput.responseBuilder
.speak(speechText)
.reprompt(speechText)
.getResponse();
}
};
const WaitAnswerIntentHandler = {
canHandle(handlerInput){
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'WaitAnswerIntent'
&& gameState > 0;
},
handle(handlerInput){
### **// get {animal}{country}{color}{food} (not all required and can be in any order) but need the letter that is obtained in the previous intent**
const intent = handlerInput.requestEnvelope.request.intent;
const animal = intent.slots.ANIMAL.value;
const country = intent.slots.COUNTRY.value;
const color = intent.slots.COLOR.value;
const food = intent.slots.FOOD.value;
let cadenaFinal = '';
let tiempoFinal = 0;
if(animal && animal[0]===letter){
puntuacion = puntuacion + 10;
cadenaFinal = cadenaFinal + ' ' + animal;
}
if(country && country[0]===letter){
puntuacion = puntuacion + 10;
cadenaFinal = cadenaFinal + ' ' + country;
}
if(color && color[0]===letter){
puntuacion = puntuacion + 10;
cadenaFinal = cadenaFinal + ' ' + color;
}
if(food && food[0]===letter){
puntuacion = puntuacion + 10;
cadenaFinal = cadenaFinal + ' ' + food;
}
tiempoFinal = timerUtils.endTimer();
puntuacion = puntuacion - tiempoFinal;
if(!cadenaFinal){cadenaFinal='ninguna'}
const repromtText = 'pídeme otra letra para seguir jugando';
const speakOutput = `Tu respuesta válida fue ${cadenaFinal}, has tardado ${tiempoFinal.toString()} segundos y tu puntuación es ${puntuacion.toString()}`;
gameState = 0;
return handlerInput.responseBuilder
.speak(speakOutput)
.reprompt(repromtText)
.getResponse();
}
};
You could add a new session attribute called state and validate it in your canHandle function.
In your case, after RandomLetterIntentHandler is handled you could set state to answer or whatever name do you think best suits it and then in WaitAnswerIntentHandler canHandle function check if the state is answer. If it is, handle the request and set state to a default value or remove it. This way WaitAnswerIntentHandler will only be invoked after RandomLetterIntentHandler.
More concrete example can be found in alexa sdk repo 'High Low' game.
This is best solution from an oficial amazon developer.
const Alexa = require('ask-sdk-core');
let hello = false;
const LaunchRequestHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
},
handle(handlerInput) {
const speechText = 'Welcome to the Alexa Skills Kit, you can say hello!';
return handlerInput.responseBuilder
.speak(speechText)
.reprompt(speechText)
.getResponse();
},
};
const HelloWorldIntentHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'IntentRequest'
&& handlerInput.requestEnvelope.request.intent.name === 'HelloWorldIntent';
},
handle(handlerInput) {
hello = true;
const speechText = `Hello`;
return handlerInput.responseBuilder
.speak(speechText)
.reprompt(speechText)
.getResponse();
},
};
const ByeIntentHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'IntentRequest'
&& handlerInput.requestEnvelope.request.intent.name === 'ByeIntent';
},
handle(handlerInput) {
let speechText;
if (!hello) {
speechText = 'dont say bye before hello';
return handlerInput.responseBuilder
.speak(speechText)
.reprompt(speechText)
.getResponse();
}
speechText = `Bye`;
return handlerInput.responseBuilder
.speak(speechText)
.reprompt(speechText)
.getResponse();
},
};
const ErrorHandler = {
canHandle(handlerInput, error) {
return true;
},
handle(handlerInput, error) {
return handlerInput.responseBuilder
.speak('I do not understand what you say')
.getResponse();
},
};
const SessionEndedRequestHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'SessionEndedRequest';
},
handle(handlerInput) {
console.log(`Session ended with reason: ${handlerInput.requestEnvelope.request.reason}`);
hello = false;
return handlerInput.responseBuilder.getResponse();
},
};
const skillBuilder = Alexa.SkillBuilders.custom();
exports.handler = skillBuilder
.addRequestHandlers(
LaunchRequestHandler,
HelloWorldIntentHandler,
ByeIntentHandler,
SessionEndedRequestHandler
)
.addErrorHandlers(ErrorHandler)
.lambda();
renderIconWrapper = (altText,imgSrc) => {
return (
<IconWrapper>
<DoctorImage alt={altText} src={imgSrc}/>
</IconWrapper>
)
}
render(){
const {gender, detailsGender, providerDetailTypeNm} = this.props;
if (providerDetailTypeNm === "Professional") {
if (gender === "M" || detailsGender === "Male") {
this.renderIconWrapper('male-avatar',maleAvatar)
} else if (gender === 'F') {
this.renderIconWrapper('female-avatar',femaleAvatar)
}
} else if (providerDetailTypeNm === 'Facility' || providerDetailTypeNm === 'Supplier Business') {
this.renderIconWrapper('fa-hospital',faHospital)
} else if (providerDetailTypeNm === 'Group') {
this.renderIconWrapper('fa-users',faUsers)
} else {
this.renderIconWrapper('fa-users',faUsers)
}
}
I am getting Invariant Violation: ...): Nothing was returned from render.
Could some one let me know what is the errors into the code I think I am missing something or some error into the syntax.
Thanks
Although renderIconWrapper method returns a JSX element, you are not returning the result of it from render. Call return from render to return the result of this.renderIconWrapper
renderIconWrapper = (altText,imgSrc) => {
return (
<IconWrapper>
<DoctorImage alt={altText} src={imgSrc}/>
</IconWrapper>
)
}
render(){
const {gender, detailsGender, providerDetailTypeNm} = this.props;
if (providerDetailTypeNm === "Professional") {
if (gender === "M" || detailsGender === "Male") {
return this.renderIconWrapper('male-avatar',maleAvatar)
} else if (gender === 'F') {
return this.renderIconWrapper('female-avatar',femaleAvatar)
}
} else if (providerDetailTypeNm === 'Facility' || providerDetailTypeNm === 'Supplier Business') {
return this.renderIconWrapper('fa-hospital',faHospital)
} else if (providerDetailTypeNm === 'Group') {
return this.renderIconWrapper('fa-users',faUsers)
} else {
return this.renderIconWrapper('fa-users',faUsers)
}
}