vdhamer / Photo-Club-Hub

iOS app for showcasing and viewing portfolios with curated fine-art photographic images.
MIT License
13 stars 1 forks source link
coredata fine-art gallery-viewer json maps photography photography-portfolio portfolio swift swiftui

[![Version][stable-version]][version-url] [![Contributors][contributors-shield]][contributors-url] [![Forks][forks-shield]][forks-url] [![Stargazers][stars-shield]][stars-url] [![Issues][issues-shield]][issues-url] [![Discussions][discussions-shield]][discussions-url] [![MIT License][license-shield]][license-url]

Screenshots of 3 screens

Table of Contents

About the Project

The App

This iOS app showcases photographs made by members of photography clubs. It thus serves as a permanent online gallery with selected work of these photographers.

The first versions of the app only supported a single photo club in Waalre, a town in the south of the Netherlands. Starting with release 2.0, support was added for multiple photo clubs. This allows viewers to see images from multiple clubs within a single app. It aims to provide a degree of uniformity, thus sparing the user from having to find each club's website, discovering how to navigate each site and how to browse through the individual images within a site. Starting in version 2 the app's name was changed from Photo Club Waalre to Photo Club Hub to emphasize the multi-club aspect.

To achieve this, the app fetches online software-readable lists of photo clubs, their lists of members and their curated images. This ensures that photo clubs, club members and member images can be added or changed without requiring an app update. It also allows the clubs to manage their own data.

See the chapter on how to add a club's data as 3 distict data layers or Levels.

Photo Clubs

The app showcases curated images made by members of photo clubs.

