Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 40 additions & 28 deletions apps/example/screens/SimpleTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,28 +37,31 @@ export function SimpleTab() {

const [activities, refreshActivities] = useActivities();

const onPressRequestCallback = useCallback(async () => {
if (authorizationStatus === AuthorizationStatus.notDetermined) {
await requestAuthorization();
} else if (authorizationStatus === AuthorizationStatus.denied) {
Alert.alert(
"You didn't grant access",
"Please go to settings and enable it",
[
{
text: "Open settings",
onPress: () => Linking.openSettings(),
},
{
text: "Cancel",
style: "cancel",
},
],
);
} else {
await revokeAuthorization();
}
}, [authorizationStatus]);
const onPressRequestCallback = useCallback(
async (forIndividualOrChild: "individual" | "child" = "individual") => {
if (authorizationStatus === AuthorizationStatus.notDetermined) {
await requestAuthorization(forIndividualOrChild);
} else if (authorizationStatus === AuthorizationStatus.denied) {
Alert.alert(
"You didn't grant access",
"Please go to settings and enable it",
[
{
text: "Open settings",
onPress: () => Linking.openSettings(),
},
{
text: "Cancel",
style: "cancel",
},
],
);
} else {
await revokeAuthorization();
}
},
[authorizationStatus],
);

const [showCreateActivityPopup, setShowCreateActivityPopup] = useState(false);

Expand Down Expand Up @@ -108,12 +111,21 @@ export function SimpleTab() {
<Text style={{ flex: 1 }}>
{authorizationStatusMap[authorizationStatus]}
</Text>

<Button onPress={onPressRequestCallback} mode="contained">
{authorizationStatus === AuthorizationStatus.approved
? "Revoke authorization"
: "Request authorization"}
</Button>
<View style={{ gap: 10 }}>
<Button onPress={() => onPressRequestCallback()} mode="contained">
{authorizationStatus === AuthorizationStatus.approved
? "Revoke authorization"
: "Request authorization"}
</Button>
<Button
onPress={() => onPressRequestCallback("child")}
mode="contained"
>
{authorizationStatus === AuthorizationStatus.approved
? "Revoke child authorization"
: "Request child authorization"}
</Button>
</View>
</View>
<Title>Activities</Title>
{activities.map((activity) => (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -570,13 +570,18 @@ public class ReactNativeDeviceActivityModule: Module {
try await ac.requestAuthorization(
for: forIndividualOrChild == "child" ? .child : .individual)
} else {
let errorMessage = "iOS 16.0 or later is required to request authorization."
logger.log("⚠️ \(errorMessage)")
throw NSError(
domain: "FamilyControls",
code: 9999,
userInfo: [NSLocalizedDescriptionKey: errorMessage]
)
// Deprecated iOS 15 API - uses completion handler
try await withCheckedThrowingContinuation { (continuation: CheckedContinuation<Void, Error>) in
ac.requestAuthorization { result in
switch result {
case .success:
continuation.resume()
case .failure(let error):
logger.log("❌ Failed to request authorization: \(error.localizedDescription, privacy: .public)")
continuation.resume(throwing: error)
}
}
}
}
}

Expand Down
Loading