├── .swift-version
├── .swiftlint-ci.yml
├── Sources
├── KSuite
│ ├── Resources
│ │ └── Assets.xcassets
│ │ │ ├── Contents.json
│ │ │ ├── Colors
│ │ │ ├── Contents.json
│ │ │ └── menuBackgroundColor.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── euria.imageset
│ │ │ ├── euria.pdf
│ │ │ └── Contents.json
│ │ │ ├── microsoft.imageset
│ │ │ ├── Contents.json
│ │ │ └── microsoft.svg
│ │ │ ├── background.imageset
│ │ │ └── Contents.json
│ │ │ ├── drive.imageset
│ │ │ └── Contents.json
│ │ │ ├── folder.imageset
│ │ │ ├── Contents.json
│ │ │ └── folder.svg
│ │ │ ├── kchat.imageset
│ │ │ ├── Contents.json
│ │ │ └── kchat.svg
│ │ │ ├── rocket.imageset
│ │ │ └── Contents.json
│ │ │ ├── stair.imageset
│ │ │ ├── Contents.json
│ │ │ └── stair.svg
│ │ │ ├── envelope.imageset
│ │ │ ├── Contents.json
│ │ │ └── envelope.svg
│ │ │ ├── plus.circle.imageset
│ │ │ ├── Contents.json
│ │ │ └── plus.circle.svg
│ │ │ ├── shield.lock.imageset
│ │ │ └── Contents.json
│ │ │ └── chevron.right.imageset
│ │ │ ├── Contents.json
│ │ │ └── chevron.right.svg
│ ├── swiftgen.yml
│ ├── KSuiteProUpgradeChip.swift
│ ├── KSuitePanelModifier.swift
│ └── KSuiteView.swift
├── MyKSuite
│ ├── Resources
│ │ └── Assets.xcassets
│ │ │ ├── Contents.json
│ │ │ ├── Icons
│ │ │ ├── Contents.json
│ │ │ ├── drive.imageset
│ │ │ │ └── Contents.json
│ │ │ ├── gift.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── gift.svg
│ │ │ ├── lock.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── lock.svg
│ │ │ ├── plane.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── plane.svg
│ │ │ ├── person.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── person.svg
│ │ │ ├── envelope.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── envelope.svg
│ │ │ ├── information.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── information.svg
│ │ │ ├── folder.arrow.up.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── folder.arrow.up.svg
│ │ │ ├── gradient.imageset
│ │ │ │ └── Contents.json
│ │ │ ├── myKSuite.logo.imageset
│ │ │ │ └── Contents.json
│ │ │ └── myKSuitePlus.logo.imageset
│ │ │ │ └── Contents.json
│ │ │ └── Illustrations
│ │ │ ├── Contents.json
│ │ │ └── background.imageset
│ │ │ ├── background.svg
│ │ │ ├── background dark.svg
│ │ │ └── Contents.json
│ ├── Sources
│ │ ├── Utils
│ │ │ ├── Formatters.swift
│ │ │ ├── OSLog+Extension.swift
│ │ │ └── Product.swift
│ │ ├── Networking
│ │ │ ├── ApiFetcher+Extension.swift
│ │ │ └── MyKSuite.swift
│ │ ├── MyKSuiteView.swift
│ │ ├── MyKSuitePanelModifier.swift
│ │ ├── Components
│ │ │ ├── CardModifier.swift
│ │ │ └── CustomProgressBar.swift
│ │ ├── Dashboard
│ │ │ ├── ProductProgressView.swift
│ │ │ ├── SubscriptionProductsView.swift
│ │ │ ├── HeaderView.swift
│ │ │ ├── SubscriptionCardView.swift
│ │ │ ├── SubscriptionBenefitsView.swift
│ │ │ └── FreeTrialView.swift
│ │ └── MyKSuiteConfiguration.swift
│ └── swiftgen.yml
├── KSuiteUtils
│ ├── Resources
│ │ ├── Colors.xcassets
│ │ │ ├── Contents.json
│ │ │ ├── Gradient
│ │ │ │ ├── Contents.json
│ │ │ │ ├── gradient.color.1.colorset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── gradient.color.2.colorset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── gradient.color.3.colorset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── gradient.color.4.colorset
│ │ │ │ │ └── Contents.json
│ │ │ │ └── gradient.color.5.colorset
│ │ │ │ │ └── Contents.json
│ │ │ ├── bat.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── mouse.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── orca.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── rabbit.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── shark.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── sky.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── swan.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── elephant.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── polar.bear.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── product.mail.colorset
│ │ │ │ └── Contents.json
│ │ │ └── product.drive.colorset
│ │ │ │ └── Contents.json
│ │ └── Localizable
│ │ │ ├── en.lproj
│ │ │ └── Localizable.strings
│ │ │ ├── es.lproj
│ │ │ └── Localizable.strings
│ │ │ ├── fr.lproj
│ │ │ └── Localizable.strings
│ │ │ ├── it.lproj
│ │ │ └── Localizable.strings
│ │ │ └── de.lproj
│ │ │ └── Localizable.strings
│ ├── Utils
│ │ ├── KSuiteLabel.swift
│ │ └── FontHelper.swift
│ ├── swiftgen.yml
│ └── Generated
│ │ └── Strings+Generated.swift
├── InterAppLogin
│ ├── Resources
│ │ ├── Assets.xcassets
│ │ │ ├── Colors
│ │ │ │ ├── Contents.json
│ │ │ │ ├── Grey Elephant.colorset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Grey Mouse.colorset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Grey Orca.colorset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Grey Rabbit.colorset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Grey Shark.colorset
│ │ │ │ │ └── Contents.json
│ │ │ │ └── backgroundSecondaryColor.colorset
│ │ │ │ │ └── Contents.json
│ │ │ ├── Images
│ │ │ │ ├── Contents.json
│ │ │ │ ├── check.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── check.svg
│ │ │ │ ├── chevron-down.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── chevron-down.svg
│ │ │ │ └── person-circle-plus-filled.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── person-circle-plus-filled.svg
│ │ │ └── Contents.json
│ │ └── Localizable
│ │ │ ├── en.lproj
│ │ │ ├── Localizable.strings
│ │ │ └── Localizable.stringsdict
│ │ │ ├── it.lproj
│ │ │ ├── Localizable.strings
│ │ │ └── Localizable.stringsdict
│ │ │ ├── de.lproj
│ │ │ ├── Localizable.strings
│ │ │ └── Localizable.stringsdict
│ │ │ ├── es.lproj
│ │ │ ├── Localizable.strings
│ │ │ └── Localizable.stringsdict
│ │ │ └── fr.lproj
│ │ │ ├── Localizable.strings
│ │ │ └── Localizable.stringsdict
│ ├── swiftgen.yml
│ └── Sources
│ │ ├── Extensions
│ │ ├── Font+Extension.swift
│ │ └── Color+Extension.swift
│ │ └── UI
│ │ ├── CenteringPlaceholderAvatarStackView.swift
│ │ ├── ConnectedAccountView.swift
│ │ ├── ConnectedAccountCellView.swift
│ │ └── OutlinedButtonStyle.swift
└── InAppTwoFactorAuthentication
│ ├── Resources
│ ├── Assets.xcassets
│ │ ├── Colors
│ │ │ ├── Contents.json
│ │ │ ├── Grey Elephant.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── Grey Mouse.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── Grey Orca.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── Grey Rabbit.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── Grey Shark.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── IKRed.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── IKOrange.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── Feature Primary.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── Background Primary.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── Background Secondary.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── Feature Disabled.colorset
│ │ │ │ └── Contents.json
│ │ │ ├── Feature Tertiary.colorset
│ │ │ │ └── Contents.json
│ │ │ └── Feature Secondary Disabled.colorset
│ │ │ │ └── Contents.json
│ │ ├── Images
│ │ │ ├── Contents.json
│ │ │ ├── Background Light Source.imageset
│ │ │ │ ├── background-light-source-light.png
│ │ │ │ └── Contents.json
│ │ │ ├── clock.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── clock.svg
│ │ │ ├── xmark.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── xmark.svg
│ │ │ ├── shield.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── shield.svg
│ │ │ ├── wifi-slash.imageset
│ │ │ │ └── Contents.json
│ │ │ ├── stop-hand-slash.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── stop-hand-slash.svg
│ │ │ └── device-arrow-rotate.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── device-arrow-rotate.svg
│ │ └── Contents.json
│ └── Localizable
│ │ ├── en.lproj
│ │ ├── Localizable.stringsdict
│ │ └── Localizable.strings
│ │ ├── it.lproj
│ │ ├── Localizable.stringsdict
│ │ └── Localizable.strings
│ │ ├── de.lproj
│ │ ├── Localizable.stringsdict
│ │ └── Localizable.strings
│ │ ├── es.lproj
│ │ ├── Localizable.stringsdict
│ │ └── Localizable.strings
│ │ └── fr.lproj
│ │ ├── Localizable.stringsdict
│ │ └── Localizable.strings
│ ├── swiftgen.yml
│ └── Sources
│ ├── Core
│ ├── Models
│ │ ├── Capability+Extension.swift
│ │ ├── InAppTwoFactorAuthenticationSession.swift
│ │ ├── RemoteChallenge.swift
│ │ └── PreviewHelper.swift
│ └── NotificationConstants.swift
│ └── UI
│ ├── ConnectionConfirmationView
│ ├── FittingConnectionConfirmationView.swift
│ ├── MainContentView
│ │ ├── TimeAgoView.swift
│ │ ├── RowView.swift
│ │ └── UserRowView.swift
│ └── InformationContentView.swift
│ ├── Extensions
│ ├── Font+Extension.swift
│ └── Color+Extension.swift
│ └── CheckConnectionAttemptsViewModifier.swift
├── .mise.toml
├── .github
├── workflows
│ ├── auto-author-assign.yml
│ ├── dependent-issues.yml
│ ├── swiftformat.yml
│ ├── semantic-commit.yml
│ ├── swiftlint.yml
│ └── ci.yml
└── ISSUE_TEMPLATE
│ ├── feature_request.md
│ └── bug_report.md
├── .sonarcloud.properties
├── file-header-template.txt
├── .gitignore
├── .swiftlint.yml
└── .swiftformat
/.swift-version:
--------------------------------------------------------------------------------
1 | 5.10
--------------------------------------------------------------------------------
/.swiftlint-ci.yml:
--------------------------------------------------------------------------------
1 | disabled_rules:
2 | - todo
3 | strict: true
4 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/Colors/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Colors.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Icons/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/.mise.toml:
--------------------------------------------------------------------------------
1 | [tools]
2 | swiftformat = '0.57.2'
3 | swiftlint = '0.59.1'
4 | swiftgen = "latest"
5 | pipx = "latest"
6 | "pipx:infomaniak/importloco" = "1.1.0"
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Assets.xcassets/Colors/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Assets.xcassets/Images/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Colors.xcassets/Gradient/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Illustrations/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/euria.imageset/euria.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infomaniak/ios-features/main/Sources/KSuite/Resources/Assets.xcassets/euria.imageset/euria.pdf
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | },
6 | "properties" : {
7 | "generate-swift-asset-symbol-extensions" : "enabled"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | },
6 | "properties" : {
7 | "generate-swift-asset-symbol-extensions" : "enabled"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Illustrations/background.imageset/background.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Illustrations/background.imageset/background dark.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/Background Light Source.imageset/background-light-source-light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/infomaniak/ios-features/main/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/Background Light Source.imageset/background-light-source-light.png
--------------------------------------------------------------------------------
/.github/workflows/auto-author-assign.yml:
--------------------------------------------------------------------------------
1 | name: Auto Author Assign
2 |
3 | on:
4 | pull_request_target:
5 | types: [ opened, reopened ]
6 |
7 | permissions:
8 | pull-requests: write
9 |
10 | jobs:
11 | assign-author:
12 | runs-on: ubuntu-latest
13 | steps:
14 | - uses: toshimaru/auto-author-assign@v1.6.2
15 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/Background Light Source.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "background-light-source-light.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/euria.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "euria.pdf",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/microsoft.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "microsoft.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/background.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ksuite-header.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/clock.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "clock.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/xmark.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "xmark.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/shield.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "shield.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/wifi-slash.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "wifi-slash.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/stop-hand-slash.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "stop-hand-slash.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/xmark.imageset/xmark.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/drive.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "drive.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true,
14 | "template-rendering-intent" : "template"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/folder.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "folder.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true,
14 | "template-rendering-intent" : "template"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/kchat.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "kchat.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true,
14 | "template-rendering-intent" : "template"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/rocket.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "rocket.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true,
14 | "template-rendering-intent" : "template"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/stair.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "stair.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true,
14 | "template-rendering-intent" : "template"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/device-arrow-rotate.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "device-arrow-rotate.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/envelope.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "envelope.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true,
14 | "template-rendering-intent" : "template"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Icons/drive.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "drive.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true,
14 | "template-rendering-intent" : "template"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Icons/gift.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "gift.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true,
14 | "template-rendering-intent" : "template"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Icons/lock.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "lock.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true,
14 | "template-rendering-intent" : "template"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Icons/plane.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "plane.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true,
14 | "template-rendering-intent" : "template"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/plus.circle.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "plus.circle.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true,
14 | "template-rendering-intent" : "template"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/shield.lock.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "shield.lock.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true,
14 | "template-rendering-intent" : "template"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Icons/person.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "person.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true,
14 | "template-rendering-intent" : "template"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Assets.xcassets/Images/check.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "check.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true,
14 | "template-rendering-intent" : "template"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/chevron.right.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "chevron.right.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true,
14 | "template-rendering-intent" : "template"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Icons/envelope.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "envelope.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true,
14 | "template-rendering-intent" : "template"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Icons/information.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "information.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true,
14 | "template-rendering-intent" : "template"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Assets.xcassets/Images/chevron-down.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "chevron-down.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true,
14 | "template-rendering-intent" : "template"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Icons/folder.arrow.up.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "folder.arrow.up.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true,
14 | "template-rendering-intent" : "template"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/.sonarcloud.properties:
--------------------------------------------------------------------------------
1 | ## Path to sources
2 | sonar.sources=Sources
3 | sonar.exclusions=Sources/MyKSuite/Generated/*,Sources/KSuite/Generated/*,Sources/KSuiteUtils/Generated/*
4 | # sonar.inclusions=
5 |
6 | ## Path to tests
7 | # sonar.tests=Tests
8 | # sonar.test.exclusions=
9 | # sonar.test.inclusions=
10 |
11 | ## Source encoding
12 | # sonar.sourceEncoding=
13 |
14 | # Exclusions for copy-paste detection
15 | # sonar.cpd.exclusions=
16 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Localizable/en.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | * Loco ios export: Xcode Strings (legacy)
3 | * Project: CoreUI
4 | * Locale: en, English
5 | * Tagged: ios, !common, !emoji-reaction, !interapplogin, !ios-stringsdict, !kSuite, !my kSuite, !privacy
6 | * Exported by: Ambroise Decouttere
7 | * Exported at: Tue, 19 Aug 2025 09:11:18 +0200
8 | */
9 |
10 | /* loco:679237f6daa3807fa008b175 */
11 | "buttonClose" = "Close";
12 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Localizable/es.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | * Loco ios export: Xcode Strings (legacy)
3 | * Project: CoreUI
4 | * Locale: es, Spanish
5 | * Tagged: ios, !common, !emoji-reaction, !interapplogin, !ios-stringsdict, !kSuite, !my kSuite, !privacy
6 | * Exported by: Ambroise Decouttere
7 | * Exported at: Tue, 19 Aug 2025 09:11:18 +0200
8 | */
9 |
10 | /* loco:679237f6daa3807fa008b175 */
11 | "buttonClose" = "Cerrar";
12 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Localizable/fr.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | * Loco ios export: Xcode Strings (legacy)
3 | * Project: CoreUI
4 | * Locale: fr, French
5 | * Tagged: ios, !common, !emoji-reaction, !interapplogin, !ios-stringsdict, !kSuite, !my kSuite, !privacy
6 | * Exported by: Ambroise Decouttere
7 | * Exported at: Tue, 19 Aug 2025 09:11:18 +0200
8 | */
9 |
10 | /* loco:679237f6daa3807fa008b175 */
11 | "buttonClose" = "Fermer";
12 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Localizable/it.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | * Loco ios export: Xcode Strings (legacy)
3 | * Project: CoreUI
4 | * Locale: it, Italian
5 | * Tagged: ios, !common, !emoji-reaction, !interapplogin, !ios-stringsdict, !kSuite, !my kSuite, !privacy
6 | * Exported by: Ambroise Decouttere
7 | * Exported at: Tue, 19 Aug 2025 09:11:18 +0200
8 | */
9 |
10 | /* loco:679237f6daa3807fa008b175 */
11 | "buttonClose" = "Chiudere";
12 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Assets.xcassets/Images/person-circle-plus-filled.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "person-circle-plus-filled.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true,
14 | "template-rendering-intent" : "template"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Localizable/de.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | * Loco ios export: Xcode Strings (legacy)
3 | * Project: CoreUI
4 | * Locale: de, German
5 | * Tagged: ios, !common, !emoji-reaction, !interapplogin, !ios-stringsdict, !kSuite, !my kSuite, !privacy
6 | * Exported by: Ambroise Decouttere
7 | * Exported at: Tue, 19 Aug 2025 09:11:18 +0200
8 | */
9 |
10 | /* loco:679237f6daa3807fa008b175 */
11 | "buttonClose" = "Schliessen";
12 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Colors.xcassets/bat.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0x1A",
9 | "green" : "0x1A",
10 | "red" : "0x1A"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Colors.xcassets/mouse.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xE0",
9 | "green" : "0xE0",
10 | "red" : "0xE0"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Colors.xcassets/orca.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0x33",
9 | "green" : "0x33",
10 | "red" : "0x33"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Colors.xcassets/rabbit.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xF1",
9 | "green" : "0xF1",
10 | "red" : "0xF1"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Colors.xcassets/shark.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0x9F",
9 | "green" : "0x9F",
10 | "red" : "0x9F"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Colors.xcassets/sky.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xFD",
9 | "green" : "0xF6",
10 | "red" : "0xF4"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Colors.xcassets/swan.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xFA",
9 | "green" : "0xFA",
10 | "red" : "0xFA"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Colors.xcassets/elephant.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0x66",
9 | "green" : "0x66",
10 | "red" : "0x66"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Colors.xcassets/polar.bear.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xF5",
9 | "green" : "0xF5",
10 | "red" : "0xF5"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Colors.xcassets/product.mail.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0x7A",
9 | "green" : "0x35",
10 | "red" : "0xF2"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Colors.xcassets/product.drive.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xF7",
9 | "green" : "0x89",
10 | "red" : "0x5C"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Assets.xcassets/Colors/Grey Elephant.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0x66",
9 | "green" : "0x66",
10 | "red" : "0x66"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Assets.xcassets/Colors/Grey Mouse.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xE0",
9 | "green" : "0xE0",
10 | "red" : "0xE0"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Assets.xcassets/Colors/Grey Orca.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0x33",
9 | "green" : "0x33",
10 | "red" : "0x33"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Assets.xcassets/Colors/Grey Rabbit.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xF1",
9 | "green" : "0xF1",
10 | "red" : "0xF1"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Assets.xcassets/Colors/Grey Shark.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0x9F",
9 | "green" : "0x9F",
10 | "red" : "0x9F"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/Colors/menuBackgroundColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0x3D",
9 | "green" : "0x2E",
10 | "red" : "0x29"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Colors.xcassets/Gradient/gradient.color.1.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xFD",
9 | "green" : "0xDD",
10 | "red" : "0x1D"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Colors.xcassets/Gradient/gradient.color.2.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xFF",
9 | "green" : "0x7C",
10 | "red" : "0x33"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Colors.xcassets/Gradient/gradient.color.3.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xFC",
9 | "green" : "0x55",
10 | "red" : "0xA0"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Colors.xcassets/Gradient/gradient.color.4.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xBB",
9 | "green" : "0x4B",
10 | "red" : "0xF3"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Resources/Colors.xcassets/Gradient/gradient.color.5.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0x3D",
9 | "green" : "0x8C",
10 | "red" : "0xFD"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Grey Elephant.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0x66",
9 | "green" : "0x66",
10 | "red" : "0x66"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Grey Mouse.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xE0",
9 | "green" : "0xE0",
10 | "red" : "0xE0"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Grey Orca.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0x33",
9 | "green" : "0x33",
10 | "red" : "0x33"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Grey Rabbit.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xF1",
9 | "green" : "0xF1",
10 | "red" : "0xF1"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Grey Shark.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0x9F",
9 | "green" : "0x9F",
10 | "red" : "0x9F"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Illustrations/background.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "background.svg",
5 | "idiom" : "universal"
6 | },
7 | {
8 | "appearances" : [
9 | {
10 | "appearance" : "luminosity",
11 | "value" : "dark"
12 | }
13 | ],
14 | "filename" : "background dark.svg",
15 | "idiom" : "universal"
16 | }
17 | ],
18 | "info" : {
19 | "author" : "xcode",
20 | "version" : 1
21 | },
22 | "properties" : {
23 | "preserves-vector-representation" : true
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Icons/person.imageset/person.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Icons/gradient.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "gradient.svg",
5 | "idiom" : "universal"
6 | },
7 | {
8 | "appearances" : [
9 | {
10 | "appearance" : "luminosity",
11 | "value" : "dark"
12 | }
13 | ],
14 | "filename" : "gradient.dark.svg",
15 | "idiom" : "universal"
16 | }
17 | ],
18 | "info" : {
19 | "author" : "xcode",
20 | "version" : 1
21 | },
22 | "properties" : {
23 | "preserves-vector-representation" : true,
24 | "template-rendering-intent" : "original"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Icons/myKSuite.logo.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "myKSuite.logo.svg",
5 | "idiom" : "universal"
6 | },
7 | {
8 | "appearances" : [
9 | {
10 | "appearance" : "luminosity",
11 | "value" : "dark"
12 | }
13 | ],
14 | "filename" : "myKSuite.logo.dark.svg",
15 | "idiom" : "universal"
16 | }
17 | ],
18 | "info" : {
19 | "author" : "xcode",
20 | "version" : 1
21 | },
22 | "properties" : {
23 | "preserves-vector-representation" : true,
24 | "template-rendering-intent" : "original"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Icons/myKSuitePlus.logo.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "myKSuitePlus.logo.svg",
5 | "idiom" : "universal"
6 | },
7 | {
8 | "appearances" : [
9 | {
10 | "appearance" : "luminosity",
11 | "value" : "dark"
12 | }
13 | ],
14 | "filename" : "myKSuitePlus.logo.dark.svg",
15 | "idiom" : "universal"
16 | }
17 | ],
18 | "info" : {
19 | "author" : "xcode",
20 | "version" : 1
21 | },
22 | "properties" : {
23 | "preserves-vector-representation" : true,
24 | "template-rendering-intent" : "original"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/chevron.right.imageset/chevron.right.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Assets.xcassets/Images/chevron-down.imageset/chevron-down.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/.github/workflows/dependent-issues.yml:
--------------------------------------------------------------------------------
1 | name: Dependent Issues
2 |
3 | on:
4 | issues:
5 | types:
6 | - opened
7 | - edited
8 | - closed
9 | - reopened
10 | pull_request_target:
11 | types:
12 | - opened
13 | - edited
14 | - closed
15 | - reopened
16 | # Makes sure we always add status check for PRs. Useful only if
17 | # this action is required to pass before merging. Otherwise, it
18 | # can be removed.
19 | - synchronize
20 |
21 | jobs:
22 | check:
23 | runs-on: ubuntu-latest
24 | steps:
25 | - uses: z0al/dependent-issues@v1
26 | env:
27 | # (Required) The token to use to make API calls to GitHub.
28 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
29 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Assets.xcassets/Images/check.imageset/check.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/file-header-template.txt:
--------------------------------------------------------------------------------
1 |
2 | /*
3 | Infomaniak Features - iOS
4 | Copyright (C) 2025 Infomaniak Network SA
5 |
6 | This program is free software: you can redistribute it and/or modify
7 | it under the terms of the GNU General Public License as published by
8 | the Free Software Foundation, either version 3 of the License, or
9 | (at your option) any later version.
10 |
11 | This program is distributed in the hope that it will be useful,
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | GNU General Public License for more details.
15 |
16 | You should have received a copy of the GNU General Public License
17 | along with this program. If not, see .
18 | */
19 |
--------------------------------------------------------------------------------
/.github/workflows/swiftformat.yml:
--------------------------------------------------------------------------------
1 | name: SwiftFormat
2 |
3 | on:
4 | pull_request:
5 | branches: [ main, 'protected/**' ]
6 |
7 | concurrency:
8 | group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
9 | cancel-in-progress: true
10 |
11 | jobs:
12 | build:
13 | name: SwiftFormat
14 | runs-on: [ self-hosted, iOS ]
15 |
16 | steps:
17 | - name: Cancel Previous Runs
18 | uses: styfle/cancel-workflow-action@0.12.1
19 | with:
20 | access_token: ${{ github.token }}
21 | - uses: jdx/mise-action@v2
22 | with:
23 | cache: false
24 | - name: Checkout
25 | uses: actions/checkout@v4
26 | with:
27 | fetch-depth: 0
28 | - name: SwiftFormat
29 | run: swiftformat --lint . --reporter github-actions-log
30 |
--------------------------------------------------------------------------------
/.github/workflows/semantic-commit.yml:
--------------------------------------------------------------------------------
1 | name: 'PR and Commit Message Check'
2 | on:
3 | pull_request_target:
4 | types:
5 | - opened
6 | - edited
7 | - reopened
8 | - synchronize
9 |
10 | jobs:
11 | check-commit-message:
12 | name: Check Commit Message
13 | runs-on: ubuntu-latest
14 | steps:
15 | - name: Check Commit Message
16 | uses: gsactions/commit-message-checker@v2
17 | with:
18 | pattern: '^(Merge .+|((feat|fix|chore|docs|style|refactor|perf|ci|test)(\(.+\))?: [A-Z0-9].+[^.\s])$)'
19 | error: 'Commit messages and PR title should match conventional commit convention and start with an uppercase.'
20 | excludeDescription: 'true'
21 | excludeTitle: 'false'
22 | checkAllCommitMessages: 'true'
23 | accessToken: ${{ secrets.GITHUB_TOKEN }}
24 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Localizable/en.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | * Loco ios export: Xcode Strings (legacy)
3 | * Project: CoreUI
4 | * Locale: en, English
5 | * Tagged: ios, !common, !emoji-reaction, !inapp2fa, !ios-stringsdict, !kSuite, !kSuiteUtils, !my kSuite, !privacy
6 | * Exported by: Philippe Weidmann
7 | * Exported at: Tue, 28 Oct 2025 09:34:38 +0100
8 | */
9 |
10 | /* loco:684003a81687be54da004145 */
11 | "buttonCreateAccount" = "Create an account";
12 |
13 | /* loco:6840035e1687be54da004142 */
14 | "buttonLogin" = "Login";
15 |
16 | /* loco:68404629d6574c876e05b382 */
17 | "buttonUseOtherAccount" = "Use another account";
18 |
19 | /* loco:684044c80031d880680d8e12 */
20 | "selectAccountPanelTitle" = "Select one or multiple accounts";
21 |
22 | /* loco:69007f6a2a2aa4b5eb0d4632 */
23 | "selectSingleAccountPanelTitle" = "Select one account";
24 |
--------------------------------------------------------------------------------
/.github/workflows/swiftlint.yml:
--------------------------------------------------------------------------------
1 | name: SwiftLint
2 |
3 | on:
4 | pull_request:
5 | branches: [ main, 'protected/**' ]
6 |
7 | concurrency:
8 | group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
9 | cancel-in-progress: true
10 |
11 | jobs:
12 | build:
13 | name: SwiftLint
14 | runs-on: [ self-hosted, iOS ]
15 |
16 | steps:
17 | - name: Cancel Previous Runs
18 | uses: styfle/cancel-workflow-action@0.12.1
19 | with:
20 | access_token: ${{ github.token }}
21 | - uses: jdx/mise-action@v2
22 | with:
23 | cache: false
24 | - name: Checkout
25 | uses: actions/checkout@v4
26 | with:
27 | fetch-depth: 0
28 | - name: SwiftLint
29 | run: swiftlint --config .swiftlint.yml --config .swiftlint-ci.yml --reporter github-actions-logging .
30 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Localizable/it.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | * Loco ios export: Xcode Strings (legacy)
3 | * Project: CoreUI
4 | * Locale: it, Italian
5 | * Tagged: ios, !common, !emoji-reaction, !inapp2fa, !ios-stringsdict, !kSuite, !kSuiteUtils, !my kSuite, !privacy
6 | * Exported by: Philippe Weidmann
7 | * Exported at: Tue, 28 Oct 2025 09:34:38 +0100
8 | */
9 |
10 | /* loco:684003a81687be54da004145 */
11 | "buttonCreateAccount" = "Crea un account";
12 |
13 | /* loco:6840035e1687be54da004142 */
14 | "buttonLogin" = "Accesso";
15 |
16 | /* loco:68404629d6574c876e05b382 */
17 | "buttonUseOtherAccount" = "Utilizza un altro account";
18 |
19 | /* loco:684044c80031d880680d8e12 */
20 | "selectAccountPanelTitle" = "Seleziona uno o più account";
21 |
22 | /* loco:69007f6a2a2aa4b5eb0d4632 */
23 | "selectSingleAccountPanelTitle" = "Selezionare un account";
24 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Localizable/de.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | * Loco ios export: Xcode Strings (legacy)
3 | * Project: CoreUI
4 | * Locale: de, German
5 | * Tagged: ios, !common, !emoji-reaction, !inapp2fa, !ios-stringsdict, !kSuite, !kSuiteUtils, !my kSuite, !privacy
6 | * Exported by: Philippe Weidmann
7 | * Exported at: Tue, 28 Oct 2025 09:34:38 +0100
8 | */
9 |
10 | /* loco:684003a81687be54da004145 */
11 | "buttonCreateAccount" = "Ein Konto erstellen";
12 |
13 | /* loco:6840035e1687be54da004142 */
14 | "buttonLogin" = "Anmeldung";
15 |
16 | /* loco:68404629d6574c876e05b382 */
17 | "buttonUseOtherAccount" = "Ein anderes Konto verwenden";
18 |
19 | /* loco:684044c80031d880680d8e12 */
20 | "selectAccountPanelTitle" = "Wählen Sie ein oder mehrere Konten";
21 |
22 | /* loco:69007f6a2a2aa4b5eb0d4632 */
23 | "selectSingleAccountPanelTitle" = "Wählen Sie ein Konto";
24 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Localizable/es.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | * Loco ios export: Xcode Strings (legacy)
3 | * Project: CoreUI
4 | * Locale: es, Spanish
5 | * Tagged: ios, !common, !emoji-reaction, !inapp2fa, !ios-stringsdict, !kSuite, !kSuiteUtils, !my kSuite, !privacy
6 | * Exported by: Philippe Weidmann
7 | * Exported at: Tue, 28 Oct 2025 09:34:38 +0100
8 | */
9 |
10 | /* loco:684003a81687be54da004145 */
11 | "buttonCreateAccount" = "Crear una cuenta";
12 |
13 | /* loco:6840035e1687be54da004142 */
14 | "buttonLogin" = "Inicio de sesión";
15 |
16 | /* loco:68404629d6574c876e05b382 */
17 | "buttonUseOtherAccount" = "Utilizar otra cuenta";
18 |
19 | /* loco:684044c80031d880680d8e12 */
20 | "selectAccountPanelTitle" = "Seleccione una o varias cuentas";
21 |
22 | /* loco:69007f6a2a2aa4b5eb0d4632 */
23 | "selectSingleAccountPanelTitle" = "Seleccione una cuenta";
24 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Localizable/fr.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | * Loco ios export: Xcode Strings (legacy)
3 | * Project: CoreUI
4 | * Locale: fr, French
5 | * Tagged: ios, !common, !emoji-reaction, !inapp2fa, !ios-stringsdict, !kSuite, !kSuiteUtils, !my kSuite, !privacy
6 | * Exported by: Philippe Weidmann
7 | * Exported at: Tue, 28 Oct 2025 09:34:38 +0100
8 | */
9 |
10 | /* loco:684003a81687be54da004145 */
11 | "buttonCreateAccount" = "Créer un compte";
12 |
13 | /* loco:6840035e1687be54da004142 */
14 | "buttonLogin" = "Se connecter";
15 |
16 | /* loco:68404629d6574c876e05b382 */
17 | "buttonUseOtherAccount" = "Utiliser un autre compte";
18 |
19 | /* loco:684044c80031d880680d8e12 */
20 | "selectAccountPanelTitle" = "Sélectionner un ou plusieurs comptes";
21 |
22 | /* loco:69007f6a2a2aa4b5eb0d4632 */
23 | "selectSingleAccountPanelTitle" = "Sélectionner un compte";
24 |
--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: CI workflow
2 |
3 | on:
4 | pull_request:
5 | branches: [ main ]
6 |
7 | concurrency:
8 | group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
9 | cancel-in-progress: true
10 |
11 | jobs:
12 | build_and_test_iOS:
13 | name: Build and Test project on iOS
14 | runs-on: [ self-hosted, iOS ]
15 |
16 | steps:
17 | - name: Cancel Previous Runs
18 | uses: styfle/cancel-workflow-action@0.12.1
19 | with:
20 | access_token: ${{ github.token }}
21 | - name: Checkout
22 | uses: actions/checkout@v4
23 | - name: Build
24 | run: xcodebuild -scheme ios-features-Package build -sdk iphonesimulator -destination "generic/platform=iOS"
25 | - name: Test
26 | run: xcodebuild -scheme ios-features-Package test -destination "platform=iOS Simulator,name=iPhone 17,OS=latest"
27 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: ''
5 | labels: enhancement
6 | assignees: ''
7 |
8 | ---
9 |
10 |
12 |
13 | **Is your feature request related to a problem? Please describe.**
14 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
15 |
16 | **Describe the solution you'd like**
17 | A clear and concise description of what you want to happen.
18 |
19 | **Describe alternatives you've considered**
20 | A clear and concise description of any alternative solutions or features you've considered.
21 |
22 | **Additional context**
23 | Add any other context or screenshots about the feature request here.
24 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/IKRed.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0x36",
9 | "green" : "0x43",
10 | "red" : "0xF4"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0x78",
27 | "green" : "0x88",
28 | "red" : "0xFC"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/IKOrange.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0x00",
9 | "green" : "0x85",
10 | "red" : "0xFF"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0x4C",
27 | "green" : "0xAA",
28 | "red" : "0xFF"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Assets.xcassets/Colors/backgroundSecondaryColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xFF",
9 | "green" : "0xFF",
10 | "red" : "0xFF"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0x1A",
27 | "green" : "0x1A",
28 | "red" : "0x1A"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Feature Primary.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xAE",
9 | "green" : "0x43",
10 | "red" : "0x32"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0xF7",
27 | "green" : "0x7C",
28 | "red" : "0x69"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Background Primary.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xFD",
9 | "green" : "0xF6",
10 | "red" : "0xF4"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0x19",
27 | "green" : "0x19",
28 | "red" : "0x19"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Background Secondary.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xFF",
9 | "green" : "0xFF",
10 | "red" : "0xFF"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0x19",
27 | "green" : "0x19",
28 | "red" : "0x19"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Feature Disabled.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xEF",
9 | "green" : "0xD9",
10 | "red" : "0xD6"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0x2B",
27 | "green" : "0x15",
28 | "red" : "0x12"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Feature Tertiary.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xF5",
9 | "green" : "0xE8",
10 | "red" : "0xE6"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0x34",
27 | "green" : "0x19",
28 | "red" : "0x15"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Feature Secondary Disabled.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0xF9",
9 | "green" : "0xF0",
10 | "red" : "0xEF"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0x6B",
27 | "green" : "0x5B",
28 | "red" : "0x59"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Sources/Utils/Formatters.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import SwiftUI
20 |
21 | extension FormatStyle where Self == ByteCountFormatStyle {
22 | static var defaultByteCount: ByteCountFormatStyle {
23 | return .byteCount(style: .binary)
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/shield.imageset/shield.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: ''
5 | labels: bug
6 | assignees: ''
7 |
8 | ---
9 |
10 |
12 |
13 | **Description**
14 | A clear and concise description of what the bug is.
15 |
16 | **Steps to reproduce**
17 | Steps to reproduce the behavior:
18 | 1. Go to '...'
19 | 2. Click on '....'
20 | 3. Scroll down to '....'
21 | 4. See error
22 |
23 | **Expected behavior**
24 | A clear and concise description of what you expected to happen.
25 |
26 | **Screenshots**
27 | If applicable, add screenshots to help explain your problem.
28 |
29 | **Smartphone (please complete the following information):**
30 | - Device: [e.g. iPhone 12]
31 | - iOS version: [e.g. iOS 14.0]
32 | - App version: [e.g. 4.0.1]
33 |
34 | **Additional context**
35 | Add any other context about the problem here.
36 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/swiftgen.yml:
--------------------------------------------------------------------------------
1 | # iOS Features - iOS
2 | # Copyright (C) 2025 Infomaniak Network SA
3 | #
4 | # This program is free software: you can redistribute it and/or modify
5 | # it under the terms of the GNU General Public License as published by
6 | # the Free Software Foundation, either version 3 of the License, or
7 | # (at your option) any later version.
8 | #
9 | # This program is distributed in the hope that it will be useful,
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 | # GNU General Public License for more details.
13 | #
14 | # You should have received a copy of the GNU General Public License
15 | # along with this program. If not, see .
16 |
17 | output_dir: Generated/
18 |
19 | strings:
20 | inputs: Resources/Localizable/en.lproj
21 | outputs:
22 | - templateName: structured-swift5
23 | output: Strings+Generated.swift
24 | params:
25 | enumName: Localizable
26 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/swiftgen.yml:
--------------------------------------------------------------------------------
1 | # iOS Features - iOS
2 | # Copyright (C) 2025 Infomaniak Network SA
3 | #
4 | # This program is free software: you can redistribute it and/or modify
5 | # it under the terms of the GNU General Public License as published by
6 | # the Free Software Foundation, either version 3 of the License, or
7 | # (at your option) any later version.
8 | #
9 | # This program is distributed in the hope that it will be useful,
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 | # GNU General Public License for more details.
13 | #
14 | # You should have received a copy of the GNU General Public License
15 | # along with this program. If not, see .
16 |
17 | output_dir: Generated/
18 |
19 | strings:
20 | inputs: Resources/Localizable/en.lproj
21 | outputs:
22 | - templateName: structured-swift5
23 | output: Strings+Generated.swift
24 | params:
25 | enumName: InterAppLoginLocalizable
26 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Sources/Utils/OSLog+Extension.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import OSLog
20 |
21 | extension Logger {
22 | private static let subsystem = Bundle.main.bundleIdentifier ?? "com.infomaniak.myKSuite"
23 |
24 | static let general = Logger(subsystem: subsystem, category: "general")
25 | }
26 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Sources/Core/Models/Capability+Extension.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import DeviceAssociation
20 | import Foundation
21 |
22 | public extension Capability {
23 | static let twoFactorAuthenticationChallengeApproval = Capability(rawValue: "2fa:push_challenge:approval")
24 | }
25 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/envelope.imageset/envelope.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Sources/Core/NotificationConstants.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import Foundation
20 |
21 | enum NotificationUserInfoKeys {
22 | static let userId = "user_id"
23 | static let type = "type"
24 | }
25 |
26 | enum NotificationType {
27 | static let challengeApproval = "2fa:push_challenge:approval"
28 | }
29 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Utils/KSuiteLabel.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import SwiftUI
20 |
21 | public struct KSuiteLabel: Identifiable {
22 | public let id: String
23 |
24 | public let icon: Image
25 | public let text: String
26 |
27 | public init(icon: Image, text: String) {
28 | self.icon = icon
29 | self.text = text
30 | id = text
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Localizable/en.lproj/Localizable.stringsdict:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
12 |
13 | twoFactorAuthMinutesAgoLabel
14 |
15 | NSStringLocalizedFormatKey
16 | %#@value@
17 | value
18 |
19 | NSStringFormatSpecTypeKey
20 | NSStringPluralRuleType
21 | NSStringFormatValueTypeKey
22 | d
23 | one
24 | A minute ago
25 | other
26 | %d minutes ago
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Localizable/it.lproj/Localizable.stringsdict:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
12 |
13 | twoFactorAuthMinutesAgoLabel
14 |
15 | NSStringLocalizedFormatKey
16 | %#@value@
17 | value
18 |
19 | NSStringFormatSpecTypeKey
20 | NSStringPluralRuleType
21 | NSStringFormatValueTypeKey
22 | d
23 | one
24 | un minuto fa
25 | other
26 | %d minuti fa
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Localizable/de.lproj/Localizable.stringsdict:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
12 |
13 | twoFactorAuthMinutesAgoLabel
14 |
15 | NSStringLocalizedFormatKey
16 | %#@value@
17 | value
18 |
19 | NSStringFormatSpecTypeKey
20 | NSStringPluralRuleType
21 | NSStringFormatValueTypeKey
22 | d
23 | one
24 | vor einer Minute
25 | other
26 | vor %d Minuten
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Localizable/es.lproj/Localizable.stringsdict:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
12 |
13 | twoFactorAuthMinutesAgoLabel
14 |
15 | NSStringLocalizedFormatKey
16 | %#@value@
17 | value
18 |
19 | NSStringFormatSpecTypeKey
20 | NSStringPluralRuleType
21 | NSStringFormatValueTypeKey
22 | d
23 | one
24 | hace un minuto
25 | other
26 | hace %d minutos
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Localizable/fr.lproj/Localizable.stringsdict:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
12 |
13 | twoFactorAuthMinutesAgoLabel
14 |
15 | NSStringLocalizedFormatKey
16 | %#@value@
17 | value
18 |
19 | NSStringFormatSpecTypeKey
20 | NSStringPluralRuleType
21 | NSStringFormatValueTypeKey
22 | d
23 | one
24 | il y a une minute
25 | other
26 | il y a %d minutes
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Icons/information.imageset/information.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Sources/Extensions/Font+Extension.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import SwiftUI
20 |
21 | extension Font {
22 | enum Custom {
23 | /// Figma name: *Body Medium*
24 | static let headline = Font.dynamicTypeSizeFont(size: 16, weight: .medium, relativeTo: .headline)
25 |
26 | /// Figma name: *Body Regular*
27 | static let body = Font.dynamicTypeSizeFont(size: 16, weight: .regular, relativeTo: .body)
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Sources/KSuite/swiftgen.yml:
--------------------------------------------------------------------------------
1 | # iOS Features - iOS
2 | # Copyright (C) 2025 Infomaniak Network SA
3 | #
4 | # This program is free software: you can redistribute it and/or modify
5 | # it under the terms of the GNU General Public License as published by
6 | # the Free Software Foundation, either version 3 of the License, or
7 | # (at your option) any later version.
8 | #
9 | # This program is distributed in the hope that it will be useful,
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 | # GNU General Public License for more details.
13 | #
14 | # You should have received a copy of the GNU General Public License
15 | # along with this program. If not, see .
16 |
17 | output_dir: Generated/
18 |
19 | strings:
20 | inputs: Resources/Localizable/en.lproj
21 | outputs:
22 | - templateName: structured-swift5
23 | output: Strings+Generated.swift
24 | params:
25 | enumName: KSuiteLocalizable
26 | publicAccess: true
27 | xcassets:
28 | inputs:
29 | - Resources/Assets.xcassets
30 | outputs:
31 | - templateName: swift5
32 | output: Resources+Generated.swift
33 | params:
34 | enumName: KSuiteResources
35 | publicAccess: true
36 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/swiftgen.yml:
--------------------------------------------------------------------------------
1 | # iOS Features - iOS
2 | # Copyright (C) 2025 Infomaniak Network SA
3 | #
4 | # This program is free software: you can redistribute it and/or modify
5 | # it under the terms of the GNU General Public License as published by
6 | # the Free Software Foundation, either version 3 of the License, or
7 | # (at your option) any later version.
8 | #
9 | # This program is distributed in the hope that it will be useful,
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 | # GNU General Public License for more details.
13 | #
14 | # You should have received a copy of the GNU General Public License
15 | # along with this program. If not, see .
16 |
17 | output_dir: Generated/
18 |
19 | strings:
20 | inputs: Resources/Localizable/en.lproj
21 | outputs:
22 | - templateName: structured-swift5
23 | output: Strings+Generated.swift
24 | params:
25 | enumName: MyKSuiteLocalizable
26 | publicAccess: true
27 | xcassets:
28 | inputs:
29 | - Resources/Assets.xcassets
30 | outputs:
31 | - templateName: swift5
32 | output: Resources+Generated.swift
33 | params:
34 | enumName: MyKSuiteResources
35 | publicAccess: true
36 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/swiftgen.yml:
--------------------------------------------------------------------------------
1 | # iOS Features - iOS
2 | # Copyright (C) 2025 Infomaniak Network SA
3 | #
4 | # This program is free software: you can redistribute it and/or modify
5 | # it under the terms of the GNU General Public License as published by
6 | # the Free Software Foundation, either version 3 of the License, or
7 | # (at your option) any later version.
8 | #
9 | # This program is distributed in the hope that it will be useful,
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 | # GNU General Public License for more details.
13 | #
14 | # You should have received a copy of the GNU General Public License
15 | # along with this program. If not, see .
16 |
17 | output_dir: Generated/
18 |
19 | strings:
20 | inputs: Resources/Localizable/en.lproj
21 | outputs:
22 | - templateName: structured-swift5
23 | output: Strings+Generated.swift
24 | params:
25 | enumName: KSuiteUtilsLocalizable
26 | publicAccess: true
27 | xcassets:
28 | inputs:
29 | - Resources/Colors.xcassets
30 | outputs:
31 | - templateName: swift5
32 | output: Resources+Generated.swift
33 | params:
34 | enumName: KSuiteUtilsResources
35 | publicAccess: true
36 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/plus.circle.imageset/plus.circle.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Sources/Utils/Product.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import KSuiteUtils
20 | import SwiftUI
21 |
22 | enum Product {
23 | case mail
24 | case drive
25 |
26 | var title: String {
27 | switch self {
28 | case .mail:
29 | return "Mail"
30 | case .drive:
31 | return "kDrive"
32 | }
33 | }
34 |
35 | var color: Color {
36 | switch self {
37 | case .mail:
38 | return KSuiteUtilsResources.productMail.swiftUIColor
39 | case .drive:
40 | return KSuiteUtilsResources.productDrive.swiftUIColor
41 | }
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Sources/UI/ConnectionConfirmationView/FittingConnectionConfirmationView.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import SwiftUI
20 |
21 | struct FittingView: View {
22 | @ViewBuilder let content: (Bool) -> Content
23 |
24 | var body: some View {
25 | if #available(iOS 16.0, *) {
26 | ViewThatFits(in: .vertical) {
27 | content(false)
28 |
29 | ScrollView {
30 | content(true)
31 | }
32 | }
33 | } else {
34 | ScrollView {
35 | content(true)
36 | }
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Sources/Core/Models/InAppTwoFactorAuthenticationSession.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import InfomaniakCore
20 |
21 | public struct InAppTwoFactorAuthenticationSession {
22 | let user: InfomaniakUser
23 | let apiFetcher: any InAppTwoFactorAuthenticationFetchable
24 |
25 | public init(user: InfomaniakUser, apiFetcher: ApiFetcher) {
26 | self.user = user
27 | self.apiFetcher = InAppTwoFactorAuthenticationFetcher(apiFetcher: apiFetcher)
28 | }
29 |
30 | init(user: InfomaniakUser, apiFetcher: MockInAppTwoFactorAuthenticationFetcher) {
31 | self.user = user
32 | self.apiFetcher = apiFetcher
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/folder.imageset/folder.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Sources/Extensions/Color+Extension.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import SwiftUI
20 |
21 | extension Color {
22 | enum Custom {
23 | /// light: greyOrca / dark: greyRabbit
24 | static let textPrimary = Color(
25 | light: UIColor.greyOrca,
26 | dark: UIColor.greyRabbit
27 | )
28 | /// light: greyElephant / dark: greyShark
29 | static let textSecondary = Color(
30 | light: UIColor.greyElephant,
31 | dark: UIColor.greyShark
32 | )
33 |
34 | /// light: greyMouse / dark: greyOrca
35 | static let divider = Color(
36 | light: UIColor.greyMouse,
37 | dark: UIColor.greyOrca
38 | )
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Sources/Networking/ApiFetcher+Extension.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import Alamofire
20 | import Foundation
21 | import InfomaniakCore
22 |
23 | public protocol KSuiteApiFetchable {
24 | func myKSuite() async throws -> MyKSuite
25 | }
26 |
27 | extension Endpoint {
28 | static func myKSuite() -> Endpoint {
29 | return Endpoint(path: "/1/my_ksuite/current",
30 | queryItems: [
31 | URLQueryItem(name: "with", value: "drive,mail")
32 | ])
33 | }
34 | }
35 |
36 | extension ApiFetcher: KSuiteApiFetchable {
37 | public func myKSuite() async throws -> MyKSuite {
38 | return try await perform(request: authenticatedRequest(.myKSuite()))
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Sources/UI/Extensions/Font+Extension.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import SwiftUI
20 |
21 | extension Font {
22 | enum Custom {
23 | /// Figma name: *Titre H2*
24 | static let title2 = Font.dynamicTypeSizeFont(size: 18, weight: .semibold, relativeTo: .title2)
25 |
26 | /// Figma name: *Body Medium*
27 | static let headline = Font.dynamicTypeSizeFont(size: 16, weight: .medium, relativeTo: .headline)
28 |
29 | /// Figma name: *Body Regular*
30 | static let body = Font.dynamicTypeSizeFont(size: 16, weight: .regular, relativeTo: .body)
31 |
32 | /// Figma name: *Body Small Regular*
33 | static let callout = Font.dynamicTypeSizeFont(size: 14, weight: .regular, relativeTo: .callout)
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Sources/UI/CenteringPlaceholderAvatarStackView.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import SwiftUI
20 |
21 | struct CenteringPlaceholderAvatarStackView: View {
22 | let width: CGFloat
23 |
24 | init(
25 | accounts: [ConnectedAccount],
26 | size: CGFloat = ConnectedAccountAvatarStackView.defaultSize,
27 | maxStackSize: Int = ConnectedAccountAvatarStackView.defaultMaxStackSize
28 | ) {
29 | width = 0.6 * size * CGFloat(min(maxStackSize, accounts.count))
30 | }
31 |
32 | var body: some View {
33 | Color.clear
34 | .frame(width: width, height: 1)
35 | }
36 | }
37 |
38 | #Preview {
39 | CenteringPlaceholderAvatarStackView(
40 | accounts: PreviewHelper.allAccounts,
41 | size: 40,
42 | maxStackSize: 3
43 | )
44 | }
45 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Sources/UI/ConnectionConfirmationView/MainContentView/TimeAgoView.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import SwiftUI
20 |
21 | struct TimeAgoView: View {
22 | let challengeCreatedAt: Date
23 |
24 | var body: some View {
25 | TimelineView(.periodic(from: challengeCreatedAt, by: 60)) { context in
26 | Text(text(for: context.date))
27 | }
28 | }
29 |
30 | func text(for date: Date) -> String {
31 | let secondsAgo = Int(date.timeIntervalSince(challengeCreatedAt))
32 |
33 | if secondsAgo >= 60 {
34 | return Localizable.twoFactorAuthMinutesAgoLabel(secondsAgo / 60)
35 | } else {
36 | return Localizable.twoFactorAuthJustNowLabel
37 | }
38 | }
39 | }
40 |
41 | #Preview {
42 | TimeAgoView(challengeCreatedAt: Date())
43 | }
44 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Generated/Strings+Generated.swift:
--------------------------------------------------------------------------------
1 | // swiftlint:disable all
2 | // Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
3 |
4 | import Foundation
5 |
6 | // swiftlint:disable superfluous_disable_command file_length implicit_return prefer_self_in_static_references
7 |
8 | // MARK: - Strings
9 |
10 | // swiftlint:disable explicit_type_interface function_parameter_count identifier_name line_length
11 | // swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces
12 | public enum KSuiteUtilsLocalizable {
13 | /// loco:679237f6daa3807fa008b175
14 | public static let buttonClose = KSuiteUtilsLocalizable.tr("Localizable", "buttonClose", fallback: "Close")
15 | }
16 | // swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length
17 | // swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces
18 |
19 | // MARK: - Implementation Details
20 |
21 | extension KSuiteUtilsLocalizable {
22 | private static func tr(_ table: String, _ key: String, _ args: CVarArg..., fallback value: String) -> String {
23 | let format = BundleToken.bundle.localizedString(forKey: key, value: value, table: table)
24 | return String(format: format, locale: Locale.current, arguments: args)
25 | }
26 | }
27 |
28 | // swiftlint:disable convenience_type
29 | private final class BundleToken {
30 | static let bundle: Bundle = {
31 | #if SWIFT_PACKAGE
32 | return Bundle.module
33 | #else
34 | return Bundle(for: BundleToken.self)
35 | #endif
36 | }()
37 | }
38 | // swiftlint:enable convenience_type
39 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Sources/Core/Models/RemoteChallenge.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import Foundation
20 |
21 | enum DeviceType: String, Decodable {
22 | case computer
23 | case phone
24 | case tablet
25 | }
26 |
27 | struct Device: Decodable {
28 | let name: String
29 | let type: DeviceType
30 | }
31 |
32 | enum ChallengeType: String, Decodable {
33 | case approval
34 | case unknown
35 |
36 | init(from decoder: any Decoder) throws {
37 | let singleKeyContainer = try decoder.singleValueContainer()
38 | let value = try singleKeyContainer.decode(String.self)
39 |
40 | self = ChallengeType(rawValue: value) ?? .unknown
41 | }
42 | }
43 |
44 | struct RemoteChallenge: Decodable {
45 | let uuid: String
46 | let type: ChallengeType
47 | let device: Device
48 | let location: String
49 | let createdAt: Date
50 | let expiresAt: Date
51 | }
52 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Sources/UI/Extensions/Color+Extension.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import SwiftUI
20 |
21 | extension Color {
22 | enum Custom {
23 | /// light: greyOrca / dark: greyRabbit
24 | static let textPrimary = Color(
25 | light: UIColor.greyOrca,
26 | dark: UIColor.greyRabbit
27 | )
28 | /// light: greyElephant / dark: greyShark
29 | static let textSecondary = Color(
30 | light: UIColor.greyElephant,
31 | dark: UIColor.greyMouse
32 | )
33 |
34 | /// light: greyMouse / dark: greyOrca
35 | static let divider = Color(
36 | light: UIColor.greyMouse,
37 | dark: UIColor.greyOrca
38 | )
39 |
40 | /// light: greyMouse / dark: greyOrca
41 | static let cardOutline = Color(
42 | light: UIColor.clear,
43 | dark: UIColor.greyOrca
44 | )
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Localizable/de.lproj/Localizable.stringsdict:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
12 |
13 | buttonContinueWithAccounts
14 |
15 | NSStringLocalizedFormatKey
16 | %#@value@
17 | value
18 |
19 | NSStringFormatSpecTypeKey
20 | NSStringPluralRuleType
21 | NSStringFormatValueTypeKey
22 | d
23 | one
24 | Weiter mit diesem Konto
25 | other
26 | Weiter mit diesen Konten
27 |
28 |
29 | selectedAccountCountLabel
30 |
31 | NSStringLocalizedFormatKey
32 | %#@value@
33 | value
34 |
35 | NSStringFormatSpecTypeKey
36 | NSStringPluralRuleType
37 | NSStringFormatValueTypeKey
38 | d
39 | one
40 | %d Konto ausgewählt
41 | other
42 | %d Konten ausgewählt
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Localizable/it.lproj/Localizable.stringsdict:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
12 |
13 | buttonContinueWithAccounts
14 |
15 | NSStringLocalizedFormatKey
16 | %#@value@
17 | value
18 |
19 | NSStringFormatSpecTypeKey
20 | NSStringPluralRuleType
21 | NSStringFormatValueTypeKey
22 | d
23 | one
24 | Continua con questo account
25 | other
26 | Continua con questi conti
27 |
28 |
29 | selectedAccountCountLabel
30 |
31 | NSStringLocalizedFormatKey
32 | %#@value@
33 | value
34 |
35 | NSStringFormatSpecTypeKey
36 | NSStringPluralRuleType
37 | NSStringFormatValueTypeKey
38 | d
39 | one
40 | %d conto selezionato
41 | other
42 | %d conti selezionati
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Localizable/en.lproj/Localizable.stringsdict:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
12 |
13 | buttonContinueWithAccounts
14 |
15 | NSStringLocalizedFormatKey
16 | %#@value@
17 | value
18 |
19 | NSStringFormatSpecTypeKey
20 | NSStringPluralRuleType
21 | NSStringFormatValueTypeKey
22 | d
23 | one
24 | Continue with this account
25 | other
26 | Continue with these accounts
27 |
28 |
29 | selectedAccountCountLabel
30 |
31 | NSStringLocalizedFormatKey
32 | %#@value@
33 | value
34 |
35 | NSStringFormatSpecTypeKey
36 | NSStringPluralRuleType
37 | NSStringFormatValueTypeKey
38 | d
39 | one
40 | %d account selected
41 | other
42 | %d accounts selected
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Localizable/fr.lproj/Localizable.stringsdict:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
12 |
13 | buttonContinueWithAccounts
14 |
15 | NSStringLocalizedFormatKey
16 | %#@value@
17 | value
18 |
19 | NSStringFormatSpecTypeKey
20 | NSStringPluralRuleType
21 | NSStringFormatValueTypeKey
22 | d
23 | one
24 | Continuer avec ce compte
25 | other
26 | Continuer avec ces comptes
27 |
28 |
29 | selectedAccountCountLabel
30 |
31 | NSStringLocalizedFormatKey
32 | %#@value@
33 | value
34 |
35 | NSStringFormatSpecTypeKey
36 | NSStringPluralRuleType
37 | NSStringFormatValueTypeKey
38 | d
39 | one
40 | %d compte sélectionné
41 | other
42 | %d comptes sélectionnés
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Icons/plane.imageset/plane.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Localizable/es.lproj/Localizable.stringsdict:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
12 |
13 | buttonContinueWithAccounts
14 |
15 | NSStringLocalizedFormatKey
16 | %#@value@
17 | value
18 |
19 | NSStringFormatSpecTypeKey
20 | NSStringPluralRuleType
21 | NSStringFormatValueTypeKey
22 | d
23 | one
24 | Continuar con esta cuenta
25 | other
26 | Continuar con estas cuentas
27 |
28 |
29 | selectedAccountCountLabel
30 |
31 | NSStringLocalizedFormatKey
32 | %#@value@
33 | value
34 |
35 | NSStringFormatSpecTypeKey
36 | NSStringPluralRuleType
37 | NSStringFormatValueTypeKey
38 | d
39 | one
40 | %d cuenta seleccionada
41 | other
42 | %d cuentas seleccionadas
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Sources/MyKSuiteView.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import DesignSystem
20 | import InfomaniakCoreSwiftUI
21 | import KSuiteUtils
22 | import SwiftUI
23 |
24 | public struct MyKSuiteView: View {
25 | @Environment(\.dismiss) private var dismiss
26 |
27 | private let configuration: MyKSuiteConfiguration
28 |
29 | public init(configuration: MyKSuiteConfiguration) {
30 | self.configuration = configuration
31 | }
32 |
33 | public var body: some View {
34 | UpSalePanelView(
35 | headerImage: MyKSuiteResources.gradient.swiftUIImage,
36 | title: MyKSuiteLocalizable.myKSuiteUpgradeTitle,
37 | description: MyKSuiteLocalizable.myKSuiteUpgradeDescription,
38 | labels: configuration.labels,
39 | additionalText: MyKSuiteLocalizable.myKSuiteUpgradeDetails
40 | )
41 | }
42 | }
43 |
44 | #Preview("kDrive") {
45 | MyKSuiteView(configuration: .kDrive)
46 | }
47 |
48 | #Preview("Mail") {
49 | MyKSuiteView(configuration: .mail)
50 | }
51 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/microsoft.imageset/microsoft.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Icons/envelope.imageset/envelope.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Sources/MyKSuitePanelModifier.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import InfomaniakCoreSwiftUI
20 | import SwiftUI
21 |
22 | struct MyKSuitePanelModifier: ViewModifier {
23 | @Binding var isPresented: Bool
24 | let backgroundColor: Color
25 | let configuration: MyKSuiteConfiguration
26 |
27 | func body(content: Content) -> some View {
28 | content
29 | .floatingPanel(isPresented: $isPresented,
30 | closeButtonHidden: true,
31 | backgroundColor: backgroundColor) {
32 | MyKSuiteView(configuration: configuration)
33 | }
34 | }
35 | }
36 |
37 | public extension View {
38 | func myKSuitePanel(isPresented: Binding, backgroundColor: Color, configuration: MyKSuiteConfiguration) -> some View {
39 | modifier(MyKSuitePanelModifier(isPresented: isPresented, backgroundColor: backgroundColor, configuration: configuration))
40 | }
41 | }
42 |
43 | #Preview {
44 | Text("Hello world!")
45 | .myKSuitePanel(isPresented: .constant(true), backgroundColor: .white, configuration: .kDrive)
46 | }
47 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by https://www.toptal.com/developers/gitignore/api/swiftpackagemanager,macos,xcode
2 | # Edit at https://www.toptal.com/developers/gitignore?templates=swiftpackagemanager,macos,xcode
3 |
4 | ### macOS ###
5 | # General
6 | .DS_Store
7 | .AppleDouble
8 | .LSOverride
9 |
10 | # Icon must end with two \r
11 | Icon
12 |
13 | # Thumbnails
14 | ._*
15 |
16 | # Files that might appear in the root of a volume
17 | .DocumentRevisions-V100
18 | .fseventsd
19 | .Spotlight-V100
20 | .TemporaryItems
21 | .Trashes
22 | .VolumeIcon.icns
23 | .com.apple.timemachine.donotpresent
24 |
25 | # Directories potentially created on remote AFP share
26 | .AppleDB
27 | .AppleDesktop
28 | Network Trash Folder
29 | Temporary Items
30 | .apdisk
31 |
32 | ### SwiftPackageManager ###
33 | Packages
34 | .build/
35 | xcuserdata
36 | DerivedData/
37 | *.xcodeproj
38 |
39 |
40 | ### Xcode ###
41 | # Xcode
42 | #
43 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
44 |
45 | ## User settings
46 | xcuserdata/
47 |
48 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
49 | *.xcscmblueprint
50 | *.xccheckout
51 |
52 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
53 | build/
54 | *.moved-aside
55 | *.pbxuser
56 | !default.pbxuser
57 | *.mode1v3
58 | !default.mode1v3
59 | *.mode2v3
60 | !default.mode2v3
61 | *.perspectivev3
62 | !default.perspectivev3
63 |
64 | ## Gcc Patch
65 | /*.gcno
66 |
67 | ### Xcode Patch ###
68 | *.xcodeproj/*
69 | !*.xcodeproj/project.pbxproj
70 | !*.xcodeproj/xcshareddata/
71 | !*.xcworkspace/contents.xcworkspacedata
72 | **/xcshareddata/WorkspaceSettings.xcsettings
73 |
74 | # End of https://www.toptal.com/developers/gitignore/api/swiftpackagemanager,macos,xcode%
75 |
--------------------------------------------------------------------------------
/Sources/KSuiteUtils/Utils/FontHelper.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import SwiftUI
20 |
21 | public enum FontHelper {
22 | private static func dynamicTypeSizeFont(size: CGFloat, weight: Font.Weight, relativeTo textStyle: Font.TextStyle) -> Font {
23 | let fontFamily = UIFont.preferredFont(forTextStyle: .body).familyName
24 | return Font.custom(fontFamily, size: size, relativeTo: textStyle).weight(weight)
25 | }
26 |
27 | public static let title: Font = dynamicTypeSizeFont(size: 18, weight: .semibold, relativeTo: .title2)
28 |
29 | // MARK: - Regular
30 |
31 | public static let body: Font = dynamicTypeSizeFont(size: 16, weight: .regular, relativeTo: .body)
32 | public static let bodySmall: Font = dynamicTypeSizeFont(size: 14, weight: .regular, relativeTo: .callout)
33 |
34 | // MARK: - Medium
35 |
36 | public static let bodyMedium: Font = dynamicTypeSizeFont(size: 16, weight: .medium, relativeTo: .headline)
37 |
38 | public static let bodySmallMedium: Font = dynamicTypeSizeFont(size: 14, weight: .medium, relativeTo: .callout)
39 | public static let labelMedium: Font = dynamicTypeSizeFont(size: 12, weight: .medium, relativeTo: .caption)
40 | }
41 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Sources/UI/CheckConnectionAttemptsViewModifier.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import InfomaniakCore
20 | import InfomaniakDI
21 | import SwiftUI
22 |
23 | public extension View {
24 | func checkConnectionAttempts(using sessions: [InAppTwoFactorAuthenticationSession]) -> some View {
25 | modifier(CheckConnectionAttemptsViewModifier(sessions: sessions))
26 | }
27 | }
28 |
29 | struct CheckConnectionAttemptsViewModifier: ViewModifier {
30 | let sessions: [InAppTwoFactorAuthenticationSession]
31 |
32 | func body(content: Content) -> some View {
33 | content
34 | .sceneLifecycle(willEnterForeground: fetchPendingConnectionAttempts)
35 | }
36 |
37 | func fetchPendingConnectionAttempts() {
38 | @InjectService var twoFactorAuthenticationManager: InAppTwoFactorAuthenticationManagerable
39 | twoFactorAuthenticationManager.checkConnectionAttempts(using: sessions)
40 | }
41 | }
42 |
43 | @available(iOS 17.0, *)
44 | #Preview {
45 | @Previewable @State var assembly = PreviewTargetAssembly()
46 | Text("Some app")
47 | .checkConnectionAttempts(using: [InAppTwoFactorAuthenticationSession.preview])
48 | }
49 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Sources/Components/CardModifier.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import DesignSystem
20 | import KSuiteUtils
21 | import SwiftUI
22 |
23 | struct CardModifier: ViewModifier {
24 | @Environment(\.colorScheme) private var colorScheme
25 |
26 | let withStroke: Bool
27 |
28 | private var strokeOpacity: Double {
29 | if withStroke {
30 | return colorScheme == .light ? 0 : 1
31 | }
32 | return 0
33 | }
34 |
35 | private var shadowOpacity: Double {
36 | colorScheme == .light ? 0.3 : 0
37 | }
38 |
39 | func body(content: Content) -> some View {
40 | content
41 | .clipShape(.rect(cornerRadius: IKRadius.large))
42 | .overlay {
43 | RoundedRectangle(cornerRadius: IKRadius.large)
44 | .strokeBorder(KSuiteUtilsResources.elephant.swiftUIColor.opacity(strokeOpacity), lineWidth: 1)
45 | }
46 | .shadow(color: KSuiteUtilsResources.shark.swiftUIColor.opacity(shadowOpacity), radius: 10)
47 | }
48 | }
49 |
50 | extension View {
51 | func cardStyle(withStroke: Bool = true) -> some View {
52 | modifier(CardModifier(withStroke: withStroke))
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/Sources/KSuite/KSuiteProUpgradeChip.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import DesignSystem
20 | import InfomaniakCoreSwiftUI
21 | import KSuiteUtils
22 | import SwiftUI
23 |
24 | public struct KSuiteProUpgradeChip: View {
25 | public init() {}
26 |
27 | public var body: some View {
28 | HStack {
29 | Text(KSuiteLocalizable.kSuiteUpgradeButton)
30 | .font(.system(size: 10))
31 | .foregroundStyle(ColorHelper.primary)
32 |
33 | KSuiteResources.rocket.swiftUIImage
34 | .resizable()
35 | .scaledToFit()
36 | .frame(width: 12)
37 | .foregroundStyle(ColorHelper.gradient)
38 | }
39 | .padding(.horizontal, value: .mini)
40 | .padding(.vertical, 6)
41 | .background(
42 | ZStack {
43 | ColorHelper.chipBackground
44 | .clipShape(Capsule())
45 |
46 | Capsule()
47 | .strokeBorder(
48 | ColorHelper.gradient,
49 | lineWidth: 1
50 | )
51 | }
52 | )
53 | }
54 | }
55 |
56 | #Preview {
57 | KSuiteProUpgradeChip()
58 | }
59 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Sources/Networking/MyKSuite.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import SwiftUI
20 |
21 | public struct MyKSuite: Codable, Sendable {
22 | let id: Int
23 | let drive: Drive
24 | let mail: Mail
25 | let trialExpiryAt: Int?
26 |
27 | public let isFree: Bool
28 |
29 | var icon: Image {
30 | if isFree {
31 | return MyKSuiteResources.myKSuiteLogo.swiftUIImage
32 | }
33 | return MyKSuiteResources.myKSuitePlusLogo.swiftUIImage
34 | }
35 |
36 | var formattedTrialExpiryDate: String? {
37 | guard let trialExpiryAt else { return nil }
38 | let date = Date(timeIntervalSince1970: TimeInterval(trialExpiryAt))
39 |
40 | let formatter = DateFormatter()
41 | formatter.dateStyle = .short
42 | return formatter.string(from: date)
43 | }
44 |
45 | public var email: String {
46 | mail.email
47 | }
48 | }
49 |
50 | struct Drive: Codable {
51 | let id: Int
52 | let name: String
53 | let size: Int64
54 | let usedSize: Int64
55 | }
56 |
57 | struct Mail: Codable {
58 | let id: Int
59 | let dailyLimitSent: Int
60 | let storageSizeLimit: Int64
61 | let email: String
62 | let usedSize: Int64
63 | }
64 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Sources/Dashboard/ProductProgressView.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import DesignSystem
20 | import KSuiteUtils
21 | import SwiftUI
22 |
23 | struct ProductProgressView: View {
24 | @Environment(\.colorScheme) private var colorScheme
25 | let product: Product
26 | let usedValue: Int64
27 | let totalValue: Int64
28 |
29 | var body: some View {
30 | VStack(spacing: IKPadding.mini) {
31 | HStack {
32 | Text(product.title)
33 | .frame(maxWidth: .infinity, alignment: .leading)
34 | .foregroundStyle(ColorHelper.primary)
35 | .font(FontHelper.body)
36 |
37 | Text("\(usedValue.formatted(.defaultByteCount)) / \(totalValue.formatted(.defaultByteCount))")
38 | .foregroundStyle(ColorHelper.secondary)
39 | .font(FontHelper.bodySmall)
40 | }
41 |
42 | ProgressView(value: Double(usedValue), total: Double(totalValue))
43 | .progressViewStyle(CustomProgressBar())
44 | .foregroundStyle(product.color)
45 | }
46 | }
47 | }
48 |
49 | #Preview {
50 | ProductProgressView(product: .mail, usedValue: 2300, totalValue: 20)
51 | }
52 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Sources/UI/ConnectionConfirmationView/MainContentView/RowView.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import DesignSystem
20 | import SwiftUI
21 |
22 | struct RowView: View {
23 | let title: String
24 | @ViewBuilder let description: Content
25 |
26 | var body: some View {
27 | VStack(alignment: .leading, spacing: IKPadding.micro) {
28 | Text(title)
29 | .font(.Custom.callout)
30 | .foregroundStyle(Color.Custom.textSecondary)
31 | description
32 | .font(.Custom.headline)
33 | .foregroundStyle(Color.Custom.textPrimary)
34 | }
35 | .frame(maxWidth: .infinity, alignment: .leading)
36 | }
37 | }
38 |
39 | extension RowView where Content == Text {
40 | init(title: String, description: String) {
41 | self.title = title
42 | self.description = Text(description)
43 | }
44 | }
45 |
46 | #Preview {
47 | VStack {
48 | RowView(title: "Device") {
49 | HStack {
50 | Text("iPhone 17")
51 | Image(systemName: "iphone.gen2")
52 | }
53 | }
54 | RowView(title: "Place", description: "Switzerland")
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Icons/gift.imageset/gift.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/Sources/KSuite/KSuitePanelModifier.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import InfomaniakCoreSwiftUI
20 | import SwiftUI
21 |
22 | struct KSuitePanelModifier: ViewModifier {
23 | @Binding var isPresented: Bool
24 | let backgroundColor: Color
25 | let configuration: KSuiteConfiguration
26 | let isAdmin: Bool
27 |
28 | func body(content: Content) -> some View {
29 | content
30 | .floatingPanel(isPresented: $isPresented, closeButtonHidden: true, backgroundColor: backgroundColor, topPadding: 0) {
31 | KSuiteView(configuration: configuration, isAdmin: isAdmin)
32 | }
33 | }
34 | }
35 |
36 | public extension View {
37 | func kSuitePanel(
38 | isPresented: Binding,
39 | backgroundColor: Color = .clear,
40 | configuration: KSuiteConfiguration,
41 | isAdmin: Bool
42 | ) -> some View {
43 | modifier(KSuitePanelModifier(
44 | isPresented: isPresented,
45 | backgroundColor: backgroundColor,
46 | configuration: configuration,
47 | isAdmin: isAdmin
48 | ))
49 | }
50 | }
51 |
52 | #Preview {
53 | Text("Hello world!")
54 | .kSuitePanel(isPresented: .constant(true), configuration: .business, isAdmin: true)
55 | }
56 |
--------------------------------------------------------------------------------
/Sources/KSuite/KSuiteView.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import DesignSystem
20 | import InfomaniakCoreSwiftUI
21 | import KSuiteUtils
22 | import SwiftUI
23 |
24 | public struct KSuiteView: View {
25 | @Environment(\.dismiss) private var dismiss
26 |
27 | private let configuration: KSuiteConfiguration
28 | private let isAdmin: Bool
29 |
30 | public init(configuration: KSuiteConfiguration, isAdmin: Bool) {
31 | self.configuration = configuration
32 | self.isAdmin = isAdmin
33 | }
34 |
35 | public var body: some View {
36 | UpSalePanelView(
37 | headerImage: KSuiteResources.background.swiftUIImage,
38 | title: configuration.title,
39 | description: configuration.description,
40 | labels: configuration.labels,
41 | additionalText: isAdmin ?
42 | KSuiteLocalizable.kSuiteUpgradeDetails : KSuiteLocalizable.kSuiteUpgradeDetailsContactAdmin
43 | )
44 | }
45 | }
46 |
47 | #Preview("Standard") {
48 | KSuiteView(configuration: .standard, isAdmin: false)
49 | }
50 |
51 | #Preview("Business") {
52 | KSuiteView(configuration: .business, isAdmin: false)
53 | }
54 |
55 | #Preview("Entreprise") {
56 | KSuiteView(configuration: .enterprise, isAdmin: false)
57 | }
58 |
--------------------------------------------------------------------------------
/.swiftlint.yml:
--------------------------------------------------------------------------------
1 | disabled_rules:
2 | - line_length
3 | - identifier_name
4 | - type_body_length
5 | - function_body_length
6 | - file_length
7 | - type_name
8 | - force_cast
9 | - cyclomatic_complexity
10 | - inclusive_language
11 | - for_where
12 | - optional_data_string_conversion
13 | opt_in_rules:
14 | - closure_end_indentation
15 | - closure_spacing
16 | - collection_alignment
17 | - contains_over_filter_count
18 | - contains_over_first_not_nil
19 | - contains_over_range_nil_comparison
20 | - empty_collection_literal
21 | - empty_count
22 | - empty_string
23 | - first_where
24 | - identical_operands
25 | - last_where
26 | - operator_usage_whitespace
27 | - overridden_super_call
28 | - prefer_zero_over_explicit_init
29 | - prohibited_super_call
30 | - redundant_type_annotation
31 | - toggle_bool
32 | - trailing_closure
33 | - unneeded_parentheses_in_closure_argument
34 | analyzer_rules:
35 | - unused_import
36 | excluded:
37 | - Derived/Sources/*
38 | - DerivedData/
39 | - Derived/
40 | - Tuist/.build/
41 | - Tests/*
42 | - Sources/MyKSuite/Generated
43 | - Sources/InterAppLogin/Generated
44 | - Sources/KSuiteUtils/Generated
45 | - Sources/KSuite/Generated
46 | - Sources/InAppTwoFactorAuthentication/Generated
47 | custom_rules:
48 | private_state:
49 | included:
50 | - ".*\\.swift"
51 | regex: "(?.
17 | */
18 |
19 | import DesignSystem
20 | import KSuiteUtils
21 | import SwiftUI
22 |
23 | struct SubscriptionProductsView: View {
24 | let myKSuite: MyKSuite
25 |
26 | var body: some View {
27 | VStack(spacing: IKPadding.medium) {
28 | if myKSuite.isFree {
29 | ProductProgressView(
30 | product: .mail,
31 | usedValue: myKSuite.mail.usedSize,
32 | totalValue: myKSuite.mail.storageSizeLimit
33 | )
34 | } else {
35 | HStack {
36 | Text(Product.mail.title)
37 | .frame(maxWidth: .infinity, alignment: .leading)
38 | .foregroundStyle(ColorHelper.primary)
39 | .font(FontHelper.body)
40 |
41 | Text(MyKSuiteLocalizable.myKSuiteDashboardDataUnlimited)
42 | .foregroundStyle(ColorHelper.secondary)
43 | .font(FontHelper.bodySmall)
44 | }
45 | }
46 |
47 | ProductProgressView(product: .drive, usedValue: myKSuite.drive.usedSize, totalValue: myKSuite.drive.size)
48 | }
49 | }
50 | }
51 |
52 | #Preview {
53 | SubscriptionProductsView(myKSuite: PreviewHelper.sampleMyKSuite)
54 | }
55 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Icons/folder.arrow.up.imageset/folder.arrow.up.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Resources/Assets.xcassets/Images/person-circle-plus-filled.imageset/person-circle-plus-filled.svg:
--------------------------------------------------------------------------------
1 |
13 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Sources/Dashboard/HeaderView.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import DesignSystem
20 | import InfomaniakCoreSwiftUI
21 | import KSuiteUtils
22 | import SwiftUI
23 |
24 | struct HeaderView: View {
25 | let myKSuite: MyKSuite
26 | let avatarView: () -> Content
27 |
28 | var body: some View {
29 | HStack {
30 | ZStack {
31 | MyKSuiteResources.person.swiftUIImage
32 | .iconSize(.medium)
33 | .foregroundStyle(ColorHelper.secondary)
34 |
35 | avatarView()
36 | .frame(width: 24, height: 24)
37 | }
38 | .frame(width: 24, height: 24)
39 | .overlay {
40 | Circle()
41 | .strokeBorder(ColorHelper.gradient, lineWidth: 1)
42 | }
43 | .background(KSuiteUtilsResources.polarBear.swiftUIColor)
44 | .clipShape(.circle)
45 |
46 | Text(myKSuite.mail.email)
47 | .frame(maxWidth: .infinity, alignment: .leading)
48 | .foregroundStyle(ColorHelper.primary)
49 | .font(FontHelper.body)
50 |
51 | myKSuite.icon
52 | .padding(.horizontal, value: .mini)
53 | .padding(.vertical, value: .micro)
54 | .background(ColorHelper.reversedPrimary)
55 | .clipShape(Capsule())
56 | }
57 | }
58 | }
59 |
60 | #Preview {
61 | HeaderView(myKSuite: PreviewHelper.sampleMyKSuite) { EmptyView() }
62 | }
63 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/stair.imageset/stair.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Sources/Dashboard/SubscriptionCardView.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import DesignSystem
20 | import InfomaniakCoreSwiftUI
21 | import KSuiteUtils
22 | import SwiftUI
23 |
24 | struct SubscriptionCardView: View {
25 | let myKSuite: MyKSuite
26 | let avatarView: () -> Content
27 |
28 | var body: some View {
29 | VStack(spacing: IKPadding.large) {
30 | HeaderView(myKSuite: myKSuite, avatarView: avatarView)
31 |
32 | Divider()
33 | .overlay(ColorHelper.divider)
34 |
35 | SubscriptionProductsView(myKSuite: myKSuite)
36 |
37 | Divider()
38 | .overlay(ColorHelper.divider)
39 |
40 | if myKSuite.isFree {
41 | SubscriptionFreeDetailsView(dailyLimit: myKSuite.mail.dailyLimitSent)
42 | } else {
43 | SubscriptionPlusDetailsView(myKSuite: myKSuite)
44 | }
45 | }
46 | .padding(value: .medium)
47 | .frame(maxWidth: .infinity, alignment: .leading)
48 | .background(ColorHelper.backgroundPrimary)
49 | .cardStyle()
50 | }
51 | }
52 |
53 | #Preview {
54 | SubscriptionCardView(myKSuite: PreviewHelper.sampleMyKSuite) {
55 | EmptyView()
56 | }
57 | .padding()
58 | .frame(maxHeight: .infinity, alignment: .top)
59 | .background {
60 | MyKSuiteResources.background.swiftUIImage
61 | .resizable()
62 | .scaledToFit()
63 | .frame(maxHeight: .infinity, alignment: .top)
64 | .ignoresSafeArea()
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Sources/UI/ConnectionConfirmationView/InformationContentView.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import DesignSystem
20 | import InfomaniakCoreUIResources
21 | import SwiftUI
22 |
23 | struct InformationAction {
24 | let title: String
25 | let action: () -> Void
26 | }
27 |
28 | struct InformationContentView: View {
29 | let text: String
30 | var additionalAction: InformationAction?
31 | let onClose: () -> Void
32 |
33 | var body: some View {
34 | VStack {
35 | Text(text)
36 | .multilineTextAlignment(.center)
37 | .font(.Custom.body)
38 | .foregroundStyle(Color.Custom.textSecondary)
39 |
40 | VStack(spacing: IKPadding.small) {
41 | if let additionalAction {
42 | Button(additionalAction.title, action: additionalAction.action)
43 | .buttonStyle(.ikBorderedProminent)
44 | .ikButtonFullWidth(true)
45 | .controlSize(.large)
46 | }
47 |
48 | Button(CoreUILocalizable.buttonClose, action: onClose)
49 | .buttonStyle(.ikBordered)
50 | .ikButtonFullWidth(true)
51 | .controlSize(.large)
52 | }
53 | .frame(maxHeight: .infinity, alignment: .bottom)
54 | }
55 | .padding(.horizontal, value: .large)
56 | }
57 | }
58 |
59 | #Preview {
60 | InformationContentView(text: "An error occurred", additionalAction: InformationAction(title: "Retry") {}) {}
61 | }
62 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Sources/Dashboard/SubscriptionBenefitsView.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import DesignSystem
20 | import InfomaniakCoreSwiftUI
21 | import KSuiteUtils
22 | import SwiftUI
23 |
24 | struct SubscriptionBenefitsView: View {
25 | var body: some View {
26 | VStack(alignment: .leading, spacing: IKPadding.large) {
27 | Text(MyKSuiteLocalizable.myKSuiteUpgradeBenefitsTitle)
28 | .foregroundStyle(ColorHelper.secondary)
29 | .font(FontHelper.bodySmall)
30 |
31 | Label {
32 | Text(MyKSuiteLocalizable.myKSuiteUpgradeDriveLabel)
33 | } icon: {
34 | Image("drive", bundle: .module)
35 | .iconSize(.medium)
36 | }
37 |
38 | Label {
39 | Text(MyKSuiteLocalizable.myKSuiteUpgradeUnlimitedMailLabel)
40 | } icon: {
41 | Image("plane", bundle: .module)
42 | .iconSize(.medium)
43 | }
44 |
45 | Label {
46 | Text(MyKSuiteLocalizable.myKSuiteUpgradeLabel)
47 | } icon: {
48 | Image("gift", bundle: .module)
49 | .iconSize(.medium)
50 | }
51 | }
52 | .foregroundStyle(ColorHelper.primary)
53 | .font(FontHelper.body)
54 | .padding(value: .medium)
55 | .frame(maxWidth: .infinity, alignment: .leading)
56 | .background(ColorHelper.backgroundPrimary)
57 | .cardStyle()
58 | }
59 | }
60 |
61 | #Preview {
62 | SubscriptionBenefitsView()
63 | .padding()
64 | }
65 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Sources/MyKSuiteConfiguration.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import KSuiteUtils
20 | import SwiftUI
21 |
22 | public enum MyKSuiteConfiguration {
23 | case mail
24 | case kDrive
25 |
26 | var labels: [KSuiteUtils.KSuiteLabel] {
27 | switch self {
28 | case .mail:
29 | [
30 | KSuiteLabel(
31 | icon: MyKSuiteResources.plane.swiftUIImage,
32 | text: MyKSuiteLocalizable.myKSuiteUpgradeUnlimitedMailLabel
33 | ),
34 | KSuiteLabel(
35 | icon: MyKSuiteResources.envelope.swiftUIImage,
36 | text: MyKSuiteLocalizable.myKSuiteUpgradeRedirectLabel
37 | ),
38 | KSuiteLabel(
39 | icon: MyKSuiteResources.gift.swiftUIImage,
40 | text: MyKSuiteLocalizable.myKSuiteUpgradeLabel
41 | )
42 | ]
43 | case .kDrive:
44 | [
45 | KSuiteLabel(
46 | icon: MyKSuiteResources.drive.swiftUIImage,
47 | text: MyKSuiteLocalizable.myKSuiteUpgradeDriveLabel
48 | ),
49 | KSuiteLabel(
50 | icon: MyKSuiteResources.folderArrowUp.swiftUIImage,
51 | text: MyKSuiteLocalizable.myKSuiteUpgradePdfEditionLabel
52 | ),
53 | KSuiteLabel(
54 | icon: MyKSuiteResources.gift.swiftUIImage,
55 | text: MyKSuiteLocalizable.myKSuiteUpgradeLabel
56 | )
57 | ]
58 | }
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Sources/Components/CustomProgressBar.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import KSuiteUtils
20 | import SwiftUI
21 |
22 | struct CustomProgressBar: ProgressViewStyle {
23 | let barHeight: CGFloat = 14
24 |
25 | func makeBody(configuration: Configuration) -> some View {
26 | ZStack(alignment: .leading) {
27 | RoundedRectangle(cornerRadius: barHeight / 2)
28 | .frame(height: barHeight)
29 | .foregroundStyle(ColorHelper.reversedPrimary)
30 | .overlay {
31 | GeometryReader { geometry in
32 | RoundedRectangle(cornerRadius: barHeight / 2)
33 | .frame(
34 | width: filledProgressBarWidth(
35 | progressBarWidth: geometry.size.width,
36 | fractionCompleted: configuration.fractionCompleted ?? 0
37 | ),
38 | height: barHeight
39 | )
40 | }
41 | }
42 | }
43 | }
44 |
45 | func filledProgressBarWidth(progressBarWidth: CGFloat, fractionCompleted: CGFloat) -> CGFloat {
46 | max(barHeight, progressBarWidth * CGFloat(fractionCompleted))
47 | }
48 | }
49 |
50 | #Preview {
51 | VStack {
52 | ProgressView(value: 2.3, total: 15)
53 | .progressViewStyle(CustomProgressBar())
54 | .foregroundStyle(.blue)
55 | ProgressView(value: 1, total: 1000)
56 | .progressViewStyle(CustomProgressBar())
57 | .foregroundStyle(.blue)
58 | }
59 | .padding()
60 | }
61 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Sources/UI/ConnectedAccountView.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import InfomaniakCore
20 | import InfomaniakCoreSwiftUI
21 | import Nuke
22 | import NukeUI
23 | import SwiftUI
24 |
25 | struct ConnectedAccountAvatarView: View {
26 | let connectedAccount: ConnectedAccount
27 | var size: CGFloat = 40
28 |
29 | var body: some View {
30 | Group {
31 | if let rawAvatarURL = connectedAccount.userProfile.avatar,
32 | let avatarURL = URL(string: rawAvatarURL) {
33 | LazyImage(request: ImageRequest(url: avatarURL)) { state in
34 | if let image = state.image {
35 | AvatarImage(image: image, size: size)
36 | } else {
37 | initialsView
38 | }
39 | }
40 | } else {
41 | initialsView
42 | }
43 | }
44 | .clipShape(Circle())
45 | .background(
46 | Circle()
47 | .stroke(Color.greyMouse)
48 | )
49 | }
50 |
51 | private var initialsView: some View {
52 | InitialsView(
53 | initials: NameFormatter(fullName: connectedAccount.userProfile.displayName).initials,
54 | backgroundColor: Color.backgroundColor(from: connectedAccount.userProfile.email.hash),
55 | foregroundColor: Color.backgroundSecondary,
56 | size: size
57 | )
58 | }
59 | }
60 |
61 | #Preview {
62 | VStack {
63 | ConnectedAccountAvatarView(connectedAccount: PreviewHelper.connectedAccount)
64 | ConnectedAccountAvatarView(connectedAccount: PreviewHelper.connectedAccount2)
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Resources/Assets.xcassets/Icons/lock.imageset/lock.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Localizable/en.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | * Loco ios export: Xcode Strings (legacy)
3 | * Project: CoreUI
4 | * Locale: en, English
5 | * Tagged: ios, !common, !emoji-reaction, !interapplogin, !ios-stringsdict, !kSuite, !kSuiteUtils, !my kSuite, !privacy
6 | * Exported by: Philippe Weidmann
7 | * Exported at: Thu, 09 Oct 2025 08:30:37 +0200
8 | */
9 |
10 | /* loco:68d52770d78cd0b5b102a952 */
11 | " twoFactorAuthJustNowLabel" = "Just now";
12 |
13 | /* loco:68d4f859fceae6b843046de7 */
14 | "buttonApprove" = "Approve";
15 |
16 | /* loco:68d4f873098af73894089853 */
17 | "buttonDeny" = "Deny";
18 |
19 | /* loco:68d4f8d82bc1b93265068752 */
20 | "buttonEditPassword" = "Edit password";
21 |
22 | /* loco:68da784d25d05d451b04f663 */
23 | "twoFactorAuthAlreadyProcessedErrorTitle" = "This request has already been processed";
24 |
25 | /* loco:68da78cbe3aba64d960ff0c2 */
26 | "twoFactorAuthCheckOriginDescription" = "You didn’t initiate this action?\nCheck your active devices, and disconnect the ones you don’t recognize.";
27 |
28 | /* loco:68c04f14ec33731be0018cb8 */
29 | "twoFactorAuthConfirmationDescription" = "Confirming this login attempt will allow that device to access your Infomaniak account";
30 |
31 | /* loco:68d5248990faa534e505f204 */
32 | "twoFactorAuthConnectionRejectedDescription" = "You have refused a login attempt. To secure your account, change your password.\nIf you are the source of this attempt, try logging in again.";
33 |
34 | /* loco:68d5247e90faa534e505f202 */
35 | "twoFactorAuthConnectionRejectedTitle" = "Connection Rejected";
36 |
37 | /* loco:68c04d95fa5d09365f02c055 */
38 | "twoFactorAuthDeviceLabel" = "Device";
39 |
40 | /* loco:68da77e9a0c5c4a1d809d4c4 */
41 | "twoFactorAuthExpiredErrorTitle" = "This login request has expired";
42 |
43 | /* loco:68de2abbe02b752bd80f2782 */
44 | "twoFactorAuthGenericErrorDescription" = "Unable to complete the operation.\nPlease try again.";
45 |
46 | /* loco:68c04e0aec33731be0018cb4 */
47 | "twoFactorAuthLocationLabel" = "Location";
48 |
49 | /* loco:68de26e7e0ead3ef030b71f2 */
50 | "twoFactorAuthNoNetworkErrorDescription" = "Unable to complete the operation.\nCheck your connection and try again.";
51 |
52 | /* loco:68de2516c411b0f8b20a4832 */
53 | "twoFactorAuthNoNetworkErrorTitle" = "No network connection";
54 |
55 | /* loco:68c053c71ea34fd57a062325 */
56 | "twoFactorAuthTryingToLogInTitle" = "Are you trying to login?";
57 |
58 | /* loco:68c04d446368e16b82076535 */
59 | "twoFactorAuthWhenLabel" = "When";
60 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Localizable/es.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | * Loco ios export: Xcode Strings (legacy)
3 | * Project: CoreUI
4 | * Locale: es, Spanish
5 | * Tagged: ios, !common, !emoji-reaction, !interapplogin, !ios-stringsdict, !kSuite, !kSuiteUtils, !my kSuite, !privacy
6 | * Exported by: Philippe Weidmann
7 | * Exported at: Thu, 09 Oct 2025 08:30:37 +0200
8 | */
9 |
10 | /* loco:68d52770d78cd0b5b102a952 */
11 | " twoFactorAuthJustNowLabel" = "Ahora";
12 |
13 | /* loco:68d4f859fceae6b843046de7 */
14 | "buttonApprove" = "Aprobar";
15 |
16 | /* loco:68d4f873098af73894089853 */
17 | "buttonDeny" = "Denegar";
18 |
19 | /* loco:68d4f8d82bc1b93265068752 */
20 | "buttonEditPassword" = "Cambiar contraseña";
21 |
22 | /* loco:68da784d25d05d451b04f663 */
23 | "twoFactorAuthAlreadyProcessedErrorTitle" = "Esta solicitud ya ha sido tramitada";
24 |
25 | /* loco:68da78cbe3aba64d960ff0c2 */
26 | "twoFactorAuthCheckOriginDescription" = "¿No has iniciado esta acción?\nComprueba tus dispositivos activos y desconecta los que no reconozcas.";
27 |
28 | /* loco:68c04f14ec33731be0018cb8 */
29 | "twoFactorAuthConfirmationDescription" = "Al confirmar esta conexión, autorizas a este dispositivo a acceder a tu cuenta Infomaniak.";
30 |
31 | /* loco:68d5248990faa534e505f204 */
32 | "twoFactorAuthConnectionRejectedDescription" = "Ha rechazado un intento de conexión. Para asegurar su cuenta, cambie su contraseña.\nSi usted es el origen de este intento, intente conectarse de nuevo.";
33 |
34 | /* loco:68d5247e90faa534e505f202 */
35 | "twoFactorAuthConnectionRejectedTitle" = "Conexión rechazada";
36 |
37 | /* loco:68c04d95fa5d09365f02c055 */
38 | "twoFactorAuthDeviceLabel" = "Dispositivo";
39 |
40 | /* loco:68da77e9a0c5c4a1d809d4c4 */
41 | "twoFactorAuthExpiredErrorTitle" = "Esta solicitud de conexión ha expirado";
42 |
43 | /* loco:68de2abbe02b752bd80f2782 */
44 | "twoFactorAuthGenericErrorDescription" = "No se pudo completar la operación.\nVuelve a intentarlo.";
45 |
46 | /* loco:68c04e0aec33731be0018cb4 */
47 | "twoFactorAuthLocationLabel" = "Lugar";
48 |
49 | /* loco:68de26e7e0ead3ef030b71f2 */
50 | "twoFactorAuthNoNetworkErrorDescription" = "No se ha podido completar la operación.\nCompruebe su conexión e inténtelo de nuevo.";
51 |
52 | /* loco:68de2516c411b0f8b20a4832 */
53 | "twoFactorAuthNoNetworkErrorTitle" = "No hay red";
54 |
55 | /* loco:68c053c71ea34fd57a062325 */
56 | "twoFactorAuthTryingToLogInTitle" = "¿Está intentando conectarse?";
57 |
58 | /* loco:68c04d446368e16b82076535 */
59 | "twoFactorAuthWhenLabel" = "En";
60 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Sources/UI/ConnectedAccountCellView.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import DesignSystem
20 | import SwiftUI
21 |
22 | struct ConnectedAccountCellView: View {
23 | let connectedAccount: ConnectedAccount
24 | @Binding var isSelected: Bool
25 |
26 | var body: some View {
27 | Button {
28 | isSelected.toggle()
29 | } label: {
30 | HStack {
31 | ConnectedAccountAvatarView(connectedAccount: connectedAccount)
32 | VStack(alignment: .leading, spacing: 0) {
33 | Text(connectedAccount.userProfile.displayName)
34 | .font(.Custom.headline)
35 | .foregroundStyle(Color.Custom.textPrimary)
36 | Text(connectedAccount.userProfile.email)
37 | .font(.Custom.body)
38 | .foregroundStyle(Color.Custom.textSecondary)
39 | }
40 | .lineLimit(1)
41 | .frame(maxWidth: .infinity, alignment: .leading)
42 |
43 | Image(.check)
44 | .iconSize(.medium)
45 | .foregroundStyle(.tint)
46 | .opacity(isSelected ? 1 : 0)
47 | .animation(nil, value: isSelected)
48 | }
49 | .padding(.vertical, value: .mini)
50 | }
51 | }
52 | }
53 |
54 | @available(iOS 17.0, *)
55 | #Preview {
56 | @Previewable @State var isFirstSelected = true
57 | @Previewable @State var isSecondSelected = false
58 | VStack {
59 | ConnectedAccountCellView(connectedAccount: PreviewHelper.connectedAccount, isSelected: $isFirstSelected)
60 | ConnectedAccountCellView(connectedAccount: PreviewHelper.connectedAccount, isSelected: $isSecondSelected)
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/device-arrow-rotate.imageset/device-arrow-rotate.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/.swiftformat:
--------------------------------------------------------------------------------
1 | --acronyms ID,URL,UUID
2 | --allman false
3 | --assetliterals visual-width
4 | --asynccapturing
5 | --beforemarks
6 | --binarygrouping 4,8
7 | --categorymark "MARK: %c"
8 | --classthreshold 0
9 | --closingparen balanced
10 | --closurevoid remove
11 | --commas always
12 | --conflictmarkers reject
13 | --decimalgrouping 3,6
14 | --elseposition same-line
15 | --emptybraces no-space
16 | --enumnamespaces always
17 | --enumthreshold 0
18 | --exponentcase lowercase
19 | --exponentgrouping disabled
20 | --extensionacl on-extension
21 | --extensionlength 0
22 | --extensionmark "MARK: - %t + %c"
23 | --fractiongrouping disabled
24 | --fragment false
25 | --funcattributes preserve
26 | --generictypes
27 | --groupedextension "MARK: %c"
28 | --guardelse auto
29 | --header ignore
30 | --hexgrouping 4,8
31 | --hexliteralcase uppercase
32 | --ifdef no-indent
33 | --importgrouping alpha
34 | --indent 4
35 | --indentcase false
36 | --indentstrings false
37 | --lifecycle
38 | --lineaftermarks true
39 | --linebreaks lf
40 | --markcategories true
41 | --markextensions always
42 | --marktypes always
43 | --maxwidth 130
44 | --modifierorder
45 | --nevertrailing
46 | --nospaceoperators
47 | --nowrapoperators
48 | --octalgrouping 4,8
49 | --operatorfunc spaced
50 | --organizetypes actor,class,enum,struct
51 | --patternlet inline
52 | --ranges spaced
53 | --redundanttype inferred
54 | --self remove
55 | --selfrequired
56 | --semicolons inline
57 | --shortoptionals always
58 | --smarttabs enabled
59 | --someany true
60 | --stripunusedargs unnamed-only
61 | --structthreshold 0
62 | --tabwidth unspecified
63 | --throwcapturing
64 | --trailingclosures
65 | --trimwhitespace always
66 | --typeattributes preserve
67 | --typeblanklines remove
68 | --typemark "MARK: - %t"
69 | --varattributes preserve
70 | --voidtype void
71 | --wraparguments preserve
72 | --wrapcollections preserve
73 | --wrapconditions preserve
74 | --wrapeffects preserve
75 | --wrapenumcases always
76 | --wrapparameters default
77 | --wrapreturntype preserve
78 | --wrapternary default
79 | --wraptypealiases preserve
80 | --xcodeindentation disabled
81 | --yodaswap always
82 | --disable andOperator,opaqueGenericParameters,preferKeyPath,redundantReturn,strongOutlets,trailingCommas,unusedArguments,wrapMultilineStatementBraces,conditionalAssignment
83 | --enable blankLineAfterImports,blankLinesBetweenImports
84 | --exclude DerivedData,Derived,Tuist,Project.swift,Build,.build,Sources/MyKSuite/Generated/,Sources/InterAppLogin/Generated/,Sources/KSuiteUtils/Generated/,Sources/KSuite/Generated/,Sources/InAppTwoFactorAuthentication/Generated
85 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Localizable/it.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | * Loco ios export: Xcode Strings (legacy)
3 | * Project: CoreUI
4 | * Locale: it, Italian
5 | * Tagged: ios, !common, !emoji-reaction, !interapplogin, !ios-stringsdict, !kSuite, !kSuiteUtils, !my kSuite, !privacy
6 | * Exported by: Philippe Weidmann
7 | * Exported at: Thu, 09 Oct 2025 08:30:37 +0200
8 | */
9 |
10 | /* loco:68d52770d78cd0b5b102a952 */
11 | " twoFactorAuthJustNowLabel" = "Ora";
12 |
13 | /* loco:68d4f859fceae6b843046de7 */
14 | "buttonApprove" = "Approvare";
15 |
16 | /* loco:68d4f873098af73894089853 */
17 | "buttonDeny" = "Negare";
18 |
19 | /* loco:68d4f8d82bc1b93265068752 */
20 | "buttonEditPassword" = "Modifica della password";
21 |
22 | /* loco:68da784d25d05d451b04f663 */
23 | "twoFactorAuthAlreadyProcessedErrorTitle" = "Questa richiesta è già stata elaborata";
24 |
25 | /* loco:68da78cbe3aba64d960ff0c2 */
26 | "twoFactorAuthCheckOriginDescription" = "Non hai avviato tu questa azione?\nControlla i tuoi dispositivi attivi e disconnetti quelli che non riconosci.";
27 |
28 | /* loco:68c04f14ec33731be0018cb8 */
29 | "twoFactorAuthConfirmationDescription" = "Confermando questa connessione, autorizzi questo dispositivo ad accedere al tuo account Infomaniak.";
30 |
31 | /* loco:68d5248990faa534e505f204 */
32 | "twoFactorAuthConnectionRejectedDescription" = "È stato rifiutato un tentativo di connessione. Per proteggere il vostro account, cambiate la password.\nSe siete voi la fonte di questo tentativo, provate ad accedere di nuovo.";
33 |
34 | /* loco:68d5247e90faa534e505f202 */
35 | "twoFactorAuthConnectionRejectedTitle" = "Connessione rifiutata";
36 |
37 | /* loco:68c04d95fa5d09365f02c055 */
38 | "twoFactorAuthDeviceLabel" = "Dispositivo";
39 |
40 | /* loco:68da77e9a0c5c4a1d809d4c4 */
41 | "twoFactorAuthExpiredErrorTitle" = "Questa richiesta di connessione è scaduta";
42 |
43 | /* loco:68de2abbe02b752bd80f2782 */
44 | "twoFactorAuthGenericErrorDescription" = "Impossibile completare l’operazione.\nRiprova.";
45 |
46 | /* loco:68c04e0aec33731be0018cb4 */
47 | "twoFactorAuthLocationLabel" = "Luogo";
48 |
49 | /* loco:68de26e7e0ead3ef030b71f2 */
50 | "twoFactorAuthNoNetworkErrorDescription" = "Impossibile completare l’operazione.\nControllare la connessione e riprovare.";
51 |
52 | /* loco:68de2516c411b0f8b20a4832 */
53 | "twoFactorAuthNoNetworkErrorTitle" = "Nessuna rete";
54 |
55 | /* loco:68c053c71ea34fd57a062325 */
56 | "twoFactorAuthTryingToLogInTitle" = "Stai cercando di accedere?";
57 |
58 | /* loco:68c04d446368e16b82076535 */
59 | "twoFactorAuthWhenLabel" = "Quando";
60 |
--------------------------------------------------------------------------------
/Sources/InterAppLogin/Sources/UI/OutlinedButtonStyle.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import DesignSystem
20 | import Foundation
21 | import InfomaniakCoreSwiftUI
22 | import SwiftUI
23 |
24 | extension ButtonStyle where Self == OutlinedButtonStyle {
25 | static var outlined: OutlinedButtonStyle {
26 | return OutlinedButtonStyle()
27 | }
28 | }
29 |
30 | struct OutlinedButtonStyle: ButtonStyle {
31 | @Environment(\.isEnabled) private var isEnabled
32 |
33 | @Environment(\.ikButtonLoading) private var isLoading
34 |
35 | private var foreground: Color {
36 | if isEnabled {
37 | return .Custom.textPrimary
38 | } else {
39 | return .Custom.textSecondary
40 | }
41 | }
42 |
43 | func makeBody(configuration: Configuration) -> some View {
44 | configuration.label
45 | .labelStyle(.ikLabel)
46 | .foregroundStyle(foreground)
47 | .modifier(IKButtonLoadingModifier(isFilled: false))
48 | .modifier(IKButtonControlSizeModifier())
49 | .padding(.horizontal, value: .medium)
50 | .padding(.horizontal, value: .small)
51 | .frame(minHeight: IKButtonHeight.large)
52 | .modifier(IKButtonExpandableModifier())
53 | .contentShape(Rectangle())
54 | .modifier(IKButtonOpacityAnimationModifier(isPressed: configuration.isPressed))
55 | .allowsHitTesting(!isLoading)
56 | .background(
57 | RoundedRectangle(cornerRadius: IKRadius.large)
58 | .stroke(Color.Custom.divider, lineWidth: 0.5)
59 | )
60 | }
61 | }
62 |
63 | #Preview {
64 | VStack {
65 | Button("Hello, World!") {}
66 |
67 | Button("Hello, World!") {}
68 | .ikButtonFullWidth(true)
69 | }
70 | .buttonStyle(.outlined)
71 | }
72 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Sources/Core/Models/PreviewHelper.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import Foundation
20 | import InfomaniakCore
21 | import InfomaniakDI
22 |
23 | struct PreviewTargetAssembly {
24 | init() {
25 | SimpleResolver.sharedResolver.store(factory: Factory(type: PlatformDetectable.self) { _, _ in
26 | PlatformDetector()
27 | })
28 | SimpleResolver.sharedResolver.store(factory: Factory(type: InAppTwoFactorAuthenticationManagerable.self) { _, _ in
29 | InAppTwoFactorAuthenticationManager()
30 | })
31 | }
32 | }
33 |
34 | extension RemoteChallenge {
35 | static let preview = RemoteChallenge(
36 | uuid: "aa",
37 | type: .approval,
38 | device: Device(name: "iPhone 17", type: .phone),
39 | location: "Switzerland",
40 | createdAt: Date(timeIntervalSinceNow: -2 * 60),
41 | expiresAt: Date(timeIntervalSinceNow: 10 * 60)
42 | )
43 | }
44 |
45 | struct PreviewUser: InfomaniakUser {
46 | var id: Int
47 | var email: String
48 | var displayName: String
49 | var avatar: String?
50 |
51 | static let preview = PreviewUser(
52 | id: 1,
53 | email: "CraigFederighi@ik.me",
54 | displayName: "Craig Federighi",
55 | avatar: "https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fphotos5.appleinsider.com%2Farchive%2F12.08.27-Federighi.png&f=1&nofb=1&ipt=2283edd37fadae2e14e2f083e6f98b91a42d828845c5babd601bd8082fd9a9f4"
56 | )
57 | static let previewNoAvatar = PreviewUser(id: 2, email: "tcook@apple.com", displayName: "Tim Cook", avatar: nil)
58 | }
59 |
60 | extension InAppTwoFactorAuthenticationSession {
61 | static let preview = InAppTwoFactorAuthenticationSession(
62 | user: PreviewUser.preview,
63 | apiFetcher: MockInAppTwoFactorAuthenticationFetcher()
64 | )
65 | }
66 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Localizable/fr.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | * Loco ios export: Xcode Strings (legacy)
3 | * Project: CoreUI
4 | * Locale: fr, French
5 | * Tagged: ios, !common, !emoji-reaction, !interapplogin, !ios-stringsdict, !kSuite, !kSuiteUtils, !my kSuite, !privacy
6 | * Exported by: Philippe Weidmann
7 | * Exported at: Thu, 09 Oct 2025 08:30:37 +0200
8 | */
9 |
10 | /* loco:68d52770d78cd0b5b102a952 */
11 | " twoFactorAuthJustNowLabel" = "À l’instant";
12 |
13 | /* loco:68d4f859fceae6b843046de7 */
14 | "buttonApprove" = "Approuver";
15 |
16 | /* loco:68d4f873098af73894089853 */
17 | "buttonDeny" = "Refuser";
18 |
19 | /* loco:68d4f8d82bc1b93265068752 */
20 | "buttonEditPassword" = "Modifier le mot de passe";
21 |
22 | /* loco:68da784d25d05d451b04f663 */
23 | "twoFactorAuthAlreadyProcessedErrorTitle" = "Cette demande a déjà été traitée";
24 |
25 | /* loco:68da78cbe3aba64d960ff0c2 */
26 | "twoFactorAuthCheckOriginDescription" = "Vous n’êtes pas à l’origine de cette action ?\nVérifiez vos appareils actifs et déconnectez ceux que vous ne reconnaissez pas.";
27 |
28 | /* loco:68c04f14ec33731be0018cb8 */
29 | "twoFactorAuthConfirmationDescription" = "Confirmer cette connexion autorisera cet appareil à accéder à votre compte Infomaniak";
30 |
31 | /* loco:68d5248990faa534e505f204 */
32 | "twoFactorAuthConnectionRejectedDescription" = "Vous avez refusé une tentative de connexion. Pour sécuriser votre compte, changez votre mot de passe.\nSi vous êtes à l’origine de cette tentative, réessayez de vous connecter.";
33 |
34 | /* loco:68d5247e90faa534e505f202 */
35 | "twoFactorAuthConnectionRejectedTitle" = "Connexion Refusée";
36 |
37 | /* loco:68c04d95fa5d09365f02c055 */
38 | "twoFactorAuthDeviceLabel" = "Appareil";
39 |
40 | /* loco:68da77e9a0c5c4a1d809d4c4 */
41 | "twoFactorAuthExpiredErrorTitle" = "Cette demande de connexion a expiré";
42 |
43 | /* loco:68de2abbe02b752bd80f2782 */
44 | "twoFactorAuthGenericErrorDescription" = "Impossible de terminer l’opération.\nRelancez la demande.";
45 |
46 | /* loco:68c04e0aec33731be0018cb4 */
47 | "twoFactorAuthLocationLabel" = "Lieu";
48 |
49 | /* loco:68de26e7e0ead3ef030b71f2 */
50 | "twoFactorAuthNoNetworkErrorDescription" = "Impossible de terminer l’opération.\nVérifiez votre connexion et réessayez.";
51 |
52 | /* loco:68de2516c411b0f8b20a4832 */
53 | "twoFactorAuthNoNetworkErrorTitle" = "Pas de connexion internet";
54 |
55 | /* loco:68c053c71ea34fd57a062325 */
56 | "twoFactorAuthTryingToLogInTitle" = "Êtes-vous en train d’essayer de vous connecter ?";
57 |
58 | /* loco:68c04d446368e16b82076535 */
59 | "twoFactorAuthWhenLabel" = "Quand";
60 |
--------------------------------------------------------------------------------
/Sources/KSuite/Resources/Assets.xcassets/kchat.imageset/kchat.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Localizable/de.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | * Loco ios export: Xcode Strings (legacy)
3 | * Project: CoreUI
4 | * Locale: de, German
5 | * Tagged: ios, !common, !emoji-reaction, !interapplogin, !ios-stringsdict, !kSuite, !kSuiteUtils, !my kSuite, !privacy
6 | * Exported by: Philippe Weidmann
7 | * Exported at: Thu, 09 Oct 2025 08:30:37 +0200
8 | */
9 |
10 | /* loco:68d52770d78cd0b5b102a952 */
11 | " twoFactorAuthJustNowLabel" = "Jetzt";
12 |
13 | /* loco:68d4f859fceae6b843046de7 */
14 | "buttonApprove" = "Genehmigen Sie";
15 |
16 | /* loco:68d4f873098af73894089853 */
17 | "buttonDeny" = "Verweigern";
18 |
19 | /* loco:68d4f8d82bc1b93265068752 */
20 | "buttonEditPassword" = "Passwort ändern";
21 |
22 | /* loco:68da784d25d05d451b04f663 */
23 | "twoFactorAuthAlreadyProcessedErrorTitle" = "Diese Anfrage wurde bereits bearbeitet";
24 |
25 | /* loco:68da78cbe3aba64d960ff0c2 */
26 | "twoFactorAuthCheckOriginDescription" = "Sie haben diese Validierung nicht veranlasst?\nÜberprüfen Sie Ihre aktiven Geräte, und trennen Sie die, die Sie nicht erkennen.";
27 |
28 | /* loco:68c04f14ec33731be0018cb8 */
29 | "twoFactorAuthConfirmationDescription" = "Durch die Bestätigung dieser Verbindung wird diesem Gerät der Zugriff auf Ihr Infomaniak-Konto gestattet.";
30 |
31 | /* loco:68d5248990faa534e505f204 */
32 | "twoFactorAuthConnectionRejectedDescription" = "Sie haben einen Anmeldeversuch abgelehnt. Um Ihr Konto zu sichern, ändern Sie Ihr Passwort.\nWenn Sie diesen Versuch veranlasst haben, versuchen Sie es erneut, sich anzumelden.";
33 |
34 | /* loco:68d5247e90faa534e505f202 */
35 | "twoFactorAuthConnectionRejectedTitle" = "Verbindung Abgelehnt";
36 |
37 | /* loco:68c04d95fa5d09365f02c055 */
38 | "twoFactorAuthDeviceLabel" = "Gerät";
39 |
40 | /* loco:68da77e9a0c5c4a1d809d4c4 */
41 | "twoFactorAuthExpiredErrorTitle" = "Diese Verbindungsanfrage ist abgelaufen";
42 |
43 | /* loco:68de2abbe02b752bd80f2782 */
44 | "twoFactorAuthGenericErrorDescription" = "Der Vorgang konnte nicht abgeschlossen werden.\nBitte versuchen Sie es erneut.";
45 |
46 | /* loco:68c04e0aec33731be0018cb4 */
47 | "twoFactorAuthLocationLabel" = "Ort";
48 |
49 | /* loco:68de26e7e0ead3ef030b71f2 */
50 | "twoFactorAuthNoNetworkErrorDescription" = "Der Vorgang kann nicht abgeschlossen werden.\nÜberprüfen Sie Ihre Verbindung und versuchen Sie es erneut.";
51 |
52 | /* loco:68de2516c411b0f8b20a4832 */
53 | "twoFactorAuthNoNetworkErrorTitle" = "Kein Netz";
54 |
55 | /* loco:68c053c71ea34fd57a062325 */
56 | "twoFactorAuthTryingToLogInTitle" = "Versuchen Sie, sich anzumelden?";
57 |
58 | /* loco:68c04d446368e16b82076535 */
59 | "twoFactorAuthWhenLabel" = "Wenn";
60 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/stop-hand-slash.imageset/stop-hand-slash.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/Sources/MyKSuite/Sources/Dashboard/FreeTrialView.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import DesignSystem
20 | import InfomaniakCoreSwiftUI
21 | import KSuiteUtils
22 | import SwiftUI
23 |
24 | struct FreeTrialView: View {
25 | private let skyBackground = Color(
26 | light: KSuiteUtilsResources.sky.color,
27 | dark: KSuiteUtilsResources.bat.color
28 | )
29 | private let chipColor = Color(light: .white, dark: KSuiteUtilsResources.orca.color)
30 |
31 | var body: some View {
32 | VStack(alignment: .leading, spacing: IKPadding.medium) {
33 | HStack {
34 | MyKSuiteResources.myKSuitePlusLogo.swiftUIImage
35 | .resizable()
36 | .scaledToFit()
37 | .frame(maxWidth: 90)
38 |
39 | Spacer()
40 |
41 | Text(MyKSuiteLocalizable.myKSuiteDashboardFreeTrialTitle)
42 | .font(FontHelper.labelMedium)
43 | .foregroundStyle(ColorHelper.primary)
44 | .padding(.vertical, 2)
45 | .padding(.horizontal, value: .mini)
46 | .background(chipColor, in: .capsule)
47 | }
48 | Text(MyKSuiteLocalizable.myKSuiteDashboardFreeTrialDescription)
49 | .font(FontHelper.bodySmall)
50 | .foregroundStyle(ColorHelper.primary)
51 |
52 | Button {
53 | // Start trial
54 | } label: {
55 | Text(MyKSuiteLocalizable.myKSuiteDashboardFreeTrialButton)
56 | }
57 | .controlSize(.large)
58 | .ikButtonFullWidth(true)
59 | .buttonStyle(.ikBorderedProminent)
60 | }
61 | .padding(value: .medium)
62 | .background {
63 | RoundedRectangle(cornerRadius: IKRadius.large)
64 | .strokeBorder(ColorHelper.gradient, lineWidth: 1)
65 | }
66 | .background(skyBackground, in: .rect(cornerRadius: IKRadius.large))
67 | .cardStyle(withStroke: false)
68 | }
69 | }
70 |
71 | #Preview {
72 | FreeTrialView()
73 | }
74 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Sources/UI/ConnectionConfirmationView/MainContentView/UserRowView.swift:
--------------------------------------------------------------------------------
1 | /*
2 | Infomaniak Features - iOS
3 | Copyright (C) 2025 Infomaniak Network SA
4 |
5 | This program is free software: you can redistribute it and/or modify
6 | it under the terms of the GNU General Public License as published by
7 | the Free Software Foundation, either version 3 of the License, or
8 | (at your option) any later version.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program. If not, see .
17 | */
18 |
19 | import DesignSystem
20 | import InfomaniakCore
21 | import InfomaniakCoreSwiftUI
22 | import NukeUI
23 | import SwiftUI
24 |
25 | struct UserRowView: View {
26 | let user: InfomaniakUser
27 | let avatarSize: CGFloat = 40
28 |
29 | var body: some View {
30 | HStack(spacing: IKPadding.mini) {
31 | Group {
32 | if let rawAvatarURL = user.avatar,
33 | let avatarURL = URL(string: rawAvatarURL) {
34 | LazyImage(request: ImageRequest(url: avatarURL)) { state in
35 | if let image = state.image {
36 | AvatarImage(image: image, size: avatarSize)
37 | } else {
38 | initialsView
39 | }
40 | }
41 | } else {
42 | initialsView
43 | }
44 | }
45 | .clipShape(Circle())
46 | .background(
47 | Circle()
48 | .stroke(Color.gray)
49 | )
50 |
51 | VStack(alignment: .leading) {
52 | Text(user.displayName)
53 | .font(.Custom.headline)
54 | .foregroundStyle(Color.Custom.textPrimary)
55 | Text(user.email)
56 | .font(.Custom.body)
57 | .foregroundStyle(Color.Custom.textSecondary)
58 | }
59 | }
60 | }
61 |
62 | private var initialsView: some View {
63 | InitialsView(
64 | initials: NameFormatter(fullName: user.displayName).initials,
65 | backgroundColor: Color.backgroundColor(from: user.email.hash),
66 | foregroundColor: Color.white,
67 | size: avatarSize
68 | )
69 | }
70 | }
71 |
72 | #Preview {
73 | VStack(alignment: .leading) {
74 | UserRowView(user: PreviewUser.preview)
75 | UserRowView(user: PreviewUser.previewNoAvatar)
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/clock.imageset/clock.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
--------------------------------------------------------------------------------