Shortcut + New create post widget and control

This commit is contained in:
Lumaa 2024-08-11 00:53:57 +02:00
parent 70b17c6b96
commit c868b0cd2e
11 changed files with 356 additions and 906 deletions

View File

@ -43,6 +43,9 @@
B98BC7492B46CEDA00595441 /* AppearenceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B98BC7482B46CEDA00595441 /* AppearenceView.swift */; };
B98BC74B2B46CF0400595441 /* ThreadedStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = B98BC74A2B46CF0400595441 /* ThreadedStyle.swift */; };
B98BC74D2B46CFCE00595441 /* UserPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = B98BC74C2B46CFCE00595441 /* UserPreferences.swift */; };
B98DD8D62C681FDA009F40DD /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = B9FB948F2B2E2B0E00D81C07 /* Localizable.xcstrings */; };
B98DD8D82C6821F7009F40DD /* CreatePostControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = B98DD8D72C6821F7009F40DD /* CreatePostControl.swift */; };
B98DD8D92C6821F7009F40DD /* CreatePostControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = B98DD8D72C6821F7009F40DD /* CreatePostControl.swift */; };
B98F47962B645DF40092000F /* EmojiSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = B98F47952B645DF40092000F /* EmojiSelector.swift */; };
B98F47982B64670F0092000F /* ShopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B98F47972B64670F0092000F /* ShopView.swift */; };
B98F479A2B653CAE0092000F /* Compressor.swift in Sources */ = {isa = PBXBuildFile; fileRef = B98F47992B653CAE0092000F /* Compressor.swift */; };
@ -138,6 +141,9 @@
B9A80E932C67C7C300DE3D88 /* ReceiptParser in Frameworks */ = {isa = PBXBuildFile; productRef = B9A80E922C67C7C300DE3D88 /* ReceiptParser */; };
B9A80E952C67C7C300DE3D88 /* RevenueCat in Frameworks */ = {isa = PBXBuildFile; productRef = B9A80E942C67C7C300DE3D88 /* RevenueCat */; };
B9A80E972C67C7C300DE3D88 /* RevenueCatUI in Frameworks */ = {isa = PBXBuildFile; productRef = B9A80E962C67C7C300DE3D88 /* RevenueCatUI */; };
B9A80E9A2C67D56900DE3D88 /* FollowCountWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9C20D112B921C78004DC9B3 /* FollowCountWidget.swift */; };
B9A80E9B2C67D56900DE3D88 /* FollowGoalWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9B469AF2B9A275F00AD5585 /* FollowGoalWidget.swift */; };
B9A80E9C2C67D56900DE3D88 /* CreatePostWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9A80DDD2C67BFF800DE3D88 /* CreatePostWidget.swift */; };
B9A8DABA2BB7364300A890CC /* PostsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9A8DAB92BB7364300A890CC /* PostsView.swift */; };
B9B469B02B9A275F00AD5585 /* FollowGoalWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9B469AF2B9A275F00AD5585 /* FollowGoalWidget.swift */; };
B9B469B22B9A6E8300AD5585 /* PrivacyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9B469B12B9A6E8300AD5585 /* PrivacyView.swift */; };
@ -158,7 +164,6 @@
B9C20D142B921C78004DC9B3 /* AppIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9C20D132B921C78004DC9B3 /* AppIntent.swift */; };
B9C20D162B921C7B004DC9B3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B9C20D152B921C7B004DC9B3 /* Assets.xcassets */; };
B9C20D1A2B921C7B004DC9B3 /* ThreadedWidgetsExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = B9C20D092B921C78004DC9B3 /* ThreadedWidgetsExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
B9C20D1F2B921E81004DC9B3 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = B9C20D1E2B921E81004DC9B3 /* Localizable.xcstrings */; };
B9C20D342B9229EC004DC9B3 /* Client.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9FB949A2B2EF09A00D81C07 /* Client.swift */; };
B9C20D372B9229EC004DC9B3 /* AppInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9FB94A12B2EF24A00D81C07 /* AppInfo.swift */; };
B9C20D3D2B9229EC004DC9B3 /* Emoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9FB94872B2E223E00D81C07 /* Emoji.swift */; };
@ -283,6 +288,7 @@
B98BC7482B46CEDA00595441 /* AppearenceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppearenceView.swift; sourceTree = "<group>"; };
B98BC74A2B46CF0400595441 /* ThreadedStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreadedStyle.swift; sourceTree = "<group>"; };
B98BC74C2B46CFCE00595441 /* UserPreferences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserPreferences.swift; sourceTree = "<group>"; };
B98DD8D72C6821F7009F40DD /* CreatePostControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreatePostControl.swift; sourceTree = "<group>"; };
B98F47952B645DF40092000F /* EmojiSelector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiSelector.swift; sourceTree = "<group>"; };
B98F47972B64670F0092000F /* ShopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShopView.swift; sourceTree = "<group>"; };
B98F47992B653CAE0092000F /* Compressor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Compressor.swift; sourceTree = "<group>"; };
@ -312,7 +318,6 @@
B9C20D132B921C78004DC9B3 /* AppIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIntent.swift; sourceTree = "<group>"; };
B9C20D152B921C7B004DC9B3 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
B9C20D172B921C7B004DC9B3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
B9C20D1E2B921E81004DC9B3 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = "<group>"; };
B9C20D582B923CDD004DC9B3 /* ThreadedWidgetsExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = ThreadedWidgetsExtension.entitlements; sourceTree = "<group>"; };
B9C20D592B923D53004DC9B3 /* Threaded.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Threaded.entitlements; sourceTree = "<group>"; };
B9C7F46B2C387D3B009C36DC /* WarningView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WarningView.swift; sourceTree = "<group>"; };
@ -455,9 +460,9 @@
B9C20D112B921C78004DC9B3 /* FollowCountWidget.swift */,
B9B469AF2B9A275F00AD5585 /* FollowGoalWidget.swift */,
B9A80DDD2C67BFF800DE3D88 /* CreatePostWidget.swift */,
B98DD8D72C6821F7009F40DD /* CreatePostControl.swift */,
B9C20D132B921C78004DC9B3 /* AppIntent.swift */,
B9C20D152B921C7B004DC9B3 /* Assets.xcassets */,
B9C20D1E2B921E81004DC9B3 /* Localizable.xcstrings */,
B9C20D172B921C7B004DC9B3 /* Info.plist */,
);
path = ThreadedWidgets;
@ -787,7 +792,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B9C20D1F2B921E81004DC9B3 /* Localizable.xcstrings in Resources */,
B98DD8D62C681FDA009F40DD /* Localizable.xcstrings in Resources */,
B9C20D162B921C7B004DC9B3 /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -876,6 +881,7 @@
B9A80E0B2C67C4A600DE3D88 /* AccountRow.swift in Sources */,
B9A80E0C2C67C4A600DE3D88 /* ComingSoonView.swift in Sources */,
B9A80E0D2C67C4A600DE3D88 /* OnlineImage.swift in Sources */,
B98DD8D92C6821F7009F40DD /* CreatePostControl.swift in Sources */,
B9A80E0E2C67C4A600DE3D88 /* DynamicTextEditor.swift in Sources */,
B9A80E6F2C67C62800DE3D88 /* Message.swift in Sources */,
B9A80E0F2C67C4A600DE3D88 /* ContactRow.swift in Sources */,
@ -948,6 +954,7 @@
B93ADFCB2B7625CD00FF9172 /* DiscoveryView.swift in Sources */,
B9D9C6C72B6A590F00C26A41 /* ProfilePicture.swift in Sources */,
B9842C102B2F228C00D9F3C1 /* Status.swift in Sources */,
B98DD8D82C6821F7009F40DD /* CreatePostControl.swift in Sources */,
B9D9C6C32B6A576C00C26A41 /* NotificationsView.swift in Sources */,
B9FA6E772B82788A00D63E30 /* AccountRow.swift in Sources */,
B934EA242BAB5E7F001F4345 /* RestrictedView.swift in Sources */,
@ -973,6 +980,9 @@
B999DE5E2B76F9D100509868 /* Message.swift in Sources */,
B915C4422B6F908C00042DDB /* ProfileView.swift in Sources */,
B9FB94702B2DF3CD00D81C07 /* Navigator.swift in Sources */,
B9A80E9A2C67D56900DE3D88 /* FollowCountWidget.swift in Sources */,
B9A80E9B2C67D56900DE3D88 /* FollowGoalWidget.swift in Sources */,
B9A80E9C2C67D56900DE3D88 /* CreatePostWidget.swift in Sources */,
B9C7F46C2C387D3B009C36DC /* WarningView.swift in Sources */,
B9EBE8562B47256900FB594D /* PostAttachment.swift in Sources */,
B9EBE8582B474FD600FB594D /* AppDelegate.swift in Sources */,
@ -1055,13 +1065,13 @@
PRODUCT_BUNDLE_IDENTIFIER = fr.lumaa.Threaded.ThreadedWidgets;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator watchos watchsimulator";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,4";
TARGETED_DEVICE_FAMILY = 1;
WATCHOS_DEPLOYMENT_TARGET = 10.0;
};
name = Debug;
@ -1089,13 +1099,13 @@
PRODUCT_BUNDLE_IDENTIFIER = fr.lumaa.Threaded.ThreadedWidgets;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator watchos watchsimulator";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,4";
TARGETED_DEVICE_FAMILY = 1;
WATCHOS_DEPLOYMENT_TARGET = 10.0;
};
name = Release;
@ -1160,6 +1170,7 @@
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
WATCHOS_DEPLOYMENT_TARGET = 10.0;
};
@ -1218,6 +1229,7 @@
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_EMIT_LOC_STRINGS = YES;
VALIDATE_PRODUCT = YES;
WATCHOS_DEPLOYMENT_TARGET = 10.0;
};

