Skip to content

Commit 2abcd4a

Browse files
committed
feat(register): show eight facts on desktop (keep 5 on mobile)
1 parent e032ba0 commit 2abcd4a

6 files changed

Lines changed: 88 additions & 21 deletions

File tree

‎src/components/SurfaceActStream.vue‎

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
<script setup lang="ts">
2-
import { onBeforeUnmount, ref, watch } from 'vue'
2+
import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'
33
44
import ChainPollingStatus from './ChainPollingStatus.vue'
55
import SurfaceActLine from './SurfaceActLine.vue'
66
import type { SurfaceAct } from '../domain/surface-act'
7+
import {
8+
compactRegisterActWindowSize,
9+
desktopRegisterActWindowSize,
10+
} from '../domain/surface-act-window'
711
812
const props = defineProps<{
913
acts: SurfaceAct[]
@@ -13,15 +17,20 @@ const props = defineProps<{
1317
polling: boolean
1418
}>()
1519
16-
const registerActWindowSize = 5
1720
const visibleActs = ref<SurfaceAct[]>([])
1821
const pendingActs = ref<SurfaceAct[]>([])
1922
const typingActId = ref<string | undefined>()
2023
const cursorActId = ref<string | undefined>()
2124
const knownActIds = new Set<string>()
25+
const compactViewport = ref(false)
26+
const registerActWindowSize = computed(() =>
27+
compactViewport.value ? compactRegisterActWindowSize : desktopRegisterActWindowSize,
28+
)
2229
let drainResolver: (() => void) | undefined
2330
let draining = false
2431
let drainGeneration = 0
32+
let compactViewportQuery: MediaQueryList | undefined
33+
let compactViewportChangeHandler: ((event: MediaQueryListEvent) => void) | undefined
2534
2635
function stopDrain() {
2736
drainGeneration += 1
@@ -34,7 +43,7 @@ function stopDrain() {
3443
}
3544
3645
function currentActs() {
37-
return props.acts.slice(0, registerActWindowSize).reverse()
46+
return props.acts.slice(0, registerActWindowSize.value).reverse()
3847
}
3948
4049
function pruneKnownActIds() {
@@ -80,7 +89,7 @@ async function drainVisibleActs() {
8089
while (generation === drainGeneration && pendingActs.value.length > 0) {
8190
const next = pendingActs.value[0]!
8291
pendingActs.value = pendingActs.value.slice(1)
83-
visibleActs.value = [...visibleActs.value, next].slice(-registerActWindowSize)
92+
visibleActs.value = [...visibleActs.value, next].slice(-registerActWindowSize.value)
8493
8594
if (props.reducedMotion) {
8695
cursorActId.value = undefined
@@ -139,8 +148,32 @@ watch(
139148
},
140149
)
141150
151+
watch(compactViewport, () => {
152+
stopDrain()
153+
visibleActs.value = []
154+
pendingActs.value = []
155+
knownActIds.clear()
156+
enqueueMissingActs()
157+
})
158+
159+
onMounted(() => {
160+
if (typeof window.matchMedia !== 'function') {
161+
return
162+
}
163+
164+
compactViewportQuery = window.matchMedia('(max-width: 760px)')
165+
compactViewport.value = compactViewportQuery.matches
166+
compactViewportChangeHandler = (event) => {
167+
compactViewport.value = event.matches
168+
}
169+
compactViewportQuery.addEventListener('change', compactViewportChangeHandler)
170+
})
171+
142172
onBeforeUnmount(() => {
143173
stopDrain()
174+
if (compactViewportChangeHandler) {
175+
compactViewportQuery?.removeEventListener('change', compactViewportChangeHandler)
176+
}
144177
})
145178
</script>
146179

‎src/components/__tests__/SurfaceActStream.spec.ts‎

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { mount } from '@vue/test-utils'
22
import { nextTick } from 'vue'
3-
import { describe, expect, it } from 'vitest'
3+
import { afterEach, describe, expect, it, vi } from 'vitest'
44

55
import SurfaceActLine from '../SurfaceActLine.vue'
66
import SurfaceActStream from '../SurfaceActStream.vue'
@@ -26,7 +26,11 @@ function makeAct(id: string, height: number, signer: string) {
2626
}
2727

2828
describe('SurfaceActStream', () => {
29-
it('renders the oldest-to-newest five-record window with assertions and limited proof', async () => {
29+
afterEach(() => {
30+
vi.unstubAllGlobals()
31+
})
32+
33+
it('renders the oldest-to-newest desktop window with assertions and limited proof', async () => {
3034
const oldest = makeAct('TX-1', 1, 'axone1oldest')
3135
const newest = makeAct('TX-2', 2, 'axone1newest')
3236
const wrapper = mount(SurfaceActStream, {
@@ -73,13 +77,16 @@ describe('SurfaceActStream', () => {
7377
expect(wrapper.findAll('.surface-act-cursor')).toHaveLength(1)
7478
})
7579

76-
it('retains only the five latest records', async () => {
80+
it('retains only the eight latest desktop records', async () => {
7781
const acts = [
78-
makeAct('TX-6', 6, 'axone1newest'),
79-
makeAct('TX-5', 5, 'axone1middle'),
80-
makeAct('TX-4', 4, 'axone1older'),
81-
makeAct('TX-3', 3, 'axone1old'),
82-
makeAct('TX-2', 2, 'axone1earlier'),
82+
makeAct('TX-9', 9, 'axone1newest'),
83+
makeAct('TX-8', 8, 'axone1eight'),
84+
makeAct('TX-7', 7, 'axone1seven'),
85+
makeAct('TX-6', 6, 'axone1six'),
86+
makeAct('TX-5', 5, 'axone1five'),
87+
makeAct('TX-4', 4, 'axone1four'),
88+
makeAct('TX-3', 3, 'axone1three'),
89+
makeAct('TX-2', 2, 'axone1two'),
8390
makeAct('TX-1', 1, 'axone1oldest'),
8491
]
8592
const wrapper = mount(SurfaceActStream, {
@@ -88,9 +95,35 @@ describe('SurfaceActStream', () => {
8895

8996
await nextTick()
9097

91-
expect(wrapper.findAll('.surface-act-record')).toHaveLength(5)
98+
expect(wrapper.findAll('.surface-act-record')).toHaveLength(8)
9299
expect(wrapper.text()).not.toContain('axone1oldest')
93-
expect(wrapper.text()).toContain('axone1older')
100+
expect(wrapper.text()).toContain('axone1two')
94101
expect(wrapper.text()).toContain('axone1newest')
95102
})
103+
104+
it('shows only the five latest records on compact viewports', async () => {
105+
vi.stubGlobal(
106+
'matchMedia',
107+
vi.fn().mockReturnValue({
108+
matches: true,
109+
addEventListener: () => undefined,
110+
removeEventListener: () => undefined,
111+
}),
112+
)
113+
const acts = Array.from({ length: 8 }, (_, index) => {
114+
const height = 8 - index
115+
return makeAct(`TX-${height}`, height, `axone1${height}`)
116+
})
117+
const wrapper = mount(SurfaceActStream, {
118+
props: { acts, loading: false, reducedMotion: true, polling: false },
119+
})
120+
121+
await nextTick()
122+
await nextTick()
123+
124+
expect(wrapper.findAll('.surface-act-record')).toHaveLength(5)
125+
expect(wrapper.text()).not.toContain('axone11')
126+
expect(wrapper.text()).toContain('axone14')
127+
expect(wrapper.text()).toContain('axone18')
128+
})
96129
})

‎src/composables/__tests__/useSurfaceActs.spec.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ describe('useSurfaceActs', () => {
110110
)) {
111111
const searchParams = new URL(String(request)).searchParams
112112
expect(searchParams.get('page')).toBe('1')
113-
expect(searchParams.get('limit')).toBe('5')
113+
expect(searchParams.get('limit')).toBe('8')
114114
expect(searchParams.get('pagination.limit')).toBeNull()
115115
}
116116

‎src/composables/useSurfaceActs.ts‎

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
moduleAdministratorsFromInstallations,
88
sortSurfaceActs,
99
} from '../domain/surface-act-mapper'
10+
import { desktopRegisterActWindowSize } from '../domain/surface-act-window'
1011
import {
1112
fetchExecuteContractTxs,
1213
fetchInstantiateContract2Txs,
@@ -24,12 +25,10 @@ type UseSurfaceActsState = {
2425
}
2526

2627
const pollIntervalMs = 15000
27-
const registerActWindowSize = 5
28-
2928
function normalizeActs(current: SurfaceAct[], incoming: SurfaceAct[]) {
3029
return sortSurfaceActs(dedupeSurfaceActs([...incoming, ...current])).slice(
3130
0,
32-
registerActWindowSize,
31+
desktopRegisterActWindowSize,
3332
)
3433
}
3534

@@ -82,8 +81,8 @@ export function useSurfaceActs(): UseSurfaceActsState {
8281

8382
try {
8483
const [instantiateTxs, executeTxs] = await Promise.all([
85-
fetchInstantiateContract2Txs(),
86-
fetchExecuteContractTxs(),
84+
fetchInstantiateContract2Txs(undefined, desktopRegisterActWindowSize),
85+
fetchExecuteContractTxs(undefined, desktopRegisterActWindowSize),
8786
])
8887

8988
const txResponses = [...instantiateTxs.txResponses, ...executeTxs.txResponses]

‎src/domain/surface-act-window.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export const desktopRegisterActWindowSize = 8
2+
export const compactRegisterActWindowSize = 5

‎src/styles.css‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -979,7 +979,7 @@
979979

980980
.surface-act-window {
981981
position: relative;
982-
height: 480px;
982+
height: 560px;
983983
overflow: hidden;
984984
mask-image: linear-gradient(
985985
to bottom,

0 commit comments

Comments
 (0)