From 291bc8e44c301471607290e215095a681ea7448f Mon Sep 17 00:00:00 2001 From: Ben Lopata Date: Tue, 22 Oct 2024 14:28:07 -0500 Subject: [PATCH] Adds discord integration, misc formatting. --- www/app/settings/SettingsLayout.tsx | 51 +++++------ www/components/settings/AccountSettings.tsx | 3 +- .../settings/IntegrationsSettings.tsx | 53 +++++------ www/components/settings/SecuritySettings.tsx | 3 +- www/components/settings/SettingsForm.tsx | 87 +++++++++---------- 5 files changed, 91 insertions(+), 106 deletions(-) diff --git a/www/app/settings/SettingsLayout.tsx b/www/app/settings/SettingsLayout.tsx index 650a85a..61dffc9 100644 --- a/www/app/settings/SettingsLayout.tsx +++ b/www/app/settings/SettingsLayout.tsx @@ -1,30 +1,23 @@ -"use client"; +'use client'; -import { useState } from "react"; -import Link from "next/link"; -import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from "@/components/ui/card"; -import { Button } from "@/components/ui/button"; -import SubscriptionSettings from "@/components/settings/SubscriptionSettings"; -import { IntegrationsSettings } from "@/components/settings/IntegrationsSettings"; -import { SecuritySettings } from "@/components/settings/SecuritySettings"; -import { AccountSettings } from "@/components/settings/AccountSettings"; -import { SupportSettings } from "@/components/settings/SupportSettings"; +import { useState } from 'react'; +import Link from 'next/link'; +import { Button } from '@/components/ui/button'; +import SubscriptionSettings from '@/components/settings/SubscriptionSettings'; +import { IntegrationsSettings } from '@/components/settings/IntegrationsSettings'; +import { SecuritySettings } from '@/components/settings/SecuritySettings'; +import { AccountSettings } from '@/components/settings/AccountSettings'; +import { SupportSettings } from '@/components/settings/SupportSettings'; export default function SettingsLayout({ user, subscription, products }) { - const [activeTab, setActiveTab] = useState("account"); + const [activeTab, setActiveTab] = useState('account'); const navItems = [ - { id: "account", label: "Account" }, - { id: "security", label: "Security" }, - { id: "subscription", label: "Subscription" }, - { id: "integrations", label: "Integrations" }, - { id: "support", label: "Support" }, + { id: 'account', label: 'Account' }, + { id: 'security', label: 'Security' }, + { id: 'subscription', label: 'Subscription' }, + { id: 'integrations', label: 'Integrations' }, + { id: 'support', label: 'Support' }, ]; return ( @@ -50,8 +43,8 @@ export default function SettingsLayout({ user, subscription, products }) { onClick={() => setActiveTab(item.id)} className={`w-full text-left p-2 rounded ${ activeTab === item.id - ? "bg-primary text-primary-foreground" - : "hover:bg-accent hover:text-accent-foreground" + ? 'bg-primary text-primary-foreground' + : 'hover:bg-accent hover:text-accent-foreground' }`} > {item.label} @@ -61,16 +54,16 @@ export default function SettingsLayout({ user, subscription, products }) {
- {activeTab === "account" && } - {activeTab === "security" && } - {activeTab === "subscription" && ( + {activeTab === 'account' && } + {activeTab === 'security' && } + {activeTab === 'subscription' && ( )} - {activeTab === "integrations" && } - {activeTab === "support" && } + {activeTab === 'integrations' && } + {activeTab === 'support' && }
diff --git a/www/components/settings/AccountSettings.tsx b/www/components/settings/AccountSettings.tsx index cec4c6d..50eec19 100644 --- a/www/components/settings/AccountSettings.tsx +++ b/www/components/settings/AccountSettings.tsx @@ -1,9 +1,8 @@ -import { SettingsForm } from "@/components/settings/SettingsForm"; +import { SettingsForm } from '@/components/settings/SettingsForm'; interface User { id: string; email: string; - // Add other user properties as needed } export function AccountSettings({ user }: { user: User }) { diff --git a/www/components/settings/IntegrationsSettings.tsx b/www/components/settings/IntegrationsSettings.tsx index 9f35c62..183cddc 100644 --- a/www/components/settings/IntegrationsSettings.tsx +++ b/www/components/settings/IntegrationsSettings.tsx @@ -1,8 +1,8 @@ 'use client'; -import { useState, useEffect } from 'react'; import { FaDiscord } from 'react-icons/fa'; import { createClient } from '@/utils/supabase/client'; +import useSWR from 'swr'; import { Card, CardContent, @@ -17,32 +17,23 @@ interface User { email: string; } -interface IntegrationsSettingsProps { - user: User; -} - -export function IntegrationsSettings({ user }: IntegrationsSettingsProps) { - const [isDiscordConnected, setIsDiscordConnected] = useState(false); - const [discordTag, setDiscordTag] = useState(null); +const fetcher = async () => { const supabase = createClient(); - - useEffect(() => { - checkDiscordConnection(); - }, [user.id]); - - const checkDiscordConnection = async () => { - const { - data: { user: supabaseUser }, - } = await supabase.auth.getUser(); - - if (supabaseUser?.app_metadata?.provider === 'discord') { - setIsDiscordConnected(true); - setDiscordTag(supabaseUser.user_metadata?.full_name || null); - } else { - setIsDiscordConnected(false); - setDiscordTag(null); - } + const { + data: { user }, + } = await supabase.auth.getUser(); + return { + isDiscordConnected: user?.app_metadata?.provider === 'discord', + discordTag: + user?.app_metadata?.provider === 'discord' + ? user.user_metadata?.full_name + : null, }; +}; + +export function IntegrationsSettings() { + const { data, error, mutate } = useSWR('discordConnection', fetcher); + const supabase = createClient(); const handleDiscordConnect = async () => { const { error } = await supabase.auth.signInWithOAuth({ @@ -55,6 +46,8 @@ export function IntegrationsSettings({ user }: IntegrationsSettingsProps) { if (error) { console.error('Error connecting Discord:', error); + } else { + mutate(); // Revalidate the data after connecting } }; @@ -63,11 +56,13 @@ export function IntegrationsSettings({ user }: IntegrationsSettingsProps) { if (error) { console.error('Error disconnecting Discord:', error); } else { - setIsDiscordConnected(false); - setDiscordTag(null); + mutate(); // Revalidate the data after disconnecting } }; + if (error) return
Failed to load
; + if (!data) return
Loading...
; + return (

Integrations

@@ -77,11 +72,11 @@ export function IntegrationsSettings({ user }: IntegrationsSettingsProps) { Connect your Discord account - {isDiscordConnected ? ( + {data.isDiscordConnected ? (

Connected as:{' '} - {discordTag} + {data.discordTag}