fbla26/src/routes/items/+page.svelte
2026-02-07 00:45:35 -06:00

140 lines
4.6 KiB
Svelte

<script lang="ts">
import { Button, buttonVariants } from '$lib/components/ui/button';
import * as Dialog from '$lib/components/ui/dialog';
import * as Field from '$lib/components/ui/field';
import { Input } from '$lib/components/ui/input';
import ImageUpload from '$lib/components/custom/image-upload/image-upload.svelte';
import type { PageProps } from '$types';
import { EMAIL_REGEX_STRING } from '$lib/consts';
import { genDescription } from '$lib/db/items.remote';
import * as RadioGroup from '$lib/components/ui/radio-group';
import { Label } from '$lib/components/ui/label';
import ItemListing from '$lib/components/custom/item-listing.svelte';
import { FieldSeparator } from '$lib/components/ui/field';
import SubmitItemDialog from '$lib/components/custom/submit-item-dialog.svelte';
import EditItemDialog from '$lib/components/custom/edit-item-dialog.svelte';
import InquireItemDialog from '$lib/components/custom/inquire-item-dialog.svelte';
import ClaimItemDialog from '$lib/components/custom/claim-item-dialog.svelte';
import { PlusIcon } from '@lucide/svelte';
import type { Item } from '$lib/types/item';
// import { type Item } from '$lib/types/item';
let createDialogOpen: boolean = $state(false);
function openCreateDialog() {
createDialogOpen = true;
}
let editDialogOpen: boolean = $state(false);
let editItem: Item | undefined = $state(undefined);
function openEditDialog(item: Item | undefined) {
editItem = item;
editDialogOpen = true;
}
let inquireDialogOpen: boolean = $state(false);
let inquireItem: Item | undefined = $state(undefined);
function openInquireDialog(item: Item | undefined) {
inquireItem = item;
inquireDialogOpen = true;
}
let claimDialogOpen: boolean = $state(false);
let claimItem: Item | undefined = $state(undefined);
function openClaimDialog(item: Item | undefined) {
claimItem = item;
claimDialogOpen = true;
}
let { data }: PageProps = $props();
</script>
<div class="max-w-7xl mx-auto px-4">
<div class="justify-between flex mb-4">
<form action="" class="w-full">
<Field.Field orientation="horizontal" class="w-full max-w-md">
<Input type="search" name="search" id="search" placeholder="Search..." />
<Button variant="default" type="submit">Search</Button>
</Field.Field>
</form>
<!-- <h1 class="text-3xl mb-2 mt-2">Found Items</h1>-->
<div class="hidden md:inline-block">
<Button variant="default" class="" onclick={openCreateDialog}>
Submit a found item
</Button>
</div>
</div>
{#if data.items.length === 0}
<h1 class="text-xl text-center font-semibold mt-16">No items found!</h1>
<p class="text-center">Try broadening your search terms to get more results.</p>
{:else}
<div class="grid gap-4 grid-cols-[repeat(auto-fill,minmax(18rem,max-content))] justify-center">
{#if data.user && data.items.some(
(item) => item.approvedDate === null
)}
<FieldSeparator class="col-span-full text-lg h-8 my-2">
Pending items
</FieldSeparator>
{#each data.items as item (item.id)}
{#if item.approvedDate === null}
<ItemListing item={item} admin={data.user !== null} editCallback={openEditDialog}
inquireCallback={openInquireDialog} claimCallback={openClaimDialog} />
{/if}
{/each}
{/if}
{#if data.user && data.items.some(
(item) => item.approvedDate !== null && item.claimedDate === null
)}
<FieldSeparator class="col-span-full text-lg my-2 h-8 w-full">
Public items
</FieldSeparator>
{/if}
{#each data.items as item (item.id)}
{#if item.approvedDate !== null && item.claimedDate === null}
<ItemListing item={item} admin={data.user !== null} editCallback={openEditDialog}
inquireCallback={openInquireDialog} claimCallback={openClaimDialog} />
{/if}
{/each}
{#if data.user && data.items.some(
(item) => item.claimedDate !== null
)}
<FieldSeparator class="col-span-full text-lg my-2 h-8 w-full">
Claimed items
</FieldSeparator>
{#each data.items as item (item.id)}
{#if item.claimedDate !== null}
<ItemListing item={item} admin={data.user !== null} editCallback={openEditDialog}
inquireCallback={openInquireDialog} claimCallback={openClaimDialog} />
{/if}
{/each}
{/if}
</div>
{/if}
</div>
<Button class="fixed shadow-lg bottom-6 right-6 rounded-xl md:hidden p-6 text-xl" size="default"
onclick={openCreateDialog}>
<PlusIcon size={32} />
New item
</Button>
<SubmitItemDialog bind:open={createDialogOpen} />
<EditItemDialog bind:open={editDialogOpen} item={editItem} />
<InquireItemDialog bind:open={inquireDialogOpen} item={inquireItem} />
<ClaimItemDialog bind:open={claimDialogOpen} item={claimItem} />