dylanebert's picture
dylanebert HF Staff
use remote
016c02f
raw
history blame
18.1 kB
import Row from "./Row";
import { statusMessage } from "./store";
const baseURL = "https://dylanebert-research-tracker-backend.hf.space";
// const baseURL = "http://localhost:8000";
export const fetchRows = async (): Promise<Row[] | null> => {
statusMessage.set(`<span>Fetching data from https://dylanebert-research-tracker-backend.hf.space/data</span>`);
try {
const response = await fetch(baseURL + "/data", {
method: "GET",
headers: {
Authorization: "Bearer " + import.meta.env.VITE_HF_TOKEN,
"Cache-Control": "no-cache",
},
});
const rows = await response.json();
statusMessage.reset();
return rows;
} catch (e) {
console.error(e);
statusMessage.set(
`<span style="color: red;">Error: Failed to fetch data from https://dylanebert-research-tracker-backend.hf.space/data</span>`
);
return null;
}
};
export const addEntry = async (selection: Record<string | number, any>): Promise<Row | null> => {
if (!("Name" in selection)) return null;
const value = selection["Name"] as string;
let row: Row | null = new Row();
const field = await inferFieldType(row, value);
if (!field) return null;
if (field === "Name") {
row.Name = value;
} else if (field === "Paper") {
row.Paper = value;
} else if (field === "Code") {
row.Code = value;
} else if (field === "Space") {
row.Space = value;
} else if (field === "Model") {
row.Model = value;
} else if (field === "Dataset") {
row.Dataset = value;
} else if (field === "Project") {
row.Project = value;
} else {
statusMessage.set(`<span style="color: red;">Error: Failed to infer field type for <b>${value}</b></span>`);
return null;
}
row = await inferFields(row);
if (!row) {
return null;
}
const response = await fetch(baseURL + "/add-entry", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + import.meta.env.VITE_HF_TOKEN,
},
body: JSON.stringify(row),
});
const data = await response.json();
if (data.error || !data.success) {
if (data.error) {
statusMessage.append(`<br><span style="color: red;">Error: ${data.error}</span>`);
} else {
statusMessage.append(`<br><span style="color: red;">Error: Failed to add entry</span>`);
}
return null;
}
statusMessage.append(`<br><span style="color: green;">Added entry for "${row.Name}"</span>`);
return row;
};
export const editEntry = async (row: Row): Promise<Row | null> => {
row.Orgs = Array.isArray(row.Orgs) ? row.Orgs : (row.Orgs as any).split(",").map((org: string) => org.trim());
row.Authors = Array.isArray(row.Authors)
? row.Authors
: (row.Authors as any).split(",").map((author: string) => author.trim());
row.Tags = Array.isArray(row.Tags) ? row.Tags : (row.Tags as any).split(",").map((tag: string) => tag.trim());
const response = await fetch(baseURL + "/edit-entry", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + import.meta.env.VITE_HF_TOKEN,
},
body: JSON.stringify(row),
});
const data = await response.json();
if (data.error || !data.success) {
if (data.error) {
statusMessage.append(`<br><span style="color: red;">Error: ${data.error}</span>`);
} else {
statusMessage.append(`<br><span style="color: red;">Error: Failed to edit entry</span>`);
}
return null;
}
statusMessage.append(`<br><span style="color: green;">Edited entry for "${row.Name}"</span>`);
return row;
};
export const deleteEntry = async (row: Row): Promise<Row | null> => {
row.Orgs = Array.isArray(row.Orgs) ? row.Orgs : (row.Orgs as any).split(",").map((org: string) => org.trim());
row.Authors = Array.isArray(row.Authors)
? row.Authors
: (row.Authors as any).split(",").map((author: string) => author.trim());
row.Tags = Array.isArray(row.Tags) ? row.Tags : (row.Tags as any).split(",").map((tag: string) => tag.trim());
const response = await fetch(baseURL + "/delete-entry", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + import.meta.env.VITE_HF_TOKEN,
},
body: JSON.stringify(row),
});
const data = await response.json();
if (data.error || !data.success) {
if (data.error) {
statusMessage.append(`<br><span style="color: red;">Error: ${data.error}</span>`);
} else {
statusMessage.append(`<br><span style="color: red;">Error: Failed to delete entry</span>`);
}
return null;
}
statusMessage.append(`<br><span style="color: green;">Deleted entry for "${row.Name}"</span>`);
return row;
};
export const inferFields = async (row: Row): Promise<Row | null> => {
const key = row.Name || row.Paper || row.Code || row.Space || row.Model || row.Dataset || row.Project;
statusMessage.set(`<span>Inferring fields for <b>${key}</b></span>`);
const paper = row.Paper || (await inferPaper(row));
const code = row.Code || (await inferCode(row));
const name = row.Name || (await inferName(row));
if (!name) {
return null;
}
row.Name = name;
const authors = row.Authors.length == 0 ? await inferAuthors(row) : row.Authors;
const orgs = row.Orgs.length == 0 ? await inferOrgs(row) : row.Orgs;
const date = row.Date || (await inferDate(row));
const model = row.Model || (await inferModel(row));
const dataset = row.Dataset || (await inferDataset(row));
if (paper) {
row.Paper = paper;
}
if (code) {
row.Code = code;
}
if (authors) {
row.Authors = Array.isArray(authors) ? authors : authors.split(",").map((author: string) => author.trim());
}
if (orgs) {
row.Orgs = Array.isArray(orgs) ? orgs : orgs.split(",").map((org: string) => org.trim());
}
if (date) {
row.Date = date;
}
if (model) {
row.Model = model;
}
if (dataset) {
row.Dataset = dataset;
}
statusMessage.append(`<br><span style="color: green;">Finished inferring fields for <b>${row.Name}</b></span>`);
return row;
};
const inferFieldType = async (row: Row, value: string): Promise<string | null> => {
let data;
try {
const response = await fetch(baseURL + "/infer-field", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + import.meta.env.VITE_HF_TOKEN,
},
body: JSON.stringify({ value }),
});
data = await response.json();
} catch (e) {
statusMessage.append(
`<br><span style="color: red;">Error: Failed to infer field type for <b>${value}</b></span>`
);
return null;
}
if (data.error || !data.field || !(data.field in row)) {
statusMessage.set(`<span style="color: red;">Error: Failed to infer field type for <b>${value}</b></span>`);
return null;
}
statusMessage.set(`<span style="color: green;">Inferred field type: ${data.field}</span>`);
return data.field;
};
const inferPaper = async (row: Row) => {
statusMessage.append(`<br><span>Inferring paper...</span>`);
let data;
try {
const response = await fetch(baseURL + "/infer-paper", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + import.meta.env.VITE_HF_TOKEN,
},
body: JSON.stringify(row),
});
data = await response.json();
} catch (e) {
statusMessage.remove("<br><span>Inferring paper...</span>");
statusMessage.append(`<br><span style="color: red;">Error: Failed to infer paper</span>`);
return null;
}
statusMessage.remove("<br><span>Inferring paper...</span>");
if (data.error || !data.paper) {
if (data.error) {
statusMessage.append(`<br><span style="color: red;">Error: ${data.error}</span>`);
} else if (data.message) {
statusMessage.append(`<br><span>${data.message}</span>`);
} else {
statusMessage.append(`<br><span style="color: red;">Error: Failed to infer paper</span>`);
}
return null;
}
const link = `<a href="${data.paper}" target="_blank">${data.paper}</a>`;
statusMessage.append(`<br><span style="color: green;">Inferred paper: ${link}</span>`);
return data.paper;
};
const inferCode = async (row: Row) => {
statusMessage.append(`<br><span>Inferring code...</span>`);
let data;
try {
const response = await fetch(baseURL + "/infer-code", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + import.meta.env.VITE_HF_TOKEN,
},
body: JSON.stringify(row),
});
data = await response.json();
} catch (e) {
statusMessage.remove("<br><span>Inferring code...</span>");
statusMessage.append(`<br><span style="color: red;">Error: Failed to infer code</span>`);
return null;
}
statusMessage.remove("<br><span>Inferring code...</span>");
if (data.error || !data.code) {
if (data.error) {
statusMessage.append(`<br><span style="color: red;">Error: ${data.error}</span>`);
} else if (data.message) {
statusMessage.append(`<br><span>${data.message}</span>`);
} else {
statusMessage.append(`<br><span style="color: red;">Error: Failed to infer code</span>`);
}
return null;
}
const link = `<a href="${data.code}" target="_blank">${data.code}</a>`;
statusMessage.append(`<br><span style="color: green;">Inferred code: ${link}</span>`);
return data.code;
};
const inferName = async (row: Row) => {
statusMessage.append(`<br><span>Inferring name...</span>`);
let data;
try {
const response = await fetch(baseURL + "/infer-name", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + import.meta.env.VITE_HF_TOKEN,
},
body: JSON.stringify(row),
});
data = await response.json();
} catch (e) {
statusMessage.remove("<br><span>Inferring name...</span>");
statusMessage.append(`<br><span style="color: red;">Error: Failed to infer name</span>`);
return null;
}
statusMessage.remove("<br><span>Inferring name...</span>");
if (data.error || !data.name) {
if (data.error) {
statusMessage.append(`<br><span style="color: red;">Error: ${data.error}</span>`);
} else if (data.message) {
statusMessage.append(`<br><span style="color: red;">Error: ${data.message}</span>`);
} else {
statusMessage.append(`<br><span style="color: red;">Error: Failed to infer name</span>`);
}
return null;
}
statusMessage.append(`<br><span style="color: green;">Inferred name: <b>${data.name}</b></span>`);
return data.name;
};
const inferAuthors = async (row: Row) => {
statusMessage.append(`<br><span>Inferring authors...</span>`);
let data;
try {
const response = await fetch(baseURL + "/infer-authors", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + import.meta.env.VITE_HF_TOKEN,
},
body: JSON.stringify(row),
});
data = await response.json();
} catch (e) {
statusMessage.remove("<br><span>Inferring authors...</span>");
statusMessage.append(`<br><span style="color: red;">Error: Failed to infer authors</span>`);
return null;
}
statusMessage.remove("<br><span>Inferring authors...</span>");
if (data.error || !data.authors) {
if (data.error) {
statusMessage.append(`<br><span style="color: red;">Error: ${data.error}</span>`);
} else if (data.message) {
statusMessage.append(`<br><span>${data.message}</span>`);
} else {
statusMessage.append(`<br><span style="color: red;">Error: Failed to infer authors</span>`);
}
return null;
}
statusMessage.append(`<br><span style="color: green;">Inferred authors: ${data.authors}</span>`);
return data.authors;
};
const inferOrgs = async (row: Row) => {
statusMessage.append(`<br><span>Inferring orgs...</span>`);
let data;
try {
const response = await fetch(baseURL + "/infer-orgs", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + import.meta.env.VITE_HF_TOKEN,
},
body: JSON.stringify(row),
});
data = await response.json();
} catch (e) {
statusMessage.remove("<br><span>Inferring orgs...</span>");
statusMessage.append(`<br><span style="color: red;">Error: Failed to infer orgs</span>`);
return null;
}
statusMessage.remove("<br><span>Inferring orgs...</span>");
if (data.error || !data.orgs) {
if (data.error) {
statusMessage.append(`<br><span style="color: red;">Error: ${data.error}</span>`);
} else if (data.message) {
statusMessage.append(`<br><span>${data.message}</span>`);
} else {
statusMessage.append(`<br><span style="color: red;">Error: Failed to infer orgs</span>`);
}
return null;
}
statusMessage.append(`<br><span style="color: green;">Inferred orgs: ${data.orgs}</span>`);
return data.orgs;
};
const inferDate = async (row: Row) => {
statusMessage.append(`<br><span>Inferring date...</span>`);
let data;
try {
const response = await fetch(baseURL + "/infer-date", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + import.meta.env.VITE_HF_TOKEN,
},
body: JSON.stringify(row),
});
data = await response.json();
} catch (e) {
statusMessage.remove("<br><span>Inferring date...</span>");
statusMessage.append(`<br><span style="color: red;">Error: Failed to infer date</span>`);
return null;
}
statusMessage.remove("<br><span>Inferring date...</span>");
if (data.error || !data.date) {
if (data.error) {
statusMessage.append(`<br><span style="color: red;">Error: ${data.error}</span>`);
} else if (data.message) {
statusMessage.append(`<br><span>${data.message}</span>`);
} else {
statusMessage.append(`<br><span style="color: red;">Error: Failed to infer date</span>`);
}
return null;
}
statusMessage.append(`<br><span style="color: green;">Inferred date: ${data.date}</span>`);
return data.date;
};
const inferModel = async (row: Row) => {
statusMessage.append(`<br><span>Inferring model...</span>`);
let data;
try {
const response = await fetch(baseURL + "/infer-model", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + import.meta.env.VITE_HF_TOKEN,
},
body: JSON.stringify(row),
});
data = await response.json();
} catch (e) {
statusMessage.remove("<br><span>Inferring model...</span>");
statusMessage.append(`<br><span style="color: red;">Error: Failed to infer model</span>`);
return null;
}
statusMessage.remove("<br><span>Inferring model...</span>");
if (data.error || !data.model) {
if (data.error) {
statusMessage.append(`<br><span style="color: red;">Error: ${data.error}</span>`);
} else if (data.message) {
statusMessage.append(`<br><span>${data.message}</span>`);
} else {
statusMessage.append(`<br><span style="color: red;">Error: Failed to infer model</span>`);
}
return null;
}
statusMessage.append(`<br><span style="color: green;">Inferred model: ${data.model}</span>`);
return data.model;
};
const inferDataset = async (row: Row) => {
statusMessage.append(`<br><span>Inferring dataset...</span>`);
let data;
try {
const response = await fetch(baseURL + "/infer-dataset", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + import.meta.env.VITE_HF_TOKEN,
},
body: JSON.stringify(row),
});
data = await response.json();
} catch (e) {
statusMessage.remove("<br><span>Inferring dataset...</span>");
statusMessage.append(`<br><span style="color: red;">Error: Failed to infer dataset</span>`);
return null;
}
statusMessage.remove("<br><span>Inferring dataset...</span>");
if (data.error || !data.dataset) {
if (data.error) {
statusMessage.append(`<br><span style="color: red;">Error: ${data.error}</span>`);
} else if (data.message) {
statusMessage.append(`<br><span>${data.message}</span>`);
} else {
statusMessage.append(`<br><span style="color: red;">Error: Failed to infer dataset</span>`);
}
return null;
}
statusMessage.append(`<br><span style="color: green;">Inferred dataset: ${data.dataset}</span>`);
return data.dataset;
};