Refactor package dependencies and update ApplyProject component

This commit is contained in:
Pattadon 2024-10-24 15:14:09 +07:00
parent 29be79f6e8
commit 4b5be49874
5 changed files with 63 additions and 38 deletions

28
package-lock.json generated
View File

@ -9,6 +9,7 @@
"version": "0.1.0", "version": "0.1.0",
"dependencies": { "dependencies": {
"@hookform/resolvers": "^3.9.0", "@hookform/resolvers": "^3.9.0",
"@radix-ui/react-alert-dialog": "^1.1.2",
"@radix-ui/react-avatar": "^1.1.0", "@radix-ui/react-avatar": "^1.1.0",
"@radix-ui/react-dialog": "^1.1.2", "@radix-ui/react-dialog": "^1.1.2",
"@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1",
@ -940,6 +941,33 @@
"resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz",
"integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA=="
}, },
"node_modules/@radix-ui/react-alert-dialog": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.2.tgz",
"integrity": "sha512-eGSlLzPhKO+TErxkiGcCZGuvbVMnLA1MTnyBksGOeGRGkxHiiJUujsjmNTdWTm4iHVSRaUao9/4Ur671auMghQ==",
"dependencies": {
"@radix-ui/primitive": "1.1.0",
"@radix-ui/react-compose-refs": "1.1.0",
"@radix-ui/react-context": "1.1.1",
"@radix-ui/react-dialog": "1.1.2",
"@radix-ui/react-primitive": "2.0.0",
"@radix-ui/react-slot": "1.1.0"
},
"peerDependencies": {
"@types/react": "*",
"@types/react-dom": "*",
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
},
"@types/react-dom": {
"optional": true
}
}
},
"node_modules/@radix-ui/react-arrow": { "node_modules/@radix-ui/react-arrow": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz",

View File

@ -16,6 +16,7 @@ const BUCKET_PHOTOS_NAME = "project-additional-photos";
export default function ApplyProject() { export default function ApplyProject() {
const onSubmit: SubmitHandler<projectSchema> = async (data) => { const onSubmit: SubmitHandler<projectSchema> = async (data) => {
alert("มาแน้ววว"); alert("มาแน้ววว");
console.table(data); console.table(data);
console.log(typeof data["projectPhotos"], data["projectPhotos"]); console.log(typeof data["projectPhotos"], data["projectPhotos"]);
}; };
@ -26,20 +27,16 @@ export default function ApplyProject() {
const pitchType = typeof recvData["projectPitchDeck"]; const pitchType = typeof recvData["projectPitchDeck"];
const { data, error } = await supabase const { data, error } = await supabase
.from("business_application") .from("project_application")
.insert([ .insert([
{ {
user_id: user?.id, user_id: user?.id,
business_name: recvData["projectName"],
business_type_id: recvData["industry"],
location: recvData["country"],
is_for_sale: recvData["isForSale"],
is_generating_revenue: recvData["isGenerating"],
is_in_us: recvData["isInUS"],
pitch_deck_url: pitch_deck_url:
pitchType === "string" ? recvData["businessPitchDeck"] : "", pitchType === "string" ? recvData["businessPitchDeck"] : "",
money_raised_to_date: recvData["totalRaised"], target_investment: recvData["targetInvest"],
community_size: recvData["communitySize"], deadline: recvData["deadline"],
project_name: recvData["projectName"],
}, },
]) ])
.select(); .select();

View File

@ -55,7 +55,9 @@ const ProjectForm = ({
const [projectPitchFile, setProjectPitchFile] = useState(""); const [projectPitchFile, setProjectPitchFile] = useState("");
const [tag, setTag] = useState<{ id: number; value: string }[]>([]); const [tag, setTag] = useState<{ id: number; value: string }[]>([]);
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const [selectedTag, setSelectedTag] = useState<string[]>([]); const [selectedTag, setSelectedTag] = useState<
{ id: number; value: string }[]
>([]);
const handleFileChange = ( const handleFileChange = (
event: React.ChangeEvent<HTMLInputElement>, event: React.ChangeEvent<HTMLInputElement>,
@ -165,7 +167,7 @@ const ProjectForm = ({
fieldName="projectType" fieldName="projectType"
choices={projectType} choices={projectType}
handleFunction={(selectedValues: any) => { handleFunction={(selectedValues: any) => {
field.onChange(selectedValues.name); field.onChange(selectedValues.id);
}} }}
description={ description={
<>Please specify the primary purpose of the funds</> <>Please specify the primary purpose of the funds</>
@ -492,7 +494,7 @@ const ProjectForm = ({
className="w-96 justify-between overflow-hidden text-ellipsis whitespace-nowrap" className="w-96 justify-between overflow-hidden text-ellipsis whitespace-nowrap"
> >
{selectedTag.length > 0 {selectedTag.length > 0
? selectedTag.join(", ") ? selectedTag.map((t) => t.value).join(", ")
: "Select tags..."} : "Select tags..."}
<ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" /> <ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
</Button> </Button>
@ -505,19 +507,19 @@ const ProjectForm = ({
<CommandGroup> <CommandGroup>
{tag.map((tag) => ( {tag.map((tag) => (
<CommandItem <CommandItem
key={tag.value} key={tag.id}
value={tag.value} value={tag.value}
onSelect={(currentValue) => { onSelect={() => {
setSelectedTag((prev) => { setSelectedTag((prev) => {
const updatedTags = prev.includes( const exists = prev.find(
currentValue (t) => t.id === tag.id
) );
? prev.filter( const updatedTags = exists
(item) => item !== currentValue ? prev.filter((t) => t.id !== tag.id)
) : [...prev, tag];
: [...prev, currentValue]; field.onChange(
field.onChange(updatedTags); updatedTags.map((t) => t.id)
);
return updatedTags; return updatedTags;
}); });
setOpen(false); setOpen(false);
@ -526,7 +528,7 @@ const ProjectForm = ({
<Check <Check
className={cn( className={cn(
"h-4", "h-4",
selectedTag.includes(tag.value) selectedTag.some((t) => t.id === tag.id)
? "opacity-100" ? "opacity-100"
: "opacity-0" : "opacity-0"
)} )}
@ -552,23 +554,21 @@ const ProjectForm = ({
<div className="flex flex-wrap space-x-3"> <div className="flex flex-wrap space-x-3">
{selectedTag.map((tag) => ( {selectedTag.map((tag) => (
<div <div
key={tag} key={tag.id}
className="flex items-center space-x-1 p-1 rounded mt-2 outline outline-offset-2 outline-1" className="flex items-center space-x-1 p-1 rounded mt-2 outline outline-offset-2 outline-1"
> >
<span>{tag}</span> <span>{tag.value}</span>
<button <button
onClick={() => onClick={() => {
setSelectedTag((prev) => { setSelectedTag((prev) => {
const updatedTags = prev.filter( const updatedTags = prev.filter(
(item) => item !== tag (t) => t.id !== tag.id
); );
field.onChange(updatedTags); field.onChange(updatedTags.map((t) => t.id));
return updatedTags; return updatedTags;
}) });
} }}
> >
{/* delete button */}
<X className="h-4 w-4" /> <X className="h-4 w-4" />
</button> </button>
</div> </div>

View File

@ -25,7 +25,7 @@ export function ProjectCard(props: ProjectCardProps) {
return ( return (
<div <div
className={cn( className={cn(
"flex flex-col group border-[1px] border-border relative hover:shadow-md rounded-xl h-[450px]", "flex flex-col group border-[1px] border-border relative hover:shadow-md rounded-xl h-[450px] ",
props.className props.className
)}> )}>
<div className="flex flex-col h-full"> <div className="flex flex-col h-full">
@ -58,7 +58,7 @@ export function ProjectCard(props: ProjectCardProps) {
{/* Info 1 */} {/* Info 1 */}
<div> <div>
<div className="transition-transform duration-500 transform opacity-100 group-hover:opacity-0 p-4"> <div className="transition-transform duration-500 transform opacity-100 group-hover:opacity-0 p-4 ">
<div className="flex items-center text-muted-foreground"> <div className="flex items-center text-muted-foreground">
<span className="flex items-center gap-1"> <span className="flex items-center gap-1">
<CalendarDaysIcon width={20} /> <CalendarDaysIcon width={20} />
@ -79,7 +79,7 @@ export function ProjectCard(props: ProjectCardProps) {
</div> </div>
{/* Info 2 */} {/* Info 2 */}
<div className="hidden group-hover:flex group-hover:absolute group-hover:bottom-4 p-4"> <div className="hidden group-hover:flex group-hover:absolute group-hover:bottom-4 p-4 ">
{/* Info 2 (Visible on hover) */} {/* Info 2 (Visible on hover) */}
<div className="transition-transform duration-500 transform translate-y-6 opacity-0 group-hover:translate-y-0 group-hover:opacity-100"> <div className="transition-transform duration-500 transform translate-y-6 opacity-0 group-hover:translate-y-0 group-hover:opacity-100">
<hr className="-ml-4 mb-2" /> <hr className="-ml-4 mb-2" />

View File

@ -21,7 +21,7 @@ const projectFormSchema = z.object({
projectName: z.string().min(5, { projectName: z.string().min(5, {
message: "Project name must be at least 5 characters.", message: "Project name must be at least 5 characters.",
}), }),
projectType: z.string({ projectType: z.number({
required_error: "Please select one of the option", required_error: "Please select one of the option",
}), }),
shortDescription: z shortDescription: z
@ -91,7 +91,7 @@ const projectFormSchema = z.object({
message: "Deadline must be in the future.", message: "Deadline must be in the future.",
}), }),
tag: z tag: z
.array(z.string()) .array(z.number())
.min(1, "Please provide at least one tag.") .min(1, "Please provide at least one tag.")
.max(5, "You can provide up to 5 tags."), .max(5, "You can provide up to 5 tags."),
}); });