feat(help-notifications): in-app troubleshooting, collapsibles, scroll-to-top

- Move NOTIFICATION_TROUBLESHOOTING content into HelpNotificationsView with prose styling
- Remove exact-alarms section from doc and view (feature removed from app/plugin)
- Add collapsible iOS/Android sections (open by default for current platform)
- Add rotating carets on collapsible summaries
- Add bullet for 10-minute rollover option in "If it still doesn't work"
- Add @tailwindcss/typography plugin for prose classes
- Reset #app scroll on route change so Help Notifications opens at top
This commit is contained in:
Jose Olarte III
2026-03-11 17:37:19 +08:00
parent ba8915e1fb
commit fb9d5165df
6 changed files with 223 additions and 16 deletions

View File

@@ -57,18 +57,6 @@ If you recently restarted iOS and dont see the notification, open **TimeSafar
3. Turn notifications **on**
4. If Android shows notification categories/channels for the app, ensure the relevant channel is allowed.
### Exact alarms (Android 12+ / some devices)
Daily notifications may require **Exact alarms** to fire at the precise time.
- Open **Settings****Apps****TimeSafari**
- Look for **Alarms & reminders** / **Exact alarms** (wording varies)
- Turn **Allow** on
If you dont see that option:
- Search Android settings for **Exact alarms**, **Alarms & reminders**, or **Special app access**
### Battery / background restrictions
Battery optimization can delay or block scheduled notifications.

29
package-lock.json generated
View File

