Вариант 1
1. На сервере есть endpoint, который принимает от клиента информацию о состоянии (например, текущая страница визарда).
Этот endpoint возвращает клиенту, например, перечень страниц визарда, куда можно пойти с текущей страницы (с учетом текущих данных).
2. Сервер определяет это на основании информации о разрешенных переходах, которая может выглядеть так:
val AllowedTransitions = mapOf<Bp1AddCmdState, List<Bp1AddCmdState>>(
NEW to listOf(WAITING_FOR_COMPANY_URL),
WAITING_FOR_COMPANY_URL to listOf(WAITING_FOR_CONTACT_DATA_TYPE, CANCELING),
WAITING_FOR_CONTACT_DATA_TYPE to listOf(WAITING_FOR_EMAIL, WAITING_FOR_CONTACT_FORM_URL, CANCELING),
WAITING_FOR_EMAIL to listOf(WAITING_FOR_NOTE, CANCELING),
WAITING_FOR_CONTACT_FORM_URL to listOf(WAITING_FOR_NOTE, CANCELING),
WAITING_FOR_NOTE to listOf(SAVING_DATA_IN_CAPSULE, CANCELING),
SAVING_DATA_IN_CAPSULE to listOf(END),
CANCELING to listOf(END),
END to listOf()
)
Из состояния
NEW можно перейти в состояние
WAITING_FOR_COMPANY_URL.
Источник:
https://github.com/mentiflectax/altruix-is/blob/master/src/main/kotlin/cc/altruix/is1/telegram/cmd/bp1add/Bp1AddCmdAutomaton.ktЭто старый код телеграм-бота, в котором было реализовано некое подобие визарда.
Вариант 2
1. Таблица переходов хранится на клиенте. У нее есть версия.
2. Время от времени клиент обращается к серверу и передает текующую версию таблицы переходов на клиенте.
3. Если на сервере версия таблицы переходов больше (новее), чем на клиента, то клиент скачивает новую версию.
Примечание: Это может работать только, если изменяться может последовательность переходов, но не сами страницы (содержимое отдельных частей визарда).