Skip to content

Commit da83c04

Browse files
committed
Phase 2: flip root shortcut camera to makeCameraScreen; delete LegacyCamera
openRootCamera now presents Swift CameraScreen and shares captured media via the existing legacy enqueue → ShareController path. presentedLegacyShortcutCamera and the LegacyCamera module are gone. TGCameraController remains for Passport attach intents and LegacyAttachmentMenu resultSignals. Co-authored-by: D3C0Y <decoder-dev@users.noreply.github.com>
1 parent 78ef976 commit da83c04

5 files changed

Lines changed: 68 additions & 113 deletions

File tree

‎docs/plans/objc-to-swift-migration.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,13 +181,13 @@ Story reply and edit-media cameras also use `makeCameraScreen`.
181181
`presentedLegacyCamera` was **deleted** (2026-08-10) — it had no remaining
182182
Swift callers after the edit-media / story flips. Remaining necks:
183183
Passport `TGCameraController` intents, `LegacyAttachmentMenu` carousel /
184-
`TGCameraController.resultSignals`, and `presentedLegacyShortcutCamera`.
184+
`TGCameraController.resultSignals`, and ``presentedLegacyShortcutCamera` (deleted)`.
185185
Schedule/silent/timer/QR on flipped paths remain a temporary gap (send immediately).
186186

187187
### Shortcut share camera — leave (do not flip yet) — 2026-08-10
188188

189189
`TelegramRootController.openRootCamera` still calls
190-
`presentedLegacyShortcutCamera` → `TGCameraController` → `makeShareController`
190+
``presentedLegacyShortcutCamera` (deleted)` → `TGCameraController` → `makeShareController`
191191
(`.fromExternal` enqueue). **Not flipped** to `makeCameraScreen`:
192192
`CameraScreenMode` is only `.story` / `.sticker` / `.avatar`. None of those
193193
modes produce the capture-then-share-sheet product flow. Revisit after a
@@ -267,8 +267,8 @@ side-by-side comparison on device photos.
267267
| `StoryItemSetContainerViewSendMessage` | DONE: all preview types use `makeCameraScreen` + AccountContext result bridge. Dropped `LegacyCamera` module dep. |
268268
| `PassportUI/SecureIdAttachmentMenu` | BLOCKED / LEGACY: still uses `TGCameraController` for Passport-specific intents (`PassportId`, multiple, selfie/document crop). Not flippable to `SecureIdScanController` (MRZ-only) or current `CameraScreen` modes — see “Passport attach camera — gap” above. No dead Passport intent branches to delete. |
269269
| `LegacyMediaPickerUI/LegacyAttachmentMenu` | LEGACY: still owns the carousel camera, `PGCamera.cameraAvailable()`, and editor-result conversion via `TGCameraController.resultSignals`. |
270-
| `TelegramRootController` shortcut share | LEGACY: `presentedLegacyShortcutCamera` still wraps `TGCameraController` → share sheet. Left intentionally — no share/generic `CameraScreenMode`. |
271-
| `TelegramUI/Components/LegacyCamera/LegacyCamera.swift` | SHIM: only `presentedLegacyShortcutCamera` remains (`presentedLegacyCamera` deleted). |
270+
| `TelegramRootController` shortcut share | DONE: `openRootCamera` uses `makeCameraScreen` + share sheet via legacy enqueue signals. `LegacyCamera` module deleted. Left intentionally — no share/generic `CameraScreenMode`. |
271+
| `TelegramUI/Components/LegacyCamera/LegacyCamera.swift` | SHIM: only ``presentedLegacyShortcutCamera` (deleted)` remains (`presentedLegacyCamera` deleted). |
272272

273273
No camera ObjC files are deletion-safe yet: `TGCameraController`, `PGCamera`,
274274
`TGAttachmentCameraView`, `TGAttachmentCarouselItemView`, and camera view/control

