mirror of
https://github.com/sakaljurgis/best-choice.git
synced 2026-07-08 21:47:40 +00:00
rename column, add missing
This commit is contained in:
@@ -0,0 +1,38 @@
|
|||||||
|
import { useState } from 'react';
|
||||||
|
|
||||||
|
interface ItemThumbnailProps {
|
||||||
|
url: string | null;
|
||||||
|
alt: string;
|
||||||
|
size?: 'sm' | 'md';
|
||||||
|
}
|
||||||
|
|
||||||
|
const sizeClassMap: Record<Required<ItemThumbnailProps>['size'], string> = {
|
||||||
|
sm: 'h-14 w-14',
|
||||||
|
md: 'h-20 w-20'
|
||||||
|
};
|
||||||
|
|
||||||
|
export function ItemThumbnail({ url, alt, size = 'sm' }: ItemThumbnailProps) {
|
||||||
|
const [hasError, setHasError] = useState(false);
|
||||||
|
const hasImage = !!url && !hasError;
|
||||||
|
const sizeClasses = sizeClassMap[size];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className={`flex-shrink-0 overflow-hidden rounded-md border border-slate-200 bg-slate-100 ${sizeClasses}`}
|
||||||
|
>
|
||||||
|
{hasImage ? (
|
||||||
|
<img
|
||||||
|
src={url ?? ''}
|
||||||
|
alt={alt}
|
||||||
|
className="h-full w-full object-cover"
|
||||||
|
loading="lazy"
|
||||||
|
onError={() => setHasError(true)}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<div className="flex h-full w-full items-center justify-center px-2 text-center text-[0.625rem] font-medium uppercase tracking-wide text-slate-400">
|
||||||
|
No Image
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -9,7 +9,7 @@ export const migration: Migration = {
|
|||||||
CREATE TABLE IF NOT EXISTS urls (
|
CREATE TABLE IF NOT EXISTS urls (
|
||||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
url TEXT NOT NULL UNIQUE,
|
url TEXT NOT NULL UNIQUE,
|
||||||
note TEXT,
|
body_text TEXT,
|
||||||
attributes JSONB NOT NULL DEFAULT '{}'::jsonb,
|
attributes JSONB NOT NULL DEFAULT '{}'::jsonb,
|
||||||
has_price BOOLEAN NOT NULL DEFAULT FALSE,
|
has_price BOOLEAN NOT NULL DEFAULT FALSE,
|
||||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { query } from './pool.js';
|
|||||||
export interface UrlRow {
|
export interface UrlRow {
|
||||||
id: string;
|
id: string;
|
||||||
url: string;
|
url: string;
|
||||||
note: string | null;
|
body_text: string | null;
|
||||||
attributes: unknown;
|
attributes: unknown;
|
||||||
has_price: boolean;
|
has_price: boolean;
|
||||||
created_at: Date;
|
created_at: Date;
|
||||||
@@ -13,7 +13,7 @@ export interface UrlRow {
|
|||||||
export interface UrlRecord {
|
export interface UrlRecord {
|
||||||
id: string;
|
id: string;
|
||||||
url: string;
|
url: string;
|
||||||
note: string | null;
|
bodyText: string | null;
|
||||||
attributes: unknown;
|
attributes: unknown;
|
||||||
hasPrice: boolean;
|
hasPrice: boolean;
|
||||||
createdAt: string;
|
createdAt: string;
|
||||||
@@ -23,7 +23,7 @@ export interface UrlRecord {
|
|||||||
const mapUrlRow = (row: UrlRow): UrlRecord => ({
|
const mapUrlRow = (row: UrlRow): UrlRecord => ({
|
||||||
id: row.id,
|
id: row.id,
|
||||||
url: row.url,
|
url: row.url,
|
||||||
note: row.note,
|
bodyText: row.body_text,
|
||||||
attributes: row.attributes ?? {},
|
attributes: row.attributes ?? {},
|
||||||
hasPrice: row.has_price,
|
hasPrice: row.has_price,
|
||||||
createdAt: row.created_at.toISOString(),
|
createdAt: row.created_at.toISOString(),
|
||||||
@@ -33,7 +33,7 @@ const mapUrlRow = (row: UrlRow): UrlRecord => ({
|
|||||||
export const findUrlById = async (id: string): Promise<UrlRecord | null> => {
|
export const findUrlById = async (id: string): Promise<UrlRecord | null> => {
|
||||||
const result = await query<UrlRow>(
|
const result = await query<UrlRow>(
|
||||||
`
|
`
|
||||||
SELECT id, url, note, attributes, has_price, created_at, updated_at
|
SELECT id, url, body_text, attributes, has_price, created_at, updated_at
|
||||||
FROM urls
|
FROM urls
|
||||||
WHERE id = $1
|
WHERE id = $1
|
||||||
`,
|
`,
|
||||||
@@ -50,7 +50,7 @@ export const findUrlById = async (id: string): Promise<UrlRecord | null> => {
|
|||||||
export const findUrlByValue = async (url: string): Promise<UrlRecord | null> => {
|
export const findUrlByValue = async (url: string): Promise<UrlRecord | null> => {
|
||||||
const result = await query<UrlRow>(
|
const result = await query<UrlRow>(
|
||||||
`
|
`
|
||||||
SELECT id, url, note, attributes, has_price, created_at, updated_at
|
SELECT id, url, body_text, attributes, has_price, created_at, updated_at
|
||||||
FROM urls
|
FROM urls
|
||||||
WHERE url = $1
|
WHERE url = $1
|
||||||
`,
|
`,
|
||||||
@@ -66,7 +66,7 @@ export const findUrlByValue = async (url: string): Promise<UrlRecord | null> =>
|
|||||||
|
|
||||||
export interface CreateUrlParams {
|
export interface CreateUrlParams {
|
||||||
url: string;
|
url: string;
|
||||||
note?: string | null;
|
bodyText?: string | null;
|
||||||
attributes?: unknown;
|
attributes?: unknown;
|
||||||
hasPrice?: boolean;
|
hasPrice?: boolean;
|
||||||
}
|
}
|
||||||
@@ -74,15 +74,15 @@ export interface CreateUrlParams {
|
|||||||
export const createUrl = async (params: CreateUrlParams): Promise<UrlRecord> => {
|
export const createUrl = async (params: CreateUrlParams): Promise<UrlRecord> => {
|
||||||
const result = await query<UrlRow>(
|
const result = await query<UrlRow>(
|
||||||
`
|
`
|
||||||
INSERT INTO urls (url, note, attributes, has_price)
|
INSERT INTO urls (url, body_text, attributes, has_price)
|
||||||
VALUES ($1, $2, $3, $4)
|
VALUES ($1, $2, $3, $4)
|
||||||
ON CONFLICT (url) DO UPDATE
|
ON CONFLICT (url) DO UPDATE
|
||||||
SET updated_at = NOW()
|
SET updated_at = NOW()
|
||||||
RETURNING id, url, note, attributes, has_price, created_at, updated_at
|
RETURNING id, url, body_text, attributes, has_price, created_at, updated_at
|
||||||
`,
|
`,
|
||||||
[
|
[
|
||||||
params.url,
|
params.url,
|
||||||
params.note ?? null,
|
params.bodyText ?? null,
|
||||||
params.attributes ?? {},
|
params.attributes ?? {},
|
||||||
params.hasPrice ?? false
|
params.hasPrice ?? false
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user