@@ -106,6 +106,7 @@
"@commitlint/cli": "^18.6.1",
"@commitlint/config-conventional": "^18.6.2",
"@playwright/test": "^1.54.2",
"@tailwindcss/typography": "^0.5.19",
"@types/dom-webcodecs": "^0.1.7",
"@types/jest": "^30.0.0",
"@types/js-yaml": "^4.0.9",
@@ -8656,6 +8657,33 @@
"node": ">=10"
}
},
"node_modules/@tailwindcss/typography": {
"version": "0.5.19",
"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz",
"integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-selector-parser": "6.0.10"
},
"peerDependencies": {
"tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1"
}
},
"node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": {
"version": "6.0.10",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
"integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
"dev": true,
"license": "MIT",
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@timesafari/daily-notification-plugin": {
"version": "1.3.3",
"resolved": "git+https://gitea.anomalistdesign.com/trent_larson/daily-notification-plugin.git#b8d9b6247d670929418b12e7135d8dd3c9684277",
@@ -26523,6 +26551,7 @@
"version": "3.4.17",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
"arg": "^5.0.2",

View File

@@ -151,7 +151,6 @@
"@capacitor/share": "^6.0.3",
"@capacitor/status-bar": "^6.0.2",
"@capawesome/capacitor-file-picker": "^6.2.0",
"@timesafari/daily-notification-plugin": "git+https://gitea.anomalistdesign.com/trent_larson/daily-notification-plugin.git#master",
"@dicebear/collection": "^5.4.1",
"@dicebear/core": "^5.4.1",
"@ethersproject/hdnode": "^5.7.0",
@@ -162,12 +161,12 @@
"@fortawesome/free-solid-svg-icons": "^6.5.1",
"@fortawesome/vue-fontawesome": "^3.0.6",
"@jlongster/sql.js": "^1.6.7",
"nostr-tools": "^2.15.0",
"@peculiar/asn1-ecc": "^2.3.8",
"@peculiar/asn1-schema": "^2.3.8",
"@pvermeer/dexie-encrypted-addon": "^3.0.0",
"@simplewebauthn/browser": "^10.0.0",
"@simplewebauthn/server": "^10.0.0",
"@timesafari/daily-notification-plugin": "git+https://gitea.anomalistdesign.com/trent_larson/daily-notification-plugin.git#master",
"@tweenjs/tween.js": "^21.1.1",
"@types/qrcode": "^1.5.5",
"@veramo/core": "^5.6.0",
@@ -204,6 +203,7 @@
"lru-cache": "^10.2.0",
"luxon": "^3.4.4",
"merkletreejs": "^0.3.11",
"nostr-tools": "^2.15.0",
"notiwind": "^2.0.2",
"papaparse": "^5.4.1",
"pinia": "^2.1.7",
@@ -235,6 +235,7 @@
"@commitlint/cli": "^18.6.1",
"@commitlint/config-conventional": "^18.6.2",
"@playwright/test": "^1.54.2",
"@tailwindcss/typography": "^0.5.19",
"@types/dom-webcodecs": "^0.1.7",
"@types/jest": "^30.0.0",
"@types/js-yaml": "^4.0.9",

View File

@@ -433,8 +433,13 @@ router.beforeEach(async (to, _from, next) => {
}
});
// Add navigation success logging
// Add navigation success logging and scroll-to-top (app uses #app as scroll container, not window)
router.afterEach((to, from) => {
const app = document.getElementById("app");
if (app) {
app.scrollTop = 0;
app.scrollLeft = 0;
}
logger.debug(`[Router] ✅ Navigation completed:`, {
from: from?.path || "none",
to: to.path,

View File

@@ -27,6 +27,179 @@
</div>
<div>
<div
class="prose prose-slate max-w-none prose-h4:uppercase prose-h5:font-semibold"
>
<h3>Troubleshooting Notifications</h3>
<h4>1) Check your in-app notification settings</h4>
<ul>
<li>Tap <strong>Profile</strong> in the bottom bar</li>
<li>
Under <strong>Notifications</strong>, confirm:
<ul>
<li>
<strong>Daily Reminder</strong> is <strong>enabled</strong>
</li>
<li>The <strong>time</strong> is set correctly</li>
<li>The message looks correct</li>
</ul>
</li>
<li>
If its already enabled, try to:
<ul>
<li>Turn it <strong>off</strong></li>
<li>Turn it <strong>on</strong> again</li>
<li>Re-set the time and message</li>
</ul>
</li>
</ul>
<details class="prose-details mt-2" :open="isIOS">
<summary
class="cursor-pointer font-semibold uppercase text-inherit list-none flex items-center gap-2 [&::-webkit-details-marker]:hidden"
>
<font-awesome
icon="chevron-right"
class="details-chevron w-[0.75em] flex-shrink-0 transition-transform duration-200"
/>
2) iOS troubleshooting
</summary>
<div class="pl-0 mt-2">
<h5>Allow notifications for TimeSafari</h5>
<ol>
<li>
Open <strong>Settings</strong> <strong>Notifications</strong>
</li>
<li>Tap <strong>TimeSafari</strong></li>
<li>Turn <strong>Allow Notifications</strong> on</li>
<li>
Enable at least one delivery style (recommended):
<ul>
<li><strong>Lock Screen</strong></li>
<li><strong>Notification Center</strong></li>
<li><strong>Banners</strong></li>
</ul>
</li>
<li>
Optional but helpful:
<ul>
<li>
<strong>Sounds</strong> on (if you want an audible reminder)
</li>
</ul>
</li>
</ol>
<h5>Focus / Do Not Disturb</h5>
<p>
If youre using <strong>Focus</strong> or
<strong>Do Not Disturb</strong>, notifications may be silenced or
hidden.
</p>
<ul>
<li>Open <strong>Settings</strong> <strong>Focus</strong></li>
<li>
Check the active Focus mode and ensure
<strong>TimeSafari</strong> is allowed (or temporarily disable
Focus to test)
</li>
</ul>
<h5>After restarting your phone</h5>
<p>
If you recently restarted iOS and dont see the notification, open
<strong>TimeSafari</strong> once. (You dont need to change
anything.)
</p>
</div>
</details>
<details class="prose-details mt-2" :open="isAndroid">
<summary
class="cursor-pointer font-semibold uppercase text-inherit list-none flex items-center gap-2 [&::-webkit-details-marker]:hidden"
>
<font-awesome
icon="chevron-right"
class="details-chevron w-[0.75em] flex-shrink-0 transition-transform duration-200"
/>
3) Android troubleshooting
</summary>
<div class="pl-0 mt-2">
<h5>Allow notifications for TimeSafari</h5>
<ol>
<li>Open <strong>Settings</strong> <strong>Apps</strong></li>
<li>
Tap <strong>TimeSafari</strong>
<strong>Manage notifications</strong> (wording varies)
</li>
<li>Turn notifications <strong>on</strong></li>
<li>
If Android shows notification categories/channels for the app,
ensure the relevant channel is allowed.
</li>
</ol>
<h5>Battery / background restrictions</h5>
<p>
Battery optimization can delay or block scheduled notifications.
</p>
<ul>
<li>
Open <strong>Settings</strong> <strong>Apps</strong>
<strong>TimeSafari</strong>
<strong>Battery usage</strong> (wording varies)
</li>
<li>
If available:
<ul>
<li>
Set <strong>Battery usage</strong> to
<strong>Unrestricted</strong>
</li>
<li>Turn <strong>Allow background usage</strong> on</li>
<li>Disable optimization for TimeSafari</li>
</ul>
</li>
<li>
If your device has lists like <strong>Sleeping apps</strong> /
<strong>Restricted apps</strong>, remove TimeSafari from them
</li>
</ul>
<h5>After restarting your phone</h5>
<p>
Depending on the device manufacturer, Android can clear scheduled
notifications during a reboot. If you restarted recently:
</p>
<ul>
<li>
Open <strong>TimeSafari</strong> once (you dont need to change
anything)
</li>
</ul>
</div>
</details>
<h4>4) If it still doesnt work</h4>
<ul>
<li>Ensure youre on the latest TimeSafari app version.</li>
<li>
If you denied permission earlier, re-enable notifications in system
settings (above).
</li>
<li>
Try the <strong>Use 10-minute rollover (testing)</strong> option at
the bottom of this screen to confirm that notifications are firing
on your device.
</li>
<li>
As a last resort, uninstall/reinstall the app (youll need to enable
notifications again and reconfigure the daily reminder).
<strong>Important:</strong> Before uninstalling, back up your
identifier seed so you can import it back later:
<strong>Profile Data Management Backup Identifier Seed</strong>.
</li>
</ul>
</div>
<!-- Fast rollover testing -->
<label
class="flex items-center justify-between cursor-pointer mt-3 py-2"
@click="toggleReminderFastRollover"
@@ -76,11 +249,16 @@ export default class HelpNotificationsView extends Vue {
notifyingReminderMessage = "";
notifyingReminderTime = "";
reminderFastRolloverForTesting: boolean = false;
isIOS = false;
isAndroid = false;
notify!: ReturnType<typeof createNotifyHelpers>;
async mounted() {
this.notify = createNotifyHelpers(this.$notify);
const platform = Capacitor.getPlatform();
this.isIOS = platform === "ios";
this.isAndroid = platform === "android";
try {
const settings = await this.$settings();
@@ -163,3 +341,9 @@ export default class HelpNotificationsView extends Vue {
}
}
</script>
<style scoped>
.prose-details[open] .details-chevron {
transform: rotate(90deg);
}
</style>

View File

@@ -4,5 +4,5 @@ module.exports = {
theme: {
extend: {},
},
plugins: [],
plugins: [require("@tailwindcss/typography")],
};