selectable platform
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
import config from '@/lib/config';
|
||||
import { Platform } from '@/lib/types';
|
||||
import { TwitterApi } from 'twitter-api-v2';
|
||||
|
||||
export default async function getPlatformIcon(platform: Platform) {
|
||||
switch (platform.platform) {
|
||||
case 'x':
|
||||
const twitterClient = new TwitterApi({
|
||||
appKey: config.twitter.key,
|
||||
appSecret: config.twitter.secret,
|
||||
accessToken: platform.token,
|
||||
accessSecret: platform.secret,
|
||||
});
|
||||
|
||||
const user = await twitterClient.v1.verifyCredentials();
|
||||
|
||||
return user.profile_image_url_https;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
import { NextResponse, NextRequest } from 'next/server';
|
||||
import database from '../../../lib/database';
|
||||
import {
|
||||
PlatformKind,
|
||||
Platforms,
|
||||
PostRequest,
|
||||
ScheduleRequest,
|
||||
UserPlatforms,
|
||||
} from '@/lib/types';
|
||||
import { ObjectId } from 'mongodb';
|
||||
import { HttpStatusCode } from 'axios';
|
||||
import getPlatformIcon from './getPlatformIcon';
|
||||
|
||||
export async function GET(req: NextRequest) {
|
||||
const sessionId = req.cookies.get('session_id');
|
||||
|
||||
if (!sessionId)
|
||||
return NextResponse.json(
|
||||
{
|
||||
message: 'No session',
|
||||
},
|
||||
{ status: HttpStatusCode.Unauthorized }
|
||||
);
|
||||
|
||||
const session = await database.sessions.findOne({
|
||||
_id: new ObjectId(sessionId.value),
|
||||
});
|
||||
|
||||
if (!session)
|
||||
return NextResponse.json(
|
||||
{
|
||||
message: 'Invalid session',
|
||||
},
|
||||
{ status: HttpStatusCode.NotFound }
|
||||
);
|
||||
|
||||
const user = await database.users.findOne({
|
||||
_id: new ObjectId(session.user),
|
||||
});
|
||||
|
||||
if (!user)
|
||||
return NextResponse.json(
|
||||
{
|
||||
message: 'User not found',
|
||||
},
|
||||
{ status: HttpStatusCode.NotFound }
|
||||
);
|
||||
|
||||
const platforms: UserPlatforms = {};
|
||||
|
||||
for (const [name, platform] of Object.entries(user.platforms)) {
|
||||
const icon = await getPlatformIcon(platform);
|
||||
if (!icon) continue;
|
||||
platforms[name] = {
|
||||
...platform,
|
||||
icon,
|
||||
};
|
||||
}
|
||||
|
||||
return NextResponse.json(
|
||||
{
|
||||
message: 'ok',
|
||||
platforms,
|
||||
},
|
||||
{ status: HttpStatusCode.Ok }
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
"use client"
|
||||
|
||||
import * as React from "react"
|
||||
import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group"
|
||||
import { type VariantProps } from "class-variance-authority"
|
||||
|
||||
import { cn } from "@/lib/utils"
|
||||
import { toggleVariants } from "@/components/ui/toggle"
|
||||
|
||||
const ToggleGroupContext = React.createContext<
|
||||
VariantProps<typeof toggleVariants>
|
||||
>({
|
||||
size: "default",
|
||||
variant: "default",
|
||||
})
|
||||
|
||||
const ToggleGroup = React.forwardRef<
|
||||
React.ElementRef<typeof ToggleGroupPrimitive.Root>,
|
||||
React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root> &
|
||||
VariantProps<typeof toggleVariants>
|
||||
>(({ className, variant, size, children, ...props }, ref) => (
|
||||
<ToggleGroupPrimitive.Root
|
||||
ref={ref}
|
||||
className={cn("flex items-center justify-center gap-1", className)}
|
||||
{...props}
|
||||
>
|
||||
<ToggleGroupContext.Provider value={{ variant, size }}>
|
||||
{children}
|
||||
</ToggleGroupContext.Provider>
|
||||
</ToggleGroupPrimitive.Root>
|
||||
))
|
||||
|
||||
ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName
|
||||
|
||||
const ToggleGroupItem = React.forwardRef<
|
||||
React.ElementRef<typeof ToggleGroupPrimitive.Item>,
|
||||
React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> &
|
||||
VariantProps<typeof toggleVariants>
|
||||
>(({ className, children, variant, size, ...props }, ref) => {
|
||||
const context = React.useContext(ToggleGroupContext)
|
||||
|
||||
return (
|
||||
<ToggleGroupPrimitive.Item
|
||||
ref={ref}
|
||||
className={cn(
|
||||
toggleVariants({
|
||||
variant: context.variant || variant,
|
||||
size: context.size || size,
|
||||
}),
|
||||
className
|
||||
)}
|
||||
{...props}
|
||||
>
|
||||
{children}
|
||||
</ToggleGroupPrimitive.Item>
|
||||
)
|
||||
})
|
||||
|
||||
ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName
|
||||
|
||||
export { ToggleGroup, ToggleGroupItem }
|
||||
@@ -0,0 +1,45 @@
|
||||
"use client"
|
||||
|
||||
import * as React from "react"
|
||||
import * as TogglePrimitive from "@radix-ui/react-toggle"
|
||||
import { cva, type VariantProps } from "class-variance-authority"
|
||||
|
||||
import { cn } from "@/lib/utils"
|
||||
|
||||
const toggleVariants = cva(
|
||||
"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
|
||||
{
|
||||
variants: {
|
||||
variant: {
|
||||
default: "bg-transparent",
|
||||
outline:
|
||||
"border border-input bg-transparent shadow-sm hover:bg-accent hover:text-accent-foreground",
|
||||
},
|
||||
size: {
|
||||
default: "h-9 px-2 min-w-9",
|
||||
sm: "h-8 px-1.5 min-w-8",
|
||||
lg: "h-10 px-2.5 min-w-10",
|
||||
},
|
||||
},
|
||||
defaultVariants: {
|
||||
variant: "default",
|
||||
size: "default",
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
const Toggle = React.forwardRef<
|
||||
React.ElementRef<typeof TogglePrimitive.Root>,
|
||||
React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> &
|
||||
VariantProps<typeof toggleVariants>
|
||||
>(({ className, variant, size, ...props }, ref) => (
|
||||
<TogglePrimitive.Root
|
||||
ref={ref}
|
||||
className={cn(toggleVariants({ variant, size, className }))}
|
||||
{...props}
|
||||
/>
|
||||
))
|
||||
|
||||
Toggle.displayName = TogglePrimitive.Root.displayName
|
||||
|
||||
export { Toggle, toggleVariants }
|
||||
Reference in New Issue
Block a user