This commit is contained in:
Achintha Isuru
2026-01-25 20:25:38 -05:00
parent 079fe97673
commit bd097b2d09
411 changed files with 0 additions and 60490 deletions

View File

@@ -1,75 +0,0 @@
You are continuing work on an existing **Flutter monorepobased mobile system** with multiple applications and a shared data/connect layer.
This prompt **replaces all missing prior thread context** and must be treated as the **single source of truth** for how you reason, plan, and execute work in this thread.
## 🧭 PROJECT OVERVIEW
* The project contains **multiple Flutter applications** (e.g. Staff app, Client app) that are being **rebuilt from scratch** using **Flutter Clean Architecture**, while **reusing UI code and flows** from POCs (prototypes).
* The goal is to rebuild the mobile apps in a **production-grade, scalable, agent-first manner**, not as POCs.
## 🧠 YOUR ROLE IN THIS THREAD
You are acting as a **Senior Flutter Architect + Execution Agent**, responsible for:
* Enforcing architectural consistency across features
* Preventing scope creep, tight coupling, and shortcut implementations
* Producing outputs that are suitable for **real engineering teams**, not demos
You **do not** invent architecture, flows, or patterns unless explicitly asked.
You **do** challenge requirements if they violate architecture or agent rules.
## 📚 MANDATORY DOCUMENTS (NON-NEGOTIABLE)
You MUST strictly follow the rules and constraints defined in **both documents below** at all times:
### 1⃣ Architecture Principles
**apps/mobile/docs/01-architecture-principles.md**
This document defines:
* Clean Architecture boundaries
* Layer responsibilities (presentation / domain / data)
* Dependency rules
* Navigation, state management, and feature isolation expectations
and others.
### 2⃣ Agent Development Rules
**apps/mobile/docs/02-agent-development-rules.md**
This document defines:
* How features are planned, split, and executed
* What an agent may or may not do
* Output formats, assumptions, and guardrails
* How prompts must be structured for future reuse
and others.
### 3⃣ Design system guidelines
**apps/mobile/docs/03-design-system-usage.md**
This document defines:
* The design system of the project and the rules on how to use the design system.
⚠️ If a request conflicts with either document, you must:
* Call out the conflict explicitly
* Propose a compliant alternative
* Never silently violate the rules
## 🔁 CURRENT STATE
* Prior thread context is **not available**
* Architecture and agent rules **do exist** and must be referenced
* Any assumptions you make must be stated clearly
## ✅ ACKNOWLEDGEMENT REQUIRED
Before proceeding with any feature work, you must:
1. Acknowledge that this context has been loaded
2. Confirm adherence to:
* `apps/mobile/docs/01-architecture-principles.md`
* `apps/mobile/docs/02-agent-development-rules.md`
* `apps/mobile/docs/03-design-system-usage.md`
3. Wait for the next instruction or feature prompt

View File

@@ -1,34 +0,0 @@
You are an expert Flutter architect and monorepo engineer.
You are working on the KROW workforce management platform.
Your responsibility is to rebuild two Flutter mobile applications (Client + Staff)
using a clean, agent-first architecture.
You must strictly follow:
- Clean Architecture
- Feature-first packaging
- Melos monorepo conventions
- Bloc for state management
- Flutter Modular for
- Modularized routes.
- Modularized Dependency Injection.
- Firebase Data Connect as the ONLY backend access layer
- No UI polish unless explicitly requested
IMPORTANT CONSTRAINTS:
- Firebase Data Connect code DOES NOT EXIST YET
- You must mock Data Connect responses using interfaces and fake implementations
- Domain entities MUST match the provided KROW domain model exactly
- No DTOs or entities inside feature packages
- Features must be independently testable
- Do not invent new entities, statuses, or workflows
You must never:
- Access Firebase directly
- Hardcode backend logic inside UI
- Mix domain logic with presentation
- Change entity definitions unless explicitly instructed
If ambiguity exists, document it instead of guessing.
Confirm understanding silently and wait for step instructions.

View File

@@ -1,54 +0,0 @@
TASK: Create the KROW Flutter monorepo skeleton using Melos.
You must:
1. Create the directory structure exactly as defined below (some of the parts are already developed)
2. Initialize Melos (some of the parts are already developed)
3. Create minimal pubspec.yaml files where required (some of the parts are already developed)
4. Do NOT add application logic
5. Do NOT generate Flutter apps yet (basic strcuture of the apps/ are developed)
Target structure:
root/
├── apps/
│ ├── client/
│ ├── staff/
│ └── design_system_viewer/
├── packages/
│ ├── core/
│ ├── design_system/
│ ├── domain/
│ ├── data_connect/
│ └── features/
│ ├─ domain/
│ │ ├─ repositories/
│ │ └─ usecases/
│ │
│ ├─ data/
│ │ ├─ datasources/
│ │ └─ repositories_impl/
│ │
│ ├─ presentation/
│ │ ├─ state/
│ │ ├─ pages/
│ │ └─ widgets/
│ │
│ └─ feature_manifest.md
├── docs/
└── dataconnect/
Rules:
- Use Flutter 3.x compatible setup
- All packages must be melos-aware
- Keep pubspec files minimal
- No dependencies unless required for structure
- No example widgets or boilerplate UI
Output:
- melos.yaml
- Folder tree
- Minimal pubspec.yaml per package/app
- Short explanation of dependency boundaries
Do NOT proceed beyond skeleton creation.

View File

@@ -1,19 +0,0 @@
TASK: Create docs/02-agent-development-rules.md
This document defines NON-NEGOTIABLE rules for AI agents.
Must include:
- File creation rules
- Naming conventions
- Where logic is allowed / forbidden
- How to mock Data Connect safely
- How to introduce new features
- How to reuse prototype code without copying architecture mistakes
- Rules for handling ambiguity (must document, not assume)
Format:
- Clear numbered rules
- Short explanations
- Explicit "DO / DO NOT" sections
This document will be enforced strictly.

View File

@@ -1,251 +0,0 @@
TASK: Create the shared domain package.
Domain Details:
## 1. Core Domain Logic
### 1.1 Domain Entities Overview
The KROW platform has **49 domain entities** organized into 8 logical groups:
```
┌────────────────────────────────────────────────────────────────────┐
│ KROW DOMAIN MODEL │
├────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ USERS & │ │ BUSINESS & │ │ EVENTS & │ │
│ │ MEMBERSHIP │ │ ORGANIZATION│ │ SHIFTS │ │
│ ├─────────────┤ ├─────────────┤ ├─────────────┤ │
│ │ User │ │ Business │ │ Event │ │
│ │ Staff │ │ BusinessSet │ │ EventShift │ │
│ │ Membership │ │ Hub │ │ Position │ │
│ │ BizMember │ │ HubDept │ │ Assignment │ │
│ │ HubMember │ │ BizContract │ │ WorkSession │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ SKILLS & │ │ FINANCIAL │ │ RATINGS & │ │
│ │ CERTS │ │ PAYROLL │ │ PENALTIES │ │
│ ├─────────────┤ ├─────────────┤ ├─────────────┤ │
│ │ Skill │ │ Invoice │ │ StaffRating │ │
│ │ SkillCat │ │ InvoiceItem │ │ PenaltyLog │ │
│ │ StaffSkill │ │ InvDecline │ │ BizStaffPref│ │
│ │ Certificate │ │ StaffPayment│ │ │ │
│ │ SkillKit │ │ │ │ │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ STAFF │ │ SUPPORT │ │
│ │ PROFILE │ │ CONFIG │ │
│ ├─────────────┤ ├─────────────┤ │
│ │ EmergencyC │ │ Addon │ │
│ │ BankAccount │ │ Tag │ │
│ │ Accessibl │ │ Media │ │
│ │ Schedule │ │ WorkingArea │ │
│ └─────────────┘ └─────────────┘ │
│ │
└────────────────────────────────────────────────────────────────────┘
```
### 1.2 Key Entity Definitions
#### User & Authentication
| Entity | Description | Key Fields |
|--------|-------------|------------|
| **User** | Base auth entity (Firebase) | `id`, `email`, `phone`, `role` |
| **Staff** | Worker profile | `auth_provider_id`, `name`, `email`, `phone`, `status`, `address`, `avatar`, `live_photo` |
| **Membership** | Polymorphic org membership | `user_id`, `memberable_id`, `memberable_type`, `role` |
**Staff Status Flow:**
```
registered → pending → completed_profile → verified → [active | blocked | inactive]
```
#### Business & Organization
| Entity | Description | Key Fields |
|--------|-------------|------------|
| **Business** | Client company | `name`, `registration`, `status`, `avatar` |
| **BusinessSetting** | Payroll config | `prefix`, `overtime`, `clock_in`, `clock_out` |
| **Hub** | Branch location | `business_id`, `name`, `address`, `status` |
| **HubDepartment** | Dept within hub | `hub_id`, `name` |
#### Events & Shifts
| Entity | Description | Key Fields |
|--------|-------------|------------|
| **Event** | Job posting | `business_id`, `hub_id`, `name`, `date`, `status`, `contract_type` |
| **EventShift** | Work session | `event_id`, `name`, `address` |
| **EventShiftPosition** | Job opening | `shift_id`, `skill_id`, `count`, `rate`, `start_time`, `end_time`, `break` |
| **EventShiftPositionStaff** | Assignment | `staff_id`, `position_id`, `status`, `clock_in`, `clock_out` |
**Event Status Flow:**
```
draft → pending → assigned → confirmed → active → finished → completed → closed
↘ under_review
```
**Assignment Status Flow:**
```
assigned → confirmed → ongoing → completed
↘ decline_by_staff → [penalty logged]
↘ canceled_by_staff → [penalty logged]
↘ no_showed → [penalty logged]
```
#### Skills & Certifications
| Entity | Description | Key Fields |
|--------|-------------|------------|
| **Skill** | Job category | `category_id`, `name`, `price` |
| **StaffSkill** | Worker qualification | `staff_id`, `skill_id`, `level`, `experience`, `status` |
| **Certificate** | Required credential | `name`, `required` |
| **SkillKit** | Uniform/equipment req | `skill_id`, `name`, `is_required`, `type` |
**Skill Levels:** `beginner` | `skilled` | `professional`
#### Financial & Payroll
| Entity | Description | Key Fields |
|--------|-------------|------------|
| **Invoice** | Business bill | `event_id`, `business_id`, `status`, `total`, `work_amount`, `addons_amount` |
| **InvoiceItem** | Line item | `invoice_id`, `staff_id`, `work_hours`, `rate`, `amounts` |
| **StaffPayment** | Worker payout | `staff_id`, `assignment_id`, `amount`, `status`, `paid_at` |
**Invoice Status Flow:**
```
open → disputed → resolved → verified → paid/reconciled
↘ overdue
```
### 1.3 Core Business Workflows
#### Workflow 1: Event Lifecycle
```mermaid
sequenceDiagram
participant Client as Client App
participant API as Backend API
participant Admin as Admin
participant Staff as Worker App
Note over Client,API: 1. Event Creation
Client->>API: Create Event with Shifts & Positions
API-->>Client: Event Created (Draft)
Client->>API: Publish Event
API-->>Client: Event Published
opt 2. Staff Assignment (Optional)
Note over Admin,API: Optional Staff Assignment
Admin->>API: Assign Staff to Shift
API-->>Admin: Assignment Confirmed
API->>Staff: Notification: New Shift
end
Note over Staff,API: 3. Shift Acceptance
Staff->>API: Accept Shift
API-->>Staff: Shift Confirmed
Note over Client,Staff: 4. Day of Event
Client->>Client: Generate QR Code
Staff->>Staff: Scan QR Code
Staff->>API: Clock In
Staff->>API: Clock Out
Note over Client,API: 5. Post-Event
Client->>API: Rate Staff
API->>API: Generate Invoice
Client->>API: Approve Invoice
```
#### Workflow 2: Staff Onboarding
```
1. Registration (Firebase Phone Auth)
├── Create Staff record (status: registered)
└── Profile created with auth_provider_id
2. Profile Completion
├── Personal info (name, email, address)
├── Avatar upload
├── Emergency contacts
└── Bank account details
3. Skills Declaration
├── Add skills with level/experience
└── Status: pending → verified (admin)
4. Certification Upload
├── Upload certificates
└── Status: pending → verified (admin)
5. Equipment Confirmation
├── Confirm uniforms per skill
├── Confirm equipment per skill
└── Upload photos as proof
6. Profile Submission
├── Complete verification checklist
└── Status: completed_profile → verified
```
#### Workflow 3: Payroll Calculation
```
Work Hours = (clock_out - clock_in) - break_duration
Overtime Rules:
├── Regular Hours (1x): hours <= 8
├── Overtime Hours (1.5x): 8 < hours <= 10
└── Doubletime Hours (2x): hours > 10
Payment = (regular_hours × rate × 1.0)
+ (overtime_hours × rate × 1.5)
+ (doubletime_hours × rate × 2.0)
+ addons_amount
```
You must:
1. Create domain entities for ALL KROW entities provided
2. Group entities by logical folders
3. Use immutable models
4. Do NOT add JSON, serialization, or Firebase annotations
5. Do NOT add business logic
6. Use enums for all status flows
7. Add Doc comments for readability of the code.
Entities MUST match:
- Names
- Fields
- Status flows
Include:
- Enums for status flows
- Value objects where appropriate
- Clear folder structure
Exclude:
- DTOs
- Repositories
- Firebase logic
- Validation logic
Create packages/domain/lib/domain.dart (barrel file)
This file must export ALL entities and enums.
All other packages will import ONLY:
import 'package:domain/domain.dart';
Must follow archtiecture principles defined in:
- docs/01-architecture-principles.md
Must Follow Agent rules defined in:
- docs/02-agent-development-rules.md
Output:
- Folder structure
- Dart files
- Short explanation of grouping strategy

