Как создать структуру типа context.Provider / context.Consumer для передачи значений в приложении бота? - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь передать свойство, которое находится внутри первой позиции массива объектов, в другой модуль, чтобы я мог использовать это значение позже. Я пытался передать его как модуль (аргументы), но он продолжает читать значение по умолчанию, равное 0. Есть ли способ сделать это?

Я пытался реализовать React.context, но эмулятор фреймворка Bot отказывается от него.

/////////////////Module that ll acquire the value/////////////////////////////
    getCard(bot, builder, params) {
        let configValues = { ...params[0] }

        bot.dialog(`${configValues.path}`, function (session) {
            var msg = new builder.Message(session);

            const cardItem = (obj) => {
                return (new builder.HeroCard(session)
                    .title(`${obj.title}`)
                    .text(`R$ ${obj.price}`)
                    .images([builder.CardImage.create(session, `${obj.img}`)])
                    .buttons([
                        builder.CardAction.imBack(session, `${obj.price} Item adicionado!`, 'add to cart')
                        // !onClick event must add the current obj.price to 
                        // the configValues.total(Ex: configValues.total += obj.price)!
                    ])
                )
            }
            msg.attachmentLayout(builder.AttachmentLayout.carousel)
            msg.attachments(
                eval(params.map(obj => cardItem(obj)))
            );
            //!in here before end the dialog is where i want to update
// the configValues.total so i can show it in the -> Checkout module
            session.send(msg).endDialog()
        }).triggerAction({ matches: configValues.regex });
    }
}
//////////////CheckOut.Module///////////////////////////////
{...}
let configValues = { ...params[0] }
    let state = {
        nome: "",
        endereco: "",
        pagamento: "",
        total: configValues.total // this is the value to be read
    }

    bot.dialog('/intent', [
        {...},
        (session, results) => {
            state.pagamento = results.response
            session.send(
                JSON.stringify(state) // here is the place to be printed
            )
        {...}   
    ]
    ).triggerAction({ matches: /^(finalizar|checar|encerrar|confirmar pedido|terminar)/i })

1 Ответ

0 голосов
/ 10 апреля 2019

Поскольку вы решили свою первоначальную задачу, я отвечу на одну в вашем комментарии.

Ваша проблема здесь:

cartId.map((obj, i , arr) => {
            // if (!obj.total) {
            //     obj.total.reduce(i => i += i)
            // }
            const newtotal = new total
            newtotal.getTotals(bot, builder, obj, arr)
        })

cartId содержит итоговые значения для каждого из вашихПредметы.Когда вы звоните на map, вы передаете каждый элемент индивидуально getTotals, который передает каждый элемент checkout()

Причина, по которой вы не можете сложить все суммы и можете только суммироватьИтогом одного предмета является то, что вы передаете cartId в checkout, а cartId был изменен только на один предмет.Вместо этого вы можете сделать несколько разных вещей:

  1. Пропустить целое cartId из cartItems и использовать что-то вроде for (var key in cartItems) в totalConstructor() и checkoutConstructor().Это, вероятно, самый простой, но не очень эффективный способ использования памяти.

  2. Использование хранилища состояний BotBuilder для хранения массива totals в userData, а затем сумма вконец.Это может быть более трудным для реализации, но будет гораздо лучшим путем. Вот пример , который может помочь вам начать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...