Tasks: TickTick history sync (export + idempotent import, start_at/time_zone); trackers ordered tasks, money, books with single-noun names
All checks were successful
Deploy production / deploy (push) Successful in 2m33s
All checks were successful
Deploy production / deploy (push) Successful in 2m33s
This commit is contained in:
@@ -32,76 +32,96 @@ export const projects = [
|
||||
}
|
||||
] as const;
|
||||
|
||||
// Trackers keep their existing /projects/... URLs (no moves, so no redirects needed).
|
||||
export const trackers = [
|
||||
// Trackers, in display order. Names are short single nouns. Most keep their existing
|
||||
// /projects/... URLs (no moves, so no redirects needed). `private` trackers are shown in the
|
||||
// header, home page and /trackers only to the logged-in owner (layout data `isOwner`), never
|
||||
// in the sitemap; their routes 404 for everyone else.
|
||||
const allTrackers = [
|
||||
{
|
||||
name: 'game tracker',
|
||||
subtitle: 'every pokemon in every game, and call of duty camo mastery',
|
||||
href: '/projects/game-tracker',
|
||||
external: false
|
||||
name: 'tasks',
|
||||
subtitle: 'private: to-dos, goals and my TickTick history',
|
||||
href: '/trackers/tasks',
|
||||
external: false,
|
||||
private: true
|
||||
},
|
||||
{
|
||||
name: 'money',
|
||||
subtitle: 'a manual ledger for accounts, bills and utilities',
|
||||
href: '/trackers/money',
|
||||
external: false
|
||||
},
|
||||
{
|
||||
name: 'house tracker',
|
||||
subtitle: 'Dutch rental and sale listings, with alerts',
|
||||
href: '/projects/house-tracker',
|
||||
external: false
|
||||
},
|
||||
{
|
||||
name: 'cs prices',
|
||||
subtitle: 'Counter-Strike market prices across time',
|
||||
href: '/projects/cs-prices',
|
||||
external: false
|
||||
},
|
||||
{
|
||||
name: 'energy',
|
||||
subtitle: 'Dutch electricity mix, utilization and gas storage',
|
||||
href: '/projects/energy',
|
||||
external: false
|
||||
},
|
||||
{
|
||||
name: 'animaldex',
|
||||
subtitle: 'add neighborhood pets to the world map',
|
||||
href: '/projects/animaldex',
|
||||
external: false
|
||||
external: false,
|
||||
private: false
|
||||
},
|
||||
{
|
||||
name: 'books',
|
||||
subtitle: 'my library: what I am reading, have read and want to read',
|
||||
href: '/trackers/books',
|
||||
external: false
|
||||
external: false,
|
||||
private: false
|
||||
},
|
||||
{
|
||||
name: 'health',
|
||||
subtitle: 'private: body, workouts, sleep, meds and vaccinations',
|
||||
href: '/trackers/health',
|
||||
external: false,
|
||||
private: true
|
||||
},
|
||||
{
|
||||
name: 'energy',
|
||||
subtitle: 'Dutch electricity mix, utilization and gas storage',
|
||||
href: '/projects/energy',
|
||||
external: false,
|
||||
private: false
|
||||
},
|
||||
{
|
||||
name: 'games',
|
||||
subtitle: 'every pokemon in every game, and call of duty camo mastery',
|
||||
href: '/projects/game-tracker',
|
||||
external: false,
|
||||
private: false
|
||||
},
|
||||
{
|
||||
name: 'houses',
|
||||
subtitle: 'Dutch rental and sale listings, with alerts',
|
||||
href: '/projects/house-tracker',
|
||||
external: false,
|
||||
private: false
|
||||
},
|
||||
{
|
||||
name: 'skins',
|
||||
subtitle: 'Counter-Strike skin market prices across time',
|
||||
href: '/projects/cs-prices',
|
||||
external: false,
|
||||
private: false
|
||||
},
|
||||
{
|
||||
name: 'pets',
|
||||
subtitle: 'animaldex: add neighborhood pets to the world map',
|
||||
href: '/projects/animaldex',
|
||||
external: false,
|
||||
private: false
|
||||
},
|
||||
{
|
||||
name: 'lists',
|
||||
subtitle: 'books, games, places and other things worth keeping',
|
||||
href: '/lists',
|
||||
external: false
|
||||
}
|
||||
] as const;
|
||||
|
||||
// Owner-only trackers: shown in the header, home page and /trackers only to the logged-in
|
||||
// owner (layout data `isOwner`), never in the sitemap. Their routes 404 for everyone else.
|
||||
export const privateTrackers = [
|
||||
{
|
||||
name: 'health',
|
||||
subtitle: 'private: body, workouts, sleep, meds and vaccinations',
|
||||
href: '/trackers/health',
|
||||
external: false
|
||||
},
|
||||
{
|
||||
name: 'tasks',
|
||||
subtitle: 'private: to-dos and long-term goals',
|
||||
href: '/trackers/tasks',
|
||||
external: false
|
||||
external: false,
|
||||
private: false
|
||||
}
|
||||
] as const;
|
||||
|
||||
type Tracker = { name: string; subtitle: string; href: string; external: boolean };
|
||||
const strip = ({ name, subtitle, href, external }: Tracker): Tracker => ({
|
||||
name,
|
||||
subtitle,
|
||||
href,
|
||||
external
|
||||
});
|
||||
/** Public trackers (sitemap, logged-out navigation). */
|
||||
export const trackers: readonly Tracker[] = allTrackers.filter((t) => !t.private).map(strip);
|
||||
/** Owner-only trackers. */
|
||||
export const privateTrackers: readonly Tracker[] = allTrackers.filter((t) => t.private).map(strip);
|
||||
const ownerTrackers: readonly Tracker[] = allTrackers.map(strip);
|
||||
|
||||
export function visibleTrackers(isOwner: boolean): readonly Tracker[] {
|
||||
return isOwner ? [...trackers, ...privateTrackers] : trackers;
|
||||
return isOwner ? ownerTrackers : trackers;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user