Photo clubs are the distinguishing feature of this app. You either look up a photo club and then find its members (the Portfolio screen) or you look up a photographer and then find the associated photo club (the Who's Who screen). Once you have chosen a club-and-member combination or a person-and-club combination, you can view the image portfolio for that club member.

(back to top)

The User Interface Screens

Usage of the various screens in the user interface:

(back to top)

## Features

(back to top)

## Adding Photo Clubs to the App > The app is designed so that the required information about photo clubs is provided and maintained by the clubs themselves. This is important because this allows the app to **support many clubs**. But is also also necessary in order to give clubs **control** over their own data: a club knows best what to mention regarding the club, who the current members are, who the club officers are, and - maybe most significantly - which images the members want in their portfolios. To add a club to the app, the app distinguishes 3 hierarchical layers of information: - `Level 1` consists of the club’s name and geographic location. - `Level 2` lists the members per club. - `Level 3` links to portfolios per club member.

We call these layers of information `Levels` because they need to be submitted in ascending order and, whenever the `Level` of a club increases, additional app features are automatically enabled for that club. A club can take as long as needed (days, weeks, months) before proceeding to a next level. This means that an app user will see clubs with different `Levels` throughout the app. To the user this simply means that some clubs have shared more information than others. Museums are added in the same way, although `Level 2` and `Level 3` are not applicable here. ![Screenshots of 3 screens](images/app_screenshots_EN.jpg "Screenshots of app") When a club is at `Level 1`, it shows up as a marker on the maps (leftmost screenshot). This is because the app knows the club's name and the latitude/longitude where it is based. When a club reaches `Level 2`, the app also knows the names and roles of club members. As illustrated in the center screenshot, the club and its members are now shown on the `Portfolio` and `Who's Who` screens. Clubs with zero members (as far as the app is concerned) are _not_ shown on these two screens. When a club reaches `Level 3`, the app is aware of the image portfolios of club member (rightmost screenshot), and allows app users to browse member photos. Different club members don't need to reach `Level 3` at the same time. Attempting to view a portfolio of a club member without an available portfolio will display a placeholder message.

(back to top)

## Installation

If you simly want to install the binary version of the app, just install it from Apple's app store ([link](https://apps.apple.com/nl/app/photo-club-hub/id1178324330?l=en)). ### Built-With
Details (click to expand)

* the [Swift](https://www.swift.org) programming language * Apple's [SwiftUI](https://developer.apple.com/xcode/swiftui/) user interface framework * Apple's [Core Data](https://developer.apple.com/documentation/coredata) framework for persistent storage ("database") * [Adobe Lightroom Classic](https://www.adobe.com/products/photoshop-lightroom.html) maintaining the portfolios (so far Fotogroep Waalre only) * a low cost [JuiceBox Pro](https://www.juicebox.net) JavaScript plugin for exporting from Adobe Lightroom (so far Fotogroep Waalre only) * GitHub's [SwiftyJSON](https://GitHub.com/SwiftyJSON/SwiftyJSON) package for accessing JSON content via paths (dictionaries that recursively contain dictionaries)
### Cloning the Repository To install the source code locally, it is easiest to use GitHub’s `Open with Xcode` feature.
Details (click to expand)

Developers who are comfortable running `git` from the command line should manage on their own. Xcode covers the installation of the binary on a physical device or on an Xcode iPhone/iPad simulator.
### Code Signing
Details (click to expand)

During the build you may be prompted to provide a developer license (personal or commercial) when you want to install the app on a physical device. This is a standard Apple iOS policy rather than something specific to this app.

Starting with iOS 16.0 you will also need to configure physical devices to allow them to run apps that have _not_ been distributed via the Apple App Store. This configuration requires enabling `Developer Mode` on the device using `Settings` > `Privacy & Security` > `Developer Mode`. Again, this is a standard Apple iOS policy. This doesn't apply to MacOS.
### Updating the App If you update to a newer build of the app, all app data stored in the device's internal data storage will remain available.
Details (click to expand)

If you instead choose to remove and reinstall the app, the locally stored database content will be lost. This is how iOS works. Fortunately, this has no real implications for the user as the data storage doesn't presently contain any relevant user data. So essentially you can regard the database as a cache: it lets the app launch quicker without waiting for content that has alread been fetched during a previous session. #### Schema Migration
    Details (click to expand)

    If the data structure has changed from one version to a later version, Core Data will automatically perform a so-called schema migration. If you remove and reinstall the app, the Core Data database is lost, but this isn't an issue as the database so far doesn't contain any user data. Schema migration is a standard feature of Apple's Core Data framework, although the app does its bit so that Core Data can track, for example, renamed struct types or renamed properties.

(back to top)

## Contributing

Bug fixes and new features are welcome. Before investing effort in designing, coding testing, and refining features, it is best to first describe the idea or functional change within a new or existing GitHub `Issue`. That allows for some upfront discussion and prevents wasted effort due to overlapping initiatives.

You can submit an `Issue` with a tag like ”enhancement" or “bug” without commiting to make the code changes yourself. Essentially that is an idea, bug, or feature request, rather than an offer to help. ### Developer contributions ### Other contributions

(back to top)

## The App Architecture The app uses a [SwiftUI-based MVVM](https://www.hackingwithswift.com/books/ios-swiftui/introducing-mvvm-into-your-swiftui-project) architecture pattern. ### MVVM Layers ### Role of the Database ### The Data Model ![Data model](images/dataModel.png "The data model") ### How Data is Loaded ### When Data is Loaded

(back to top)

## Administrative ### License Distributed under the MIT License. See `LICENSE.txt` for more information. ### Contact Peter van den Hamer - vdhamer@gmail.com Project Link: [https://github.com/vdhamer/Photo-Club-Hub](https://github.com/vdhamer/Photo-Club-Hub) ### Acknowledgments * The opening Prelude screen uses a photo of a colorful building by Greetje van Son. * The interactive Roadmap screen uses the [AvdLee/Roadmap](https://GitHub.com/AvdLee/Roadmap) package. The screen is currently disabled because the backend provider of Roadmap stopped supporting it. * The diagram with Core Data entities was generated using the [Core Data Model Editor](https://GitHub.com/Mini-Stef/Core-Data-Model-Editor) tool by Stéphane Millet. * JSON parsing uses the [SwiftyJSON/SwiftyJSON](https://GitHub.com/SwiftyJSON/SwiftyJSON) package.

(back to top)

[stable-version]: https://img.shields.io/github/v/release/vdhamer/Photo-Club-Hub?style=plastic&color=violet [version-url]: https://github.com/vdhamer/Photo-Club-Hub/releases [contributors-shield]: https://img.shields.io/github/contributors/vdhamer/Photo-Club-Hub?style=plastic [contributors-url]: https://github.com/vdhamer/Photo-Club-Hub/graphs/contributors [forks-shield]: https://img.shields.io/github/forks/vdhamer/Photo-Club-Hub?style=plastic&color=teal [forks-url]: https://github.com/vdhamer/Photo-Club-Hub/network/members [stars-shield]: https://img.shields.io/github/stars/vdhamer/Photo-Club-Hub?style=plastic [stars-url]: https://github.com/vdhamer/Photo-Club-Hub/stargazers [issues-shield]: https://img.shields.io/github/issues/vdhamer/Photo-Club-Hub?style=plastic [issues-url]: https://github.com/vdhamer/Photo-Club-Hub/issues [discussions-shield]: https://img.shields.io/github/discussions/vdhamer/Photo-Club-Hub?style=plastic&color=orange [discussions-url]: https://github.com/vdhamer/Photo-Club-Hub/discussions [license-shield]: https://img.shields.io/github/license/vdhamer/Photo-Club-Hub?style=plastic [license-url]: https://github.com/vdhamer/Photo-Club-Hub/blob/main/.github/LICENSE.md