v0.9.12 Fixed back swipe
This commit is contained in:
@@ -10,7 +10,7 @@
|
|||||||
PROJECT_NAME=jama
|
PROJECT_NAME=jama
|
||||||
|
|
||||||
# Image version to run (set by build.sh, or use 'latest')
|
# Image version to run (set by build.sh, or use 'latest')
|
||||||
JAMA_VERSION=0.9.11
|
JAMA_VERSION=0.9.12
|
||||||
|
|
||||||
# App port — the host port Docker maps to the container
|
# App port — the host port Docker maps to the container
|
||||||
PORT=3000
|
PORT=3000
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "jama-backend",
|
"name": "jama-backend",
|
||||||
"version": "0.9.11",
|
"version": "0.9.12",
|
||||||
"description": "TeamChat backend server",
|
"description": "TeamChat backend server",
|
||||||
"main": "src/index.js",
|
"main": "src/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ router.get('/group/:groupId', authMiddleware, (req, res) => {
|
|||||||
const { before, limit = 50 } = req.query;
|
const { before, limit = 50 } = req.query;
|
||||||
let query = `
|
let query = `
|
||||||
SELECT m.*,
|
SELECT m.*,
|
||||||
u.name as user_name, u.display_name as user_display_name, u.avatar as user_avatar, u.role as user_role, u.status as user_status, u.hide_admin_tag as user_hide_admin_tag, u.about_me as user_about_me,
|
u.name as user_name, u.display_name as user_display_name, u.avatar as user_avatar, u.role as user_role, u.status as user_status, u.hide_admin_tag as user_hide_admin_tag, u.about_me as user_about_me, u.allow_dm as user_allow_dm,
|
||||||
rm.content as reply_content, rm.image_url as reply_image_url,
|
rm.content as reply_content, rm.image_url as reply_image_url,
|
||||||
ru.name as reply_user_name, ru.display_name as reply_user_display_name,
|
ru.name as reply_user_name, ru.display_name as reply_user_display_name,
|
||||||
rm.is_deleted as reply_is_deleted
|
rm.is_deleted as reply_is_deleted
|
||||||
@@ -96,7 +96,7 @@ router.post('/group/:groupId', authMiddleware, (req, res) => {
|
|||||||
|
|
||||||
const message = db.prepare(`
|
const message = db.prepare(`
|
||||||
SELECT m.*,
|
SELECT m.*,
|
||||||
u.name as user_name, u.display_name as user_display_name, u.avatar as user_avatar, u.role as user_role,
|
u.name as user_name, u.display_name as user_display_name, u.avatar as user_avatar, u.role as user_role, u.allow_dm as user_allow_dm,
|
||||||
rm.content as reply_content, ru.name as reply_user_name, ru.display_name as reply_user_display_name
|
rm.content as reply_content, ru.name as reply_user_name, ru.display_name as reply_user_display_name
|
||||||
FROM messages m
|
FROM messages m
|
||||||
JOIN users u ON m.user_id = u.id
|
JOIN users u ON m.user_id = u.id
|
||||||
@@ -128,7 +128,7 @@ router.post('/group/:groupId/image', authMiddleware, uploadImage.single('image')
|
|||||||
|
|
||||||
const message = db.prepare(`
|
const message = db.prepare(`
|
||||||
SELECT m.*,
|
SELECT m.*,
|
||||||
u.name as user_name, u.display_name as user_display_name, u.avatar as user_avatar, u.role as user_role
|
u.name as user_name, u.display_name as user_display_name, u.avatar as user_avatar, u.role as user_role, u.allow_dm as user_allow_dm
|
||||||
FROM messages m JOIN users u ON m.user_id = u.id
|
FROM messages m JOIN users u ON m.user_id = u.id
|
||||||
WHERE m.id = ?
|
WHERE m.id = ?
|
||||||
`).get(result.lastInsertRowid);
|
`).get(result.lastInsertRowid);
|
||||||
|
|||||||
2
build.sh
2
build.sh
@@ -13,7 +13,7 @@
|
|||||||
# ─────────────────────────────────────────────────────────────
|
# ─────────────────────────────────────────────────────────────
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
VERSION="${1:-0.9.11}"
|
VERSION="${1:-0.9.12}"
|
||||||
ACTION="${2:-}"
|
ACTION="${2:-}"
|
||||||
REGISTRY="${REGISTRY:-}"
|
REGISTRY="${REGISTRY:-}"
|
||||||
IMAGE_NAME="jama"
|
IMAGE_NAME="jama"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "jama-frontend",
|
"name": "jama-frontend",
|
||||||
"version": "0.9.11",
|
"version": "0.9.12",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
@@ -149,6 +149,7 @@ export default function Message({ message: msg, prevMessage, currentUser, onRepl
|
|||||||
status: msg.user_status,
|
status: msg.user_status,
|
||||||
hide_admin_tag: msg.user_hide_admin_tag,
|
hide_admin_tag: msg.user_hide_admin_tag,
|
||||||
about_me: msg.user_about_me,
|
about_me: msg.user_about_me,
|
||||||
|
allow_dm: msg.user_allow_dm,
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -255,12 +255,30 @@ export default function Chat() {
|
|||||||
|
|
||||||
const selectGroup = (id) => {
|
const selectGroup = (id) => {
|
||||||
setActiveGroupId(id);
|
setActiveGroupId(id);
|
||||||
if (isMobile) setShowSidebar(false);
|
if (isMobile) {
|
||||||
|
setShowSidebar(false);
|
||||||
|
// Push a history entry so swipe-back returns to sidebar instead of exiting the app
|
||||||
|
window.history.pushState({ jamaChatOpen: true }, '');
|
||||||
|
}
|
||||||
// Clear notifications and unread count for this group
|
// Clear notifications and unread count for this group
|
||||||
setNotifications(prev => prev.filter(n => n.groupId !== id));
|
setNotifications(prev => prev.filter(n => n.groupId !== id));
|
||||||
setUnreadGroups(prev => { const next = new Map(prev); next.delete(id); return next; });
|
setUnreadGroups(prev => { const next = new Map(prev); next.delete(id); return next; });
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Handle browser back gesture on mobile — return to sidebar instead of exiting
|
||||||
|
useEffect(() => {
|
||||||
|
const handlePopState = (e) => {
|
||||||
|
if (isMobile && activeGroupId) {
|
||||||
|
setShowSidebar(true);
|
||||||
|
setActiveGroupId(null);
|
||||||
|
// Push another entry so subsequent back gestures are also intercepted
|
||||||
|
window.history.pushState({ jamaChatOpen: true }, '');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
window.addEventListener('popstate', handlePopState);
|
||||||
|
return () => window.removeEventListener('popstate', handlePopState);
|
||||||
|
}, [isMobile, activeGroupId]);
|
||||||
|
|
||||||
// Update page title AND PWA app badge with total unread count
|
// Update page title AND PWA app badge with total unread count
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const totalUnread = [...unreadGroups.values()].reduce((a, b) => a + b, 0);
|
const totalUnread = [...unreadGroups.values()].reduce((a, b) => a + b, 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user