From 4b65d17accdaa38f70aa1837f74745b4f8460707 Mon Sep 17 00:00:00 2001 From: Dominik Date: Fri, 21 Aug 2026 19:35:54 +0200 Subject: [PATCH] feat(skypic): refine layouts and streaks --- .../src/assets/img/app-previews/skypic.jpg | Bin 66357 -> 39043 bytes frontend/src/skypic.backend.contract.test.ts | 71 + frontend/src/stores/skypic.test.ts | 286 +++ frontend/src/stores/skypic.ts | 81 +- frontend/src/types/skypic.ts | 4 + .../src/views/apps/SkyPicApp.contract.test.ts | 50 +- frontend/src/views/apps/SkyPicApp.vue | 1713 ++++++++++++----- frontend/testserver/index.cjs | 97 + frontend/testserver/smoke.cjs | 102 + sky_phone/source/server/skypic.lua | 22 +- 10 files changed, 1961 insertions(+), 465 deletions(-) diff --git a/frontend/src/assets/img/app-previews/skypic.jpg b/frontend/src/assets/img/app-previews/skypic.jpg index c50ef7ee804eb494c335ad2fc51c8f8982c530b7..f7ee46b473c8936527d8ad3942317c6479f9e2fe 100644 GIT binary patch literal 39043 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 D16uSN literal 66357 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 diff --git a/frontend/src/skypic.backend.contract.test.ts b/frontend/src/skypic.backend.contract.test.ts index 893f097..21cc2ac 100644 --- a/frontend/src/skypic.backend.contract.test.ts +++ b/frontend/src/skypic.backend.contract.test.ts @@ -243,6 +243,77 @@ describe('SkyPic backend contracts', () => { expect(mockServer).toContain('mediaItems.length * recipients.length > 40') }) + it('maintains reciprocal UTC-day streaks and returns reconciled values', () => { + const friendshipMigration = migrationTable('friendships') + const friendshipInstall = installTable('friendships') + const friends = block( + server, + 'local function list_friends', + 'local function list_requests', + ) + const conversations = block( + server, + 'local function list_conversations', + 'Bridge.Callbacks.Register("sky_phone:skypic:bootstrap"', + ) + const metadata = block( + server, + 'local function load_snap_metadata', + 'local function opened_snap_from_row', + ) + const sendSnap = block( + server, + 'Bridge.Callbacks.Register("sky_phone:skypic:send-snap"', + 'Bridge.Callbacks.Register("sky_phone:skypic:open-snap"', + ) + + for (const schema of [friendshipMigration, friendshipInstall]) { + expect(schema).toContain('profile_a_last_snap_on') + expect(schema).toContain('profile_b_last_snap_on') + expect(schema).toContain('streak_updated_on') + expect(schema).toContain('streak_count') + expect(schema).toContain('best_streak') + expect(schema).toContain('idx_sky_phone_skypic_streaks') + } + + expect(sendSnap).toContain('SET %s = UTC_DATE()') + expect(sendSnap).toContain( + 'SELECT 1 FROM `sky_phone_skypic_messages` message WHERE message.`id` = ?', + ) + expect(sendSnap).toContain('friendship.profile_a_id == profile.profile_id') + expect(sendSnap).toContain('`profile_a_last_snap_on` = UTC_DATE()') + expect(sendSnap).toContain('`profile_b_last_snap_on` = UTC_DATE()') + expect(sendSnap).toContain( + '`streak_updated_on` = DATE_SUB(UTC_DATE(), INTERVAL 1 DAY)', + ) + expect(sendSnap).toContain( + '`streak_updated_on` IS NULL OR `streak_updated_on` < UTC_DATE()', + ) + expect(sendSnap).toContain('Bridge.Database.Transaction(statements)') + + for (const serializer of [friends, conversations, metadata]) { + expect(serializer).toContain( + '`streak_updated_on` < DATE_SUB(UTC_DATE(), INTERVAL 1 DAY)', + ) + expect(serializer).toContain( + 'THEN 0 ELSE friendship.`streak_count` END AS `streak_count`', + ) + expect(serializer).toContain('friendship.`best_streak`') + } + expect(metadata).toContain("friendship.`status` = 'accepted'") + expect(metadata).toContain( + 'snap.streakCount = tonumber(row.streak_count) or 0', + ) + expect(metadata).toContain( + 'snap.bestStreak = tonumber(row.best_streak) or 0', + ) + + expect(server).toContain('SET `streak_count` = 0') + expect(server).toContain( + "WHERE `status` = 'accepted' AND `streak_count` > 0", + ) + }) + it('keeps browser payload limits and profile creation aligned with production', () => { expect(config).toContain('CaptionMaxLength = 160') expect(server).toContain('valid_integer(data.avatarSeed, 1, 2147483647)') diff --git a/frontend/src/stores/skypic.test.ts b/frontend/src/stores/skypic.test.ts index 9da59d7..02c9143 100644 --- a/frontend/src/stores/skypic.test.ts +++ b/frontend/src/stores/skypic.test.ts @@ -537,6 +537,7 @@ describe('SkyPic store', () => { const store = useSkyPicStore() store.activeFriendshipId = friend.friendshipId store.conversations = [{ ...conversation }] + store.friends = [{ ...friend }] store.profile = { ...self } const response = await store.sendSnap({ @@ -566,9 +567,294 @@ describe('SkyPic store', () => { id: sent.id, type: sent.type, }) + expect(store.friends[0]).toMatchObject({ + bestStreak: friend.bestStreak, + streakCount: friend.streakCount, + }) + expect(store.conversations[0]).toMatchObject({ + bestStreak: conversation.bestStreak, + streakCount: conversation.streakCount, + }) expect(store.profile.snapScore).toBe(self.snapScore + 1) }) + it('reconciles one authoritative streak value across an atomic snap batch', async () => { + const sentBatch = [1, 2, 3].map( + (index): SkyPicSnap => ({ + ...snap, + bestStreak: 18, + direction: 'sent', + id: `snap-batch-${index}`, + sender: { ...self, snapScore: self.snapScore + 3 }, + streakCount: 1, + }), + ) + mockNuiCall.mockResolvedValueOnce({ data: sentBatch, success: true }) + const store = useSkyPicStore() + store.activeFriendshipId = friend.friendshipId + store.conversations = [{ ...conversation }] + store.friends = [{ ...friend }] + store.profile = { ...self } + + await store.sendSnap({ + allowReplay: false, + caption: '', + durationSeconds: 5, + mediaIds: [1, 2, 3], + overlayColor: '#ffffff', + recipientIds: [maya.id], + textOverlay: '', + }) + + expect(store.threadSnaps).toHaveLength(3) + expect(store.friends[0]).toMatchObject({ + bestStreak: 18, + streakCount: 1, + }) + expect(store.conversations[0]).toMatchObject({ + bestStreak: 18, + streakCount: 1, + }) + expect(store.profile.snapScore).toBe(self.snapScore + 3) + }) + + it('does not let an older send response overwrite streaks from a newer bootstrap', async () => { + const pendingSend = deferred>() + const refreshedProfile = { ...self, snapScore: self.snapScore + 5 } + const refreshedFriend = { + ...friend, + bestStreak: 20, + streakCount: 9, + } + const refreshedConversation: SkyPicConversation = { + ...conversation, + bestStreak: 20, + lastItem: { + body: 'Authoritative newer item', + createdAt: '2026-08-19T14:00:00.000Z', + direction: 'received', + id: 'message-newer-hydration', + openedAt: null, + type: 'text', + }, + streakCount: 9, + } + const refreshedBootstrap: SkyPicBootstrap = { + ...bootstrap, + conversations: [refreshedConversation], + friends: [refreshedFriend], + profile: refreshedProfile, + } + mockNuiCall + .mockReturnValueOnce(pendingSend.promise) + .mockResolvedValueOnce({ data: refreshedBootstrap, success: true }) + .mockResolvedValueOnce({ data: refreshedBootstrap, success: true }) + const store = useSkyPicStore() + + const sending = store.sendSnap({ + allowReplay: false, + caption: '', + durationSeconds: 5, + mediaId: 42, + mediaType: 'photo', + overlayColor: '#ffffff', + recipientIds: [maya.id], + textOverlay: '', + }) + await expect(store.bootstrap()).resolves.toBe(true) + + const staleSent: SkyPicSnap = { + ...snap, + bestStreak: 18, + direction: 'sent', + id: 'snap-stale-streak', + sender: refreshedProfile, + streakCount: 1, + } + pendingSend.resolve({ data: [staleSent], success: true }) + await expect(sending).resolves.toMatchObject({ success: true }) + + expect(store.friends[0]).toMatchObject({ + bestStreak: 20, + streakCount: 9, + }) + expect(store.conversations[0]).toMatchObject({ + bestStreak: 20, + lastItem: { id: 'message-newer-hydration' }, + streakCount: 9, + }) + expect(mockNuiCall).toHaveBeenNthCalledWith(3, 'skypic:bootstrap', {}) + }) + + it('waits for a pending pre-commit bootstrap before its causal refresh', async () => { + const pendingSend = deferred>() + const pendingBootstrap = deferred>() + const committedSent: SkyPicSnap = { + ...snap, + bestStreak: 12, + createdAt: later, + direction: 'sent', + id: 'snap-after-pending-bootstrap', + sender: { ...self, snapScore: self.snapScore + 1 }, + streakCount: 6, + } + const authoritativeConversation: SkyPicConversation = { + ...conversation, + bestStreak: 12, + lastItem: { + createdAt: committedSent.createdAt, + direction: 'sent', + id: committedSent.id, + openedAt: null, + type: committedSent.type, + }, + streakCount: 6, + } + const postCommitBootstrap: SkyPicBootstrap = { + ...bootstrap, + conversations: [authoritativeConversation], + friends: [{ ...friend, streakCount: 6 }], + profile: { ...self, snapScore: self.snapScore + 1 }, + } + mockNuiCall + .mockReturnValueOnce(pendingSend.promise) + .mockReturnValueOnce(pendingBootstrap.promise) + .mockResolvedValueOnce({ data: postCommitBootstrap, success: true }) + const store = useSkyPicStore() + + const sending = store.sendSnap({ + allowReplay: false, + caption: '', + durationSeconds: 5, + mediaId: 42, + mediaType: 'photo', + overlayColor: '#ffffff', + recipientIds: [maya.id], + textOverlay: '', + }) + const staleRefresh = store.bootstrap() + pendingSend.resolve({ data: [committedSent], success: true }) + await Promise.resolve() + await Promise.resolve() + pendingBootstrap.resolve({ data: bootstrap, success: true }) + + await expect(staleRefresh).resolves.toBe(true) + await expect(sending).resolves.toMatchObject({ success: true }) + expect(store.friends[0]).toMatchObject({ + bestStreak: 12, + streakCount: 6, + }) + expect(store.conversations[0]).toMatchObject({ + bestStreak: 12, + lastItem: { id: committedSent.id }, + streakCount: 6, + }) + expect(store.profile?.snapScore).toBe(self.snapScore + 1) + expect(mockNuiCall).toHaveBeenNthCalledWith(3, 'skypic:bootstrap', {}) + }) + + it('refreshes after a bootstrap that read before the pending send committed', async () => { + const pendingSend = deferred>() + const pendingPreCommitBootstrap = deferred>() + const staleHydration: SkyPicBootstrap = { + ...bootstrap, + conversations: [{ ...conversation }], + friends: [{ ...friend }], + profile: { ...self }, + } + const committedSent: SkyPicSnap = { + ...snap, + bestStreak: 12, + createdAt: later, + direction: 'sent', + id: 'snap-committed-after-bootstrap-read', + sender: { ...self, snapScore: self.snapScore + 1 }, + streakCount: 6, + } + const committedConversation: SkyPicConversation = { + ...conversation, + bestStreak: 12, + lastItem: { + createdAt: committedSent.createdAt, + direction: 'sent', + id: committedSent.id, + openedAt: null, + type: committedSent.type, + }, + streakCount: 6, + } + const postCommitBootstrap: SkyPicBootstrap = { + ...bootstrap, + conversations: [committedConversation], + friends: [{ ...friend, streakCount: 6 }], + profile: { ...self, snapScore: self.snapScore + 1 }, + } + mockNuiCall + .mockReturnValueOnce(pendingSend.promise) + .mockResolvedValueOnce({ data: staleHydration, success: true }) + .mockReturnValueOnce(pendingPreCommitBootstrap.promise) + .mockResolvedValueOnce({ data: postCommitBootstrap, success: true }) + const store = useSkyPicStore() + + const sending = store.sendSnap({ + allowReplay: false, + caption: '', + durationSeconds: 5, + mediaId: 42, + mediaType: 'photo', + overlayColor: '#ffffff', + recipientIds: [maya.id], + textOverlay: '', + }) + await expect(store.bootstrap()).resolves.toBe(true) + expect(store.friends[0].streakCount).toBe(friend.streakCount) + + const overlappingPreCommitRefresh = store.bootstrap() + pendingSend.resolve({ data: [committedSent], success: true }) + pendingPreCommitBootstrap.resolve({ + data: staleHydration, + success: true, + }) + await expect(overlappingPreCommitRefresh).resolves.toBe(true) + await expect(sending).resolves.toMatchObject({ success: true }) + + expect(store.friends[0]).toMatchObject({ + bestStreak: 12, + streakCount: 6, + }) + expect(store.conversations[0]).toMatchObject({ + bestStreak: 12, + lastItem: { id: committedSent.id }, + streakCount: 6, + }) + expect(mockNuiCall).toHaveBeenNthCalledWith(4, 'skypic:bootstrap', {}) + }) + + it('does not refresh an obsolete session after a pending send resolves', async () => { + const pendingSend = deferred>() + mockNuiCall.mockReturnValueOnce(pendingSend.promise) + const store = useSkyPicStore() + + const sending = store.sendSnap({ + allowReplay: false, + caption: '', + durationSeconds: 5, + mediaId: 42, + mediaType: 'photo', + overlayColor: '#ffffff', + recipientIds: [maya.id], + textOverlay: '', + }) + store.resetSession() + pendingSend.resolve({ data: [snap], success: true }) + + await expect(sending).resolves.toEqual({ + error: 'request_aborted', + success: false, + }) + expect(mockNuiCall).toHaveBeenCalledTimes(1) + }) + it('deduplicates and caps a multi-photo snap batch without legacy media fields', async () => { mockNuiCall.mockResolvedValueOnce({ data: [], success: true }) const store = useSkyPicStore() diff --git a/frontend/src/stores/skypic.ts b/frontend/src/stores/skypic.ts index 7348483..d1bf5f0 100644 --- a/frontend/src/stores/skypic.ts +++ b/frontend/src/stores/skypic.ts @@ -100,12 +100,14 @@ export const useSkyPicStore = defineStore('skypic', () => { const storyViewersLoadingMore = ref(false) const error = ref(null) let bootstrapRequest = 0 + let bootstrapGeneration = 0 let searchRequest = 0 let snapRequest = 0 let storyRequest = 0 let storyViewersRequest = 0 let threadRequest = 0 let sessionVersion = 0 + let hydrationRevision = 0 let storyViewersStoryId: string | null = null let bootstrapInFlight: { promise: Promise @@ -154,6 +156,29 @@ export const useSkyPicStore = defineStore('skypic', () => { conversations.value = sortByLastItem(conversations.value) } + function reconcileFriendshipStreak(snap: SkyPicSnap): void { + const streakCount = Number(snap.streakCount) + const bestStreak = Number(snap.bestStreak) + if ( + !Number.isInteger(streakCount) || + streakCount < 0 || + !Number.isInteger(bestStreak) || + bestStreak < streakCount + ) { + return + } + friends.value = friends.value.map((friend) => + friend.friendshipId === snap.friendshipId + ? { ...friend, bestStreak, streakCount } + : friend, + ) + conversations.value = conversations.value.map((conversation) => + conversation.friendshipId === snap.friendshipId + ? { ...conversation, bestStreak, streakCount } + : conversation, + ) + } + function setError(response: NuiResponse): void { if (response.error === 'request_aborted') return error.value = response.success ? null : (response.error ?? 'unknown_error') @@ -172,6 +197,7 @@ export const useSkyPicStore = defineStore('skypic', () => { function resetSession(): void { sessionVersion += 1 + hydrationRevision += 1 bootstrapInFlight = null bootstrapPending.value = false bootstrapRequest += 1 @@ -217,6 +243,8 @@ export const useSkyPicStore = defineStore('skypic', () => { return } + hydrationRevision += 1 + blockedProfiles.value = arrayOrEmpty(data.blockedProfiles) friends.value = arrayOrEmpty(data.friends) requests.value = arrayOrEmpty(data.requests) @@ -234,6 +262,7 @@ export const useSkyPicStore = defineStore('skypic', () => { if (bootstrapInFlight?.session === requestSession) { return bootstrapInFlight.promise } + bootstrapGeneration += 1 const requestId = ++bootstrapRequest loading.value = true bootstrapPending.value = true @@ -258,6 +287,15 @@ export const useSkyPicStore = defineStore('skypic', () => { return promise } + async function refreshAfterMutation(expectedSession: number): Promise { + const pendingBootstrap = bootstrapInFlight + if (pendingBootstrap?.session === expectedSession) { + await pendingBootstrap.promise + } + if (expectedSession !== sessionVersion) return + await bootstrap() + } + async function createProfile( input: SkyPicCreateProfileInput, ): Promise> { @@ -585,6 +623,9 @@ export const useSkyPicStore = defineStore('skypic', () => { mediaId: input.mediaId!, mediaType: input.mediaType!, } + const requestHydrationRevision = hydrationRevision + const requestBootstrapGeneration = bootstrapGeneration + const requestSession = sessionVersion const response = await sessionCall( 'skypic:send-snap', payload, @@ -592,25 +633,35 @@ export const useSkyPicStore = defineStore('skypic', () => { setError(response) if (response.success && response.data) { const active = activeFriendshipId.value + const canReconcileResponse = + requestSession === sessionVersion && + requestHydrationRevision === hydrationRevision && + requestBootstrapGeneration === bootstrapGeneration && + bootstrapInFlight?.session !== requestSession threadSnaps.value = uniqueById([ ...threadSnaps.value, ...response.data.filter((snap) => snap.friendshipId === active), ]) - for (const snap of response.data) { - upsertConversationLastItem(snap.friendshipId, { - createdAt: snap.createdAt, - direction: snap.direction, - id: snap.id, - openedAt: snap.openedAt, - type: snap.type, - }) - } - if (profile.value && response.data.length) { - const serverScore = response.data.find( - (snap) => snap.sender.id === profile.value?.id, - )?.sender.snapScore - profile.value.snapScore = - serverScore ?? profile.value.snapScore + response.data.length + if (canReconcileResponse) { + for (const snap of response.data) { + upsertConversationLastItem(snap.friendshipId, { + createdAt: snap.createdAt, + direction: snap.direction, + id: snap.id, + openedAt: snap.openedAt, + type: snap.type, + }) + reconcileFriendshipStreak(snap) + } + if (profile.value && response.data.length) { + const serverScore = response.data.find( + (snap) => snap.sender.id === profile.value?.id, + )?.sender.snapScore + profile.value.snapScore = + serverScore ?? profile.value.snapScore + response.data.length + } + } else if (requestSession === sessionVersion) { + await refreshAfterMutation(requestSession) } } return response diff --git a/frontend/src/types/skypic.ts b/frontend/src/types/skypic.ts index 2e2d9a0..74aa2db 100644 --- a/frontend/src/types/skypic.ts +++ b/frontend/src/types/skypic.ts @@ -83,6 +83,8 @@ export type SkyPicConversation = { /** Direct snap lists intentionally contain no media URL or editor contents. */ export type SkyPicSnap = { allowReplay: boolean + /** Present on successful sends so friendship streak UI can reconcile immediately. */ + bestStreak?: number createdAt: string direction: SkyPicDirection durationSeconds: number @@ -92,6 +94,8 @@ export type SkyPicSnap = { openedAt: string | null replayedAt: string | null sender: SkyPicProfileSummary + /** Present on successful sends so friendship streak UI can reconcile immediately. */ + streakCount?: number type: SkyPicSnapType } diff --git a/frontend/src/views/apps/SkyPicApp.contract.test.ts b/frontend/src/views/apps/SkyPicApp.contract.test.ts index b255f03..4f43339 100644 --- a/frontend/src/views/apps/SkyPicApp.contract.test.ts +++ b/frontend/src/views/apps/SkyPicApp.contract.test.ts @@ -52,6 +52,54 @@ describe('SkyPic frontend contract', () => { expect(viewSource).not.toContain('var(--sp-cyan)') }) + it('uses the reference-led Sky UI hierarchy without inventing camera filters or Spotlight', () => { + expect(viewSource).toContain('class="sp-camera-viewfinder"') + expect(viewSource).toContain('class="sp-camera-dock"') + expect(viewSource).toContain('class="sp-chat-list"') + expect(viewSource).toContain('class="sp-chat-row') + expect(viewSource).toContain('class="sp-story-rail"') + expect(viewSource).toContain('class="sp-story-grid"') + expect(viewSource).toContain('class="sp-discovery-grid"') + expect(viewSource).toContain('class="sp-bottom-nav"') + expect(viewSource).not.toContain('sp-camera-filter') + expect(viewSource).not.toContain('Spotlight') + expect(viewSource).not.toContain('advertisement') + }) + + it('builds story discovery only from safe metadata until view-story releases media', () => { + const storyFeedBlock = viewSource + .split('
')[1] + ?.split('
')[0] + + expect(viewSource).toContain('const friendStoryRail = computed(') + expect(storyFeedBlock).toBeTruthy() + expect(storyFeedBlock).toContain('v-for="story in store.stories"') + expect(storyFeedBlock).toContain('story.author.avatarUrl') + expect(storyFeedBlock).toContain('story.durationSeconds') + expect(storyFeedBlock).not.toContain('story.url') + expect(storyFeedBlock).not.toContain('store.viewedStory.url') + }) + + it('renders every visible streak as an accessible Flame icon', () => { + expect(viewSource.match(/ { + expect(viewSource).toContain( + 'class="sp-media-viewer sp-media-viewer--snap"', + ) + expect(viewSource).toContain( + 'class="sp-media-viewer sp-media-viewer--story"', + ) + expect(viewSource).toContain('object-fit: cover') + expect(viewSource).toContain('.sp-media-viewer::before') + expect(viewSource).toContain('.sp-media-viewer::after') + }) + it('uses the shared Camera and Gallery media handoff with a bounded draft', () => { expect(viewSource).toContain('mediaPicker.begin(') expect(viewSource).toContain("'skypic-draft'") @@ -161,7 +209,7 @@ describe('SkyPic frontend contract', () => { it('keeps profile editing parse-safe and composer inputs canonical', () => { expect(viewSource).toContain('function toggleProfileEditor(): void') - expect(viewSource.match(/@click="toggleProfileEditor"/g)).toHaveLength(2) + expect(viewSource.match(/@click="toggleProfileEditor"/g)).toHaveLength(3) expect(viewSource).toContain('const MAX_CAPTION_LENGTH = 160') expect(viewSource).toContain(':maxlength="MAX_CAPTION_LENGTH"') expect(viewSource).toContain('.slice(0, MAX_CAPTION_LENGTH)') diff --git a/frontend/src/views/apps/SkyPicApp.vue b/frontend/src/views/apps/SkyPicApp.vue index dd7fb32..eb81241 100644 --- a/frontend/src/views/apps/SkyPicApp.vue +++ b/frontend/src/views/apps/SkyPicApp.vue @@ -7,6 +7,7 @@ import { ChevronRight, CirclePlay, Eye, + Flame, Image as ImageIcon, Images, LogOut, @@ -20,7 +21,6 @@ import { Shield, Timer, Trash2, - UserRound, UsersRound, Video, X, @@ -211,6 +211,17 @@ const ownStories = computed(() => const communityStories = computed(() => store.stories.filter((story) => !story.isOwner), ) +const friendStoryRail = computed(() => { + const authors = new Set() + return communityStories.value.filter((story) => { + if (authors.has(story.author.id)) return false + authors.add(story.author.id) + return true + }) +}) +const bestStreak = computed(() => + store.friends.reduce((best, friend) => Math.max(best, friend.bestStreak), 0), +) const viewedStorySummary = computed( () => store.stories.find((story) => story.id === store.viewedStory?.id) ?? null, @@ -1779,14 +1790,23 @@ onBeforeUnmount(() => { +