View File

@@ -1,26 +0,0 @@
TASK: Create the data_connect package as a mockable abstraction layer.
You must:
1. Define abstract repositories for each domain group
2. Create fake/mock implementations using in-memory data
3. Simulate async GraphQL-style behavior
4. Ensure replaceability with real generated SDK later
Rules:
- No Firebase imports
- No HTTP
- No direct entity mutation
- Return domain entities ONLY
Must follow archtiecture principles defined in:
- docs/01-architecture-principles.md
Must Follow Agent rules defined in:
- docs/02-agent-development-rules.md
Include:
- Interfaces
- Fake implementations
- Clear TODO markers for real SDK replacement
This package must compile and be dependency-safe.

View File

@@ -1,23 +0,0 @@
Task is to reafactor an existing Flutter page so that it fully complies with the design system defined in:
- apps/mobile/docs/03-design-system-usage.md
## 📍 TARGET PAGE
File to refactor the widgets in:
- apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms
/lib/src/presentation/pages
- apps/mobile/packages/features/staff/profile_sections/compliance/tax_forms
/lib/src/presentation/widgets
Example page to get inspiration as this page is fully complies with the design system guide mentioned above:
apps/mobile/packages/features/staff/authentication/lib/src/presentation/pages/profile_setup_page.dart
## 🎯 GOAL
Transform the existing page implementation so that it complies with the design guideline provieded.
## 🔒 STRICT RULES (NON-NEGOTIABLE)
While following the rules outlined in the document above you should also DO NOT remove or change existing functionality of the page, add doc comments and use named parameters in functions.
Proceed with the refactor now.

View File

@@ -1,85 +0,0 @@
# FEATURE EXECUTION WORKFLOW — Modular Feature Development
## APPLICATION TARGET
`apps/mobile/apps/staff`
## EXECUTION PLAN (MANDATORY 3-STEP PROCESS)
### Step 1: Prototype Implementation
- **Goal**: First move the entire UI(pages and widgets) and logic from the prototype into the new feature package without changes. The page in the new package should be an one-one of the POC page.
- **Action**: Create the package in the folder structure under `apps/mobile/packages/features/[domain]/[feature_name]`.
- **References**: Use the specified prototypes as the primary source of truth for UI/UX, logic and business logic.
- **MANDATORY**: The **Layout** and **Wireframing** from the prototype should stay **EXACTLY** as they are. Do not re-design the UX or move elements around.
- **Note**: Pages should end with `_page.dart` instead of `_screen.dart`.
### Step 2: Architecture & Clean Code Refactor
- **Goal**: Align the prototype code with the project's long-term standards.
- **Rules**:
- Follow `apps/mobile/docs/01-architecture-principles.md` (BLoC, Domain-Driven, Repository pattern).
- Move the logic into blocs, domain and data. Use only the `apps/mobile/packages/data_connect/lib/src/mocks` to retrive / add data. This should happen via the data layer (presentation (ui -> bloc) -> domain -> data).
- Apply Clean Code: Meaningful names, one responsibility per class, small methods. Add doc comments to the files, functions for better readability.
- No magic strings inside business logic.
### Step 3: Localization & Navigation Finalization
- **Goal**: Centralize resources and decouple routing.
- **Mandatory Requirements**:
1. **Centralized Localization**:
- Extract ALL strings to `apps/mobile/packages/core_localization/lib/src/l10n/en.i18n.json` (and `es`).
- Use a unique namespace for the feature (e.g., `t.feature_name.sub_section.key`).
- Remove `slang` dependencies from the feature; re-export `core_localization` instead.
2. **Typed Navigation**:
- Create `lib/src/presentation/navigation/[feature_name]_navigator.dart`.
- Implement an extension on `IModularNavigator` for all feature-specific routes.
- Replace all `Modular.to.pushNamed('/path')` with typed methods like `Modular.to.pushFeaturePage()`.
### Step 4: Design Matching & Design System Alignment
- **Goal**: Ensure the visual identity matches the Design System perfectly while maintaining the prototype's layout.
- **Action**: Follow `apps/mobile/docs/03-design-system-usage.md` (Section 10: POC → Themed workflow).
- **Mandatory Requirements**:
- **Colors**: Replace all hex codes or raw colors with `UiColors`.
- **Typography**: Replace all manual `TextStyle` with `UiTypography`.
- **Spacing/Radius**: Replace all magic numbers with `UiConstants`.
- **Icons**: Use `UiIcons` exclusively.
- **Policy**: Maintain the prototype's layout structure while upgrading the "atoms" and "molecules" to the Design System tokens.
---
# FEATURE SCOPE — Staff shifts Screen
This feature implements the **staff shifts screen** for the **Mobile Staff application**.
---
## PROTOTYPE REFERENCES (SOURCE OF TRUTH)
* `apps/mobile/prototypes/staff_mobile_application/lib/screens/worker/payments_screen.dart`
## WHERE THE FEATURE SHOULD RESIDE
This feature should reside in the feature `apps/mobile/packages/features/staff/payments`.
## ARCHITECTURE CONSTRAINTS (NON-NEGOTIABLE)
You MUST strictly follow:
1. `apps/mobile/docs/01-architecture-principles.md`
2. `apps/mobile/docs/02-agent-development-rules.md`
3. `apps/mobile/docs/03-design-system-usage.md`
4. `MEMORY[user_global]` (Clean Code & architectural decisions)
Violations must be **explicitly reported**, never silently ignored.
---
## REFERENCE IMPLEMENTATION
Use:
```
apps/mobile/packages/features/staff/authentication
```
as the **gold standard** for:
* Feature structure
* Navigation pattern
* Localization strategy
* Design system integration

View File

@@ -1,6 +0,0 @@
for the "apps/mobile/packages/features/staff/payments" feature
- Follow apps/mobile/docs/01-architecture-principles.md (BLoC, Domain-Driven, Repository pattern).
- Move the logic into blocs, domain and data. Use only the apps/mobile/packages/data_connect/lib/src/mocks to retrive / add data. This should happen via the data layer (presentation (ui -> bloc) -> domain -> data).
- Apply Clean Code: Meaningful names, one responsibility per class, small methods. Add doc comments to the files, functions for better readability.
No magic strings inside business logic.

View File

@@ -1,66 +0,0 @@
Task is to refactor an existing Flutter package so that it fully complies with the architecture rules defined in:
* `apps/mobile/docs/01-architecture-principles.md`
## TARGET PAGE
Package to refactor:
```
apps/mobile/packages/features/staff/shifts
```
Reference feature that already follows the architecture correctly (this is the GOLD STANDARD):
```
apps/mobile/packages/features/staff/authentication
```
## GOAL
Refactor the feature so that it strictly follows **KROW Clean Architecture principles**, while preserving **all existing behavior and UI output**.
The result must be structurally correct, testable, and aligned with feature-level responsibilities.
## STRICT RULES (NON-NEGOTIABLE)
You MUST follow **all** rules defined in:
* `apps/mobile/docs/01-architecture-principles.md`
Additionally, enforce the following:
### Architecture Rules
* The pages **MUST remain inside the feature package**
* The pages **MUST NOT import other features**
* Business logic **MUST NOT exist inside the page**
* State handling **MUST be moved to a Bloc/Cubit or external widget**
* Use cases **MUST live in `domain/`**
* Repository access **MUST go through abstractions**
### Presentation Rules
* Use `StatelessWidget` for pages
* If state is required:
* Move it to a Bloc/Cubit, OR
* Extract it into a separate widget file
* Use named parameters
* Add clear doc comments where structure or intent is non-obvious
### Safety Rules
* ❌ Do NOT remove existing functionality
* ❌ Do NOT change user-facing behavior
* ❌ Do NOT introduce new dependencies
* ❌ Do NOT break modular boundaries
## EXPECTED OUTPUT
* A refactored page that:
* Fully complies with `apps/mobile/docs/01-architecture-principles.md`
* Has clean separation of concerns
* Is easy to reason about and extend
* Any required supporting files (Bloc, use case, widget extraction) created **inside the same feature**
Proceed with the refactor now.

View File

