diff --git a/Telegram/Widget/TodayViewController.swift b/Telegram/Widget/TodayViewController.swift index 041e97ca0d..e9285f1436 100644 --- a/Telegram/Widget/TodayViewController.swift +++ b/Telegram/Widget/TodayViewController.swift @@ -26,7 +26,7 @@ struct Provider: TimelineProvider { var entries: [SimpleEntry] = [] let currentDate = Date() - for hourOffset in 0 ..< 5 { + for hourOffset in 0 ..< 1 { let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)! let entry = SimpleEntry(date: entryDate) entries.append(entry) @@ -38,19 +38,13 @@ struct Provider: TimelineProvider { } struct SimpleEntry: TimelineEntry { - public let date: Date -} - -struct Static_WidgetEntryView: View { - var entry: Provider.Entry - - var body: some View { - Text(entry.date, style: .time) - } + let date: Date } enum PeersWidgetData { case placeholder + case empty + case locked case data(WidgetData) } @@ -61,7 +55,7 @@ extension PeersWidgetData { struct WidgetView: View { let data: PeersWidgetData - func peerViews(geometry: GeometryProxy) -> AnyView { + func placeholder(geometry: GeometryProxy) -> some View { let defaultItemSize: CGFloat = 60.0 let defaultPaddingFraction: CGFloat = 0.36 @@ -71,24 +65,53 @@ struct WidgetView: View { let firstRowY = itemSize / 2.0 let secondRowY = itemSize / 2.0 + geometry.size.height - itemSize + return ZStack { + ForEach(0 ..< rowCount * 2, content: { i in + return Circle().frame(width: itemSize, height: itemSize).position(x: itemSize / 2.0 + floor(CGFloat(i % rowCount) * itemSize * (1.0 + defaultPaddingFraction)), y: i / rowCount == 0 ? firstRowY : secondRowY).foregroundColor(.gray) + }) + } + } + + func peersView(geometry: GeometryProxy, peers: WidgetDataPeers) -> some View { + let defaultItemSize: CGFloat = 60.0 + let defaultPaddingFraction: CGFloat = 0.36 + + let rowCount = Int(round(geometry.size.width / (defaultItemSize * (1.0 + defaultPaddingFraction)))) + let itemSize = floor(geometry.size.width / (CGFloat(rowCount) + defaultPaddingFraction * CGFloat(rowCount - 1))) + + let firstRowY = itemSize / 2.0 + let secondRowY = itemSize / 2.0 + geometry.size.height - itemSize + + return ZStack { + ForEach(0 ..< min(peers.peers.count, rowCount * 2), content: { i in + Link(destination: URL(string: "\(buildConfig.appSpecificUrlScheme)://localpeer?id=\(peers.peers[i].id)")!, label: { + Image(uiImage: avatarImage(accountPeerId: peers.accountPeerId, peer: peers.peers[i], size: CGSize(width: itemSize, height: itemSize))) + .frame(width: itemSize, height: itemSize) + }).frame(width: itemSize, height: itemSize) + .position(x: itemSize / 2.0 + floor(CGFloat(i % rowCount) * itemSize * (1.0 + defaultPaddingFraction)), y: i / rowCount == 0 ? firstRowY : secondRowY) + }) + } + } + + func peerViews() -> AnyView { switch data { case .placeholder: - return AnyView(ZStack { - ForEach(0 ..< rowCount * 2, content: { i in - return Circle().frame(width: itemSize, height: itemSize).position(x: itemSize / 2.0 + floor(CGFloat(i % rowCount) * itemSize * (1.0 + defaultPaddingFraction)), y: i / rowCount == 0 ? firstRowY : secondRowY).foregroundColor(.gray) - }) + return AnyView(GeometryReader { geometry in + placeholder(geometry: geometry) + }) + case .empty: + return AnyView(VStack { + Text(presentationData.applicationStartRequiredString) + }) + case .locked: + return AnyView(VStack { + Text(presentationData.applicationLockedString) }) case let .data(data): switch data { case let .peers(peers): - return AnyView(ZStack { - ForEach(0 ..< min(peers.peers.count, rowCount * 2), content: { i in - Link(destination: URL(string: "\(buildConfig.appSpecificUrlScheme)://localpeer?id=\(peers.peers[i].id)")!, label: { - Image(uiImage: avatarImage(accountPeerId: peers.accountPeerId, peer: peers.peers[i], size: CGSize(width: itemSize, height: itemSize))) - .frame(width: itemSize, height: itemSize) - }).frame(width: itemSize, height: itemSize) - .position(x: itemSize / 2.0 + floor(CGFloat(i % rowCount) * itemSize * (1.0 + defaultPaddingFraction)), y: i / rowCount == 0 ? firstRowY : secondRowY) - }) + return AnyView(GeometryReader { geometry in + peersView(geometry: geometry, peers: peers) }) default: return AnyView(ZStack { @@ -101,9 +124,7 @@ struct WidgetView: View { var body: some View { ZStack { Color(.systemBackground) - GeometryReader { geometry in - peerViews(geometry: geometry) - } + peerViews() } .padding(.all) } @@ -152,10 +173,10 @@ private let presentationData: WidgetPresentationData = { } }() -let widgetData: WidgetData? = { +func getWidgetData() -> PeersWidgetData { let appBundleIdentifier = Bundle.main.bundleIdentifier! guard let lastDotRange = appBundleIdentifier.range(of: ".", options: [.backwards]) else { - return nil + return .placeholder } let baseAppBundleId = String(appBundleIdentifier[..