Live data from Hacker News

I hacked my clock to control my focus

paepper.com

31–40 of 70 posts

Re: I hacked my clock to control my focus

#32
post #21

I built a simple SwiftUI/Swift Data app to do the same thing across my Apple Watch, iPhone, iPad and Desktop. With the heavy lifting of SwiftUI/Swift Data, and iCloud providing automatic and private syncing, this is the cloc output for my project, (including widgets and all of the code and projects needed to target all of these platforms.) ------------------------------------------------------------------------------…

You could post a gist of it, though. I’d love to do the same thing.

I might do that at some point... this is the main part of it, just a swift data model and one file of views. Plus a bunch of example code for making widgets work.

``` import Foundation import SwiftData

@Model final class FocusItem { let created: Date = Date() var completed: Date? var theFocus: String = "New Focus" var details: String?

    init(completed: Date? = nil, theFocus: String, details: String? = nil) {
        self.completed = completed
        self.theFocus = theFocus
        self.details = details
    }
}

struct FocusItemDescriptors { static let currentFocusPredicate = #Predicate { $0.completed == nil }

    static let sortDescriptor = SortDescriptor(\FocusItem.created, order: .reverse)

    static let currentFocusFetchDescriptor = FetchDescriptor(
        predicate: currentFocusPredicate, sortBy: [sortDescriptor])
} ```

``` import SwiftData import SwiftUI import WidgetKit

struct ContentView: View { @Query( filter: FocusItemDescriptors.currentFocusPredicate, sort: [FocusItemDescriptors.sortDescriptor]) private var items: [FocusItem] @Environment(\.modelContext) private var modelContext

  @State private var isAddingNewItem = false
  @State private var newFocusText = ""

  var body: some View {
    NavigationStack {
      List {
        ForEach(items) { item in
          NavigationLink {
            FocusItemDetailView(item: item)
          } label: {
            Text(item.theFocus)
          }
        }
        .onDelete(perform: deleteItems)
      }
      .navigationTitle("Focus")
      .toolbar {
        #if os(iOS)
          ToolbarItem(placement: .navigationBarTrailing) {
            EditButton()
          }
        #endif
        ToolbarItem {
          Button(action: addItem) {
            Label("Add Item", systemImage: "plus")
          }
        }
      }
    }
    .sheet(isPresented: $isAddingNewItem) {
      AddFocusItemView(isPresented: $isAddingNewItem, addItem: addNewItemWithFocus)
    }
  }

  private func addItem() {
    isAddingNewItem = true
  }

  private func addNewItemWithFocus(_ focus: String) {
    withAnimation {
      let newItem = FocusItem(theFocus: focus)
      modelContext.insert(newItem)
      DataManager.shared.reloadWidgets()
    }
  }

  private func deleteItems(offsets: IndexSet) {
    withAnimation {
      for index in offsets {
        modelContext.delete(items[index])
      }
      DataManager.shared.reloadWidgets()
    }
  }
}

struct FocusItemDetailView: View { @Environment(\.dismiss) private var dismiss let item: FocusItem

  var body: some View {
    VStack {
      Text(item.theFocus)
      if let details = item.details {
        Text(details)
      }
      Text(
        "\(item.created, format: Date.FormatStyle(date: .numeric, time: .standard))"
      )
      Button {
        item.completed = Date()
        DataManager.shared.reloadWidgets()
        dismiss()
      } label: {
        Text("Mark as Complete")
      }
    }
  }
} struct AddFocusItemView: View { @Binding var isPresented: Bool let addItem: (String) -> Void @State private var newFocusText = ""

  var body: some View {
    NavigationView {
      Form {
        TextField("What is your focus?", text: $newFocusText, axis: .vertical)
          .lineLimit(3...10)
      }
      .navigationTitle("New Focus")
      .toolbar {
        ToolbarItem(placement: .cancellationAction) {
          Button("Cancel") {
            isPresented = false
          }
        }
        ToolbarItem(placement: .confirmationAction) {
          Button("Add") {
            addItem(newFocusText)
            isPresented = false
          }
          .disabled(newFocusText.isEmpty)
        }
      }
    }
  }
```

Re: I hacked my clock to control my focus

#34

I've added an hourly chime to my work computer's clock, similar to a Casio wristwatch. It's a subtle reminder of the passing time, prompting me to pause, reflect, and reassess my actions to stay on track and avoid procrastination. I like this constant on screen reminder though and might give it a try myself :)

Pairing that with the on-screen focus prompt could create a nice feedback loop.

Re: I hacked my clock to control my focus

#36

A timer is one of the most underrated ways to stay focused.[1] We have all been there where you are supposed to work on that boring but critical bug for the project, where a few other team members are waiting, but you end up booking a domain, building a landing page, and launching a waiting list. By dinner, as you are talking to potential alpha users in your community and start spreading the word, you realize you hav…

There's something about a physical timer that creates a sense of presence digital ones just can't replicate

Re: I hacked my clock to control my focus

#37
post #27

I've added an hourly chime to my work computer's clock, similar to a Casio wristwatch. It's a subtle reminder of the passing time, prompting me to pause, reflect, and reassess my actions to stay on track and avoid procrastination. I like this constant on screen reminder though and might give it a try myself :)

The gods confound the man who first found out how to distinguish hours! Confound him, too, who in this place set up a sundial, to cut and hack my days so wretchedly into small portions! When I was a boy, my belly was my sundial — one surer, truer, and more exact than any of them. This dial told me when ’twas proper time to go to dinner, when I had aught to eat; But nowadays, why even when I have, I can’t fall-to unle…

(Originally posted 2225 years ago: https://la.wikisource.org/wiki/Comoediae_(Plautus)_-_Boeotia )

Re: I hacked my clock to control my focus

#38
I spend all my time in Emacs so I implemented a similar thing there. Been using it for, hmm.. a decade now?

Org-mode includes clock in/out features and can display this in either the modeline or frame title (or both). I did the frame title because it's basically unused space otherwise.

I used to use this in conjunction with the Pomodoro method. I don't need to use that these days, though.

I can easily add a task to any project, or the currently active one, without breaking my flow at any time. I recently added an "immediate" task that will instantly clock me in for those things that randomly come up during the day.

The nice thing is I get a complete breakdown of how all my time was spent during the week. I need to report on this for current job so it's a win/win.

This is also a good example of why I use Emacs. I hacked this together in a few minutes and been using and building on it for years.

Post reply on HN