tg app fix sizes

This commit is contained in:
xds
2025-10-27 17:17:13 +03:00
parent 95165f3529
commit f049e202e4
5 changed files with 77 additions and 82 deletions

View File

@@ -1,93 +1,97 @@
<script setup>
<script setup lang="ts">
import SpaceList from "@/components/space-list/SpaceList.vue";
import {useSpaceStore} from "@/stores/spaceStore";
import {computed, onMounted, ref} from "vue";
import { useSpaceStore } from "@/stores/spaceStore";
import { computed, onMounted, onBeforeUnmount, ref } from "vue";
import Toolbar from "@/components/Toolbar.vue";
import {useToolbarStore} from "@/stores/toolbar-store";
import router from "@/router/index.js";
import { useToolbarStore } from "@/stores/toolbar-store";
import router from "@/router"; // если у тебя index.ts экспортирует по умолчанию, можно без /index.js
const spaceStore = useSpaceStore();
const toolbarStore = useToolbarStore()
const toolbarStore = useToolbarStore();
// true/false, есть ли Telegram WebApp
const isTelegram = computed(() => !!(window as any)?.Telegram?.WebApp);
const isSpaceSelectorVisible = ref(false);
const isSpaceSelected = computed(() => {
return spaceStore.selectedSpaceId === undefined || isSpaceSelectorVisible.value;
})
const isSpaceSelected = computed(
() => spaceStore.selectedSpaceId === undefined || isSpaceSelectorVisible.value
);
const menu = [
{
name: "Dashboard",
icon: "pi pi-chart-bar",
link: "/",
},
{
name: "Transactions",
icon: "pi pi-cog",
link: "/transactions",
},
{
name: "Settings",
icon: "pi pi-list",
link: "/settings",
}
]
{ name: "Dashboard", icon: "pi pi-chart-bar", link: "/" },
{ name: "Transactions", icon: "pi pi-cog", link: "/transactions" },
{ name: "Settings", icon: "pi pi-list", link: "/settings" },
];
const spaceSelected = () => {
router.push('/')
isSpaceSelectorVisible.value = false
function spaceSelected() {
router.push("/");
isSpaceSelectorVisible.value = false;
}
onMounted(() => {
toolbarStore.registerHandler('openSpacePicker', () => {
isSpaceSelectorVisible.value = true
toolbarStore.registerHandler("openSpacePicker", () => {
isSpaceSelectorVisible.value = true;
});
let tgApp = window.Telegram.WebApp
tgApp.ready()
tgApp.requestFullscreen()
tgApp.lockOrientation()
})
const tgApp = (window as any)?.Telegram?.WebApp;
if (tgApp) {
try {
tgApp.ready();
tgApp.expand?.(); // более мягкий вариант, чем requestFullscreen()
tgApp.requestFullscreen?.();
tgApp.lockOrientation?.();
} catch {
/* ignore */
}
}
});
onBeforeUnmount(() => {
toolbarStore.unregisterHandler("openSpacePicker");
});
</script>
<template>
<body class="flex flex-col" :class="window.Telegram.WebApp ? 'tg' : ''">
<SpaceList v-if="isSpaceSelected" @space-selected="spaceSelected()"
/>
<div v-else class="flex flex-col w-full gap-4">
<div class="w-full flex flex-row justify-items-end items-end justify-end pt-4 pe-4">
<Toolbar class=""/>
</div>
<div class="flex flex-col w-full h-full justify-items-end justify-end items-end px-4 gap-4 sticky">
<!-- <div class="w-fit flex flex-row items-center gap-2 p-2 bg-white rounded-full !text-xl sticky"-->
<!-- >-->
<!-- <span class=" px-1 " @click="isSpaceSelectorVisible=true">{{ spaceStore.selectedSpaceName }}</span>-->
<!-- <Divider layout="vertical" class="!h-full !m-0 !text-black !bg-black"/>-->
<!-- <i class="pi pi-plus !text-lg px-2"/>-->
<!-- </div>-->
<div class="flex flex-col tg">
<SpaceList v-if="isSpaceSelected" @space-selected="spaceSelected" />
<router-view class="w-full"/>
<div v-else class="flex flex-col w-full gap-4">
<div class="w-full flex flex-row items-end justify-end pt-4 pe-4">
<Toolbar />
</div>
</div>
<div
class="w-full flex flex-row items-center justify-items-center justify-between fixed bottom-0 h-16 px-10 bg-white z-50 ">
<router-link v-for="itemKey in menu.keys()" :key="itemKey" :to="menu[itemKey].link" class="items-center">
<div class="w-fit flex flex-col justify-center items-center justify-items-center gap-0">
<i class="!text-lg" :class="menu[itemKey].icon"/>
<span class="text-lg font-medium text-gray-900">{{ menu[itemKey].name }}</span>
<div class="flex flex-col w-full h-full items-end px-4 gap-4">
<router-view class="w-full" />
</div>
<nav class="fixed inset-x-0 bottom-0 z-50 h-16 bg-white px-10">
<div class="flex h-full items-center justify-between">
<router-link
v-for="item in menu"
:key="item.link"
:to="item.link"
class="flex w-fit flex-col items-center gap-2"
>
<i class="!text-lg" :class="item.icon" />
<span class=" font-medium text-gray-900">{{ item.name }}</span>
</router-link>
</div>
</router-link>
</nav>
<!-- отступ под нижний navbar, чтобы контент не перекрывался -->
<div class="h-16" />
</div>
</div>
</body>
</template>
<style scoped>
/* Порядок отступов: top right bottom left */
.tg {
padding: var(--tg-content-safe-area-inset-top) var(--tg-content-safe-area-inset-bottom) var(--tg-content-safe-area-inset-left) var(--tg-content-safe-area-inset-right) !important;
width: 100% !important;
padding:
var(--tg-content-safe-area-inset-top)
var(--tg-content-safe-area-inset-right)
var(--tg-content-safe-area-inset-bottom)
var(--tg-content-safe-area-inset-left) !important;
}
</style>
</style>