@@ -1,88 +0,0 @@
Task is to refactor the **domain and data layers** of an existing feature so that they fully comply with the architecture rules defined in:
* `apps/mobile/docs/01-architecture-principles.md`
## 📍 TARGET FEATURE
Feature to refactor:
```
apps/mobile/packages/features/staff/payments
```
Files exist in:
```
lib/src/domain/
lib/src/data/
```
## 🏆 GOLD STANDARD REFERENCE
Use the following feature as the **gold standard implementation** for structure, responsibility split, and dependency direction:
```
apps/mobile/packages/features/staff/authentication
```
Follow its patterns for:
* Repository interfaces
* Use case design
* Data layer delegation
* Interaction with `apps/mobile/packages/data_connect`
## 🎯 GOAL
Refactor the feature so that its **Domain** and **Data** layers strictly follow **KROW Clean Architecture** as defined in `apps/mobile/docs/01-architecture-principles.md`.
The feature must rely on **shared Domain entities** and must delegate all data access through `apps/mobile/packages/data_connect`.
## STRICT RULES (NON-NEGOTIABLE)
You MUST follow **all rules defined in**:
* `apps/mobile/docs/01-architecture-principles.md`
In particular, ensure that:
* Domain uses **only entities from**:
```
apps/mobile/packages/domain/lib/src/entities
```
* Feature-level domain models are removed
* Repository interfaces live in the Domain layer
* Repository implementations live in the Data layer
* Domain does NOT return concrete data objects
* Usecases in the domain layer must be extended from the `apps/mobile/packages/core/lib/src/domain/usecases/usecase.dart`.
* If there are arguments in the usecases, they must be extended from the `apps/mobile/packages/core/lib/src/domain/arguments/usecase_argument.dart`. Example usecase is given below
- `apps/mobile/packages/features/staff/authentication/lib/src/domain/usecases/verify_otp_usecase.dart`
* Data layer does NOT contain business logic and not create objects only call the `apps/mobile/packages/data_connect`.
* All data access flows through `apps/mobile/packages/data_connect`
## DOCUMENTATION
* Add clear **doc comments** to all files you modify
* Document:
* Purpose of the file
* Role of the class or interface in the architecture
## SAFETY GUARANTEES
* Do NOT change existing behavior
* Do NOT break presentation layer contracts
* Do NOT bypass `apps/mobile/packages/data_connect`
## EXPECTED OUTPUT
* Domain layer aligned with `apps/mobile/docs/01-architecture-principles.md`
* Data layer aligned with `apps/mobile/docs/01-architecture-principles.md`
* Structure and patterns consistent with:
```
apps/mobile/packages/features/staff/authentication
```
* Clean, documented, and compliant implementation
Proceed with the refactor now.

View File

@@ -1,135 +0,0 @@
# KROW Architecture Principles
This document is the **AUTHORITATIVE** source of truth for the KROW engineering architecture.
All agents and engineers must adhere strictly to these principles. Deviations are interpreted as errors.
## 1. High-Level Architecture
The KROW platform follows a strict **Clean Architecture** implementation within a **Melos Monorepo**.
Dependencies flow **inwards** towards the Domain.
```mermaid
graph TD
subgraph "Apps (Entry Points)"
ClientApp[apps/mobile/apps/client]
StaffApp[apps/mobile/apps/staff]
end
subgraph "Features (Presentation & Application)"
ClientFeature[apps/mobile/packages/features/client/jobs]
StaffFeature[apps/mobile/packages/features/staff/schedule]
SharedFeature[apps/mobile/packages/features/shared/auth]
end
subgraph "Interface Adapters"
DataConnect[apps/mobile/packages/data_connect]
DesignSystem[apps/mobile/packages/design_system]
end
subgraph "Core Domain"
Domain[apps/mobile/packages/domain]
Core[apps/mobile/packages/core]
end
%% Dependency Flow
ClientApp --> ClientFeature & SharedFeature
StaffApp --> StaffFeature & SharedFeature
ClientApp --> DataConnect
StaffApp --> DataConnect
ClientFeature & StaffFeature & SharedFeature --> Domain
ClientFeature & StaffFeature & SharedFeature --> DesignSystem
ClientFeature & StaffFeature & SharedFeature --> Core
DataConnect --> Domain
DataConnect --> Core
DesignSystem --> Core
Domain --> Core
%% Strict Barriers
linkStyle default stroke-width:2px,fill:none,stroke:gray
```
## 2. Repository Structure & Package Roles
### 2.1 Apps (`apps/mobile/apps/`)
- **Role**: Application entry points and Dependency Injection (DI) roots.
- **Responsibilities**:
- Initialize Flutter Modular.
- Assemble features into a navigation tree.
- Inject concrete implementations (from `data_connect`) into Feature packages.
- Configure environment-specific settings.
- **RESTRICTION**: NO business logic. NO UI widgets (except `App` and `Main`).
### 2.2 Features (`apps/mobile/packages/features/<APP_NAME>/<FEATURE_NAME>`)
- **Role**: Vertical slices of user-facing functionality.
- **Internal Structure**:
- `domain/`: Feature-specific Use Cases and Repository Interfaces.
- `data/`: Repository Implementations.
- `presentation/`:
- Pages, BLoCs, Widgets.
- For performance make the pages as `StatelessWidget` and move the state management to the BLoC or `StatefulWidget` to an external separate widget file.
- **Responsibilities**:
- **Presentation**: UI Pages, Modular Routes.
- **State Management**: BLoCs / Cubits.
- **Application Logic**: Use Cases.
- **RESTRICTION**: Features MUST NOT import other features. Communication happens via shared domain events.
### 2.3 Domain (`apps/mobile/packages/domain`)
- **Role**: The stable heart of the system. Pure Dart.
- **Responsibilities**:
- **Entities**: Immutable data models (Data Classes).
- **Failures**: Domain-specific error types.
- **RESTRICTION**: NO Flutter dependencies. NO `json_annotation`. NO package dependencies (except `equatable`).
### 2.4 Data Connect (`apps/mobile/packages/data_connect/lib/src/mocks`)
- **Role**: Interface Adapter for Backend Access (Datasource Layer).
- **Responsibilities**:
- Implement low-level Datasources or generated SDK wrappers.
- map Domain Entities to/from Firebase Data Connect generated code.
- Handle Firebase exceptions.
- For now use the mock repositories to connect to the features, not the dataconnect_generated.
### 2.5 Design System (`apps/mobile/packages/design_system`)
- **Role**: Visual language and component library.
- **Responsibilities**:
- UI components if needed. But mostly try to modify the theme file (apps/mobile/packages/design_system/lib/src/ui_theme.dart) so we can directly use the theme in the app, to use the default material widgets.
- If not possible, and if that specific widget is used in multiple features, then try to create a shared widget in the `apps/mobile/packages/design_system/widgets`.
- Theme definitions (Colors, Typography).
- Assets (Icons, Images).
- More details on how to use this package is available in the `apps/mobile/docs/03-design-system-usage.md`.
- **RESTRICTION**:
- CANNOT change colours or typography.
- Dumb widgets only. NO business logic. NO state management (Bloc).
- More details on how to use this package is available in the `apps/mobile/docs/03-design-system-usage.md`.
### 2.6 Core (`apps/mobile/packages/core`)
- **Role**: Cross-cutting concerns.
- **Responsibilities**:
- Extension methods.
- Logger configuration.
- Base classes for Use Cases or Result types (functional error handling).
## 3. Dependency Direction & Boundaries
1. **Domain Independence**: `apps/mobile/packages/domain` knows NOTHING about the outer world. It defines *what* needs to be done, not *how*.
2. **UI Agnosticism**: `apps/mobile/packages/features` depends on `apps/mobile/packages/design_system` for looks and `apps/mobile/packages/domain` for logic. It does NOT know about Firebase.
3. **Data Isolation**: `apps/mobile/packages/data_connect` depends on `apps/mobile/packages/domain` to know what interfaces to implement. It does NOT know about the UI.
## 4. Firebase Data Connect Strategy
Since Firebase Data Connect code does not yet exist, we adhere to a **Strict Mocking Strategy**:
1. **Interface First**: All data requirements are first defined as `abstract interface class IRepository` in `apps/mobile/packages/domain`.
2. **Mock Implementation**:
- Inside `apps/mobile/packages/data_connect`, create a `MockRepository` implementation.
- Use in-memory lists or hardcoded futures to simulate backend responses.
- **CRITICAL**: Do NOT put mocks in `test/` folders if they are needed to run the app in "dev" mode. Put them in `lib/src/mocks/`.
3. **Future Integration**: When Data Connect is ready, we will add `RealRepository` in `apps/mobile/packages/data_connect`.
4. **Injection**: `apps/mobile/apps/` will inject either `MockRepository` or `RealRepository` based on build flags or environment variables.
## 5. Feature Isolation
- **Zero Direct Imports**: `import 'package:feature_a/...'` is FORBIDDEN inside `package:feature_b`.
- **Navigation**: Use string-based routes or a shared route definition module in `core` (if absolutely necessary) to navigate between features.
- **Data Sharing**: Features do not share state directly. They share data via the underlying `Domain` repositories (e.g., both observe the same `User` stream from `AuthRepository`).

View File

@@ -1,83 +0,0 @@
# Agent Development Rules
These rules are **NON-NEGOTIABLE**. They are designed to prevent architectural degradation by automated agents.
## 1. File Creation & Structure
1. **Feature-First Packaging**:
* **DO**: Create new features as independent packages in `apps/mobile/packages/features/<feature_name>`.
* **DO NOT**: Add features to `apps/mobile/packages/core` or existing apps directly.
2. **Path Conventions**:
* Entities: `apps/mobile/packages/domain/lib/src/entities/<entity>.dart`
* Repositories (Interface): `apps/mobile/packages/<feature>/lib/src/domain/repositories/<name>_repository_interface.dart`
* Repositories (Impl): `apps/mobile/packages/<feature>/lib/src/data/repositories_impl/<name>_repository_impl.dart`
* Use Cases: `apps/mobile/packages/<feature>/lib/src/application/<name>_usecase.dart`
* BLoCs: `apps/mobile/packages/<feature>/lib/src/presentation/blocs/<name>_bloc.dart`
* Pages: `apps/mobile/packages/<feature>/lib/src/presentation/pages/<name>_page.dart`
3. **Barrel Files**:
* **DO**: Use `export` in `lib/<package_name>.dart` only for public APIs.
* **DO NOT**: Export internal implementation details (like mocks or helper widgets) in the main package file.
## 2. Naming Conventions
Follow Dart standards strictly.
| Type | Convention | Example |
| :--- | :--- | :--- |
| **Files** | `snake_case` | `user_profile_page.dart` |
| **Classes** | `PascalCase` | `UserProfilePage` |
| **Variables** | `camelCase` | `userProfile` |
| **Interfaces** | terminate with `Interface` | `AuthRepositoryInterface` |
| **Implementations** | terminate with `Impl` | `FirebaseDataConnectAuthRepositoryImpl` |
| **Mocks** | terminate with `Mock` | `AuthRepositoryMock` |
## 3. Logic Placement (Strict Boundaries)
* **Business Rules**: MUST reside in **Use Cases** (Domain/Feature Application layer).
* *Forbidden*: Placing business rules in BLoCs or Widgets.
* **State Logic**: MUST reside in **BLoCs**.
* *Forbidden*: `setState` in Pages (except for purely ephemeral UI animations).
* **Data Transformation**: MUST reside in **Repositories** (Data Connect layer).
* *Forbidden*: Parsing JSON in the UI or Domain.
* **Navigation Logic**: MUST reside in **Modular Routes**.
* *Forbidden*: `Navigator.push` with hardcoded widgets.
## 4. Data Connect Mocking Strategy
Since the backend does not exist, you must mock strictly:
1. **Define Interface**: Create `abstract interface class <name>RepositoryInterface` in `apps/mobile/packages/<feature>/lib/src/domain/repositories/<name>_repository_interface.dart`.
2. **Create Mock**: Create `class MockRepository implements IRepository` in `apps/mobile/packages/data_connect/lib/src/mocks/`.
3. **Fake Data**: Return hardcoded `Future`s with realistic dummy entities.
4. **Injection**: Register the `MockRepository` in the `AppModule` (in `apps/mobile/apps/client` or `apps/mobile/apps/staff`) until the real implementation exists.
**DO NOT** use `mockito` or `mocktail` for these *runtime* mocks. Use simple fake classes.
## 5. Prototype Migration Rules
You have access to `prototypes/` folders. When migrating code:
1. **Extract Assets**:
* You MAY copy icons, images, and colors. But they should be tailored to the current design system. Do not change the colours and typgorahys in the design system. They are final. And you have to use these in the UI.
* When you matching colous and typography, from the POC match it with the design system and use the colors and typography from the design system. As mentioned in the `apps/mobile/docs/03-design-system-usage.md`.
2. **Extract Layouts**: You MAY copy `build` methods for UI structure.
3. **REJECT Architecture**: You MUST **NOT** copy the `GetX`, `Provider`, or `MVC` patterns often found in prototypes. Refactor immediately to **Bloc + Clean Architecture with Flutter Modular and Melos**.
## 6. Handling Ambiguity
If a user request is vague:
1. **STOP**: Do not guess domain fields or workflows.
2. **ANALYZE**:
- For architecture related questions, refer to `apps/mobile/docs/01-architecture-principles.md` or existing code.
- For design system related questions, refer to `apps/mobile/docs/03-design-system-usage.md` or existing code.
3. **DOCUMENT**: If you must make an assumption to proceed, add a comment `// ASSUMPTION: <explanation>` and mention it in your final summary.
4. **ASK**: Prefer asking the user for clarification on business rules (e.g., "Should a 'Job' have a 'status'?").
## 7. Dependencies
* **DO NOT** add 3rd party packages without checking `apps/mobile/packages/core` first.
* **DO NOT** add `firebase_auth` or `cloud_firestore` to any Feature package. They belong in `data_connect` only.
## 8. Follow Clean Code Principles
* Add doc comments to all classes and methods you create.

