diff --git a/src/lib/store-catalog.ts b/src/lib/store-catalog.ts new file mode 100644 index 0000000..56faea6 --- /dev/null +++ b/src/lib/store-catalog.ts @@ -0,0 +1,87 @@ +// Storefront catalog for the dashboard upsell modal. +// +// SKUs and prices DUPLICATE payment-router/products.yaml (and the landing +// pages) — the server always charges the catalog price by SKU, so a stale +// price here is a display bug, not a money bug. When a price changes: +// products.yaml → landing → this file. + +export interface StoreTariff { + sku: string; // must match payment-router/products.yaml + label: string; + priceRub: number; // display only; the charge is resolved server-side + includes?: string; // short "what's inside" caption under the label +} + +export interface StoreCatalogEntry { + landingUrl: string; + tariffs: StoreTariff[]; +} + +export const PAY_ORDER_URL = "https://obsidian.second-brain.ru/pay/order"; +export const PAY_METHODS_URL = "https://obsidian.second-brain.ru/pay/methods"; + +// Keys = course slugs shown as locked cards on the student dashboard. +// Only tariffs of the course's "native" landing are listed — cross-bundles +// from other landings would confuse the choice. +export const STORE_CATALOG: Record = { + "second-brain-vault": { + landingUrl: "https://second-brain.ru/sb-vault", + tariffs: [{ sku: "sb-vault", label: "Second Brain Vault", priceRub: 2990 }], + }, + "claude-obsidian": { + landingUrl: "https://second-brain.ru/claude-obsidian", + tariffs: [{ sku: "claude-obsidian", label: "Claude + Obsidian", priceRub: 4990 }], + }, + "obsidian-full": { + landingUrl: "https://obsidian.second-brain.ru/", + tariffs: [ + { + sku: "obsidian-pro", + label: "Obsidian + AI", + priceRub: 14990, + includes: "Включает курс «Obsidian + AI» и Second Brain Vault", + }, + { + sku: "obsidian-architect", + label: "Архитектор знаний", + priceRub: 17990, + includes: "Плюс курс «Zotero. Всё включено»", + }, + ], + }, + "zotero-full": { + landingUrl: "https://zotero.second-brain.ru/", + tariffs: [ + { + sku: "zotero-analyst", + label: "Аналитик", + priceRub: 10990, + includes: "Включает курс «Obsidian. Всё включено»", + }, + { + sku: "zotero-max", + label: "Второй мозг на максималках", + priceRub: 17990, + includes: "Плюс курс «Obsidian + AI» и Second Brain Vault", + }, + ], + }, + "obsidian-ai": { + landingUrl: "https://obsidianai.second-brain.ru/", + tariffs: [ + { sku: "obsidianai-base", label: "База", priceRub: 6990 }, + { + sku: "obsidianai-expert", + label: "AI Эксперт", + priceRub: 14990, + includes: "Включает курс «Obsidian. Всё включено» и Second Brain Vault", + }, + { + sku: "obsidianai-researcher", + label: "AI Исследователь", + priceRub: 17990, + includes: "Плюс курс «Zotero. Всё включено»", + }, + ], + }, +};