LarpixClient/node_modules/@capacitor/status-bar/ios/Sources/StatusBarPlugin/StatusBarPlugin.swift
2026-05-08 18:07:14 +02:00

134 lines
4.7 KiB
Swift

import Foundation
import Capacitor
/**
* StatusBar plugin. Requires "View controller-based status bar appearance" to
* be "YES" in Info.plist
*/
@objc(StatusBarPlugin)
public class StatusBarPlugin: CAPPlugin, CAPBridgedPlugin {
public let identifier = "StatusBarPlugin"
public let jsName = "StatusBar"
public let pluginMethods: [CAPPluginMethod] = [
CAPPluginMethod(name: "setStyle", returnType: CAPPluginReturnPromise),
CAPPluginMethod(name: "setBackgroundColor", returnType: CAPPluginReturnPromise),
CAPPluginMethod(name: "show", returnType: CAPPluginReturnPromise),
CAPPluginMethod(name: "hide", returnType: CAPPluginReturnPromise),
CAPPluginMethod(name: "getInfo", returnType: CAPPluginReturnPromise),
CAPPluginMethod(name: "setOverlaysWebView", returnType: CAPPluginReturnPromise)
]
private var statusBar: StatusBar?
private let statusBarVisibilityChanged = "statusBarVisibilityChanged"
private let statusBarOverlayChanged = "statusBarOverlayChanged"
override public func load() {
guard let bridge = bridge else { return }
statusBar = StatusBar(bridge: bridge, config: statusBarConfig())
}
private func statusBarConfig() -> StatusBarConfig {
var config = StatusBarConfig()
config.overlaysWebView = getConfig().getBoolean("overlaysWebView", config.overlaysWebView)
if let colorConfig = getConfig().getString("backgroundColor"), let color = UIColor.capacitor.color(fromHex: colorConfig) {
config.backgroundColor = color
}
if let configStyle = getConfig().getString("style") {
config.style = style(fromString: configStyle)
}
return config
}
private func style(fromString: String) -> UIStatusBarStyle {
switch fromString.lowercased() {
case "dark", "lightcontent":
return .lightContent
case "light", "darkcontent":
return .darkContent
case "default":
return .default
default:
return .default
}
}
@objc func setStyle(_ call: CAPPluginCall) {
let options = call.options!
if let styleString = options["style"] as? String {
statusBar?.setStyle(style(fromString: styleString))
}
call.resolve([:])
}
@objc func setBackgroundColor(_ call: CAPPluginCall) {
guard
let hexString = call.options["color"] as? String,
let color = UIColor.capacitor.color(fromHex: hexString)
else { return }
DispatchQueue.main.async { [weak self] in
self?.statusBar?.setBackgroundColor(color)
}
call.resolve()
}
@objc func hide(_ call: CAPPluginCall) {
let animation = call.getString("animation", "FADE")
DispatchQueue.main.async { [weak self] in
self?.statusBar?.hide(animation: animation)
guard
let info = self?.statusBar?.getInfo(),
let dict = self?.toDict(info),
let event = self?.statusBarVisibilityChanged
else { return }
self?.notifyListeners(event, data: dict)
}
call.resolve()
}
@objc func show(_ call: CAPPluginCall) {
let animation = call.getString("animation", "FADE")
DispatchQueue.main.async { [weak self] in
self?.statusBar?.show(animation: animation)
guard
let info = self?.statusBar?.getInfo(),
let dict = self?.toDict(info),
let event = self?.statusBarVisibilityChanged
else { return }
self?.notifyListeners(event, data: dict)
}
call.resolve()
}
@objc func getInfo(_ call: CAPPluginCall) {
DispatchQueue.main.async { [weak self] in
guard
let info = self?.statusBar?.getInfo(),
let dict = self?.toDict(info)
else { return }
call.resolve(dict)
}
}
@objc func setOverlaysWebView(_ call: CAPPluginCall) {
guard let overlay = call.options["overlay"] as? Bool else { return }
DispatchQueue.main.async { [weak self] in
self?.statusBar?.setOverlaysWebView(overlay)
guard
let info = self?.statusBar?.getInfo(),
let dict = self?.toDict(info),
let event = self?.statusBarOverlayChanged
else { return }
self?.notifyListeners(event, data: dict)
}
call.resolve()
}
private func toDict(_ info: StatusBarInfo) -> [String: Any] {
return [
"visible": info.visible!,
"style": info.style!,
"color": info.color!,
"overlays": info.overlays!,
"height": info.height!
]
}
}