From ef5850592626e8e531a4c3f9919b0caec8ae363b Mon Sep 17 00:00:00 2001 From: mantikoros Date: Mon, 29 Aug 2022 12:43:45 -0500 Subject: [PATCH] twitch account linking; profile page twitch panel; twitch landing page --- common/user.ts | 4 + firestore.rules | 2 +- web/components/profile/twitch-panel.tsx | 96 ++++++++++++++++++++ web/lib/api/api-key.ts | 9 ++ web/lib/twitch/link-twitch-account.ts | 47 ++++++++++ web/pages/profile.tsx | 17 ++-- web/pages/twitch.tsx | 115 ++++++++++++++++++++++++ 7 files changed, 279 insertions(+), 11 deletions(-) create mode 100644 web/components/profile/twitch-panel.tsx create mode 100644 web/lib/api/api-key.ts create mode 100644 web/lib/twitch/link-twitch-account.ts create mode 100644 web/pages/twitch.tsx diff --git a/common/user.ts b/common/user.ts index e3c9d181..b130be02 100644 --- a/common/user.ts +++ b/common/user.ts @@ -63,6 +63,10 @@ export type PrivateUser = { initialIpAddress?: string apiKey?: string notificationPreferences?: notification_subscribe_types + twitchInfo?: { + twitchName: string + controlToken: string + } } export type notification_subscribe_types = 'all' | 'less' | 'none' diff --git a/firestore.rules b/firestore.rules index fe45071b..e3514deb 100644 --- a/firestore.rules +++ b/firestore.rules @@ -70,7 +70,7 @@ service cloud.firestore { allow read: if userId == request.auth.uid || isAdmin(); allow update: if (userId == request.auth.uid || isAdmin()) && request.resource.data.diff(resource.data).affectedKeys() - .hasOnly(['apiKey', 'unsubscribedFromResolutionEmails', 'unsubscribedFromCommentEmails', 'unsubscribedFromAnswerEmails', 'notificationPreferences', 'unsubscribedFromWeeklyTrendingEmails' ]); + .hasOnly(['apiKey', 'twitchInfo', 'unsubscribedFromResolutionEmails', 'unsubscribedFromCommentEmails', 'unsubscribedFromAnswerEmails', 'notificationPreferences', 'unsubscribedFromWeeklyTrendingEmails' ]); } match /private-users/{userId}/views/{viewId} { diff --git a/web/components/profile/twitch-panel.tsx b/web/components/profile/twitch-panel.tsx new file mode 100644 index 00000000..8415a06e --- /dev/null +++ b/web/components/profile/twitch-panel.tsx @@ -0,0 +1,96 @@ +import clsx from 'clsx' +import React, { useState } from 'react' +import toast from 'react-hot-toast' + +import { copyToClipboard } from 'web/lib/util/copy' +import { linkTwitchAccount } from 'web/lib/twitch/link-twitch-account' +import { LinkIcon } from '@heroicons/react/solid' +import { track } from 'web/lib/service/analytics' +import { Button } from './../button' +import { LoadingIndicator } from './../loading-indicator' +import { Row } from './../layout/row' +import { usePrivateUser, useUser } from 'web/hooks/use-user' + +export function TwitchPanel() { + const user = useUser() + const privateUser = usePrivateUser() + + const twitchName = privateUser?.twitchInfo?.twitchName + const twitchToken = privateUser?.twitchInfo?.controlToken + + const linkIcon =