Skip to content

Commit b255ece

Browse files
committed
half-baked label example
1 parent 30e57ad commit b255ece

File tree

5 files changed

+161
-4
lines changed

5 files changed

+161
-4
lines changed
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
//
2+
// ScreenTimeActivityPicker.swift
3+
// ReactNativeDeviceActivity
4+
//
5+
// Created by Robert Herber on 2023-07-05.
6+
//
7+
8+
import ExpoModulesCore
9+
import FamilyControls
10+
import Foundation
11+
import ManagedSettings
12+
import SwiftUI
13+
14+
@available(iOS 15.2, *)
15+
struct ActivityCategoryLabel: View {
16+
var token: ActivityCategoryToken
17+
18+
var body: some View {
19+
Label(token)
20+
}
21+
}
22+
23+
@available(iOS 15.2, *)
24+
struct ApplicationLabel: View {
25+
var token: ApplicationToken?
26+
27+
var body: some View {
28+
if let token = token {
29+
Label(token)
30+
}
31+
}
32+
}
33+
34+
@available(iOS 15.2, *)
35+
struct WebDomainLabel: View {
36+
var token: Token<WebDomain>?
37+
38+
var body: some View {
39+
if let token = token {
40+
Label(token)
41+
}
42+
}
43+
}
44+
45+
@available(iOS 15.2, *)
46+
struct AnyTokenLabel: View {
47+
var token: Token<Any>?
48+
49+
var body: some View {
50+
if let token = token {
51+
if let webDomainToken = token as? Token<WebDomain> {
52+
WebDomainLabel(token: webDomainToken)
53+
} else if let applicationToken = token as? Token<Application> {
54+
ApplicationLabel(token: applicationToken)
55+
} else if let activityCategoryToken = token as? Token<ActivityCategory> {
56+
ActivityCategoryLabel(token: activityCategoryToken)
57+
}
58+
}
59+
}
60+
}
61+
62+
@available(iOS 15.2, *)
63+
class WebDomainLabelView: ExpoView {
64+
private var _token: WebDomainToken?
65+
var token: WebDomainToken? {
66+
get { _token }
67+
set {
68+
_token = newValue
69+
contentView.rootView.token = newValue
70+
}
71+
}
72+
73+
let contentView: UIHostingController<WebDomainLabel>
74+
75+
required init(appContext: AppContext? = nil) {
76+
contentView = UIHostingController(
77+
rootView: WebDomainLabel(token: _token)
78+
)
79+
80+
super.init(appContext: appContext)
81+
82+
clipsToBounds = true
83+
backgroundColor = .clear
84+
isUserInteractionEnabled = false
85+
86+
contentView.view.backgroundColor = .clear
87+
contentView.view.isUserInteractionEnabled = false
88+
89+
self.addSubview(contentView.view)
90+
}
91+
92+
override func layoutSubviews() {
93+
contentView.view.frame = bounds
94+
}
95+
}

packages/react-native-device-activity/ios/ReactNativeDeviceActivityModule.swift

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -688,7 +688,7 @@ public class ReactNativeDeviceActivityModule: Module {
688688

689689
let activitySelection = parseActivitySelectionInput(input: familyActivitySelection)
690690

691-
try blockSelectedApps(
691+
blockSelectedApps(
692692
blockSelection: activitySelection,
693693
triggeredBy: triggeredBy
694694
)
@@ -810,15 +810,18 @@ public class ReactNativeDeviceActivityModule: Module {
810810
}
811811

812812
Prop("footerText") { (view: ReactNativeDeviceActivityView, prop: String?) in
813-
814813
view.model.footerText = prop
815-
816814
}
817815

818816
Prop("headerText") { (view: ReactNativeDeviceActivityView, prop: String?) in
819-
820817
view.model.headerText = prop
818+
}
819+
}
821820

821+
View(WebDomainLabelView.self) {
822+
// Defines a setter for the `name` prop.
823+
Prop("token") { (view: WebDomainLabelView, token: String) in
824+
view.token = deserializeToken(tokenStr: token)
822825
}
823826
}
824827
}

packages/react-native-device-activity/ios/ReactNativeDeviceActivityViewPersisted.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,27 @@ import FamilyControls
44
import SwiftUI
55
import UIKit
66

7+
let selection = FamilyActivitySelection()
8+
9+
/*@available(iOS 15.2, *)
10+
class ExpoWebView: ExpoView {
11+
let webView = Label(selection.categoryTokens.first!)
12+
13+
required init(appContext: AppContext? = nil) {
14+
super.init(appContext: appContext)
15+
clipsToBounds = true
16+
addSubview(webView)
17+
18+
let url = URL(string:"https://docs.expo.dev/modules/")!
19+
let urlRequest = URLRequest(url:url)
20+
webView.load(urlRequest)
21+
}
22+
23+
override func layoutSubviews() {
24+
webView.frame = bounds
25+
}
26+
}*/
27+
728
@available(iOS 15.0, *)
829
class ReactNativeDeviceActivityViewPersisted: ExpoView {
930

packages/react-native-device-activity/ios/ScreenTimeActivityPicker.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,16 @@ struct ActivityPicker: View {
3939
)
4040
.allowsHitTesting(false)
4141
.background(Color.clear)
42+
if let firstCategory = model.activitySelection.categoryTokens.first {
43+
Label(firstCategory)
44+
}
45+
if let applicationToken = model.activitySelection.applicationTokens.first {
46+
Label(applicationToken)
47+
}
48+
if let webdomain = model.activitySelection.webDomainTokens.first {
49+
Label(webdomain)
50+
}
51+
4252
} else {
4353
FamilyActivityPicker(
4454
selection: $model.activitySelection

packages/react-native-device-activity/ios/Shared.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -743,6 +743,21 @@ func deserializeFamilyActivitySelection(familyActivitySelectionStr: String)
743743
return activitySelection
744744
}
745745

746+
@available(iOS 15.0, *)
747+
func deserializeToken(tokenStr: String)
748+
-> Token<Any>? {
749+
let decoder = JSONDecoder()
750+
let data = Data(base64Encoded: tokenStr)
751+
do {
752+
var token = try decoder.decode(Token<Any>.self, from: data!)
753+
return token
754+
} catch {
755+
logger.log("decode error \(error.localizedDescription, privacy: .public)")
756+
}
757+
758+
return nil
759+
}
760+
746761
@available(iOS 15.0, *)
747762
func serializeFamilyActivitySelection(selection: FamilyActivitySelection) -> String {
748763
let encoder = JSONEncoder()
@@ -756,6 +771,19 @@ func serializeFamilyActivitySelection(selection: FamilyActivitySelection) -> Str
756771
}
757772
}
758773

774+
@available(iOS 15.0, *)
775+
func serializeToken(token: Token<Any>) -> String {
776+
let encoder = JSONEncoder()
777+
do {
778+
let json = try encoder.encode(token)
779+
let jsonString = json.base64EncodedString()
780+
781+
return jsonString
782+
} catch {
783+
return ""
784+
}
785+
}
786+
759787
@available(iOS 15.0, *)
760788
func enableBlockAllMode(triggeredBy: String) {
761789
userDefaults?.set(true, forKey: IS_BLOCKING_ALL)

0 commit comments

Comments
 (0)