From 87a2a0f214c203a39fd53e8d5ec6e6eacfc05a13 Mon Sep 17 00:00:00 2001 From: "smx.pusha" <139338836+smxpusha@users.noreply.github.com> Date: Thu, 6 Aug 2026 12:46:16 +0200 Subject: [PATCH] ENH - seed browser demo data --- frontend/src/App.vue | 26 ++++++- frontend/testserver/index.cjs | 124 +++++++++++++++++++++++++++++++--- 2 files changed, 138 insertions(+), 12 deletions(-) diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 1a822ee..1455bad 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -275,7 +275,19 @@ onMounted(() => { }, 1000) if (isDevelopment) { hydratePhone({ - account: null, + account: { + devices: [ + { + created_at: '2026-08-04 12:00:00', + current: true, + device_name: 'iFruit Phone', + imei: '356938035643809', + updated_at: '2026-08-06 12:00:00', + }, + ], + email: 'demo@ifruit.com', + id: 1, + }, device: { data: {}, imei: '356938035643809', @@ -287,7 +299,17 @@ onMounted(() => { type: 'registered', }, }, - notes: [], + notes: [ + { + body: 'Meet Morgan in Vinewood and inspect the Sultan RS.', + createdAt: Date.now() - 3_600_000, + id: 'demo-note-marketplace', + pinned: true, + revision: 1, + title: 'CityMarkt viewing', + updatedAt: Date.now() - 3_600_000, + }, + ], token: 'development', }) if (new URLSearchParams(window.location.search).has('simPickerPreview')) { diff --git a/frontend/testserver/index.cjs b/frontend/testserver/index.cjs index 0407a42..f6b5ed0 100644 --- a/frontend/testserver/index.cjs +++ b/frontend/testserver/index.cjs @@ -7,11 +7,8 @@ const port = Number(process.argv[2]) || 3001 app.use(cors()) app.use(express.json()) -let authenticated = false +let authenticated = true let draft = null -let linkedAccount = null -let mockNotes = [] -const deviceData = {} const accountDevices = [ { created_at: '2026-08-04 12:00:00', @@ -106,9 +103,112 @@ const marketplaceListings = [ image: 'linear-gradient(160deg, #67d5b5, #26648e 55%, #0b132b)', is_favorite: false, images: [{ media_id: 'ocean-air', gradient: 'linear-gradient(160deg, #67d5b5, #26648e 55%, #0b132b)', sort_order: 1 }], }, + { + id: '81bc9d37-20e1-4d8a-82f8-f4b85f77cf04', seller_account_id: 1, seller_name: 'demo', + seller_since: '2026-08-04 12:00:00', seller_active: 1, title: 'Complete mechanic tool set', + description: 'Complete mechanic tool set with trolley, sockets and diagnostic equipment. Everything is clean and ready for work.', + category: 'tools', item_condition: 'very_good', price_type: 'fixed', price: 7800, + district: 'south_los_santos', status: 'active', revision: 1, show_phone: 1, phone_number: '5551234567', + created_at: '2026-08-06 10:45:00', updated_at: '2026-08-06 10:45:00', expires_at: '2026-08-13 10:45:00', + image: 'linear-gradient(135deg, #ffc75f, #f96d80 48%, #4b4453)', is_favorite: false, + images: [{ media_id: 'capture-tools', gradient: 'linear-gradient(135deg, #ffc75f, #f96d80 48%, #4b4453)', sort_order: 1 }], + }, +] +let linkedAccount = { + devices: accountDevices, + email: 'demo@ifruit.com', + id: 1, +} +let mockNotes = [ + { + body: 'Meet Morgan in Vinewood and inspect the Sultan RS.', + createdAt: Date.now() - 3_600_000, + id: 'demo-note-marketplace', + pinned: true, + revision: 1, + title: 'CityMarkt viewing', + updatedAt: Date.now() - 3_600_000, + }, +] +const deviceData = {} +const marketplaceInquiries = [ + { + id: '4903b923-409a-437e-971f-b7a2b10e9e31', + listing_id: '81bc9d37-20e1-4d8a-82f8-f4b85f77cf01', + seller_account_id: 2, + buyer_account_id: 1, + seller_name: 'morgan', + buyer_name: 'demo', + title: 'Sultan RS in excellent condition', + price: 185000, + price_type: 'negotiable', + status: 'active', + image: 'linear-gradient(145deg, #ff6b6b, #845ec2 52%, #0f2027)', + other_name: 'morgan', + last_message: 'Sure, come by the Vinewood garage around 8 PM.', + unread: 1, + updated_at: '2026-08-06 11:42:00', + }, + { + id: '4903b923-409a-437e-971f-b7a2b10e9e32', + listing_id: '81bc9d37-20e1-4d8a-82f8-f4b85f77cf04', + seller_account_id: 1, + buyer_account_id: 3, + seller_name: 'demo', + buyer_name: 'jamie', + title: 'Complete mechanic tool set', + price: 7800, + price_type: 'fixed', + status: 'active', + image: 'linear-gradient(135deg, #ffc75f, #f96d80 48%, #4b4453)', + other_name: 'jamie', + last_message: 'I can collect it today and pay the full price.', + unread: 2, + updated_at: '2026-08-06 11:55:00', + }, +] +const marketplaceMessages = [ + { + id: 1, + inquiry_id: '4903b923-409a-437e-971f-b7a2b10e9e31', + sender_account_id: 1, + body: 'Hi, is the Sultan still available?', + created_at: '2026-08-06 11:35:00', + read_at: '2026-08-06 11:36:00', + }, + { + id: 2, + inquiry_id: '4903b923-409a-437e-971f-b7a2b10e9e31', + sender_account_id: 2, + body: 'Yes, it is. You can also take it for a short test drive.', + created_at: '2026-08-06 11:38:00', + read_at: '2026-08-06 11:39:00', + }, + { + id: 3, + inquiry_id: '4903b923-409a-437e-971f-b7a2b10e9e31', + sender_account_id: 2, + body: 'Sure, come by the Vinewood garage around 8 PM.', + created_at: '2026-08-06 11:42:00', + read_at: null, + }, + { + id: 4, + inquiry_id: '4903b923-409a-437e-971f-b7a2b10e9e32', + sender_account_id: 3, + body: 'Hello, does the diagnostic equipment work with every vehicle?', + created_at: '2026-08-06 11:51:00', + read_at: null, + }, + { + id: 5, + inquiry_id: '4903b923-409a-437e-971f-b7a2b10e9e32', + sender_account_id: 3, + body: 'I can collect it today and pay the full price.', + created_at: '2026-08-06 11:55:00', + read_at: null, + }, ] -const marketplaceInquiries = [] -const marketplaceMessages = [] function counts() { return { @@ -155,6 +255,7 @@ app.post('/api/:endpoint', (request, response) => { email: request.body.email.includes('@') ? request.body.email : `${request.body.email}@ifruit.com`, + id: 1, } response.json({ success: true, data: linkedAccount }) return @@ -211,7 +312,7 @@ app.post('/api/:endpoint', (request, response) => { return } if (endpoint === 'marketplace:counts') { - response.json({ success: true, data: { active: marketplaceListings.filter((item) => item.seller_account_id === 1 && ['active', 'reserved'].includes(item.status)).length, unread: 0 } }) + response.json({ success: true, data: { active: marketplaceListings.filter((item) => item.seller_account_id === 1 && ['active', 'reserved'].includes(item.status)).length, unread: marketplaceInquiries.reduce((total, item) => total + item.unread, 0) } }) return } if (endpoint === 'marketplace:list-own') { @@ -272,15 +373,17 @@ app.post('/api/:endpoint', (request, response) => { inquiry = { id: '4903b923-409a-437e-971f-b7a2b10e9e31', listing_id: listing.id, seller_account_id: listing.seller_account_id, buyer_account_id: 1, title: listing.title, price: listing.price, price_type: listing.price_type, status: listing.status, image: listing.image, other_name: listing.seller_name, last_message: request.body.body, unread: 0, updated_at: '2026-08-06 11:30:00' } marketplaceInquiries.push(inquiry) } - marketplaceMessages.push({ id: marketplaceMessages.length + 1, sender_account_id: 1, body: request.body.body, created_at: '2026-08-06 11:30:00', read_at: null }) + marketplaceMessages.push({ id: marketplaceMessages.length + 1, inquiry_id: inquiry.id, sender_account_id: 1, body: request.body.body, created_at: '2026-08-06 12:00:00', read_at: null }) inquiry.last_message = request.body.body + inquiry.unread = 0 + inquiry.updated_at = '2026-08-06 12:00:00' response.json({ success: true, data: { id: inquiry.id } }) return } if (endpoint === 'marketplace:get-inquiry') { const inquiry = marketplaceInquiries.find((item) => item.id === request.body.id) - const listing = inquiry && marketplaceListings.find((item) => item.id === inquiry.listing_id) - response.json(inquiry ? { success: true, data: { accountId: 1, inquiry: { ...inquiry, seller_name: listing.seller_name, buyer_name: 'demo', reserved_account_id: null }, messages: marketplaceMessages } } : { success: false, error: 'inquiry_not_found' }) + if (inquiry) inquiry.unread = 0 + response.json(inquiry ? { success: true, data: { accountId: 1, inquiry: { ...inquiry, reserved_account_id: null }, messages: marketplaceMessages.filter((message) => message.inquiry_id === inquiry.id) } } : { success: false, error: 'inquiry_not_found' }) return } if (endpoint === 'marketplace:report' || endpoint === 'marketplace:block') { @@ -326,6 +429,7 @@ app.post('/api/:endpoint', (request, response) => { linkedAccount = { devices: accountDevices, email: 'demo@ifruit.com', + id: 1, } response.json({ success: true, data: linkedAccount }) return