Merge branch 'integrating-frontend'
This commit is contained in:
@ -1,46 +1,52 @@
|
||||
import { IconSearch } from "@tabler/icons-solidjs";
|
||||
import clsx from "clsx";
|
||||
import Fuse from "fuse.js";
|
||||
import { For, createSignal } from "solid-js";
|
||||
import { SearchCardContact } from "./components/search-card/SearchCardContact";
|
||||
import { For, createEffect, createResource, createSignal } from "solid-js";
|
||||
import { SearchCardEvent } from "./components/search-card/SearchCardEvent";
|
||||
import { SearchCardLocation } from "./components/search-card/SearchCardLocation";
|
||||
import { SearchCardNote } from "./components/search-card/SearchCardNote";
|
||||
import { SearchCardReceipt } from "./components/search-card/SearchCardReceipt";
|
||||
import { SearchCardWebsite } from "./components/search-card/SearchCardWebsite";
|
||||
import { sampleData } from "./network/sampleData";
|
||||
import type { DataItem } from "./network/types";
|
||||
import { UserImage, getUserImages } from "./network";
|
||||
import { getCardSize } from "./utils/getCardSize";
|
||||
|
||||
const getCardComponent = (item: DataItem) => {
|
||||
const getCardComponent = (item: UserImage) => {
|
||||
switch (item.type) {
|
||||
case "Location":
|
||||
case "location":
|
||||
return <SearchCardLocation item={item} />;
|
||||
case "Event":
|
||||
case "event":
|
||||
return <SearchCardEvent item={item} />;
|
||||
case "Contact":
|
||||
return <SearchCardContact item={item} />;
|
||||
case "Website":
|
||||
return <SearchCardWebsite item={item} />;
|
||||
case "Note":
|
||||
return <SearchCardNote item={item} />;
|
||||
case "Receipt":
|
||||
return <SearchCardReceipt item={item} />;
|
||||
// case "Contact":
|
||||
// return <SearchCardContact item={item} />;
|
||||
// case "Website":
|
||||
// return <SearchCardWebsite item={item} />;
|
||||
// case "Note":
|
||||
// return <SearchCardNote item={item} />;
|
||||
// case "Receipt":
|
||||
// return <SearchCardReceipt item={item} />;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
function App() {
|
||||
const [searchResults, setSearchResults] = createSignal<DataItem[]>([]);
|
||||
const [searchResults, setSearchResults] = createSignal<UserImage[]>([]);
|
||||
const [searchQuery, setSearchQuery] = createSignal("");
|
||||
const [selectedItem, setSelectedItem] = createSignal<DataItem | null>(null);
|
||||
const [selectedItem, setSelectedItem] = createSignal<UserImage | null>(
|
||||
null,
|
||||
);
|
||||
|
||||
const fuze = new Fuse<DataItem>(sampleData, {
|
||||
keys: [{ name: "title", weight: 2 }, "rawData"],
|
||||
const [data] = createResource(getUserImages);
|
||||
|
||||
let fuze = new Fuse<UserImage>(data() ?? [], {
|
||||
keys: [{ name: "title", weight: 2 }, "data"],
|
||||
threshold: 0.4,
|
||||
});
|
||||
|
||||
createEffect(() => {
|
||||
fuze = new Fuse<UserImage>(data() ?? [], {
|
||||
keys: [{ name: "data.Name", weight: 2 }],
|
||||
threshold: 0.4,
|
||||
});
|
||||
});
|
||||
|
||||
const onInputChange = (event: InputEvent) => {
|
||||
const query = (event.target as HTMLInputElement).value;
|
||||
setSearchQuery(query);
|
||||
@ -98,7 +104,7 @@ function App() {
|
||||
)}
|
||||
>
|
||||
<span class="sr-only">
|
||||
{item.title}
|
||||
{item.data.Name}
|
||||
</span>
|
||||
{getCardComponent(item)}
|
||||
</div>
|
||||
|
@ -1,10 +1,10 @@
|
||||
import { Separator } from "@kobalte/core/separator";
|
||||
|
||||
import { IconCalendar } from "@tabler/icons-solidjs";
|
||||
import type { Event } from "../../network/types";
|
||||
import type { UserImage } from "../../network";
|
||||
|
||||
type Props = {
|
||||
item: Event;
|
||||
item: Extract<UserImage, { type: "event" }>;
|
||||
};
|
||||
|
||||
export const SearchCardEvent = ({ item }: Props) => {
|
||||
@ -13,12 +13,12 @@ export const SearchCardEvent = ({ item }: Props) => {
|
||||
return (
|
||||
<div class="absolute inset-0 p-3 bg-purple-50">
|
||||
<div class="grid grid-cols-[auto_20px] gap-1 mb-1">
|
||||
<p class="text-sm text-neutral-900 font-bold">{data.title}</p>
|
||||
<p class="text-sm text-neutral-900 font-bold">{data.Name}</p>
|
||||
<IconCalendar size={20} class="text-neutral-500 mt-1" />
|
||||
</div>
|
||||
<p class="text-xs text-neutral-500">
|
||||
Organized by {data.organizer.name} on{" "}
|
||||
{new Date(data.dateTime.start).toLocaleDateString("en-US", {
|
||||
Organized by TODO on{" "}
|
||||
{new Date(data.StartDateTime).toLocaleDateString("en-US", {
|
||||
month: "long",
|
||||
day: "numeric",
|
||||
year: "numeric",
|
||||
@ -26,7 +26,7 @@ export const SearchCardEvent = ({ item }: Props) => {
|
||||
</p>
|
||||
<Separator class="my-2" />
|
||||
<p class="text-xs text-neutral-500 line-clamp-2 overflow-hidden">
|
||||
{data.description}
|
||||
{data.Description}
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
|
@ -1,10 +1,10 @@
|
||||
import { Separator } from "@kobalte/core/separator";
|
||||
|
||||
import { IconMapPin } from "@tabler/icons-solidjs";
|
||||
import type { Location } from "../../network/types";
|
||||
import type { UserImage } from "../../network";
|
||||
|
||||
type Props = {
|
||||
item: Location;
|
||||
item: Extract<UserImage, { type: "location" }>;
|
||||
};
|
||||
|
||||
export const SearchCardLocation = ({ item }: Props) => {
|
||||
@ -13,13 +13,13 @@ export const SearchCardLocation = ({ item }: Props) => {
|
||||
return (
|
||||
<div class="absolute inset-0 p-3 bg-red-50">
|
||||
<div class="grid grid-cols-[auto_20px] gap-1 mb-1">
|
||||
<p class="text-sm text-neutral-900 font-bold">{data.name}</p>
|
||||
<p class="text-sm text-neutral-900 font-bold">{data.Name}</p>
|
||||
<IconMapPin size={20} class="text-neutral-500 mt-1" />
|
||||
</div>
|
||||
<p class="text-xs text-neutral-500">{data.address}</p>
|
||||
<p class="text-xs text-neutral-500">{data.Address}</p>
|
||||
<Separator class="my-2" />
|
||||
<p class="text-xs text-neutral-500 line-clamp-2 overflow-hidden">
|
||||
{data.description}
|
||||
{data.Description}
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
|
@ -82,9 +82,9 @@ const eventDataType = object({
|
||||
const dataTypeValidator = variant("type", [locationDataType, eventDataType]);
|
||||
const getUserImagesResponseValidator = array(dataTypeValidator);
|
||||
|
||||
export const getUserImages = async (): Promise<
|
||||
InferOutput<typeof getUserImagesResponseValidator>
|
||||
> => {
|
||||
export type UserImage = InferOutput<typeof dataTypeValidator>;
|
||||
|
||||
export const getUserImages = async (): Promise<UserImage[]> => {
|
||||
const request = getBaseRequest({ path: "image" });
|
||||
|
||||
const res = await fetch(request).then((res) => res.json());
|
||||
|
Reference in New Issue
Block a user