{"id":23150999,"url":"https://github.com/anconaesselmann/loadableview","last_synced_at":"2025-08-17T19:32:13.460Z","repository":{"id":56919904,"uuid":"455092956","full_name":"anconaesselmann/LoadableView","owner":"anconaesselmann","description":"LoadableViews reduces boilerplate when creating SwiftUI views that have loading/loaded/error states.","archived":false,"fork":false,"pushed_at":"2024-12-03T20:06:19.000Z","size":105,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-12-03T21:19:51.709Z","etag":null,"topics":["swiftui"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/anconaesselmann.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-02-03T08:56:32.000Z","updated_at":"2024-12-03T20:05:48.000Z","dependencies_parsed_at":"2023-10-29T09:26:55.506Z","dependency_job_id":"2eb08602-ccbe-4151-a9fe-7e4add809cd9","html_url":"https://github.com/anconaesselmann/LoadableView","commit_stats":null,"previous_names":[],"tags_count":35,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anconaesselmann%2FLoadableView","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anconaesselmann%2FLoadableView/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anconaesselmann%2FLoadableView/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anconaesselmann%2FLoadableView/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anconaesselmann","download_url":"https://codeload.github.com/anconaesselmann/LoadableView/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":230160655,"owners_count":18182731,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["swiftui"],"created_at":"2024-12-17T18:19:45.562Z","updated_at":"2024-12-17T18:19:46.033Z","avatar_url":"https://github.com/anconaesselmann.png","language":"Swift","readme":"# LoadableView\n\n`LoadableView` reduces boilerplate when creating SwiftUI views that have loading/loaded/error states.\n\n## Author\n\nAxel Ancona Esselmann, axel@anconaesselmann.com\n\n## License\n\nLoadableView is available under the MIT license. See the LICENSE file for more info.\n\n## Usage\n\nFor a none-trivial example take a look at the example app [Books](https://github.com/anconaesselmann/Books), which demostrates the usage of LoadableView using the [OpenLibrary API](https://openlibrary.org/dev/docs/restful_api)\n\n\n`LoadableView` is great for fetching lists of things:\n\n```swift\nimport SwiftUI\nimport LoadableView\n\nstruct Book {\n    let name: String\n}\n\nstruct BooksView: DefaultLoadableView {\n    @StateObject\n    var vm = BooksViewModel()\n\n    func loaded(_ books: [Book]) -\u003e some View {\n        List {\n            ForEach(books) { book in\n                Text(book.name)\n            }\n        }\n    }\n}\n\n@MainActor\nfinal class BooksViewModel: LoadableViewModel {\n\n    @Published\n    var viewState: ViewState\u003c[Book]\u003e = .notLoaded\n\n    var overlayState: OverlayState = .none\n\n    private let service = BookService()\n\n    func load() async throws -\u003e [Book] {\n        try await service.fetchAll()\n    }\n}\n```\n\nResources that have an ID use `IDedLoadableView`:\n\n```swift\nimport SwiftUI\nimport LoadableView\n\nstruct BookView: IDedDefaultLoadableView {\n\n    var id: UUID\n\n    @StateObject\n    var vm = BookViewModel()\n\n    func loaded(_ book: Book) -\u003e some View {\n        VStack {\n            Text(book.name)\n        }\n    }\n}\n\n@MainActor\nfinal class BookViewModel: IDedLoadableViewModel {\n\n    var id: UUID?\n\n    @Published\n    var viewState: ViewState\u003cBook\u003e = .notLoaded\n\n    var overlayState: OverlayState = .none\n\n    private let service = BookService()\n\n    func load(id: UUID) async throws -\u003e Book {\n        try await service.fetchBook(withId: id)\n    }\n}\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanconaesselmann%2Floadableview","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanconaesselmann%2Floadableview","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanconaesselmann%2Floadableview/lists"}