mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-25 00:45:21 +00:00
* Remove "street" location channel; add coverage + names; style mesh - Drop GeohashChannelLevel.street and update mappings/tests\n- Map geohash lengths >=8 to Block in teleport, no Street\n- Show ~distance coverage (mi/km via Locale.measurementSystem) next to each #geohash\n- Add reverse geocoding to display coarse names (country/region/city/neighborhood) per level\n- Style "#mesh" row title with toolbar blue\n- Fix iOS 16 deprecation: use Locale.measurementSystem * Project: update Xcode project (auto) * UI: use '~' without trailing space before location name in sheet * Location sheet: poll for location at regular intervals while open (replace significant-move updates) * UI: show Bluetooth range next to #bluetooth in location sheet * UI: remove leading '#' from mesh title in location sheet * UI: bold location name in sheet when geohash has >0 people; refactor row to render subtitle pieces * UI: bold mesh/level titles when participant count > 0; factor meshCount() --------- Co-authored-by: jack <jackjackbits@users.noreply.github.com>
68 lines
1.6 KiB
Swift
68 lines
1.6 KiB
Swift
import Foundation
|
|
|
|
/// Levels of location channels mapped to geohash precisions.
|
|
enum GeohashChannelLevel: CaseIterable, Codable, Equatable {
|
|
case block
|
|
case neighborhood
|
|
case city
|
|
case region
|
|
case country
|
|
|
|
/// Geohash length used for this level.
|
|
var precision: Int {
|
|
switch self {
|
|
case .block: return 7
|
|
case .neighborhood: return 6
|
|
case .city: return 5
|
|
case .region: return 4
|
|
case .country: return 2
|
|
}
|
|
}
|
|
|
|
var displayName: String {
|
|
switch self {
|
|
case .block: return "Block"
|
|
case .neighborhood: return "Neighborhood"
|
|
case .city: return "City"
|
|
case .region: return "Region"
|
|
case .country: return "Country"
|
|
}
|
|
}
|
|
}
|
|
|
|
/// A computed geohash channel option.
|
|
struct GeohashChannel: Codable, Equatable, Hashable, Identifiable {
|
|
let level: GeohashChannelLevel
|
|
let geohash: String
|
|
|
|
var id: String { "\(level)-\(geohash)" }
|
|
|
|
var displayName: String {
|
|
"\(level.displayName) • \(geohash)"
|
|
}
|
|
}
|
|
|
|
/// Identifier for current public chat channel (mesh or a location geohash).
|
|
enum ChannelID: Equatable, Codable {
|
|
case mesh
|
|
case location(GeohashChannel)
|
|
|
|
/// Human readable name for UI.
|
|
var displayName: String {
|
|
switch self {
|
|
case .mesh:
|
|
return "Mesh"
|
|
case .location(let ch):
|
|
return ch.displayName
|
|
}
|
|
}
|
|
|
|
/// Nostr tag value for scoping (geohash), if applicable.
|
|
var nostrGeohashTag: String? {
|
|
switch self {
|
|
case .mesh: return nil
|
|
case .location(let ch): return ch.geohash
|
|
}
|
|
}
|
|
}
|