View File

@@ -1,131 +0,0 @@
# 03 - Design System Usage Guide
This document defines the mandatory standards for designing and implementing user interfaces across all applications and feature packages using the shared `apps/mobile/packages/design_system`.
## 1. Introduction & Purpose
The Design System is the single source of truth for the visual identity of the project. Its purpose is to ensure UI consistency, reduce development velocity by providing reusable primitives, and eliminate "design drift" across multiple feature teams and applications.
**All UI implementation MUST consume values ONLY from the `design_system` package.**
## 2. Design System Ownership & Responsibility
- **Centralized Authority**: The `apps/mobile/packages/design_system` is the owner of all brand assets, colors, typography, and core components.
- **No Local Overrides**: Feature packages (e.g., `staff_authentication`) are consumers. They are prohibited from defining their own global styles or overriding theme values locally.
- **Extension Policy**: If a required style (color, font, or icon) is missing, the developer must first add it to the `design_system` package following existing patterns before using it in a feature.
## 3. Package Structure Overview (`apps/mobile/packages/design_system`)
The package is organized to separate tokens from implementation:
- `lib/src/ui_colors.dart`: Color tokens and semantic mappings.
- `lib/src/ui_typography.dart`: Text styles and font configurations.
- `lib/src/ui_icons.dart`: Exported icon sets.
- `lib/src/ui_constants.dart`: Spacing, radius, and elevation tokens.
- `lib/src/ui_theme.dart`: Centralized `ThemeData` factory.
- `lib/src/widgets/`: Common "Smart Widgets" and reusable UI building blocks.
## 4. Colors Usage Rules
Feature packages **MUST NOT** define custom hex codes or `Color` constants.
### Usage Protocol
- **Primary Method**:Use `UiColors` from the design system for specific brand accents.
- **Naming Matching**: If an exact color is missing, use the closest existing semantic color (e.g., use `UiColors.mutedForeground` instead of a hardcoded grey).
```dart
// ❌ ANTI-PATTERN: Hardcoded color
Container(color: Color(0xFF1A2234))
// ✅ CORRECT: Design system token
Container(color: UiColors.background)
```
## 5. Typography Usage Rules
Custom `TextStyle` definitions in feature packages are **STRICTLY PROHIBITED**.
### Usage Protocol
- Use `UiTypography` from the design system for specific brand accents.
```dart
// ❌ ANTI-PATTERN: Custom TextStyle
Text('Hello', style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold))
// ✅ CORRECT: Design system typography
Text('Hello', style: UiTypography.display1m)
```
## 6. Icons Usage Rules
Feature packages **MUST NOT** import icon libraries (like `lucide_icons`) directly. They should use the icons exposed via `UiIcons`.
- **Standardization**: Ensure the same icon is used for the same action across all features (e.g., always use `UiIcons.chevronLeft` for navigation).
- **Additions**: New icons must be added to the design system (only using the typedef _IconLib = LucideIcons or typedef _IconLib2 = FontAwesomeIcons; and nothing else) first to ensure they follow the project's stroke weight and sizing standards.
## 7. UI Constants & Layout Rules
Hardcoded padding, margins, and radius values are **PROHIBITED**.
- **Spacing**: Use `UiConstants.spacing` multiplied by tokens (e.g., `S`, `M`, `L`).
- **Border Radius**: Use `UiConstants.borderRadius`.
- **Elevation**: Use `UiConstants.elevation`.
```dart
// ✅ CORRECT: Spacing and Radius constants
Padding(
padding: EdgeInsets.all(UiConstants.spacingL),
child: Container(
borderRadius: BorderRadius.circular(UiConstants.radiusM),
),
)
```
## 8. Common Smart Widgets Guidelines
The design system provides "Smart Widgets" these are high-level UI components that encapsulate both styling and standard behavior.
- **Standard Widgets**: Prefer standard Flutter Material widgets (e.g., `ElevatedButton`) but styled via the central theme.
- **Custom Components**: Use `design_system` widgets for non-standard elements or wisgets that has similar design across various features, if provided.
- **Composition**: Prefer composing standard widgets over creating deep inheritance hierarchies in features.
## 9. Theme Configuration & Usage
Applications (`apps/mobile/apps/`) must initialize the theme once in the root `MaterialApp`.
```dart
MaterialApp.router(
theme: StaffTheme.light, // Mandatory: Consumption of centralized theme
// ...
)
```
**No application-level theme customization is allowed.**
## 10. Feature Development Workflow (POC → Themed)
To bridge the gap between rapid prototyping (POCs) and production-grade code, developers must follow this three-step workflow:
1. **Step 1: Structural Implementation**: Implement the UI logic and layout **exactly matching the POC**. Hardcoded values from the POC are acceptable in this transient state to ensure visual parity.
2. **Step 2: Logic Refactor**: Immediately refactor the code to:
- Follow the `apps/mobile/docs/01-architecture-principles.md` and `apps/mobile/docs/02-agent-development-rules.md` to refactor the code.
3. **Step 3: Theme Refactor**: Immediately refactor the code to:
- Replace hex codes with `UiColors`.
- Replace manual `TextStyle` with `UiTypography`.
- Replace hardcoded padding/radius with `UiConstants`.
- Upgrade icons to design system versions.
## 11. Anti-Patterns & Common Mistakes
- **"Magic Numbers"**: Hardcoding `EdgeInsets.all(12.0)` instead of using design system constants.
- **Local Themes**: Using `Theme(data: ...)` to override colors for a specific section of a page.
- **Hex Hunting**: Copy-pasting hex codes from Figma or POCs into feature code.
- **Package Bypassing**: Importing `package:flutter/material.dart` and ignoring `package:design_system`.
## 12. Enforcement & Review Checklist
Before any UI code is merged, it must pass this checklist:
1. [ ] No hardcoded `Color(...)` or `0xFF...` in the feature package.
2. [ ] No custom `TextStyle(...)` definitions.
3. [ ] All spacing/padding/radius uses `UiConstants`.
4. [ ] All icons are consumed from the approved design system source.
5. [ ] The feature relies on the global `ThemeData` and does not provide local overrides.
6. [ ] The layout matches the POC visual intent and element placement(wireframing and logic) while using the design system primitives.

View File

View File

@@ -1,45 +0,0 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.build/
.buildlog/
.history
.svn/
.swiftpm/
migrate_working_dir/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins-dependencies
.pub-cache/
.pub/
/build/
/coverage/
# Symbolication related
app.*.symbols
# Obfuscation related
app.*.map.json
# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release

View File

@@ -1,45 +0,0 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.
version:
revision: "b45fa18946ecc2d9b4009952c636ba7e2ffbb787"
channel: "stable"
project_type: app
# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
base_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
- platform: android
create_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
base_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
- platform: ios
create_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
base_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
- platform: linux
create_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
base_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
- platform: macos
create_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
base_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
- platform: web
create_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
base_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
- platform: windows
create_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
base_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787
# User provided section
# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'

View File

@@ -1,16 +0,0 @@
# client_app_mvp
A new Flutter project.
## Getting Started
This project is a starting point for a Flutter application.
A few resources to get you started if this is your first Flutter project:
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
For help getting started with Flutter development, view the
[online documentation](https://docs.flutter.dev/), which offers tutorials,
samples, guidance on mobile development, and a full API reference.

View File

@@ -1,28 +0,0 @@
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at https://dart.dev/lints.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options

View File

@@ -1,14 +0,0 @@
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
.cxx/
# Remember to never publicly share your keystore.
# See https://flutter.dev/to/reference-keystore
key.properties
**/*.keystore
**/*.jks

View File

@@ -1,45 +0,0 @@
plugins {
id("com.android.application")
id("kotlin-android")
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id("dev.flutter.flutter-gradle-plugin")
id("com.google.gms.google-services")
}
android {
namespace = "com.example.client_app_mvp"
compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_17.toString()
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "com.example.client_app_mvp"
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
versionCode = flutter.versionCode
versionName = flutter.versionName
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig = signingConfigs.getByName("debug")
}
}
}
flutter {
source = "../.."
}

View File

