@powerhousedao/common 4.1.0-dev.86 → 4.1.0-dev.87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/editors/styles.css +2 -4
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/package.json +8 -8
- package/dist/hooks/useTimelineItems.d.ts +0 -25
- package/dist/hooks/useTimelineItems.d.ts.map +0 -1
- package/dist/hooks/useTimelineItems.js +0 -104
- package/dist/hooks/useTimelineItems.js.map +0 -1
- package/dist/utils/get-revision-from-date.d.ts +0 -3
- package/dist/utils/get-revision-from-date.d.ts.map +0 -1
- package/dist/utils/get-revision-from-date.js +0 -10
- package/dist/utils/get-revision-from-date.js.map +0 -1
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export
|
|
1
|
+
export {};
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../utils/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../utils/index.ts"],"names":[],"mappings":""}
|
package/dist/utils/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export
|
|
1
|
+
export {};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../utils/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../utils/index.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powerhousedao/common",
|
|
3
|
-
"version": "4.1.0-dev.
|
|
3
|
+
"version": "4.1.0-dev.87",
|
|
4
4
|
"license": "AGPL-3.0-only",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -23,10 +23,10 @@
|
|
|
23
23
|
"@types/luxon": "^3.7.1",
|
|
24
24
|
"luxon": "^3.7.1",
|
|
25
25
|
"react-i18next": "^13.5.0",
|
|
26
|
-
"@powerhousedao/builder-tools": "4.1.0-dev.
|
|
27
|
-
"document-drive": "4.1.0-dev.
|
|
28
|
-
"document-model": "4.1.0-dev.
|
|
29
|
-
"@powerhousedao/design-system": "4.1.0-dev.
|
|
26
|
+
"@powerhousedao/builder-tools": "4.1.0-dev.87",
|
|
27
|
+
"document-drive": "4.1.0-dev.87",
|
|
28
|
+
"document-model": "4.1.0-dev.87",
|
|
29
|
+
"@powerhousedao/design-system": "4.1.0-dev.87"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@storybook/addon-actions": "^8.6.7",
|
|
@@ -65,9 +65,9 @@
|
|
|
65
65
|
"vite-plugin-node-polyfills": "^0.24.0",
|
|
66
66
|
"vitest": "^3.2.4",
|
|
67
67
|
"zod": "^3.24.3",
|
|
68
|
-
"@powerhousedao/config": "4.1.0-dev.
|
|
69
|
-
"@powerhousedao/reactor-browser": "4.1.0-dev.
|
|
70
|
-
"document-model": "4.1.0-dev.
|
|
68
|
+
"@powerhousedao/config": "4.1.0-dev.87",
|
|
69
|
+
"@powerhousedao/reactor-browser": "4.1.0-dev.87",
|
|
70
|
+
"document-model": "4.1.0-dev.87"
|
|
71
71
|
},
|
|
72
72
|
"scripts": {
|
|
73
73
|
"tsc": "tsc",
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type { UseAnalyticsQueryResult } from "@powerhousedao/reactor-browser";
|
|
2
|
-
type BarItem = {
|
|
3
|
-
id: string;
|
|
4
|
-
type: "bar";
|
|
5
|
-
addSize: 0 | 1 | 2 | 3 | 4;
|
|
6
|
-
delSize: 0 | 1 | 2 | 3 | 4;
|
|
7
|
-
additions: number;
|
|
8
|
-
deletions: number;
|
|
9
|
-
timestampUtcMs: string;
|
|
10
|
-
startDate: Date;
|
|
11
|
-
endDate: Date;
|
|
12
|
-
revision?: number;
|
|
13
|
-
};
|
|
14
|
-
type DividerItem = {
|
|
15
|
-
id: string;
|
|
16
|
-
type: "divider";
|
|
17
|
-
revision?: number;
|
|
18
|
-
startDate?: Date;
|
|
19
|
-
endDate?: Date;
|
|
20
|
-
};
|
|
21
|
-
type TimelineItem = BarItem | DividerItem;
|
|
22
|
-
export type UseTimelineItemsResult = UseAnalyticsQueryResult<TimelineItem[]>;
|
|
23
|
-
export declare const useTimelineItems: (documentId?: string, startTimestamp?: string, driveId?: string) => UseTimelineItemsResult;
|
|
24
|
-
export {};
|
|
25
|
-
//# sourceMappingURL=useTimelineItems.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useTimelineItems.d.ts","sourceRoot":"","sources":["../../hooks/useTimelineItems.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAa9E,KAAK,OAAO,GAAG;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,KAAK,CAAC;IACZ,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB,CAAC;AAEF,KAAK,YAAY,GAAG,OAAO,GAAG,WAAW,CAAC;AAwF1C,MAAM,MAAM,sBAAsB,GAAG,uBAAuB,CAAC,YAAY,EAAE,CAAC,CAAC;AAE7E,eAAO,MAAM,gBAAgB,GAC3B,aAAa,MAAM,EACnB,iBAAiB,MAAM,EACvB,UAAU,MAAM,KACf,sBAwBF,CAAC"}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import { AnalyticsGranularity, AnalyticsPath, } from "@powerhousedao/analytics-engine-core";
|
|
2
|
-
import { useAnalyticsQuery } from "@powerhousedao/reactor-browser";
|
|
3
|
-
import { DateTime } from "luxon";
|
|
4
|
-
const getBarSize = (value) => {
|
|
5
|
-
if (value <= 0)
|
|
6
|
-
return 0;
|
|
7
|
-
if (value > 0 && value <= 50)
|
|
8
|
-
return 1;
|
|
9
|
-
if (value > 50 && value <= 100)
|
|
10
|
-
return 2;
|
|
11
|
-
if (value > 100 && value <= 250)
|
|
12
|
-
return 3;
|
|
13
|
-
return 4;
|
|
14
|
-
};
|
|
15
|
-
function addItemsDividers(items) {
|
|
16
|
-
if (!items.length)
|
|
17
|
-
return [];
|
|
18
|
-
const result = [];
|
|
19
|
-
items.forEach((item, index) => {
|
|
20
|
-
result.push(item);
|
|
21
|
-
// Check if there's a next item and if they're not in consecutive hours
|
|
22
|
-
if (index < items.length - 1) {
|
|
23
|
-
const currentDate = new Date(item.startDate);
|
|
24
|
-
const nextDate = new Date(items[index + 1].startDate);
|
|
25
|
-
const currentHour = currentDate.getHours();
|
|
26
|
-
const nextHour = nextDate.getHours();
|
|
27
|
-
// Get day parts (without time) for comparison
|
|
28
|
-
const currentDay = currentDate.toDateString();
|
|
29
|
-
const nextDay = nextDate.toDateString();
|
|
30
|
-
// If different days or non-consecutive hours on the same day
|
|
31
|
-
if (currentDay !== nextDay ||
|
|
32
|
-
(currentDay === nextDay && Math.abs(nextHour - currentHour) > 1)) {
|
|
33
|
-
result.push({
|
|
34
|
-
id: `divider-${item.id}-${items[index + 1].id}`,
|
|
35
|
-
type: "divider",
|
|
36
|
-
revision: 0,
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
return result;
|
|
42
|
-
}
|
|
43
|
-
function metricsToItems(metrics) {
|
|
44
|
-
if (!metrics)
|
|
45
|
-
return [];
|
|
46
|
-
const items = metrics
|
|
47
|
-
.sort((a, b) => {
|
|
48
|
-
const aDate = new Date(a.start);
|
|
49
|
-
const bDate = new Date(b.start);
|
|
50
|
-
return aDate.getTime() - bDate.getTime();
|
|
51
|
-
})
|
|
52
|
-
.filter((result) => {
|
|
53
|
-
return result.rows.every((row) => row.value > 0);
|
|
54
|
-
})
|
|
55
|
-
.map((result) => {
|
|
56
|
-
const { additions, deletions } = result.rows.reduce((acc, row) => {
|
|
57
|
-
if (row.dimensions.changes.path ===
|
|
58
|
-
"ph/diff/changes/add") {
|
|
59
|
-
acc.additions += row.value;
|
|
60
|
-
}
|
|
61
|
-
else if (row.dimensions.changes.path ===
|
|
62
|
-
"ph/diff/changes/remove") {
|
|
63
|
-
acc.deletions += row.value;
|
|
64
|
-
}
|
|
65
|
-
return acc;
|
|
66
|
-
}, { additions: 0, deletions: 0 });
|
|
67
|
-
const startDate = new Date(result.start);
|
|
68
|
-
return {
|
|
69
|
-
id: startDate.toISOString(),
|
|
70
|
-
type: "bar",
|
|
71
|
-
addSize: getBarSize(additions),
|
|
72
|
-
delSize: getBarSize(deletions),
|
|
73
|
-
additions,
|
|
74
|
-
deletions,
|
|
75
|
-
timestampUtcMs: startDate.toISOString(),
|
|
76
|
-
startDate: startDate,
|
|
77
|
-
endDate: new Date(result.end),
|
|
78
|
-
revision: 0,
|
|
79
|
-
};
|
|
80
|
-
});
|
|
81
|
-
return addItemsDividers(items);
|
|
82
|
-
}
|
|
83
|
-
export const useTimelineItems = (documentId, startTimestamp, driveId) => {
|
|
84
|
-
const start = startTimestamp
|
|
85
|
-
? DateTime.fromISO(startTimestamp)
|
|
86
|
-
: DateTime.now().startOf("day");
|
|
87
|
-
return useAnalyticsQuery({
|
|
88
|
-
start,
|
|
89
|
-
end: DateTime.now().endOf("day"),
|
|
90
|
-
granularity: AnalyticsGranularity.Hourly,
|
|
91
|
-
metrics: ["Count"],
|
|
92
|
-
select: {
|
|
93
|
-
changes: [AnalyticsPath.fromString(`ph/diff/changes`)],
|
|
94
|
-
document: [AnalyticsPath.fromString(`ph/diff/document/${documentId}`)],
|
|
95
|
-
},
|
|
96
|
-
lod: {
|
|
97
|
-
changes: 4,
|
|
98
|
-
},
|
|
99
|
-
}, {
|
|
100
|
-
sources: [AnalyticsPath.fromString(`ph/diff/${driveId}/${documentId}`)],
|
|
101
|
-
select: metricsToItems,
|
|
102
|
-
});
|
|
103
|
-
};
|
|
104
|
-
//# sourceMappingURL=useTimelineItems.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useTimelineItems.js","sourceRoot":"","sources":["../../hooks/useTimelineItems.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-revision-from-date.d.ts","sourceRoot":"","sources":["../../utils/get-revision-from-date.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,eAAO,MAAM,mBAAmB,GAC9B,YAAY,IAAI,EAChB,UAAU,IAAI,EACd,aAAY,SAAS,EAAO,WAU7B,CAAC"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export const getRevisionFromDate = (startDate, endDate, operations = []) => {
|
|
2
|
-
if (!startDate || !endDate)
|
|
3
|
-
return 0;
|
|
4
|
-
const operation = operations.find((operation) => {
|
|
5
|
-
const operationDate = new Date(operation.timestampUtcMs);
|
|
6
|
-
return operationDate >= startDate && operationDate <= endDate;
|
|
7
|
-
});
|
|
8
|
-
return operation ? operation.index : 0;
|
|
9
|
-
};
|
|
10
|
-
//# sourceMappingURL=get-revision-from-date.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-revision-from-date.js","sourceRoot":"","sources":["../../utils/get-revision-from-date.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,SAAgB,EAChB,OAAc,EACd,aAA0B,EAAE,EAC5B,EAAE;IACF,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC;IAErC,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;QAC9C,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACzD,OAAO,aAAa,IAAI,SAAS,IAAI,aAAa,IAAI,OAAO,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC,CAAC"}
|