A decentralized music tracking and discovery platform built on AT Protocol 🎵

Extract chartData and skip empty chart data

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