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:
parent
b0d9e8f8ba
commit
176f823315
4 changed files with 92 additions and 34 deletions
|
@ -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 };
|
||||||
|
|
|
@ -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>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -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 };
|
||||||
|
|
|
@ -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 };
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue