Skip to content

Commit b389c41

Browse files
committed
Merge branch 'dev' of https://github.com/umami-software/umami into dev
# Conflicts: # src/app/(main)/websites/[websiteId]/replays/ReplayModal.tsx # src/app/(main)/websites/[websiteId]/replays/ReplaysTable.tsx # src/app/(main)/websites/[websiteId]/replays/[sessionId]/ReplayPlayback.tsx # src/queries/sql/replays/saveReplayChunk.ts # src/recorder/index.js
2 parents 8c1ee0b + 5a0243a commit b389c41

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+723
-302
lines changed

db/clickhouse/migrations/10_add_session_recording.sql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ CREATE TABLE umami.session_replay
44
replay_id UUID,
55
website_id UUID,
66
session_id UUID,
7+
visit_id UUID,
78
chunk_index UInt32,
89
events String CODEC(ZSTD(3)),
910
event_count UInt32,
@@ -13,5 +14,5 @@ CREATE TABLE umami.session_replay
1314
)
1415
ENGINE = MergeTree()
1516
PARTITION BY toYYYYMM(created_at)
16-
ORDER BY (replay_id, website_id, session_id, chunk_index)
17+
ORDER BY (replay_id, website_id, session_id, visit_id, chunk_index)
1718
SETTINGS index_granularity = 8192;

db/clickhouse/schema.sql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,7 @@ CREATE TABLE umami.session_replay
361361
replay_id UUID,
362362
website_id UUID,
363363
session_id UUID,
364+
visit_id UUID,
364365
chunk_index UInt32,
365366
events String CODEC(ZSTD(3)),
366367
event_count UInt32,
@@ -370,5 +371,5 @@ CREATE TABLE umami.session_replay
370371
)
371372
ENGINE = MergeTree()
372373
PARTITION BY toYYYYMM(created_at)
373-
ORDER BY (replay_id, website_id, session_id, chunk_index)
374+
ORDER BY (replay_id, website_id, session_id, visit_id, chunk_index)
374375
SETTINGS index_granularity = 8192;

