Initial commit: Tapalka monorepo (bot, front, strapi)
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
'use client';
|
||||
|
||||
import { PropsWithChildren, useEffect } from 'react';
|
||||
import { useTokenStore } from '@/store/token.state';
|
||||
import { ConfigApi } from '@/api/config.api';
|
||||
import { useConfigStore } from '@/store/config.state';
|
||||
|
||||
export const ConfigProvider = ({ children }: PropsWithChildren) => {
|
||||
const { setConfig } = useConfigStore();
|
||||
const { token } = useTokenStore();
|
||||
|
||||
useEffect(() => {
|
||||
if (!token) {
|
||||
return;
|
||||
}
|
||||
const api = ConfigApi.getInstance(token);
|
||||
api.getConfig().then(config => setConfig(config.data));
|
||||
}, [token]);
|
||||
|
||||
return <>{children}</>;
|
||||
};
|
||||
@@ -0,0 +1,72 @@
|
||||
'use client';
|
||||
|
||||
import { PropsWithChildren, useEffect, useState } from 'react';
|
||||
import { usePlayerStore } from '@/store/player.state';
|
||||
import { ProvidersProps } from '@/components/providers/Providers';
|
||||
import { useTokenStore } from '@/store/token.state';
|
||||
import { PlayerApi } from '@/api/player.api';
|
||||
import styles from './Providers.module.css';
|
||||
|
||||
export const PlayerProvider = ({
|
||||
children,
|
||||
id,
|
||||
}: PropsWithChildren & Pick<ProvidersProps, 'id'>) => {
|
||||
const { player, setPlayer, isLoading, stopLoading } = usePlayerStore();
|
||||
const { token } = useTokenStore();
|
||||
const [username, setUsername] = useState('');
|
||||
|
||||
useEffect(() => {
|
||||
if (!token) {
|
||||
console.log('[PlayerProvider] no token yet, waiting...');
|
||||
return;
|
||||
}
|
||||
console.log('[PlayerProvider] token received, loading player...');
|
||||
try {
|
||||
const tgUser = window.Telegram?.WebApp?.initDataUnsafe?.user;
|
||||
const username = String(tgUser?.username || 'unknown');
|
||||
console.log('[PlayerProvider] telegram username:', username, 'tgUser:', tgUser);
|
||||
setUsername(username);
|
||||
} catch (e) {
|
||||
console.error('[PlayerProvider] error getting telegram user:', e);
|
||||
}
|
||||
const playerApi = PlayerApi.getInstance(token);
|
||||
playerApi.findPlayerByAuthId(id).then(player => {
|
||||
console.log('[PlayerProvider] player loaded:', player?.id);
|
||||
setPlayer(player);
|
||||
stopLoading();
|
||||
}).catch(err => {
|
||||
console.error('[PlayerProvider] error loading player:', err);
|
||||
stopLoading();
|
||||
});
|
||||
}, [token]);
|
||||
|
||||
if (isLoading) {
|
||||
return (
|
||||
<div className={styles.loading}>
|
||||
<span>Загрузка...</span>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
if (!player) {
|
||||
return (
|
||||
<div className={styles.loading}>
|
||||
<span>
|
||||
Что-то пошло не так... Попробуйте написать /start, чтобы получить актуальную
|
||||
ссылку
|
||||
</span>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
if (player.attributes.telegram_nick !== username) {
|
||||
return (
|
||||
<div className={styles.loading}>
|
||||
<span>
|
||||
Похоже, что Вы изменили свой ID в Telegram, попробуйте написать /start, чтобы
|
||||
получить актуальную ссылку
|
||||
</span>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return <>{children}</>;
|
||||
};
|
||||
@@ -0,0 +1,10 @@
|
||||
.loading {
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
background-color: black;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
font-family: var(--font-manrope);
|
||||
text-align: center;
|
||||
}
|
||||
28
CMyTapper/robucks-front/components/providers/Providers.tsx
Normal file
28
CMyTapper/robucks-front/components/providers/Providers.tsx
Normal file
@@ -0,0 +1,28 @@
|
||||
import { PropsWithChildren } from 'react';
|
||||
import { PlayerProvider } from '@/components/providers/PlayerProvider';
|
||||
import { TokenProvider } from '@/components/providers/TokenProvider';
|
||||
import { TasksProvider } from '@/components/providers/TasksProvider';
|
||||
import { ShopItemsProviver } from '@/components/providers/ShopItemsProvider';
|
||||
import { ConfigProvider } from '@/components/providers/ConfigProvider';
|
||||
import Navigation from '@/components/ui/navigation/Navigation';
|
||||
|
||||
export type ProvidersProps = {
|
||||
id: string;
|
||||
};
|
||||
|
||||
export const Providers = ({ children, id }: PropsWithChildren & ProvidersProps) => {
|
||||
return (
|
||||
<TokenProvider>
|
||||
<TasksProvider>
|
||||
<ShopItemsProviver>
|
||||
<ConfigProvider>
|
||||
<PlayerProvider id={id}>
|
||||
{children}
|
||||
<Navigation id={id} />
|
||||
</PlayerProvider>
|
||||
</ConfigProvider>
|
||||
</ShopItemsProviver>
|
||||
</TasksProvider>
|
||||
</TokenProvider>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,21 @@
|
||||
'use client';
|
||||
|
||||
import { PropsWithChildren, useEffect } from 'react';
|
||||
import { useTokenStore } from '@/store/token.state';
|
||||
import { ShopItemApi } from '@/api/shop-item.api';
|
||||
import { useShopItemsStore } from '@/store/shopItems.state';
|
||||
|
||||
export const ShopItemsProviver = ({ children }: PropsWithChildren) => {
|
||||
const { setShopItems } = useShopItemsStore();
|
||||
const { token } = useTokenStore();
|
||||
|
||||
useEffect(() => {
|
||||
if (!token) {
|
||||
return;
|
||||
}
|
||||
const api = ShopItemApi.getInstance(token);
|
||||
api.getAllShopItems().then(shopItems => setShopItems(shopItems));
|
||||
}, [token]);
|
||||
|
||||
return <>{children}</>;
|
||||
};
|
||||
@@ -0,0 +1,21 @@
|
||||
'use client';
|
||||
|
||||
import { PropsWithChildren, useEffect } from 'react';
|
||||
import { useTokenStore } from '@/store/token.state';
|
||||
import { useTasksStore } from '@/store/tasks.state';
|
||||
import { TasksApi } from '@/api/tasks.api';
|
||||
|
||||
export const TasksProvider = ({ children }: PropsWithChildren) => {
|
||||
const { setTasks } = useTasksStore();
|
||||
const { token } = useTokenStore();
|
||||
|
||||
useEffect(() => {
|
||||
if (!token) {
|
||||
return;
|
||||
}
|
||||
const api = TasksApi.getInstance(token);
|
||||
api.getAllTasks().then(tasks => setTasks(tasks));
|
||||
}, [token]);
|
||||
|
||||
return <>{children}</>;
|
||||
};
|
||||
@@ -0,0 +1,22 @@
|
||||
'use client';
|
||||
|
||||
import { PropsWithChildren, useEffect } from 'react';
|
||||
import { ConfigBotApi } from '@/api/config-bot.api';
|
||||
import { useTokenStore } from '@/store/token.state';
|
||||
|
||||
const configBotApi = ConfigBotApi.getInstance();
|
||||
|
||||
export const TokenProvider = ({ children }: PropsWithChildren) => {
|
||||
const { setToken } = useTokenStore();
|
||||
|
||||
useEffect(() => {
|
||||
configBotApi.getConfigBot().then(cfg => {
|
||||
console.log('[TokenProvider] got config:', cfg);
|
||||
setToken(cfg.token);
|
||||
}).catch(err => {
|
||||
console.error('[TokenProvider] error getting config:', err);
|
||||
});
|
||||
}, []);
|
||||
|
||||
return <>{children}</>;
|
||||
};
|
||||
Reference in New Issue
Block a user