File size: 4,206 Bytes
16c1c4c
58ae063
ee999fe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58ae063
 
 
 
ee999fe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c433511
 
84f514d
 
c433511
 
 
 
 
 
 
 
 
 
84f514d
c433511
 
 
 
 
 
 
 
 
58ae063
16c1c4c
 
 
 
 
 
 
58ae063
c433511
 
 
 
 
 
 
 
 
 
 
 
 
 
84f514d
 
 
c433511
 
84f514d
 
c433511
 
 
 
 
 
 
 
 
 
84f514d
ee999fe
16c1c4c
84f514d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ee999fe
 
 
 
16c1c4c
ee999fe
 
 
 
 
 
 
 
58ae063
 
 
 
 
16c1c4c
58ae063
 
 
 
 
16c1c4c
58ae063
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import { oauthManager, HuggingFaceWindow } from "./oauth";

interface OrganizationInfo {
  type: string;
  id: string;
  name: string;
  role: string;
}

interface WhoAmIResponse {
  type: string;
  id: string;
  name: string;
  email?: string;
  fullname?: string;
  avatarUrl?: string;
  organizations: OrganizationInfo[];
}

declare const window: HuggingFaceWindow;

console.log("huggingface env", window.huggingface);

async function getOrganizationInfo(
  accessToken: string
): Promise<WhoAmIResponse> {
  const response = await fetch("https://huggingface.co/api/whoami-v2", {
    headers: {
      Authorization: `Bearer ${accessToken}`,
    },
  });

  if (!response.ok) {
    throw new Error(
      `Failed to fetch organization info: ${response.statusText}`
    );
  }

  return response.json();
}

async function createRepository(
  accessToken: string,
  name: string,
  organization?: string
): Promise<void> {
  const response = await fetch("https://huggingface.co/api/repos/create", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${accessToken}`,
    },
    body: JSON.stringify({
      type: "model",
      name: name,
      organization: organization,
      private: false,
    }),
  });

  if (!response.ok) {
    throw new Error(`Failed to create repository: ${response.statusText}`);
  }
}

const init = async (): Promise<void> => {
  await oauthManager.handleRedirect();

  if (oauthManager.isAuthenticated()) {
    const accessToken = oauthManager.getAccessToken();
    if (!accessToken) {
      throw new Error("Access token not found");
    }

    // Show repo form when logged in
    const repoForm = document.getElementById("repo-form");
    if (repoForm) {
      repoForm.style.removeProperty("display");
    }

    // Add create repo functionality
    const createRepoButton = document.getElementById("create-repo");
    const repoNameInput = document.getElementById(
      "repo-name"
    ) as HTMLInputElement;
    if (createRepoButton && repoNameInput) {
      createRepoButton.onclick = async () => {
        const repoName = repoNameInput.value.trim();
        const orgSelect = document.getElementById(
          "org-select"
        ) as HTMLSelectElement;
        if (repoName) {
          try {
            const selectedOrg = orgSelect?.value || undefined;
            await createRepository(accessToken, repoName, selectedOrg);
            repoNameInput.value = ""; // Clear input after success
            alert("Repository created successfully!");
          } catch (error) {
            console.error("Failed to create repository:", error);
            alert("Failed to create repository. Please try again.");
          }
        }
      };
    }

    // Get organization info and populate org select after successful authentication
    try {
      const orgInfo = await getOrganizationInfo(accessToken);

      // Populate org select
      const orgSelect = document.getElementById(
        "org-select"
      ) as HTMLSelectElement;
      if (orgSelect && orgInfo.organizations) {
        orgInfo.organizations.forEach((org) => {
          const option = document.createElement("option");
          option.value = org.name;
          option.textContent = org.name;
          orgSelect.appendChild(option);
        });
      }

      // Display full info in pre element
      const preElement = document.querySelector("pre");
      if (preElement) {
        preElement.textContent = JSON.stringify(
          {
            oauth: oauthManager.getAccessToken(),
            user: orgInfo,
          },
          null,
          2
        );
      }
    } catch (error) {
      console.error("Failed to fetch organization info:", error);
    }

    const signoutButton = document.getElementById("signout");
    if (signoutButton) {
      signoutButton.style.removeProperty("display");
      signoutButton.onclick = () => oauthManager.logout();
    }
  } else {
    const signinButton = document.getElementById("signin");
    if (signinButton) {
      signinButton.style.removeProperty("display");
      signinButton.onclick = () => oauthManager.initiateLogin();
    }
  }
};

init().catch(console.error);