@@ -1,68 +0,0 @@
{
"project_info": {
"project_number": "717206318340",
"project_id": "krow-apps",
"storage_bucket": "krow-apps.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:717206318340:android:b0bff06f9967d8678af451",
"android_client_info": {
"package_name": "com.example.client_app_mvp"
}
},
"oauth_client": [
{
"client_id": "717206318340-9c24vluvsda8gh0pt8gk9sd7vj2nptn2.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyCXKJ5yME2a4FlrAzZA5LzSt97JwEwn9qE"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "717206318340-9c24vluvsda8gh0pt8gk9sd7vj2nptn2.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:717206318340:android:d3eac8c3774905e08af451",
"android_client_info": {
"package_name": "com.example.staff_app_mvp"
}
},
"oauth_client": [
{
"client_id": "717206318340-9c24vluvsda8gh0pt8gk9sd7vj2nptn2.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyCXKJ5yME2a4FlrAzZA5LzSt97JwEwn9qE"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "717206318340-9c24vluvsda8gh0pt8gk9sd7vj2nptn2.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}

View File

@@ -1,7 +0,0 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

View File

@@ -1,47 +0,0 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:label="Krow Client App MVP"
android:name="${applicationName}"
android:icon="@mipmap/launcher_icon">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:taskAffinity=""
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
<!-- Required to query activities that can process text, see:
https://developer.android.com/training/package-visibility and
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
<queries>
<intent>
<action android:name="android.intent.action.PROCESS_TEXT"/>
<data android:mimeType="text/plain"/>
</intent>
</queries>
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

View File

@@ -1,5 +0,0 @@
package com.example.client_app_mvp
import io.flutter.embedding.android.FlutterActivity
class MainActivity : FlutterActivity()

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

View File

@@ -1,7 +0,0 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

View File

@@ -1,24 +0,0 @@
allprojects {
repositories {
google()
mavenCentral()
}
}
val newBuildDir: Directory =
rootProject.layout.buildDirectory
.dir("../../build")
.get()
rootProject.layout.buildDirectory.value(newBuildDir)
subprojects {
val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
project.layout.buildDirectory.value(newSubprojectBuildDir)
}
subprojects {
project.evaluationDependsOn(":app")
}
tasks.register<Delete>("clean") {
delete(rootProject.layout.buildDirectory)
}

View File

@@ -1,2 +0,0 @@
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true

View File

@@ -1,5 +0,0 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-all.zip

View File

@@ -1,27 +0,0 @@
pluginManagement {
val flutterSdkPath =
run {
val properties = java.util.Properties()
file("local.properties").inputStream().use { properties.load(it) }
val flutterSdkPath = properties.getProperty("flutter.sdk")
require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
flutterSdkPath
}
includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
plugins {
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
id("com.android.application") version "8.11.1" apply false
id("org.jetbrains.kotlin.android") version "2.2.20" apply false
id("com.google.gms.google-services") version "4.4.2" apply false
}
include(":app")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

View File

@@ -1,34 +0,0 @@
**/dgph
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
**/*sync/
.sconsign.dblite
.tags*
**/.vagrant/
**/DerivedData/
Icon?
**/Pods/
**/.symlinks/
profile
xcuserdata
**/.generated/
Flutter/App.framework
Flutter/Flutter.framework
Flutter/Flutter.podspec
Flutter/Generated.xcconfig
Flutter/ephemeral/
Flutter/app.flx
Flutter/app.zip
Flutter/flutter_assets/
Flutter/flutter_export_environment.sh
ServiceDefinitions.json
Runner/GeneratedPluginRegistrant.*
# Exceptions to above rules.
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>App</string>
<key>CFBundleIdentifier</key>
<string>io.flutter.flutter.app</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>App</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>13.0</string>
</dict>
</plist>

View File

@@ -1,2 +0,0 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"

View File

@@ -1,2 +0,0 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"

View File

@@ -1,43 +0,0 @@
# Uncomment this line to define a global platform for your project
# platform :ios, '13.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
project 'Runner', {
'Debug' => :debug,
'Profile' => :release,
'Release' => :release,
}
def flutter_root
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
unless File.exist?(generated_xcode_build_settings_path)
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
end
File.foreach(generated_xcode_build_settings_path) do |line|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
return matches[1].strip if matches
end
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
end
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
flutter_ios_podfile_setup
target 'Runner' do
use_frameworks!
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
target 'RunnerTests' do
inherit! :search_paths
end
end
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end
end

View File

@@ -1,728 +0,0 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
59A242D46CCC2B41A5A2C541 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BD5AC650E4AD66A8AC1F1833 /* Pods_Runner.framework */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
76284B4CE5310321526352FD /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93FA99887D920E203CE2CDBC /* Pods_RunnerTests.framework */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 97C146E61CF9000F007C117D /* Project object */;
proxyType = 1;
remoteGlobalIDString = 97C146ED1CF9000F007C117D;
remoteInfo = Runner;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
50734491C8F4091FC4215298 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
6B4A6F53289C89C876C48A46 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
6D7BF6C00FBA636F126BBD33 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
93FA99887D920E203CE2CDBC /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
B701E0489709E5092E6A038C /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = "<group>"; };
BD5AC650E4AD66A8AC1F1833 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
C4A6F6F8B46779D11DEEA3E7 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
F4AA850DEDC9D26C59B80E5F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
97C146EB1CF9000F007C117D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
59A242D46CCC2B41A5A2C541 /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
F86625E7251DC5F34D5E3557 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
76284B4CE5310321526352FD /* Pods_RunnerTests.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
09914133214C1E3120D3D9EE /* Frameworks */ = {
isa = PBXGroup;
children = (
BD5AC650E4AD66A8AC1F1833 /* Pods_Runner.framework */,
93FA99887D920E203CE2CDBC /* Pods_RunnerTests.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
172627A77D8C2EB68F8D116E /* Pods */ = {
isa = PBXGroup;
children = (
F4AA850DEDC9D26C59B80E5F /* Pods-Runner.debug.xcconfig */,
6B4A6F53289C89C876C48A46 /* Pods-Runner.release.xcconfig */,
C4A6F6F8B46779D11DEEA3E7 /* Pods-Runner.profile.xcconfig */,
6D7BF6C00FBA636F126BBD33 /* Pods-RunnerTests.debug.xcconfig */,
50734491C8F4091FC4215298 /* Pods-RunnerTests.release.xcconfig */,
B701E0489709E5092E6A038C /* Pods-RunnerTests.profile.xcconfig */,
);
name = Pods;
path = Pods;
sourceTree = "<group>";
};
331C8082294A63A400263BE5 /* RunnerTests */ = {
isa = PBXGroup;
children = (
331C807B294A618700263BE5 /* RunnerTests.swift */,
);
path = RunnerTests;
sourceTree = "<group>";
};
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
9740EEB21CF90195004384FC /* Debug.xcconfig */,
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
9740EEB31CF90195004384FC /* Generated.xcconfig */,
);
name = Flutter;
sourceTree = "<group>";
};
97C146E51CF9000F007C117D = {
isa = PBXGroup;
children = (
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
331C8082294A63A400263BE5 /* RunnerTests */,
172627A77D8C2EB68F8D116E /* Pods */,
09914133214C1E3120D3D9EE /* Frameworks */,
);
sourceTree = "<group>";
};
97C146EF1CF9000F007C117D /* Products */ = {
isa = PBXGroup;
children = (
97C146EE1CF9000F007C117D /* Runner.app */,
331C8081294A63A400263BE5 /* RunnerTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
97C147021CF9000F007C117D /* Info.plist */,
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
);
path = Runner;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
331C8080294A63A400263BE5 /* RunnerTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
buildPhases = (
AE1567838935F36DA48C52B1 /* [CP] Check Pods Manifest.lock */,
331C807D294A63A400263BE5 /* Sources */,
331C807F294A63A400263BE5 /* Resources */,
F86625E7251DC5F34D5E3557 /* Frameworks */,
);
buildRules = (
);
dependencies = (
331C8086294A63A400263BE5 /* PBXTargetDependency */,
);
name = RunnerTests;
productName = RunnerTests;
productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
97C146ED1CF9000F007C117D /* Runner */ = {
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
A06687346091B014AF063603 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
4F27457BBFA344CA19B6713C /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = Runner;
productName = Runner;
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
LastUpgradeCheck = 1510;
ORGANIZATIONNAME = "";
TargetAttributes = {
331C8080294A63A400263BE5 = {
CreatedOnToolsVersion = 14.0;
TestTargetID = 97C146ED1CF9000F007C117D;
};
97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1;
LastSwiftMigration = 1100;
};
};
};
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 97C146E51CF9000F007C117D;
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
97C146ED1CF9000F007C117D /* Runner */,
331C8080294A63A400263BE5 /* RunnerTests */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
331C807F294A63A400263BE5 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
);
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
4F27457BBFA344CA19B6713C /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Run Script";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
A06687346091B014AF063603 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
AE1567838935F36DA48C52B1 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
331C807D294A63A400263BE5 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EA1CF9000F007C117D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 97C146ED1CF9000F007C117D /* Runner */;
targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
97C146FA1CF9000F007C117D /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C146FB1CF9000F007C117D /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C147001CF9000F007C117D /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
249021D3217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Profile;
};
249021D4217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.clientAppMvp;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
};
331C8088294A63A400263BE5 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 6D7BF6C00FBA636F126BBD33 /* Pods-RunnerTests.debug.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.clientAppMvp.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Debug;
};
331C8089294A63A400263BE5 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 50734491C8F4091FC4215298 /* Pods-RunnerTests.release.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.clientAppMvp.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Release;
};
331C808A294A63A400263BE5 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = B701E0489709E5092E6A038C /* Pods-RunnerTests.profile.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.clientAppMvp.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Profile;
};
97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
97C147041CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
97C147061CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.clientAppMvp;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
};
97C147071CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.clientAppMvp;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
331C8088294A63A400263BE5 /* Debug */,
331C8089294A63A400263BE5 /* Release */,
331C808A294A63A400263BE5 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147031CF9000F007C117D /* Debug */,
97C147041CF9000F007C117D /* Release */,
249021D3217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147061CF9000F007C117D /* Debug */,
97C147071CF9000F007C117D /* Release */,
249021D4217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 97C146E61CF9000F007C117D /* Project object */;
}

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>

View File

@@ -1,101 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1510"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
<TestableReference
skipped = "NO"
parallelizable = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "331C8080294A63A400263BE5"
BuildableName = "RunnerTests.xctest"
BlueprintName = "RunnerTests"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
enableGPUValidationMode = "1"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>

View File

@@ -1,13 +0,0 @@
import Flutter
import UIKit
@main
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}

View File

