1
0
Fork 0
mirror of https://github.com/muerwre/vault-frontend.git synced 2025-04-24 20:36:40 +07:00

telegram: add button to boris

This commit is contained in:
Fedor Katurov 2023-04-08 19:31:05 +06:00
parent b0d9e8f8ba
commit 176f823315
4 changed files with 92 additions and 34 deletions

View file

@ -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 { Icon } from '~/components/input/Icon';
import styles from './styles.module.scss'; import styles from './styles.module.scss';
@ -9,19 +10,44 @@ interface Props {
title: string; title: string;
subtitle: string; subtitle: string;
link: string; link: string;
prefix?: ReactNode;
suffix?: ReactNode;
} }
const BorisContactItem: FC<Props> = ({ icon, title, subtitle, link }) => ( const BorisContactItem: FC<Props> = ({
<a className={styles.item} href={link} target="_blank" rel="noreferrer"> icon,
<div className={styles.icon}> title,
<Icon icon={icon} size={32} /> subtitle,
</div> link,
prefix,
suffix,
}) => {
const onClick = useCallback(() => {
if (!link) return;
<div className={styles.info}> window.open(link);
<div className={styles.title}>{title}</div> }, []);
<div className={styles.subtitle}>{subtitle}</div>
return (
<div>
{prefix}
<div
onClick={onClick}
className={styles.item}
role={link ? 'button' : 'none'}
>
<div className={styles.icon}>
<Icon icon={icon} size={32} />
</div>
<div className={styles.info}>
<div className={styles.title}>{title}</div>
<div className={styles.subtitle}>{subtitle}</div>
</div>
</div>
{suffix}
</div> </div>
</a> );
); };
export { BorisContactItem }; export { BorisContactItem };

View file

@ -1,12 +1,18 @@
import React, { FC } from 'react'; import React, { FC } from 'react';
import { BorisContactItem } from '~/components/boris/BorisContactItem'; 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'; import styles from './styles.module.scss';
interface Props {} interface Props {
canConnectTelegram: boolean;
connectTelegram: () => void;
}
const BorisContacts: FC<Props> = () => ( const BorisContacts: FC<Props> = ({ canConnectTelegram, connectTelegram }) => (
<div className={styles.contacts}> <div className={styles.contacts}>
<BorisContactItem <BorisContactItem
icon="vk" icon="vk"
@ -15,19 +21,26 @@ const BorisContacts: FC<Props> = () => (
subtitle="паблик вконтакте" subtitle="паблик вконтакте"
/> />
<BorisContactItem
icon="telegram"
title="Телеграм-бот"
link="https://t.me/vault48bot"
subtitle="@vault48bot"
/>
<BorisContactItem <BorisContactItem
icon="github" icon="github"
title="Github" title="Github"
link="https://github.com/muerwre?tab=repositories&q=vault" link="https://github.com/muerwre?tab=repositories&q=vault"
subtitle="исходники Убежища" subtitle="исходники Убежища"
/> />
<BorisContactItem
icon="telegram"
title="Телеграм-бот"
link="https://t.me/vault48bot"
subtitle="@vault48bot"
suffix={
canConnectTelegram && (
<Padder>
<Button onClick={connectTelegram}>Получать уведомления</Button>
</Padder>
)
}
/>
</div> </div>
); );

View file

@ -4,6 +4,8 @@ import { BorisContacts } from '~/components/boris/BorisContacts';
import { BorisStats } from '~/components/boris/BorisStats'; import { BorisStats } from '~/components/boris/BorisStats';
import { Group } from '~/components/containers/Group'; import { Group } from '~/components/containers/Group';
import { SuperPowersToggle } from '~/containers/auth/SuperPowersToggle'; import { SuperPowersToggle } from '~/containers/auth/SuperPowersToggle';
import { useAuth } from '~/hooks/auth/useAuth';
import { useTelegramAccount } from '~/hooks/auth/useTelegramAccount';
import { BorisUsageStats } from '~/types/boris'; import { BorisUsageStats } from '~/types/boris';
import styles from './styles.module.scss'; import styles from './styles.module.scss';
@ -14,18 +16,25 @@ interface Props {
isLoading: boolean; isLoading: boolean;
} }
const BorisSidebar: FC<Props> = ({ isUser, stats, isLoading }) => ( const BorisSidebar: FC<Props> = ({ isUser, stats, isLoading }) => {
<Group className={styles.container}> const { connected, connect } = useTelegramAccount();
<div className={styles.super_powers}>
<SuperPowersToggle />
</div>
<BorisContacts /> return (
<Group className={styles.container}>
<div className={styles.super_powers}>
<SuperPowersToggle />
</div>
<div className={styles.wrap}> <BorisContacts
<BorisStats stats={stats} isLoading={isLoading} /> canConnectTelegram={isUser && !connected}
</div> connectTelegram={connect}
</Group> />
);
<div className={styles.wrap}>
<BorisStats stats={stats} isLoading={isLoading} />
</div>
</Group>
);
};
export { BorisSidebar }; export { BorisSidebar };

View file

@ -1,18 +1,21 @@
import { useCallback, useState } from 'react'; import { useCallback, useMemo, useState } from 'react';
import { TelegramUser } from '@v9v/ts-react-telegram-login'; import { TelegramUser } from '@v9v/ts-react-telegram-login';
import { Dialog } from '~/constants/modal';
import { showErrorToast } from '~/utils/errors/showToast'; import { showErrorToast } from '~/utils/errors/showToast';
import { useNotifications } from '~/utils/providers/NotificationProvider'; import { useNotifications } from '~/utils/providers/NotificationProvider';
import { apiAttachTelegram } from '../../api/auth/index'; import { apiAttachTelegram } from '../../api/auth/index';
import { useModal } from '../modal/useModal';
import { useOAuth } from './useOAuth'; import { useOAuth } from './useOAuth';
export const useTelegramAccount = () => { export const useTelegramAccount = () => {
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const { refresh } = useOAuth(); const { refresh, accounts } = useOAuth();
const { refresh: refreshNotificationSettings } = useNotifications(); const { refresh: refreshNotificationSettings } = useNotifications();
const { showModal } = useModal();
const attach = useCallback( const attach = useCallback(
async (data: TelegramUser, callback?: () => void) => { 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 };
}; };