Files
Felitendo ff0d3108fe feat: merge the web dashboard into the monorepo as ftstore admin
FTStore now holds both halves of the product:

  ios/   the swift app — the fork of claration/Feather, unchanged apart
         from its new home
  web/   FTStore Admin, formerly its own repository. serves the
         dashboard at /admin, the ftstore.json feed and IPA downloads

app-repo.json and Images/ stay at the repo root on purpose: the former is
a published AltStore source whose raw.githubusercontent URL is what
installed copies resolve updates through, so moving it would break every
subscriber.

The admin server is renamed throughout: package ftstore-admin, images
ghcr.io/<owner>/ftstore-admin-{app,worker}, postgres role/db ftstore,
session cookie ftstore_session, temp dir /tmp/ftstore, backup type
ftstore-settings, outbound user-agent FTStoreAdmin. backups written under the old
name still import, and compose is pinned to name: ftstore so the
volume prefix does not follow the directory name.

apply-rebrand.sh gains a relocation step: upstream's tree is rooted at
the repo root while ours lives in ios/, so a merge drops Feather's files
next to ios/ and the script folds them in before renaming. it never
touches web/. still idempotent.

release tags are namespaced — v* for the app, web-v* for the server —
so a server release no longer triggers a macOS build or rewrites
app-repo.json. workflows are prefixed ios-/web- and path-filtered.
2026-08-03 10:25:03 +02:00

35 lines
800 B
Swift

//
// UlActivityViewController+Present.swift
// NimbleKit
//
// Created by samara on 30.04.2025.
//
import UIKit.UIActivityViewController
extension UIActivityViewController {
static public func show(
_ presenter: UIViewController = UIApplication.topViewController()!,
activityItems: [Any],
applicationActivities: [UIActivity]? = nil
) {
let controller = Self(
activityItems: activityItems,
applicationActivities: applicationActivities
)
if let popover = controller.popoverPresentationController {
popover.sourceView = presenter.view
popover.sourceRect = CGRect(
x: presenter.view.bounds.midX,
y: presenter.view.bounds.midY,
width: 0,
height: 0
)
popover.permittedArrowDirections = []
}
presenter.present(controller, animated: true)
}
}