diff --git a/apps/web/app/_assets/globals.css b/apps/web/app/_assets/globals.css deleted file mode 100644 index 5d83f12..0000000 --- a/apps/web/app/_assets/globals.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - background: var(--tg-theme-secondary-bg-color, white); -} diff --git a/apps/web/app/_assets/ton.svg b/apps/web/app/_assets/ton.svg deleted file mode 100644 index 1983df4..0000000 --- a/apps/web/app/_assets/ton.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/web/app/error.tsx b/apps/web/app/error.tsx deleted file mode 100644 index ad511b4..0000000 --- a/apps/web/app/error.tsx +++ /dev/null @@ -1,5 +0,0 @@ -'use client'; - -import { ErrorPage } from '@/components/ErrorPage'; - -export default ErrorPage; diff --git a/apps/web/app/favicon.ico b/apps/web/app/favicon.ico deleted file mode 100644 index 718d6fe..0000000 Binary files a/apps/web/app/favicon.ico and /dev/null differ diff --git a/apps/web/app/init-data/page.tsx b/apps/web/app/init-data/page.tsx deleted file mode 100644 index c04b22e..0000000 --- a/apps/web/app/init-data/page.tsx +++ /dev/null @@ -1,121 +0,0 @@ -'use client'; - -import { useMemo } from 'react'; -import { useSignal, initData, type User } from '@telegram-apps/sdk-react'; -import { List, Placeholder } from '@telegram-apps/telegram-ui'; - -import { - DisplayData, - type DisplayDataRow, -} from '@/components/DisplayData/DisplayData'; -import { Page } from '@/components/Page'; - -function getUserRows(user: User): DisplayDataRow[] { - return [ - { title: 'id', value: user.id.toString() }, - { title: 'username', value: user.username }, - { title: 'photo_url', value: user.photoUrl }, - { title: 'last_name', value: user.lastName }, - { title: 'first_name', value: user.firstName }, - { title: 'is_bot', value: user.isBot }, - { title: 'is_premium', value: user.isPremium }, - { title: 'language_code', value: user.languageCode }, - { title: 'allows_to_write_to_pm', value: user.allowsWriteToPm }, - { title: 'added_to_attachment_menu', value: user.addedToAttachmentMenu }, - ]; -} - -export default function InitDataPage() { - const initDataRaw = useSignal(initData.raw); - const initDataState = useSignal(initData.state); - - const initDataRows = useMemo(() => { - if (!initDataState || !initDataRaw) { - return; - } - const { - authDate, - hash, - queryId, - chatType, - chatInstance, - canSendAfter, - startParam, - } = initDataState; - return [ - { title: 'raw', value: initDataRaw }, - { title: 'auth_date', value: authDate.toLocaleString() }, - { title: 'auth_date (raw)', value: authDate.getTime() / 1000 }, - { title: 'hash', value: hash }, - { - title: 'can_send_after', - value: initData.canSendAfterDate()?.toISOString(), - }, - { title: 'can_send_after (raw)', value: canSendAfter }, - { title: 'query_id', value: queryId }, - { title: 'start_param', value: startParam }, - { title: 'chat_type', value: chatType }, - { title: 'chat_instance', value: chatInstance }, - ]; - }, [initDataState, initDataRaw]); - - const userRows = useMemo(() => { - return initDataState && initDataState.user - ? getUserRows(initDataState.user) - : undefined; - }, [initDataState]); - - const receiverRows = useMemo(() => { - return initDataState && initDataState.receiver - ? getUserRows(initDataState.receiver) - : undefined; - }, [initDataState]); - - const chatRows = useMemo(() => { - if (!initDataState?.chat) { - return; - } - const { - id, - title, - type, - username, - photoUrl, - } = initDataState.chat; - - return [ - { title: 'id', value: id.toString() }, - { title: 'title', value: title }, - { title: 'type', value: type }, - { title: 'username', value: username }, - { title: 'photo_url', value: photoUrl }, - ]; - }, [initData]); - - if (!initDataRows) { - return ( - - - Telegram sticker - - - ); - } - return ( - - - - {userRows && } - {receiverRows && } - {chatRows && } - - - ); -}; diff --git a/apps/web/app/launch-params/page.tsx b/apps/web/app/launch-params/page.tsx deleted file mode 100644 index 861a2f8..0000000 --- a/apps/web/app/launch-params/page.tsx +++ /dev/null @@ -1,33 +0,0 @@ -'use client'; - -import { useLaunchParams } from '@telegram-apps/sdk-react'; -import { List } from '@telegram-apps/telegram-ui'; - -import { DisplayData } from '@/components/DisplayData/DisplayData'; -import { Page } from '@/components/Page'; - -export default function LaunchParamsPage() { - const lp = useLaunchParams(); - - return ( - - - - - - ); -}; diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index e2145a6..1fb90c2 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -1,17 +1,15 @@ -import { Root } from '@/components/Root/Root'; -import { I18nProvider } from '@/core/i18n/provider'; +import { Root } from '@/components/telegram'; +import { I18nProvider } from '@/utils/i18n/provider'; import { type Metadata } from 'next'; import { getLocale } from 'next-intl/server'; import { type PropsWithChildren } from 'react'; -import '@telegram-apps/telegram-ui/dist/styles.css'; -import './_assets/globals.css'; export const metadata: Metadata = { description: 'Your application description goes here', title: 'Your Application Title Goes Here', }; -export default async function RootLayout({ children }: PropsWithChildren) { +export default async function RootLayout({ children }: Readonly) { const locale = await getLocale(); return ( diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx index cadfbb9..a21501b 100644 --- a/apps/web/app/page.tsx +++ b/apps/web/app/page.tsx @@ -1,35 +1,14 @@ 'use client'; -import { Link } from '@/components/Link/Link'; -import { LocaleSwitcher } from '@/components/LocaleSwitcher/LocaleSwitcher'; -import { Page } from '@/components/Page'; -import { Cell, List, Section } from '@telegram-apps/telegram-ui'; -import { useTranslations } from 'next-intl'; +import { initData, isMiniAppDark, useSignal } from '@telegram-apps/sdk-react'; -export default function Home() { - const t = useTranslations('i18n'); +export default function InitDataPage() { + const initDataState = useSignal(initData.state); + const isDark = isMiniAppDark(); return ( - - -
- - Init Data - - - Launch Parameters - - - Theme Parameters - -
-
- -
-
-
+ + {JSON.stringify(initDataState, null, 2)} + ); } diff --git a/apps/web/app/theme-params/page.tsx b/apps/web/app/theme-params/page.tsx deleted file mode 100644 index 7a68c9a..0000000 --- a/apps/web/app/theme-params/page.tsx +++ /dev/null @@ -1,30 +0,0 @@ -'use client'; - -import { useSignal, themeParams } from '@telegram-apps/sdk-react'; -import { List } from '@telegram-apps/telegram-ui'; - -import { DisplayData } from '@/components/DisplayData/DisplayData'; -import { Page } from '@/components/Page'; - -export default function ThemeParamsPage() { - const tp = useSignal(themeParams.state); - - return ( - - - ({ - title: title - .replace(/[A-Z]/g, (m) => `_${m.toLowerCase()}`) - .replace(/background/, 'bg'), - value, - })) - } - /> - - - ); -}; diff --git a/apps/web/app/ton-connect/page.tsx b/apps/web/app/ton-connect/page.tsx deleted file mode 100644 index a2c83c1..0000000 --- a/apps/web/app/ton-connect/page.tsx +++ /dev/null @@ -1,105 +0,0 @@ -'use client'; - -import { openLink } from '@telegram-apps/sdk-react'; -import { Page } from '@/components/Page'; -import { TonConnectButton, useTonWallet } from '@tonconnect/ui-react'; -import { - Avatar, - Cell, - List, - Navigation, - Placeholder, - Section, - Text, - Title, -} from '@telegram-apps/telegram-ui'; - -import { DisplayData } from '@/components/DisplayData/DisplayData'; - -import './styles.css'; - -export default function TONConnectPage() { - const wallet = useTonWallet(); - if (!wallet) { - return ( - - - - To display the data related to the TON Connect, it is required - to connect your wallet - - - - } - /> - - ); - } - - const { - account: { chain, publicKey, address }, - device: { - appName, - appVersion, - maxProtocolVersion, - platform, - features, - }, - } = wallet; - - return ( - - - {'imageUrl' in wallet && ( - <> -
- - } - after={About wallet} - subtitle={wallet.appName} - onClick={(e) => { - e.preventDefault(); - openLink(wallet.aboutUrl); - }} - > - {wallet.name} - -
- - - )} - - typeof f === 'object' ? f.name : undefined) - .filter(v => v) - .join(', '), - }, - ]} - /> -
-
- ); -}; diff --git a/apps/web/app/ton-connect/styles.css b/apps/web/app/ton-connect/styles.css deleted file mode 100644 index 42eac0b..0000000 --- a/apps/web/app/ton-connect/styles.css +++ /dev/null @@ -1,16 +0,0 @@ -.ton-connect-page__placeholder { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - box-sizing: border-box; -} - -.ton-connect-page__button { - margin: 16px auto 0; -} - -.ton-connect-page__button-connected { - margin: 16px 24px 16px auto; -} diff --git a/apps/web/components/DisplayData/DisplayData.tsx b/apps/web/components/DisplayData/DisplayData.tsx deleted file mode 100644 index 882c1c0..0000000 --- a/apps/web/components/DisplayData/DisplayData.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import { isRGB } from '@telegram-apps/sdk-react'; -import { Cell, Checkbox, Section } from '@telegram-apps/telegram-ui'; -import type { FC, ReactNode } from 'react'; - -import { RGB } from '@/components/RGB/RGB'; -import { Link } from '@/components/Link/Link'; - -import './styles.css'; - -export type DisplayDataRow = - & { title: string } - & ( - | { type: 'link'; value?: string } - | { value: ReactNode } - ) - -export interface DisplayDataProps { - header?: ReactNode; - footer?: ReactNode; - rows: DisplayDataRow[]; -} - -export const DisplayData: FC = ({ header, rows }) => ( -
- {rows.map((item, idx) => { - let valueNode: ReactNode; - - if (item.value === undefined) { - valueNode = empty; - } else { - if ('type' in item) { - valueNode = Open; - } else if (typeof item.value === 'string') { - valueNode = isRGB(item.value) - ? - : item.value; - } else if (typeof item.value === 'boolean') { - valueNode = ; - } else { - valueNode = item.value; - } - } - - return ( - - - {valueNode} - - - ); - })} -
-); diff --git a/apps/web/components/DisplayData/styles.css b/apps/web/components/DisplayData/styles.css deleted file mode 100644 index e30b7be..0000000 --- a/apps/web/components/DisplayData/styles.css +++ /dev/null @@ -1,15 +0,0 @@ -.display-data__header { - font-weight: 400; -} - -.display-data__line { - padding: 16px 24px; -} - -.display-data__line-title { - color: var(--tg-theme-subtitle-text-color); -} - -.display-data__line-value { - word-break: break-word; -} diff --git a/apps/web/components/ErrorBoundary.tsx b/apps/web/components/ErrorBoundary.tsx deleted file mode 100644 index a9dfed1..0000000 --- a/apps/web/components/ErrorBoundary.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { - Component, - type ComponentType, - type GetDerivedStateFromError, - type PropsWithChildren, -} from 'react'; - -export interface ErrorBoundaryProps extends PropsWithChildren { - fallback: ComponentType<{ error: Error }>; -} - -interface ErrorBoundaryState { - error?: Error; -} - -export class ErrorBoundary extends Component { - state: ErrorBoundaryState = {}; - - // eslint-disable-next-line max-len - static getDerivedStateFromError: GetDerivedStateFromError = (error) => ({ error }); - - componentDidCatch(error: Error) { - this.setState({ error }); - } - - render() { - const { - state: { - error, - }, - props: { - fallback: Fallback, - children, - }, - } = this; - - return error ? : children; - } -} diff --git a/apps/web/components/ErrorPage.tsx b/apps/web/components/ErrorPage.tsx deleted file mode 100644 index 1ae3956..0000000 --- a/apps/web/components/ErrorPage.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { useEffect } from 'react'; - -export function ErrorPage({ - error, - reset, -}: { - error: Error & { digest?: string } - reset?: () => void -}) { - useEffect(() => { - // Log the error to an error reporting service - console.error(error); - }, [error]); - - return ( -
-

An unhandled error occurred!

-
- - {error.message} - -
- {reset && } -
- ); -} \ No newline at end of file diff --git a/apps/web/components/Link/Link.tsx b/apps/web/components/Link/Link.tsx deleted file mode 100644 index 702a204..0000000 --- a/apps/web/components/Link/Link.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { openLink, classNames } from '@telegram-apps/sdk-react'; -import { type FC, type MouseEventHandler, type JSX, useCallback } from 'react'; -import { type LinkProps as NextLinkProps, default as NextLink } from 'next/link'; - -import './styles.css'; - -export interface LinkProps extends NextLinkProps, Omit { -} - -export const Link: FC = ({ - className, - onClick: propsOnClick, - href, - ...rest -}) => { - const onClick = useCallback>((e) => { - propsOnClick?.(e); - - // Compute if target path is external. In this case we would like to open link using - // TMA method. - let path: string; - if (typeof href === 'string') { - path = href; - } else { - const { search = '', pathname = '', hash = '' } = href; - path = `${pathname}?${search}#${hash}`; - } - - const targetUrl = new URL(path, window.location.toString()); - const currentUrl = new URL(window.location.toString()); - const isExternal = targetUrl.protocol !== currentUrl.protocol - || targetUrl.host !== currentUrl.host; - - if (isExternal) { - e.preventDefault(); - openLink(targetUrl.toString()); - } - }, [href, propsOnClick]); - - return ( - - ); -}; diff --git a/apps/web/components/Link/styles.css b/apps/web/components/Link/styles.css deleted file mode 100644 index 7251d50..0000000 --- a/apps/web/components/Link/styles.css +++ /dev/null @@ -1,4 +0,0 @@ -.link { - text-decoration: none; - color: var(--tg-theme-link-color); -} \ No newline at end of file diff --git a/apps/web/components/LocaleSwitcher/LocaleSwitcher.tsx b/apps/web/components/LocaleSwitcher/LocaleSwitcher.tsx deleted file mode 100644 index f695d5e..0000000 --- a/apps/web/components/LocaleSwitcher/LocaleSwitcher.tsx +++ /dev/null @@ -1,26 +0,0 @@ -'use client'; - -import { Select } from '@telegram-apps/telegram-ui'; -import { useLocale } from 'next-intl'; -import { FC } from 'react'; - -import { localesMap } from '@/core/i18n/config'; -import { setLocale } from '@/core/i18n/locale'; -import { Locale } from '@/core/i18n/types'; - -export const LocaleSwitcher: FC = () => { - const locale = useLocale(); - - const onChange = (value: string) => { - const locale = value as Locale; - setLocale(locale); - }; - - return ( - - ); -}; diff --git a/apps/web/components/Page.tsx b/apps/web/components/Page.tsx deleted file mode 100644 index 481aa28..0000000 --- a/apps/web/components/Page.tsx +++ /dev/null @@ -1,31 +0,0 @@ -'use client'; - -import { backButton } from '@telegram-apps/sdk-react'; -import { PropsWithChildren, useEffect } from 'react'; -import { useRouter } from 'next/navigation'; - -export function Page({ children, back = true }: PropsWithChildren<{ - /** - * True if it is allowed to go back from this page. - * @default true - */ - back?: boolean -}>) { - const router = useRouter(); - - useEffect(() => { - if (back) { - backButton.show(); - } else { - backButton.hide(); - } - }, [back]); - - useEffect(() => { - return backButton.onClick(() => { - router.back(); - }); - }, [router]); - - return <>{children}; -} \ No newline at end of file diff --git a/apps/web/components/RGB/RGB.tsx b/apps/web/components/RGB/RGB.tsx deleted file mode 100644 index 5719bba..0000000 --- a/apps/web/components/RGB/RGB.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { classNames, type RGB as RGBType } from '@telegram-apps/sdk-react'; -import type { FC } from 'react'; - -import './styles.css'; - -export type RGBProps = JSX.IntrinsicElements['div'] & { - color: RGBType; -}; - -export const RGB: FC = ({ color, className, ...rest }) => ( - - - {color} - -); diff --git a/apps/web/components/RGB/styles.css b/apps/web/components/RGB/styles.css deleted file mode 100644 index fec0799..0000000 --- a/apps/web/components/RGB/styles.css +++ /dev/null @@ -1,12 +0,0 @@ -.rgb { - display: inline-flex; - align-items: center; - gap: 5px; -} - -.rgb__icon { - width: 18px; - aspect-ratio: 1; - border: 1px solid #555; - border-radius: 50%; -} \ No newline at end of file diff --git a/apps/web/components/Root/Root.tsx b/apps/web/components/Root/Root.tsx deleted file mode 100644 index 5c90b9c..0000000 --- a/apps/web/components/Root/Root.tsx +++ /dev/null @@ -1,63 +0,0 @@ -'use client'; - -import { ErrorBoundary } from '@/components/ErrorBoundary'; -import { ErrorPage } from '@/components/ErrorPage'; -import { setLocale } from '@/core/i18n/locale'; -import { init } from '@/core/init'; -import { useClientOnce } from '@/hooks/useClientOnce'; -import { useDidMount } from '@/hooks/useDidMount'; -import { useTelegramMock } from '@/hooks/useTelegramMock'; -import { initData, miniApp, useLaunchParams, useSignal } from '@telegram-apps/sdk-react'; -import { AppRoot } from '@telegram-apps/telegram-ui'; -import { type PropsWithChildren, useEffect } from 'react'; -import './styles.css'; - -export function Root(props: PropsWithChildren) { - // Unfortunately, Telegram Mini Apps does not allow us to use all features of - // the Server Side Rendering. That's why we are showing loader on the server - // side. - const didMount = useDidMount(); - - return didMount ? ( - - - - ) : ( -
Loading
- ); -} - -function RootInner({ children }: PropsWithChildren) { - const isDevelopment = process.env.NODE_ENV === 'development'; - - // Mock Telegram environment in development mode if needed. - if (isDevelopment) { - // eslint-disable-next-line react-hooks/rules-of-hooks - useTelegramMock(); - } - - const lp = useLaunchParams(); - const debug = isDevelopment || lp.startParam === 'debug'; - - // Initialize the library. - useClientOnce(() => { - init(debug); - }); - - const isDark = useSignal(miniApp.isDark); - const initDataUser = useSignal(initData.user); - - // Set the user locale. - useEffect(() => { - initDataUser && setLocale(initDataUser.languageCode); - }, [initDataUser]); - - return ( - - {children} - - ); -} diff --git a/apps/web/components/Root/styles.css b/apps/web/components/Root/styles.css deleted file mode 100644 index 40c6bbc..0000000 --- a/apps/web/components/Root/styles.css +++ /dev/null @@ -1,10 +0,0 @@ -.root__loading { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - display: flex; - align-items: center; - justify-content: center; -} \ No newline at end of file diff --git a/apps/web/components/telegram/Root.tsx b/apps/web/components/telegram/Root.tsx new file mode 100644 index 0000000..d479a8a --- /dev/null +++ b/apps/web/components/telegram/Root.tsx @@ -0,0 +1,45 @@ +/* eslint-disable sonarjs/function-return-type */ +'use client'; +import { useClientOnce, useDidMount, useTelegramMock } from '@/hooks/telegram'; +import { setLocale } from '@/utils/i18n/locale'; +import { init } from '@/utils/init'; +import { initData, useLaunchParams, useSignal } from '@telegram-apps/sdk-react'; +import { type PropsWithChildren, useEffect } from 'react'; + +export function Root(props: Readonly) { + // Unfortunately, Telegram Mini Apps does not allow us to use all features of + // the Server Side Rendering. That's why we are showing loader on the server + // side. + const didMount = useDidMount(); + + if (!didMount) return
Loading
; + + return ; +} + +function RootInner({ children }: PropsWithChildren) { + const isDevelopment = process.env.NODE_ENV === 'development'; + + // Mock Telegram environment in development mode if needed. + if (isDevelopment) { + // eslint-disable-next-line react-hooks/rules-of-hooks + useTelegramMock(); + } + + const lp = useLaunchParams(); + const debug = isDevelopment || lp.startParam === 'debug'; + + // Initialize the library. + useClientOnce(() => { + init(debug); + }); + + const initDataUser = useSignal(initData.user); + + // Set the user locale. + useEffect(() => { + if (initDataUser) setLocale(initDataUser.languageCode); + }, [initDataUser]); + + return children; +} diff --git a/apps/web/components/telegram/index.ts b/apps/web/components/telegram/index.ts new file mode 100644 index 0000000..c78e011 --- /dev/null +++ b/apps/web/components/telegram/index.ts @@ -0,0 +1 @@ +export * from './Root'; diff --git a/apps/web/core/i18n/provider.tsx b/apps/web/core/i18n/provider.tsx deleted file mode 100644 index 7570aa7..0000000 --- a/apps/web/core/i18n/provider.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { NextIntlClientProvider } from "next-intl"; -import { getMessages } from "next-intl/server"; -import React from "react"; - -import { timeZone } from "./config"; - -const I18nProvider: React.FC = async ({ - children, -}) => { - const messages = await getMessages(); - return ( - - {children} - - ); -}; - -export { I18nProvider }; diff --git a/apps/web/hooks/telegram/index.ts b/apps/web/hooks/telegram/index.ts new file mode 100644 index 0000000..36c0b34 --- /dev/null +++ b/apps/web/hooks/telegram/index.ts @@ -0,0 +1,3 @@ +export * from './use-client-once'; +export * from './use-did-mount'; +export * from './use-telegram-mock'; diff --git a/apps/web/hooks/useClientOnce.ts b/apps/web/hooks/telegram/use-client-once.ts similarity index 66% rename from apps/web/hooks/useClientOnce.ts rename to apps/web/hooks/telegram/use-client-once.ts index 7963599..4ae00ae 100644 --- a/apps/web/hooks/useClientOnce.ts +++ b/apps/web/hooks/telegram/use-client-once.ts @@ -1,9 +1,9 @@ import { useRef } from 'react'; -export function useClientOnce(fn: () => void): void { +export function useClientOnce(callback: () => void): void { const canCall = useRef(true); if (typeof window !== 'undefined' && canCall.current) { canCall.current = false; - fn(); + callback(); } -} \ No newline at end of file +} diff --git a/apps/web/hooks/useDidMount.ts b/apps/web/hooks/telegram/use-did-mount.ts similarity index 82% rename from apps/web/hooks/useDidMount.ts rename to apps/web/hooks/telegram/use-did-mount.ts index e77f5ae..0c4c392 100644 --- a/apps/web/hooks/useDidMount.ts +++ b/apps/web/hooks/telegram/use-did-mount.ts @@ -1,7 +1,7 @@ import { useEffect, useState } from 'react'; /** - * @return True, if component was mounted. + * @returns True, if component was mounted. */ export function useDidMount(): boolean { const [didMount, setDidMount] = useState(false); @@ -11,4 +11,4 @@ export function useDidMount(): boolean { }, []); return didMount; -} \ No newline at end of file +} diff --git a/apps/web/hooks/useTelegramMock.ts b/apps/web/hooks/telegram/use-telegram-mock.ts similarity index 96% rename from apps/web/hooks/useTelegramMock.ts rename to apps/web/hooks/telegram/use-telegram-mock.ts index c0ca8f1..181b881 100644 --- a/apps/web/hooks/useTelegramMock.ts +++ b/apps/web/hooks/telegram/use-telegram-mock.ts @@ -1,4 +1,5 @@ -import { useClientOnce } from '@/hooks/useClientOnce'; +/* eslint-disable no-console */ +import { useClientOnce } from '@/hooks/telegram/use-client-once'; import { isTMA, type LaunchParams, diff --git a/apps/web/next.config.js b/apps/web/next.config.js index f183c05..d36077c 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -1,6 +1,6 @@ import createNextIntlPlugin from 'next-intl/plugin'; -const withNextIntl = createNextIntlPlugin('./core/i18n/i18n.ts'); +const withNextIntl = createNextIntlPlugin('./utils/i18n/i18n.ts'); const nextConfig = withNextIntl({ reactStrictMode: true, diff --git a/apps/web/package.json b/apps/web/package.json index b60222d..069c7c4 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -18,7 +18,6 @@ "@apollo/client": "catalog:", "@repo/ui": "workspace:*", "@telegram-apps/sdk-react": "^2.0.19", - "@telegram-apps/telegram-ui": "^2.1.8", "graphql": "catalog:", "next": "catalog:", "next-intl": "^3.26.0", diff --git a/apps/web/core/i18n/config.ts b/apps/web/utils/i18n/config.ts similarity index 100% rename from apps/web/core/i18n/config.ts rename to apps/web/utils/i18n/config.ts diff --git a/apps/web/core/i18n/i18n.ts b/apps/web/utils/i18n/i18n.ts similarity index 84% rename from apps/web/core/i18n/i18n.ts rename to apps/web/utils/i18n/i18n.ts index c0ead13..68ea186 100644 --- a/apps/web/core/i18n/i18n.ts +++ b/apps/web/utils/i18n/i18n.ts @@ -3,7 +3,7 @@ import { getLocale } from './locale'; import { type Locale } from './types'; import { getRequestConfig } from 'next-intl/server'; -const i18nRequestConfig = getRequestConfig(async () => { +const requestConfig = getRequestConfig(async () => { const locale = (await getLocale()) as Locale; return { @@ -15,4 +15,4 @@ const i18nRequestConfig = getRequestConfig(async () => { }; }); -export default i18nRequestConfig; +export default requestConfig; diff --git a/apps/web/core/i18n/locale.ts b/apps/web/utils/i18n/locale.ts similarity index 55% rename from apps/web/core/i18n/locale.ts rename to apps/web/utils/i18n/locale.ts index 83246a4..eeab8e8 100644 --- a/apps/web/core/i18n/locale.ts +++ b/apps/web/utils/i18n/locale.ts @@ -1,21 +1,20 @@ -//use server is required -"use server"; +// use server is required +'use server'; -import { cookies } from "next/headers"; - -import { defaultLocale } from "./config"; -import type { Locale } from "./types"; +import { defaultLocale } from './config'; +import { type Locale } from './types'; +import { cookies } from 'next/headers'; // In this example the locale is read from a cookie. You could alternatively // also read it from a database, backend service, or any other source. -const COOKIE_NAME = "NEXT_LOCALE"; +const COOKIE_NAME = 'NEXT_LOCALE'; const getLocale = async () => { return cookies().get(COOKIE_NAME)?.value || defaultLocale; }; const setLocale = async (locale?: string) => { - cookies().set(COOKIE_NAME, locale as Locale || defaultLocale); + cookies().set(COOKIE_NAME, (locale as Locale) || defaultLocale); }; export { getLocale, setLocale }; diff --git a/apps/web/utils/i18n/provider.tsx b/apps/web/utils/i18n/provider.tsx new file mode 100644 index 0000000..c5294db --- /dev/null +++ b/apps/web/utils/i18n/provider.tsx @@ -0,0 +1,14 @@ +/* eslint-disable canonical/id-match */ +import { timeZone } from './config'; +import { NextIntlClientProvider } from 'next-intl'; +import { getMessages } from 'next-intl/server'; +import { type PropsWithChildren } from 'react'; + +export async function I18nProvider({ children }: Readonly) { + const messages = await getMessages(); + return ( + + {children} + + ); +} diff --git a/apps/web/core/i18n/types.ts b/apps/web/utils/i18n/types.ts similarity index 61% rename from apps/web/core/i18n/types.ts rename to apps/web/utils/i18n/types.ts index bcd244f..30f3bff 100644 --- a/apps/web/core/i18n/types.ts +++ b/apps/web/utils/i18n/types.ts @@ -1,4 +1,4 @@ -import type { locales } from "./config"; +import { type locales } from './config'; type Locale = (typeof locales)[number]; diff --git a/apps/web/core/init.ts b/apps/web/utils/init.ts similarity index 79% rename from apps/web/core/init.ts rename to apps/web/utils/init.ts index e24aa84..eddded6 100644 --- a/apps/web/core/init.ts +++ b/apps/web/utils/init.ts @@ -1,6 +1,8 @@ +/* eslint-disable no-console */ +/* eslint-disable promise/prefer-await-to-then */ import { - $debug, backButton, + $debug as debugSDK, initData, init as initSDK, miniApp, @@ -13,7 +15,7 @@ import { */ export function init(debug: boolean): void { // Set @telegram-apps/sdk-react debug mode. - $debug.set(debug); + debugSDK.set(debug); // Initialize special event handlers for Telegram Desktop, Android, iOS, etc. // Also, configure the package. @@ -37,5 +39,7 @@ export function init(debug: boolean): void { }); // Add Eruda if needed. - debug && import('eruda').then((library) => library.default.init()).catch(console.error); + if (debug) { + import('eruda').then((library) => library.default.init()).catch(console.error); + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 241d7d0..60cae90 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -146,9 +146,6 @@ importers: '@telegram-apps/sdk-react': specifier: ^2.0.19 version: 2.0.19(@types/react@19.0.1)(react@19.0.0) - '@telegram-apps/telegram-ui': - specifier: ^2.1.8 - version: 2.1.8(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) graphql: specifier: 'catalog:' version: 16.9.0 @@ -1135,21 +1132,6 @@ packages: resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@floating-ui/core@1.6.8': - resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} - - '@floating-ui/dom@1.6.12': - resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} - - '@floating-ui/react-dom@2.1.2': - resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/utils@0.2.8': - resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} - '@formatjs/ecma402-abstract@2.3.1': resolution: {integrity: sha512-Ip9uV+/MpLXWRk03U/GzeJMuPeOXpJBSB5V1tjA6kJhvqssye5J5LoYLc7Z5IAHb7nR62sRoguzrFiVCP/hnzw==} @@ -1723,9 +1705,6 @@ packages: engines: {node: '>=18'} hasBin: true - '@radix-ui/primitive@1.1.0': - resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} - '@radix-ui/react-compose-refs@1.1.0': resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} peerDependencies: @@ -1735,111 +1714,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-context@1.1.1': - resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-dialog@1.1.2': - resolution: {integrity: sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-dismissable-layer@1.1.1': - resolution: {integrity: sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-focus-guards@1.1.1': - resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-focus-scope@1.1.0': - resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-id@1.1.0': - resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-portal@1.1.2': - resolution: {integrity: sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-presence@1.1.1': - resolution: {integrity: sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-primitive@2.0.0': - resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-slot@1.1.0': resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} peerDependencies: @@ -1849,42 +1723,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-callback-ref@1.1.0': - resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-controllable-state@1.1.0': - resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-escape-keydown@1.1.0': - resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-layout-effect@1.1.0': - resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@repeaterjs/repeater@3.0.4': resolution: {integrity: sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==} @@ -2019,13 +1857,6 @@ packages: '@telegram-apps/signals@1.1.0': resolution: {integrity: sha512-5qN7cU8t3l7n0cKcnzc/1TYKJTwAggUinfwbLHL1SYmB47pBHjCvfsRiYliFohk6lb635SBmNuVZL6LHFmGZaw==} - '@telegram-apps/telegram-ui@2.1.8': - resolution: {integrity: sha512-Y4mIRzBJDerFvF6yzsfwHpu2tKEMHnnnQgdnLTwIdXNVPq/sJTaY66Qxbh9eeO5+tct01VcAx4E70/1fMvnp8A==} - engines: {node: '>=18.0.0', npm: '>=7.0.0'} - peerDependencies: - react: ^18.2.0 - react-dom: ^18.2.0 - '@telegram-apps/toolkit@1.0.0': resolution: {integrity: sha512-fSVoveLuMzwRKWeXEufMSXxH+HvjsFKb1DeT3pG5qLpnb2rdtejnNcwAt6WEPtiZ3a4YntYaFuR3KYgVv0ZxeQ==} @@ -2054,9 +1885,6 @@ packages: '@types/react-dom': optional: true - '@twa-dev/types@7.10.0': - resolution: {integrity: sha512-BXHyNLXy+cPbOZ2qQq5ArPKcP4kUfuX3YBSFT0XUxtMNWAzvyMuYAiq59UTfQ8OnELXlfChrAoIT3c2pujBtcQ==} - '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -2305,12 +2133,6 @@ packages: resolution: {integrity: sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==} engines: {node: '>=8'} - '@xelene/vaul-with-scroll-fix@0.1.4': - resolution: {integrity: sha512-R9J7y92rzZKIQLtFHKtzRsb4x8G26cvwGIDSf7OQZCdROFt7xic4Yz1BlFYjm8oiQsYV4SFSQfOzatZjvxz5XQ==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -2377,10 +2199,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-hidden@1.2.4: - resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} - engines: {node: '>=10'} - aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} @@ -2854,9 +2672,6 @@ packages: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} - detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -3458,10 +3273,6 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} - get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - get-set-props@0.1.0: resolution: {integrity: sha512-7oKuKzAGKj0ag+eWZwcGw2fjiZ78tXnXQoBgY0aU7ZOxTu4bB7hSuQSDgtKy978EDH062P5FmD2EWiDpQS9K9Q==} engines: {node: '>=0.10.0'} @@ -4597,36 +4408,6 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} - react-remove-scroll-bar@2.3.6: - resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-remove-scroll@2.6.0: - resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-style-singleton@2.2.1: - resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - react@19.0.0: resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} engines: {node: '>=0.10.0'} @@ -5331,31 +5112,11 @@ packages: urlpattern-polyfill@8.0.2: resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} - use-callback-ref@1.3.2: - resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - use-intl@3.26.0: resolution: {integrity: sha512-HGXmpjGlbEv1uFZPfm557LK8p/hv0pKF9UwnrJeHUTxQx6bUGzMgpmPRLCVY3zkr7hfjy4LPwQJfk4Fhnn+dIg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 - use-sidecar@1.1.2: - resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -6576,23 +6337,6 @@ snapshots: dependencies: levn: 0.4.1 - '@floating-ui/core@1.6.8': - dependencies: - '@floating-ui/utils': 0.2.8 - - '@floating-ui/dom@1.6.12': - dependencies: - '@floating-ui/core': 1.6.8 - '@floating-ui/utils': 0.2.8 - - '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@floating-ui/dom': 1.6.12 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@floating-ui/utils@0.2.8': {} - '@formatjs/ecma402-abstract@2.3.1': dependencies: '@formatjs/fast-memoize': 2.2.5 @@ -7439,108 +7183,12 @@ snapshots: dependencies: playwright: 1.49.1 - '@radix-ui/primitive@1.1.0': {} - '@radix-ui/react-compose-refs@1.1.0(@types/react@19.0.1)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: '@types/react': 19.0.1 - '@radix-ui/react-context@1.1.1(@types/react@19.0.1)(react@19.0.0)': - dependencies: - react: 19.0.0 - optionalDependencies: - '@types/react': 19.0.1 - - '@radix-ui/react-dialog@1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-context': 1.1.1(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-portal': 1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-slot': 1.1.0(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.1)(react@19.0.0) - aria-hidden: 1.2.4 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - react-remove-scroll: 2.6.0(@types/react@19.0.1)(react@19.0.0) - optionalDependencies: - '@types/react': 19.0.1 - '@types/react-dom': 19.0.1 - - '@radix-ui/react-dismissable-layer@1.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.1)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - optionalDependencies: - '@types/react': 19.0.1 - '@types/react-dom': 19.0.1 - - '@radix-ui/react-focus-guards@1.1.1(@types/react@19.0.1)(react@19.0.0)': - dependencies: - react: 19.0.0 - optionalDependencies: - '@types/react': 19.0.1 - - '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.1)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - optionalDependencies: - '@types/react': 19.0.1 - '@types/react-dom': 19.0.1 - - '@radix-ui/react-id@1.1.0(@types/react@19.0.1)(react@19.0.0)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.1)(react@19.0.0) - react: 19.0.0 - optionalDependencies: - '@types/react': 19.0.1 - - '@radix-ui/react-portal@1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.1)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - optionalDependencies: - '@types/react': 19.0.1 - '@types/react-dom': 19.0.1 - - '@radix-ui/react-presence@1.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.1)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - optionalDependencies: - '@types/react': 19.0.1 - '@types/react-dom': 19.0.1 - - '@radix-ui/react-primitive@2.0.0(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/react-slot': 1.1.0(@types/react@19.0.1)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - optionalDependencies: - '@types/react': 19.0.1 - '@types/react-dom': 19.0.1 - '@radix-ui/react-slot@1.1.0(@types/react@19.0.1)(react@19.0.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.0(@types/react@19.0.1)(react@19.0.0) @@ -7548,32 +7196,6 @@ snapshots: optionalDependencies: '@types/react': 19.0.1 - '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.0.1)(react@19.0.0)': - dependencies: - react: 19.0.0 - optionalDependencies: - '@types/react': 19.0.1 - - '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.0.1)(react@19.0.0)': - dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.1)(react@19.0.0) - react: 19.0.0 - optionalDependencies: - '@types/react': 19.0.1 - - '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.0.1)(react@19.0.0)': - dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.1)(react@19.0.0) - react: 19.0.0 - optionalDependencies: - '@types/react': 19.0.1 - - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.0.1)(react@19.0.0)': - dependencies: - react: 19.0.0 - optionalDependencies: - '@types/react': 19.0.1 - '@repeaterjs/repeater@3.0.4': {} '@repeaterjs/repeater@3.0.6': {} @@ -7683,18 +7305,6 @@ snapshots: '@telegram-apps/signals@1.1.0': {} - '@telegram-apps/telegram-ui@2.1.8(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@swc/helpers': 0.5.13 - '@twa-dev/types': 7.10.0 - '@xelene/vaul-with-scroll-fix': 0.1.4(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - '@telegram-apps/toolkit@1.0.0': {} '@telegram-apps/transformers@1.2.0': @@ -7725,8 +7335,6 @@ snapshots: '@types/react': 19.0.1 '@types/react-dom': 19.0.1 - '@twa-dev/types@7.10.0': {} - '@types/aria-query@5.0.4': {} '@types/babel__core@7.20.5': @@ -8073,15 +7681,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@xelene/vaul-with-scroll-fix@0.1.4(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/react-dialog': 1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 @@ -8135,10 +7734,6 @@ snapshots: argparse@2.0.1: {} - aria-hidden@1.2.4: - dependencies: - tslib: 2.8.1 - aria-query@5.3.0: dependencies: dequal: 2.0.3 @@ -8667,8 +8262,6 @@ snapshots: detect-libc@2.0.3: optional: true - detect-node-es@1.1.0: {} - didyoumean@1.2.2: {} dir-glob@3.0.1: @@ -9542,8 +9135,6 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 - get-nonce@1.0.1: {} - get-set-props@0.1.0: {} get-stream@8.0.1: {} @@ -10653,34 +10244,6 @@ snapshots: react-refresh@0.14.2: {} - react-remove-scroll-bar@2.3.6(@types/react@19.0.1)(react@19.0.0): - dependencies: - react: 19.0.0 - react-style-singleton: 2.2.1(@types/react@19.0.1)(react@19.0.0) - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.0.1 - - react-remove-scroll@2.6.0(@types/react@19.0.1)(react@19.0.0): - dependencies: - react: 19.0.0 - react-remove-scroll-bar: 2.3.6(@types/react@19.0.1)(react@19.0.0) - react-style-singleton: 2.2.1(@types/react@19.0.1)(react@19.0.0) - tslib: 2.8.1 - use-callback-ref: 1.3.2(@types/react@19.0.1)(react@19.0.0) - use-sidecar: 1.1.2(@types/react@19.0.1)(react@19.0.0) - optionalDependencies: - '@types/react': 19.0.1 - - react-style-singleton@2.2.1(@types/react@19.0.1)(react@19.0.0): - dependencies: - get-nonce: 1.0.1 - invariant: 2.2.4 - react: 19.0.0 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.0.1 - react@19.0.0: {} read-cache@1.0.0: @@ -11442,27 +11005,12 @@ snapshots: urlpattern-polyfill@8.0.2: {} - use-callback-ref@1.3.2(@types/react@19.0.1)(react@19.0.0): - dependencies: - react: 19.0.0 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.0.1 - use-intl@3.26.0(react@19.0.0): dependencies: '@formatjs/fast-memoize': 2.2.5 intl-messageformat: 10.7.10 react: 19.0.0 - use-sidecar@1.1.2(@types/react@19.0.1)(react@19.0.0): - dependencies: - detect-node-es: 1.1.0 - react: 19.0.0 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.0.1 - util-deprecate@1.0.2: {} validate-npm-package-license@3.0.4: