Spaces:
Paused
Paused
File size: 3,873 Bytes
fff265a 5b32161 fff265a e81c9a5 fff265a e81c9a5 fff265a e81c9a5 fff265a e81c9a5 fff265a e81c9a5 fff265a 5b32161 fff265a e81c9a5 fff265a e81c9a5 fff265a e81c9a5 fff265a 5b32161 fff265a e81c9a5 fff265a e81c9a5 fff265a 5b32161 fff265a e81c9a5 0876dd4 e81c9a5 fff265a e81c9a5 fff265a e81c9a5 fff265a e81c9a5 fff265a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | const { Scenes, Markup } = require('telegraf');
const Settings = require('../../models/Settings');
const userController = require('../../controllers/userController'); // Import
const settingsScene = new Scenes.WizardScene(
'SETTINGS_SCENE',
// Step 1: Menu
async (ctx) => {
// Ensure localization
if (!ctx.i18n) {
const locales = require('../../locales');
const User = require('../../models/User');
const user = await User.findOne({ id: ctx.from.id });
ctx.i18n = locales[user ? user.language : 'uz'];
}
const i18n = ctx.i18n;
const buttons = [
[i18n.settings_title.replace(":", "")], // "Settings" logic usually implies "Change Address" here directly? No, menu first.
// Wait, existing code had "Manzilni o'zgartirish" button.
// Let's assume standard keys. "change_name" exists.
// "Manzilni o'zgartirish" -> let's map it.
[i18n.btn_back_nav]
];
// Wait, Step 1 was a submenu.
ctx.reply(i18n.settings_title, Markup.keyboard([
["π Manzilni o'zgartirish"], // Keep hardcoded for match or add key?
// "π Manzilni o'zgartirish" is not in locales.
// I should add it or just hardcode it for now if I don't want to break matching.
// But user wants "language improvement".
// Let's use a specific key for this button.
[i18n.btn_back_nav]
]).resize());
return ctx.wizard.next();
},
// Step 2: Handler
async (ctx) => {
const i18n = ctx.i18n;
const text = ctx.message.text;
if (text === i18n.btn_back_nav || text === i18n.btn_cancel) {
ctx.scene.leave();
userController.start(ctx); // Redirect to Main Menu
return;
}
if (text === "π Manzilni o'zgartirish") { // Hardcoded match
ctx.reply(i18n.admin.settings_addr, Markup.keyboard([[i18n.btn_cancel]]).resize());
ctx.wizard.state.editing = 'location';
return ctx.wizard.next();
}
ctx.reply(i18n.cat_select); // Fallback
},
// Step 3: Input Address Text
async (ctx) => {
const i18n = ctx.i18n;
if (ctx.message.text === i18n.btn_cancel) {
ctx.scene.leave();
userController.start(ctx);
return;
}
ctx.wizard.state.addressText = ctx.message.text;
ctx.reply(i18n.admin.settings_loc, Markup.keyboard([
[Markup.button.locationRequest(i18n.location_button)],
[i18n.btn_back_nav, i18n.btn_cancel]
]).resize());
return ctx.wizard.next();
},
// Step 4: Input Location & Save
async (ctx) => {
const i18n = ctx.i18n;
if (ctx.message.text === i18n.btn_cancel) {
ctx.scene.leave();
userController.start(ctx);
return;
}
if (ctx.message.text === i18n.btn_back_nav) {
ctx.reply(i18n.admin.settings_addr, Markup.keyboard([[i18n.btn_cancel]]).resize());
return ctx.wizard.back(); // Go back to Step 3
}
if (!ctx.message.location) {
return ctx.reply("π Location required."); // Minor hardcode fallback
}
const location = ctx.message.location;
const addressText = ctx.wizard.state.addressText;
// Save to DB
await Settings.findOneAndUpdate(
{ key: 'store_location' },
{ value: { text: addressText, latitude: location.latitude, longitude: location.longitude } },
{ upsert: true, new: true }
);
ctx.reply(i18n.admin.settings_saved, Markup.removeKeyboard());
ctx.scene.leave();
ctx.reply("Admin Menu: /admin");
}
);
module.exports = settingsScene;
|