commit c36b0ec0b374dd8ccbee3a6044ee7e3f1fefe368 Author: Nicholas Koben Kao <kobenkao@gmail.com> Date: Thu Jan 25 17:54:54 2024 -0800 nits on wording and removing link to broken storage/:id page commit 0777fdcf7b0002244bc713199d3d64eea6b6061e Author: Nicholas Koben Kao <kobenkao@gmail.com> Date: Thu Jan 25 17:23:55 2024 -0800 builder update config and such commit 958b795bb2b6ac27ce33c5729ef265b068420e1a Author: Nicholas Koben Kao <kobenkao@gmail.com> Date: Thu Jan 25 17:23:43 2024 -0800 rename all from checkponit to model commit 7a9c5636e73bd005499b141a4dd382db5672c962 Author: Nicholas Koben Kao <kobenkao@gmail.com> Date: Thu Jan 25 16:51:59 2024 -0800 rename for consistency commit 48bebbafab9a95388817df97c15f8ea97e0fea75 Author: Nicholas Koben Kao <kobenkao@gmail.com> Date: Thu Jan 25 16:18:36 2024 -0800 bulider commit 81dacd9af457886f2f027994d225a7748c738abb Author: Nicholas Koben Kao <kobenkao@gmail.com> Date: Thu Jan 25 16:17:56 2024 -0800 different types of models
87 lines
2.7 KiB
TypeScript
87 lines
2.7 KiB
TypeScript
// NOTE: this is WIP for doing client side validation for civitai model downloading
|
|
import type { AutoFormInputComponentProps } from "../ui/auto-form/types";
|
|
import { FormControl, FormItem, FormLabel } from "../ui/form";
|
|
import { LoadingIcon } from "@/components/LoadingIcon";
|
|
import * as React from "react";
|
|
import AutoFormInput from "../ui/auto-form/fields/input";
|
|
import { useDebouncedCallback } from "use-debounce";
|
|
import { CivitaiModelResponse } from "@/types/civitai";
|
|
import { z } from "zod";
|
|
import { insertCivitaiModelSchema } from "@/db/schema";
|
|
|
|
function getUrl(civitai_url: string) {
|
|
// expect to be a URL to be https://civitai.com/models/36520
|
|
// possiblity with slugged name and query-param modelVersionId
|
|
|
|
const baseUrl = "https://civitai.com/api/v1/models/";
|
|
const url = new URL(civitai_url);
|
|
const pathSegments = url.pathname.split("/");
|
|
const modelId = pathSegments[pathSegments.indexOf("models") + 1];
|
|
const modelVersionId = url.searchParams.get("modelVersionId");
|
|
|
|
return { url: baseUrl + modelId, modelVersionId };
|
|
}
|
|
|
|
export default function AutoFormCheckpointInput(
|
|
props: AutoFormInputComponentProps
|
|
) {
|
|
const [loading, setLoading] = React.useState(false);
|
|
const [modelRes, setModelRes] =
|
|
React.useState<z.infer<typeof CivitaiModelResponse>>();
|
|
const [modelVersionid, setModelVersionId] = React.useState<string | null>();
|
|
const { label, isRequired, fieldProps, zodItem, fieldConfigItem } = props;
|
|
|
|
const handleSearch = useDebouncedCallback((search) => {
|
|
const validationResult =
|
|
insertCivitaiModelSchema.shape.civitai_url.safeParse(search);
|
|
if (!validationResult.success) {
|
|
console.error(validationResult.error);
|
|
// Optionally set an error state here
|
|
return;
|
|
}
|
|
|
|
setLoading(true);
|
|
|
|
const controller = new AbortController();
|
|
const { url, modelVersionId: versionId } = getUrl(search);
|
|
setModelVersionId(versionId);
|
|
fetch(url, {
|
|
signal: controller.signal,
|
|
})
|
|
.then((x) => x.json())
|
|
.then((a) => {
|
|
const res = CivitaiModelResponse.parse(a);
|
|
console.log(a);
|
|
console.log(res);
|
|
setModelRes(res);
|
|
setLoading(false);
|
|
});
|
|
|
|
return () => {
|
|
controller.abort();
|
|
setLoading(false);
|
|
};
|
|
}, 300);
|
|
|
|
const modifiedField = {
|
|
...fieldProps,
|
|
// onChange: (event: React.ChangeEvent<HTMLInputElement>) => {
|
|
// handleSearch(event.target.value);
|
|
// },
|
|
};
|
|
|
|
return (
|
|
<FormItem>
|
|
{fieldConfigItem.inputProps?.showLabel && (
|
|
<FormLabel>
|
|
{label}
|
|
{isRequired && <span className="text-destructive">*</span>}
|
|
</FormLabel>
|
|
)}
|
|
<FormControl>
|
|
<AutoFormInput {...props} fieldProps={modifiedField} />
|
|
</FormControl>
|
|
</FormItem>
|
|
);
|
|
}
|