View File

@ -34,5 +34,8 @@
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"localizable" : true
}
}

View File

@ -210,7 +210,20 @@
}
},
"account" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Account"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Compte"
}
}
}
},
"account.block" : {
"localizations" : {
@ -1096,6 +1109,38 @@
}
}
},
"control.open.composer" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "New post"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nouvelle publication"
}
}
}
},
"control.open.composer.description" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Create a new post"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Créer une nouvelle publication"
}
}
}
},
"discovery" : {
"localizations" : {
"en" : {
@ -1545,10 +1590,36 @@
}
},
"intent.open.composer" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Start a new post"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Démarrer une nouvelle publication"
}
}
}
},
"intent.open.composer.description" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Opens the Threaded app with the post composer "
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ouvre lapplication Threaded avec le compositeur de publications"
}
}
}
},
"login.instance.unsafe" : {
"localizations" : {
@ -4450,23 +4521,149 @@
}
}
},
"widget.composer" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Quick Post"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Publication Rapide"
}
}
}
},
"widget.follow-count" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Follow Count"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Compteur de Followers"
}
}
}
},
"widget.follow-count.description" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Keep track of your follower count"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Garder trace de votre nombre de followers"
}
}
}
},
"widget.follow-goal" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Follow Goal"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Objectif de Followers"
}
}
}
},
"widget.follow-goal.description" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Keep track of your follower count and set a goal for it"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gardez trace de votre nombre de followers et faites en un objectif"
}
}
}
},
"widget.followers" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "followers"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "followers"
}
}
}
},
"widget.open.composer" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Create a new post"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Créez une nouvelle publication"
}
}
}
},
"widget.select-account" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Select an account"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sélectionnez un compte"
}
}
}
},
"widget.set-goal" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Follower goal"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Objectif de follower"
}
}
}
}
},
"version" : "1.0"