prisma/migrations/19_add_session_recording/migration.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ CREATE TABLE "session_replay" (
77
"replay_id" UUID NOT NULL,
88
"website_id" UUID NOT NULL,
99
"session_id" UUID NOT NULL,
10+
"visit_id" UUID NOT NULL,
1011
"chunk_index" INTEGER NOT NULL,
1112
"events" BYTEA NOT NULL,
1213
"event_count" INTEGER NOT NULL,
@@ -21,5 +22,6 @@ CREATE TABLE "session_replay" (
2122
CREATE INDEX "session_replay_website_id_idx" ON "session_replay"("website_id");
2223
CREATE INDEX "session_replay_session_id_idx" ON "session_replay"("session_id");
2324
CREATE INDEX "session_replay_website_id_session_id_idx" ON "session_replay"("website_id", "session_id");
25+
CREATE INDEX "session_replay_website_id_visit_id_idx" ON "session_replay"("website_id", "visit_id");
2426
CREATE INDEX "session_replay_website_id_created_at_idx" ON "session_replay"("website_id", "created_at");
2527
CREATE INDEX "session_replay_session_id_chunk_index_idx" ON "session_replay"("session_id", "chunk_index");

prisma/schema.prisma

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,7 @@ model SessionReplay {
399399
@@index([sessionId])
400400
@@index([visitId])
401401
@@index([websiteId, sessionId])
402+
@@index([websiteId, visitId])
402403
@@index([websiteId, createdAt])
403404
@@index([sessionId, chunkIndex])
404405
@@map("session_replay")

public/intl/messages/en-US.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@
251251
"remove": "Remove",
252252
"remove-member": "Remove member",
253253
"replay": "Replay",
254+
"replay-id": "Replay ID",
254255
"replay-enabled": "Replay enabled",
255256
"replays": "Replays",
256257
"reports": "Reports",
@@ -332,6 +333,8 @@
332333
"unique": "Unique",
333334
"unique-events": "Unique events",
334335
"unique-visitors": "Unique visitors",
336+
"aov": "AOV",
337+
"arpu": "ARPU",
335338
"uniqueCustomers": "Unique Customers",
336339
"unknown": "Unknown",
337340
"untitled": "Untitled",

src/app/(main)/websites/[websiteId]/(reports)/revenue/Revenue.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export function Revenue({ websiteId, startDate, endDate, unit }: RevenueProps) {
4444
const metrics = useMemo(() => {
4545
if (!data) return [];
4646

47-
const { sum, count, average, unique_count, comparison } = data.total;
47+
const { sum, count, average, unique_count, arpu, comparison } = data.total;
4848

4949
return [
5050
{
@@ -55,10 +55,16 @@ export function Revenue({ websiteId, startDate, endDate, unit }: RevenueProps) {
5555
},
5656
{
5757
value: average,
58-
label: t(labels.average),
58+
label: t(labels.aov),
5959
change: comparison ? average - comparison.average : 0,
6060
formatValue: (n: number) => formatLongCurrency(n, currency),
6161
},
62+
{
63+
value: arpu,
64+
label: t(labels.arpu),
65+
change: comparison ? arpu - (comparison.arpu ?? 0) : 0,
66+
formatValue: (n: number) => formatLongCurrency(n, currency),
67+
},
6268
{
6369
value: count,
6470
label: t(labels.transactions),

src/app/(main)/websites/[websiteId]/(reports)/revenue/RevenueTable.tsx

Lines changed: 0 additions & 21 deletions
This file was deleted.

src/app/(main)/websites/[websiteId]/events/EventsTable.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,14 @@ export function EventsTable(props: DataTableProps) {
8686
</TypeIcon>
8787
)}
8888
</DataColumn>
89-
<DataColumn id="device" label={t(labels.device)} width="120px">
89+
<DataColumn id="device" label={t(labels.device)} width="140px">
9090
{(row: any) => (
9191
<TypeIcon type="device" value={row.device}>
9292
{formatValue(row.device, 'device')}
9393
</TypeIcon>
9494
)}
9595
</DataColumn>
96-
<DataColumn id="created" width="160px" align="end">
96+
<DataColumn id="created" width="140px" label={t(labels.created)}>
9797
{(row: any) => <DateDistance date={new Date(row.createdAt)} />}
9898
</DataColumn>
9999
</DataTable>

src/app/(main)/websites/[websiteId]/replays/ReplayModal.tsx

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,41 @@
11
'use client';
2-
import { Button, Column, Dialog, Icon, Modal, Row } from '@umami/react-zen';
3-
import { X } from 'lucide-react';
4-
import { useRouter, useSearchParams } from 'next/navigation';
5-
import { buildPath } from '@/lib/url';
6-
import { ReplayPlayback } from './[sessionId]/ReplayPlayback';
2+
import { Column, Dialog, Modal, type ModalProps } from '@umami/react-zen';
3+
import { ReplayPlayback } from '@/app/(main)/websites/[websiteId]/replays/[replayId]/ReplayPlayback';
4+
import { useNavigation } from '@/components/hooks';
75

8-
export function ReplayModal({ websiteId, sessionId }: { websiteId: string; sessionId: string }) {
9-
const router = useRouter();
10-
const searchParams = useSearchParams();
11-
12-
const closeModal = () => {
13-
const query = Object.fromEntries(searchParams.entries());
14-
delete query.session;
6+
export interface ReplayModalProps extends ModalProps {
7+
websiteId: string;
8+
}
159

16-
router.push(buildPath(`/websites/${websiteId}/replays`, query));
17-
};
10+
export function ReplayModal({ websiteId, ...props }: ReplayModalProps) {
11+
const {
12+
router,
13+
query: { replay },
14+
updateParams,
15+
} = useNavigation();
1816

1917
const handleOpenChange = (isOpen: boolean) => {
2018
if (!isOpen) {
21-
closeModal();
19+
router.push(updateParams({ replay: undefined }));
2220
}
2321
};
2422

2523
return (
26-
<Modal placement="bottom" offset="80px" isOpen onOpenChange={handleOpenChange} isDismissable>
24+
<Modal
25+
placement="bottom"
26+
offset="80px"
27+
isOpen={!!replay}
28+
onOpenChange={handleOpenChange}
29+
isDismissable
30+
{...props}
31+
>
2732
<Column height="100%" maxWidth="1320px" style={{ margin: '0 auto' }}>
28-
<Dialog variant="sheet" className="rounded-lg">
29-
<Column padding="10">
30-
<Row justifyContent="flex-end">
31-
<Button onPress={closeModal} variant="quiet">
32-
<Icon>
33-
<X />
34-
</Icon>
35-
</Button>
36-
</Row>
37-
<ReplayPlayback websiteId={websiteId} sessionId={sessionId} />
38-
</Column>
33+
<Dialog variant="sheet">
34+
{({ close }) => (
35+
<Column padding="6">
36+
<ReplayPlayback websiteId={websiteId} replayId={replay} onClose={close} />
37+
</Column>
38+
)}
3939
</Dialog>
4040
</Column>
4141
</Modal>

src/app/(main)/websites/[websiteId]/replays/ReplaysDataTable.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export function ReplaysDataTable({ websiteId }: { websiteId: string }) {
88
return (
99
<DataGrid query={queryResult} allowPaging allowSearch>
1010
{({ data }) => {
11-
return <ReplaysTable data={data} websiteId={websiteId} />;
11+
return <ReplaysTable data={data} />;
1212
}}
1313
</DataGrid>
1414
);

0 commit comments

Comments
 (0)