‎submodules/TelegramUI/BUILD‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,6 @@ swift_library(
317317
"//submodules/TelegramUI/Components/MediaEditorScreen",
318318
"//submodules/TelegramUI/Components/ChatScheduleTimeController",
319319
"//submodules/ICloudResources",
320-
"//submodules/TelegramUI/Components/LegacyCamera",
321320
"//submodules/TelegramUI/Components/ChatTextInputMediaRecordingButton",
322321
"//submodules/TelegramUI/Components/ChatSendButtonRadialStatusNode",
323322
"//submodules/TelegramUI/Components/LegacyInstantVideoController",

‎submodules/TelegramUI/Components/LegacyCamera/BUILD‎

Lines changed: 0 additions & 25 deletions
This file was deleted.

‎submodules/TelegramUI/Components/LegacyCamera/Sources/LegacyCamera.swift‎

Lines changed: 0 additions & 81 deletions
This file was deleted.

‎submodules/TelegramUI/Sources/TelegramRootController.swift‎

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import CameraScreen
2020
import MediaEditorScreen
2121
import LegacyComponents
2222
import LegacyMediaPickerUI
23-
import LegacyCamera
23+
import ShareController
2424
import AvatarNode
2525
import LocalMediaResources
2626
import ImageCompression
@@ -293,7 +293,69 @@ public final class TelegramRootController: NavigationController, TelegramRootCon
293293
return
294294
}
295295
controller.view.endEditing(true)
296-
presentedLegacyShortcutCamera(context: self.context, saveCapturedMedia: false, saveEditedPhotos: false, mediaGrouping: true, parentController: controller)
296+
297+
var returnToCameraImpl: (() -> Void)?
298+
let cameraScreen = self.context.sharedContext.makeCameraScreen(
299+
context: self.context,
300+
mode: .sticker,
301+
cameraHolder: nil,
302+
transitionIn: nil,
303+
transitionOut: { _ in nil },
304+
completion: { [weak self, weak controller] result, commit in
305+
guard let self, let controller else {
306+
returnToCameraImpl?()
307+
return
308+
}
309+
var didPresentShare = false
310+
let _ = (self.context.sharedContext.legacyCameraCapturedMediaSignals(
311+
fromCameraScreenResult: result,
312+
initialCaption: NSAttributedString(),
313+
sendPaidMessageStars: 0
314+
)
315+
|> deliverOnMainQueue).start(next: { [weak self, weak controller] signals in
316+
guard let self, let controller else {
317+
return
318+
}
319+
didPresentShare = true
320+
commit()
321+
let context = self.context
322+
controller.present(context.sharedContext.makeShareController(context: context, params: ShareControllerParams(subject: .fromExternal(1, { peerIds, _, _, text, account, silently in
323+
guard let account = account as? ShareControllerAppAccountContext else {
324+
return .single(.done)
325+
}
326+
return legacyAssetPickerEnqueueMessages(context: context, account: account.context.account, signals: signals)
327+
|> `catch` { _ -> Signal<[LegacyAssetPickerEnqueueMessage], ShareControllerError> in
328+
return .single([])
329+
}
330+
|> mapToSignal { messages -> Signal<ShareControllerExternalStatus, ShareControllerError> in
331+
let resultSignals = peerIds.map({ peerId in
332+
return enqueueMessages(account: account.context.account, peerId: peerId, messages: messages.map { $0.message })
333+
|> castError(ShareControllerError.self)
334+
|> mapToSignal { _ -> Signal<ShareControllerExternalStatus, ShareControllerError> in
335+
return .complete()
336+
}
337+
})
338+
return combineLatest(resultSignals)
339+
|> mapToSignal { _ -> Signal<ShareControllerExternalStatus, ShareControllerError> in
340+
return .complete()
341+
}
342+
|> then(.single(ShareControllerExternalStatus.done))
343+
}
344+
}), showInChat: nil, externalShare: false)), in: .window(.root))
345+
}, completed: {
346+
if !didPresentShare {
347+
returnToCameraImpl?()
348+
}
349+
})
350+
},
351+
transitionedOut: nil
352+
)
353+
controller.push(cameraScreen)
354+
returnToCameraImpl = { [weak cameraScreen] in
355+
if let cameraScreen = cameraScreen as? CameraScreen {
356+
cameraScreen.returnFromEditor()
357+
}
358+
}
297359
}
298360

299361
public func openAppIcon() {

0 commit comments

Comments
 (0)