View File

@ -113,7 +113,7 @@ struct OpenComposerIntent: AppIntent {
static var isDiscoverable: Bool = true
static var openAppWhenRun: Bool = true
static var authenticationPolicy: IntentAuthenticationPolicy = .requiresAuthentication
static var authenticationPolicy: IntentAuthenticationPolicy = .requiresLocalDeviceAuthentication
func perform() async throws -> some IntentResult {
UniversalNavigator.static.presentedSheet =

View File

@ -0,0 +1,25 @@
{
"images" : [
{
"filename" : "HeroIcon_black.png",
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "HeroIcon_white.png",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"localizable" : true
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

View File

@ -0,0 +1,19 @@
// Made by Lumaa
import SwiftUI
import WidgetKit
@available(iOS 18.0, *)
struct CreatePostControl: ControlWidget {
let kind: String = "CreatePostControl"
var body: some ControlWidgetConfiguration {
StaticControlConfiguration(kind: kind) {
ControlWidgetButton(action: OpenComposerIntent()) {
Label("control.open.composer", systemImage: "square.and.pencil")
}
}
.displayName("control.open.composer")
.description("control.open.composer.description")
}
}

View File

@ -1,14 +1,85 @@
//// Made by Lumaa
// Made by Lumaa
import SwiftUI
import WidgetKit
struct CreatePostWidget: Widget {
let kind: String = "CreatePostWidget"
var body: some WidgetConfiguration {
StaticConfiguration(
kind: kind,
provider: Provider()
) { entry in
CreatePostWidget.WidgetView()
}
.configurationDisplayName("widget.open.composer")
.description("widget.open.composer")
.supportedFamilies([.systemSmall])
}
struct WidgetView: View {
@Environment(\.widgetFamily) private var family: WidgetFamily
@Environment(\.colorScheme) private var colorScheme: ColorScheme
struct CreatePostWidget: View {
var body: some View {
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
ZStack {
if family == .systemSmall {
VStack {
Button(intent: OpenComposerIntent()) {
Image(systemName: "square.and.pencil")
.resizable()
.scaledToFit()
.frame(width: 80, height: 80)
}
.buttonStyle(.plain)
Text("widget.composer")
.font(.caption)
}
}
}
.containerBackground(Color.appBackground, for: .widget)
}
}
struct Provider: TimelineProvider {
func getSnapshot(
in context: Context,
completion: @escaping @Sendable (CreatePostWidget.Entry) -> Void
) {
completion(.init(date: .now))
}
func getTimeline(
in context: Context,
completion: @escaping (Timeline<CreatePostWidget.Entry>) -> Void
) {
var entries: [CreatePostWidget.Entry] = []
// Generate a timeline consisting of two entries an hour apart, starting from the current date.
let currentDate = Date()
for hourOffset in 0 ..< 2 {
let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)!
let entry = CreatePostWidget.Entry(date: entryDate)
entries.append(entry)
}
completion(Timeline(entries: entries, policy: .atEnd))
}
func placeholder(in context: Context) -> CreatePostWidget.Entry {
return .init(date: .now)
}
}
struct Entry: TimelineEntry {
let date: Date
}
}
#Preview {
#Preview(as: .systemSmall) {
CreatePostWidget()
} timeline: {
CreatePostWidget.Entry(date: .now)
}

View File

@ -1,882 +0,0 @@
{
"sourceLanguage" : "en",
"strings" : {
"@%@" : {
},
"#%@" : {
},
"%@" : {
},
"%lld" : {
},
"about" : {
},
"about.app" : {
},
"about.app.details" : {
},
"about.app.third-party" : {
},
"about.lumaa" : {
},
"about.version-%@" : {
},
"accessibility.media.supported-type.audio.label" : {
"comment" : "A localized description of SupportedType.audio"
},
"accessibility.media.supported-type.gifv.label" : {
"comment" : "A localized description of SupportedType.gifv"
},
"accessibility.media.supported-type.image.label" : {
"comment" : "A localized description of SupportedType.image"
},
"accessibility.media.supported-type.video.label" : {
"comment" : "A localized description of SupportedType.video"
},
"account" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Account"
}
}
}
},
"account.block" : {
},
"account.edit" : {
},
"account.edit.apply" : {
},
"account.edit.bio" : {
},
"account.edit.bot" : {
},
"account.edit.cancel" : {
},
"account.edit.discoverable" : {
},
"account.edit.display" : {
},
"account.edit.field.name" : {
},
"account.edit.field.value" : {
},
"account.edit.fields" : {
},
"account.edit.fields.add" : {
},
"account.edit.info" : {
},
"account.edit.private" : {
},
"account.edit.properties" : {
},
"account.edit.sensitive" : {
},
"account.follow" : {
},
"account.follow-back" : {
},
"account.followers-%lld" : {
},
"account.mention" : {
},
"account.mute" : {
},
"account.no-statuses" : {
},
"account.unblock" : {
},
"account.unfollow" : {
},
"account.unmute" : {
},
"account.view" : {
},
"accounts.developer" : {
},
"accounts.official" : {
},
"activity" : {
},
"activity.favorite.%@" : {
},
"activity.followed.%@" : {
},
"activity.group.%@-%lld" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "activity.group.%1$@-%2$lld"
}
}
}
},
"activity.mentionned.%@" : {
},
"activity.messages" : {
},
"activity.messages.read" : {
},
"activity.no-notifications" : {
},
"activity.poll.%@" : {
},
"activity.reblogged.%@" : {
},
"activity.status.%@" : {
},
"activity.status.attachments-%lld" : {
},
"activity.tip.messages.desc" : {
},
"activity.tip.messages.title" : {
},
"activity.unknown" : {
},
"activity.update.%@" : {
},
"attachment.alt.action" : {
},
"attachment.close" : {
},
"attachment.next-image" : {
},
"attachment.no-attachments" : {
},
"attachment.previous-image" : {
},
"attachment.reset-move" : {
},
"beta.feature" : {
},
"coming-soon" : {
},
"discovery" : {
},
"discovery.app" : {
},
"discovery.results.posts" : {
},
"discovery.results.tags" : {
},
"discovery.results.users" : {
},
"discovery.search.posts" : {
},
"discovery.search.prompt" : {
},
"discovery.search.tags" : {
},
"discovery.search.users" : {
},
"discovery.suggested.users" : {
},
"discovery.trending.posts" : {
},
"discovery.trending.tags" : {
},
"duration.fiveMinutes" : {
},
"duration.infinite" : {
},
"duration.oneDay" : {
},
"duration.oneHour" : {
},
"duration.sevenDays" : {
},
"duration.sixHours" : {
},
"duration.thirtyMinutes" : {
},
"duration.threeDays" : {
},
"duration.twelveHours" : {
},
"error.loading-image" : {
},
"experimental" : {
},
"general.report.confirm" : {
},
"general.report.confirm.cancel" : {
},
"general.report.confirm.message" : {
},
"general.report.confirm.ok" : {
},
"Hello, World!" : {
},
"instance.rules" : {
},
"intent.open.composer" : {
},
"intent.open.composer.description" : {
},
"login.instance.unsafe" : {
},
"login.instance.unsafe.agree" : {
},
"login.instance.unsafe.description" : {
},
"login.instance.unsafe.disagree" : {
},
"login.mastodon" : {
},
"login.mastodon.footer" : {
},
"login.mastodon.instance" : {
},
"login.mastodon.login" : {
},
"login.mastodon.verify" : {
},
"login.mastodon.verify-error" : {
},
"login.no-account" : {
},
"login.no-account.footer" : {
},
"login.title" : {
},
"logout" : {
},
"posting.alt.apply" : {
},
"posting.alt.cancel" : {
},
"posting.alt.header" : {
},
"posting.alt.prompt" : {
},
"privacy" : {
},
"restricted.no-restricted" : {
},
"restricted.no-restricted.description" : {
},
"setting.app-icon" : {
},
"setting.app-icon.blue" : {
},
"setting.app-icon.default" : {
},
"setting.app-icon.pink" : {
},
"setting.app-icon.pride" : {
},
"setting.app-icon.purple" : {
},
"setting.app-icon.red" : {
},
"setting.app-icon.unknown" : {
},
"setting.app-icon.yellow" : {
},
"setting.appearence" : {
},
"setting.appearence.browser" : {
},
"setting.appearence.browser.in-app" : {
},
"setting.appearence.browser.out-app" : {
},
"setting.appearence.displayed-name" : {
},
"setting.appearence.displayed-name.both" : {
},
"setting.appearence.displayed-name.display-name" : {
},
"setting.appearence.displayed-name.username" : {
},
"setting.appearence.pfp-shape" : {
},
"setting.appearence.pfp-shape.circle" : {
},
"setting.appearence.pfp-shape.rounded" : {
},
"setting.appearence.reply-symbols" : {
},
"setting.experimental.activate" : {
},
"setting.privacy.default-visibility" : {
},
"setting.support" : {
},
"settings" : {
},
"settings.account-switcher.add" : {
},
"settings.account-switcher.current" : {
},
"settings.account-switcher.default" : {
},
"settings.account-switcher.log" : {
},
"settings.account-switcher.relog" : {
},
"settings.account-switcher.remove" : {
},
"settings.cancel" : {
},
"settings.content-filter.allow" : {
},
"settings.content-filter.auto" : {
},
"settings.content-filter.new-word" : {
},
"settings.content-filter.type" : {
},
"settings.content-filter.words" : {
},
"settings.content-filter.words.footer" : {
},
"settings.done" : {
},
"settings.privacy.clear" : {
},
"settings.privacy.clear-cache" : {
},
"settings.privacy.cleared" : {
},
"settings.privacy.filter" : {
},
"settings.privacy.restricted" : {
},
"settings.restart-app" : {
},
"shop.best" : {
},
"shop.features" : {
},
"shop.features.analytics" : {
},
"shop.features.analytics.description" : {
},
"shop.features.content-filter" : {
},
"shop.features.content-filter.description" : {
},
"shop.features.download-atchmnt" : {
},
"shop.features.download-atchmnt.description" : {
},
"shop.features.drafts" : {
},
"shop.features.drafts.description" : {
},
"shop.features.experimental" : {
},
"shop.features.experimental.description" : {
},
"shop.features.more-accounts" : {
},
"shop.features.more-accounts.description" : {
},
"shop.features.vip" : {
},
"shop.features.vip.description" : {
},
"shop.threaded-plus.dismiss" : {
},
"shop.threaded-plus.lifetime" : {
},
"shop.threaded-plus.monthly" : {
},
"shop.threaded-plus.monthly.price" : {
},
"shop.threaded-plus.subscribe" : {
},
"shop.threaded-plus.subscription" : {
},
"shop.threaded-plus.subscription.description" : {
},
"shop.threaded-plus.yearly" : {
},
"shop.threaded-plus.yearly.price" : {
},
"status.action.bookmark" : {
},
"status.action.like" : {
},
"status.action.unbookmark" : {
},
"status.action.unlike" : {
},
"status.content-filter.censor" : {
},
"status.content-filter.remove" : {
},
"status.cross-post.alts" : {
},
"status.editing" : {
},
"status.favourites-%lld" : {
},
"status.menu.copy-text" : {
},
"status.menu.delete" : {
},
"status.menu.edit" : {
},
"status.menu.report" : {
},
"status.menu.share" : {
},
"status.menu.share-image" : {
},
"status.menu.share-link" : {
},
"status.pinned" : {
},
"status.poll.expired" : {
},
"status.poll.expires-in.%@" : {
},
"status.poll.hide-results" : {
},
"status.poll.show-results" : {
},
"status.poll.submit" : {
},
"status.poll.voters.%lld" : {
},
"status.posting" : {
},
"status.posting.cancel" : {
},
"status.posting.no-emojis" : {
},
"status.posting.placeholder" : {
},
"status.posting.poll.disable-multi" : {
},
"status.posting.poll.enable-multi" : {
},
"status.posting.poll.expiry" : {
},
"status.posting.poll.option-%lld" : {
},
"status.posting.post" : {
},
"status.posting.visibility" : {
},
"status.posting.visibility.direct" : {
},
"status.posting.visibility.private" : {
},
"status.posting.visibility.public" : {
},
"status.posting.visibility.unlisted" : {
},
"status.replied-to.%@" : {
},
"status.replies-%lld" : {
},
"status.report" : {
},
"status.report.cancel" : {
},
"status.report.comment" : {
},
"status.report.preview" : {
},
"status.report.preview.footer" : {
},
"status.report.title" : {
},
"status.reposted-by.%@" : {
},
"support" : {
},
"support.discord" : {
},
"support.discord.description" : {
},
"support.discord.join" : {
},
"support.email" : {
},
"support.email.description" : {
},
"support.mail.no-mail" : {
},
"support.mail.send" : {
},
"support.mail.subject" : {
},
"support.matrix" : {
},
"support.matrix.description" : {
},
"support.matrix.join" : {
},
"support.mention" : {
},
"support.mention.description" : {
},
"support.mention.post" : {
},
"support.platform" : {
},
"tag.posts-%lld" : {
},
"tag.read" : {
},
"timeline.empty" : {
},
"timeline.empty.description" : {
},
"timeline.federated" : {
},
"timeline.home" : {
},
"timeline.latest" : {
},
"timeline.local" : {
},
"timeline.trending" : {
},
"tos.description" : {
},
"update.hide" : {
},
"update.title" : {
},
"warning.title" : {
},
"widget.follow-count" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Follower Count"
}
}
}
},
"widget.follow-count.description" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Get the current amount of followers of the accounts you have logged in Threaded"
}
}
}
},
"widget.follow-goal" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Follower Goal"
}
}
}
},
"widget.follow-goal.description" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Set a follower goal and see the progress"
}
}
}
},
"widget.followers" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Followers"
}
}
}
},
"widget.select-account" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Select an account"
}
}
}
},
"widget.set-goal" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Goal"
}
}
}
}
},
"version" : "1.0"
}

View File

@ -9,5 +9,10 @@ struct ThreadedWidgetsBundle: WidgetBundle {
var body: some Widget {
FollowCountWidget()
FollowGoalWidget()
CreatePostWidget()
if #available(iOS 18.0, *) {
CreatePostControl()
}
}
}