Add match archiving, chat enhancements, and daily limits

- Match archives with swipe-to-archive and unread filtering
- Chat settings sheet and full-screen media modals
- Match notification modal for new matches
- Admin AI settings with model/provider configuration
- Daily response limit feature with recommended questions
- New test coverage for stores, hooks, and components
- Claude Code agent and command configurations

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
jjbruntonandClaude Opus 4.5 committed 2026-01-09 20:18:34 +00:00
1 parent 595d6bd394
commit b0f1700e40
57 files changed
+8359 -1661

No files matched your search

+71 -63
View File
@@ -11,69 +11,69 @@ export interface Profile {
/** RSA public key in JWK format for E2EE */
public_key_jwk?: Record<string, unknown> | null;
}
// Couple pairing
export interface Couple {
id: string;
invite_code: string;
created_at: string;
}
// Question pack
export interface QuestionPack {
id: string;
name: string;
description: string | null;
icon: string | null;
is_premium: boolean;
is_public: boolean;
sort_order: number;
created_at: string;
}
// Individual question
export interface Question {
id: string;
pack_id: string;
text: string;
partner_text?: string | null;
intensity: 1 | 2 | 3 | 4 | 5;
allowed_couple_genders?: string[] | null;
target_user_genders?: string[] | null;
created_at: string;
}
// User's answer type
export type AnswerType = 'yes' | 'no' | 'maybe';
// Match type when both partners agree
export type MatchType = 'yes_yes' | 'yes_maybe' | 'maybe_maybe';
// User response to a question
export interface Response {
id: string;
user_id: string;
question_id: string;
couple_id: string;
answer: AnswerType;
created_at: string;
}
// Match between partners
export interface Match {
id: string;
couple_id: string;
question_id: string;
match_type: MatchType;
is_new: boolean;
created_at: string;
}
// Extended match with question details
export interface MatchWithQuestion extends Match {
question: Question;
}
// Couple pairing
export interface Couple {
id: string;
invite_code: string;
created_at: string;
}
// Question pack
export interface QuestionPack {
id: string;
name: string;
description: string | null;
icon: string | null;
is_premium: boolean;
is_public: boolean;
sort_order: number;
created_at: string;
}
// Individual question
export interface Question {
id: string;
pack_id: string;
text: string;
partner_text?: string | null;
intensity: 1 | 2 | 3 | 4 | 5;
allowed_couple_genders?: string[] | null;
target_user_genders?: string[] | null;
created_at: string;
}
// User's answer type
export type AnswerType = 'yes' | 'no' | 'maybe';
// Match type when both partners agree
export type MatchType = 'yes_yes' | 'yes_maybe' | 'maybe_maybe';
// User response to a question
export interface Response {
id: string;
user_id: string;
question_id: string;
couple_id: string;
answer: AnswerType;
created_at: string;
}
// Match between partners
export interface Match {
id: string;
couple_id: string;
question_id: string;
match_type: MatchType;
is_new: boolean;
created_at: string;
}
// Extended match with question details
export interface MatchWithQuestion extends Match {
question: Question;
}
// Pack with progress info
export interface PackProgress {
pack: QuestionPack;
@@ -130,6 +130,14 @@ export interface Message {
category?: 'Neutral' | 'Romantic' | 'Playful' | 'Explicit' | string | null;
}
// Match archive (per-user)
export interface MatchArchive {
id: string;
match_id: string;
user_id: string;
archived_at: string;
}
// Master key for admin E2EE access
export interface MasterKey {
id: string;