mirror of
https://github.com/Sosokker/B2D-Ventures.git
synced 2025-12-19 05:54:06 +01:00
Refactor package dependencies and update ApplyProject component
This commit is contained in:
parent
29be79f6e8
commit
4b5be49874
28
package-lock.json
generated
28
package-lock.json
generated
@ -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",
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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" />
|
||||||
|
|||||||
@ -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."),
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user