123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- import WidgetKit
- import SwiftUI
- struct Provider: TimelineProvider {
- func placeholder(in context: Context) -> SimpleEntry {
- SimpleEntry(date: Date())
- }
- func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
- let entry = SimpleEntry(date: Date())
- completion(entry)
- }
- func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
- let currentDate = Date()
- let entry = SimpleEntry(date: currentDate)
- let timeline = Timeline(entries: [entry], policy: .atEnd)
- completion(timeline)
- }
- }
- struct SimpleEntry: TimelineEntry {
- let date: Date
- }
- struct ShortcutsEntryView: View {
- var entry: Provider.Entry
- // Format weekday name (e.g., "Monday")
- private var weekday: String {
- let formatter = DateFormatter()
- formatter.locale = Locale.current // ✅ respect user’s locale
- formatter.dateFormat = "EEEE" // full weekday name
- return formatter.string(from: Date())
- }
- var body: some View {
- Link(destination: URL(string: "logseq://mobile/go/quick-add")!) {
- VStack(alignment: .leading, spacing: 0) {
- // Top heading
- Link(destination: URL(string: "logseq://mobile")!) {
- HStack(alignment: .top, spacing: 8) {
- Text(weekday)
- .font(.subheadline)
- .bold()
- .foregroundColor(.white.opacity(0.5))
- .padding(.top, 4)
- Spacer()
- Image("LogseqLogo")
- .resizable()
- .scaledToFit()
- .frame(width: 30, height: 30)
- }
- }
- // Middle text
- Text("I have an idea...")
- .font(.headline)
- .bold()
- .foregroundColor(.white.opacity(0.8))
- Spacer(minLength: 0)
- // Bottom buttons row
- HStack(spacing: 8) {
- // Left button (audio waves)
- Link(destination: URL(string: "logseq://mobile/go/audio")!) {
- Image(systemName: "waveform")
- .font(.body)
- .foregroundColor(.white)
- .frame(maxWidth: .infinity, minHeight: 36)
- .background(Color.white.opacity(0.1))
- .clipShape(Capsule())
- .contentShape(Capsule())
- }
- // Right button (quick add)
- Link(destination: URL(string: "logseq://mobile/go/quick-add")!) {
- Image(systemName: "plus")
- .font(.body)
- .foregroundColor(.white)
- .frame(maxWidth: .infinity, minHeight: 36)
- .background(Color.white.opacity(0.1))
- .clipShape(Capsule())
- .contentShape(Capsule())
- }
- }
- }
- .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
- .padding(-8)
- }
- }
- }
- // Helper to support hex colors
- extension Color {
- init(hex: String) {
- let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
- var int: UInt64 = 0
- Scanner(string: hex).scanHexInt64(&int)
- let a, r, g, b: UInt64
- switch hex.count {
- case 3:
- (a, r, g, b) = (255,
- (int >> 8) * 17,
- (int >> 4 & 0xF) * 17,
- (int & 0xF) * 17)
- case 6:
- (a, r, g, b) = (255,
- int >> 16,
- int >> 8 & 0xFF,
- int & 0xFF)
- case 8:
- (a, r, g, b) = (int >> 24,
- int >> 16 & 0xFF,
- int >> 8 & 0xFF,
- int & 0xFF)
- default:
- (a, r, g, b) = (255, 0, 0, 0)
- }
- self.init(
- .sRGB,
- red: Double(r) / 255,
- green: Double(g) / 255,
- blue: Double(b) / 255,
- opacity: Double(a) / 255
- )
- }
- }
- struct Shortcuts: Widget {
- let kind: String = "shortcuts"
- var body: some WidgetConfiguration {
- StaticConfiguration(kind: kind, provider: Provider()) { entry in
- if #available(iOS 17.0, *) {
- ShortcutsEntryView(entry: entry)
- .containerBackground(Color(hex: "#002b36"), for: .widget)
- } else {
- ZStack {
- Color(hex: "#002b36")
- ShortcutsEntryView(entry: entry)
- }
- }
- }
- .configurationDisplayName("Logseq Shortcuts")
- .description("Quick actions for Logseq")
- }
- }
- #Preview(as: .systemSmall) {
- Shortcuts()
- } timeline: {
- SimpleEntry(date: .now)
- }
|