tangled
alpha
login
or
join now
t1c.dev
/
rocksky
forked from
rocksky.app/rocksky
2
fork
atom
A decentralized music tracking and discovery platform built on AT Protocol 🎵
2
fork
atom
overview
issues
pulls
pipelines
Extract chartData and skip empty chart data
tsiry-sandratraina.com
2 months ago
58ed3f37
fa1ee9fd
+114
-113
2 changed files
expand all
collapse all
unified
split
apps
api
package.json
web
src
components
ScrobblesAreaChart
ScrobblesAreaChart.tsx
+106
-106
apps/api/package.json
···
1
1
{
2
2
-
"name": "@rocksky/api",
3
3
-
"version": "0.0.1",
4
4
-
"private": true,
5
5
-
"type": "module",
6
6
-
"module": "dist/index.js",
7
7
-
"scripts": {
8
8
-
"lexgen": "lex gen-server ./src/lexicon ./src/tealfm/lexicons/teal/**/* ./lexicons/**/* ./lexicons/* ./src/tealfm/lexicons/**/*",
9
9
-
"dev": "concurrently 'tsx --watch ./src/index.ts' 'tsx --watch ./src/server.ts'",
10
10
-
"prod": "tsx ./src/index.ts",
11
11
-
"build": "pkgroll",
12
12
-
"sync": "tsx ./src/scripts/sync.ts",
13
13
-
"meili:sync": "tsx ./src/scripts/meili.ts",
14
14
-
"sync:library": "tsx ./src/scripts/sync-library.ts",
15
15
-
"avatar": "tsx ./src/scripts/avatar.ts",
16
16
-
"genres": "tsx ./src/scripts/genres.ts",
17
17
-
"spotify": "tsx ./src/scripts/spotify.ts",
18
18
-
"exp": "tsx ./src/scripts/exp.ts",
19
19
-
"pkl:eval": "pkl eval -f json",
20
20
-
"pkl:gen": "tsx ./scripts/pkl.ts",
21
21
-
"dev:xrpc": "tsx --watch ./src/server.ts",
22
22
-
"prod:xrpc": "tsx ./src/server.ts",
23
23
-
"db:migrate": "drizzle-kit migrate",
24
24
-
"db:gen-migration": "drizzle-kit generate",
25
25
-
"prod:all": "concurrently 'tsx ./src/index.ts' 'tsx ./src/server.ts'",
26
26
-
"format": "biome format src",
27
27
-
"lint": "biome lint src",
28
28
-
"feed": "bun ./src/scripts/feed.ts",
29
29
-
"dedup": "bun ./src/scripts/dedup.ts"
30
30
-
},
31
31
-
"dependencies": {
32
32
-
"@atproto/api": "^0.13.31",
33
33
-
"@atproto/common": "^0.4.6",
34
34
-
"@atproto/identity": "^0.4.5",
35
35
-
"@atproto/jwk-jose": "0.1.5",
36
36
-
"@atproto/lex-cli": "^0.5.6",
37
37
-
"@atproto/lexicon": "^0.4.5",
38
38
-
"@atproto/oauth-client-node": "0.2.14",
39
39
-
"@atproto/sync": "^0.1.11",
40
40
-
"@atproto/syntax": "^0.3.1",
41
41
-
"@atproto/xrpc-server": "^0.7.8",
42
42
-
"@hono/node-server": "^1.13.8",
43
43
-
"@hono/node-ws": "^1.1.0",
44
44
-
"@opentelemetry/api": "^1.9.0",
45
45
-
"@opentelemetry/auto-instrumentations-node": "^0.58.0",
46
46
-
"@opentelemetry/exporter-metrics-otlp-http": "^0.200.0",
47
47
-
"@opentelemetry/exporter-trace-otlp-http": "^0.200.0",
48
48
-
"@opentelemetry/resources": "^2.0.0",
49
49
-
"@opentelemetry/sdk-metrics": "^2.0.0",
50
50
-
"@opentelemetry/sdk-node": "^0.200.0",
51
51
-
"@opentelemetry/semantic-conventions": "^1.32.0",
52
52
-
"@pyroscope/nodejs": "^0.4.5",
53
53
-
"assert": "^2.1.0",
54
54
-
"axios": "^1.7.9",
55
55
-
"better-sqlite3": "^12.4.1",
56
56
-
"chalk": "^5.4.1",
57
57
-
"chanfana": "^2.0.2",
58
58
-
"cors": "^2.8.5",
59
59
-
"dayjs": "^1.11.13",
60
60
-
"dotenv": "^16.4.7",
61
61
-
"drizzle-orm": "^0.44.2",
62
62
-
"dropbox": "^10.34.0",
63
63
-
"effect": "^3.14.22",
64
64
-
"envalid": "^8.0.0",
65
65
-
"express": "^5.1.0",
66
66
-
"googleapis": "^146.0.0",
67
67
-
"hono": "^4.4.7",
68
68
-
"http-proxy-middleware": "^3.0.5",
69
69
-
"ioredis": "^5.8.1",
70
70
-
"iron-session": "^8.0.4",
71
71
-
"jose": "^6.1.0",
72
72
-
"jsonwebtoken": "^9.0.2",
73
73
-
"kysely": "^0.27.5",
74
74
-
"lodash": "^4.17.21",
75
75
-
"nats": "^2.29.2",
76
76
-
"node-cron": "^4.2.1",
77
77
-
"pg": "^8.13.3",
78
78
-
"prompts": "^2.4.2",
79
79
-
"ramda": "^0.30.1",
80
80
-
"redis": "^4.7.0",
81
81
-
"redlock": "^5.0.0-beta.2",
82
82
-
"unstorage": "^1.14.4",
83
83
-
"url": "^0.11.4",
84
84
-
"uuid": "^11.1.0",
85
85
-
"ws": "^8.18.1",
86
86
-
"zod": "^3.24.1"
87
87
-
},
88
88
-
"devDependencies": {
89
89
-
"@biomejs/biome": "^2.2.3",
90
90
-
"@pkl-community/pkl": "^0.28.2",
91
91
-
"@types/express": "^5.0.2",
92
92
-
"@types/lodash": "^4.17.17",
93
93
-
"@types/node": "^22.13.0",
94
94
-
"@types/ramda": "^0.30.2",
95
95
-
"@types/service-worker-mock": "^2.0.1",
96
96
-
"concurrently": "^9.2.0",
97
97
-
"drizzle-kit": "^0.31.1",
98
98
-
"pkgroll": "^2.6.1",
99
99
-
"tsx": "^4.19.2",
100
100
-
"zx": "^8.5.4"
101
101
-
},
102
102
-
"exports": {
103
103
-
".": {
104
104
-
"import": "./dist/index.js"
105
105
-
}
106
106
-
}
107
107
-
}
2
2
+
"name": "@rocksky/api",
3
3
+
"version": "0.0.1",
4
4
+
"private": true,
5
5
+
"type": "module",
6
6
+
"module": "dist/index.js",
7
7
+
"scripts": {
8
8
+
"lexgen": "lex gen-server ./src/lexicon ./src/tealfm/lexicons/teal/**/* ./lexicons/**/* ./lexicons/* ./src/tealfm/lexicons/**/*",
9
9
+
"dev": "concurrently 'tsx --watch ./src/index.ts' 'tsx --watch ./src/server.ts'",
10
10
+
"prod": "tsx ./src/index.ts",
11
11
+
"build": "pkgroll",
12
12
+
"sync": "tsx ./src/scripts/sync.ts",
13
13
+
"meili:sync": "tsx ./src/scripts/meili.ts",
14
14
+
"sync:library": "tsx ./src/scripts/sync-library.ts",
15
15
+
"avatar": "tsx ./src/scripts/avatar.ts",
16
16
+
"genres": "tsx ./src/scripts/genres.ts",
17
17
+
"spotify": "tsx ./src/scripts/spotify.ts",
18
18
+
"exp": "tsx ./src/scripts/exp.ts",
19
19
+
"pkl:eval": "pkl eval -f json",
20
20
+
"pkl:gen": "tsx ./scripts/pkl.ts",
21
21
+
"dev:xrpc": "tsx --watch ./src/server.ts",
22
22
+
"prod:xrpc": "tsx ./src/server.ts",
23
23
+
"db:migrate": "drizzle-kit migrate",
24
24
+
"db:gen-migration": "drizzle-kit generate",
25
25
+
"prod:all": "concurrently 'tsx ./src/index.ts' 'tsx ./src/server.ts'",
26
26
+
"format": "biome format src",
27
27
+
"lint": "biome lint src",
28
28
+
"feed": "tsx ./src/scripts/feed.ts",
29
29
+
"dedup": "bun ./src/scripts/dedup.ts"
30
30
+
},
31
31
+
"dependencies": {
32
32
+
"@atproto/api": "^0.13.31",
33
33
+
"@atproto/common": "^0.4.6",
34
34
+
"@atproto/identity": "^0.4.5",
35
35
+
"@atproto/jwk-jose": "0.1.5",
36
36
+
"@atproto/lex-cli": "^0.5.6",
37
37
+
"@atproto/lexicon": "^0.4.5",
38
38
+
"@atproto/oauth-client-node": "0.2.14",
39
39
+
"@atproto/sync": "^0.1.11",
40
40
+
"@atproto/syntax": "^0.3.1",
41
41
+
"@atproto/xrpc-server": "^0.7.8",
42
42
+
"@hono/node-server": "^1.13.8",
43
43
+
"@hono/node-ws": "^1.1.0",
44
44
+
"@opentelemetry/api": "^1.9.0",
45
45
+
"@opentelemetry/auto-instrumentations-node": "^0.58.0",
46
46
+
"@opentelemetry/exporter-metrics-otlp-http": "^0.200.0",
47
47
+
"@opentelemetry/exporter-trace-otlp-http": "^0.200.0",
48
48
+
"@opentelemetry/resources": "^2.0.0",
49
49
+
"@opentelemetry/sdk-metrics": "^2.0.0",
50
50
+
"@opentelemetry/sdk-node": "^0.200.0",
51
51
+
"@opentelemetry/semantic-conventions": "^1.32.0",
52
52
+
"@pyroscope/nodejs": "^0.4.5",
53
53
+
"assert": "^2.1.0",
54
54
+
"axios": "^1.7.9",
55
55
+
"better-sqlite3": "^12.4.1",
56
56
+
"chalk": "^5.4.1",
57
57
+
"chanfana": "^2.0.2",
58
58
+
"cors": "^2.8.5",
59
59
+
"dayjs": "^1.11.13",
60
60
+
"dotenv": "^16.4.7",
61
61
+
"drizzle-orm": "^0.44.2",
62
62
+
"dropbox": "^10.34.0",
63
63
+
"effect": "^3.14.22",
64
64
+
"envalid": "^8.0.0",
65
65
+
"express": "^5.1.0",
66
66
+
"googleapis": "^146.0.0",
67
67
+
"hono": "^4.4.7",
68
68
+
"http-proxy-middleware": "^3.0.5",
69
69
+
"ioredis": "^5.8.1",
70
70
+
"iron-session": "^8.0.4",
71
71
+
"jose": "^6.1.0",
72
72
+
"jsonwebtoken": "^9.0.2",
73
73
+
"kysely": "^0.27.5",
74
74
+
"lodash": "^4.17.21",
75
75
+
"nats": "^2.29.2",
76
76
+
"node-cron": "^4.2.1",
77
77
+
"pg": "^8.13.3",
78
78
+
"prompts": "^2.4.2",
79
79
+
"ramda": "^0.30.1",
80
80
+
"redis": "^4.7.0",
81
81
+
"redlock": "^5.0.0-beta.2",
82
82
+
"unstorage": "^1.14.4",
83
83
+
"url": "^0.11.4",
84
84
+
"uuid": "^11.1.0",
85
85
+
"ws": "^8.18.1",
86
86
+
"zod": "^3.24.1"
87
87
+
},
88
88
+
"devDependencies": {
89
89
+
"@biomejs/biome": "^2.2.3",
90
90
+
"@pkl-community/pkl": "^0.28.2",
91
91
+
"@types/express": "^5.0.2",
92
92
+
"@types/lodash": "^4.17.17",
93
93
+
"@types/node": "^22.13.0",
94
94
+
"@types/ramda": "^0.30.2",
95
95
+
"@types/service-worker-mock": "^2.0.1",
96
96
+
"concurrently": "^9.2.0",
97
97
+
"drizzle-kit": "^0.31.1",
98
98
+
"pkgroll": "^2.6.1",
99
99
+
"tsx": "^4.19.2",
100
100
+
"zx": "^8.5.4"
101
101
+
},
102
102
+
"exports": {
103
103
+
".": {
104
104
+
"import": "./dist/index.js"
105
105
+
}
106
106
+
}
107
107
+
}
+8
-7
apps/web/src/components/ScrobblesAreaChart/ScrobblesAreaChart.tsx
···
98
98
// eslint-disable-next-line react-hooks/exhaustive-deps
99
99
}, [pathname]);
100
100
101
101
+
const chartData =
102
102
+
pathname === "/" ||
103
103
+
pathname.startsWith("/dropbox") ||
104
104
+
(pathname.startsWith("/googledrive") && getScrobblesChart().length > 0)
105
105
+
? getScrobblesChart()
106
106
+
: data;
107
107
+
101
108
return (
102
109
<>
103
110
{!pathname.includes("/playlist/") && (
···
111
118
<AreaChart
112
119
width={300}
113
120
height={120}
114
114
-
data={
115
115
-
pathname === "/" ||
116
116
-
pathname.startsWith("/dropbox") ||
117
117
-
pathname.startsWith("/googledrive")
118
118
-
? getScrobblesChart()
119
119
-
: data
120
120
-
}
121
121
+
data={chartData}
121
122
className="top-[5px] right-[0px] left-[0px] bottom-[5px]"
122
123
>
123
124
<XAxis