@@ -1 +0,0 @@
{"images":[{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@3x.png","scale":"3x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@1x.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@1x.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@1x.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"Icon-App-83.5x83.5@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"Icon-App-1024x1024@1x.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}}

View File

@@ -1,23 +0,0 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "LaunchImage.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@@ -1,5 +0,0 @@
# Launch Screen Assets
You can customize the launch screen with your own desired assets by replacing the image files in this directory.
You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
<viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
</constraints>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
<resources>
<image name="LaunchImage" width="168" height="185"/>
</resources>
</document>

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<scenes>
<!--Flutter View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>

View File

@@ -1,49 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Client App Mvp</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>client_app_mvp</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
</dict>
</plist>

View File

@@ -1 +0,0 @@
#import "GeneratedPluginRegistrant.h"

View File

@@ -1,12 +0,0 @@
import Flutter
import UIKit
import XCTest
class RunnerTests: XCTestCase {
func testExample() {
// If you add code to the Runner application, consider adding tests here.
// See https://developer.apple.com/documentation/xctest for more information about using XCTest.
}
}

View File

@@ -1,9 +0,0 @@
{
"description": "A set of guides for interacting with the generated firebase dataconnect sdk",
"mcpServers": {
"firebase": {
"command": "npx",
"args": ["-y", "firebase-tools@latest", "experimental:mcp"]
}
}
}

View File

@@ -1,15 +0,0 @@
# Setup
This guide will walk you through setting up your environment to use the Firebase Data Connect SDK. Mostly using
documentation listed [here](https://firebase.google.com/docs/flutter/setup?platform=ios#install-cli-tools).
1. Make sure you have the latest Firebase CLI tools installed. Follow the instructions [here](https://firebase.google.com/docs/cli#setup_update_cli) to install.
2. Log into your Firebase account:
```sh
firebase login
```
3. Install the FlutterFire CLI by running the following command from any directory:
```sh
dart pub global activate flutterfire_cli
```
4. Make sure the user has initialized Firebase already based on the instructions [here](https://firebase.google.com/docs/flutter/setup?platform=ios#initialize-firebase).

View File

@@ -1,31 +0,0 @@
# Basic Usage
```dart
ExampleConnector.instance.CreateMovie(createMovieVariables).execute();
ExampleConnector.instance.UpsertUser(upsertUserVariables).execute();
ExampleConnector.instance.AddReview(addReviewVariables).execute();
ExampleConnector.instance.DeleteReview(deleteReviewVariables).execute();
ExampleConnector.instance.ListMovies().execute();
ExampleConnector.instance.ListUsers().execute();
ExampleConnector.instance.ListUserReviews().execute();
ExampleConnector.instance.GetMovieById(getMovieByIdVariables).execute();
ExampleConnector.instance.SearchMovie(searchMovieVariables).execute();
```
## Optional Fields
Some operations may have optional fields. In these cases, the Flutter SDK exposes a builder method, and will have to be set separately.
Optional fields can be discovered based on classes that have `Optional` object types.
This is an example of a mutation with an optional field:
```dart
await ExampleConnector.instance.SearchMovie({ ... })
.titleInput(...)
.execute();
```
Note: the above example is a mutation, but the same logic applies to query operations as well. Additionally, `createMovie` is an example, and may not be available to the user.

View File

@@ -1,446 +0,0 @@
# dataconnect_generated SDK
## Installation
```sh
flutter pub get firebase_data_connect
flutterfire configure
```
For more information, see [Flutter for Firebase installation documentation](https://firebase.google.com/docs/data-connect/flutter-sdk#use-core).
## Data Connect instance
Each connector creates a static class, with an instance of the `DataConnect` class that can be used to connect to your Data Connect backend and call operations.
### Connecting to the emulator
```dart
String host = 'localhost'; // or your host name
int port = 9399; // or your port number
ExampleConnector.instance.dataConnect.useDataConnectEmulator(host, port);
```
You can also call queries and mutations by using the connector class.
## Queries
### ListMovies
#### Required Arguments
```dart
// No required arguments
ExampleConnector.instance.listMovies().execute();
```
#### Return Type
`execute()` returns a `QueryResult<ListMoviesData, void>`
```dart
/// Result of an Operation Request (query/mutation).
class OperationResult<Data, Variables> {
OperationResult(this.dataConnect, this.data, this.ref);
Data data;
OperationRef<Data, Variables> ref;
FirebaseDataConnect dataConnect;
}
/// Result of a query request. Created to hold extra variables in the future.
class QueryResult<Data, Variables> extends OperationResult<Data, Variables> {
QueryResult(super.dataConnect, super.data, super.ref);
}
final result = await ExampleConnector.instance.listMovies();
ListMoviesData data = result.data;
final ref = result.ref;
```
#### Getting the Ref
Each builder returns an `execute` function, which is a helper function that creates a `Ref` object, and executes the underlying operation.
An example of how to use the `Ref` object is shown below:
```dart
final ref = ExampleConnector.instance.listMovies().ref();
ref.execute();
ref.subscribe(...);
```
### ListUsers
#### Required Arguments
```dart
// No required arguments
ExampleConnector.instance.listUsers().execute();
```
#### Return Type
`execute()` returns a `QueryResult<ListUsersData, void>`
```dart
/// Result of an Operation Request (query/mutation).
class OperationResult<Data, Variables> {
OperationResult(this.dataConnect, this.data, this.ref);
Data data;
OperationRef<Data, Variables> ref;
FirebaseDataConnect dataConnect;
}
/// Result of a query request. Created to hold extra variables in the future.
class QueryResult<Data, Variables> extends OperationResult<Data, Variables> {
QueryResult(super.dataConnect, super.data, super.ref);
}
final result = await ExampleConnector.instance.listUsers();
ListUsersData data = result.data;
final ref = result.ref;
```
#### Getting the Ref
Each builder returns an `execute` function, which is a helper function that creates a `Ref` object, and executes the underlying operation.
An example of how to use the `Ref` object is shown below:
```dart
final ref = ExampleConnector.instance.listUsers().ref();
ref.execute();
ref.subscribe(...);
```
### ListUserReviews
#### Required Arguments
```dart
// No required arguments
ExampleConnector.instance.listUserReviews().execute();
```
#### Return Type
`execute()` returns a `QueryResult<ListUserReviewsData, void>`
```dart
/// Result of an Operation Request (query/mutation).
class OperationResult<Data, Variables> {
OperationResult(this.dataConnect, this.data, this.ref);
Data data;
OperationRef<Data, Variables> ref;
FirebaseDataConnect dataConnect;
}
/// Result of a query request. Created to hold extra variables in the future.
class QueryResult<Data, Variables> extends OperationResult<Data, Variables> {
QueryResult(super.dataConnect, super.data, super.ref);
}
final result = await ExampleConnector.instance.listUserReviews();
ListUserReviewsData data = result.data;
final ref = result.ref;
```
#### Getting the Ref
Each builder returns an `execute` function, which is a helper function that creates a `Ref` object, and executes the underlying operation.
An example of how to use the `Ref` object is shown below:
```dart
final ref = ExampleConnector.instance.listUserReviews().ref();
ref.execute();
ref.subscribe(...);
```
### GetMovieById
#### Required Arguments
```dart
String id = ...;
ExampleConnector.instance.getMovieById(
id: id,
).execute();
```
#### Return Type
`execute()` returns a `QueryResult<GetMovieByIdData, GetMovieByIdVariables>`
```dart
/// Result of an Operation Request (query/mutation).
class OperationResult<Data, Variables> {
OperationResult(this.dataConnect, this.data, this.ref);
Data data;
OperationRef<Data, Variables> ref;
FirebaseDataConnect dataConnect;
}
/// Result of a query request. Created to hold extra variables in the future.
class QueryResult<Data, Variables> extends OperationResult<Data, Variables> {
QueryResult(super.dataConnect, super.data, super.ref);
}
final result = await ExampleConnector.instance.getMovieById(
id: id,
);
GetMovieByIdData data = result.data;
final ref = result.ref;
```
#### Getting the Ref
Each builder returns an `execute` function, which is a helper function that creates a `Ref` object, and executes the underlying operation.
An example of how to use the `Ref` object is shown below:
```dart
String id = ...;
final ref = ExampleConnector.instance.getMovieById(
id: id,
).ref();
ref.execute();
ref.subscribe(...);
```
### SearchMovie
#### Required Arguments
```dart
// No required arguments
ExampleConnector.instance.searchMovie().execute();
```
#### Optional Arguments
We return a builder for each query. For SearchMovie, we created `SearchMovieBuilder`. For queries and mutations with optional parameters, we return a builder class.
The builder pattern allows Data Connect to distinguish between fields that haven't been set and fields that have been set to null. A field can be set by calling its respective setter method like below:
```dart
class SearchMovieVariablesBuilder {
...
SearchMovieVariablesBuilder titleInput(String? t) {
_titleInput.value = t;
return this;
}
SearchMovieVariablesBuilder genre(String? t) {
_genre.value = t;
return this;
}
...
}
ExampleConnector.instance.searchMovie()
.titleInput(titleInput)
.genre(genre)
.execute();
```
#### Return Type
`execute()` returns a `QueryResult<SearchMovieData, SearchMovieVariables>`
```dart
/// Result of an Operation Request (query/mutation).
class OperationResult<Data, Variables> {
OperationResult(this.dataConnect, this.data, this.ref);
Data data;
OperationRef<Data, Variables> ref;
FirebaseDataConnect dataConnect;
}
/// Result of a query request. Created to hold extra variables in the future.
class QueryResult<Data, Variables> extends OperationResult<Data, Variables> {
QueryResult(super.dataConnect, super.data, super.ref);
}
final result = await ExampleConnector.instance.searchMovie();
SearchMovieData data = result.data;
final ref = result.ref;
```
#### Getting the Ref
Each builder returns an `execute` function, which is a helper function that creates a `Ref` object, and executes the underlying operation.
An example of how to use the `Ref` object is shown below:
```dart
final ref = ExampleConnector.instance.searchMovie().ref();
ref.execute();
ref.subscribe(...);
```
## Mutations
### CreateMovie
#### Required Arguments
```dart
String title = ...;
String genre = ...;
String imageUrl = ...;
ExampleConnector.instance.createMovie(
title: title,
genre: genre,
imageUrl: imageUrl,
).execute();
```
#### Return Type
`execute()` returns a `OperationResult<CreateMovieData, CreateMovieVariables>`
```dart
/// Result of an Operation Request (query/mutation).
class OperationResult<Data, Variables> {
OperationResult(this.dataConnect, this.data, this.ref);
Data data;
OperationRef<Data, Variables> ref;
FirebaseDataConnect dataConnect;
}
final result = await ExampleConnector.instance.createMovie(
title: title,
genre: genre,
imageUrl: imageUrl,
);
CreateMovieData data = result.data;
final ref = result.ref;
```
#### Getting the Ref
Each builder returns an `execute` function, which is a helper function that creates a `Ref` object, and executes the underlying operation.
An example of how to use the `Ref` object is shown below:
```dart
String title = ...;
String genre = ...;
String imageUrl = ...;
final ref = ExampleConnector.instance.createMovie(
title: title,
genre: genre,
imageUrl: imageUrl,
).ref();
ref.execute();
```
### UpsertUser
#### Required Arguments
```dart
String username = ...;
ExampleConnector.instance.upsertUser(
username: username,
).execute();
```
#### Return Type
`execute()` returns a `OperationResult<UpsertUserData, UpsertUserVariables>`
```dart
/// Result of an Operation Request (query/mutation).
class OperationResult<Data, Variables> {
OperationResult(this.dataConnect, this.data, this.ref);
Data data;
OperationRef<Data, Variables> ref;
FirebaseDataConnect dataConnect;
}
final result = await ExampleConnector.instance.upsertUser(
username: username,
);
UpsertUserData data = result.data;
final ref = result.ref;
```
#### Getting the Ref
Each builder returns an `execute` function, which is a helper function that creates a `Ref` object, and executes the underlying operation.
An example of how to use the `Ref` object is shown below:
```dart
String username = ...;
final ref = ExampleConnector.instance.upsertUser(
username: username,
).ref();
ref.execute();
```
### AddReview
#### Required Arguments
```dart
String movieId = ...;
int rating = ...;
String reviewText = ...;
ExampleConnector.instance.addReview(
movieId: movieId,
rating: rating,
reviewText: reviewText,
).execute();
```
#### Return Type
`execute()` returns a `OperationResult<AddReviewData, AddReviewVariables>`
```dart
/// Result of an Operation Request (query/mutation).
class OperationResult<Data, Variables> {
OperationResult(this.dataConnect, this.data, this.ref);
Data data;
OperationRef<Data, Variables> ref;
FirebaseDataConnect dataConnect;
}
final result = await ExampleConnector.instance.addReview(
movieId: movieId,
rating: rating,
reviewText: reviewText,
);
AddReviewData data = result.data;
final ref = result.ref;
```
#### Getting the Ref
Each builder returns an `execute` function, which is a helper function that creates a `Ref` object, and executes the underlying operation.
An example of how to use the `Ref` object is shown below:
```dart
String movieId = ...;
int rating = ...;
String reviewText = ...;
final ref = ExampleConnector.instance.addReview(
movieId: movieId,
rating: rating,
reviewText: reviewText,
).ref();
ref.execute();
```
### DeleteReview
#### Required Arguments
```dart
String movieId = ...;
ExampleConnector.instance.deleteReview(
movieId: movieId,
).execute();
```
#### Return Type
`execute()` returns a `OperationResult<DeleteReviewData, DeleteReviewVariables>`
```dart
/// Result of an Operation Request (query/mutation).
class OperationResult<Data, Variables> {
OperationResult(this.dataConnect, this.data, this.ref);
Data data;
OperationRef<Data, Variables> ref;
FirebaseDataConnect dataConnect;
}
final result = await ExampleConnector.instance.deleteReview(
movieId: movieId,
);
DeleteReviewData data = result.data;
final ref = result.ref;
```
#### Getting the Ref
Each builder returns an `execute` function, which is a helper function that creates a `Ref` object, and executes the underlying operation.
An example of how to use the `Ref` object is shown below:
```dart
String movieId = ...;
final ref = ExampleConnector.instance.deleteReview(
movieId: movieId,
).ref();
ref.execute();
```

View File

@@ -1,139 +0,0 @@
part of 'generated.dart';
class AddReviewVariablesBuilder {
String movieId;
int rating;
String reviewText;
final FirebaseDataConnect _dataConnect;
AddReviewVariablesBuilder(this._dataConnect, {required this.movieId,required this.rating,required this.reviewText,});
Deserializer<AddReviewData> dataDeserializer = (dynamic json) => AddReviewData.fromJson(jsonDecode(json));
Serializer<AddReviewVariables> varsSerializer = (AddReviewVariables vars) => jsonEncode(vars.toJson());
Future<OperationResult<AddReviewData, AddReviewVariables>> execute() {
return ref().execute();
}
MutationRef<AddReviewData, AddReviewVariables> ref() {
AddReviewVariables vars= AddReviewVariables(movieId: movieId,rating: rating,reviewText: reviewText,);
return _dataConnect.mutation("AddReview", dataDeserializer, varsSerializer, vars);
}
}
@immutable
class AddReviewReviewUpsert {
final String userId;
final String movieId;
AddReviewReviewUpsert.fromJson(dynamic json):
userId = nativeFromJson<String>(json['userId']),
movieId = nativeFromJson<String>(json['movieId']);
@override
bool operator ==(Object other) {
if(identical(this, other)) {
return true;
}
if(other.runtimeType != runtimeType) {
return false;
}
final AddReviewReviewUpsert otherTyped = other as AddReviewReviewUpsert;
return userId == otherTyped.userId &&
movieId == otherTyped.movieId;
}
@override
int get hashCode => Object.hashAll([userId.hashCode, movieId.hashCode]);
Map<String, dynamic> toJson() {
Map<String, dynamic> json = {};
json['userId'] = nativeToJson<String>(userId);
json['movieId'] = nativeToJson<String>(movieId);
return json;
}
AddReviewReviewUpsert({
required this.userId,
required this.movieId,
});
}
@immutable
class AddReviewData {
final AddReviewReviewUpsert review_upsert;
AddReviewData.fromJson(dynamic json):
review_upsert = AddReviewReviewUpsert.fromJson(json['review_upsert']);
@override
bool operator ==(Object other) {
if(identical(this, other)) {
return true;
}
if(other.runtimeType != runtimeType) {
return false;
}
final AddReviewData otherTyped = other as AddReviewData;
return review_upsert == otherTyped.review_upsert;
}
@override
int get hashCode => review_upsert.hashCode;
Map<String, dynamic> toJson() {
Map<String, dynamic> json = {};
json['review_upsert'] = review_upsert.toJson();
return json;
}
AddReviewData({
required this.review_upsert,
});
}
@immutable
class AddReviewVariables {
final String movieId;
final int rating;
final String reviewText;
@Deprecated('fromJson is deprecated for Variable classes as they are no longer required for deserialization.')
AddReviewVariables.fromJson(Map<String, dynamic> json):
movieId = nativeFromJson<String>(json['movieId']),
rating = nativeFromJson<int>(json['rating']),
reviewText = nativeFromJson<String>(json['reviewText']);
@override
bool operator ==(Object other) {
if(identical(this, other)) {
return true;
}
if(other.runtimeType != runtimeType) {
return false;
}
final AddReviewVariables otherTyped = other as AddReviewVariables;
return movieId == otherTyped.movieId &&
rating == otherTyped.rating &&
reviewText == otherTyped.reviewText;
}
@override
int get hashCode => Object.hashAll([movieId.hashCode, rating.hashCode, reviewText.hashCode]);
Map<String, dynamic> toJson() {
Map<String, dynamic> json = {};
json['movieId'] = nativeToJson<String>(movieId);
json['rating'] = nativeToJson<int>(rating);
json['reviewText'] = nativeToJson<String>(reviewText);
return json;
}
AddReviewVariables({
required this.movieId,
required this.rating,
required this.reviewText,
});
}

View File

@@ -1,134 +0,0 @@
part of 'generated.dart';
class CreateMovieVariablesBuilder {
String title;
String genre;
String imageUrl;
final FirebaseDataConnect _dataConnect;
CreateMovieVariablesBuilder(this._dataConnect, {required this.title,required this.genre,required this.imageUrl,});
Deserializer<CreateMovieData> dataDeserializer = (dynamic json) => CreateMovieData.fromJson(jsonDecode(json));
Serializer<CreateMovieVariables> varsSerializer = (CreateMovieVariables vars) => jsonEncode(vars.toJson());
Future<OperationResult<CreateMovieData, CreateMovieVariables>> execute() {
return ref().execute();
}
MutationRef<CreateMovieData, CreateMovieVariables> ref() {
CreateMovieVariables vars= CreateMovieVariables(title: title,genre: genre,imageUrl: imageUrl,);
return _dataConnect.mutation("CreateMovie", dataDeserializer, varsSerializer, vars);
}
}
@immutable
class CreateMovieMovieInsert {
final String id;
CreateMovieMovieInsert.fromJson(dynamic json):
id = nativeFromJson<String>(json['id']);
@override
bool operator ==(Object other) {
if(identical(this, other)) {
return true;
}
if(other.runtimeType != runtimeType) {
return false;
}
final CreateMovieMovieInsert otherTyped = other as CreateMovieMovieInsert;
return id == otherTyped.id;
}
@override
int get hashCode => id.hashCode;
Map<String, dynamic> toJson() {
Map<String, dynamic> json = {};
json['id'] = nativeToJson<String>(id);
return json;
}
CreateMovieMovieInsert({
required this.id,
});
}
@immutable
class CreateMovieData {
final CreateMovieMovieInsert movie_insert;
CreateMovieData.fromJson(dynamic json):
movie_insert = CreateMovieMovieInsert.fromJson(json['movie_insert']);
@override
bool operator ==(Object other) {
if(identical(this, other)) {
return true;
}
if(other.runtimeType != runtimeType) {
return false;
}
final CreateMovieData otherTyped = other as CreateMovieData;
return movie_insert == otherTyped.movie_insert;
}
@override
int get hashCode => movie_insert.hashCode;
Map<String, dynamic> toJson() {
Map<String, dynamic> json = {};
json['movie_insert'] = movie_insert.toJson();
return json;
}
CreateMovieData({
required this.movie_insert,
});
}
@immutable
class CreateMovieVariables {
final String title;
final String genre;
final String imageUrl;
@Deprecated('fromJson is deprecated for Variable classes as they are no longer required for deserialization.')
CreateMovieVariables.fromJson(Map<String, dynamic> json):
title = nativeFromJson<String>(json['title']),
genre = nativeFromJson<String>(json['genre']),
imageUrl = nativeFromJson<String>(json['imageUrl']);
@override
bool operator ==(Object other) {
if(identical(this, other)) {
return true;
}
if(other.runtimeType != runtimeType) {
return false;
}
final CreateMovieVariables otherTyped = other as CreateMovieVariables;
return title == otherTyped.title &&
genre == otherTyped.genre &&
imageUrl == otherTyped.imageUrl;
}
@override
int get hashCode => Object.hashAll([title.hashCode, genre.hashCode, imageUrl.hashCode]);
Map<String, dynamic> toJson() {
Map<String, dynamic> json = {};
json['title'] = nativeToJson<String>(title);
json['genre'] = nativeToJson<String>(genre);
json['imageUrl'] = nativeToJson<String>(imageUrl);
return json;
}
CreateMovieVariables({
required this.title,
required this.genre,
required this.imageUrl,
});
}

View File

@@ -1,129 +0,0 @@
part of 'generated.dart';
class DeleteReviewVariablesBuilder {
String movieId;
final FirebaseDataConnect _dataConnect;
DeleteReviewVariablesBuilder(this._dataConnect, {required this.movieId,});
Deserializer<DeleteReviewData> dataDeserializer = (dynamic json) => DeleteReviewData.fromJson(jsonDecode(json));
Serializer<DeleteReviewVariables> varsSerializer = (DeleteReviewVariables vars) => jsonEncode(vars.toJson());
Future<OperationResult<DeleteReviewData, DeleteReviewVariables>> execute() {
return ref().execute();
}
MutationRef<DeleteReviewData, DeleteReviewVariables> ref() {
DeleteReviewVariables vars= DeleteReviewVariables(movieId: movieId,);
return _dataConnect.mutation("DeleteReview", dataDeserializer, varsSerializer, vars);
}
}
@immutable
class DeleteReviewReviewDelete {
final String userId;
final String movieId;
DeleteReviewReviewDelete.fromJson(dynamic json):
userId = nativeFromJson<String>(json['userId']),
movieId = nativeFromJson<String>(json['movieId']);
@override
bool operator ==(Object other) {
if(identical(this, other)) {
return true;
}
if(other.runtimeType != runtimeType) {
return false;
}
final DeleteReviewReviewDelete otherTyped = other as DeleteReviewReviewDelete;
return userId == otherTyped.userId &&
movieId == otherTyped.movieId;
}
@override
int get hashCode => Object.hashAll([userId.hashCode, movieId.hashCode]);
Map<String, dynamic> toJson() {
Map<String, dynamic> json = {};
json['userId'] = nativeToJson<String>(userId);
json['movieId'] = nativeToJson<String>(movieId);
return json;
}
DeleteReviewReviewDelete({
required this.userId,
required this.movieId,
});
}
@immutable
class DeleteReviewData {
final DeleteReviewReviewDelete? review_delete;
DeleteReviewData.fromJson(dynamic json):
review_delete = json['review_delete'] == null ? null : DeleteReviewReviewDelete.fromJson(json['review_delete']);
@override
bool operator ==(Object other) {
if(identical(this, other)) {
return true;
}
if(other.runtimeType != runtimeType) {
return false;
}
final DeleteReviewData otherTyped = other as DeleteReviewData;
return review_delete == otherTyped.review_delete;
}
@override
int get hashCode => review_delete.hashCode;
Map<String, dynamic> toJson() {
Map<String, dynamic> json = {};
if (review_delete != null) {
json['review_delete'] = review_delete!.toJson();
}
return json;
}
DeleteReviewData({
this.review_delete,
});
}
@immutable
class DeleteReviewVariables {
final String movieId;
@Deprecated('fromJson is deprecated for Variable classes as they are no longer required for deserialization.')
DeleteReviewVariables.fromJson(Map<String, dynamic> json):
movieId = nativeFromJson<String>(json['movieId']);
@override
bool operator ==(Object other) {
if(identical(this, other)) {
return true;
}
if(other.runtimeType != runtimeType) {
return false;
}
final DeleteReviewVariables otherTyped = other as DeleteReviewVariables;
return movieId == otherTyped.movieId;
}
@override
int get hashCode => movieId.hashCode;
Map<String, dynamic> toJson() {
Map<String, dynamic> json = {};
json['movieId'] = nativeToJson<String>(movieId);
return json;
}
DeleteReviewVariables({
required this.movieId,
});
}

View File

@@ -1,93 +0,0 @@
library dataconnect_generated;
import 'package:firebase_data_connect/firebase_data_connect.dart';
import 'package:flutter/foundation.dart';
import 'dart:convert';
part 'create_movie.dart';
part 'upsert_user.dart';
part 'add_review.dart';
part 'delete_review.dart';
part 'list_movies.dart';
part 'list_users.dart';
part 'list_user_reviews.dart';
part 'get_movie_by_id.dart';
part 'search_movie.dart';
class ExampleConnector {
CreateMovieVariablesBuilder createMovie ({required String title, required String genre, required String imageUrl, }) {
return CreateMovieVariablesBuilder(dataConnect, title: title,genre: genre,imageUrl: imageUrl,);
}
UpsertUserVariablesBuilder upsertUser ({required String username, }) {
return UpsertUserVariablesBuilder(dataConnect, username: username,);
}
AddReviewVariablesBuilder addReview ({required String movieId, required int rating, required String reviewText, }) {
return AddReviewVariablesBuilder(dataConnect, movieId: movieId,rating: rating,reviewText: reviewText,);
}
DeleteReviewVariablesBuilder deleteReview ({required String movieId, }) {
return DeleteReviewVariablesBuilder(dataConnect, movieId: movieId,);
}
ListMoviesVariablesBuilder listMovies () {
return ListMoviesVariablesBuilder(dataConnect, );
}
ListUsersVariablesBuilder listUsers () {
return ListUsersVariablesBuilder(dataConnect, );
}
ListUserReviewsVariablesBuilder listUserReviews () {
return ListUserReviewsVariablesBuilder(dataConnect, );
}
GetMovieByIdVariablesBuilder getMovieById ({required String id, }) {
return GetMovieByIdVariablesBuilder(dataConnect, id: id,);
}
SearchMovieVariablesBuilder searchMovie () {
return SearchMovieVariablesBuilder(dataConnect, );
}
static ConnectorConfig connectorConfig = ConnectorConfig(
'us-central1',
'example',
'client-krow-poc',
);
ExampleConnector({required this.dataConnect});
static ExampleConnector get instance {
return ExampleConnector(
dataConnect: FirebaseDataConnect.instanceFor(
connectorConfig: connectorConfig,
sdkType: CallerSDKType.generated));
}
FirebaseDataConnect dataConnect;
}

View File

@@ -1,297 +0,0 @@
part of 'generated.dart';
class GetMovieByIdVariablesBuilder {
String id;
final FirebaseDataConnect _dataConnect;
GetMovieByIdVariablesBuilder(this._dataConnect, {required this.id,});
Deserializer<GetMovieByIdData> dataDeserializer = (dynamic json) => GetMovieByIdData.fromJson(jsonDecode(json));
Serializer<GetMovieByIdVariables> varsSerializer = (GetMovieByIdVariables vars) => jsonEncode(vars.toJson());
Future<QueryResult<GetMovieByIdData, GetMovieByIdVariables>> execute() {
return ref().execute();
}
QueryRef<GetMovieByIdData, GetMovieByIdVariables> ref() {
GetMovieByIdVariables vars= GetMovieByIdVariables(id: id,);
return _dataConnect.query("GetMovieById", dataDeserializer, varsSerializer, vars);
}
}
@immutable
class GetMovieByIdMovie {
final String id;
final String title;
final String imageUrl;
final String? genre;
final GetMovieByIdMovieMetadata? metadata;
final List<GetMovieByIdMovieReviews> reviews;
GetMovieByIdMovie.fromJson(dynamic json):
id = nativeFromJson<String>(json['id']),
title = nativeFromJson<String>(json['title']),
imageUrl = nativeFromJson<String>(json['imageUrl']),
genre = json['genre'] == null ? null : nativeFromJson<String>(json['genre']),
metadata = json['metadata'] == null ? null : GetMovieByIdMovieMetadata.fromJson(json['metadata']),
reviews = (json['reviews'] as List<dynamic>)
.map((e) => GetMovieByIdMovieReviews.fromJson(e))
.toList();
@override
bool operator ==(Object other) {
if(identical(this, other)) {
return true;
}
if(other.runtimeType != runtimeType) {
return false;
}
final GetMovieByIdMovie otherTyped = other as GetMovieByIdMovie;
return id == otherTyped.id &&
title == otherTyped.title &&
imageUrl == otherTyped.imageUrl &&
genre == otherTyped.genre &&
metadata == otherTyped.metadata &&
reviews == otherTyped.reviews;
}
@override
int get hashCode => Object.hashAll([id.hashCode, title.hashCode, imageUrl.hashCode, genre.hashCode, metadata.hashCode, reviews.hashCode]);
Map<String, dynamic> toJson() {
Map<String, dynamic> json = {};
json['id'] = nativeToJson<String>(id);
json['title'] = nativeToJson<String>(title);
json['imageUrl'] = nativeToJson<String>(imageUrl);
if (genre != null) {
json['genre'] = nativeToJson<String?>(genre);
}
if (metadata != null) {
json['metadata'] = metadata!.toJson();
}
json['reviews'] = reviews.map((e) => e.toJson()).toList();
return json;
}
GetMovieByIdMovie({
required this.id,
required this.title,
required this.imageUrl,
this.genre,
this.metadata,
required this.reviews,
});
}
@immutable
class GetMovieByIdMovieMetadata {
final double? rating;
final int? releaseYear;
final String? description;
GetMovieByIdMovieMetadata.fromJson(dynamic json):
rating = json['rating'] == null ? null : nativeFromJson<double>(json['rating']),
releaseYear = json['releaseYear'] == null ? null : nativeFromJson<int>(json['releaseYear']),
description = json['description'] == null ? null : nativeFromJson<String>(json['description']);
@override
bool operator ==(Object other) {
if(identical(this, other)) {
return true;
}
if(other.runtimeType != runtimeType) {
return false;
}
final GetMovieByIdMovieMetadata otherTyped = other as GetMovieByIdMovieMetadata;
return rating == otherTyped.rating &&
releaseYear == otherTyped.releaseYear &&
description == otherTyped.description;
}
@override
int get hashCode => Object.hashAll([rating.hashCode, releaseYear.hashCode, description.hashCode]);
Map<String, dynamic> toJson() {
Map<String, dynamic> json = {};
if (rating != null) {
json['rating'] = nativeToJson<double?>(rating);
}
if (releaseYear != null) {
json['releaseYear'] = nativeToJson<int?>(releaseYear);
}
if (description != null) {
json['description'] = nativeToJson<String?>(description);
}
return json;
}
GetMovieByIdMovieMetadata({
this.rating,
this.releaseYear,
this.description,
});
}
@immutable
class GetMovieByIdMovieReviews {
final String? reviewText;
final DateTime reviewDate;
final int? rating;
final GetMovieByIdMovieReviewsUser user;
GetMovieByIdMovieReviews.fromJson(dynamic json):
reviewText = json['reviewText'] == null ? null : nativeFromJson<String>(json['reviewText']),
reviewDate = nativeFromJson<DateTime>(json['reviewDate']),
rating = json['rating'] == null ? null : nativeFromJson<int>(json['rating']),
user = GetMovieByIdMovieReviewsUser.fromJson(json['user']);
@override
bool operator ==(Object other) {
if(identical(this, other)) {
return true;
}
if(other.runtimeType != runtimeType) {
return false;
}
final GetMovieByIdMovieReviews otherTyped = other as GetMovieByIdMovieReviews;
return reviewText == otherTyped.reviewText &&
reviewDate == otherTyped.reviewDate &&
rating == otherTyped.rating &&
user == otherTyped.user;
}
@override
int get hashCode => Object.hashAll([reviewText.hashCode, reviewDate.hashCode, rating.hashCode, user.hashCode]);
Map<String, dynamic> toJson() {
Map<String, dynamic> json = {};
if (reviewText != null) {
json['reviewText'] = nativeToJson<String?>(reviewText);
}
json['reviewDate'] = nativeToJson<DateTime>(reviewDate);
if (rating != null) {
json['rating'] = nativeToJson<int?>(rating);
}
json['user'] = user.toJson();
return json;
}
GetMovieByIdMovieReviews({
this.reviewText,
required this.reviewDate,
this.rating,
required this.user,
});
}
@immutable
class GetMovieByIdMovieReviewsUser {
final String id;
final String username;
GetMovieByIdMovieReviewsUser.fromJson(dynamic json):
id = nativeFromJson<String>(json['id']),
username = nativeFromJson<String>(json['username']);
@override
bool operator ==(Object other) {
if(identical(this, other)) {
return true;
}
if(other.runtimeType != runtimeType) {
return false;
}
final GetMovieByIdMovieReviewsUser otherTyped = other as GetMovieByIdMovieReviewsUser;
return id == otherTyped.id &&
username == otherTyped.username;
}
@override
int get hashCode => Object.hashAll([id.hashCode, username.hashCode]);
Map<String, dynamic> toJson() {
Map<String, dynamic> json = {};
json['id'] = nativeToJson<String>(id);
json['username'] = nativeToJson<String>(username);
return json;
}
GetMovieByIdMovieReviewsUser({
required this.id,
required this.username,
});
}
@immutable
class GetMovieByIdData {
final GetMovieByIdMovie? movie;
GetMovieByIdData.fromJson(dynamic json):
movie = json['movie'] == null ? null : GetMovieByIdMovie.fromJson(json['movie']);
@override
bool operator ==(Object other) {
if(identical(this, other)) {
return true;
}
if(other.runtimeType != runtimeType) {
return false;
}
final GetMovieByIdData otherTyped = other as GetMovieByIdData;
return movie == otherTyped.movie;
}
@override
int get hashCode => movie.hashCode;
Map<String, dynamic> toJson() {
Map<String, dynamic> json = {};
if (movie != null) {
json['movie'] = movie!.toJson();
}
return json;
}
GetMovieByIdData({
this.movie,
});
}
@immutable
class GetMovieByIdVariables {
final String id;
@Deprecated('fromJson is deprecated for Variable classes as they are no longer required for deserialization.')
GetMovieByIdVariables.fromJson(Map<String, dynamic> json):
id = nativeFromJson<String>(json['id']);
@override
bool operator ==(Object other) {
if(identical(this, other)) {
return true;
}
if(other.runtimeType != runtimeType) {
return false;
}
final GetMovieByIdVariables otherTyped = other as GetMovieByIdVariables;
return id == otherTyped.id;
}
@override
int get hashCode => id.hashCode;
Map<String, dynamic> toJson() {
Map<String, dynamic> json = {};
json['id'] = nativeToJson<String>(id);
return json;
}
GetMovieByIdVariables({
required this.id,
});
}

Some files were not shown because too many files have changed in this diff Show More