Commit Graph
44 Commits
Author SHA1 Message Date
Matthew Meszaros b379be9732 feat: qualify self.task in the openSocket admission check - with the type-checker crash worked around, Xcode 26.6 surfaces the real diagnostic: the locked closure's bare 'task' resolves to the local declared later in the function and is rejected as captured before declaration 2026-07-11 10:44:57 +02:00
Matthew Meszaros 04cf24c98d feat: hoist the socket url resolution out of the guard condition entirely - across three CI crashes the Xcode 26.6 type checker dies whenever the async urlProvider closure property is bound or awaited inside a guard condition under StrictConcurrency, so the read, the await and the unwrap are now three plain statements 2026-07-11 10:41:26 +02:00
Matthew Meszaros da1a6efbf8 feat: make the websocket urlProvider a non-optional closure with a nil-returning default because the Xcode 26.6 type checker also crashes on referencing an optional async closure property, not just on optional-chained calls; behavior is unchanged (nil result still schedules a reconnect) 2026-07-11 10:37:33 +02:00
Matthew Meszaros e5f5623dc4 feat: unblock iOS CI - unwrap the websocket urlProvider in two steps because 'await urlProvider?()' crashes the Xcode 26.6 Swift type checker (works on 27), and build only the arm64 simulator slice in CI since the generic destination was doubling the compile for no extra signal 2026-07-11 10:34:07 +02:00
Matthew Meszaros 2d00ff2f69 feat: rename the Icon Composer icon to AppIcon.icon so Xcode 26's asset catalog linker finds the AppIcon.appiconset fallback (the Warmbly name built on Xcode 27 but failed LinkAssetCatalog on the macos-26 runner), and stop truncating the iOS CI build output so failures are diagnosable 2026-07-11 10:28:36 +02:00
Matthew Meszaros 56c3a2e988 feat: app icon becomes a native Icon Composer document matching the Figma branding 1:1 - Warmbly.icon layers the exact 1024px Logo frame render (sky gradient, clouds) under the plane glyph as a separate Liquid Glass vector layer positioned identically to Figma, replacing the flat AppIcon asset via ASSETCATALOG_COMPILER_APPICON_NAME 2026-07-11 10:13:44 +02:00
Matthew Meszaros 76e6ad2466 feat: iOS analytics becomes an air-hero drawer browser cover - the sky hero stays (circular hamburger and close, translucent 7d/30d/90d period chips, glass stat chips) while the web-style tab strip and card grids give way to a section drawer (overview/deliverability/warmup/accounts with issue-tinted counts) over flat native lists; Home now opens analytics and mailboxes as covers instead of pushes 2026-07-11 10:13:44 +02:00
Matthew Meszaros de85abc47c feat: iOS mailboxes rebuilt end to end - the list is a full-screen drawer browser cover (warmup status scopes with live counts, search pill, multi-select bulk warmup/remove, circular close) since pushing it fought the system back swipe; connecting is an air onboarding flow with real Google/Outlook brand logos, a web-style authorize step with scope bullets, working in-app OAuth via ASWebAuthenticationSession against the new warmbly:// callback, an SMTP/IMAP wizard, and a start-warmup offer on success; the detail screen becomes editable (warmup ramp steppers, sending window and weekday bitmask chips matching the Go scheduler's Sunday-first layout, sender profile, sending limits, disconnect) with debounced optimistic PATCHes 2026-07-11 10:13:10 +02:00
Matthew Meszaros c12a621d06 feat: iOS workspace creation is the air onboarding flow - two sky-chrome steps (name, optional invites) creating the org at the end so it works both as the zero-workspaces gate (Sign out is the only exit, like the web) and as a cover with a circular close wired through explicit onClose bindings; the org picker becomes a sky screen with workspace rows and a New workspace path 2026-07-11 10:12:41 +02:00
Matthew Meszaros 928e1924b2 feat: iOS session handling survives network blips and explains sign-outs - token refresh only drops the session on definitive rejections (network errors rethrow and keep tokens), a missing token now kicks cleanly to sign-in instead of hanging, and the auth welcome step shows an amber session-expired notice when the app signed the user out 2026-07-11 10:12:41 +02:00
Matthew Meszaros e6b0bd2918 feat: iOS More tab and CRM rebuilt in the flat browser language - the hub is one full-bleed list with a workspace header and cover rows, Deals/Tasks/Meetings become full drawer browsers (scope sidebars with sliding tone capsules, search pills, end markers), and billing/notifications/profile/security/team pages drop grouped cards for eyebrow-captioned hairline rows 2026-07-11 10:12:41 +02:00
Matthew Meszaros ac87d80604 feat: iOS campaign leads becomes a full drawer browser matching contacts - status scopes (all/processing/replied/bounced/queued/unsubscribed) with live counts in a sky-hero sidebar, advanced contact filters, multi-select bulk edit/remove with optimistic count bumps, an add-leads picker that locks rows already in the campaign, live detail re-derived from the store with presence claims, plus shared contact browser pieces (filters sheet, CSV import, bulk actions, sidebar) and keyboard-safe create-flow sheets 2026-07-11 10:12:09 +02:00
Matthew Meszaros 343fc33b1d feat: campaign schedule board supports multiple timeframes per day - the + button now drops each new window into a free gap kept an hour clear of its neighbours (so a second tap adds a distinct morning-and-afternoon window instead of merging into one), and tapping any bar opens a precise start/end editor sheet with 30-minute wheel pickers plus remove, which is how narrow windows are tuned exactly on mobile where a ~25pt bar can't be dragged pixel-accurately; bars still drag to move and merge when overlapped 2026-07-08 07:06:22 +02:00
Matthew Meszaros 3c8abbb713 feat: rebuild the iOS campaign schedule as an interactive board reimagined for mobile - each day is its own full-width horizontal 24h track (not a cramped 7-column grid) with draggable window bars: tap + to add, drag a bar sideways to move, drag its white left/right handle to resize, tap × to remove, long-press a day to copy it to all or clear it, snapping to 30 minutes, with presets, a timezone menu and today highlighted; writes the authoritative schedule_windows and supports multiple independent windows per day 2026-07-07 19:00:43 +02:00
Matthew Meszaros 80a0ece647 feat: make the iOS campaign Settings page fully editable instead of a read-only wall - sender strategy, rotation mode and ESP matching are inline menu pickers, ramp-up is an enable toggle with start/ceiling/step steppers, and lead flow has a new-leads-per-day stepper (0=off) plus a prioritize-new-leads toggle, all PATCHing optimistically; only CC/BCC lists and tracking-domain DNS stay read-only under an 'On the web' handoff 2026-07-07 17:33:31 +02:00
Matthew Meszaros 326a07d567 feat: rebuild the iOS campaign detail as a flat hub-and-spoke instead of a card-stacked overview - the sheet is now one full-bleed native surface (eyebrow captions, bare stat columns for open/reply/bounce rates plus a live 30-day chart, hairline rows) matching the inbox and campaigns list, with Manage rows pushing to Leads (searchable, count in title), a read-only Sequence with per-step HTML reader, and Senders, all carrying a web-handoff banner for editing that needs a big screen; Sending settings (daily-limit two-disc stepper clamped 1-100, stop-on-reply, open/link tracking) edit inline via optimistic PATCH, and new Schedule (day chips, daily window, timezone picker writing schedule_windows; custom per-day schedules stay read-only) and Settings (name/description, delivery toggles, read-only advanced, creator-only delete) pages 2026-07-07 17:14:44 +02:00
Matthew Meszaros 836f72129f feat: detail screens get a flat full-width underline tab bar replacing the chunky scrollable pills (every tab always visible, sliding accent underline, shared by campaign, mailbox, contact, and analytics details), the white sheet is now clipped so scrolling content can never bleed over its rounded corners, and the campaign create flow presents instantly by mounting the 40fps flight-scene canvas and raising the keyboard only after the cover's slide-up finishes 2026-07-07 10:28:46 +02:00
Matthew Meszaros 7143533bf5 feat: make folder-heavy accounts feel first-class - the create flow's folder page switches to a two-up chip grid with a search box once there are more than eight folders (with a no-matches state), and both the campaigns and unibox drawer cascades cap their per-row stagger so long folder, mailbox, or label lists never animate for seconds 2026-07-07 10:21:23 +02:00
Matthew Meszaros ac74b94c8d feat: campaign creation becomes a stepped sky onboarding flow like sign-in - full-screen cover with the flight-scene backdrop, step badge and progress segments, and three sheet pages: name plus description with live character count, sending pace presets (10/25/50 per day with conservative fresh-mailbox guidance) alongside stop-on-reply and open/link tracking toggles, and an optional skippable folder-filing page that only appears when the member has folders; the create body now carries daily_limit, rule toggles, and folder_ids 2026-07-07 10:02:20 +02:00
Matthew Meszaros 60e70515c0 feat: turn the campaigns tab into a unibox-style browser - hamburger in the search pill slides in a sky-hero drawer with status scopes and campaign folders (counts from campaigns-overview, sliding selection capsule, cascade-in rows, edge swipe to open), scopes and folders now filter server-side so every view has an exact found count and working infinite scroll, replacing the client-side underline tabs 2026-07-07 09:40:27 +02:00
Matthew Meszaros 500ef3419e feat: flatten the campaign detail overview tab from insetGrouped boxes to the flat full-width list - plain style on the system background with inline eyebrow section labels for performance, last 30 days, and per step instead of sticky gray header bands 2026-07-07 07:43:11 +02:00
Matthew Meszaros a5d18f5b3e feat: rebuild the campaigns tab in the flat Gmail language - search pill header with inline presence and a round create button replaces the nav title, underline scope tabs with live counts replace capsule chips, and the list becomes dense full-width hairline rows with a status-toned avatar disc, teammate presence dot, stats line, pulsing status, start/pause and delete swipe actions plus a context menu, and quick start/pause from the row via the new store toggle 2026-07-07 07:43:11 +02:00
Matthew Meszaros 9e77738c5f feat: keep users signed in through backend outages - bootstrap distinguishes a real 401 (clear token, show sign-in) from an unreachable or erroring server, which now lands on a sky unreachable screen that keeps the session and retries automatically every few seconds 2026-07-07 07:27:16 +02:00
Matthew Meszaros 9cfef4937c feat: eliminate white message bodies - plain-equivalent emails now render as native SwiftUI text instead of a webview, and rich-HTML messages get a hardened webview that reloads after web content process termination, retries failed or never-painted loads with a capped budget, and starts from a realistic frame 2026-07-07 07:27:15 +02:00
Matthew Meszaros d1ec6206e7 feat: full schedule-send control - the schedule sheet gains Gmail-style one-tap presets (later today, tomorrow morning/afternoon, Monday morning) with their concrete times shown, a month calendar, a dedicated hour-and-minute time row that was previously clipped at the medium detent, and a will-send summary line, all clamped to the server's scheduling bounds 2026-07-07 06:48:40 +02:00
Matthew Meszaros 2370c6e637 feat: selection-aware AI in the composer - highlighting text in the draft switches the AI dropdown to a Selected text section (rephrase, shorten, expand, more formal, fix grammar) that rewrites only that range via the editor selection binding, guarded against concurrent draft edits and covered by the same one-tap undo 2026-07-07 06:42:21 +02:00
Matthew Meszaros 1633c6274f feat: fix the blank-message-until-tap bug - the email webview now starts from a realistic frame instead of .zero, retries a first load that never committed (dropped mid navigation transition) on any SwiftUI update, and re-measures content height after layout settles 2026-07-07 06:42:21 +02:00
Matthew Meszaros d2613a01fe feat: composer power features - Bcc joins Cc behind a Gmail-style chevron on the To row and rides the reply request, the full-screen AI sheet is replaced by an inline prompt bar above the keyboard plus a rewrite dropdown (improve/shorten/formal/casual/grammar) with one-tap undo, and templates become an instant-insert dropdown with a searchable server-side browser for large libraries 2026-07-07 06:17:16 +02:00
Matthew Meszaros cc01ce900f feat: rebuild the reply composer Gmail-style - borderless full-width From/To/Cc/Subject rows separated only by hairlines, the draft editor fills the whole sheet, send moves to a toolbar paperplane with a when-to-send menu (now/smart/schedule with a graphical date sheet and an inline schedule banner), and AI/templates sit in a quiet helper bar above the keyboard 2026-07-07 06:07:58 +02:00
Matthew Meszaros 2961b4e120 feat: fix thread view bugs - message expansion and measured body heights move into the thread store so LazyVStack row recycling can no longer collapse an open message or blank its body, and the connector rail is drawn as segments that stop at the avatar edges instead of running through the translucent avatar fill 2026-07-07 06:07:58 +02:00
Matthew Meszaros fb7397e26a feat: iOS developer docs - README with project layout and DEVELOPMENT.md covering simulator setup, local backend wiring, and build/run workflow 2026-07-07 05:57:59 +02:00
Matthew Meszaros b4fde65a7d feat: iOS environment wiring - AppConfig backend/websocket endpoints, the observable AppEnvironment composing API/session/realtime/badges, and app entitlements for Sign in with Apple 2026-07-07 05:57:59 +02:00
Matthew Meszaros 29276fe056 feat: iOS analytics and settings - account analytics with charts and audit log, plus the more tab (profile, team, notifications, billing, security) in the air language 2026-07-07 05:57:44 +02:00
Matthew Meszaros eefa88adff feat: iOS mailboxes - account list with health/warmup state, connect sheet, and mailbox detail with settings, limits and deliverability tabs 2026-07-07 05:57:43 +02:00
Matthew Meszaros 553a2844a5 feat: iOS contacts and CRM - contacts browser with category picker and bulk selection, contact detail with edit drawer, plus CRM deals, meetings, tasks and template views on the shared air scaffold 2026-07-07 05:57:43 +02:00
Matthew Meszaros 7afa5d997e feat: iOS campaigns - list with status rows, create sheet, and campaign detail with air hero, sticky tabs, sequence/schedule/recipient views and live send stats 2026-07-07 05:57:43 +02:00
Matthew Meszaros f3cb7b114b feat: iOS unibox - Gmail-style browser with sidebar drawer (sky hero badges, sliding pill selection, red unread counts, labels + uncategorized), search pill with operator hints and result counts, multi-select with swipe actions and infinite scroll, flat thread view with connector rail, replying-to references, per-message reply/copy/read tools, and an air-styled reply composer with smart scheduling 2026-07-07 05:57:31 +02:00
Matthew Meszaros 07b319b2d6 feat: iOS home tab - workspace pulse with air hero, live health/send stats, and shortcuts into mailboxes and analytics 2026-07-07 05:57:31 +02:00
Matthew Meszaros 4dc32e6ccb feat: iOS auth flow - welcome screen, multi-step email login/register with OTP code field, native Sign in with Apple and Google buttons against the new token endpoints, org picker, and the post-signup onboarding questionnaire 2026-07-07 05:57:31 +02:00
Matthew Meszaros 5041c285ca feat: iOS navigation shell - session-gated root with a breathing-logo sky launch view and a permission-aware tab bar carrying the unibox unread badge 2026-07-07 05:57:11 +02:00
Matthew Meszaros a434e0c070 feat: iOS design system - air theme (sky wash heroes, tone palettes, stat chips, eyebrow labels), shared components (avatars, skeleton shimmer rows, empty/error states, tap-scale style), and the Warmbly logo/wordmark shapes 2026-07-07 05:57:11 +02:00
Matthew Meszaros 4f55903165 feat: iOS realtime layer - Phoenix channels websocket client with heartbeats and rejoin backoff, org/user channel subscriptions, presence state sync, and per-feature event pulses driving live query invalidation 2026-07-07 05:57:11 +02:00
Matthew Meszaros 5710c86d9e feat: iOS core layer - async APIClient with idempotency keys and typed errors, Codable models mirroring the backend wire contracts (including the Group title key), session store with permission checks, and a keychain-backed token store 2026-07-07 05:57:01 +02:00
Matthew Meszaros 734955b490 feat: scaffold the Warmbly iOS app - Xcode project with synchronized folder references, app entry point wiring the environment, Info.plist with a LaunchBackground sky launch screen, and the asset catalog (app icon, accent, clouds, launch color) 2026-07-07 05:57:01 +02:00