Skip to content
Success

Changes

Summary

  1. add biometric to android native (details)
  2. Fix stale dashboard counts + app pointing at dev Strapi host (details)
  3. build:app uses .env-prod (production app build) (details)
  4. Integrate Android Native Push Messaging on Chat with Firebase (details)
  5. Add chat entry point to the mobile dashboard (details)
  6. Restructure + restyle the mobile dashboard header (Option A) (details)
  7. changes to mobile header (details)
  8. chat: push to all devices, not only when the user is fully offline (details)
  9. Fix background chat push not displaying on Android + in-app toast deep-link (details)
  10. Fix Android OS Level notification (details)
  11. chat: image sharing (send + view photos), mirroring the voice-note pattern (details)
  12. add image handling and vice voice german transcritpion (details)
  13. add agreement notes to bpartner (details)
  14. add agreement notes to bpartner (details)
  15. add shipment printing to dashboard picklist card (details)
Commit d4225a17e2f7a04c2b1ae4b56fd7ee7a5efc4d23 by info
add biometric to android native
The file was modifiedandroid/app/build.gradle (diff)
The file was modifiedandroid/update-files/version.json (diff)
Commit 3d98d54f7d88326419b81c755704d9d10798c1ac by info
Fix stale dashboard counts + app pointing at dev Strapi host

Dashboard: the mobile index is keep-alive'd, so the openso-count/shipped
useFetch never re-ran on revisit (stale counts). Capture refresh and re-fetch
on page re-activation and on app foreground.

App Strapi host: the bundled app baked config.public.strapi from the local
.env (a dev host, unreachable from devices) while /api goes to prod — breaking
product thumbnails and media uploads. In the app build, strapi base/token now
follow apiBase (CAP_STRAPI_BASE/CAP_STRAPI_TOKEN override), so /files-api and
/media-api resolve on the same prod host as the API. Web build unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The file was modifiedapp/pages/mobile/index.vue (diff)
The file was modifiednuxt.config.ts (diff)
Commit e3623b1e780125b9d34da31e3993e4010320082a by info
build:app uses .env-prod (production app build)

The bundled app is a production app (apiBase = app.logship.de), so build it
with the prod env. This bakes the PROD Strapi token (dev≠prod), fixing media
uploads, and aligns all public config to prod. For a dev app build, override
the env/CAP_* vars.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The file was modifiedpackage.json (diff)
Commit cd3e4c34a3ba58e56b3ad45158f0e047b55ed0e9 by info
Integrate Android Native Push Messaging on Chat with Firebase
The file was modifiedandroid/capacitor.settings.gradle (diff)
The file was addedserver/api/push/register-native.post.ts
The file was modified.gitignore (diff)
The file was modifiedandroid/update-files/version.json (diff)
The file was modifiedpackage.json (diff)
The file was modifiedandroid/app/capacitor.build.gradle (diff)
The file was addedserver/utils/fcmNotifier.ts
The file was addedserver/utils/fcmDb.ts
The file was modifiedapp/composables/useChatSocket.ts (diff)
The file was modifiednuxt.config.ts (diff)
The file was modifiedserver/routes/chat/ws.ts (diff)
The file was addedandroid/app/google-services.json
The file was modifiedandroid/app/build.gradle (diff)
The file was addedapp/plugins/20.native-push.client.ts
The file was modified.env-prod (diff)
The file was modifiedserver/api/chat/voice.post.ts (diff)
Commit d0ccdc3e4e26e7ea789d8b3813f0acd875ee8be8 by info
Add chat entry point to the mobile dashboard

