@restnfeel/agentc-starter-kit
Version:
한국어 기업용 CMS 모듈 - Task Master AI와 함께 빠르게 웹사이트를 구현할 수 있는 재사용 가능한 컴포넌트 시스템
99 lines (89 loc) • 2.6 kB
text/typescript
import { User } from "../../types";
import { SignInOptions } from "../AuthProvider";
// Simplified Supabase types
interface SupabaseUser {
id: string;
email?: string;
user_metadata?: {
full_name?: string;
avatar_url?: string;
name?: string;
};
created_at?: string;
updated_at?: string;
}
interface SupabaseSession {
user: SupabaseUser | null;
}
interface SupabaseClient {
auth: {
getSession: () => Promise<{ data: { session: SupabaseSession | null } }>;
signInWithOAuth: (options: {
provider: string;
options?: SignInOptions;
}) => Promise<void>;
signInWithPassword: (credentials: {
email: string;
password: string;
}) => Promise<void>;
signOut: () => Promise<void>;
onAuthStateChange: (
callback: (event: string, session: SupabaseSession | null) => void
) => void;
};
}
// Helper function to convert Supabase user to our User type
const convertSupabaseUser = (
supabaseUser: SupabaseUser | null
): User | null => {
if (!supabaseUser) return null;
return {
id: supabaseUser.id,
email: supabaseUser.email || "",
name:
supabaseUser.user_metadata?.full_name ||
supabaseUser.user_metadata?.name ||
"",
avatar_url: supabaseUser.user_metadata?.avatar_url,
role: "customer", // Default role, can be customized
created_at: supabaseUser.created_at || new Date().toISOString(),
updated_at: supabaseUser.updated_at || new Date().toISOString(),
};
};
// Supabase adapter for AuthProvider
export const createSupabaseAdapter = (supabase?: SupabaseClient) => {
if (!supabase) {
console.warn("Supabase client not provided to adapter");
return {};
}
return {
getSession: async () => {
const {
data: { session },
} = await supabase.auth.getSession();
return {
user: convertSupabaseUser(session?.user || null),
};
},
signInAdapter: async (provider?: string, options?: SignInOptions) => {
if (provider && provider !== "password") {
// OAuth provider
await supabase.auth.signInWithOAuth({
provider,
options,
});
} else if (options && "email" in options && "password" in options) {
// Email/password sign in
await supabase.auth.signInWithPassword({
email: options.email as string,
password: options.password as string,
});
} else {
throw new Error("Invalid sign in options for Supabase");
}
},
signOutAdapter: async () => {
await supabase.auth.signOut();
},
};
};