diff --git a/packages/frontend/apps/ios/App/App.xcworkspace/xcshareddata/swiftpm/Package.resolved b/packages/frontend/apps/ios/App/App.xcworkspace/xcshareddata/swiftpm/Package.resolved index 0973b9f21f..11bb81ba6a 100644 --- a/packages/frontend/apps/ios/App/App.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/packages/frontend/apps/ios/App/App.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -5,8 +5,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apollographql/apollo-ios", "state" : { - "revision" : "9aa748d6f0526a744d49d59a2383dc7fdf9d645b", - "version" : "1.18.0" + "revision" : "39fea7617346c0731be25f61afd537e7032fb562", + "version" : "1.22.0" } }, { @@ -18,15 +18,6 @@ "version" : "5.7.1" } }, - { - "identity" : "sqlite.swift", - "kind" : "remoteSourceControl", - "location" : "https://github.com/stephencelis/SQLite.swift.git", - "state" : { - "revision" : "392dd6058624d9f6c5b4c769d165ddd8c7293394", - "version" : "0.15.4" - } - }, { "identity" : "swift-collections", "kind" : "remoteSourceControl", @@ -36,15 +27,6 @@ "version" : "1.2.0" } }, - { - "identity" : "swift-toolchain-sqlite", - "kind" : "remoteSourceControl", - "location" : "https://github.com/swiftlang/swift-toolchain-sqlite", - "state" : { - "revision" : "b626d3002773b1a1304166643e7f118f724b2132", - "version" : "1.0.4" - } - }, { "identity" : "swifterswift", "kind" : "remoteSourceControl", diff --git a/packages/frontend/apps/ios/App/App/ApplicationBridgedWindowScript.swift b/packages/frontend/apps/ios/App/App/ApplicationBridgedWindowScript.swift index 06f275a71c..aa2c080e6d 100644 --- a/packages/frontend/apps/ios/App/App/ApplicationBridgedWindowScript.swift +++ b/packages/frontend/apps/ios/App/App/ApplicationBridgedWindowScript.swift @@ -8,15 +8,21 @@ import Foundation import WebKit +/* + packages/frontend/apps/ios/src/app.tsx + */ + enum ApplicationBridgedWindowScript: String { case getCurrentDocContentInMarkdown = "return await window.getCurrentDocContentInMarkdown();" case getCurrentServerBaseUrl = "window.getCurrentServerBaseUrl()" case getCurrentWorkspaceId = "window.getCurrentWorkspaceId();" case getCurrentDocId = "window.getCurrentDocId();" - + case getCurrentI18nLocale = "window.getCurrentI18nLocale();" + case createNewDocByMarkdownInCurrentWorkspace = "return await window.createNewDocByMarkdownInCurrentWorkspace(markdown, title);" + var requiresAsyncContext: Bool { switch self { - case .getCurrentDocContentInMarkdown: return true + case .getCurrentDocContentInMarkdown, .createNewDocByMarkdownInCurrentWorkspace: return true default: return false } } diff --git a/packages/frontend/apps/ios/App/Packages/AffineGraphQL/.gitignore b/packages/frontend/apps/ios/App/Packages/AffineGraphQL/.gitignore index 24e5b0a1ae..63613baa13 100644 --- a/packages/frontend/apps/ios/App/Packages/AffineGraphQL/.gitignore +++ b/packages/frontend/apps/ios/App/Packages/AffineGraphQL/.gitignore @@ -1 +1,2 @@ .build +apollo-ios-cli diff --git a/packages/frontend/apps/ios/App/Packages/AffineGraphQL/Package.swift b/packages/frontend/apps/ios/App/Packages/AffineGraphQL/Package.swift index c87014c634..14a8270da4 100644 --- a/packages/frontend/apps/ios/App/Packages/AffineGraphQL/Package.swift +++ b/packages/frontend/apps/ios/App/Packages/AffineGraphQL/Package.swift @@ -14,7 +14,7 @@ let package = Package( .library(name: "AffineGraphQL", targets: ["AffineGraphQL"]), ], dependencies: [ - .package(url: "https://github.com/apollographql/apollo-ios", exact: "1.18.0"), + .package(url: "https://github.com/apollographql/apollo-ios", exact: "1.22.0"), ], targets: [ .target( diff --git a/packages/frontend/apps/ios/App/Packages/AffineGraphQL/apollo-ios-cli b/packages/frontend/apps/ios/App/Packages/AffineGraphQL/apollo-ios-cli deleted file mode 100755 index 9e1105405c..0000000000 Binary files a/packages/frontend/apps/ios/App/Packages/AffineGraphQL/apollo-ios-cli and /dev/null differ diff --git a/packages/frontend/apps/ios/App/Packages/Intelligents/Package.swift b/packages/frontend/apps/ios/App/Packages/Intelligents/Package.swift index c26ebbe3a8..f3b46225ae 100644 --- a/packages/frontend/apps/ios/App/Packages/Intelligents/Package.swift +++ b/packages/frontend/apps/ios/App/Packages/Intelligents/Package.swift @@ -14,7 +14,7 @@ let package = Package( ], dependencies: [ .package(path: "../AffineGraphQL"), - .package(url: "https://github.com/apollographql/apollo-ios.git", from: "1.18.0"), + .package(url: "https://github.com/apollographql/apollo-ios.git", from: "1.22.0"), .package(url: "https://github.com/apple/swift-collections", from: "1.2.0"), .package(url: "https://github.com/devxoul/Then", from: "3.0.0"), .package(url: "https://github.com/SnapKit/SnapKit.git", from: "5.7.1"), diff --git a/packages/frontend/apps/ios/App/Packages/Intelligents/Sources/Intelligents/Interface/View/InputBox/InputBoxFunctionBar.swift b/packages/frontend/apps/ios/App/Packages/Intelligents/Sources/Intelligents/Interface/View/InputBox/InputBoxFunctionBar.swift index cdd9176703..fc57bf28c7 100644 --- a/packages/frontend/apps/ios/App/Packages/Intelligents/Sources/Intelligents/Interface/View/InputBox/InputBoxFunctionBar.swift +++ b/packages/frontend/apps/ios/App/Packages/Intelligents/Sources/Intelligents/Interface/View/InputBox/InputBoxFunctionBar.swift @@ -97,6 +97,7 @@ class InputBoxFunctionBar: UIView { make.width.height.equalTo(32) } } + sendButton.layer.cornerRadius = 16 updateColors() } @@ -105,14 +106,6 @@ class InputBoxFunctionBar: UIView { fatalError("init(coder:) has not been implemented") } - override func layoutSubviews() { - super.layoutSubviews() - sendButton.layer.cornerRadius = sendButton.bounds.height / 2 - for button in [toolButton, networkButton, deepThinkingButton] { - button.layer.cornerRadius = button.bounds.height / 2 - } - } - override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { super.traitCollectionDidChange(previousTraitCollection) if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) { diff --git a/packages/frontend/apps/ios/App/Packages/Intelligents/Sources/Intelligents/Model/BridgedWindowScript.swift b/packages/frontend/apps/ios/App/Packages/Intelligents/Sources/Intelligents/Model/BridgedWindowScript.swift new file mode 100644 index 0000000000..8701e06dba --- /dev/null +++ b/packages/frontend/apps/ios/App/Packages/Intelligents/Sources/Intelligents/Model/BridgedWindowScript.swift @@ -0,0 +1,53 @@ +// +// ApplicationBridgedWindowScript.swift +// App +// +// Created by ็ง‹ๆ˜Ÿๆกฅ on 2025/1/8. +// + +import Foundation +import WebKit + +/* + packages/frontend/apps/ios/src/app.tsx + */ + +enum BridgedWindowScript: String { + case getCurrentDocContentInMarkdown = "return await window.getCurrentDocContentInMarkdown();" + case getCurrentServerBaseUrl = "window.getCurrentServerBaseUrl()" + case getCurrentWorkspaceId = "window.getCurrentWorkspaceId();" + case getCurrentDocId = "window.getCurrentDocId();" + case getCurrentI18nLocale = "window.getCurrentI18nLocale();" + case createNewDocByMarkdownInCurrentWorkspace = "return await window.createNewDocByMarkdownInCurrentWorkspace(markdown, title);" + + var requiresAsyncContext: Bool { + switch self { + case .getCurrentDocContentInMarkdown, .createNewDocByMarkdownInCurrentWorkspace: return true + default: return false + } + } +} + +extension WKWebView { + func evaluateScript(_ script: BridgedWindowScript, callback: @escaping (Any?) -> ()) { + if script.requiresAsyncContext { + callAsyncJavaScript( + script.rawValue, + arguments: [:], + in: nil, + in: .page + ) { result in + switch result { + case .success(let input): + callback(input) + case .failure: + callback(nil) + } + } + } else { + evaluateJavaScript(script.rawValue) { output, _ in callback(output) } + } + } +} + + diff --git a/packages/frontend/apps/ios/App/Packages/Intelligents/Sources/Intelligents/Model/IntelligentContext.swift b/packages/frontend/apps/ios/App/Packages/Intelligents/Sources/Intelligents/Model/IntelligentContext.swift index 605ff9261e..3a1f3132e1 100644 --- a/packages/frontend/apps/ios/App/Packages/Intelligents/Sources/Intelligents/Model/IntelligentContext.swift +++ b/packages/frontend/apps/ios/App/Packages/Intelligents/Sources/Intelligents/Model/IntelligentContext.swift @@ -15,6 +15,14 @@ public class IntelligentContext { public var webView: WKWebView! + public private(set) var metadata: [MetadataKey: Any] = [:] + public enum MetadataKey: String { + case currentDocId + case currentWorkspaceId + case currentServerBaseUrl + case currentI18nLocale + } + public lazy var temporaryDirectory: URL = { let tempDir = FileManager.default.temporaryDirectory return tempDir.appendingPathComponent("IntelligentContext") @@ -25,7 +33,27 @@ public class IntelligentContext { public func preparePresent(_ completion: @escaping () -> Void) { DispatchQueue.global(qos: .userInitiated).async { [self] in prepareTemporaryDirectory() - // TODO: used to gathering information, populate content from webview, etc. + + let group = DispatchGroup() + var newMetadata: [MetadataKey: Any] = [:] + let keysAndScripts: [(MetadataKey, BridgedWindowScript)] = [ + (.currentDocId, .getCurrentDocId), + (.currentWorkspaceId, .getCurrentWorkspaceId), + (.currentServerBaseUrl, .getCurrentServerBaseUrl), + (.currentI18nLocale, .getCurrentI18nLocale) + ] + for (key, script) in keysAndScripts { + DispatchQueue.main.async { + self.webView.evaluateScript(script) { value in + newMetadata[key] = value // if unable to fetch, clear it + group.leave() + } + } + group.enter() + } + self.metadata = newMetadata + group.wait() + print("IntelligentContext metadata prepared: \(self.metadata)") DispatchQueue.main.async { completion() } diff --git a/packages/frontend/apps/ios/apollo-codegen-chore.sh b/packages/frontend/apps/ios/apollo-codegen-chore.sh new file mode 100755 index 0000000000..d0619a80cc --- /dev/null +++ b/packages/frontend/apps/ios/apollo-codegen-chore.sh @@ -0,0 +1,29 @@ +#!/bin/zsh + +cd "$(dirname "$0")" + +set -euo pipefail + +VERSION=$(grep -o 'apollo-ios", exact: "[^"]*"' "App/Packages/AffineGraphQL/Package.swift" | sed 's/.*exact: "\([^"]*\)".*/\1/') +[ -z "$VERSION" ] && { echo "โŒ Failed to extract version"; exit 1; } +echo "๐Ÿ“ฆ Apollo Version: $VERSION" + +sed -i '' "s|apollo-ios\.git\", from: \"[^\"]*\"|apollo-ios.git\", from: \"$VERSION\"|" "App/Packages/Intelligents/Package.swift" +echo "โœ… Version synced" + +mkdir -p "App/Packages/AffineGraphQL/apollo-ios-cli" +curl -L "https://github.com/apollographql/apollo-ios/releases/download/$VERSION/apollo-ios-cli.tar.gz" | tar -xz -C "App/Packages/AffineGraphQL/apollo-ios-cli" +echo "โœ… CLI downloaded" + +CLI_BIN=$(find App/Packages/AffineGraphQL/apollo-ios-cli -type f -perm +111 -name 'apollo-ios-cli' | head -n 1) +[ -z "$CLI_BIN" ] && { echo "โŒ apollo-ios-cli executable not found"; exit 1; } +echo "๐Ÿ”ง Using binary tool at: $CLI_BIN" + +$CLI_BIN generate --path "apollo-codegen-config.json" --ignore-version-mismatch +echo "โœ… Code generated" + +rm -rf "App/Packages/AffineGraphQL/apollo-ios-cli" +echo "๐Ÿงน Cleaned up" + + + diff --git a/packages/frontend/apps/ios/codegen.ts b/packages/frontend/apps/ios/codegen.ts index c470578ae0..fa61df1e34 100644 --- a/packages/frontend/apps/ios/codegen.ts +++ b/packages/frontend/apps/ios/codegen.ts @@ -10,10 +10,7 @@ const PackageRoot = iosPackage.path; console.log('[*] PackageRoot', PackageRoot); console.log('[*] graphql...'); -execSync( - `${PackageRoot}/App/Packages/AffineGraphQL/apollo-ios-cli generate --path ${PackageRoot}/apollo-codegen-config.json --ignore-version-mismatch`, - { stdio: 'inherit' } -); +execSync(`${PackageRoot}/apollo-codegen-chore.sh`, { stdio: 'inherit' }); console.log('[*] rust...'); execSync(