From 8a227b48de740a93fe3f6b05a5a625372dbb08fe Mon Sep 17 00:00:00 2001 From: Sam Becker Date: Thu, 9 Nov 2023 18:55:12 -0600 Subject: [PATCH] Optimize sidebar sort order --- src/camera/index.ts | 17 ++++++++++++++--- src/camera/meta.ts | 2 +- src/photo/PhotoGridSidebar.tsx | 20 +++++++++++--------- src/services/postgres.ts | 8 ++++---- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/src/camera/index.ts b/src/camera/index.ts index 4303a130..e59b1232 100644 --- a/src/camera/index.ts +++ b/src/camera/index.ts @@ -8,11 +8,13 @@ export type Camera = { model: string }; -export type Cameras = { +export type CameraWithCount = { cameraKey: string camera: Camera count: number -}[]; +} + +export type Cameras = CameraWithCount[]; export const createCameraKey = ({ make, model }: Camera) => parameterize(`${make}-${model}`); @@ -23,6 +25,15 @@ export const getCameraFromKey = (cameraKey: string): Camera => { return { make, model }; }; +export const sortCamerasWithCount = ( + a: CameraWithCount, + b: CameraWithCount, +) => { + const aText = formatCameraText(a.camera); + const bText = formatCameraText(b.camera); + return aText.localeCompare(bText); +}; + export const cameraFromPhoto = ( photo: Photo | undefined, fallback?: Camera | string, @@ -35,7 +46,7 @@ export const cameraFromPhoto = ( export const formatCameraText = ( { make, model }: Camera, - includeMakeApple = true, + includeMakeApple?: boolean, ) => make === 'Apple' && !includeMakeApple ? model diff --git a/src/camera/meta.ts b/src/camera/meta.ts index 93d18b24..35c0c2ca 100644 --- a/src/camera/meta.ts +++ b/src/camera/meta.ts @@ -20,7 +20,7 @@ export const titleForCamera = ( explicitCount?: number, ) => [ 'Shot on', - formatCameraText(cameraFromPhoto(photos[0], camera), false), + formatCameraText(cameraFromPhoto(photos[0], camera)), photoQuantityText(explicitCount ?? photos.length), ].join(' '); diff --git a/src/photo/PhotoGridSidebar.tsx b/src/photo/PhotoGridSidebar.tsx index 7b6c5d21..47cb639f 100644 --- a/src/photo/PhotoGridSidebar.tsx +++ b/src/photo/PhotoGridSidebar.tsx @@ -1,4 +1,4 @@ -import { Cameras } from '@/camera'; +import { Cameras, sortCamerasWithCount } from '@/camera'; import PhotoCamera from '@/camera/PhotoCamera'; import HeaderList from '@/components/HeaderList'; import PhotoTag from '@/tag/PhotoTag'; @@ -42,14 +42,16 @@ export default function PhotoGridSidebar({ size={13} className="text-icon translate-y-[-0.25px]" />} - items={cameras.map(({ cameraKey, camera, count }) => - )} + items={cameras + .sort(sortCamerasWithCount) + .map(({ cameraKey, camera, count }) => + )} />} {simulations.length > 0 && sql` FROM photos WHERE hidden IS NOT TRUE GROUP BY tag - ORDER BY count DESC + ORDER BY tag ASC `.then(({ rows }): Tags => rows.map(({ tag, count }) => ({ tag: tag as string, count: parseInt(count, 10), @@ -328,7 +328,7 @@ const sqlGetUniqueTagsHidden = async () => sql` SELECT DISTINCT unnest(tags) as tag, COUNT(*) FROM photos GROUP BY tag - ORDER BY count DESC + ORDER BY tag ASC `.then(({ rows }): Tags => rows.map(({ tag, count }) => ({ tag: tag as string, count: parseInt(count, 10), @@ -339,7 +339,7 @@ const sqlGetUniqueCameras = async () => sql` FROM photos WHERE hidden IS NOT TRUE GROUP BY make, model - ORDER BY camera DESC + ORDER BY camera ASC `.then(({ rows }): Cameras => rows.map(({ make, model, count }) => ({ cameraKey: createCameraKey({ make, model }), camera: { make, model }, @@ -351,7 +351,7 @@ const sqlGetUniqueFilmSimulations = async () => sql` FROM photos WHERE hidden IS NOT TRUE AND film_simulation IS NOT NULL GROUP BY film_simulation - ORDER BY film_simulation DESC + ORDER BY film_simulation ASC `.then(({ rows }): FilmSimulations => rows .map(({ film_simulation, count }) => ({ simulation: film_simulation as FilmSimulation,