**Major Features Added:** - **Inline Reply System**: Replace compose screen with inline reply boxes - **Thread Navigation**: Parent/child navigation with jump functionality - **Chain Flow UI**: Reply counts, expand/collapse animations, visual hierarchy - **Enhanced Animations**: Smooth transitions, hover effects, micro-interactions **Frontend Changes:** - **ThreadedCommentWidget**: Complete rewrite with animations and navigation - **ThreadNode Model**: Added parent references and descendant counting - **ThreadedConversationScreen**: Integrated navigation handlers - **PostDetailScreen**: Replaced with threaded conversation view - **ComposeScreen**: Added reply indicators and context - **PostActions**: Fixed visibility checks for chain buttons **Backend Changes:** - **API Route**: Added /posts/:id/thread endpoint - **Post Repository**: Include allow_chain and visibility fields in feed - **Thread Handler**: Support for fetching post chains **UI/UX Improvements:** - **Reply Context**: Clear indication when replying to specific posts - **Character Counting**: 500 character limit with live counter - **Visual Hierarchy**: Depth-based indentation and styling - **Smooth Animations**: SizeTransition, FadeTransition, hover states - **Chain Navigation**: Parent/child buttons with visual feedback **Technical Enhancements:** - **Animation Controllers**: Proper lifecycle management - **State Management**: Clean separation of concerns - **Navigation Callbacks**: Reusable navigation system - **Error Handling**: Graceful fallbacks and user feedback This creates a Reddit-style threaded conversation experience with smooth animations, inline replies, and intuitive navigation between posts in a chain.
74 lines
2.8 KiB
SQL
74 lines
2.8 KiB
SQL
-- Optimizing E2EE Schema
|
|
-- Migration ID: 20260127000002
|
|
-- Description: Creates properly structured tables for Signal Protocol keys and messages to replace JSON blobs.
|
|
|
|
-- 1. One-Time Prekeys
|
|
-- Stores individual one-time keys. Critical for atomic "fetch and consume".
|
|
CREATE TABLE IF NOT EXISTS public.one_time_prekeys (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id UUID NOT NULL, -- References profiles(id) usually, but loosen constraint if profiles not strictly sync'd yet
|
|
key_id INTEGER NOT NULL,
|
|
public_key TEXT NOT NULL,
|
|
signature TEXT NOT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
CONSTRAINT unique_otk_user_key UNIQUE (user_id, key_id)
|
|
);
|
|
|
|
-- Index for finding keys quickly by user
|
|
CREATE INDEX IF NOT EXISTS idx_otk_user_id ON public.one_time_prekeys(user_id);
|
|
|
|
-- 2. Signed Prekeys
|
|
-- Semi-permanent keys signed by identity key.
|
|
CREATE TABLE IF NOT EXISTS public.signed_prekeys (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id UUID NOT NULL,
|
|
key_id INTEGER NOT NULL,
|
|
public_key TEXT NOT NULL,
|
|
signature TEXT NOT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
CONSTRAINT unique_spk_user_key UNIQUE (user_id, key_id)
|
|
);
|
|
|
|
-- Index to quickly get the latest signed prekey
|
|
CREATE INDEX IF NOT EXISTS idx_spk_user_created ON public.signed_prekeys(user_id, created_at DESC);
|
|
|
|
-- 3. Identities
|
|
-- Long-term identity keys.
|
|
CREATE TABLE IF NOT EXISTS public.identities (
|
|
user_id UUID PRIMARY KEY,
|
|
registration_id INTEGER NOT NULL,
|
|
public_key TEXT NOT NULL, -- Identity Key Public
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- 4. Secure Messages
|
|
-- Optimized storage for E2EE payloads.
|
|
-- Note: Replaces or complements 'encrypted_messages' depending on migration strategy.
|
|
CREATE TABLE IF NOT EXISTS public.secure_messages (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
conversation_id UUID NOT NULL,
|
|
sender_id UUID NOT NULL,
|
|
receiver_id UUID NOT NULL,
|
|
ciphertext TEXT NOT NULL, -- Base64 encoded encrypted payload
|
|
iv TEXT NOT NULL, -- Base64 encoded IV
|
|
key_version TEXT NOT NULL, -- e.g. "v1", "signal-session-id"
|
|
message_type INTEGER DEFAULT 1,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
delivered_at TIMESTAMPTZ,
|
|
read_at TIMESTAMPTZ
|
|
);
|
|
|
|
-- Composite index for fast pagination of chat history
|
|
CREATE INDEX IF NOT EXISTS idx_secure_msg_conv_created ON public.secure_messages(conversation_id, created_at DESC);
|
|
|
|
-- 5. E2EE Sessions (Optional/Future Proofing)
|
|
-- Stores session state if server-side session management is desired
|
|
CREATE TABLE IF NOT EXISTS public.e2ee_sessions (
|
|
user_id UUID NOT NULL,
|
|
device_id UUID NOT NULL,
|
|
session_state TEXT NOT NULL, -- Serialized session state
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
PRIMARY KEY (user_id, device_id)
|
|
);
|