From 176f823315ee257c37d6896efe4d01aafb0d1ae1 Mon Sep 17 00:00:00 2001 From: Fedor Katurov Date: Sat, 8 Apr 2023 19:31:05 +0600 Subject: [PATCH] telegram: add button to boris --- .../boris/BorisContactItem/index.tsx | 48 ++++++++++++++----- src/components/boris/BorisContacts/index.tsx | 31 ++++++++---- src/containers/boris/BorisSidebar/index.tsx | 31 +++++++----- src/hooks/auth/useTelegramAccount.ts | 16 +++++-- 4 files changed, 92 insertions(+), 34 deletions(-) diff --git a/src/components/boris/BorisContactItem/index.tsx b/src/components/boris/BorisContactItem/index.tsx index 659c5723..e3d06310 100644 --- a/src/components/boris/BorisContactItem/index.tsx +++ b/src/components/boris/BorisContactItem/index.tsx @@ -1,5 +1,6 @@ -import React, { FC } from 'react'; +import React, { FC, ReactNode, useCallback } from 'react'; +import { Group } from '~/components/containers/Group'; import { Icon } from '~/components/input/Icon'; import styles from './styles.module.scss'; @@ -9,19 +10,44 @@ interface Props { title: string; subtitle: string; link: string; + prefix?: ReactNode; + suffix?: ReactNode; } -const BorisContactItem: FC = ({ icon, title, subtitle, link }) => ( - -
- -
+const BorisContactItem: FC = ({ + icon, + title, + subtitle, + link, + prefix, + suffix, +}) => { + const onClick = useCallback(() => { + if (!link) return; -
-
{title}
-
{subtitle}
+ window.open(link); + }, []); + + return ( +
+ {prefix} +
+
+ +
+ +
+
{title}
+
{subtitle}
+
+
+ {suffix}
-
-); + ); +}; export { BorisContactItem }; diff --git a/src/components/boris/BorisContacts/index.tsx b/src/components/boris/BorisContacts/index.tsx index 0643f4f7..67a9b675 100644 --- a/src/components/boris/BorisContacts/index.tsx +++ b/src/components/boris/BorisContacts/index.tsx @@ -1,12 +1,18 @@ import React, { FC } from 'react'; import { BorisContactItem } from '~/components/boris/BorisContactItem'; +import { Group } from '~/components/containers/Group'; +import { Padder } from '~/components/containers/Padder'; +import { Button } from '~/components/input/Button'; import styles from './styles.module.scss'; -interface Props {} +interface Props { + canConnectTelegram: boolean; + connectTelegram: () => void; +} -const BorisContacts: FC = () => ( +const BorisContacts: FC = ({ canConnectTelegram, connectTelegram }) => (
= () => ( subtitle="паблик вконтакте" /> - - + + + + + ) + } + />
); diff --git a/src/containers/boris/BorisSidebar/index.tsx b/src/containers/boris/BorisSidebar/index.tsx index 8fb3157b..ba295baf 100644 --- a/src/containers/boris/BorisSidebar/index.tsx +++ b/src/containers/boris/BorisSidebar/index.tsx @@ -4,6 +4,8 @@ import { BorisContacts } from '~/components/boris/BorisContacts'; import { BorisStats } from '~/components/boris/BorisStats'; import { Group } from '~/components/containers/Group'; import { SuperPowersToggle } from '~/containers/auth/SuperPowersToggle'; +import { useAuth } from '~/hooks/auth/useAuth'; +import { useTelegramAccount } from '~/hooks/auth/useTelegramAccount'; import { BorisUsageStats } from '~/types/boris'; import styles from './styles.module.scss'; @@ -14,18 +16,25 @@ interface Props { isLoading: boolean; } -const BorisSidebar: FC = ({ isUser, stats, isLoading }) => ( - -
- -
+const BorisSidebar: FC = ({ isUser, stats, isLoading }) => { + const { connected, connect } = useTelegramAccount(); - + return ( + +
+ +
-
- -
-
-); + + +
+ +
+
+ ); +}; export { BorisSidebar }; diff --git a/src/hooks/auth/useTelegramAccount.ts b/src/hooks/auth/useTelegramAccount.ts index 58d16e0d..f770520a 100644 --- a/src/hooks/auth/useTelegramAccount.ts +++ b/src/hooks/auth/useTelegramAccount.ts @@ -1,18 +1,21 @@ -import { useCallback, useState } from 'react'; +import { useCallback, useMemo, useState } from 'react'; import { TelegramUser } from '@v9v/ts-react-telegram-login'; +import { Dialog } from '~/constants/modal'; import { showErrorToast } from '~/utils/errors/showToast'; import { useNotifications } from '~/utils/providers/NotificationProvider'; import { apiAttachTelegram } from '../../api/auth/index'; +import { useModal } from '../modal/useModal'; import { useOAuth } from './useOAuth'; export const useTelegramAccount = () => { const [loading, setLoading] = useState(false); - const { refresh } = useOAuth(); + const { refresh, accounts } = useOAuth(); const { refresh: refreshNotificationSettings } = useNotifications(); + const { showModal } = useModal(); const attach = useCallback( async (data: TelegramUser, callback?: () => void) => { @@ -30,5 +33,12 @@ export const useTelegramAccount = () => { [], ); - return { attach, loading }; + const connect = useCallback(() => showModal(Dialog.TelegramAttach, {}), []); + + const connected = useMemo( + () => accounts.some((it) => it.provider === 'telegram'), + [accounts], + ); + + return { attach, loading, connected, connect }; };