From 47a568521118ccfc97b69cabac091d1934d02994 Mon Sep 17 00:00:00 2001 From: Andy Matuschak Date: Fri, 12 Jul 2024 08:56:56 -0700 Subject: [PATCH] Refresh widget when answering questions in the app --- .idea/vcs.xml | 1 - bun.lockb | Bin 1116244 -> 1116732 bytes packages/app/app.json | 8 +++ .../app/expoPlugin/ios/ORWidgetReloadBridge.m | 17 +++++ .../expoPlugin/ios/ORWidgetReloadBridge.swift | 16 +++++ .../app/expoPlugin/withWidgetPluginFixes.js | 13 +++- packages/app/package.json | 1 + .../app/src/reviewSession/ReviewSession.tsx | 6 +- packages/app/targets/widgets/AppIntents.swift | 13 ---- packages/app/targets/widgets/Widget.swift | 66 ++++++++++-------- 10 files changed, 94 insertions(+), 47 deletions(-) create mode 100644 packages/app/expoPlugin/ios/ORWidgetReloadBridge.m create mode 100644 packages/app/expoPlugin/ios/ORWidgetReloadBridge.swift delete mode 100644 packages/app/targets/widgets/AppIntents.swift diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 379f90489..94a25f7f4 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,6 +2,5 @@ - \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index d45ca99637979ec21f1c4d14a589894c6b8dc81e..d06dfea7d14ae931ab1ba743cc92a32683ab7768 100755 GIT binary patch delta 34856 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 JtAfMU{x3@U{Vo6i delta 34558 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 +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface RCT_EXTERN_MODULE(WidgetReloadBridge, NSObject) +RCT_EXTERN_METHOD(reloadTimelines) +@end + +NS_ASSUME_NONNULL_END diff --git a/packages/app/expoPlugin/ios/ORWidgetReloadBridge.swift b/packages/app/expoPlugin/ios/ORWidgetReloadBridge.swift new file mode 100644 index 000000000..73a1515b6 --- /dev/null +++ b/packages/app/expoPlugin/ios/ORWidgetReloadBridge.swift @@ -0,0 +1,16 @@ +// +// ORWidgetReloadBridge.swift +// Orbit +// +// Created by Andy Matuschak on 2024-07-12. +// + +import Foundation +import WidgetKit + +@objc(WidgetReloadBridge) class WidgetReloadBridge: NSObject { + @objc public func reloadTimelines() { + WidgetCenter.shared.reloadAllTimelines() + print("Reloading timelines") + } +} diff --git a/packages/app/expoPlugin/withWidgetPluginFixes.js b/packages/app/expoPlugin/withWidgetPluginFixes.js index 4dbaa75b4..6cf346cd4 100644 --- a/packages/app/expoPlugin/withWidgetPluginFixes.js +++ b/packages/app/expoPlugin/withWidgetPluginFixes.js @@ -1,7 +1,18 @@ -const { withMod } = require("expo/config-plugins"); +const { withMod, withXcodeProject } = require("expo/config-plugins"); const { PBXBuildFile, PBXShellScriptBuildPhase } = require("@bacons/xcode"); const path = require("path"); +const { addSourceFile } = require("./util"); module.exports = function withWidgetPluginFixes(config) { + config = withXcodeProject(config, async (config) => { + for (const file of [ + "ORWidgetReloadBridge.m", + "ORWidgetReloadBridge.swift", + ]) { + addSourceFile(config, file); + } + return config; + }); + config = withMod(config, { platform: "ios", // Bit of a hack: we're hooking into @bacons/apple-target's mod here. This string must match the one in https://github.com/EvanBacon/expo-apple-targets/blob/afd63577f43aa50665f2c31ed4ed14c052bc57bd/packages/apple-targets/src/withXcparse.ts. diff --git a/packages/app/package.json b/packages/app/package.json index 09a9a8418..4d2aed535 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -28,6 +28,7 @@ "base-64": "^1.0.0", "expo": "~51.0.17", "expo-application": "~5.9.1", + "expo-build-properties": "^0.12.3", "expo-constants": "~16.0.2", "expo-crypto": "~13.0.2", "expo-device": "~6.0.2", diff --git a/packages/app/src/reviewSession/ReviewSession.tsx b/packages/app/src/reviewSession/ReviewSession.tsx index 6fea2072c..cb1b85e71 100644 --- a/packages/app/src/reviewSession/ReviewSession.tsx +++ b/packages/app/src/reviewSession/ReviewSession.tsx @@ -26,7 +26,7 @@ import { } from "@withorbit/ui"; import { useLocalSearchParams } from "expo-router"; import React, { useEffect, useRef, useState } from "react"; -import { Platform, Text, View } from "react-native"; +import { NativeModules, Platform, Text, View } from "react-native"; import { useSafeAreaInsets } from "react-native-safe-area-context"; import { AuthenticationClient } from "../authentication/index.js"; import { @@ -39,6 +39,8 @@ import { useReviewSessionManager } from "../reviewSessionManager.js"; import { useAPIClient } from "../util/useAPIClient.js"; import { LoadingScreen } from "./LoadingScreen.js"; +const { WidgetReloadBridge } = NativeModules; + export function useDatabaseManager( authenticationClient: AuthenticationClient, ): DatabaseManager2 | null { @@ -92,6 +94,7 @@ function persistMarking({ .recordEvents([event]) .then(() => { console.log("[Performance] Log written", Date.now() / 1000.0); + WidgetReloadBridge.reloadTimelines(); }) .catch((error) => { console.error("Couldn't commit", reviewItem.task.id, error); @@ -304,6 +307,7 @@ export default function ReviewSession() { ]) .then(() => { console.log("Wrote delete event", Date.now() / 1000.0); + WidgetReloadBridge.reloadTimelines(); }) .catch((error) => { console.error("Couldn't commit delete event", error); diff --git a/packages/app/targets/widgets/AppIntents.swift b/packages/app/targets/widgets/AppIntents.swift deleted file mode 100644 index 1f32d7a1c..000000000 --- a/packages/app/targets/widgets/AppIntents.swift +++ /dev/null @@ -1,13 +0,0 @@ -// -// AppIntents.swift -// OrbitWidgetExtension -// -// Created by Andy Matuschak on 2024-06-26. -// - -import Foundation -import AppIntents - -struct ConfigurationAppIntent: WidgetConfigurationIntent { - static var title: LocalizedStringResource = "Configuration" -} diff --git a/packages/app/targets/widgets/Widget.swift b/packages/app/targets/widgets/Widget.swift index 4e6cc8b97..359bcd31f 100644 --- a/packages/app/targets/widgets/Widget.swift +++ b/packages/app/targets/widgets/Widget.swift @@ -27,38 +27,42 @@ struct ReviewState { var transientState = ReviewState() let bridge = Bridge() -struct Provider: AppIntentTimelineProvider { - func placeholder(in context: Context) -> Entry { - Entry(item: .placeholder, isShowingAnswer: false, date: Date()) - } - - func snapshot(for configuration: ConfigurationAppIntent, in context: Context) async -> Entry { - Entry(item: .placeholder, isShowingAnswer: false, date: Date()) - } - - func timeline(for configuration: ConfigurationAppIntent, in context: Context) async -> Timeline { - var entries: [Entry] = [] - print("REFRESH TIMELINE") - - // transientState.queue = [.placeholder, .placeholder] - if transientState.queue == nil { - transientState.queue = await bridge.generateReviewQueue() +struct Provider: TimelineProvider { + func getSnapshot(in context: Context, completion: @escaping @Sendable (Entry) -> Void) { + Task { + let queue = await bridge.generateReviewQueue() + completion(Entry(item: queue[0], isShowingAnswer: false, date: Date())) } + } + + func getTimeline(in context: Context, completion: @escaping @Sendable (Timeline) -> Void) { + Task { + var entries: [Entry] = [] + print("REFRESH TIMELINE") + +// if transientState.queue == nil { + transientState.queue = await bridge.generateReviewQueue() +// } + + let queue = transientState.queue!.filter { item in !transientState.reviewedTaskIDs.contains(item.task.id) } + + let currentDate = Date() + for hourOffset in 0.. Entry { + Entry(item: .placeholder, isShowingAnswer: false, date: Date()) } } @@ -158,7 +162,7 @@ struct PromptTextStyle: ViewModifier { let fontStyle: OrbitFont.Type init(text: String) { self.fontStyle = switch text.count { - case 0 ... 80: + case 0 ... 70: OrbitPromptMedium.self default: OrbitPromptSmall.self @@ -295,7 +299,7 @@ struct OrbitHomeScreen: Widget { let kind: String = "OrbitHomeScreen" var body: some WidgetConfiguration { - AppIntentConfiguration(kind: kind, intent: ConfigurationAppIntent.self, provider: Provider()) { entry in + StaticConfiguration(kind: kind, provider: Provider()) { entry in let colorPalette = colorPalette(for: entry.item) PromptView(item: entry.item, isShowingAnswer: entry.isShowingAnswer) .containerBackground(colorPalette.backgroundColor, for: .widget)