Tracked Subscriptions
@@ -1464,6 +1529,13 @@ export default function SubscriptionsPage() {
) : (
<>
{renderSubscriptionRows(sortedActive, true)}
+ {sortedPaused.length > 0 && subscriptionSort === 'cadence' && (
+
+
+ Paused · {sortedPaused.length}
+
+
+ )}
{renderSubscriptionRows(sortedPaused, false)}
>
)}
diff --git a/package-lock.json b/package-lock.json
index 3e12b65..0202b7d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -25,6 +25,7 @@
"@simplewebauthn/server": "^13.0.0",
"@tanstack/react-query": "^5.100.9",
"@tanstack/react-query-devtools": "^5.100.9",
+ "@tanstack/react-virtual": "^3.14.2",
"bcryptjs": "^2.4.3",
"better-sqlite3": "^12.9.0",
"class-variance-authority": "^0.7.0",
@@ -4122,6 +4123,33 @@
"react": "^18 || ^19"
}
},
+ "node_modules/@tanstack/react-virtual": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.14.2.tgz",
+ "integrity": "sha512-IpWnmCLvuymRfeeLNVXIzNEYBFLpd3drVIS91sqV78VTZFyldlChkOocZRCPp1B+Wnk09bcLNme8WaMU/9/9bQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@tanstack/virtual-core": "3.17.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@tanstack/virtual-core": {
+ "version": "3.17.0",
+ "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.17.0.tgz",
+ "integrity": "sha512-gOxY/hFkPh/XQYhnThBHzkbkX3Ed+z/iushyz+R+JAr213aXxUDgQoTgTdrDpBSRsjFM73P/KfUyWmaF9WHMkQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
"node_modules/@trickfilm400/rollup-plugin-off-main-thread": {
"version": "3.0.0-pre1",
"resolved": "https://registry.npmjs.org/@trickfilm400/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-3.0.0-pre1.tgz",
diff --git a/package.json b/package.json
index 72f8dde..a588626 100644
--- a/package.json
+++ b/package.json
@@ -26,8 +26,11 @@
"@radix-ui/react-switch": "^1.1.1",
"@radix-ui/react-tabs": "^1.1.1",
"@radix-ui/react-tooltip": "^1.1.3",
+ "@simplewebauthn/browser": "^13.0.0",
+ "@simplewebauthn/server": "^13.0.0",
"@tanstack/react-query": "^5.100.9",
"@tanstack/react-query-devtools": "^5.100.9",
+ "@tanstack/react-virtual": "^3.14.2",
"bcryptjs": "^2.4.3",
"better-sqlite3": "^12.9.0",
"class-variance-authority": "^0.7.0",
@@ -40,8 +43,6 @@
"node-cron": "^4.2.1",
"nodemailer": "^8.0.9",
"openid-client": "^5.7.1",
- "@simplewebauthn/browser": "^13.0.0",
- "@simplewebauthn/server": "^13.0.0",
"otplib": "^13.4.1",
"qrcode": "^1.5.4",
"react": "^18.3.1",
diff --git a/routes/dataSources.js b/routes/dataSources.js
index bdacaff..9cdb02c 100644
--- a/routes/dataSources.js
+++ b/routes/dataSources.js
@@ -102,7 +102,8 @@ router.get('/simplefin/status', (req, res) => {
'SELECT 1 FROM bill_merchant_rules WHERE user_id = ? LIMIT 1'
).get(req.user.id);
- res.json({ enabled, sync_days, seed_days, has_connections: hasConnections, has_merchant_rules: hasMerchantRules });
+ const timezone = process.env.TZ || Intl.DateTimeFormat().resolvedOptions().timeZone || null;
+ res.json({ enabled, sync_days, seed_days, has_connections: hasConnections, has_merchant_rules: hasMerchantRules, timezone });
});
// ─── POST /api/data-sources/simplefin/connect ────────────────────────────────