From 4c18afaeaece69cd67999c5e1f6511dbac81ca49 Mon Sep 17 00:00:00 2001 From: Jamie Brunton Date: Sun, 1 Feb 2026 14:35:16 +0000 Subject: [PATCH] feat: add live draw feature and clean up docs Co-Authored-By: Claude Opus 4.5 --- apps/admin/src/pages/users/UserDetailPage.tsx | 155 +- apps/mobile/REFACTORING_PLAN.md | 573 -- apps/mobile/REFACTORING_TASKS.md | 237 - .../android/app/src/main/AndroidManifest.xml | 8 + .../java/com/sauci/app/widget/LiveDraw.java | 6 + .../main/res/drawable/livedraw_preview.png | Bin 0 -> 704962 bytes .../app/src/main/res/values/strings.xml | 1 + .../main/res/xml/widgetprovider_livedraw.xml | 21 + apps/mobile/android/sentry.properties | 4 - apps/mobile/app.json | 29 +- apps/mobile/app/(app)/_layout.tsx | 9 +- apps/mobile/app/(app)/index.tsx | 5 +- apps/mobile/app/(app)/live-draw.tsx | 3 + .../assets/widget-preview/live-draw.png | Bin 0 -> 704962 bytes apps/mobile/index.js | 6 + apps/mobile/ios/Podfile | 14 + apps/mobile/ios/Podfile.lock | 172 +- .../ios/Sauci.xcodeproj/project.pbxproj | 489 +- apps/mobile/ios/Sauci/Sauci.entitlements | 4 + apps/mobile/ios/sentry.properties | 4 - .../widget-bridge/android/build.gradle | 63 + .../android/src/main/AndroidManifest.xml | 1 + .../widgetbridge/WidgetBridgeModule.kt | 48 + .../widget-bridge/expo-module.config.json | 9 + apps/mobile/modules/widget-bridge/index.ts | 11 + .../widget-bridge/ios/WidgetBridge.podspec | 15 + .../ios/WidgetBridgeModule.swift | 19 + apps/mobile/package.json | 7 +- .../src/components/discovery/LiveDrawTile.tsx | 118 + apps/mobile/src/components/discovery/index.ts | 1 + .../src/features/live-draw/LiveDrawScreen.tsx | 273 + .../live-draw/components/DrawingCanvas.tsx | 224 + .../components/DrawingShareModal.tsx | 401 + .../live-draw/components/DrawingToolbar.tsx | 192 + .../src/features/live-draw/constants.ts | 22 + .../live-draw/hooks/useCanvasCapture.ts | 54 + .../live-draw/hooks/useDrawingHistory.ts | 97 + .../live-draw/hooks/useDrawingSync.ts | 228 + apps/mobile/src/features/live-draw/index.ts | 1 + apps/mobile/src/features/live-draw/types.ts | 24 + .../features/live-draw/utils/widgetBridge.ts | 22 + .../live-draw/utils/widgetImageExport.ts | 71 + .../live-draw/widgets/LiveDrawWidget.tsx | 59 + .../live-draw/widgets/widgetTaskHandler.tsx | 26 + .../widget/Assets.xcassets/Contents.json | 6 + apps/mobile/targets/widget/Info.plist | 11 + .../targets/widget/LiveDrawWidget.swift | 83 + .../targets/widget/expo-target.config.js | 12 + .../targets/widget/generated.entitlements | 10 + apps/mobile/targets/widget/index.swift | 9 + .../functions/delete-relationship/index.ts | 6 + .../20260201103117_add_live_draw_sessions.sql | 28 + .../data-retrieval-tasks.md | 0 docs/frontend-optimization-plan.md | 522 - {apps/mobile => docs}/release-notes.md | 0 apps/mobile/RELEASING.md => docs/releasing.md | 0 docs/remove-e2ee-plan.md | 427 - missing-inverse-pairs-crafted.md | 8447 ----------------- missing-inverse-pairs.md | 796 -- new-question-types-draft.md | 256 - package-lock.json | 5186 +++++++--- package.json | 17 +- scripts/fix-hoisting.js | 40 + 63 files changed, 6728 insertions(+), 12854 deletions(-) delete mode 100644 apps/mobile/REFACTORING_PLAN.md delete mode 100644 apps/mobile/REFACTORING_TASKS.md create mode 100644 apps/mobile/android/app/src/main/java/com/sauci/app/widget/LiveDraw.java create mode 100755 apps/mobile/android/app/src/main/res/drawable/livedraw_preview.png create mode 100644 apps/mobile/android/app/src/main/res/xml/widgetprovider_livedraw.xml delete mode 100644 apps/mobile/android/sentry.properties create mode 100644 apps/mobile/app/(app)/live-draw.tsx create mode 100755 apps/mobile/assets/widget-preview/live-draw.png create mode 100644 apps/mobile/index.js delete mode 100644 apps/mobile/ios/sentry.properties create mode 100644 apps/mobile/modules/widget-bridge/android/build.gradle create mode 100644 apps/mobile/modules/widget-bridge/android/src/main/AndroidManifest.xml create mode 100644 apps/mobile/modules/widget-bridge/android/src/main/java/expo/modules/widgetbridge/WidgetBridgeModule.kt create mode 100644 apps/mobile/modules/widget-bridge/expo-module.config.json create mode 100644 apps/mobile/modules/widget-bridge/index.ts create mode 100644 apps/mobile/modules/widget-bridge/ios/WidgetBridge.podspec create mode 100644 apps/mobile/modules/widget-bridge/ios/WidgetBridgeModule.swift create mode 100644 apps/mobile/src/components/discovery/LiveDrawTile.tsx create mode 100644 apps/mobile/src/features/live-draw/LiveDrawScreen.tsx create mode 100644 apps/mobile/src/features/live-draw/components/DrawingCanvas.tsx create mode 100644 apps/mobile/src/features/live-draw/components/DrawingShareModal.tsx create mode 100644 apps/mobile/src/features/live-draw/components/DrawingToolbar.tsx create mode 100644 apps/mobile/src/features/live-draw/constants.ts create mode 100644 apps/mobile/src/features/live-draw/hooks/useCanvasCapture.ts create mode 100644 apps/mobile/src/features/live-draw/hooks/useDrawingHistory.ts create mode 100644 apps/mobile/src/features/live-draw/hooks/useDrawingSync.ts create mode 100644 apps/mobile/src/features/live-draw/index.ts create mode 100644 apps/mobile/src/features/live-draw/types.ts create mode 100644 apps/mobile/src/features/live-draw/utils/widgetBridge.ts create mode 100644 apps/mobile/src/features/live-draw/utils/widgetImageExport.ts create mode 100644 apps/mobile/src/features/live-draw/widgets/LiveDrawWidget.tsx create mode 100644 apps/mobile/src/features/live-draw/widgets/widgetTaskHandler.tsx create mode 100644 apps/mobile/targets/widget/Assets.xcassets/Contents.json create mode 100644 apps/mobile/targets/widget/Info.plist create mode 100644 apps/mobile/targets/widget/LiveDrawWidget.swift create mode 100644 apps/mobile/targets/widget/expo-target.config.js create mode 100644 apps/mobile/targets/widget/generated.entitlements create mode 100644 apps/mobile/targets/widget/index.swift create mode 100644 apps/supabase/migrations/20260201103117_add_live_draw_sessions.sql rename apps/mobile/DATA_RETRIEVAL_TASKS.md => docs/data-retrieval-tasks.md (100%) delete mode 100644 docs/frontend-optimization-plan.md rename {apps/mobile => docs}/release-notes.md (100%) rename apps/mobile/RELEASING.md => docs/releasing.md (100%) delete mode 100644 docs/remove-e2ee-plan.md delete mode 100644 missing-inverse-pairs-crafted.md delete mode 100644 missing-inverse-pairs.md delete mode 100644 new-question-types-draft.md create mode 100644 scripts/fix-hoisting.js diff --git a/apps/admin/src/pages/users/UserDetailPage.tsx b/apps/admin/src/pages/users/UserDetailPage.tsx index 5cd0178..bf606b0 100644 --- a/apps/admin/src/pages/users/UserDetailPage.tsx +++ b/apps/admin/src/pages/users/UserDetailPage.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect, useCallback } from 'react'; +import { useState, useEffect, useCallback, useRef } from 'react'; import { useParams, Link } from 'react-router-dom'; import { supabase, supabaseConfig } from '@/config'; import { useRealtimeSubscription } from '@/hooks/useRealtimeSubscription'; @@ -37,7 +37,7 @@ import { SelectTrigger, SelectValue, } from '@/components/ui/select'; -import { Crown, Users, MessageCircle, ChevronRight, ThumbsUp, ThumbsDown, Minus, Gift, Image, Video as VideoIcon, Target, User, Eye, EyeOff, CheckCircle, Package, Sparkles, Flame, Trophy, Calendar, AlertCircle, Clock } from 'lucide-react'; +import { Crown, Users, MessageCircle, ChevronRight, ThumbsUp, ThumbsDown, Minus, Gift, Image, Video as VideoIcon, Target, User, Eye, EyeOff, CheckCircle, Package, Sparkles, Flame, Trophy, Calendar, AlertCircle, Clock, Pencil } from 'lucide-react'; import { format } from 'date-fns'; import { IconPreview } from '@/components/ui/icon-picker'; @@ -280,6 +280,146 @@ function AdminDecryptedVideo({ messageId }: { messageId: string }) { return