119 lines
3.0 KiB
TypeScript
119 lines
3.0 KiB
TypeScript
'use client'
|
|
|
|
import { getGitHubToken } from '@/actions/github'
|
|
import { Octokit } from '@octokit/rest'
|
|
import { useState } from 'react'
|
|
import { toast } from 'sonner'
|
|
|
|
interface CreateRepoFromTemplateParams {
|
|
templateOwner: string
|
|
templateRepo: string
|
|
name: string
|
|
description?: string
|
|
isPrivate?: boolean
|
|
}
|
|
|
|
interface CreateRepoResult {
|
|
success: boolean
|
|
repositoryUrl?: string
|
|
error?: string
|
|
}
|
|
|
|
/**
|
|
* Hook to directly interact with GitHub API using user's own token
|
|
* Bypasses backend GitHub integration issues
|
|
*/
|
|
export function useDirectGitHub() {
|
|
const [isLoading, setIsLoading] = useState(false)
|
|
|
|
const createRepoFromTemplate = async (
|
|
params: CreateRepoFromTemplateParams
|
|
): Promise<CreateRepoResult> => {
|
|
setIsLoading(true)
|
|
|
|
try {
|
|
console.log(
|
|
'🔄 Creating repository from template directly via GitHub API...'
|
|
)
|
|
console.log('📋 Parameters:', params)
|
|
|
|
// Get user's GitHub token
|
|
const token = await getGitHubToken()
|
|
if (!token) {
|
|
throw new Error(
|
|
'GitHub token not available. Please reconnect your GitHub account.'
|
|
)
|
|
}
|
|
|
|
// Create Octokit instance with user's token
|
|
const octokit = new Octokit({ auth: token })
|
|
|
|
// Get the authenticated user's info to use as owner
|
|
const { data: authUser } = await octokit.rest.users.getAuthenticated()
|
|
console.log('👤 Authenticated GitHub user:', authUser.login)
|
|
|
|
// Create repository from template
|
|
const { data: newRepo } = await octokit.rest.repos.createUsingTemplate({
|
|
template_owner: params.templateOwner,
|
|
template_repo: params.templateRepo,
|
|
owner: authUser.login, // Use authenticated user as owner
|
|
name: params.name,
|
|
description:
|
|
params.description ||
|
|
`Created from ${params.templateOwner}/${params.templateRepo}`,
|
|
private: params.isPrivate || false,
|
|
include_all_branches: false
|
|
})
|
|
|
|
console.log('✅ Repository created successfully:', newRepo.html_url)
|
|
|
|
return {
|
|
success: true,
|
|
repositoryUrl: newRepo.html_url
|
|
}
|
|
} catch (error) {
|
|
console.error('❌ Failed to create repository from template:', error)
|
|
|
|
let errorMessage = 'Failed to create repository from template'
|
|
if (error instanceof Error) {
|
|
errorMessage = error.message
|
|
}
|
|
|
|
return {
|
|
success: false,
|
|
error: errorMessage
|
|
}
|
|
} finally {
|
|
setIsLoading(false)
|
|
}
|
|
}
|
|
|
|
const getUserRepos = async () => {
|
|
try {
|
|
const token = await getGitHubToken()
|
|
if (!token) {
|
|
throw new Error('GitHub token not available')
|
|
}
|
|
|
|
const octokit = new Octokit({ auth: token })
|
|
const { data: repos } = await octokit.rest.repos.listForAuthenticatedUser(
|
|
{
|
|
sort: 'updated',
|
|
per_page: 100
|
|
}
|
|
)
|
|
|
|
return repos
|
|
} catch (error) {
|
|
console.error('❌ Failed to fetch user repositories:', error)
|
|
throw error
|
|
}
|
|
}
|
|
|
|
return {
|
|
createRepoFromTemplate,
|
|
getUserRepos,
|
|
isLoading
|
|
}
|
|
}
|