The chat window (/chat) was bundled into the app but unreachable — the desktop
<ChatBadge> lives in navbars the /mobile/* pages don't use, and the mobile
layout has no shared nav. Add the chat entry to the mobile dashboard:
- <ChatBadge> in the header (live unread badge; taps → /chat on mobile),
- a gated "Chat" tile in the task grid for discoverability.

Both reuse useChatEligible/useChatUnread (no new state, no server change) and
self-hide for non-staff / when chat is disabled.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The file was modifiedapp/pages/mobile/index.vue (diff)
Commit a95497c94c62d0e7c8cd1c8c5730f0da32f48d7e by info
Restructure + restyle the mobile dashboard header (Option A)

Modernize the cramped header: replace the centered "LogShip Mobile" title and
the 4-button cluster with a clean profile-driven bar.

- Left: gradient avatar (user initials) + first name + warehouse/org; tapping
  opens the profile sheet.
- Right: only the two task actions — scanner toggle and chat (with a live red
  unread-count badge).
- Theme toggle + logout move into the profile sheet (UModal, now titled
  "Profil"), decluttering the bar.

Chat unread badge reuses useChatUnread; the chat button is gated by
useChatEligible (hidden for non-staff). No server change.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The file was modifiedapp/pages/mobile/index.vue (diff)
Commit ce4a701251b6e94be5f0a1bf251e4cc969852d08 by info
changes to mobile header
The file was modifiedandroid/app/build.gradle (diff)
The file was modifiedandroid/update-files/version.json (diff)
Commit 73dc5819a3a0a6870053a356ebd2ed03ba392914 by info
chat: push to all devices, not only when the user is fully offline

Presence is per-USER (online if ANY socket is connected), but the FCM/web-push
fallback was gated on the whole user being offline. With two devices on one
login, a foreground device kept the user "online", so the server skipped the
push entirely and the backgrounded 2nd device got nothing.

Send the native FCM to ALL the recipient's devices on every message, regardless
of presence. Foreground devices receive it silently (no pushNotificationReceived
handler → no tray; the live socket already rendered it), so there's no
double-notify; backgrounded/killed devices now get the tray notification.
Web push stays offline-only (an active browser tab already showed it live).

Applied in both the text (ws.ts) and voice-note (voice.post.ts) paths.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The file was modifiedserver/api/chat/voice.post.ts (diff)
The file was modifiedserver/routes/chat/ws.ts (diff)
Commit 346a27eec2e6129c0607b7b41c4805ca4eb20e59 by info
Fix background chat push not displaying on Android + in-app toast deep-link

Background FCM pushes played a sound but showed nothing in the tray/heads-up:
the 'chat' notification channel was only created from JS (never runs on a
killed app), with no small icon and no manifest fallback — so Android 8+
silently dropped the notification (posted to a non-existent channel).

- MainActivity: create the high-importance 'chat' channel NATIVELY in onCreate
  so it always exists (persists when killed) → heads-up + shade.
- ic_stat_notify.xml: a proper white notification small icon.
- AndroidManifest: firebase default_notification_icon + default_notification_channel_id='chat'.
- fcmNotifier: log sends (no-credential / no-tokens / sent N/M / per-token error)
  so we can confirm pushes are actually sent vs a display problem.
- useChatSocket: the in-app toast's "open" now navigates to /chat on mobile
  (it previously only toggled the desktop drawer, which doesn't render on mobile).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The file was modifiedandroid/app/src/main/AndroidManifest.xml (diff)
The file was modifiedserver/utils/fcmNotifier.ts (diff)
The file was addedandroid/app/src/main/res/drawable/ic_stat_notify.xml
The file was modifiedandroid/app/src/main/java/com/logship/mobile/MainActivity.java (diff)
The file was modifiedapp/composables/useChatSocket.ts (diff)
Commit 96c1a8ae05278cee2c12cee066e03ea59634a5f7 by info
Fix Android OS Level notification
The file was modifiedandroid/app/build.gradle (diff)
The file was modifiedandroid/update-files/version.json (diff)
Commit 3b24faa650308e06fc6dd652371f416b59b91483 by info
chat: image sharing (send + view photos), mirroring the voice-note pattern

Adds image messages to the staff chat, stored self-contained in chat.db like
voice notes (no Strapi/iDempiere coupling):

- chatDb: image_notes table + insert/get/link fns + retention sweep.
- POST /api/chat/image: multipart upload → image_notes + a message carrying
  meta {kind:'image', imageId}, fanned out over the socket + pushed (📷 Bild
  label). Type guard (jpeg/png/webp/gif) + 8MB cap. No post-processing.
- GET /api/chat/image/:id: serves the blob, party-authorized like the voice route.
- useChat.sendImage (optimistic localUrl preview) + a shared downscaleImage util
  (≤1600px / q0.82, GIFs passed through) so blobs stay small in sqlite.
- Drawer.vue + pages/chat.vue (kept in sync): a 📷 composer button (hidden
  <input accept=image/*> → Android camera/gallery), an image bubble (thumbnail
  opens full-size), and image CSS.

Also fixes media loading in the bundled app: <img>/<audio> element loads bypass
the fetch wrapper, so chatMediaUrl() makes voice/image URLs absolute + token-bearing
in the app, and the voice/image serve routes accept ?access_token= as an auth
fallback (web is unchanged — relative + cookie). This also makes VOICE playback
work in the app for the first time.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The file was modifiedserver/api/chat/voice/[id].get.ts (diff)
The file was addedserver/api/chat/image.post.ts
The file was addedserver/api/chat/image/[id].get.ts
The file was addedapp/composables/useImageDownscale.ts
The file was modifiedapp/components/chat/Drawer.vue (diff)
The file was modifiedapp/composables/useChat.ts (diff)
The file was modifiedserver/utils/chatDb.ts (diff)
The file was addedapp/composables/useChatMedia.ts
The file was modifiedapp/pages/chat.vue (diff)
Commit 10feacd40f1f4e945f057bbeb44cd9972da8d3d2 by info
add image handling and vice voice german transcritpion
The file was modifiedandroid/app/build.gradle (diff)
The file was modifiedandroid/update-files/version.json (diff)
The file was modifiedapp/pages/chat.vue (diff)
The file was modifiedserver/api/chat/image.post.ts (diff)
The file was modifiedserver/utils/chatDb.ts (diff)
The file was modifiedapp/components/chat/Drawer.vue (diff)
The file was modifiedapp/composables/useChat.ts (diff)
The file was removedserver/api/chat/image/[id].get.ts
Commit 8eb323432715780fe53e768237f38112b4c77756 by info
add agreement notes to bpartner
The file was addedserver/api/partners/agreements/update.put.ts
The file was addedserver/api/partners/agreements/destroy.delete.ts
The file was modifiedandroid/app/build.gradle (diff)
The file was modifiedreference/recipes.md (diff)
The file was addedserver/api/partners/agreements/index.get.ts
The file was modifiedandroid/update-files/version.json (diff)
The file was modifiedapp/components/partners/PartnerForm.vue (diff)
The file was addedapp/components/RichTextEditor.vue
The file was addedapp/components/partners/PartnerAgreementNotesEditor.vue
The file was modifiedapp/assets/langs/shared.js (diff)
The file was addedserver/api/partners/agreements/store.post.ts
Commit e0259e37b18917e174f7d0436a1fca990a7106da by info
add agreement notes to bpartner
The file was modifiedapp/components/partners/PartnerAgreementNotesEditor.vue (diff)
The file was modifiedserver/api/partners/agreements/update.put.ts (diff)
The file was modifiednuxt.config.ts (diff)
The file was modifiedserver/api/partners/agreements/store.post.ts (diff)
The file was modifiedapp/assets/langs/shared.js (diff)
The file was modifiedapp/components/RichTextEditor.vue (diff)
Commit 860b3f6d10c00e06580690356df286f6129ac7f1 by info
add shipment printing to dashboard picklist card
The file was modifiedapp/components/dashboard/PicklistGenerateModal.vue (diff)
The file was modifiedapp/composables/usePicklistPdf.ts (diff)