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:
@@ -57,18 +57,6 @@ If you recently restarted iOS and don’t see the notification, open **TimeSafar
|
|||||||
3. Turn notifications **on**
|
3. Turn notifications **on**
|
||||||
4. If Android shows notification categories/channels for the app, ensure the relevant channel is allowed.
|
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 don’t see that option:
|
|
||||||
|
|
||||||
- Search Android settings for **Exact alarms**, **Alarms & reminders**, or **Special app access**
|
|
||||||
|
|
||||||
### Battery / background restrictions
|
### Battery / background restrictions
|
||||||
|
|
||||||
Battery optimization can delay or block scheduled notifications.
|
Battery optimization can delay or block scheduled notifications.
|
||||||
|
|||||||
29
package-lock.json
generated
29
package-lock.json
generated
@@ -106,6 +106,7 @@
|
|||||||
"@commitlint/cli": "^18.6.1",
|
"@commitlint/cli": "^18.6.1",
|
||||||
"@commitlint/config-conventional": "^18.6.2",
|
"@commitlint/config-conventional": "^18.6.2",
|
||||||
"@playwright/test": "^1.54.2",
|
"@playwright/test": "^1.54.2",
|
||||||
|
"@tailwindcss/typography": "^0.5.19",
|
||||||
"@types/dom-webcodecs": "^0.1.7",
|
"@types/dom-webcodecs": "^0.1.7",
|
||||||
"@types/jest": "^30.0.0",
|
"@types/jest": "^30.0.0",
|
||||||
"@types/js-yaml": "^4.0.9",
|
"@types/js-yaml": "^4.0.9",
|
||||||
@@ -8656,6 +8657,33 @@
|
|||||||
"node": ">=10"
|
"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": {
|
"node_modules/@timesafari/daily-notification-plugin": {
|
||||||
"version": "1.3.3",
|
"version": "1.3.3",
|
||||||
"resolved": "git+https://gitea.anomalistdesign.com/trent_larson/daily-notification-plugin.git#b8d9b6247d670929418b12e7135d8dd3c9684277",
|
"resolved": "git+https://gitea.anomalistdesign.com/trent_larson/daily-notification-plugin.git#b8d9b6247d670929418b12e7135d8dd3c9684277",
|
||||||
@@ -26523,6 +26551,7 @@
|
|||||||
"version": "3.4.17",
|
"version": "3.4.17",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@alloc/quick-lru": "^5.2.0",
|
"@alloc/quick-lru": "^5.2.0",
|
||||||
"arg": "^5.0.2",
|
"arg": "^5.0.2",
|
||||||
|
|||||||
@@ -151,7 +151,6 @@
|
|||||||
"@capacitor/share": "^6.0.3",
|
"@capacitor/share": "^6.0.3",
|
||||||
"@capacitor/status-bar": "^6.0.2",
|
"@capacitor/status-bar": "^6.0.2",
|
||||||
"@capawesome/capacitor-file-picker": "^6.2.0",
|
"@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/collection": "^5.4.1",
|
||||||
"@dicebear/core": "^5.4.1",
|
"@dicebear/core": "^5.4.1",
|
||||||
"@ethersproject/hdnode": "^5.7.0",
|
"@ethersproject/hdnode": "^5.7.0",
|
||||||
@@ -162,12 +161,12 @@
|
|||||||
"@fortawesome/free-solid-svg-icons": "^6.5.1",
|
"@fortawesome/free-solid-svg-icons": "^6.5.1",
|
||||||
"@fortawesome/vue-fontawesome": "^3.0.6",
|
"@fortawesome/vue-fontawesome": "^3.0.6",
|
||||||
"@jlongster/sql.js": "^1.6.7",
|
"@jlongster/sql.js": "^1.6.7",
|
||||||
"nostr-tools": "^2.15.0",
|
|
||||||
"@peculiar/asn1-ecc": "^2.3.8",
|
"@peculiar/asn1-ecc": "^2.3.8",
|
||||||
"@peculiar/asn1-schema": "^2.3.8",
|
"@peculiar/asn1-schema": "^2.3.8",
|
||||||
"@pvermeer/dexie-encrypted-addon": "^3.0.0",
|
"@pvermeer/dexie-encrypted-addon": "^3.0.0",
|
||||||
"@simplewebauthn/browser": "^10.0.0",
|
"@simplewebauthn/browser": "^10.0.0",
|
||||||
"@simplewebauthn/server": "^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",
|
"@tweenjs/tween.js": "^21.1.1",
|
||||||
"@types/qrcode": "^1.5.5",
|
"@types/qrcode": "^1.5.5",
|
||||||
"@veramo/core": "^5.6.0",
|
"@veramo/core": "^5.6.0",
|
||||||
@@ -204,6 +203,7 @@
|
|||||||
"lru-cache": "^10.2.0",
|
"lru-cache": "^10.2.0",
|
||||||
"luxon": "^3.4.4",
|
"luxon": "^3.4.4",
|
||||||
"merkletreejs": "^0.3.11",
|
"merkletreejs": "^0.3.11",
|
||||||
|
"nostr-tools": "^2.15.0",
|
||||||
"notiwind": "^2.0.2",
|
"notiwind": "^2.0.2",
|
||||||
"papaparse": "^5.4.1",
|
"papaparse": "^5.4.1",
|
||||||
"pinia": "^2.1.7",
|
"pinia": "^2.1.7",
|
||||||
@@ -235,6 +235,7 @@
|
|||||||
"@commitlint/cli": "^18.6.1",
|
"@commitlint/cli": "^18.6.1",
|
||||||
"@commitlint/config-conventional": "^18.6.2",
|
"@commitlint/config-conventional": "^18.6.2",
|
||||||
"@playwright/test": "^1.54.2",
|
"@playwright/test": "^1.54.2",
|
||||||
|
"@tailwindcss/typography": "^0.5.19",
|
||||||
"@types/dom-webcodecs": "^0.1.7",
|
"@types/dom-webcodecs": "^0.1.7",
|
||||||
"@types/jest": "^30.0.0",
|
"@types/jest": "^30.0.0",
|
||||||
"@types/js-yaml": "^4.0.9",
|
"@types/js-yaml": "^4.0.9",
|
||||||
|
|||||||
@@ -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) => {
|
router.afterEach((to, from) => {
|
||||||
|
const app = document.getElementById("app");
|
||||||
|
if (app) {
|
||||||
|
app.scrollTop = 0;
|
||||||
|
app.scrollLeft = 0;
|
||||||
|
}
|
||||||
logger.debug(`[Router] ✅ Navigation completed:`, {
|
logger.debug(`[Router] ✅ Navigation completed:`, {
|
||||||
from: from?.path || "none",
|
from: from?.path || "none",
|
||||||
to: to.path,
|
to: to.path,
|
||||||
|
|||||||
@@ -27,6 +27,179 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<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 it’s 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 you’re 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 don’t see the notification, open
|
||||||
|
<strong>TimeSafari</strong> once. (You don’t 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 don’t need to change
|
||||||
|
anything)
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<h4>4) If it still doesn’t work</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Ensure you’re 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 (you’ll 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
|
<label
|
||||||
class="flex items-center justify-between cursor-pointer mt-3 py-2"
|
class="flex items-center justify-between cursor-pointer mt-3 py-2"
|
||||||
@click="toggleReminderFastRollover"
|
@click="toggleReminderFastRollover"
|
||||||
@@ -76,11 +249,16 @@ export default class HelpNotificationsView extends Vue {
|
|||||||
notifyingReminderMessage = "";
|
notifyingReminderMessage = "";
|
||||||
notifyingReminderTime = "";
|
notifyingReminderTime = "";
|
||||||
reminderFastRolloverForTesting: boolean = false;
|
reminderFastRolloverForTesting: boolean = false;
|
||||||
|
isIOS = false;
|
||||||
|
isAndroid = false;
|
||||||
|
|
||||||
notify!: ReturnType<typeof createNotifyHelpers>;
|
notify!: ReturnType<typeof createNotifyHelpers>;
|
||||||
|
|
||||||
async mounted() {
|
async mounted() {
|
||||||
this.notify = createNotifyHelpers(this.$notify);
|
this.notify = createNotifyHelpers(this.$notify);
|
||||||
|
const platform = Capacitor.getPlatform();
|
||||||
|
this.isIOS = platform === "ios";
|
||||||
|
this.isAndroid = platform === "android";
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const settings = await this.$settings();
|
const settings = await this.$settings();
|
||||||
@@ -163,3 +341,9 @@ export default class HelpNotificationsView extends Vue {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.prose-details[open] .details-chevron {
|
||||||
|
transform: rotate(90deg);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -4,5 +4,5 @@ module.exports = {
|
|||||||
theme: {
|
theme: {
|
||||||
extend: {},
|
extend: {},
|
||||||
},
|
},
|
||||||
plugins: [],
|
plugins: [require("@tailwindcss/typography")],
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user